aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.drone.yml300
-rw-r--r--.woodpecker/debug.yaml44
-rw-r--r--.woodpecker/publish.yaml29
-rw-r--r--.woodpecker/release.yaml70
-rw-r--r--Cargo.lock2006
-rw-r--r--Cargo.nix4272
-rw-r--r--Cargo.toml108
-rw-r--r--README.md2
-rw-r--r--doc/book/connect/apps/index.md4
-rw-r--r--doc/book/cookbook/real-world.md10
-rw-r--r--doc/book/design/goals.md2
-rw-r--r--doc/book/development/devenv.md2
-rw-r--r--doc/book/development/miscellaneous-notes.md8
-rw-r--r--doc/book/development/release-process.md55
-rw-r--r--doc/book/operations/durability-repairs.md4
-rw-r--r--doc/book/operations/layout.md12
-rw-r--r--doc/book/operations/upgrading.md2
-rw-r--r--doc/book/quick-start/_index.md7
-rw-r--r--doc/book/reference-manual/configuration.md22
-rw-r--r--doc/talks/2024-01-12-seed/.gitignore10
-rw-r--r--doc/talks/2024-01-12-seed/Makefile10
-rw-r--r--doc/talks/2024-01-12-seed/talk.pdfbin0 -> 1187401 bytes
-rw-r--r--doc/talks/2024-01-12-seed/talk.tex370
-rw-r--r--doc/talks/2024-02-03-fosdem/.gitignore17
-rw-r--r--doc/talks/2024-02-03-fosdem/Makefile19
-rw-r--r--doc/talks/2024-02-03-fosdem/talk.pdfbin0 -> 3804091 bytes
-rw-r--r--doc/talks/2024-02-03-fosdem/talk.tex764
-rw-r--r--doc/talks/assets/.gitignore8
-rw-r--r--doc/talks/assets/alex.jpgbin0 -> 4914 bytes
-rw-r--r--doc/talks/assets/atuin.jpgbin0 -> 269747 bytes
-rw-r--r--doc/talks/assets/garage.drawio.pdfbin0 -> 26098 bytes
-rw-r--r--doc/talks/assets/garage.drawio.pngbin0 -> 13463 bytes
-rw-r--r--doc/talks/assets/garage2.drawio.pngbin0 -> 89618 bytes
-rw-r--r--doc/talks/assets/garage_sync.drawio.pdfbin0 -> 34372 bytes
-rw-r--r--doc/talks/assets/garage_sync.drawio.pngbin0 -> 31184 bytes
-rw-r--r--doc/talks/assets/geodistrib_paper.pngbin0 -> 302250 bytes
-rw-r--r--doc/talks/assets/inframap_jdll2023.pdfbin0 -> 137258 bytes
-rw-r--r--doc/talks/assets/jepsen-0.10.pngbin0 -> 354133 bytes
-rw-r--r--doc/talks/assets/jepsen-0.9.pngbin0 -> 358576 bytes
-rw-r--r--doc/talks/assets/lattice/lattice1.svg433
-rw-r--r--doc/talks/assets/lattice/lattice2.svg514
-rw-r--r--doc/talks/assets/lattice/lattice3.svg515
-rw-r--r--doc/talks/assets/lattice/lattice4.svg525
-rw-r--r--doc/talks/assets/lattice/lattice5.svg536
-rw-r--r--doc/talks/assets/lattice/lattice6.svg553
-rw-r--r--doc/talks/assets/lattice/lattice7.svg581
-rw-r--r--doc/talks/assets/lattice/lattice8.svg581
-rw-r--r--doc/talks/assets/logos/AGPLv3_Logo.pngbin0 -> 32497 bytes
-rw-r--r--doc/talks/assets/logos/Amazon-S3.jpgbin0 -> 45617 bytes
-rw-r--r--doc/talks/assets/logos/NGI0Entrust_tag.pngbin0 -> 78466 bytes
-rw-r--r--doc/talks/assets/logos/NGI0Entrust_tag.svg149
-rw-r--r--doc/talks/assets/logos/capitole_du_libre.pngbin0 -> 30578 bytes
-rw-r--r--doc/talks/assets/logos/deuxfleurs.svg91
-rw-r--r--doc/talks/assets/logos/fosdem22.pngbin0 -> 7383 bytes
-rw-r--r--doc/talks/assets/logos/fosdem24.pngbin0 -> 7819 bytes
-rw-r--r--doc/talks/assets/logos/jdll.pngbin0 -> 10348 bytes
-rw-r--r--doc/talks/assets/logos/logo_chatons.pngbin0 -> 203533 bytes
-rw-r--r--doc/talks/assets/logos/minio.pngbin0 -> 13497 bytes
-rw-r--r--doc/talks/assets/logos/ngi-pointer.pngbin0 -> 21593 bytes
-rw-r--r--doc/talks/assets/logos/nlnet.svg34
-rw-r--r--doc/talks/assets/logos/pses.pngbin0 -> 22379 bytes
-rw-r--r--doc/talks/assets/logos/rust_logo.pngbin0 -> 14835 bytes
-rw-r--r--doc/talks/assets/map.pngbin0 -> 148270 bytes
-rw-r--r--doc/talks/assets/neptune.jpgbin0 -> 310601 bytes
-rw-r--r--doc/talks/assets/perf/db_engine.pngbin0 -> 181046 bytes
-rw-r--r--doc/talks/assets/perf/endpoint_latency_0.7_0.8_minio.pngbin0 -> 147625 bytes
-rw-r--r--doc/talks/assets/perf/io-0.7-0.8-minio.pngbin0 -> 193869 bytes
-rw-r--r--doc/talks/assets/perf/ttfb.pngbin0 -> 131548 bytes
-rw-r--r--doc/talks/assets/schema-streaming-1.pngbin0 -> 93247 bytes
-rw-r--r--doc/talks/assets/schema-streaming-2.pngbin0 -> 92570 bytes
-rw-r--r--doc/talks/assets/schema-streaming.pngbin0 -> 238774 bytes
-rw-r--r--doc/talks/assets/screenshots/garage_stats_0.10.pngbin0 -> 129997 bytes
-rw-r--r--doc/talks/assets/screenshots/garage_status_0.10.pngbin0 -> 50443 bytes
-rw-r--r--doc/talks/assets/screenshots/garage_status_0.9_prod.pngbin0 -> 83731 bytes
-rw-r--r--doc/talks/assets/screenshots/garage_status_0.9_prod_zonehl.pngbin0 -> 74423 bytes
-rw-r--r--doc/talks/assets/screenshots/garage_status_unhealthy_0.10.pngbin0 -> 58585 bytes
-rw-r--r--doc/talks/assets/screenshots/garage_worker_list_0.10.pngbin0 -> 192119 bytes
-rw-r--r--doc/talks/assets/screenshots/garage_worker_param_0.10.pngbin0 -> 68383 bytes
-rw-r--r--doc/talks/assets/screenshots/grafana_dashboard.pngbin0 -> 403062 bytes
-rw-r--r--doc/talks/assets/screenshots/jaeger_listobjects.pngbin0 -> 125264 bytes
-rw-r--r--doc/talks/assets/screenshots/jaeger_putobject.pngbin0 -> 139900 bytes
-rw-r--r--doc/talks/assets/survey_requested_features.pngbin0 -> 80833 bytes
-rw-r--r--doc/talks/assets/timeline-22-24.svg327
-rw-r--r--doc/talks/shell.nix2
-rw-r--r--flake.lock14
-rw-r--r--flake.nix80
-rw-r--r--nix/common.nix1
-rw-r--r--nix/compile.nix25
-rw-r--r--nix/kaniko.nix24
-rw-r--r--nix/manifest-tool.nix24
-rw-r--r--nix/toolchain.nix31
-rw-r--r--script/helm/garage/Chart.yaml2
-rw-r--r--shell.nix121
-rw-r--r--src/api/Cargo.toml72
-rw-r--r--src/api/admin/api_server.rs37
-rw-r--r--src/api/admin/bucket.rs41
-rw-r--r--src/api/admin/cluster.rs31
-rw-r--r--src/api/admin/error.rs23
-rw-r--r--src/api/admin/key.rs36
-rw-r--r--src/api/common_error.rs23
-rw-r--r--src/api/generic_server.rs216
-rw-r--r--src/api/helpers.rs68
-rw-r--r--src/api/k2v/api_server.rs22
-rw-r--r--src/api/k2v/batch.rs31
-rw-r--r--src/api/k2v/error.rs32
-rw-r--r--src/api/k2v/index.rs7
-rw-r--r--src/api/k2v/item.rs47
-rw-r--r--src/api/s3/api_server.rs55
-rw-r--r--src/api/s3/bucket.rs32
-rw-r--r--src/api/s3/copy.rs21
-rw-r--r--src/api/s3/cors.rs52
-rw-r--r--src/api/s3/delete.rs17
-rw-r--r--src/api/s3/error.rs42
-rw-r--r--src/api/s3/get.rs168
-rw-r--r--src/api/s3/lifecycle.rs23
-rw-r--r--src/api/s3/list.rs17
-rw-r--r--src/api/s3/multipart.rs33
-rw-r--r--src/api/s3/post_object.rs36
-rw-r--r--src/api/s3/put.rs22
-rw-r--r--src/api/s3/router.rs29
-rw-r--r--src/api/s3/website.rs23
-rw-r--r--src/api/signature/error.rs4
-rw-r--r--src/api/signature/payload.rs8
-rw-r--r--src/api/signature/streaming.rs34
-rw-r--r--src/block/Cargo.toml40
-rw-r--r--src/block/manager.rs8
-rw-r--r--src/db/Cargo.toml19
-rw-r--r--src/db/lib.rs42
-rw-r--r--src/garage/Cargo.toml83
-rw-r--r--src/garage/admin/block.rs47
-rw-r--r--src/garage/cli/convert_db.rs62
-rw-r--r--src/garage/cli/init.rs2
-rw-r--r--src/garage/cli/structs.rs8
-rw-r--r--src/garage/main.rs64
-rw-r--r--src/garage/repair/offline.rs4
-rw-r--r--src/garage/secrets.rs320
-rw-r--r--src/garage/server.rs29
-rw-r--r--src/garage/tests/common/client.rs2
-rw-r--r--src/garage/tests/common/custom_requester.rs38
-rw-r--r--src/garage/tests/k2v/batch.rs6
-rw-r--r--src/garage/tests/k2v/item.rs21
-rw-r--r--src/garage/tests/k2v/poll.rs15
-rw-r--r--src/garage/tests/k2v/simple.rs8
-rw-r--r--src/garage/tests/lib.rs18
-rw-r--r--src/garage/tests/s3/list.rs60
-rw-r--r--src/garage/tests/s3/multipart.rs30
-rw-r--r--src/garage/tests/s3/objects.rs48
-rw-r--r--src/garage/tests/s3/streaming_signature.rs16
-rw-r--r--src/garage/tests/s3/website.rs123
-rw-r--r--src/k2v-client/Cargo.toml35
-rw-r--r--src/k2v-client/error.rs4
-rw-r--r--src/k2v-client/lib.rs60
-rw-r--r--src/model/Cargo.toml40
-rw-r--r--src/model/helper/bucket.rs14
-rw-r--r--src/model/index_counter.rs4
-rw-r--r--src/rpc/Cargo.toml54
-rw-r--r--src/rpc/consul.rs2
-rw-r--r--src/rpc/system.rs2
-rw-r--r--src/table/Cargo.toml26
-rw-r--r--src/util/Cargo.toml64
-rw-r--r--src/util/config.rs161
-rw-r--r--src/web/Cargo.toml19
-rw-r--r--src/web/web_server.rs134
163 files changed, 11908 insertions, 4446 deletions
diff --git a/.drone.yml b/.drone.yml
deleted file mode 100644
index d79a9277..00000000
--- a/.drone.yml
+++ /dev/null
@@ -1,300 +0,0 @@
----
-kind: pipeline
-name: default
-
-node:
- nix-daemon: 1
-
-steps:
- - name: check formatting
- image: nixpkgs/nix:nixos-22.05
- commands:
- - nix-shell --attr rust --run "cargo fmt -- --check"
-
- - name: build
- image: nixpkgs/nix:nixos-22.05
- commands:
- - nix-build --no-build-output --attr clippy.amd64 --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
-
- - name: unit + func tests
- image: nixpkgs/nix:nixos-22.05
- environment:
- GARAGE_TEST_INTEGRATION_EXE: result-bin/bin/garage
- GARAGE_TEST_INTEGRATION_PATH: tmp-garage-integration
- commands:
- - nix-build --no-build-output --attr clippy.amd64 --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
- - nix-build --no-build-output --attr test.amd64
- - ./result/bin/garage_db-*
- - ./result/bin/garage_api-*
- - ./result/bin/garage_model-*
- - ./result/bin/garage_rpc-*
- - ./result/bin/garage_table-*
- - ./result/bin/garage_util-*
- - ./result/bin/garage_web-*
- - ./result/bin/garage-*
- - ./result/bin/integration-* || (cat tmp-garage-integration/stderr.log; false)
- - rm result
- - rm -rv tmp-garage-integration
-
- - name: integration tests
- image: nixpkgs/nix:nixos-22.05
- commands:
- - nix-build --no-build-output --attr clippy.amd64 --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
- - nix-shell --attr integration --run ./script/test-smoke.sh || (cat /tmp/garage.log; false)
-
-trigger:
- event:
- - custom
- - push
- - pull_request
- - tag
- - cron
-
----
-kind: pipeline
-type: docker
-name: release-linux-amd64
-
-node:
- nix-daemon: 1
-
-steps:
- - name: build
- image: nixpkgs/nix:nixos-22.05
- commands:
- - nix-build --no-build-output --attr pkgs.amd64.release --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
- - nix-shell --attr rust --run "./script/not-dynamic.sh result-bin/bin/garage"
-
- - name: integration tests
- image: nixpkgs/nix:nixos-22.05
- commands:
- - nix-shell --attr integration --run ./script/test-smoke.sh || (cat /tmp/garage.log; false)
-
- - name: upgrade tests
- image: nixpkgs/nix:nixos-22.05
- commands:
- - nix-shell --attr integration --run "./script/test-upgrade.sh v0.8.4 x86_64-unknown-linux-musl" || (cat /tmp/garage.log; false)
-
- - name: push static binary
- image: nixpkgs/nix:nixos-22.05
- environment:
- AWS_ACCESS_KEY_ID:
- from_secret: garagehq_aws_access_key_id
- AWS_SECRET_ACCESS_KEY:
- from_secret: garagehq_aws_secret_access_key
- TARGET: "x86_64-unknown-linux-musl"
- commands:
- - nix-shell --attr release --run "to_s3"
-
- - name: docker build and publish
- image: nixpkgs/nix:nixos-22.05
- environment:
- DOCKER_AUTH:
- from_secret: docker_auth
- DOCKER_PLATFORM: "linux/amd64"
- CONTAINER_NAME: "dxflrs/amd64_garage"
- HOME: "/kaniko"
- commands:
- - mkdir -p /kaniko/.docker
- - echo $DOCKER_AUTH > /kaniko/.docker/config.json
- - export CONTAINER_TAG=${DRONE_TAG:-$DRONE_COMMIT}
- - nix-shell --attr release --run "to_docker"
-
-
-trigger:
- event:
- - promote
- - cron
-
----
-kind: pipeline
-type: docker
-name: release-linux-i386
-
-node:
- nix-daemon: 1
-
-steps:
- - name: build
- image: nixpkgs/nix:nixos-22.05
- commands:
- - nix-build --no-build-output --attr pkgs.i386.release --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
- - nix-shell --attr rust --run "./script/not-dynamic.sh result-bin/bin/garage"
-
- - name: integration tests
- image: nixpkgs/nix:nixos-22.05
- commands:
- - nix-shell --attr integration --run ./script/test-smoke.sh || (cat /tmp/garage.log; false)
-
- - name: upgrade tests
- image: nixpkgs/nix:nixos-22.05
- commands:
- - nix-shell --attr integration --run "./script/test-upgrade.sh v0.8.4 i686-unknown-linux-musl" || (cat /tmp/garage.log; false)
-
- - name: push static binary
- image: nixpkgs/nix:nixos-22.05
- environment:
- AWS_ACCESS_KEY_ID:
- from_secret: garagehq_aws_access_key_id
- AWS_SECRET_ACCESS_KEY:
- from_secret: garagehq_aws_secret_access_key
- TARGET: "i686-unknown-linux-musl"
- commands:
- - nix-shell --attr release --run "to_s3"
-
- - name: docker build and publish
- image: nixpkgs/nix:nixos-22.05
- environment:
- DOCKER_AUTH:
- from_secret: docker_auth
- DOCKER_PLATFORM: "linux/386"
- CONTAINER_NAME: "dxflrs/386_garage"
- HOME: "/kaniko"
- commands:
- - mkdir -p /kaniko/.docker
- - echo $DOCKER_AUTH > /kaniko/.docker/config.json
- - export CONTAINER_TAG=${DRONE_TAG:-$DRONE_COMMIT}
- - nix-shell --attr release --run "to_docker"
-
-trigger:
- event:
- - promote
- - cron
-
----
-kind: pipeline
-type: docker
-name: release-linux-arm64
-
-node:
- nix-daemon: 1
-
-steps:
- - name: build
- image: nixpkgs/nix:nixos-22.05
- commands:
- - nix-build --no-build-output --attr pkgs.arm64.release --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
- - nix-shell --attr rust --run "./script/not-dynamic.sh result-bin/bin/garage"
-
- - name: push static binary
- image: nixpkgs/nix:nixos-22.05
- environment:
- AWS_ACCESS_KEY_ID:
- from_secret: garagehq_aws_access_key_id
- AWS_SECRET_ACCESS_KEY:
- from_secret: garagehq_aws_secret_access_key
- TARGET: "aarch64-unknown-linux-musl"
- commands:
- - nix-shell --attr release --run "to_s3"
-
- - name: docker build and publish
- image: nixpkgs/nix:nixos-22.05
- environment:
- DOCKER_AUTH:
- from_secret: docker_auth
- DOCKER_PLATFORM: "linux/arm64"
- CONTAINER_NAME: "dxflrs/arm64_garage"
- HOME: "/kaniko"
- commands:
- - mkdir -p /kaniko/.docker
- - echo $DOCKER_AUTH > /kaniko/.docker/config.json
- - export CONTAINER_TAG=${DRONE_TAG:-$DRONE_COMMIT}
- - nix-shell --attr release --run "to_docker"
-
-trigger:
- event:
- - promote
- - cron
-
----
-kind: pipeline
-type: docker
-name: release-linux-arm
-
-node:
- nix-daemon: 1
-
-steps:
- - name: build
- image: nixpkgs/nix:nixos-22.05
- commands:
- - nix-build --no-build-output --attr pkgs.arm.release --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT}
- - nix-shell --attr rust --run "./script/not-dynamic.sh result-bin/bin/garage"
-
- - name: push static binary
- image: nixpkgs/nix:nixos-22.05
- environment:
- AWS_ACCESS_KEY_ID:
- from_secret: garagehq_aws_access_key_id
- AWS_SECRET_ACCESS_KEY:
- from_secret: garagehq_aws_secret_access_key
- TARGET: "armv6l-unknown-linux-musleabihf"
- commands:
- - nix-shell --attr release --run "to_s3"
-
- - name: docker build and publish
- image: nixpkgs/nix:nixos-22.05
- environment:
- DOCKER_AUTH:
- from_secret: docker_auth
- DOCKER_PLATFORM: "linux/arm"
- CONTAINER_NAME: "dxflrs/arm_garage"
- HOME: "/kaniko"
- commands:
- - mkdir -p /kaniko/.docker
- - echo $DOCKER_AUTH > /kaniko/.docker/config.json
- - export CONTAINER_TAG=${DRONE_TAG:-$DRONE_COMMIT}
- - nix-shell --attr release --run "to_docker"
-
-trigger:
- event:
- - promote
- - cron
-
----
-kind: pipeline
-type: docker
-name: refresh-release-page
-
-node:
- nix-daemon: 1
-
-steps:
- - name: multiarch-docker
- image: nixpkgs/nix:nixos-22.05
- environment:
- DOCKER_AUTH:
- from_secret: docker_auth
- HOME: "/root"
- commands:
- - mkdir -p /root/.docker
- - echo $DOCKER_AUTH > /root/.docker/config.json
- - export CONTAINER_TAG=${DRONE_TAG:-$DRONE_COMMIT}
- - nix-shell --attr release --run "multiarch_docker"
- - name: refresh-index
- image: nixpkgs/nix:nixos-22.05
- environment:
- AWS_ACCESS_KEY_ID:
- from_secret: garagehq_aws_access_key_id
- AWS_SECRET_ACCESS_KEY:
- from_secret: garagehq_aws_secret_access_key
- commands:
- - mkdir -p /etc/nix && cp nix/nix.conf /etc/nix/nix.conf
- - nix-shell --attr release --run "refresh_index"
-
-depends_on:
- - release-linux-amd64
- - release-linux-i386
- - release-linux-arm64
- - release-linux-arm
-
-trigger:
- event:
- - promote
- - cron
-
----
-kind: signature
-hmac: 0c4b57eb4b27b7c6a6ff21ab87f0767fe3eb90f5d95d5cbcdccf794e9d2a5d86
-
-...
diff --git a/.woodpecker/debug.yaml b/.woodpecker/debug.yaml
new file mode 100644
index 00000000..59ae8c06
--- /dev/null
+++ b/.woodpecker/debug.yaml
@@ -0,0 +1,44 @@
+when:
+ event:
+ - push
+ - tag
+ - pull_request
+ - deployment
+ - cron
+
+steps:
+ - name: check formatting
+ image: nixpkgs/nix:nixos-22.05
+ commands:
+ - nix-shell --attr devShell --run "cargo fmt -- --check"
+
+ - name: build
+ image: nixpkgs/nix:nixos-22.05
+ commands:
+ - nix-build --no-build-output --attr clippy.amd64 --argstr git_version ${CI_COMMIT_TAG:-$CI_COMMIT_SHA}
+
+ - name: unit + func tests
+ image: nixpkgs/nix:nixos-22.05
+ environment:
+ GARAGE_TEST_INTEGRATION_EXE: result-bin/bin/garage
+ GARAGE_TEST_INTEGRATION_PATH: tmp-garage-integration
+ commands:
+ - nix-build --no-build-output --attr clippy.amd64 --argstr git_version ${CI_COMMIT_TAG:-$CI_COMMIT_SHA}
+ - nix-build --no-build-output --attr test.amd64
+ - ./result/bin/garage_db-*
+ - ./result/bin/garage_api-*
+ - ./result/bin/garage_model-*
+ - ./result/bin/garage_rpc-*
+ - ./result/bin/garage_table-*
+ - ./result/bin/garage_util-*
+ - ./result/bin/garage_web-*
+ - ./result/bin/garage-*
+ - ./result/bin/integration-* || (cat tmp-garage-integration/stderr.log; false)
+ - rm result
+ - rm -rv tmp-garage-integration
+
+ - name: integration tests
+ image: nixpkgs/nix:nixos-22.05
+ commands:
+ - nix-build --no-build-output --attr clippy.amd64 --argstr git_version ${CI_COMMIT_TAG:-$CI_COMMIT_SHA}
+ - nix-shell --attr ci --run ./script/test-smoke.sh || (cat /tmp/garage.log; false)
diff --git a/.woodpecker/publish.yaml b/.woodpecker/publish.yaml
new file mode 100644
index 00000000..739af2c4
--- /dev/null
+++ b/.woodpecker/publish.yaml
@@ -0,0 +1,29 @@
+when:
+ event:
+ - deployment
+ - cron
+
+depends_on:
+ - release
+
+steps:
+ - name: refresh-index
+ image: nixpkgs/nix:nixos-22.05
+ secrets:
+ - source: garagehq_aws_access_key_id
+ target: AWS_ACCESS_KEY_ID
+ - source: garagehq_aws_secret_access_key
+ target: AWS_SECRET_ACCESS_KEY
+ commands:
+ - mkdir -p /etc/nix && cp nix/nix.conf /etc/nix/nix.conf
+ - nix-shell --attr ci --run "refresh_index"
+
+ - name: multiarch-docker
+ image: nixpkgs/nix:nixos-22.05
+ secrets:
+ - docker_auth
+ commands:
+ - mkdir -p /root/.docker
+ - echo $DOCKER_AUTH > /root/.docker/config.json
+ - export CONTAINER_TAG=${CI_COMMIT_TAG:-$CI_COMMIT_SHA}
+ - nix-shell --attr ci --run "multiarch_docker"
diff --git a/.woodpecker/release.yaml b/.woodpecker/release.yaml
new file mode 100644
index 00000000..c57d7272
--- /dev/null
+++ b/.woodpecker/release.yaml
@@ -0,0 +1,70 @@
+when:
+ event:
+ - deployment
+ - cron
+
+matrix:
+ include:
+ - ARCH: amd64
+ TARGET: x86_64-unknown-linux-musl
+ - ARCH: i386
+ TARGET: i686-unknown-linux-musl
+ - ARCH: arm64
+ TARGET: aarch64-unknown-linux-musl
+ - ARCH: arm
+ TARGET: armv6l-unknown-linux-musleabihf
+
+steps:
+ - name: build
+ image: nixpkgs/nix:nixos-22.05
+ commands:
+ - nix-build --no-build-output --attr pkgs.${ARCH}.release --argstr git_version ${CI_COMMIT_TAG:-$CI_COMMIT_SHA}
+
+ - name: check is static binary
+ image: nixpkgs/nix:nixos-22.05
+ commands:
+ - nix-build --no-build-output --attr pkgs.${ARCH}.release --argstr git_version ${CI_COMMIT_TAG:-$CI_COMMIT_SHA}
+ - nix-shell --attr ci --run "./script/not-dynamic.sh result-bin/bin/garage"
+
+ - name: integration tests
+ image: nixpkgs/nix:nixos-22.05
+ commands:
+ - nix-shell --attr ci --run ./script/test-smoke.sh || (cat /tmp/garage.log; false)
+ when:
+ - matrix:
+ ARCH: amd64
+ - matrix:
+ ARCH: i386
+
+ - name: upgrade tests
+ image: nixpkgs/nix:nixos-22.05
+ commands:
+ - nix-shell --attr ci --run "./script/test-upgrade.sh v0.8.4 x86_64-unknown-linux-musl" || (cat /tmp/garage.log; false)
+ when:
+ - matrix:
+ ARCH: amd64
+
+ - name: push static binary
+ image: nixpkgs/nix:nixos-22.05
+ environment:
+ TARGET: "${TARGET}"
+ secrets:
+ - source: garagehq_aws_access_key_id
+ target: AWS_ACCESS_KEY_ID
+ - source: garagehq_aws_secret_access_key
+ target: AWS_SECRET_ACCESS_KEY
+ commands:
+ - nix-shell --attr ci --run "to_s3"
+
+ - name: docker build and publish
+ image: nixpkgs/nix:nixos-22.05
+ environment:
+ DOCKER_PLATFORM: "linux/${ARCH}"
+ CONTAINER_NAME: "dxflrs/${ARCH}_garage"
+ secrets:
+ - docker_auth
+ commands:
+ - mkdir -p /root/.docker
+ - echo $DOCKER_AUTH > /root/.docker/config.json
+ - export CONTAINER_TAG=${CI_COMMIT_TAG:-$CI_COMMIT_SHA}
+ - nix-shell --attr ci --run "to_docker"
diff --git a/Cargo.lock b/Cargo.lock
index e9a82d04..6bb81e49 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -19,21 +19,22 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "ahash"
-version = "0.8.3"
+version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
+checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01"
dependencies = [
"cfg-if",
"getrandom",
"once_cell",
"version_check",
+ "zerocopy",
]
[[package]]
name = "aho-corasick"
-version = "1.0.4"
+version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a"
+checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
dependencies = [
"memchr",
]
@@ -61,9 +62,9 @@ dependencies = [
[[package]]
name = "anstream"
-version = "0.5.0"
+version = "0.6.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c"
+checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5"
dependencies = [
"anstyle",
"anstyle-parse",
@@ -75,43 +76,43 @@ dependencies = [
[[package]]
name = "anstyle"
-version = "1.0.2"
+version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea"
+checksum = "2faccea4cc4ab4a667ce676a30e8ec13922a692c99bb8f5b11f1502c72e04220"
[[package]]
name = "anstyle-parse"
-version = "0.2.1"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333"
+checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
-version = "1.0.0"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
+checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"
dependencies = [
- "windows-sys",
+ "windows-sys 0.52.0",
]
[[package]]
name = "anstyle-wincon"
-version = "2.1.0"
+version = "3.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd"
+checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
dependencies = [
"anstyle",
- "windows-sys",
+ "windows-sys 0.52.0",
]
[[package]]
name = "anyhow"
-version = "1.0.75"
+version = "1.0.79"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
+checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
[[package]]
name = "arc-swap"
@@ -137,9 +138,9 @@ dependencies = [
[[package]]
name = "async-compression"
-version = "0.4.1"
+version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62b74f44609f0f91493e3082d3734d98497e094777144380ea4db9f9905dd5b6"
+checksum = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c"
dependencies = [
"futures-core",
"memchr",
@@ -168,18 +169,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.29",
+ "syn 2.0.48",
]
[[package]]
name = "async-trait"
-version = "0.1.73"
+version = "0.1.77"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"
+checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.29",
+ "syn 2.0.48",
]
[[package]]
@@ -190,218 +191,233 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "aws-config"
-version = "0.55.3"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bcdcf0d683fe9c23d32cf5b53c9918ea0a500375a9fb20109802552658e576c9"
+checksum = "8b30c39ebe61f75d1b3785362b1586b41991873c9ab3e317a9181c246fb71d82"
dependencies = [
"aws-credential-types",
- "aws-http",
+ "aws-runtime",
"aws-sdk-sso",
+ "aws-sdk-ssooidc",
"aws-sdk-sts",
"aws-smithy-async",
- "aws-smithy-client",
"aws-smithy-http",
- "aws-smithy-http-tower",
"aws-smithy-json",
+ "aws-smithy-runtime",
+ "aws-smithy-runtime-api",
"aws-smithy-types",
"aws-types",
"bytes",
- "fastrand 1.9.0",
+ "fastrand",
"hex",
- "http",
- "hyper",
+ "http 0.2.11",
+ "hyper 0.14.28",
"ring",
- "time 0.3.28",
+ "time",
"tokio",
- "tower",
"tracing",
"zeroize",
]
[[package]]
name = "aws-credential-types"
-version = "0.55.3"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fcdb2f7acbc076ff5ad05e7864bdb191ca70a6fd07668dc3a1a8bcd051de5ae"
+checksum = "33cc49dcdd31c8b6e79850a179af4c367669150c7ac0135f176c61bec81a70f7"
dependencies = [
"aws-smithy-async",
+ "aws-smithy-runtime-api",
"aws-smithy-types",
- "fastrand 1.9.0",
- "tokio",
- "tracing",
"zeroize",
]
[[package]]
-name = "aws-endpoint"
-version = "0.55.3"
+name = "aws-runtime"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cce1c41a6cfaa726adee9ebb9a56fcd2bbfd8be49fd8a04c5e20fd968330b04"
+checksum = "eb031bff99877c26c28895766f7bb8484a05e24547e370768d6cc9db514662aa"
dependencies = [
+ "aws-credential-types",
+ "aws-sigv4",
+ "aws-smithy-async",
+ "aws-smithy-eventstream",
"aws-smithy-http",
+ "aws-smithy-runtime-api",
"aws-smithy-types",
"aws-types",
- "http",
- "regex",
+ "bytes",
+ "fastrand",
+ "http 0.2.11",
+ "http-body 0.4.6",
+ "percent-encoding",
+ "pin-project-lite",
"tracing",
+ "uuid",
]
[[package]]
-name = "aws-http"
-version = "0.55.3"
+name = "aws-sdk-config"
+version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aadbc44e7a8f3e71c8b374e03ecd972869eb91dd2bc89ed018954a52ba84bc44"
+checksum = "4af4f5b0f64563ada272e009cc95027effb546110ed85d014611420ac0d97858"
dependencies = [
"aws-credential-types",
+ "aws-runtime",
+ "aws-smithy-async",
"aws-smithy-http",
+ "aws-smithy-json",
+ "aws-smithy-runtime",
+ "aws-smithy-runtime-api",
"aws-smithy-types",
"aws-types",
"bytes",
- "http",
- "http-body",
- "lazy_static",
- "percent-encoding",
- "pin-project-lite",
+ "http 0.2.11",
+ "once_cell",
+ "regex-lite",
"tracing",
]
[[package]]
name = "aws-sdk-s3"
-version = "0.28.0"
+version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fba197193cbb4bcb6aad8d99796b2291f36fa89562ded5d4501363055b0de89f"
+checksum = "951f7730f51a2155c711c85c79f337fbc02a577fa99d2a0a8059acfce5392113"
dependencies = [
"aws-credential-types",
- "aws-endpoint",
- "aws-http",
- "aws-sig-auth",
+ "aws-runtime",
"aws-sigv4",
"aws-smithy-async",
"aws-smithy-checksums",
- "aws-smithy-client",
"aws-smithy-eventstream",
"aws-smithy-http",
- "aws-smithy-http-tower",
"aws-smithy-json",
+ "aws-smithy-runtime",
+ "aws-smithy-runtime-api",
"aws-smithy-types",
"aws-smithy-xml",
"aws-types",
"bytes",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.6",
"once_cell",
"percent-encoding",
- "regex",
- "tokio-stream",
- "tower",
+ "regex-lite",
"tracing",
"url",
]
[[package]]
name = "aws-sdk-sso"
-version = "0.28.0"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8b812340d86d4a766b2ca73f740dfd47a97c2dff0c06c8517a16d88241957e4"
+checksum = "f486420a66caad72635bc2ce0ff6581646e0d32df02aa39dc983bfe794955a5b"
dependencies = [
"aws-credential-types",
- "aws-endpoint",
- "aws-http",
- "aws-sig-auth",
+ "aws-runtime",
"aws-smithy-async",
- "aws-smithy-client",
"aws-smithy-http",
- "aws-smithy-http-tower",
"aws-smithy-json",
+ "aws-smithy-runtime",
+ "aws-smithy-runtime-api",
"aws-smithy-types",
"aws-types",
"bytes",
- "http",
- "regex",
- "tokio-stream",
- "tower",
+ "http 0.2.11",
+ "once_cell",
+ "regex-lite",
"tracing",
]
[[package]]
-name = "aws-sdk-sts"
-version = "0.28.0"
+name = "aws-sdk-ssooidc"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "265fac131fbfc188e5c3d96652ea90ecc676a934e3174eaaee523c6cec040b3b"
+checksum = "39ddccf01d82fce9b4a15c8ae8608211ee7db8ed13a70b514bbfe41df3d24841"
dependencies = [
"aws-credential-types",
- "aws-endpoint",
- "aws-http",
- "aws-sig-auth",
+ "aws-runtime",
"aws-smithy-async",
- "aws-smithy-client",
"aws-smithy-http",
- "aws-smithy-http-tower",
"aws-smithy-json",
- "aws-smithy-query",
+ "aws-smithy-runtime",
+ "aws-smithy-runtime-api",
"aws-smithy-types",
- "aws-smithy-xml",
"aws-types",
"bytes",
- "http",
- "regex",
- "tower",
+ "http 0.2.11",
+ "once_cell",
+ "regex-lite",
"tracing",
]
[[package]]
-name = "aws-sig-auth"
-version = "0.55.3"
+name = "aws-sdk-sts"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b94acb10af0c879ecd5c7bdf51cda6679a0a4f4643ce630905a77673bfa3c61"
+checksum = "1a591f8c7e6a621a501b2b5d2e88e1697fcb6274264523a6ad4d5959889a41ce"
dependencies = [
"aws-credential-types",
- "aws-sigv4",
- "aws-smithy-eventstream",
+ "aws-runtime",
+ "aws-smithy-async",
"aws-smithy-http",
+ "aws-smithy-json",
+ "aws-smithy-query",
+ "aws-smithy-runtime",
+ "aws-smithy-runtime-api",
+ "aws-smithy-types",
+ "aws-smithy-xml",
"aws-types",
- "http",
+ "http 0.2.11",
+ "once_cell",
+ "regex-lite",
"tracing",
]
[[package]]
name = "aws-sigv4"
-version = "0.55.3"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d2ce6f507be68e968a33485ced670111d1cbad161ddbbab1e313c03d37d8f4c"
+checksum = "c371c6b0ac54d4605eb6f016624fb5c7c2925d315fdf600ac1bf21b19d5f1742"
dependencies = [
+ "aws-credential-types",
"aws-smithy-eventstream",
"aws-smithy-http",
+ "aws-smithy-runtime-api",
+ "aws-smithy-types",
"bytes",
+ "crypto-bigint 0.5.5",
"form_urlencoded",
"hex",
"hmac",
- "http",
+ "http 0.2.11",
+ "http 1.0.0",
"once_cell",
+ "p256",
"percent-encoding",
- "regex",
+ "ring",
"sha2",
- "time 0.3.28",
+ "subtle",
+ "time",
"tracing",
+ "zeroize",
]
[[package]]
name = "aws-smithy-async"
-version = "0.55.3"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13bda3996044c202d75b91afeb11a9afae9db9a721c6a7a427410018e286b880"
+checksum = "72ee2d09cce0ef3ae526679b522835d63e75fb427aca5413cd371e490d52dcc6"
dependencies = [
"futures-util",
"pin-project-lite",
"tokio",
- "tokio-stream",
]
[[package]]
name = "aws-smithy-checksums"
-version = "0.55.3"
+version = "0.60.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07ed8b96d95402f3f6b8b57eb4e0e45ee365f78b1a924faf20ff6e97abf1eae6"
+checksum = "be2acd1b9c6ae5859999250ed5a62423aedc5cf69045b844432de15fa2f31f2b"
dependencies = [
"aws-smithy-http",
"aws-smithy-types",
@@ -409,8 +425,8 @@ dependencies = [
"crc32c",
"crc32fast",
"hex",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.6",
"md-5",
"pin-project-lite",
"sha1",
@@ -419,34 +435,10 @@ dependencies = [
]
[[package]]
-name = "aws-smithy-client"
-version = "0.55.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a86aa6e21e86c4252ad6a0e3e74da9617295d8d6e374d552be7d3059c41cedd"
-dependencies = [
- "aws-smithy-async",
- "aws-smithy-http",
- "aws-smithy-http-tower",
- "aws-smithy-types",
- "bytes",
- "fastrand 1.9.0",
- "http",
- "http-body",
- "hyper",
- "hyper-rustls 0.23.2",
- "lazy_static",
- "pin-project-lite",
- "rustls 0.20.8",
- "tokio",
- "tower",
- "tracing",
-]
-
-[[package]]
name = "aws-smithy-eventstream"
-version = "0.55.3"
+version = "0.60.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "460c8da5110835e3d9a717c61f5556b20d03c32a1dec57f8fc559b360f733bb8"
+checksum = "e6363078f927f612b970edf9d1903ef5cef9a64d1e8423525ebb1f0a1633c858"
dependencies = [
"aws-smithy-types",
"bytes",
@@ -455,96 +447,128 @@ dependencies = [
[[package]]
name = "aws-smithy-http"
-version = "0.55.3"
+version = "0.60.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28"
+checksum = "dab56aea3cd9e1101a0a999447fb346afb680ab1406cebc44b32346e25b4117d"
dependencies = [
"aws-smithy-eventstream",
+ "aws-smithy-runtime-api",
"aws-smithy-types",
"bytes",
"bytes-utils",
"futures-core",
- "http",
- "http-body",
- "hyper",
+ "http 0.2.11",
+ "http-body 0.4.6",
"once_cell",
"percent-encoding",
"pin-project-lite",
"pin-utils",
- "tokio",
- "tokio-util 0.7.8",
"tracing",
]
[[package]]
-name = "aws-smithy-http-tower"
-version = "0.55.3"
+name = "aws-smithy-json"
+version = "0.60.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ae4f6c5798a247fac98a867698197d9ac22643596dc3777f0c76b91917616b9"
+checksum = "fd3898ca6518f9215f62678870064398f00031912390efd03f1f6ef56d83aa8e"
dependencies = [
- "aws-smithy-http",
"aws-smithy-types",
- "bytes",
- "http",
- "http-body",
- "pin-project-lite",
- "tower",
- "tracing",
]
[[package]]
-name = "aws-smithy-json"
-version = "0.55.3"
+name = "aws-smithy-query"
+version = "0.60.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23f9f42fbfa96d095194a632fbac19f60077748eba536eb0b9fecc28659807f8"
+checksum = "bda4b1dfc9810e35fba8a620e900522cd1bd4f9578c446e82f49d1ce41d2e9f9"
dependencies = [
"aws-smithy-types",
+ "urlencoding",
]
[[package]]
-name = "aws-smithy-query"
-version = "0.55.3"
+name = "aws-smithy-runtime"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "98819eb0b04020a1c791903533b638534ae6c12e2aceda3e6e6fba015608d51d"
+checksum = "fafdab38f40ad7816e7da5dec279400dd505160780083759f01441af1bbb10ea"
dependencies = [
+ "aws-smithy-async",
+ "aws-smithy-http",
+ "aws-smithy-runtime-api",
"aws-smithy-types",
- "urlencoding",
+ "bytes",
+ "fastrand",
+ "h2 0.3.24",
+ "http 0.2.11",
+ "http-body 0.4.6",
+ "hyper 0.14.28",
+ "hyper-rustls 0.24.2",
+ "once_cell",
+ "pin-project-lite",
+ "pin-utils",
+ "rustls 0.21.10",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "aws-smithy-runtime-api"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c18276dd28852f34b3bf501f4f3719781f4999a51c7bff1a5c6dc8c4529adc29"
+dependencies = [
+ "aws-smithy-async",
+ "aws-smithy-types",
+ "bytes",
+ "http 0.2.11",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+ "zeroize",
]
[[package]]
name = "aws-smithy-types"
-version = "0.55.3"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16a3d0bf4f324f4ef9793b86a1701d9700fbcdbd12a846da45eed104c634c6e8"
+checksum = "bb3e134004170d3303718baa2a4eb4ca64ee0a1c0a7041dca31b38be0fb414f3"
dependencies = [
"base64-simd",
+ "bytes",
+ "bytes-utils",
+ "futures-core",
+ "http 0.2.11",
+ "http-body 0.4.6",
"itoa",
"num-integer",
+ "pin-project-lite",
+ "pin-utils",
"ryu",
- "time 0.3.28",
+ "serde",
+ "time",
+ "tokio",
+ "tokio-util 0.7.10",
]
[[package]]
name = "aws-smithy-xml"
-version = "0.55.3"
+version = "0.60.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1b9d12875731bd07e767be7baad95700c3137b56730ec9ddeedb52a5e5ca63b"
+checksum = "8604a11b25e9ecaf32f9aa56b9fe253c5e2f606a3477f0071e96d3155a5ed218"
dependencies = [
"xmlparser",
]
[[package]]
name = "aws-types"
-version = "0.55.3"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6dd209616cc8d7bfb82f87811a5c655dc97537f592689b18743bddf5dc5c4829"
+checksum = "789bbe008e65636fe1b6dbbb374c40c8960d1232b96af5ff4aec349f9c4accf4"
dependencies = [
"aws-credential-types",
"aws-smithy-async",
- "aws-smithy-client",
- "aws-smithy-http",
+ "aws-smithy-runtime-api",
"aws-smithy-types",
- "http",
+ "http 0.2.11",
"rustc_version",
"tracing",
]
@@ -576,6 +600,12 @@ dependencies = [
]
[[package]]
+name = "base16ct"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce"
+
+[[package]]
name = "base64"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -583,9 +613,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
[[package]]
name = "base64"
-version = "0.21.3"
+version = "0.21.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53"
+checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
[[package]]
name = "base64-simd"
@@ -598,6 +628,12 @@ dependencies = [
]
[[package]]
+name = "base64ct"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
+
+[[package]]
name = "bincode"
version = "1.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -614,9 +650,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
-version = "2.4.0"
+version = "2.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
+checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
[[package]]
name = "blake2"
@@ -638,33 +674,33 @@ dependencies = [
[[package]]
name = "bumpalo"
-version = "3.13.0"
+version = "3.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"
+checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
[[package]]
name = "bytemuck"
-version = "1.13.1"
+version = "1.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea"
+checksum = "ed2490600f404f2b94c167e31d3ed1d5f3c225a0f3b80230053b3e0b7b962bd9"
[[package]]
name = "byteorder"
-version = "1.4.3"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "bytes"
-version = "1.4.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
+checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
[[package]]
name = "bytes-utils"
-version = "0.1.3"
+version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e47d3a8076e283f3acd27400535992edb3ba4b5bb72f8891ad8fbe7932a7d4b9"
+checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35"
dependencies = [
"bytes",
"either",
@@ -700,18 +736,17 @@ checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
[[package]]
name = "chrono"
-version = "0.4.26"
+version = "0.4.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5"
+checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb"
dependencies = [
"android-tzdata",
"iana-time-zone",
"js-sys",
"num-traits",
"serde",
- "time 0.1.45",
"wasm-bindgen",
- "winapi",
+ "windows-targets 0.52.0",
]
[[package]]
@@ -727,20 +762,19 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.4.0"
+version = "4.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d5f1946157a96594eb2d2c10eb7ad9a2b27518cb3000209dec700c35df9197d"
+checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c"
dependencies = [
"clap_builder",
"clap_derive",
- "once_cell",
]
[[package]]
name = "clap_builder"
-version = "4.4.0"
+version = "4.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78116e32a042dd73c2901f0dc30790d20ff3447f3e3472fad359e8c3d282bcd6"
+checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7"
dependencies = [
"anstream",
"anstyle",
@@ -750,21 +784,21 @@ dependencies = [
[[package]]
name = "clap_derive"
-version = "4.4.0"
+version = "4.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c9fd1a5729c4548118d7d70ff234a44868d00489a4b6597b0b020918a0e91a1a"
+checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"
dependencies = [
"heck 0.4.1",
"proc-macro2",
"quote",
- "syn 2.0.29",
+ "syn 2.0.48",
]
[[package]]
name = "clap_lex"
-version = "0.5.1"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961"
+checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
[[package]]
name = "colorchoice"
@@ -773,10 +807,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
[[package]]
+name = "const-oid"
+version = "0.9.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
+
+[[package]]
name = "core-foundation"
-version = "0.9.3"
+version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
dependencies = [
"core-foundation-sys",
"libc",
@@ -784,15 +824,15 @@ dependencies = [
[[package]]
name = "core-foundation-sys"
-version = "0.8.4"
+version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
[[package]]
name = "cpufeatures"
-version = "0.2.9"
+version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1"
+checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
dependencies = [
"libc",
]
@@ -817,44 +857,57 @@ dependencies = [
[[package]]
name = "crossbeam-channel"
-version = "0.5.8"
+version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b"
dependencies = [
- "cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
-version = "0.9.15"
+version = "0.9.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
dependencies = [
- "autocfg",
- "cfg-if",
"crossbeam-utils",
- "memoffset",
- "scopeguard",
]
[[package]]
name = "crossbeam-queue"
-version = "0.3.8"
+version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add"
+checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35"
dependencies = [
- "cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
-version = "0.8.16"
+version = "0.8.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
+
+[[package]]
+name = "crypto-bigint"
+version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
+checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef"
dependencies = [
- "cfg-if",
+ "generic-array",
+ "rand_core",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "crypto-bigint"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76"
+dependencies = [
+ "rand_core",
+ "subtle",
]
[[package]]
@@ -869,9 +922,9 @@ dependencies = [
[[package]]
name = "darling"
-version = "0.14.4"
+version = "0.20.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850"
+checksum = "fc5d6b04b3fd0ba9926f945895de7d806260a2d7431ba82e7edaecb043c4c6b8"
dependencies = [
"darling_core",
"darling_macro",
@@ -879,27 +932,27 @@ dependencies = [
[[package]]
name = "darling_core"
-version = "0.14.4"
+version = "0.20.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0"
+checksum = "04e48a959bcd5c761246f5d090ebc2fbf7b9cd527a492b07a67510c108f1e7e3"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
"strsim",
- "syn 1.0.109",
+ "syn 2.0.48",
]
[[package]]
name = "darling_macro"
-version = "0.14.4"
+version = "0.20.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e"
+checksum = "1d1545d67a2149e1d93b7e5c7752dce5a7426eb5d1357ddcfd89336b94444f77"
dependencies = [
"darling_core",
"quote",
- "syn 1.0.109",
+ "syn 2.0.48",
]
[[package]]
@@ -913,10 +966,23 @@ dependencies = [
]
[[package]]
+name = "der"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de"
+dependencies = [
+ "const-oid",
+ "zeroize",
+]
+
+[[package]]
name = "deranged"
-version = "0.3.8"
+version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946"
+checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
+dependencies = [
+ "powerfmt",
+]
[[package]]
name = "derivative"
@@ -941,58 +1007,56 @@ dependencies = [
]
[[package]]
-name = "dirs-next"
-version = "2.0.0"
+name = "dyn-clone"
+version = "1.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
-dependencies = [
- "cfg-if",
- "dirs-sys-next",
-]
+checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d"
[[package]]
-name = "dirs-sys-next"
-version = "0.1.2"
+name = "ecdsa"
+version = "0.14.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
+checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c"
dependencies = [
- "libc",
- "redox_users",
- "winapi",
+ "der",
+ "elliptic-curve",
+ "rfc6979",
+ "signature",
]
[[package]]
-name = "dyn-clone"
-version = "1.0.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbfc4744c1b8f2a09adc0e55242f60b1af195d88596bd8700be74418c056c555"
-
-[[package]]
name = "either"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
[[package]]
-name = "encoding_rs"
-version = "0.8.33"
+name = "elliptic-curve"
+version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
+checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3"
dependencies = [
- "cfg-if",
+ "base16ct",
+ "crypto-bigint 0.4.9",
+ "der",
+ "digest",
+ "ff",
+ "generic-array",
+ "group",
+ "pkcs8",
+ "rand_core",
+ "sec1",
+ "subtle",
+ "zeroize",
]
[[package]]
-name = "env_logger"
-version = "0.10.0"
+name = "encoding_rs"
+version = "0.8.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0"
+checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
dependencies = [
- "humantime",
- "is-terminal",
- "log",
- "regex",
- "termcolor",
+ "cfg-if",
]
[[package]]
@@ -1017,30 +1081,19 @@ dependencies = [
[[package]]
name = "errno"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f"
-dependencies = [
- "errno-dragonfly",
- "libc",
- "windows-sys",
-]
-
-[[package]]
-name = "errno-dragonfly"
-version = "0.1.2"
+version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
dependencies = [
- "cc",
"libc",
+ "windows-sys 0.52.0",
]
[[package]]
name = "fallible-iterator"
-version = "0.2.0"
+version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
+checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"
[[package]]
name = "fallible-streaming-iterator"
@@ -1050,18 +1103,19 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
[[package]]
name = "fastrand"
-version = "1.9.0"
+version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
-dependencies = [
- "instant",
-]
+checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
[[package]]
-name = "fastrand"
-version = "2.0.0"
+name = "ff"
+version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764"
+checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160"
+dependencies = [
+ "rand_core",
+ "subtle",
+]
[[package]]
name = "fixedbitset"
@@ -1077,9 +1131,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "form_urlencoded"
-version = "1.2.0"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
+checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
dependencies = [
"percent-encoding",
]
@@ -1100,9 +1154,9 @@ dependencies = [
[[package]]
name = "futures"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"
+checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
dependencies = [
"futures-channel",
"futures-core",
@@ -1115,9 +1169,9 @@ dependencies = [
[[package]]
name = "futures-channel"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
+checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
dependencies = [
"futures-core",
"futures-sink",
@@ -1125,15 +1179,15 @@ dependencies = [
[[package]]
name = "futures-core"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
+checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
[[package]]
name = "futures-executor"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
+checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
dependencies = [
"futures-core",
"futures-task",
@@ -1142,38 +1196,38 @@ dependencies = [
[[package]]
name = "futures-io"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
+checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
[[package]]
name = "futures-macro"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
+checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.29",
+ "syn 2.0.48",
]
[[package]]
name = "futures-sink"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
+checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
[[package]]
name = "futures-task"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
+checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
[[package]]
name = "futures-util"
-version = "0.3.28"
+version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
+checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
dependencies = [
"futures-channel",
"futures-core",
@@ -1205,7 +1259,7 @@ dependencies = [
"aws-config",
"aws-sdk-s3",
"backtrace",
- "base64 0.21.3",
+ "base64 0.21.7",
"bytes",
"bytesize",
"chrono",
@@ -1223,10 +1277,13 @@ dependencies = [
"git-version",
"hex",
"hmac",
- "http",
- "hyper",
+ "http 1.0.0",
+ "http-body-util",
+ "hyper 1.1.0",
+ "hyper-util",
"k2v-client",
"kuska-sodiumoxide",
+ "mktemp",
"netapp",
"opentelemetry",
"opentelemetry-otlp",
@@ -1252,7 +1309,7 @@ name = "garage_api"
version = "0.10.0"
dependencies = [
"async-trait",
- "base64 0.21.3",
+ "base64 0.21.7",
"bytes",
"chrono",
"crypto-common",
@@ -1267,11 +1324,12 @@ dependencies = [
"garage_util",
"hex",
"hmac",
- "http",
+ "http 1.0.0",
+ "http-body-util",
"http-range",
"httpdate",
- "hyper",
- "hyperlocal",
+ "hyper 1.1.0",
+ "hyper-util",
"idna",
"md-5",
"multer",
@@ -1314,7 +1372,7 @@ dependencies = [
"serde",
"serde_bytes",
"tokio",
- "tokio-util 0.7.8",
+ "tokio-util 0.7.10",
"tracing",
"zstd",
]
@@ -1323,12 +1381,10 @@ dependencies = [
name = "garage_db"
version = "0.10.0"
dependencies = [
- "clap 4.4.0",
"err-derive",
"heed",
"hexdump",
"mktemp",
- "pretty_env_logger",
"rusqlite",
"sled",
"tracing",
@@ -1340,7 +1396,7 @@ version = "0.10.0"
dependencies = [
"arc-swap",
"async-trait",
- "base64 0.21.3",
+ "base64 0.21.7",
"blake2",
"chrono",
"err-derive",
@@ -1378,7 +1434,7 @@ dependencies = [
"garage_util",
"gethostname",
"hex",
- "itertools 0.10.5",
+ "itertools 0.12.1",
"k8s-openapi",
"kube",
"kuska-sodiumoxide",
@@ -1435,8 +1491,8 @@ dependencies = [
"garage_db",
"hex",
"hexdump",
- "http",
- "hyper",
+ "http 1.0.0",
+ "hyper 1.1.0",
"lazy_static",
"mktemp",
"netapp",
@@ -1463,9 +1519,10 @@ dependencies = [
"garage_model",
"garage_table",
"garage_util",
- "http",
- "hyper",
- "hyperlocal",
+ "http 1.0.0",
+ "http-body-util",
+ "hyper 1.1.0",
+ "hyper-util",
"opentelemetry",
"percent-encoding",
"tokio",
@@ -1489,64 +1546,92 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818"
dependencies = [
"libc",
- "windows-targets",
+ "windows-targets 0.48.5",
]
[[package]]
name = "getrandom"
-version = "0.2.10"
+version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"
+checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
dependencies = [
"cfg-if",
"libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
+ "wasi",
]
[[package]]
name = "gimli"
-version = "0.28.0"
+version = "0.28.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
+checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
[[package]]
name = "git-version"
-version = "0.3.5"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f6b0decc02f4636b9ccad390dcbe77b722a77efedfa393caf8379a51d5c61899"
+checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19"
dependencies = [
"git-version-macro",
- "proc-macro-hack",
]
[[package]]
name = "git-version-macro"
-version = "0.3.5"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe69f1cbdb6e28af2bac214e943b99ce8a0a06b447d15d3e61161b0423139f3f"
+checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0"
dependencies = [
- "proc-macro-hack",
"proc-macro2",
"quote",
- "syn 1.0.109",
+ "syn 2.0.48",
+]
+
+[[package]]
+name = "group"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7"
+dependencies = [
+ "ff",
+ "rand_core",
+ "subtle",
]
[[package]]
name = "h2"
-version = "0.3.21"
+version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833"
+checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9"
dependencies = [
"bytes",
"fnv",
"futures-core",
"futures-sink",
"futures-util",
- "http",
- "indexmap 1.9.3",
+ "http 0.2.11",
+ "indexmap 2.2.2",
"slab",
"tokio",
- "tokio-util 0.7.8",
+ "tokio-util 0.7.10",
+ "tracing",
+]
+
+[[package]]
+name = "h2"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http 1.0.0",
+ "indexmap 2.2.2",
+ "slab",
+ "tokio",
+ "tokio-util 0.7.10",
"tracing",
]
@@ -1558,9 +1643,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]]
name = "hashbrown"
-version = "0.14.0"
+version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
+checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
dependencies = [
"ahash",
"allocator-api2",
@@ -1568,11 +1653,11 @@ dependencies = [
[[package]]
name = "hashlink"
-version = "0.8.3"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f"
+checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7"
dependencies = [
- "hashbrown 0.14.0",
+ "hashbrown 0.14.3",
]
[[package]]
@@ -1630,9 +1715,9 @@ dependencies = [
[[package]]
name = "hermit-abi"
-version = "0.3.2"
+version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b"
+checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f"
[[package]]
name = "hex"
@@ -1660,10 +1745,30 @@ dependencies = [
]
[[package]]
+name = "home"
+version = "0.5.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
+dependencies = [
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "http"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
name = "http"
-version = "0.2.9"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea"
dependencies = [
"bytes",
"fnv",
@@ -1672,12 +1777,35 @@ dependencies = [
[[package]]
name = "http-body"
-version = "0.4.5"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
+dependencies = [
+ "bytes",
+ "http 0.2.11",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "http-body"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"
+dependencies = [
+ "bytes",
+ "http 1.0.0",
+]
+
+[[package]]
+name = "http-body-util"
+version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840"
dependencies = [
"bytes",
- "http",
+ "futures-util",
+ "http 1.0.0",
+ "http-body 1.0.0",
"pin-project-lite",
]
@@ -1706,29 +1834,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
[[package]]
-name = "humantime"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
-
-[[package]]
name = "hyper"
-version = "0.14.27"
+version = "0.14.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"
+checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80"
dependencies = [
"bytes",
"futures-channel",
"futures-core",
"futures-util",
- "h2",
- "http",
- "http-body",
+ "h2 0.3.24",
+ "http 0.2.11",
+ "http-body 0.4.6",
"httparse",
"httpdate",
"itoa",
"pin-project-lite",
- "socket2 0.4.9",
+ "socket2",
"tokio",
"tower-service",
"tracing",
@@ -1736,34 +1858,58 @@ dependencies = [
]
[[package]]
+name = "hyper"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "h2 0.4.2",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "tokio",
+ "want",
+]
+
+[[package]]
name = "hyper-rustls"
-version = "0.23.2"
+version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c"
+checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"
dependencies = [
- "http",
- "hyper",
+ "futures-util",
+ "http 0.2.11",
+ "hyper 0.14.28",
"log",
- "rustls 0.20.8",
- "rustls-native-certs",
+ "rustls 0.21.10",
+ "rustls-native-certs 0.6.3",
"tokio",
- "tokio-rustls 0.23.4",
+ "tokio-rustls 0.24.1",
]
[[package]]
name = "hyper-rustls"
-version = "0.24.1"
+version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97"
+checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c"
dependencies = [
"futures-util",
- "http",
- "hyper",
+ "http 1.0.0",
+ "hyper 1.1.0",
+ "hyper-util",
"log",
- "rustls 0.21.6",
- "rustls-native-certs",
+ "rustls 0.22.2",
+ "rustls-native-certs 0.7.0",
+ "rustls-pki-types",
"tokio",
- "tokio-rustls 0.24.1",
+ "tokio-rustls 0.25.0",
+ "tower-service",
]
[[package]]
@@ -1772,37 +1918,44 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
dependencies = [
- "hyper",
+ "hyper 0.14.28",
"pin-project-lite",
"tokio",
"tokio-io-timeout",
]
[[package]]
-name = "hyperlocal"
-version = "0.8.0"
+name = "hyper-util"
+version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fafdf7b2b2de7c9784f76e02c0935e65a8117ec3b768644379983ab333ac98c"
+checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa"
dependencies = [
+ "bytes",
+ "futures-channel",
"futures-util",
- "hex",
- "hyper",
- "pin-project",
+ "http 1.0.0",
+ "http-body 1.0.0",
+ "hyper 1.1.0",
+ "pin-project-lite",
+ "socket2",
"tokio",
+ "tower",
+ "tower-service",
+ "tracing",
]
[[package]]
name = "iana-time-zone"
-version = "0.1.57"
+version = "0.1.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613"
+checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
"wasm-bindgen",
- "windows",
+ "windows-core",
]
[[package]]
@@ -1822,9 +1975,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]]
name = "idna"
-version = "0.4.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
dependencies = [
"unicode-bidi",
"unicode-normalization",
@@ -1842,12 +1995,12 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "2.0.0"
+version = "2.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
+checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520"
dependencies = [
"equivalent",
- "hashbrown 0.14.0",
+ "hashbrown 0.14.3",
]
[[package]]
@@ -1861,9 +2014,9 @@ dependencies = [
[[package]]
name = "ipnet"
-version = "2.8.0"
+version = "2.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6"
+checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
[[package]]
name = "ipnetwork"
@@ -1875,17 +2028,6 @@ dependencies = [
]
[[package]]
-name = "is-terminal"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
-dependencies = [
- "hermit-abi",
- "rustix",
- "windows-sys",
-]
-
-[[package]]
name = "itertools"
version = "0.4.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1901,63 +2043,78 @@ dependencies = [
]
[[package]]
+name = "itertools"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
+dependencies = [
+ "either",
+]
+
+[[package]]
name = "itoa"
-version = "1.0.9"
+version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
+checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
[[package]]
name = "jobserver"
-version = "0.1.26"
+version = "0.1.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2"
+checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d"
dependencies = [
"libc",
]
[[package]]
name = "js-sys"
-version = "0.3.64"
+version = "0.3.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"
+checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1"
dependencies = [
"wasm-bindgen",
]
[[package]]
name = "json-patch"
-version = "0.2.7"
+version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb3fa5a61630976fc4c353c70297f2e93f1930e3ccee574d59d618ccbd5154ce"
+checksum = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6"
dependencies = [
"serde",
"serde_json",
+ "thiserror",
"treediff",
]
[[package]]
-name = "jsonpath_lib"
-version = "0.3.0"
+name = "jsonpath-rust"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eaa63191d68230cccb81c5aa23abd53ed64d83337cacbb25a7b8c7979523774f"
+checksum = "96acbc6188d3bd83519d053efec756aa4419de62ec47be7f28dec297f7dc9eb0"
dependencies = [
- "log",
- "serde",
+ "pest",
+ "pest_derive",
+ "regex",
"serde_json",
+ "thiserror",
]
[[package]]
name = "k2v-client"
version = "0.0.4"
dependencies = [
+ "aws-sdk-config",
"aws-sigv4",
- "base64 0.21.3",
- "clap 4.4.0",
+ "base64 0.21.7",
+ "clap 4.4.18",
"format_table",
"hex",
- "http",
- "hyper",
- "hyper-rustls 0.24.1",
+ "http 1.0.0",
+ "http-body-util",
+ "hyper 1.1.0",
+ "hyper-rustls 0.26.0",
+ "hyper-util",
"log",
"percent-encoding",
"serde",
@@ -1971,26 +2128,22 @@ dependencies = [
[[package]]
name = "k8s-openapi"
-version = "0.16.0"
+version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d9455388f4977de4d0934efa9f7d36296295537d774574113a20f6082de03da"
+checksum = "301f367a36090b7dfdaac248ee3ed4f14a6a8292e7bec0f1c5e6e2e1f181cd33"
dependencies = [
- "base64 0.13.1",
- "bytes",
+ "base64 0.21.7",
"chrono",
- "http",
- "percent-encoding",
"serde",
"serde-value",
"serde_json",
- "url",
]
[[package]]
name = "kube"
-version = "0.75.0"
+version = "0.88.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9bb19108692aeafebb108fd0a1c381c06ac4c03859652599420975165e939b8a"
+checksum = "462fe330a0617b276ec864c2255810adcdf519ecb6844253c54074b2086a97bc"
dependencies = [
"k8s-openapi",
"kube-client",
@@ -2001,35 +2154,35 @@ dependencies = [
[[package]]
name = "kube-client"
-version = "0.75.0"
+version = "0.88.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97e1a80ecd1b1438a2fc004549e155d47250b9e01fbfcf4cfbe9c8b56a085593"
+checksum = "7fe0d65dd6f3adba29cfb84f19dfe55449c7f6c35425f9d8294bec40313e0b64"
dependencies = [
- "base64 0.13.1",
+ "base64 0.21.7",
"bytes",
"chrono",
- "dirs-next",
"either",
"futures",
- "http",
- "http-body",
- "hyper",
- "hyper-rustls 0.23.2",
+ "home",
+ "http 0.2.11",
+ "http-body 0.4.6",
+ "hyper 0.14.28",
+ "hyper-rustls 0.24.2",
"hyper-timeout",
- "jsonpath_lib",
+ "jsonpath-rust",
"k8s-openapi",
"kube-core",
"pem",
"pin-project",
- "rustls 0.20.8",
- "rustls-pemfile",
+ "rustls 0.21.10",
+ "rustls-pemfile 1.0.4",
"secrecy",
"serde",
"serde_json",
"serde_yaml",
"thiserror",
"tokio",
- "tokio-util 0.7.8",
+ "tokio-util 0.7.10",
"tower",
"tower-http",
"tracing",
@@ -2037,13 +2190,13 @@ dependencies = [
[[package]]
name = "kube-core"
-version = "0.75.0"
+version = "0.88.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4d780f2bb048eeef64a4c6b2582d26a0fe19e30b4d3cc9e081616e1779c5d47"
+checksum = "a6b42844e9172f631b8263ea9ce003b9251da13beb1401580937ad206dd82f4c"
dependencies = [
"chrono",
"form_urlencoded",
- "http",
+ "http 0.2.11",
"json-patch",
"k8s-openapi",
"once_cell",
@@ -2055,27 +2208,29 @@ dependencies = [
[[package]]
name = "kube-derive"
-version = "0.75.0"
+version = "0.88.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "98459d53b2841237392cd6959956185b2df15c19d32c3b275ed6ca7b7ee1adae"
+checksum = "f5b5a111ee287bd237b8190b8c39543ea9fd22f79e9c32a36c24e08234bcda22"
dependencies = [
"darling",
"proc-macro2",
"quote",
"serde_json",
- "syn 1.0.109",
+ "syn 2.0.48",
]
[[package]]
name = "kube-runtime"
-version = "0.75.0"
+version = "0.88.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7769af142ee2e46bfa44bd393cf7f40b9d8b80d2e11f6317399551ed17760beb"
+checksum = "2bc06275064c81056fbb28ea876b3fb339d970e8132282119359afca0835c0ea"
dependencies = [
"ahash",
+ "async-trait",
"backoff",
"derivative",
"futures",
+ "hashbrown 0.14.3",
"json-patch",
"k8s-openapi",
"kube-client",
@@ -2086,7 +2241,7 @@ dependencies = [
"smallvec",
"thiserror",
"tokio",
- "tokio-util 0.7.8",
+ "tokio-util 0.7.10",
"tracing",
]
@@ -2122,9 +2277,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
-version = "0.2.147"
+version = "0.2.153"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
+checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
[[package]]
name = "libsodium-sys"
@@ -2140,9 +2295,9 @@ dependencies = [
[[package]]
name = "libsqlite3-sys"
-version = "0.26.0"
+version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326"
+checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716"
dependencies = [
"cc",
"pkg-config",
@@ -2150,16 +2305,10 @@ dependencies = [
]
[[package]]
-name = "linked-hash-map"
-version = "0.5.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
-
-[[package]]
name = "linux-raw-sys"
-version = "0.4.5"
+version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503"
+checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
[[package]]
name = "lmdb-rkv-sys"
@@ -2174,9 +2323,9 @@ dependencies = [
[[package]]
name = "lock_api"
-version = "0.4.10"
+version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
+checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
dependencies = [
"autocfg",
"scopeguard",
@@ -2199,27 +2348,19 @@ dependencies = [
[[package]]
name = "md-5"
-version = "0.10.5"
+version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca"
+checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"
dependencies = [
+ "cfg-if",
"digest",
]
[[package]]
name = "memchr"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
-
-[[package]]
-name = "memoffset"
-version = "0.9.0"
+version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
-dependencies = [
- "autocfg",
-]
+checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
[[package]]
name = "mime"
@@ -2235,48 +2376,48 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "miniz_oxide"
-version = "0.7.1"
+version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
dependencies = [
"adler",
]
[[package]]
name = "mio"
-version = "0.8.8"
+version = "0.8.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
+checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"
dependencies = [
"libc",
- "wasi 0.11.0+wasi-snapshot-preview1",
- "windows-sys",
+ "wasi",
+ "windows-sys 0.48.0",
]
[[package]]
name = "mktemp"
-version = "0.5.0"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bdc1f74dd7bb717d39f784f844e490d935b3aa7e383008006dbbf29c1f7820a"
+checksum = "69fed8fbcd01affec44ac226784c6476a6006d98d13e33bc0ca7977aaf046bd8"
dependencies = [
"uuid",
]
[[package]]
name = "multer"
-version = "2.1.0"
+version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2"
+checksum = "a15d522be0a9c3e46fd2632e272d178f56387bdb5c9fbb3a36c649062e9b5219"
dependencies = [
"bytes",
"encoding_rs",
"futures-util",
- "http",
+ "http 1.0.0",
"httparse",
"log",
"memchr",
"mime",
- "spin 0.9.8",
+ "spin",
"version_check",
]
@@ -2310,7 +2451,7 @@ dependencies = [
"serde",
"tokio",
"tokio-stream",
- "tokio-util 0.7.8",
+ "tokio-util 0.7.10",
]
[[package]]
@@ -2319,7 +2460,7 @@ version = "0.27.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.2",
"cfg-if",
"libc",
]
@@ -2395,6 +2536,12 @@ dependencies = [
]
[[package]]
+name = "num-conv"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
+
+[[package]]
name = "num-integer"
version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2429,9 +2576,9 @@ dependencies = [
[[package]]
name = "num-traits"
-version = "0.2.16"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"
+checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
dependencies = [
"autocfg",
]
@@ -2448,18 +2595,18 @@ dependencies = [
[[package]]
name = "object"
-version = "0.32.0"
+version = "0.32.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe"
+checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
dependencies = [
"memchr",
]
[[package]]
name = "once_cell"
-version = "1.18.0"
+version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
[[package]]
name = "openssl-probe"
@@ -2509,7 +2656,7 @@ dependencies = [
"async-trait",
"futures",
"futures-util",
- "http",
+ "http 0.2.11",
"opentelemetry",
"prost",
"thiserror",
@@ -2531,9 +2678,9 @@ dependencies = [
[[package]]
name = "ordered-float"
-version = "2.10.0"
+version = "2.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87"
+checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c"
dependencies = [
"num-traits",
]
@@ -2551,6 +2698,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
[[package]]
+name = "p256"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594"
+dependencies = [
+ "ecdsa",
+ "elliptic-curve",
+ "sha2",
+]
+
+[[package]]
name = "page_size"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2578,7 +2736,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
dependencies = [
"lock_api",
- "parking_lot_core 0.9.8",
+ "parking_lot_core 0.9.9",
]
[[package]]
@@ -2597,15 +2755,15 @@ dependencies = [
[[package]]
name = "parking_lot_core"
-version = "0.9.8"
+version = "0.9.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
+checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
dependencies = [
"cfg-if",
"libc",
- "redox_syscall 0.3.5",
+ "redox_syscall 0.4.1",
"smallvec",
- "windows-targets",
+ "windows-targets 0.48.5",
]
[[package]]
@@ -2627,18 +2785,64 @@ checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
[[package]]
name = "pem"
-version = "1.1.1"
+version = "3.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8"
+checksum = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310"
dependencies = [
- "base64 0.13.1",
+ "base64 0.21.7",
+ "serde",
]
[[package]]
name = "percent-encoding"
-version = "2.3.0"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+
+[[package]]
+name = "pest"
+version = "2.7.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546"
+dependencies = [
+ "memchr",
+ "thiserror",
+ "ucd-trie",
+]
+
+[[package]]
+name = "pest_derive"
+version = "2.7.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
+checksum = "22e1288dbd7786462961e69bfd4df7848c1e37e8b74303dbdab82c3a9cdd2809"
+dependencies = [
+ "pest",
+ "pest_generator",
+]
+
+[[package]]
+name = "pest_generator"
+version = "2.7.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1381c29a877c6d34b8c176e734f35d7f7f5b3adaefe940cb4d1bb7af94678e2e"
+dependencies = [
+ "pest",
+ "pest_meta",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.48",
+]
+
+[[package]]
+name = "pest_meta"
+version = "2.7.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0934d6907f148c22a3acbda520c7eed243ad7487a30f51f6ce52b58b7077a8a"
+dependencies = [
+ "once_cell",
+ "pest",
+ "sha2",
+]
[[package]]
name = "petgraph"
@@ -2647,27 +2851,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9"
dependencies = [
"fixedbitset",
- "indexmap 2.0.0",
+ "indexmap 2.2.2",
]
[[package]]
name = "pin-project"
-version = "1.1.3"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422"
+checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0"
dependencies = [
"pin-project-internal",
]
[[package]]
name = "pin-project-internal"
-version = "1.1.3"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
+checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.29",
+ "syn 2.0.48",
]
[[package]]
@@ -2683,25 +2887,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
+name = "pkcs8"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba"
+dependencies = [
+ "der",
+ "spki",
+]
+
+[[package]]
name = "pkg-config"
-version = "0.3.27"
+version = "0.3.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb"
[[package]]
name = "pnet_base"
-version = "0.33.0"
+version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "872e46346144ebf35219ccaa64b1dffacd9c6f188cd7d012bd6977a2a838f42e"
+checksum = "fe4cf6fb3ab38b68d01ab2aea03ed3d1132b4868fa4e06285f29f16da01c5f4c"
dependencies = [
"no-std-net",
]
[[package]]
name = "pnet_datalink"
-version = "0.33.0"
+version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c302da22118d2793c312a35fb3da6846cb0fab6c3ad53fd67e37809b06cdafce"
+checksum = "ad5854abf0067ebbd3967f7d45ebc8976ff577ff0c7bd101c4973ae3c70f98fe"
dependencies = [
"ipnetwork",
"libc",
@@ -2712,29 +2926,25 @@ dependencies = [
[[package]]
name = "pnet_sys"
-version = "0.33.0"
+version = "0.34.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "faf7a58b2803d818a374be9278a1fe8f88fce14b936afbe225000cfcd9c73f16"
+checksum = "417c0becd1b573f6d544f73671070b039051e5ad819cc64aa96377b536128d00"
dependencies = [
"libc",
"winapi",
]
[[package]]
-name = "ppv-lite86"
-version = "0.2.17"
+name = "powerfmt"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
-name = "pretty_env_logger"
-version = "0.5.0"
+name = "ppv-lite86"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c"
-dependencies = [
- "env_logger",
- "log",
-]
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
name = "proc-macro-error"
@@ -2761,16 +2971,10 @@ dependencies = [
]
[[package]]
-name = "proc-macro-hack"
-version = "0.5.20+deprecated"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
-
-[[package]]
name = "proc-macro2"
-version = "1.0.66"
+version = "1.0.78"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
+checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
dependencies = [
"unicode-ident",
]
@@ -2861,9 +3065,9 @@ dependencies = [
[[package]]
name = "quote"
-version = "1.0.33"
+version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
dependencies = [
"proc-macro2",
]
@@ -2909,34 +3113,23 @@ dependencies = [
[[package]]
name = "redox_syscall"
-version = "0.3.5"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
dependencies = [
"bitflags 1.3.2",
]
[[package]]
-name = "redox_users"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
-dependencies = [
- "getrandom",
- "redox_syscall 0.2.16",
- "thiserror",
-]
-
-[[package]]
name = "regex"
-version = "1.9.4"
+version = "1.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29"
+checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"
dependencies = [
"aho-corasick",
"memchr",
- "regex-automata 0.3.7",
- "regex-syntax 0.7.5",
+ "regex-automata 0.4.5",
+ "regex-syntax 0.8.2",
]
[[package]]
@@ -2950,16 +3143,22 @@ dependencies = [
[[package]]
name = "regex-automata"
-version = "0.3.7"
+version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629"
+checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd"
dependencies = [
"aho-corasick",
"memchr",
- "regex-syntax 0.7.5",
+ "regex-syntax 0.8.2",
]
[[package]]
+name = "regex-lite"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e"
+
+[[package]]
name = "regex-syntax"
version = "0.6.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2967,26 +3166,26 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "regex-syntax"
-version = "0.7.5"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
+checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
[[package]]
name = "reqwest"
-version = "0.11.20"
+version = "0.11.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1"
+checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251"
dependencies = [
- "base64 0.21.3",
+ "base64 0.21.7",
"bytes",
"encoding_rs",
"futures-core",
"futures-util",
- "h2",
- "http",
- "http-body",
- "hyper",
- "hyper-rustls 0.24.1",
+ "h2 0.3.24",
+ "http 0.2.11",
+ "http-body 0.4.6",
+ "hyper 0.14.28",
+ "hyper-rustls 0.24.2",
"ipnet",
"js-sys",
"log",
@@ -2994,11 +3193,13 @@ dependencies = [
"once_cell",
"percent-encoding",
"pin-project-lite",
- "rustls 0.21.6",
- "rustls-pemfile",
+ "rustls 0.21.10",
+ "rustls-pemfile 1.0.4",
"serde",
"serde_json",
"serde_urlencoded",
+ "sync_wrapper",
+ "system-configuration",
"tokio",
"tokio-rustls 0.24.1",
"tower-service",
@@ -3010,18 +3211,28 @@ dependencies = [
]
[[package]]
+name = "rfc6979"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb"
+dependencies = [
+ "crypto-bigint 0.4.9",
+ "hmac",
+ "zeroize",
+]
+
+[[package]]
name = "ring"
-version = "0.16.20"
+version = "0.17.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74"
dependencies = [
"cc",
+ "getrandom",
"libc",
- "once_cell",
- "spin 0.5.2",
+ "spin",
"untrusted",
- "web-sys",
- "winapi",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -3048,20 +3259,17 @@ dependencies = [
[[package]]
name = "roxmltree"
-version = "0.18.0"
+version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8f595a457b6b8c6cda66a48503e92ee8d19342f905948f29c383200ec9eb1d8"
-dependencies = [
- "xmlparser",
-]
+checksum = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f"
[[package]]
name = "rusqlite"
-version = "0.29.0"
+version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2"
+checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.2",
"fallible-iterator",
"fallible-streaming-iterator",
"hashlink",
@@ -3086,39 +3294,41 @@ dependencies = [
[[package]]
name = "rustix"
-version = "0.38.9"
+version = "0.38.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9bfe0f2582b4931a45d1fa608f8a8722e8b3c7ac54dd6d5f3b3212791fedef49"
+checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.2",
"errno",
"libc",
"linux-raw-sys",
- "windows-sys",
+ "windows-sys 0.52.0",
]
[[package]]
name = "rustls"
-version = "0.20.8"
+version = "0.21.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f"
+checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba"
dependencies = [
"log",
"ring",
+ "rustls-webpki 0.101.7",
"sct",
- "webpki",
]
[[package]]
name = "rustls"
-version = "0.21.6"
+version = "0.22.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb"
+checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41"
dependencies = [
"log",
"ring",
- "rustls-webpki",
- "sct",
+ "rustls-pki-types",
+ "rustls-webpki 0.102.2",
+ "subtle",
+ "zeroize",
]
[[package]]
@@ -3128,31 +3338,71 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00"
dependencies = [
"openssl-probe",
- "rustls-pemfile",
+ "rustls-pemfile 1.0.4",
+ "schannel",
+ "security-framework",
+]
+
+[[package]]
+name = "rustls-native-certs"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792"
+dependencies = [
+ "openssl-probe",
+ "rustls-pemfile 2.0.0",
+ "rustls-pki-types",
"schannel",
"security-framework",
]
[[package]]
name = "rustls-pemfile"
-version = "1.0.3"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
+dependencies = [
+ "base64 0.21.7",
+]
+
+[[package]]
+name = "rustls-pemfile"
+version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2"
+checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4"
dependencies = [
- "base64 0.21.3",
+ "base64 0.21.7",
+ "rustls-pki-types",
]
[[package]]
+name = "rustls-pki-types"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf"
+
+[[package]]
name = "rustls-webpki"
-version = "0.101.4"
+version = "0.101.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d"
+checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"
dependencies = [
"ring",
"untrusted",
]
[[package]]
+name = "rustls-webpki"
+version = "0.102.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610"
+dependencies = [
+ "ring",
+ "rustls-pki-types",
+ "untrusted",
+]
+
+[[package]]
name = "rustversion"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3160,9 +3410,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
[[package]]
name = "ryu"
-version = "1.0.15"
+version = "1.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
+checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
[[package]]
name = "same-file"
@@ -3175,18 +3425,18 @@ dependencies = [
[[package]]
name = "schannel"
-version = "0.1.22"
+version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88"
+checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
dependencies = [
- "windows-sys",
+ "windows-sys 0.52.0",
]
[[package]]
name = "schemars"
-version = "0.8.12"
+version = "0.8.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f"
+checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29"
dependencies = [
"dyn-clone",
"schemars_derive",
@@ -3196,9 +3446,9 @@ dependencies = [
[[package]]
name = "schemars_derive"
-version = "0.8.12"
+version = "0.8.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c"
+checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967"
dependencies = [
"proc-macro2",
"quote",
@@ -3214,15 +3464,29 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "sct"
-version = "0.7.0"
+version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"
+checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"
dependencies = [
"ring",
"untrusted",
]
[[package]]
+name = "sec1"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928"
+dependencies = [
+ "base16ct",
+ "der",
+ "generic-array",
+ "pkcs8",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
name = "secrecy"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3257,15 +3521,15 @@ dependencies = [
[[package]]
name = "semver"
-version = "1.0.18"
+version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918"
+checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0"
[[package]]
name = "serde"
-version = "1.0.188"
+version = "1.0.196"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
+checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
dependencies = [
"serde_derive",
]
@@ -3282,22 +3546,22 @@ dependencies = [
[[package]]
name = "serde_bytes"
-version = "0.11.12"
+version = "0.11.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff"
+checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734"
dependencies = [
"serde",
]
[[package]]
name = "serde_derive"
-version = "1.0.188"
+version = "1.0.196"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
+checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.29",
+ "syn 2.0.48",
]
[[package]]
@@ -3313,11 +3577,10 @@ dependencies = [
[[package]]
name = "serde_json"
-version = "1.0.105"
+version = "1.0.113"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360"
+checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79"
dependencies = [
- "indexmap 2.0.0",
"itoa",
"ryu",
"serde",
@@ -3325,9 +3588,9 @@ dependencies = [
[[package]]
name = "serde_spanned"
-version = "0.6.3"
+version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186"
+checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"
dependencies = [
"serde",
]
@@ -3346,21 +3609,22 @@ dependencies = [
[[package]]
name = "serde_yaml"
-version = "0.8.26"
+version = "0.9.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b"
+checksum = "adf8a49373e98a4c5f0ceb5d05aa7c648d75f63774981ed95b7c7443bbd50c6e"
dependencies = [
- "indexmap 1.9.3",
+ "indexmap 2.2.2",
+ "itoa",
"ryu",
"serde",
- "yaml-rust",
+ "unsafe-libyaml",
]
[[package]]
name = "sha1"
-version = "0.10.5"
+version = "0.10.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3"
+checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
dependencies = [
"cfg-if",
"cpufeatures",
@@ -3369,9 +3633,9 @@ dependencies = [
[[package]]
name = "sha2"
-version = "0.10.7"
+version = "0.10.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8"
+checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
dependencies = [
"cfg-if",
"cpufeatures",
@@ -3380,9 +3644,9 @@ dependencies = [
[[package]]
name = "sharded-slab"
-version = "0.1.4"
+version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
+checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
dependencies = [
"lazy_static",
]
@@ -3397,6 +3661,16 @@ dependencies = [
]
[[package]]
+name = "signature"
+version = "1.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c"
+dependencies = [
+ "digest",
+ "rand_core",
+]
+
+[[package]]
name = "slab"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3423,41 +3697,35 @@ dependencies = [
[[package]]
name = "smallvec"
-version = "1.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
-
-[[package]]
-name = "socket2"
-version = "0.4.9"
+version = "1.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
-dependencies = [
- "libc",
- "winapi",
-]
+checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
[[package]]
name = "socket2"
-version = "0.5.3"
+version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877"
+checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
dependencies = [
"libc",
- "windows-sys",
+ "windows-sys 0.48.0",
]
[[package]]
name = "spin"
-version = "0.5.2"
+version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
[[package]]
-name = "spin"
-version = "0.9.8"
+name = "spki"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b"
+dependencies = [
+ "base64ct",
+ "der",
+]
[[package]]
name = "static_init"
@@ -3536,9 +3804,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.29"
+version = "2.0.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"
+checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
dependencies = [
"proc-macro2",
"quote",
@@ -3546,6 +3814,12 @@ dependencies = [
]
[[package]]
+name = "sync_wrapper"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+
+[[package]]
name = "synchronoise"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3567,25 +3841,37 @@ dependencies = [
]
[[package]]
-name = "tempfile"
-version = "3.8.0"
+name = "system-configuration"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef"
+checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
dependencies = [
- "cfg-if",
- "fastrand 2.0.0",
- "redox_syscall 0.3.5",
- "rustix",
- "windows-sys",
+ "bitflags 1.3.2",
+ "core-foundation",
+ "system-configuration-sys",
]
[[package]]
-name = "termcolor"
-version = "1.2.0"
+name = "system-configuration-sys"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
+checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
dependencies = [
- "winapi-util",
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "tempfile"
+version = "3.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "redox_syscall 0.4.1",
+ "rustix",
+ "windows-sys 0.52.0",
]
[[package]]
@@ -3599,22 +3885,22 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "1.0.47"
+version = "1.0.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f"
+checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.47"
+version = "1.0.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b"
+checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.29",
+ "syn 2.0.48",
]
[[package]]
@@ -3629,22 +3915,13 @@ dependencies = [
[[package]]
name = "time"
-version = "0.1.45"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
-dependencies = [
- "libc",
- "wasi 0.10.0+wasi-snapshot-preview1",
- "winapi",
-]
-
-[[package]]
-name = "time"
-version = "0.3.28"
+version = "0.3.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48"
+checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749"
dependencies = [
"deranged",
+ "num-conv",
+ "powerfmt",
"serde",
"time-core",
"time-macros",
@@ -3652,24 +3929,25 @@ dependencies = [
[[package]]
name = "time-core"
-version = "0.1.1"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb"
+checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
[[package]]
name = "time-macros"
-version = "0.2.14"
+version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572"
+checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774"
dependencies = [
+ "num-conv",
"time-core",
]
[[package]]
name = "timeago"
-version = "0.4.1"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5082dc942361cdfb74eab98bf995762d6015e5bb3a20bf7c5c71213778b4fcb4"
+checksum = "a1710e589de0a76aaf295cd47a6699f6405737dbfd3cf2b75c92d000b548d0e6"
[[package]]
name = "tinyvec"
@@ -3688,9 +3966,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.32.0"
+version = "1.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9"
+checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931"
dependencies = [
"backtrace",
"bytes",
@@ -3700,9 +3978,9 @@ dependencies = [
"parking_lot 0.12.1",
"pin-project-lite",
"signal-hook-registry",
- "socket2 0.5.3",
+ "socket2",
"tokio-macros",
- "windows-sys",
+ "windows-sys 0.48.0",
]
[[package]]
@@ -3717,33 +3995,33 @@ dependencies = [
[[package]]
name = "tokio-macros"
-version = "2.1.0"
+version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
+checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.29",
+ "syn 2.0.48",
]
[[package]]
name = "tokio-rustls"
-version = "0.23.4"
+version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"
+checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
dependencies = [
- "rustls 0.20.8",
+ "rustls 0.21.10",
"tokio",
- "webpki",
]
[[package]]
name = "tokio-rustls"
-version = "0.24.1"
+version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"
+checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f"
dependencies = [
- "rustls 0.21.6",
+ "rustls 0.22.2",
+ "rustls-pki-types",
"tokio",
]
@@ -3774,9 +4052,9 @@ dependencies = [
[[package]]
name = "tokio-util"
-version = "0.7.8"
+version = "0.7.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d"
+checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"
dependencies = [
"bytes",
"futures-core",
@@ -3834,10 +4112,10 @@ dependencies = [
"bytes",
"futures-core",
"futures-util",
- "h2",
- "http",
- "http-body",
- "hyper",
+ "h2 0.3.24",
+ "http 0.2.11",
+ "http-body 0.4.6",
+ "hyper 0.14.28",
"hyper-timeout",
"percent-encoding",
"pin-project",
@@ -3879,7 +4157,7 @@ dependencies = [
"rand",
"slab",
"tokio",
- "tokio-util 0.7.8",
+ "tokio-util 0.7.10",
"tower-layer",
"tower-service",
"tracing",
@@ -3887,18 +4165,19 @@ dependencies = [
[[package]]
name = "tower-http"
-version = "0.3.5"
+version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858"
+checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140"
dependencies = [
- "base64 0.13.1",
- "bitflags 1.3.2",
+ "base64 0.21.7",
+ "bitflags 2.4.2",
"bytes",
"futures-core",
"futures-util",
- "http",
- "http-body",
+ "http 0.2.11",
+ "http-body 0.4.6",
"http-range-header",
+ "mime",
"pin-project-lite",
"tower-layer",
"tower-service",
@@ -3919,11 +4198,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
[[package]]
name = "tracing"
-version = "0.1.37"
+version = "0.1.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
dependencies = [
- "cfg-if",
"log",
"pin-project-lite",
"tracing-attributes",
@@ -3932,20 +4210,20 @@ dependencies = [
[[package]]
name = "tracing-attributes"
-version = "0.1.26"
+version = "0.1.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"
+checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.29",
+ "syn 2.0.48",
]
[[package]]
name = "tracing-core"
-version = "0.1.31"
+version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
+checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
dependencies = [
"once_cell",
"valuable",
@@ -3963,20 +4241,20 @@ dependencies = [
[[package]]
name = "tracing-log"
-version = "0.1.3"
+version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
+checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
dependencies = [
- "lazy_static",
"log",
+ "once_cell",
"tracing-core",
]
[[package]]
name = "tracing-subscriber"
-version = "0.3.17"
+version = "0.3.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77"
+checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
dependencies = [
"matchers",
"nu-ansi-term",
@@ -3992,36 +4270,42 @@ dependencies = [
[[package]]
name = "treediff"
-version = "3.0.2"
+version = "4.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "761e8d5ad7ce14bb82b7e61ccc0ca961005a275a060b9644a2431aa11553c2ff"
+checksum = "4d127780145176e2b5d16611cc25a900150e86e9fd79d3bde6ff3a37359c9cb5"
dependencies = [
"serde_json",
]
[[package]]
name = "try-lock"
-version = "0.2.4"
+version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
[[package]]
name = "typenum"
-version = "1.16.0"
+version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+
+[[package]]
+name = "ucd-trie"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"
[[package]]
name = "unicode-bidi"
-version = "0.3.13"
+version = "0.3.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
[[package]]
name = "unicode-ident"
-version = "1.0.11"
+version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]]
name = "unicode-normalization"
@@ -4040,9 +4324,9 @@ checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
[[package]]
name = "unicode-width"
-version = "0.1.10"
+version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
[[package]]
name = "unicode-xid"
@@ -4051,16 +4335,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
[[package]]
+name = "unsafe-libyaml"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b"
+
+[[package]]
name = "untrusted"
-version = "0.7.1"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "url"
-version = "2.4.0"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb"
+checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
dependencies = [
"form_urlencoded",
"idna",
@@ -4081,9 +4371,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
[[package]]
name = "uuid"
-version = "1.2.2"
+version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c"
+checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d"
dependencies = [
"getrandom",
]
@@ -4114,9 +4404,9 @@ checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
[[package]]
name = "walkdir"
-version = "2.3.3"
+version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"
+checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"
dependencies = [
"same-file",
"winapi-util",
@@ -4133,21 +4423,15 @@ dependencies = [
[[package]]
name = "wasi"
-version = "0.10.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
-
-[[package]]
-name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wasm-bindgen"
-version = "0.2.87"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"
+checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406"
dependencies = [
"cfg-if",
"wasm-bindgen-macro",
@@ -4155,24 +4439,24 @@ dependencies = [
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.87"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"
+checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd"
dependencies = [
"bumpalo",
"log",
"once_cell",
"proc-macro2",
"quote",
- "syn 2.0.29",
+ "syn 2.0.48",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.37"
+version = "0.4.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03"
+checksum = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461"
dependencies = [
"cfg-if",
"js-sys",
@@ -4182,9 +4466,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.87"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"
+checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -4192,52 +4476,43 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.87"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"
+checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.29",
+ "syn 2.0.48",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.87"
+version = "0.2.90"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"
+checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b"
[[package]]
name = "web-sys"
-version = "0.3.64"
+version = "0.3.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b"
+checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed"
dependencies = [
"js-sys",
"wasm-bindgen",
]
[[package]]
-name = "webpki"
-version = "0.22.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd"
-dependencies = [
- "ring",
- "untrusted",
-]
-
-[[package]]
name = "which"
-version = "4.4.0"
+version = "4.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"
+checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
dependencies = [
"either",
- "libc",
+ "home",
"once_cell",
+ "rustix",
]
[[package]]
@@ -4258,9 +4533,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
-version = "0.1.5"
+version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
dependencies = [
"winapi",
]
@@ -4272,12 +4547,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
-name = "windows"
-version = "0.48.0"
+name = "windows-core"
+version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
- "windows-targets",
+ "windows-targets 0.52.0",
]
[[package]]
@@ -4286,7 +4561,16 @@ version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
- "windows-targets",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
+dependencies = [
+ "windows-targets 0.52.0",
]
[[package]]
@@ -4295,13 +4579,28 @@ version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
+ "windows_aarch64_gnullvm 0.48.5",
+ "windows_aarch64_msvc 0.48.5",
+ "windows_i686_gnu 0.48.5",
+ "windows_i686_msvc 0.48.5",
+ "windows_x86_64_gnu 0.48.5",
+ "windows_x86_64_gnullvm 0.48.5",
+ "windows_x86_64_msvc 0.48.5",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.0",
+ "windows_aarch64_msvc 0.52.0",
+ "windows_i686_gnu 0.52.0",
+ "windows_i686_msvc 0.52.0",
+ "windows_x86_64_gnu 0.52.0",
+ "windows_x86_64_gnullvm 0.52.0",
+ "windows_x86_64_msvc 0.52.0",
]
[[package]]
@@ -4311,104 +4610,155 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
+
+[[package]]
name = "windows_aarch64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
+
+[[package]]
name = "windows_i686_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
+name = "windows_i686_gnu"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
+
+[[package]]
name = "windows_i686_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
+name = "windows_i686_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
+
+[[package]]
name = "windows_x86_64_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
+
+[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
+
+[[package]]
name = "windows_x86_64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
+
+[[package]]
name = "winreg"
version = "0.50.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
dependencies = [
"cfg-if",
- "windows-sys",
+ "windows-sys 0.48.0",
]
[[package]]
name = "xmlparser"
-version = "0.13.5"
+version = "0.13.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd"
+checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4"
[[package]]
name = "xxhash-rust"
-version = "0.8.6"
+version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "735a71d46c4d68d71d4b24d03fdc2b98e38cea81730595801db779c04fe80d70"
+checksum = "53be06678ed9e83edb1745eb72efc0bbcd7b5c3c35711a860906aed827a13d61"
[[package]]
-name = "yaml-rust"
-version = "0.4.5"
+name = "zerocopy"
+version = "0.7.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
+checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
dependencies = [
- "linked-hash-map",
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.7.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.48",
]
[[package]]
name = "zeroize"
-version = "1.6.0"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
+checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
[[package]]
name = "zstd"
-version = "0.12.4"
+version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c"
+checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110"
dependencies = [
"zstd-safe",
]
[[package]]
name = "zstd-safe"
-version = "6.0.6"
+version = "7.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581"
+checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e"
dependencies = [
- "libc",
"zstd-sys",
]
[[package]]
name = "zstd-sys"
-version = "2.0.8+zstd.1.5.5"
+version = "2.0.9+zstd.1.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c"
+checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656"
dependencies = [
"cc",
- "libc",
"pkg-config",
]
diff --git a/Cargo.nix b/Cargo.nix
index ab983987..7f48117d 100644
--- a/Cargo.nix
+++ b/Cargo.nix
@@ -33,7 +33,7 @@ args@{
ignoreLockHash,
}:
let
- nixifiedLockHash = "9946c45969e70c13413d3474740963f4cdb2a8a00199daa23a1bd152c186b319";
+ nixifiedLockHash = "128636a00ff8a67f6a6c892cf52eae61e4334b0d346199e548eb8468162e1e3e";
workspaceSrc = if args.workspaceSrc == null then ./. else args.workspaceSrc;
currentLockHash = builtins.hashFile "sha256" (workspaceSrc + /Cargo.lock);
lockHashIgnored = if ignoreLockHash
@@ -45,7 +45,7 @@ else let
inherit (rustLib) fetchCratesIo fetchCrateLocal fetchCrateGit fetchCrateAlternativeRegistry expandFeatures decideProfile genDrvsByProfile;
profilesByName = {
dev = builtins.fromTOML "lto = \"off\"\n";
- release = builtins.fromTOML "debug = true\n";
+ release = builtins.fromTOML "codegen-units = 1\nlto = true\nopt-level = \"s\"\nstrip = true\n";
};
rootFeatures' = expandFeatures rootFeatures;
overridableMkRustCrate = f:
@@ -75,7 +75,7 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"; };
dependencies = {
- gimli = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".gimli."0.28.0" { inherit profileName; }).out;
+ gimli = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".gimli."0.28.1" { inherit profileName; }).out;
};
});
@@ -86,11 +86,11 @@ in
src = fetchCratesIo { inherit name version; sha256 = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".ahash."0.8.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".ahash."0.8.7" = overridableMkRustCrate (profileName: rec {
name = "ahash";
- version = "0.8.3";
+ version = "0.8.7";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"; };
+ src = fetchCratesIo { inherit name version; sha256 = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "getrandom")
@@ -99,26 +99,26 @@ in
];
dependencies = {
${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "cfg_if" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "getrandom" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.10" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") && !((hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l") && hostPlatform.parsed.kernel.name == "none") then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "getrandom" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.12" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") && !((hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l") && hostPlatform.parsed.kernel.name == "none") then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "zerocopy" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zerocopy."0.7.32" { inherit profileName; }).out;
};
buildDependencies = {
${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "version_check" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".version_check."0.9.4" { profileName = "__noProfile"; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aho-corasick."1.0.4" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aho-corasick."1.1.2" = overridableMkRustCrate (profileName: rec {
name = "aho-corasick";
- version = "1.0.4";
+ version = "1.1.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a"; };
+ src = fetchCratesIo { inherit name version; sha256 = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"; };
features = builtins.concatLists [
- [ "default" ]
[ "perf-literal" ]
[ "std" ]
];
dependencies = {
- memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.5.0" { inherit profileName; }).out;
+ memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.7.1" { inherit profileName; }).out;
};
});
@@ -128,7 +128,7 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "alloc")
+ (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "alloc")
];
});
@@ -145,81 +145,81 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"; };
dependencies = {
- libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".anstream."0.5.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".anstream."0.6.11" = overridableMkRustCrate (profileName: rec {
name = "anstream";
- version = "0.5.0";
+ version = "0.6.11";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c"; };
+ src = fetchCratesIo { inherit name version; sha256 = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "auto")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "default")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "wincon")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "auto")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "default")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "wincon")
];
dependencies = {
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "anstyle" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anstyle."1.0.2" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "anstyle_parse" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anstyle-parse."0.2.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "anstyle_query" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anstyle-query."1.0.0" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") && hostPlatform.isWindows then "anstyle_wincon" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anstyle-wincon."2.1.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "colorchoice" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".colorchoice."1.0.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "utf8parse" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".utf8parse."0.2.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "anstyle" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anstyle."1.0.5" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "anstyle_parse" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anstyle-parse."0.2.3" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "anstyle_query" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anstyle-query."1.0.2" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") && hostPlatform.isWindows then "anstyle_wincon" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anstyle-wincon."3.0.2" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "colorchoice" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".colorchoice."1.0.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "utf8parse" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".utf8parse."0.2.1" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".anstyle."1.0.2" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".anstyle."1.0.5" = overridableMkRustCrate (profileName: rec {
name = "anstyle";
- version = "1.0.2";
+ version = "1.0.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "15c4c2c83f81532e5845a733998b6971faca23490340a418e9b72a3ec9de12ea"; };
+ src = fetchCratesIo { inherit name version; sha256 = "2faccea4cc4ab4a667ce676a30e8ec13922a692c99bb8f5b11f1502c72e04220"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "default")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "std")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "default")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "std")
];
});
- "registry+https://github.com/rust-lang/crates.io-index".anstyle-parse."0.2.1" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".anstyle-parse."0.2.3" = overridableMkRustCrate (profileName: rec {
name = "anstyle-parse";
- version = "0.2.1";
+ version = "0.2.3";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333"; };
+ src = fetchCratesIo { inherit name version; sha256 = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "default")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "utf8")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "default")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "utf8")
];
dependencies = {
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "utf8parse" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".utf8parse."0.2.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "utf8parse" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".utf8parse."0.2.1" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".anstyle-query."1.0.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".anstyle-query."1.0.2" = overridableMkRustCrate (profileName: rec {
name = "anstyle-query";
- version = "1.0.0";
+ version = "1.0.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"; };
+ src = fetchCratesIo { inherit name version; sha256 = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"; };
dependencies = {
- ${ if (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") && hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.48.0" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") && hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.52.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".anstyle-wincon."2.1.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".anstyle-wincon."3.0.2" = overridableMkRustCrate (profileName: rec {
name = "anstyle-wincon";
- version = "2.1.0";
+ version = "3.0.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd"; };
+ src = fetchCratesIo { inherit name version; sha256 = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"; };
dependencies = {
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "anstyle" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anstyle."1.0.2" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") && hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.48.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "anstyle" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anstyle."1.0.5" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") && hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.52.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".anyhow."1.0.75" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".anyhow."1.0.79" = overridableMkRustCrate (profileName: rec {
name = "anyhow";
- version = "1.0.75";
+ version = "1.0.79";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"; };
+ src = fetchCratesIo { inherit name version; sha256 = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "default")
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "std")
@@ -250,16 +250,16 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12"; };
dependencies = {
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- serde_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ serde_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".async-compression."0.4.1" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".async-compression."0.4.6" = overridableMkRustCrate (profileName: rec {
name = "async-compression";
- version = "0.4.1";
+ version = "0.4.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "62b74f44609f0f91493e3082d3734d98497e094777144380ea4db9f9905dd5b6"; };
+ src = fetchCratesIo { inherit name version; sha256 = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c"; };
features = builtins.concatLists [
[ "libzstd" ]
[ "tokio" ]
@@ -267,12 +267,12 @@ in
[ "zstd-safe" ]
];
dependencies = {
- futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
- memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.5.0" { inherit profileName; }).out;
+ futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.7.1" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- libzstd = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zstd."0.12.4" { inherit profileName; }).out;
- zstd_safe = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zstd-safe."6.0.6" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ libzstd = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zstd."0.13.0" { inherit profileName; }).out;
+ zstd_safe = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zstd-safe."7.0.0" { inherit profileName; }).out;
};
});
@@ -283,7 +283,7 @@ in
src = fetchCratesIo { inherit name version; sha256 = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"; };
dependencies = {
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "async_stream_impl" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-stream-impl."0.3.5" { profileName = "__noProfile"; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "futures_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "futures_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "pin_project_lite" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
};
});
@@ -294,21 +294,21 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"; };
dependencies = {
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.29" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" = overridableMkRustCrate (profileName: rec {
name = "async-trait";
- version = "0.1.73";
+ version = "0.1.77";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0"; };
+ src = fetchCratesIo { inherit name version; sha256 = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9"; };
dependencies = {
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.29" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
};
});
@@ -319,422 +319,465 @@ in
src = fetchCratesIo { inherit name version; sha256 = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-config."0.55.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-config."1.1.4" = overridableMkRustCrate (profileName: rec {
name = "aws-config";
- version = "0.55.3";
+ version = "1.1.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "bcdcf0d683fe9c23d32cf5b53c9918ea0a500375a9fb20109802552658e576c9"; };
+ src = fetchCratesIo { inherit name version; sha256 = "8b30c39ebe61f75d1b3785362b1586b41991873c9ab3e317a9181c246fb71d82"; };
features = builtins.concatLists [
[ "client-hyper" ]
- [ "credentials-sso" ]
+ [ "credentials-process" ]
[ "default" ]
[ "rt-tokio" ]
[ "rustls" ]
- ];
- dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."0.55.3" { inherit profileName; }).out;
- aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.55.3" { inherit profileName; }).out;
- aws_sdk_sso = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sso."0.28.0" { inherit profileName; }).out;
- aws_sdk_sts = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sts."0.28.0" { inherit profileName; }).out;
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."0.55.3" { inherit profileName; }).out;
- aws_smithy_client = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-client."0.55.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" { inherit profileName; }).out;
- aws_smithy_http_tower = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http-tower."0.55.3" { inherit profileName; }).out;
- aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.55.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."0.55.3" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- fastrand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."1.9.0" { inherit profileName; }).out;
+ [ "sso" ]
+ ];
+ dependencies = {
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.4" { inherit profileName; }).out;
+ aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.4" { inherit profileName; }).out;
+ aws_sdk_sso = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sso."1.12.0" { inherit profileName; }).out;
+ aws_sdk_ssooidc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-ssooidc."1.12.0" { inherit profileName; }).out;
+ aws_sdk_sts = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sts."1.12.0" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.4" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.4" { inherit profileName; }).out;
+ aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.4" { inherit profileName; }).out;
+ aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.4" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.4" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.4" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ fastrand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."2.0.1" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
- ring = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.16.20" { inherit profileName; }).out;
- time = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time."0.3.28" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- tower = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower."0.4.13" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
- zeroize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.6.0" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.28" { inherit profileName; }).out;
+ ring = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.17.7" { inherit profileName; }).out;
+ time = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time."0.3.34" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ zeroize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.7.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."0.55.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.4" = overridableMkRustCrate (profileName: rec {
name = "aws-credential-types";
- version = "0.55.3";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "1fcdb2f7acbc076ff5ad05e7864bdb191ca70a6fd07668dc3a1a8bcd051de5ae"; };
- dependencies = {
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."0.55.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- fastrand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."1.9.0" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
- zeroize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.6.0" { inherit profileName; }).out;
- };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".aws-endpoint."0.55.3" = overridableMkRustCrate (profileName: rec {
- name = "aws-endpoint";
- version = "0.55.3";
+ version = "1.1.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "8cce1c41a6cfaa726adee9ebb9a56fcd2bbfd8be49fd8a04c5e20fd968330b04"; };
+ src = fetchCratesIo { inherit name version; sha256 = "33cc49dcdd31c8b6e79850a179af4c367669150c7ac0135f176c61bec81a70f7"; };
+ features = builtins.concatLists [
+ [ "test-util" ]
+ ];
dependencies = {
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."0.55.3" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- regex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.9.4" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.4" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.4" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ zeroize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.7.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-http."0.55.3" = overridableMkRustCrate (profileName: rec {
- name = "aws-http";
- version = "0.55.3";
+ "registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.4" = overridableMkRustCrate (profileName: rec {
+ name = "aws-runtime";
+ version = "1.1.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "aadbc44e7a8f3e71c8b374e03ecd972869eb91dd2bc89ed018954a52ba84bc44"; };
- dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."0.55.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."0.55.3" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.5" { inherit profileName; }).out;
- lazy_static = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }).out;
- percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.0" { inherit profileName; }).out;
+ src = fetchCratesIo { inherit name version; sha256 = "eb031bff99877c26c28895766f7bb8484a05e24547e370768d6cc9db514662aa"; };
+ features = builtins.concatLists [
+ [ "event-stream" ]
+ [ "http-02x" ]
+ [ "sigv4a" ]
+ ];
+ dependencies = {
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.4" { inherit profileName; }).out;
+ aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.4" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.4" { inherit profileName; }).out;
+ aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.4" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.4" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.4" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ fastrand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."2.0.1" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out;
+ percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ uuid = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".uuid."1.4.1" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-s3."0.28.0" = overridableMkRustCrate (profileName: rec {
- name = "aws-sdk-s3";
- version = "0.28.0";
+ "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-config."1.13.0" = overridableMkRustCrate (profileName: rec {
+ name = "aws-sdk-config";
+ version = "1.13.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "fba197193cbb4bcb6aad8d99796b2291f36fa89562ded5d4501363055b0de89f"; };
+ src = fetchCratesIo { inherit name version; sha256 = "4af4f5b0f64563ada272e009cc95027effb546110ed85d014611420ac0d97858"; };
features = builtins.concatLists [
[ "default" ]
[ "rt-tokio" ]
[ "rustls" ]
];
dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."0.55.3" { inherit profileName; }).out;
- aws_endpoint = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-endpoint."0.55.3" { inherit profileName; }).out;
- aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.55.3" { inherit profileName; }).out;
- aws_sig_auth = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sig-auth."0.55.3" { inherit profileName; }).out;
- aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."0.55.3" { inherit profileName; }).out;
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."0.55.3" { inherit profileName; }).out;
- aws_smithy_checksums = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-checksums."0.55.3" { inherit profileName; }).out;
- aws_smithy_client = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-client."0.55.3" { inherit profileName; }).out;
- aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.55.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" { inherit profileName; }).out;
- aws_smithy_http_tower = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http-tower."0.55.3" { inherit profileName; }).out;
- aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.55.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- aws_smithy_xml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.55.3" { inherit profileName; }).out;
- aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."0.55.3" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.5" { inherit profileName; }).out;
- once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out;
- percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.0" { inherit profileName; }).out;
- regex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.9.4" { inherit profileName; }).out;
- tokio_stream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-stream."0.1.14" { inherit profileName; }).out;
- tower = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower."0.4.13" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
- url = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".url."2.4.0" { inherit profileName; }).out;
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.4" { inherit profileName; }).out;
+ aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.4" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.4" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.4" { inherit profileName; }).out;
+ aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.4" { inherit profileName; }).out;
+ aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.4" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.4" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.4" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ regex_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-lite."0.1.5" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sso."0.28.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-s3."1.14.0" = overridableMkRustCrate (profileName: rec {
+ name = "aws-sdk-s3";
+ version = "1.14.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "951f7730f51a2155c711c85c79f337fbc02a577fa99d2a0a8059acfce5392113"; };
+ features = builtins.concatLists [
+ [ "default" ]
+ [ "rt-tokio" ]
+ [ "rustls" ]
+ [ "sigv4a" ]
+ ];
+ dependencies = {
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.4" { inherit profileName; }).out;
+ aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.4" { inherit profileName; }).out;
+ aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.4" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.4" { inherit profileName; }).out;
+ aws_smithy_checksums = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-checksums."0.60.4" { inherit profileName; }).out;
+ aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.4" { inherit profileName; }).out;
+ aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.4" { inherit profileName; }).out;
+ aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.4" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.4" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ aws_smithy_xml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.4" { inherit profileName; }).out;
+ aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.4" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out;
+ once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
+ regex_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-lite."0.1.5" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ url = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".url."2.5.0" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sso."1.12.0" = overridableMkRustCrate (profileName: rec {
name = "aws-sdk-sso";
- version = "0.28.0";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "c8b812340d86d4a766b2ca73f740dfd47a97c2dff0c06c8517a16d88241957e4"; };
- dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."0.55.3" { inherit profileName; }).out;
- aws_endpoint = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-endpoint."0.55.3" { inherit profileName; }).out;
- aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.55.3" { inherit profileName; }).out;
- aws_sig_auth = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sig-auth."0.55.3" { inherit profileName; }).out;
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."0.55.3" { inherit profileName; }).out;
- aws_smithy_client = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-client."0.55.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" { inherit profileName; }).out;
- aws_smithy_http_tower = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http-tower."0.55.3" { inherit profileName; }).out;
- aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.55.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."0.55.3" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- regex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.9.4" { inherit profileName; }).out;
- tokio_stream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-stream."0.1.14" { inherit profileName; }).out;
- tower = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower."0.4.13" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
- };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sts."0.28.0" = overridableMkRustCrate (profileName: rec {
+ version = "1.12.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "f486420a66caad72635bc2ce0ff6581646e0d32df02aa39dc983bfe794955a5b"; };
+ dependencies = {
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.4" { inherit profileName; }).out;
+ aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.4" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.4" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.4" { inherit profileName; }).out;
+ aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.4" { inherit profileName; }).out;
+ aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.4" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.4" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.4" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ regex_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-lite."0.1.5" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-ssooidc."1.12.0" = overridableMkRustCrate (profileName: rec {
+ name = "aws-sdk-ssooidc";
+ version = "1.12.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "39ddccf01d82fce9b4a15c8ae8608211ee7db8ed13a70b514bbfe41df3d24841"; };
+ dependencies = {
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.4" { inherit profileName; }).out;
+ aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.4" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.4" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.4" { inherit profileName; }).out;
+ aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.4" { inherit profileName; }).out;
+ aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.4" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.4" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.4" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ regex_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-lite."0.1.5" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".aws-sdk-sts."1.12.0" = overridableMkRustCrate (profileName: rec {
name = "aws-sdk-sts";
- version = "0.28.0";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "265fac131fbfc188e5c3d96652ea90ecc676a934e3174eaaee523c6cec040b3b"; };
- dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."0.55.3" { inherit profileName; }).out;
- aws_endpoint = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-endpoint."0.55.3" { inherit profileName; }).out;
- aws_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-http."0.55.3" { inherit profileName; }).out;
- aws_sig_auth = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sig-auth."0.55.3" { inherit profileName; }).out;
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."0.55.3" { inherit profileName; }).out;
- aws_smithy_client = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-client."0.55.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" { inherit profileName; }).out;
- aws_smithy_http_tower = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http-tower."0.55.3" { inherit profileName; }).out;
- aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.55.3" { inherit profileName; }).out;
- aws_smithy_query = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-query."0.55.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- aws_smithy_xml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.55.3" { inherit profileName; }).out;
- aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."0.55.3" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- regex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.9.4" { inherit profileName; }).out;
- tower = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower."0.4.13" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
- };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".aws-sig-auth."0.55.3" = overridableMkRustCrate (profileName: rec {
- name = "aws-sig-auth";
- version = "0.55.3";
+ version = "1.12.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "3b94acb10af0c879ecd5c7bdf51cda6679a0a4f4643ce630905a77673bfa3c61"; };
- features = builtins.concatLists [
- [ "aws-smithy-eventstream" ]
- [ "sign-eventstream" ]
- ];
+ src = fetchCratesIo { inherit name version; sha256 = "1a591f8c7e6a621a501b2b5d2e88e1697fcb6274264523a6ad4d5959889a41ce"; };
dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."0.55.3" { inherit profileName; }).out;
- aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."0.55.3" { inherit profileName; }).out;
- aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.55.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" { inherit profileName; }).out;
- aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."0.55.3" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.4" { inherit profileName; }).out;
+ aws_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-runtime."1.1.4" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.4" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.4" { inherit profileName; }).out;
+ aws_smithy_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.4" { inherit profileName; }).out;
+ aws_smithy_query = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-query."0.60.4" { inherit profileName; }).out;
+ aws_smithy_runtime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.4" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.4" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ aws_smithy_xml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.4" { inherit profileName; }).out;
+ aws_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.4" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ regex_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-lite."0.1.5" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."0.55.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.4" = overridableMkRustCrate (profileName: rec {
name = "aws-sigv4";
- version = "0.55.3";
+ version = "1.1.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "9d2ce6f507be68e968a33485ced670111d1cbad161ddbbab1e313c03d37d8f4c"; };
+ src = fetchCratesIo { inherit name version; sha256 = "c371c6b0ac54d4605eb6f016624fb5c7c2925d315fdf600ac1bf21b19d5f1742"; };
features = builtins.concatLists [
- [ "aws-smithy-eventstream" ]
- [ "bytes" ]
[ "default" ]
- [ "form_urlencoded" ]
- [ "http" ]
- [ "percent-encoding" ]
+ [ "http0-compat" ]
+ [ "http1" ]
[ "sign-eventstream" ]
[ "sign-http" ]
+ [ "sigv4a" ]
];
dependencies = {
- aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.55.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- form_urlencoded = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.0" { inherit profileName; }).out;
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.4" { inherit profileName; }).out;
+ aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.4" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.4" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ crypto_bigint = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crypto-bigint."0.5.5" { inherit profileName; }).out;
+ form_urlencoded = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.1" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
hmac = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hmac."0.12.1" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out;
- percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.0" { inherit profileName; }).out;
- regex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.9.4" { inherit profileName; }).out;
- sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.7" { inherit profileName; }).out;
- time = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time."0.3.28" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ http0 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ p256 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".p256."0.11.1" { inherit profileName; }).out;
+ percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
+ ring = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.17.7" { inherit profileName; }).out;
+ sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.8" { inherit profileName; }).out;
+ subtle = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".subtle."2.5.0" { inherit profileName; }).out;
+ time = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time."0.3.34" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ zeroize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.7.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."0.55.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.4" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-async";
- version = "0.55.3";
+ version = "1.1.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "13bda3996044c202d75b91afeb11a9afae9db9a721c6a7a427410018e286b880"; };
+ src = fetchCratesIo { inherit name version; sha256 = "72ee2d09cce0ef3ae526679b522835d63e75fb427aca5413cd371e490d52dcc6"; };
features = builtins.concatLists [
[ "rt-tokio" ]
];
dependencies = {
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- tokio_stream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-stream."0.1.14" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-checksums."0.55.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-checksums."0.60.4" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-checksums";
- version = "0.55.3";
+ version = "0.60.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "07ed8b96d95402f3f6b8b57eb4e0e45ee365f78b1a924faf20ff6e97abf1eae6"; };
+ src = fetchCratesIo { inherit name version; sha256 = "be2acd1b9c6ae5859999250ed5a62423aedc5cf69045b844432de15fa2f31f2b"; };
dependencies = {
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.4" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
crc32c = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crc32c."0.6.4" { inherit profileName; }).out;
crc32fast = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crc32fast."1.3.2" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.5" { inherit profileName; }).out;
- md5 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".md-5."0.10.5" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out;
+ md5 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".md-5."0.10.6" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
- sha1 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha1."0.10.5" { inherit profileName; }).out;
- sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.7" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ sha1 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha1."0.10.6" { inherit profileName; }).out;
+ sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.8" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-client."0.55.3" = overridableMkRustCrate (profileName: rec {
- name = "aws-smithy-client";
- version = "0.55.3";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "0a86aa6e21e86c4252ad6a0e3e74da9617295d8d6e374d552be7d3059c41cedd"; };
- features = builtins.concatLists [
- [ "client-hyper" ]
- [ "rt-tokio" ]
- [ "rustls" ]
- ];
- dependencies = {
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."0.55.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" { inherit profileName; }).out;
- aws_smithy_http_tower = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http-tower."0.55.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- fastrand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."1.9.0" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.5" { inherit profileName; }).out;
- hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
- hyper_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.23.2" { inherit profileName; }).out;
- lazy_static = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }).out;
- pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
- rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.20.8" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- tower = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower."0.4.13" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
- };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.55.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-eventstream";
- version = "0.55.3";
+ version = "0.60.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "460c8da5110835e3d9a717c61f5556b20d03c32a1dec57f8fc559b360f733bb8"; };
+ src = fetchCratesIo { inherit name version; sha256 = "e6363078f927f612b970edf9d1903ef5cef9a64d1e8423525ebb1f0a1633c858"; };
dependencies = {
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
crc32fast = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crc32fast."1.3.2" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.4" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-http";
- version = "0.55.3";
+ version = "0.60.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28"; };
+ src = fetchCratesIo { inherit name version; sha256 = "dab56aea3cd9e1101a0a999447fb346afb680ab1406cebc44b32346e25b4117d"; };
features = builtins.concatLists [
[ "aws-smithy-eventstream" ]
[ "event-stream" ]
- [ "rt-tokio" ]
];
dependencies = {
- aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.55.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- bytes_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes-utils."0.1.3" { inherit profileName; }).out;
- futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.5" { inherit profileName; }).out;
- hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
- once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out;
- percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.0" { inherit profileName; }).out;
+ aws_smithy_eventstream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-eventstream."0.60.4" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.4" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ bytes_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes-utils."0.1.4" { inherit profileName; }).out;
+ futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out;
+ once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
pin_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-utils."0.1.0" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- tokio_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.8" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http-tower."0.55.3" = overridableMkRustCrate (profileName: rec {
- name = "aws-smithy-http-tower";
- version = "0.55.3";
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.60.4" = overridableMkRustCrate (profileName: rec {
+ name = "aws-smithy-json";
+ version = "0.60.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "3ae4f6c5798a247fac98a867698197d9ac22643596dc3777f0c76b91917616b9"; };
+ src = fetchCratesIo { inherit name version; sha256 = "fd3898ca6518f9215f62678870064398f00031912390efd03f1f6ef56d83aa8e"; };
dependencies = {
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.5" { inherit profileName; }).out;
- pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
- tower = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower."0.4.13" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-json."0.55.3" = overridableMkRustCrate (profileName: rec {
- name = "aws-smithy-json";
- version = "0.55.3";
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-query."0.60.4" = overridableMkRustCrate (profileName: rec {
+ name = "aws-smithy-query";
+ version = "0.60.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "23f9f42fbfa96d095194a632fbac19f60077748eba536eb0b9fecc28659807f8"; };
+ src = fetchCratesIo { inherit name version; sha256 = "bda4b1dfc9810e35fba8a620e900522cd1bd4f9578c446e82f49d1ce41d2e9f9"; };
dependencies = {
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ urlencoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".urlencoding."2.1.3" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-query."0.55.3" = overridableMkRustCrate (profileName: rec {
- name = "aws-smithy-query";
- version = "0.55.3";
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime."1.1.4" = overridableMkRustCrate (profileName: rec {
+ name = "aws-smithy-runtime";
+ version = "1.1.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "98819eb0b04020a1c791903533b638534ae6c12e2aceda3e6e6fba015608d51d"; };
+ src = fetchCratesIo { inherit name version; sha256 = "fafdab38f40ad7816e7da5dec279400dd505160780083759f01441af1bbb10ea"; };
+ features = builtins.concatLists [
+ [ "client" ]
+ [ "connector-hyper-0-14-x" ]
+ [ "rt-tokio" ]
+ [ "tls-rustls" ]
+ ];
+ dependencies = {
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.4" { inherit profileName; }).out;
+ aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.60.4" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.4" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ fastrand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."2.0.1" { inherit profileName; }).out;
+ h2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.3.24" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ http_body_0_4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out;
+ hyper_0_14 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.28" { inherit profileName; }).out;
+ hyper_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.24.2" { inherit profileName; }).out;
+ once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
+ pin_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-utils."0.1.0" { inherit profileName; }).out;
+ rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.21.10" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.4" = overridableMkRustCrate (profileName: rec {
+ name = "aws-smithy-runtime-api";
+ version = "1.1.4";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "c18276dd28852f34b3bf501f4f3719781f4999a51c7bff1a5c6dc8c4529adc29"; };
+ features = builtins.concatLists [
+ [ "client" ]
+ [ "default" ]
+ [ "http-02x" ]
+ [ "http-auth" ]
+ ];
dependencies = {
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- urlencoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".urlencoding."2.1.3" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.4" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ zeroize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.7.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-types";
- version = "0.55.3";
+ version = "1.1.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "16a3d0bf4f324f4ef9793b86a1701d9700fbcdbd12a846da45eed104c634c6e8"; };
+ src = fetchCratesIo { inherit name version; sha256 = "bb3e134004170d3303718baa2a4eb4ca64ee0a1c0a7041dca31b38be0fb414f3"; };
+ features = builtins.concatLists [
+ [ "byte-stream-poll-next" ]
+ [ "http-body-0-4-x" ]
+ [ "rt-tokio" ]
+ ];
dependencies = {
base64_simd = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64-simd."0.8.0" { inherit profileName; }).out;
- itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.9" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ bytes_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes-utils."0.1.4" { inherit profileName; }).out;
+ futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ http_body_0_4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out;
+ itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out;
num_integer = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-integer."0.1.45" { inherit profileName; }).out;
- ryu = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.15" { inherit profileName; }).out;
- time = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time."0.3.28" { inherit profileName; }).out;
+ pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
+ pin_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-utils."0.1.0" { inherit profileName; }).out;
+ ryu = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.16" { inherit profileName; }).out;
+ ${ if false then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ time = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time."0.3.34" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ tokio_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.10" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.55.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-smithy-xml."0.60.4" = overridableMkRustCrate (profileName: rec {
name = "aws-smithy-xml";
- version = "0.55.3";
+ version = "0.60.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "b1b9d12875731bd07e767be7baad95700c3137b56730ec9ddeedb52a5e5ca63b"; };
+ src = fetchCratesIo { inherit name version; sha256 = "8604a11b25e9ecaf32f9aa56b9fe253c5e2f606a3477f0071e96d3155a5ed218"; };
dependencies = {
- xmlparser = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".xmlparser."0.13.5" { inherit profileName; }).out;
+ xmlparser = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".xmlparser."0.13.6" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".aws-types."0.55.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".aws-types."1.1.4" = overridableMkRustCrate (profileName: rec {
name = "aws-types";
- version = "0.55.3";
+ version = "1.1.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "6dd209616cc8d7bfb82f87811a5c655dc97537f592689b18743bddf5dc5c4829"; };
+ src = fetchCratesIo { inherit name version; sha256 = "789bbe008e65636fe1b6dbbb374c40c8960d1232b96af5ff4aec349f9c4accf4"; };
dependencies = {
- aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."0.55.3" { inherit profileName; }).out;
- aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."0.55.3" { inherit profileName; }).out;
- aws_smithy_client = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-client."0.55.3" { inherit profileName; }).out;
- aws_smithy_http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-http."0.55.3" { inherit profileName; }).out;
- aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."0.55.3" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ aws_credential_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-credential-types."1.1.4" { inherit profileName; }).out;
+ aws_smithy_async = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-async."1.1.4" { inherit profileName; }).out;
+ aws_smithy_runtime_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-runtime-api."1.1.4" { inherit profileName; }).out;
+ aws_smithy_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-smithy-types."1.1.4" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
buildDependencies = {
rustc_version = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".rustc_version."0.4.0" { profileName = "__noProfile"; }).out;
@@ -750,7 +793,7 @@ in
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "getrandom" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.10" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "getrandom" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.12" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "instant" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".instant."0.1.12" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "rand" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.5" { inherit profileName; }).out;
};
@@ -768,9 +811,9 @@ in
dependencies = {
${ if !(hostPlatform.isWindows && hostPlatform.parsed.abi.name == "msvc" && !(hostPlatform.parsed.vendor.name == "uwp")) then "addr2line" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".addr2line."0.21.0" { inherit profileName; }).out;
cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- ${ if !(hostPlatform.isWindows && hostPlatform.parsed.abi.name == "msvc" && !(hostPlatform.parsed.vendor.name == "uwp")) then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
- ${ if !(hostPlatform.isWindows && hostPlatform.parsed.abi.name == "msvc" && !(hostPlatform.parsed.vendor.name == "uwp")) then "miniz_oxide" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".miniz_oxide."0.7.1" { inherit profileName; }).out;
- ${ if !(hostPlatform.isWindows && hostPlatform.parsed.abi.name == "msvc" && !(hostPlatform.parsed.vendor.name == "uwp")) then "object" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".object."0.32.0" { inherit profileName; }).out;
+ ${ if !(hostPlatform.isWindows && hostPlatform.parsed.abi.name == "msvc" && !(hostPlatform.parsed.vendor.name == "uwp")) then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
+ ${ if !(hostPlatform.isWindows && hostPlatform.parsed.abi.name == "msvc" && !(hostPlatform.parsed.vendor.name == "uwp")) then "miniz_oxide" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".miniz_oxide."0.7.2" { inherit profileName; }).out;
+ ${ if !(hostPlatform.isWindows && hostPlatform.parsed.abi.name == "msvc" && !(hostPlatform.parsed.vendor.name == "uwp")) then "object" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".object."0.32.2" { inherit profileName; }).out;
rustc_demangle = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustc-demangle."0.1.23" { inherit profileName; }).out;
};
buildDependencies = {
@@ -778,24 +821,34 @@ in
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".base16ct."0.1.1" = overridableMkRustCrate (profileName: rec {
+ name = "base16ct";
+ version = "0.1.1";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce"; };
+ features = builtins.concatLists [
+ [ "alloc" ]
+ ];
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".base64."0.13.1" = overridableMkRustCrate (profileName: rec {
name = "base64";
version = "0.13.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "alloc")
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "std")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "default")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "std")
];
});
- "registry+https://github.com/rust-lang/crates.io-index".base64."0.21.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" = overridableMkRustCrate (profileName: rec {
name = "base64";
- version = "0.21.3";
+ version = "0.21.7";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53"; };
+ src = fetchCratesIo { inherit name version; sha256 = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"; };
features = builtins.concatLists [
+ [ "alloc" ]
[ "default" ]
[ "std" ]
];
@@ -818,13 +871,23 @@ in
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".base64ct."1.6.0" = overridableMkRustCrate (profileName: rec {
+ name = "base64ct";
+ version = "1.6.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"; };
+ features = builtins.concatLists [
+ [ "alloc" ]
+ ];
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".bincode."1.3.3" = overridableMkRustCrate (profileName: rec {
name = "bincode";
version = "1.3.3";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"; };
dependencies = {
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
};
});
@@ -838,13 +901,13 @@ in
];
});
- "registry+https://github.com/rust-lang/crates.io-index".bitflags."2.4.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".bitflags."2.4.2" = overridableMkRustCrate (profileName: rec {
name = "bitflags";
- version = "2.4.0";
+ version = "2.4.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"; };
+ src = fetchCratesIo { inherit name version; sha256 = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "std")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "std")
];
});
@@ -872,60 +935,60 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".bumpalo."3.13.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".bumpalo."3.14.0" = overridableMkRustCrate (profileName: rec {
name = "bumpalo";
- version = "3.13.0";
+ version = "3.14.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"; };
+ src = fetchCratesIo { inherit name version; sha256 = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"; };
features = builtins.concatLists [
[ "default" ]
];
});
- "registry+https://github.com/rust-lang/crates.io-index".bytemuck."1.13.1" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".bytemuck."1.14.1" = overridableMkRustCrate (profileName: rec {
name = "bytemuck";
- version = "1.13.1";
+ version = "1.14.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea"; };
+ src = fetchCratesIo { inherit name version; sha256 = "ed2490600f404f2b94c167e31d3ed1d5f3c225a0f3b80230053b3e0b7b962bd9"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "extern_crate_alloc")
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "extern_crate_std")
];
});
- "registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".byteorder."1.5.0" = overridableMkRustCrate (profileName: rec {
name = "byteorder";
- version = "1.4.3";
+ version = "1.5.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"; };
+ src = fetchCratesIo { inherit name version; sha256 = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
];
});
- "registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" = overridableMkRustCrate (profileName: rec {
name = "bytes";
- version = "1.4.0";
+ version = "1.5.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"; };
+ src = fetchCratesIo { inherit name version; sha256 = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
];
});
- "registry+https://github.com/rust-lang/crates.io-index".bytes-utils."0.1.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".bytes-utils."0.1.4" = overridableMkRustCrate (profileName: rec {
name = "bytes-utils";
- version = "0.1.3";
+ version = "0.1.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "e47d3a8076e283f3acd27400535992edb3ba4b5bb72f8891ad8fbe7932a7d4b9"; };
+ src = fetchCratesIo { inherit name version; sha256 = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
];
dependencies = {
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
either = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".either."1.9.0" { inherit profileName; }).out;
};
});
@@ -950,8 +1013,8 @@ in
[ "parallel" ]
];
dependencies = {
- jobserver = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".jobserver."0.1.26" { inherit profileName; }).out;
- ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ jobserver = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".jobserver."0.1.27" { inherit profileName; }).out;
+ ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
};
});
@@ -969,34 +1032,35 @@ in
src = fetchCratesIo { inherit name version; sha256 = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.26" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.33" = overridableMkRustCrate (profileName: rec {
name = "chrono";
- version = "0.4.26";
+ version = "0.4.33";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5"; };
+ src = fetchCratesIo { inherit name version; sha256 = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "alloc")
+ [ "alloc" ]
+ [ "android-tzdata" ]
[ "clock" ]
[ "default" ]
[ "iana-time-zone" ]
[ "js-sys" ]
+ [ "now" ]
[ "oldtime" ]
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "serde")
[ "std" ]
- [ "time" ]
[ "wasm-bindgen" ]
[ "wasmbind" ]
[ "winapi" ]
+ [ "windows-targets" ]
];
dependencies = {
${ if hostPlatform.parsed.kernel.name == "android" then "android_tzdata" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".android-tzdata."0.1.1" { inherit profileName; }).out;
- ${ if hostPlatform.isUnix then "iana_time_zone" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".iana-time-zone."0.1.57" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.cpu.name == "wasm32" && !(hostPlatform.parsed.kernel.name == "emscripten" || hostPlatform.parsed.kernel.name == "wasi") then "js_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.64" { inherit profileName; }).out;
- num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.16" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- time = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time."0.1.45" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.cpu.name == "wasm32" && !(hostPlatform.parsed.kernel.name == "emscripten" || hostPlatform.parsed.kernel.name == "wasi") then "wasm_bindgen" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.87" { inherit profileName; }).out;
- ${ if hostPlatform.isWindows then "winapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }).out;
+ ${ if hostPlatform.isUnix then "iana_time_zone" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".iana-time-zone."0.1.60" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.cpu.name == "wasm32" && !(hostPlatform.parsed.kernel.name == "emscripten" || hostPlatform.parsed.kernel.name == "wasi") then "js_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.67" { inherit profileName; }).out;
+ num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.17" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.cpu.name == "wasm32" && !(hostPlatform.parsed.kernel.name == "emscripten" || hostPlatform.parsed.kernel.name == "wasi") then "wasm_bindgen" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.90" { inherit profileName; }).out;
+ ${ if hostPlatform.isWindows then "windows_targets" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-targets."0.52.0" { inherit profileName; }).out;
};
});
@@ -1008,76 +1072,75 @@ in
dependencies = {
bitflags = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."1.3.2" { inherit profileName; }).out;
textwrap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".textwrap."0.11.0" { inherit profileName; }).out;
- unicode_width = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-width."0.1.10" { inherit profileName; }).out;
+ unicode_width = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-width."0.1.11" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".clap."4.4.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".clap."4.4.18" = overridableMkRustCrate (profileName: rec {
name = "clap";
- version = "4.4.0";
+ version = "4.4.18";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "1d5f1946157a96594eb2d2c10eb7ad9a2b27518cb3000209dec700c35df9197d"; };
+ src = fetchCratesIo { inherit name version; sha256 = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "color")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "default")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "derive")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "env")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "error-context")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "help")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "std")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "suggestions")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "usage")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "color")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "default")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "derive")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "env")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "error-context")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "help")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "std")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "suggestions")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "usage")
];
dependencies = {
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "clap_builder" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".clap_builder."4.4.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "clap_derive" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".clap_derive."4.4.0" { profileName = "__noProfile"; }).out;
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "clap_builder" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".clap_builder."4.4.18" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "clap_derive" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".clap_derive."4.4.7" { profileName = "__noProfile"; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".clap_builder."4.4.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".clap_builder."4.4.18" = overridableMkRustCrate (profileName: rec {
name = "clap_builder";
- version = "4.4.0";
+ version = "4.4.18";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "78116e32a042dd73c2901f0dc30790d20ff3447f3e3472fad359e8c3d282bcd6"; };
+ src = fetchCratesIo { inherit name version; sha256 = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "color")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "env")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "error-context")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "help")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "std")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "suggestions")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "usage")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "color")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "env")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "error-context")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "help")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "std")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "suggestions")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "usage")
];
dependencies = {
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "anstream" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anstream."0.5.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "anstyle" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anstyle."1.0.2" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "clap_lex" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".clap_lex."0.5.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "strsim" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".strsim."0.10.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "anstream" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anstream."0.6.11" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "anstyle" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anstyle."1.0.5" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "clap_lex" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".clap_lex."0.6.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "strsim" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".strsim."0.10.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".clap_derive."4.4.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".clap_derive."4.4.7" = overridableMkRustCrate (profileName: rec {
name = "clap_derive";
- version = "4.4.0";
+ version = "4.4.7";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "c9fd1a5729c4548118d7d70ff234a44868d00489a4b6597b0b020918a0e91a1a"; };
+ src = fetchCratesIo { inherit name version; sha256 = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "default")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "default")
];
dependencies = {
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "heck" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heck."0.4.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.29" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "heck" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heck."0.4.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".clap_lex."0.5.1" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".clap_lex."0.6.0" = overridableMkRustCrate (profileName: rec {
name = "clap_lex";
- version = "0.5.1";
+ version = "0.6.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961"; };
+ src = fetchCratesIo { inherit name version; sha256 = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"; };
});
"registry+https://github.com/rust-lang/crates.io-index".colorchoice."1.0.0" = overridableMkRustCrate (profileName: rec {
@@ -1087,31 +1150,46 @@ in
src = fetchCratesIo { inherit name version; sha256 = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".core-foundation."0.9.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".const-oid."0.9.6" = overridableMkRustCrate (profileName: rec {
+ name = "const-oid";
+ version = "0.9.6";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"; };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".core-foundation."0.9.4" = overridableMkRustCrate (profileName: rec {
name = "core-foundation";
- version = "0.9.3";
+ version = "0.9.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"; };
+ src = fetchCratesIo { inherit name version; sha256 = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"; };
+ features = builtins.concatLists [
+ [ "default" ]
+ [ "link" ]
+ ];
dependencies = {
- core_foundation_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".core-foundation-sys."0.8.4" { inherit profileName; }).out;
- libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ core_foundation_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".core-foundation-sys."0.8.6" { inherit profileName; }).out;
+ libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".core-foundation-sys."0.8.4" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".core-foundation-sys."0.8.6" = overridableMkRustCrate (profileName: rec {
name = "core-foundation-sys";
- version = "0.8.4";
+ version = "0.8.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"; };
+ src = fetchCratesIo { inherit name version; sha256 = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"; };
+ features = builtins.concatLists [
+ [ "default" ]
+ [ "link" ]
+ ];
});
- "registry+https://github.com/rust-lang/crates.io-index".cpufeatures."0.2.9" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".cpufeatures."0.2.12" = overridableMkRustCrate (profileName: rec {
name = "cpufeatures";
- version = "0.2.9";
+ version = "0.2.12";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1"; };
+ src = fetchCratesIo { inherit name version; sha256 = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"; };
dependencies = {
- ${ if hostPlatform.config == "aarch64-linux-android" || hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.kernel.name == "linux" || hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.vendor.name == "apple" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if hostPlatform.config == "aarch64-linux-android" || hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.kernel.name == "linux" || hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.vendor.name == "apple" || hostPlatform.parsed.cpu.name == "loongarch64" && hostPlatform.parsed.kernel.name == "linux" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
};
});
@@ -1139,70 +1217,92 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".crossbeam-channel."0.5.8" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".crossbeam-channel."0.5.11" = overridableMkRustCrate (profileName: rec {
name = "crossbeam-channel";
- version = "0.5.8";
+ version = "0.5.11";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"; };
+ src = fetchCratesIo { inherit name version; sha256 = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b"; };
features = builtins.concatLists [
- [ "crossbeam-utils" ]
[ "default" ]
[ "std" ]
];
dependencies = {
- cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- crossbeam_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.16" { inherit profileName; }).out;
+ crossbeam_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.19" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".crossbeam-epoch."0.9.15" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".crossbeam-epoch."0.9.18" = overridableMkRustCrate (profileName: rec {
name = "crossbeam-epoch";
- version = "0.9.15";
+ version = "0.9.18";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"; };
+ src = fetchCratesIo { inherit name version; sha256 = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled") "alloc")
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled") "default")
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled") "std")
];
dependencies = {
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "cfg_if" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "crossbeam_utils" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.16" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "memoffset" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memoffset."0.9.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "scopeguard" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".scopeguard."1.2.0" { inherit profileName; }).out;
- };
- buildDependencies = {
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "autocfg" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".autocfg."1.1.0" { profileName = "__noProfile"; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "crossbeam_utils" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.19" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".crossbeam-queue."0.3.8" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".crossbeam-queue."0.3.11" = overridableMkRustCrate (profileName: rec {
name = "crossbeam-queue";
- version = "0.3.8";
+ version = "0.3.11";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add"; };
+ src = fetchCratesIo { inherit name version; sha256 = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "alloc")
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "default")
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "std")
];
dependencies = {
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "cfg_if" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "crossbeam_utils" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.16" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "crossbeam_utils" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.19" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.16" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.19" = overridableMkRustCrate (profileName: rec {
name = "crossbeam-utils";
- version = "0.8.16";
+ version = "0.8.19";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"; };
+ src = fetchCratesIo { inherit name version; sha256 = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled") "default")
[ "std" ]
];
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".crypto-bigint."0.4.9" = overridableMkRustCrate (profileName: rec {
+ name = "crypto-bigint";
+ version = "0.4.9";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef"; };
+ features = builtins.concatLists [
+ [ "generic-array" ]
+ [ "rand_core" ]
+ [ "zeroize" ]
+ ];
dependencies = {
- cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
+ generic_array = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".generic-array."0.14.7" { inherit profileName; }).out;
+ rand_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand_core."0.6.4" { inherit profileName; }).out;
+ subtle = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".subtle."2.5.0" { inherit profileName; }).out;
+ zeroize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.7.0" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".crypto-bigint."0.5.5" = overridableMkRustCrate (profileName: rec {
+ name = "crypto-bigint";
+ version = "0.5.5";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76"; };
+ features = builtins.concatLists [
+ [ "default" ]
+ [ "rand" ]
+ [ "rand_core" ]
+ ];
+ dependencies = {
+ rand_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand_core."0.6.4" { inherit profileName; }).out;
+ subtle = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".subtle."2.5.0" { inherit profileName; }).out;
};
});
@@ -1216,30 +1316,30 @@ in
];
dependencies = {
generic_array = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".generic-array."0.14.7" { inherit profileName; }).out;
- typenum = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".typenum."1.16.0" { inherit profileName; }).out;
+ typenum = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".typenum."1.17.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".darling."0.14.4" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".darling."0.20.5" = overridableMkRustCrate (profileName: rec {
name = "darling";
- version = "0.14.4";
+ version = "0.20.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850"; };
+ src = fetchCratesIo { inherit name version; sha256 = "fc5d6b04b3fd0ba9926f945895de7d806260a2d7431ba82e7edaecb043c4c6b8"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "suggestions")
];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "darling_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".darling_core."0.14.4" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "darling_macro" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".darling_macro."0.14.4" { profileName = "__noProfile"; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "darling_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".darling_core."0.20.5" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "darling_macro" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".darling_macro."0.20.5" { profileName = "__noProfile"; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".darling_core."0.14.4" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".darling_core."0.20.5" = overridableMkRustCrate (profileName: rec {
name = "darling_core";
- version = "0.14.4";
+ version = "0.20.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0"; };
+ src = fetchCratesIo { inherit name version; sha256 = "04e48a959bcd5c761246f5d090ebc2fbf7b9cd527a492b07a67510c108f1e7e3"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "strsim")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "suggestions")
@@ -1247,22 +1347,22 @@ in
dependencies = {
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "fnv" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.7" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "ident_case" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ident_case."1.0.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "strsim" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".strsim."0.10.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".darling_macro."0.14.4" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".darling_macro."0.20.5" = overridableMkRustCrate (profileName: rec {
name = "darling_macro";
- version = "0.14.4";
+ version = "0.20.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e"; };
+ src = fetchCratesIo { inherit name version; sha256 = "1d1545d67a2149e1d93b7e5c7752dce5a7426eb5d1357ddcfd89336b94444f77"; };
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "darling_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".darling_core."0.14.4" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "darling_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".darling_core."0.20.5" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
};
});
@@ -1280,15 +1380,36 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".deranged."0.3.8" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".der."0.6.1" = overridableMkRustCrate (profileName: rec {
+ name = "der";
+ version = "0.6.1";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de"; };
+ features = builtins.concatLists [
+ [ "alloc" ]
+ [ "const-oid" ]
+ [ "oid" ]
+ [ "zeroize" ]
+ ];
+ dependencies = {
+ const_oid = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".const-oid."0.9.6" { inherit profileName; }).out;
+ zeroize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.7.0" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".deranged."0.3.11" = overridableMkRustCrate (profileName: rec {
name = "deranged";
- version = "0.3.8";
+ version = "0.3.11";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946"; };
+ src = fetchCratesIo { inherit name version; sha256 = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"; };
features = builtins.concatLists [
[ "alloc" ]
+ [ "powerfmt" ]
[ "std" ]
];
+ dependencies = {
+ powerfmt = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".powerfmt."0.2.0" { inherit profileName; }).out;
+ };
});
"registry+https://github.com/rust-lang/crates.io-index".derivative."2.2.0" = overridableMkRustCrate (profileName: rec {
@@ -1297,8 +1418,8 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"; };
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" { inherit profileName; }).out;
};
});
@@ -1324,79 +1445,92 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".dirs-next."2.0.0" = overridableMkRustCrate (profileName: rec {
- name = "dirs-next";
- version = "2.0.0";
+ "registry+https://github.com/rust-lang/crates.io-index".dyn-clone."1.0.16" = overridableMkRustCrate (profileName: rec {
+ name = "dyn-clone";
+ version = "1.0.16";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"; };
- dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "cfg_if" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "dirs_sys_next" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".dirs-sys-next."0.1.2" { inherit profileName; }).out;
- };
+ src = fetchCratesIo { inherit name version; sha256 = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".dirs-sys-next."0.1.2" = overridableMkRustCrate (profileName: rec {
- name = "dirs-sys-next";
- version = "0.1.2";
+ "registry+https://github.com/rust-lang/crates.io-index".ecdsa."0.14.8" = overridableMkRustCrate (profileName: rec {
+ name = "ecdsa";
+ version = "0.14.8";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"; };
+ src = fetchCratesIo { inherit name version; sha256 = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c"; };
+ features = builtins.concatLists [
+ [ "alloc" ]
+ [ "arithmetic" ]
+ [ "der" ]
+ [ "digest" ]
+ [ "hazmat" ]
+ [ "pkcs8" ]
+ [ "rfc6979" ]
+ [ "sign" ]
+ [ "std" ]
+ [ "verify" ]
+ ];
dependencies = {
- ${ if (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") && hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") && hostPlatform.parsed.kernel.name == "redox" then "redox_users" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".redox_users."0.4.3" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") && hostPlatform.isWindows then "winapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }).out;
+ der = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".der."0.6.1" { inherit profileName; }).out;
+ elliptic_curve = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".elliptic-curve."0.12.3" { inherit profileName; }).out;
+ rfc6979 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rfc6979."0.3.1" { inherit profileName; }).out;
+ signature = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".signature."1.6.4" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".dyn-clone."1.0.13" = overridableMkRustCrate (profileName: rec {
- name = "dyn-clone";
- version = "1.0.13";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "bbfc4744c1b8f2a09adc0e55242f60b1af195d88596bd8700be74418c056c555"; };
- });
-
"registry+https://github.com/rust-lang/crates.io-index".either."1.9.0" = overridableMkRustCrate (profileName: rec {
name = "either";
version = "1.9.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"; };
features = builtins.concatLists [
- [ "default" ]
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
[ "use_std" ]
];
});
- "registry+https://github.com/rust-lang/crates.io-index".encoding_rs."0.8.33" = overridableMkRustCrate (profileName: rec {
- name = "encoding_rs";
- version = "0.8.33";
+ "registry+https://github.com/rust-lang/crates.io-index".elliptic-curve."0.12.3" = overridableMkRustCrate (profileName: rec {
+ name = "elliptic-curve";
+ version = "0.12.3";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"; };
+ src = fetchCratesIo { inherit name version; sha256 = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3"; };
features = builtins.concatLists [
[ "alloc" ]
- [ "default" ]
+ [ "arithmetic" ]
+ [ "digest" ]
+ [ "ff" ]
+ [ "group" ]
+ [ "hazmat" ]
+ [ "pkcs8" ]
+ [ "sec1" ]
+ [ "std" ]
];
dependencies = {
- cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
+ base16ct = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base16ct."0.1.1" { inherit profileName; }).out;
+ crypto_bigint = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crypto-bigint."0.4.9" { inherit profileName; }).out;
+ der = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".der."0.6.1" { inherit profileName; }).out;
+ digest = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".digest."0.10.7" { inherit profileName; }).out;
+ ff = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ff."0.12.1" { inherit profileName; }).out;
+ generic_array = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".generic-array."0.14.7" { inherit profileName; }).out;
+ group = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".group."0.12.1" { inherit profileName; }).out;
+ pkcs8 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pkcs8."0.9.0" { inherit profileName; }).out;
+ rand_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand_core."0.6.4" { inherit profileName; }).out;
+ sec1 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sec1."0.3.0" { inherit profileName; }).out;
+ subtle = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".subtle."2.5.0" { inherit profileName; }).out;
+ zeroize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.7.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".env_logger."0.10.0" = overridableMkRustCrate (profileName: rec {
- name = "env_logger";
- version = "0.10.0";
+ "registry+https://github.com/rust-lang/crates.io-index".encoding_rs."0.8.33" = overridableMkRustCrate (profileName: rec {
+ name = "encoding_rs";
+ version = "0.8.33";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0"; };
+ src = fetchCratesIo { inherit name version; sha256 = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "auto-color")
- (lib.optional (rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "color")
- (lib.optional (rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "default")
- (lib.optional (rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "humantime")
- (lib.optional (rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "regex")
+ [ "alloc" ]
+ [ "default" ]
];
dependencies = {
- ${ if rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger" then "humantime" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".humantime."2.1.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger" then "is_terminal" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".is-terminal."0.4.9" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger" then "log" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger" then "regex" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.9.4" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger" then "termcolor" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".termcolor."1.2.0" { inherit profileName; }).out;
+ cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
};
});
@@ -1418,8 +1552,8 @@ in
];
dependencies = {
proc_macro_error = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-error."1.0.4" { inherit profileName; }).out;
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" { inherit profileName; }).out;
synstructure = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".synstructure."0.12.6" { inherit profileName; }).out;
};
@@ -1428,39 +1562,28 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".errno."0.3.2" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".errno."0.3.8" = overridableMkRustCrate (profileName: rec {
name = "errno";
- version = "0.3.2";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f"; };
- dependencies = {
- ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") && hostPlatform.parsed.kernel.name == "dragonfly" then "errno_dragonfly" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".errno-dragonfly."0.1.2" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") && (hostPlatform.isUnix || hostPlatform.parsed.kernel.name == "hermit" || hostPlatform.parsed.kernel.name == "wasi") then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") && hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.48.0" { inherit profileName; }).out;
- };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".errno-dragonfly."0.1.2" = overridableMkRustCrate (profileName: rec {
- name = "errno-dragonfly";
- version = "0.1.2";
+ version = "0.3.8";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"; };
+ src = fetchCratesIo { inherit name version; sha256 = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"; };
+ features = builtins.concatLists [
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "std")
+ ];
dependencies = {
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
- };
- buildDependencies = {
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger" then "cc" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".cc."1.0.83" { profileName = "__noProfile"; }).out;
+ ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && (hostPlatform.isUnix || hostPlatform.parsed.kernel.name == "hermit" || hostPlatform.parsed.kernel.name == "wasi") then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.52.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".fallible-iterator."0.2.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".fallible-iterator."0.3.0" = overridableMkRustCrate (profileName: rec {
name = "fallible-iterator";
- version = "0.2.0";
+ version = "0.3.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"; };
+ src = fetchCratesIo { inherit name version; sha256 = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"; };
features = builtins.concatLists [
+ (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "alloc")
(lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "default")
- (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "std")
];
});
@@ -1471,26 +1594,27 @@ in
src = fetchCratesIo { inherit name version; sha256 = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".fastrand."1.9.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".fastrand."2.0.1" = overridableMkRustCrate (profileName: rec {
name = "fastrand";
- version = "1.9.0";
+ version = "2.0.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"; };
- dependencies = {
- ${ if hostPlatform.parsed.cpu.name == "wasm32" && !(hostPlatform.parsed.kernel.name == "wasi") then "instant" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".instant."0.1.12" { inherit profileName; }).out;
- };
+ src = fetchCratesIo { inherit name version; sha256 = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"; };
+ features = builtins.concatLists [
+ [ "alloc" ]
+ [ "default" ]
+ [ "std" ]
+ ];
});
- "registry+https://github.com/rust-lang/crates.io-index".fastrand."2.0.0" = overridableMkRustCrate (profileName: rec {
- name = "fastrand";
- version = "2.0.0";
+ "registry+https://github.com/rust-lang/crates.io-index".ff."0.12.1" = overridableMkRustCrate (profileName: rec {
+ name = "ff";
+ version = "0.12.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764"; };
- features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "alloc")
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "default")
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "std")
- ];
+ src = fetchCratesIo { inherit name version; sha256 = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160"; };
+ dependencies = {
+ rand_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand_core."0.6.4" { inherit profileName; }).out;
+ subtle = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".subtle."2.5.0" { inherit profileName; }).out;
+ };
});
"registry+https://github.com/rust-lang/crates.io-index".fixedbitset."0.4.2" = overridableMkRustCrate (profileName: rec {
@@ -1511,18 +1635,18 @@ in
];
});
- "registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.1" = overridableMkRustCrate (profileName: rec {
name = "form_urlencoded";
- version = "1.2.0";
+ version = "1.2.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"; };
+ src = fetchCratesIo { inherit name version; sha256 = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
[ "std" ]
];
dependencies = {
- percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.0" { inherit profileName; }).out;
+ percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
};
});
@@ -1539,16 +1663,16 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213"; };
dependencies = {
- ${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled") && hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled") && hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled") && hostPlatform.isWindows then "winapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" = overridableMkRustCrate (profileName: rec {
name = "futures";
- version = "0.3.28";
+ version = "0.3.30";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"; };
+ src = fetchCratesIo { inherit name version; sha256 = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"; };
features = builtins.concatLists [
[ "alloc" ]
[ "async-await" ]
@@ -1558,21 +1682,21 @@ in
[ "std" ]
];
dependencies = {
- futures_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.28" { inherit profileName; }).out;
- futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
- futures_executor = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-executor."0.3.28" { inherit profileName; }).out;
- futures_io = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.28" { inherit profileName; }).out;
- futures_sink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.28" { inherit profileName; }).out;
- futures_task = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.28" { inherit profileName; }).out;
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
+ futures_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.30" { inherit profileName; }).out;
+ futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ futures_executor = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-executor."0.3.30" { inherit profileName; }).out;
+ futures_io = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.30" { inherit profileName; }).out;
+ futures_sink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.30" { inherit profileName; }).out;
+ futures_task = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.28" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.30" = overridableMkRustCrate (profileName: rec {
name = "futures-channel";
- version = "0.3.28";
+ version = "0.3.30";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"; };
+ src = fetchCratesIo { inherit name version; sha256 = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
@@ -1581,16 +1705,16 @@ in
[ "std" ]
];
dependencies = {
- futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
- futures_sink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.28" { inherit profileName; }).out;
+ futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ futures_sink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.30" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" = overridableMkRustCrate (profileName: rec {
name = "futures-core";
- version = "0.3.28";
+ version = "0.3.30";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"; };
+ src = fetchCratesIo { inherit name version; sha256 = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
@@ -1598,50 +1722,50 @@ in
];
});
- "registry+https://github.com/rust-lang/crates.io-index".futures-executor."0.3.28" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".futures-executor."0.3.30" = overridableMkRustCrate (profileName: rec {
name = "futures-executor";
- version = "0.3.28";
+ version = "0.3.30";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"; };
+ src = fetchCratesIo { inherit name version; sha256 = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
];
dependencies = {
- futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
- futures_task = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.28" { inherit profileName; }).out;
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
+ futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ futures_task = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.28" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.30" = overridableMkRustCrate (profileName: rec {
name = "futures-io";
- version = "0.3.28";
+ version = "0.3.30";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"; };
+ src = fetchCratesIo { inherit name version; sha256 = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
];
});
- "registry+https://github.com/rust-lang/crates.io-index".futures-macro."0.3.28" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".futures-macro."0.3.30" = overridableMkRustCrate (profileName: rec {
name = "futures-macro";
- version = "0.3.28";
+ version = "0.3.30";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"; };
+ src = fetchCratesIo { inherit name version; sha256 = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"; };
dependencies = {
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.29" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.28" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.30" = overridableMkRustCrate (profileName: rec {
name = "futures-sink";
- version = "0.3.28";
+ version = "0.3.30";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"; };
+ src = fetchCratesIo { inherit name version; sha256 = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
@@ -1649,22 +1773,22 @@ in
];
});
- "registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.28" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.30" = overridableMkRustCrate (profileName: rec {
name = "futures-task";
- version = "0.3.28";
+ version = "0.3.30";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"; };
+ src = fetchCratesIo { inherit name version; sha256 = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"; };
features = builtins.concatLists [
[ "alloc" ]
[ "std" ]
];
});
- "registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" = overridableMkRustCrate (profileName: rec {
name = "futures-util";
- version = "0.3.28";
+ version = "0.3.30";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"; };
+ src = fetchCratesIo { inherit name version; sha256 = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"; };
features = builtins.concatLists [
[ "alloc" ]
[ "async-await" ]
@@ -1682,13 +1806,13 @@ in
[ "std" ]
];
dependencies = {
- futures_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.28" { inherit profileName; }).out;
- futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
- futures_io = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.28" { inherit profileName; }).out;
- futures_macro = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-macro."0.3.28" { profileName = "__noProfile"; }).out;
- futures_sink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.28" { inherit profileName; }).out;
- futures_task = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.28" { inherit profileName; }).out;
- memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.5.0" { inherit profileName; }).out;
+ futures_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.30" { inherit profileName; }).out;
+ futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ futures_io = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.30" { inherit profileName; }).out;
+ futures_macro = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-macro."0.3.30" { profileName = "__noProfile"; }).out;
+ futures_sink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.30" { inherit profileName; }).out;
+ futures_task = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-task."0.3.30" { inherit profileName; }).out;
+ memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.7.1" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
pin_utils = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-utils."0.1.0" { inherit profileName; }).out;
slab = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".slab."0.4.9" { inherit profileName; }).out;
@@ -1701,7 +1825,7 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"; };
dependencies = {
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "byteorder" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "byteorder" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.5.0" { inherit profileName; }).out;
};
});
@@ -1727,13 +1851,13 @@ in
(lib.optional (rootFeatures' ? "garage/telemetry-otlp") "telemetry-otlp")
];
dependencies = {
- async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" { profileName = "__noProfile"; }).out;
+ async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" { profileName = "__noProfile"; }).out;
backtrace = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".backtrace."0.3.69" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
bytesize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytesize."1.3.0" { inherit profileName; }).out;
format_table = (rustPackages."unknown".format_table."0.1.1" { inherit profileName; }).out;
- futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out;
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
+ futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
garage_api = (rustPackages."unknown".garage_api."0.10.0" { inherit profileName; }).out;
garage_block = (rustPackages."unknown".garage_block."0.10.0" { inherit profileName; }).out;
garage_db = (rustPackages."unknown".garage_db."0.10.0" { inherit profileName; }).out;
@@ -1742,7 +1866,7 @@ in
garage_table = (rustPackages."unknown".garage_table."0.10.0" { inherit profileName; }).out;
garage_util = (rustPackages."unknown".garage_util."0.10.0" { inherit profileName; }).out;
garage_web = (rustPackages."unknown".garage_web."0.10.0" { inherit profileName; }).out;
- git_version = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".git-version."0.3.5" { inherit profileName; }).out;
+ git_version = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".git-version."0.3.9" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
sodiumoxide = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kuska-sodiumoxide."0.2.5-0" { inherit profileName; }).out;
netapp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".netapp."0.10.0" { inherit profileName; }).out;
@@ -1752,27 +1876,30 @@ in
parse_duration = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".parse_duration."2.1.1" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/prometheus" then "prometheus" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".prometheus."0.13.3" { inherit profileName; }).out;
rand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.5" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- serde_bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.12" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ serde_bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.14" { inherit profileName; }).out;
structopt = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".structopt."0.3.26" { inherit profileName; }).out;
- timeago = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".timeago."0.4.1" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ timeago = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".timeago."0.4.2" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
toml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".toml."0.6.0" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
- tracing_subscriber = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-subscriber."0.3.17" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ tracing_subscriber = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-subscriber."0.3.18" { inherit profileName; }).out;
};
devDependencies = {
assert_json_diff = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".assert-json-diff."2.0.2" { inherit profileName; }).out;
- aws_config = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-config."0.55.3" { inherit profileName; }).out;
- aws_sdk_s3 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-s3."0.28.0" { inherit profileName; }).out;
- base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.3" { inherit profileName; }).out;
- chrono = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.26" { inherit profileName; }).out;
+ aws_config = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-config."1.1.4" { inherit profileName; }).out;
+ aws_sdk_s3 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-s3."1.14.0" { inherit profileName; }).out;
+ base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out;
+ chrono = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.33" { inherit profileName; }).out;
hmac = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hmac."0.12.1" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ http_body_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body-util."0.1.0" { inherit profileName; }).out;
+ hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."1.1.0" { inherit profileName; }).out;
+ hyper_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-util."0.1.3" { inherit profileName; }).out;
k2v_client = (rustPackages."unknown".k2v-client."0.0.4" { inherit profileName; }).out;
- serde_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
- sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.7" { inherit profileName; }).out;
+ mktemp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".mktemp."0.5.1" { inherit profileName; }).out;
+ serde_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
+ sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.8" { inherit profileName; }).out;
static_init = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".static_init."1.0.3" { inherit profileName; }).out;
};
});
@@ -1789,15 +1916,15 @@ in
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/prometheus") "prometheus")
];
dependencies = {
- async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" { profileName = "__noProfile"; }).out;
- base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.3" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- chrono = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.26" { inherit profileName; }).out;
+ async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" { profileName = "__noProfile"; }).out;
+ base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ chrono = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.33" { inherit profileName; }).out;
crypto_common = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crypto-common."0.1.6" { inherit profileName; }).out;
err_derive = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.1" { profileName = "__noProfile"; }).out;
- form_urlencoded = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.0" { inherit profileName; }).out;
- futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out;
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
+ form_urlencoded = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.1" { inherit profileName; }).out;
+ futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
garage_block = (rustPackages."unknown".garage_block."0.10.0" { inherit profileName; }).out;
garage_model = (rustPackages."unknown".garage_model."0.10.0" { inherit profileName; }).out;
garage_rpc = (rustPackages."unknown".garage_rpc."0.10.0" { inherit profileName; }).out;
@@ -1805,30 +1932,31 @@ in
garage_util = (rustPackages."unknown".garage_util."0.10.0" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
hmac = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hmac."0.12.1" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ http_body_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body-util."0.1.0" { inherit profileName; }).out;
http_range = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-range."0.1.5" { inherit profileName; }).out;
httpdate = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".httpdate."1.0.3" { inherit profileName; }).out;
- hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
- hyperlocal = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyperlocal."0.8.0" { inherit profileName; }).out;
- idna = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".idna."0.4.0" { inherit profileName; }).out;
- md5 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".md-5."0.10.5" { inherit profileName; }).out;
- multer = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".multer."2.1.0" { inherit profileName; }).out;
+ hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."1.1.0" { inherit profileName; }).out;
+ hyper_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-util."0.1.3" { inherit profileName; }).out;
+ idna = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".idna."0.5.0" { inherit profileName; }).out;
+ md5 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".md-5."0.10.6" { inherit profileName; }).out;
+ multer = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".multer."3.0.0" { inherit profileName; }).out;
nom = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".nom."7.1.3" { inherit profileName; }).out;
opentelemetry = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry."0.17.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" then "opentelemetry_prometheus" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry-prometheus."0.10.0" { inherit profileName; }).out;
- percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.0" { inherit profileName; }).out;
- pin_project = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.3" { inherit profileName; }).out;
+ percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
+ pin_project = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.4" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/prometheus" then "prometheus" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".prometheus."0.13.3" { inherit profileName; }).out;
quick_xml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quick-xml."0.26.0" { inherit profileName; }).out;
- roxmltree = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".roxmltree."0.18.0" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- serde_bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.12" { inherit profileName; }).out;
- serde_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
- sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.7" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ roxmltree = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".roxmltree."0.19.0" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ serde_bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.14" { inherit profileName; }).out;
+ serde_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
+ sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.8" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
tokio_stream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-stream."0.1.14" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
- url = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".url."2.4.0" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ url = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".url."2.5.0" { inherit profileName; }).out;
};
});
@@ -1842,12 +1970,12 @@ in
];
dependencies = {
arc_swap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".arc-swap."1.6.0" { inherit profileName; }).out;
- async_compression = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".async-compression."0.4.1" { inherit profileName; }).out;
- async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" { profileName = "__noProfile"; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ async_compression = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".async-compression."0.4.6" { inherit profileName; }).out;
+ async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" { profileName = "__noProfile"; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
bytesize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytesize."1.3.0" { inherit profileName; }).out;
- futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out;
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
+ futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
garage_db = (rustPackages."unknown".garage_db."0.10.0" { inherit profileName; }).out;
garage_rpc = (rustPackages."unknown".garage_rpc."0.10.0" { inherit profileName; }).out;
garage_table = (rustPackages."unknown".garage_table."0.10.0" { inherit profileName; }).out;
@@ -1855,12 +1983,12 @@ in
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
opentelemetry = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry."0.17.0" { inherit profileName; }).out;
rand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.5" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- serde_bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.12" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- tokio_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.8" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
- zstd = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zstd."0.12.4" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ serde_bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.14" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ tokio_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.10" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ zstd = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zstd."0.13.0" { inherit profileName; }).out;
};
});
@@ -1871,28 +1999,23 @@ in
src = fetchCrateLocal (workspaceSrc + "/src/db");
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage_db/bundled-libs") "bundled-libs")
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli") "clap")
- (lib.optional (rootFeatures' ? "garage_db/cli") "cli")
(lib.optional (rootFeatures' ? "garage_db/default") "default")
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "heed")
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "lmdb")
- (lib.optional (rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "pretty_env_logger")
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "rusqlite")
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled") "sled")
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "sqlite")
];
dependencies = {
- ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" then "clap" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".clap."4.4.0" { inherit profileName; }).out;
err_derive = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.1" { profileName = "__noProfile"; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "heed" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heed."0.11.0" { inherit profileName; }).out;
hexdump = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hexdump."0.1.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger" then "pretty_env_logger" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pretty_env_logger."0.5.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "rusqlite" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rusqlite."0.29.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "rusqlite" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rusqlite."0.30.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "sled" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sled."0.34.7" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
devDependencies = {
- mktemp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".mktemp."0.5.0" { inherit profileName; }).out;
+ mktemp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".mktemp."0.5.1" { inherit profileName; }).out;
};
});
@@ -1910,13 +2033,13 @@ in
];
dependencies = {
arc_swap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".arc-swap."1.6.0" { inherit profileName; }).out;
- async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" { profileName = "__noProfile"; }).out;
- base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.3" { inherit profileName; }).out;
+ async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" { profileName = "__noProfile"; }).out;
+ base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out;
blake2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".blake2."0.10.6" { inherit profileName; }).out;
- chrono = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.26" { inherit profileName; }).out;
+ chrono = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.33" { inherit profileName; }).out;
err_derive = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.1" { profileName = "__noProfile"; }).out;
- futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out;
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
+ futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
garage_block = (rustPackages."unknown".garage_block."0.10.0" { inherit profileName; }).out;
garage_db = (rustPackages."unknown".garage_db."0.10.0" { inherit profileName; }).out;
garage_rpc = (rustPackages."unknown".garage_rpc."0.10.0" { inherit profileName; }).out;
@@ -1926,11 +2049,11 @@ in
netapp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".netapp."0.10.0" { inherit profileName; }).out;
opentelemetry = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry."0.17.0" { inherit profileName; }).out;
rand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.5" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- serde_bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.12" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
- zstd = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zstd."0.12.4" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ serde_bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.14" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ zstd = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zstd."0.13.0" { inherit profileName; }).out;
};
});
@@ -1951,34 +2074,34 @@ in
];
dependencies = {
arc_swap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".arc-swap."1.6.0" { inherit profileName; }).out;
- async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" { profileName = "__noProfile"; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" { profileName = "__noProfile"; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
bytesize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytesize."1.3.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/err-derive" then "err_derive" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.1" { profileName = "__noProfile"; }).out;
format_table = (rustPackages."unknown".format_table."0.1.1" { inherit profileName; }).out;
- futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out;
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
+ futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
garage_db = (rustPackages."unknown".garage_db."0.10.0" { inherit profileName; }).out;
garage_util = (rustPackages."unknown".garage_util."0.10.0" { inherit profileName; }).out;
gethostname = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".gethostname."0.4.3" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
- itertools = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itertools."0.10.5" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "k8s_openapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".k8s-openapi."0.16.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kube."0.75.0" { inherit profileName; }).out;
+ itertools = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itertools."0.12.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "k8s_openapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".k8s-openapi."0.21.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kube."0.88.1" { inherit profileName; }).out;
sodiumoxide = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kuska-sodiumoxide."0.2.5-0" { inherit profileName; }).out;
netapp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".netapp."0.10.0" { inherit profileName; }).out;
nix = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".nix."0.27.1" { inherit profileName; }).out;
opentelemetry = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry."0.17.0" { inherit profileName; }).out;
- pnet_datalink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pnet_datalink."0.33.0" { inherit profileName; }).out;
+ pnet_datalink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pnet_datalink."0.34.0" { inherit profileName; }).out;
rand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.5" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "reqwest" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".reqwest."0.11.20" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "schemars" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".schemars."0.8.12" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- serde_bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.12" { inherit profileName; }).out;
- serde_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "reqwest" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".reqwest."0.11.24" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "schemars" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".schemars."0.8.16" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ serde_bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.14" { inherit profileName; }).out;
+ serde_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
tokio_stream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-stream."0.1.14" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
@@ -1989,10 +2112,10 @@ in
src = fetchCrateLocal (workspaceSrc + "/src/table");
dependencies = {
arc_swap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".arc-swap."1.6.0" { inherit profileName; }).out;
- async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" { profileName = "__noProfile"; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out;
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
+ async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" { profileName = "__noProfile"; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
garage_db = (rustPackages."unknown".garage_db."0.10.0" { inherit profileName; }).out;
garage_rpc = (rustPackages."unknown".garage_rpc."0.10.0" { inherit profileName; }).out;
garage_util = (rustPackages."unknown".garage_util."0.10.0" { inherit profileName; }).out;
@@ -2000,10 +2123,10 @@ in
hexdump = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hexdump."0.1.1" { inherit profileName; }).out;
opentelemetry = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry."0.17.0" { inherit profileName; }).out;
rand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.5" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- serde_bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.12" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ serde_bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.14" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
@@ -2017,34 +2140,34 @@ in
];
dependencies = {
arc_swap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".arc-swap."1.6.0" { inherit profileName; }).out;
- async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" { profileName = "__noProfile"; }).out;
+ async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" { profileName = "__noProfile"; }).out;
blake2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".blake2."0.10.6" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
bytesize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytesize."1.3.0" { inherit profileName; }).out;
- chrono = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.26" { inherit profileName; }).out;
+ chrono = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.33" { inherit profileName; }).out;
digest = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".digest."0.10.7" { inherit profileName; }).out;
err_derive = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.1" { profileName = "__noProfile"; }).out;
- futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out;
+ futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out;
garage_db = (rustPackages."unknown".garage_db."0.10.0" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
hexdump = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hexdump."0.1.1" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."1.1.0" { inherit profileName; }).out;
lazy_static = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }).out;
netapp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".netapp."0.10.0" { inherit profileName; }).out;
opentelemetry = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry."0.17.0" { inherit profileName; }).out;
rand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.5" { inherit profileName; }).out;
rmp_serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp-serde."1.1.2" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- serde_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
- sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.7" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ serde_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
+ sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.8" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
toml = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".toml."0.6.0" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
- xxhash_rust = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".xxhash-rust."0.8.6" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ xxhash_rust = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".xxhash-rust."0.8.8" { inherit profileName; }).out;
};
devDependencies = {
- mktemp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".mktemp."0.5.0" { inherit profileName; }).out;
+ mktemp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".mktemp."0.5.1" { inherit profileName; }).out;
};
buildDependencies = {
rustc_version = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".rustc_version."0.4.0" { profileName = "__noProfile"; }).out;
@@ -2058,18 +2181,19 @@ in
src = fetchCrateLocal (workspaceSrc + "/src/web");
dependencies = {
err_derive = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.1" { profileName = "__noProfile"; }).out;
- futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out;
+ futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out;
garage_api = (rustPackages."unknown".garage_api."0.10.0" { inherit profileName; }).out;
garage_model = (rustPackages."unknown".garage_model."0.10.0" { inherit profileName; }).out;
garage_table = (rustPackages."unknown".garage_table."0.10.0" { inherit profileName; }).out;
garage_util = (rustPackages."unknown".garage_util."0.10.0" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
- hyperlocal = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyperlocal."0.8.0" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ http_body_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body-util."0.1.0" { inherit profileName; }).out;
+ hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."1.1.0" { inherit profileName; }).out;
+ hyper_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-util."0.1.3" { inherit profileName; }).out;
opentelemetry = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry."0.17.0" { inherit profileName; }).out;
- percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.0" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
@@ -2082,7 +2206,7 @@ in
[ "more_lengths" ]
];
dependencies = {
- typenum = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".typenum."1.16.0" { inherit profileName; }).out;
+ typenum = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".typenum."1.17.0" { inherit profileName; }).out;
};
buildDependencies = {
version_check = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".version_check."0.9.4" { profileName = "__noProfile"; }).out;
@@ -2095,78 +2219,108 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818"; };
dependencies = {
- ${ if !hostPlatform.isWindows then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if !hostPlatform.isWindows then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
${ if hostPlatform.isWindows then "windows_targets" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-targets."0.48.5" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.10" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.12" = overridableMkRustCrate (profileName: rec {
name = "getrandom";
- version = "0.2.10";
+ version = "0.2.12";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427"; };
+ src = fetchCratesIo { inherit name version; sha256 = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"; };
features = builtins.concatLists [
[ "std" ]
];
dependencies = {
cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
${ if hostPlatform.parsed.kernel.name == "wasi" then "wasi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasi."0.11.0+wasi-snapshot-preview1" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".gimli."0.28.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".gimli."0.28.1" = overridableMkRustCrate (profileName: rec {
name = "gimli";
- version = "0.28.0";
+ version = "0.28.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"; };
+ src = fetchCratesIo { inherit name version; sha256 = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"; };
features = builtins.concatLists [
[ "read" ]
[ "read-core" ]
];
});
- "registry+https://github.com/rust-lang/crates.io-index".git-version."0.3.5" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".git-version."0.3.9" = overridableMkRustCrate (profileName: rec {
name = "git-version";
- version = "0.3.5";
+ version = "0.3.9";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "f6b0decc02f4636b9ccad390dcbe77b722a77efedfa393caf8379a51d5c61899"; };
+ src = fetchCratesIo { inherit name version; sha256 = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19"; };
dependencies = {
- git_version_macro = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".git-version-macro."0.3.5" { profileName = "__noProfile"; }).out;
- proc_macro_hack = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-hack."0.5.20+deprecated" { profileName = "__noProfile"; }).out;
+ git_version_macro = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".git-version-macro."0.3.9" { profileName = "__noProfile"; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".git-version-macro."0.3.5" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".git-version-macro."0.3.9" = overridableMkRustCrate (profileName: rec {
name = "git-version-macro";
- version = "0.3.5";
+ version = "0.3.9";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "fe69f1cbdb6e28af2bac214e943b99ce8a0a06b447d15d3e61161b0423139f3f"; };
+ src = fetchCratesIo { inherit name version; sha256 = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0"; };
dependencies = {
- proc_macro_hack = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-hack."0.5.20+deprecated" { profileName = "__noProfile"; }).out;
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".h2."0.3.21" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".group."0.12.1" = overridableMkRustCrate (profileName: rec {
+ name = "group";
+ version = "0.12.1";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7"; };
+ dependencies = {
+ ff = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ff."0.12.1" { inherit profileName; }).out;
+ rand_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand_core."0.6.4" { inherit profileName; }).out;
+ subtle = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".subtle."2.5.0" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".h2."0.3.24" = overridableMkRustCrate (profileName: rec {
name = "h2";
- version = "0.3.21";
+ version = "0.3.24";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833"; };
+ src = fetchCratesIo { inherit name version; sha256 = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9"; };
dependencies = {
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
fnv = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.7" { inherit profileName; }).out;
- futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
- futures_sink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.28" { inherit profileName; }).out;
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- indexmap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".indexmap."1.9.3" { inherit profileName; }).out;
+ futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ futures_sink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ indexmap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".indexmap."2.2.2" { inherit profileName; }).out;
slab = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".slab."0.4.9" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- tokio_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.8" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ tokio_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.10" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".h2."0.4.2" = overridableMkRustCrate (profileName: rec {
+ name = "h2";
+ version = "0.4.2";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943"; };
+ dependencies = {
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ fnv = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.7" { inherit profileName; }).out;
+ futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ futures_sink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ indexmap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".indexmap."2.2.2" { inherit profileName; }).out;
+ slab = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".slab."0.4.9" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ tokio_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.10" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
@@ -2180,31 +2334,31 @@ in
];
});
- "registry+https://github.com/rust-lang/crates.io-index".hashbrown."0.14.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".hashbrown."0.14.3" = overridableMkRustCrate (profileName: rec {
name = "hashbrown";
- version = "0.14.0";
+ version = "0.14.3";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"; };
+ src = fetchCratesIo { inherit name version; sha256 = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "ahash")
- (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "allocator-api2")
- (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "default")
- (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "inline-more")
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "raw")
+ (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "ahash")
+ (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "allocator-api2")
+ (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
+ (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "inline-more")
+ [ "raw" ]
];
dependencies = {
- ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "ahash" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ahash."0.8.3" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "allocator_api2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".allocator-api2."0.2.16" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "ahash" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ahash."0.8.7" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "allocator_api2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".allocator-api2."0.2.16" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".hashlink."0.8.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".hashlink."0.8.4" = overridableMkRustCrate (profileName: rec {
name = "hashlink";
- version = "0.8.3";
+ version = "0.8.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f"; };
+ src = fetchCratesIo { inherit name version; sha256 = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7"; };
dependencies = {
- ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "hashbrown" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hashbrown."0.14.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "hashbrown" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hashbrown."0.14.3" { inherit profileName; }).out;
};
});
@@ -2224,7 +2378,7 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "default")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "default")
];
});
@@ -2238,16 +2392,16 @@ in
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "lmdb-rkv-sys")
];
dependencies = {
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "bytemuck" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytemuck."1.13.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "byteorder" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "bytemuck" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytemuck."1.14.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "byteorder" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.5.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "heed_traits" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heed-traits."0.8.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "heed_types" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heed-types."0.8.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "lmdb_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lmdb-rkv-sys."0.11.2" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "page_size" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".page_size."0.4.2" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "synchronoise" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".synchronoise."1.0.1" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") && hostPlatform.isWindows then "url" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".url."2.4.0" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") && hostPlatform.isWindows then "url" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".url."2.5.0" { inherit profileName; }).out;
};
});
@@ -2273,19 +2427,19 @@ in
];
dependencies = {
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "bincode" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bincode."1.3.3" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "bytemuck" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytemuck."1.13.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "byteorder" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "bytemuck" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytemuck."1.14.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "byteorder" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.5.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "heed_traits" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heed-traits."0.8.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".hermit-abi."0.3.2" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".hermit-abi."0.3.4" = overridableMkRustCrate (profileName: rec {
name = "hermit-abi";
- version = "0.3.2";
+ version = "0.3.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b"; };
+ src = fetchCratesIo { inherit name version; sha256 = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f"; };
features = builtins.concatLists [
[ "default" ]
];
@@ -2319,31 +2473,85 @@ in
version = "0.12.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"; };
+ features = builtins.concatLists [
+ [ "reset" ]
+ ];
dependencies = {
digest = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".digest."0.10.7" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".home."0.5.9" = overridableMkRustCrate (profileName: rec {
+ name = "home";
+ version = "0.5.9";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"; };
+ dependencies = {
+ ${ if (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") && hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.52.0" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" = overridableMkRustCrate (profileName: rec {
name = "http";
- version = "0.2.9";
+ version = "0.2.11";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"; };
+ src = fetchCratesIo { inherit name version; sha256 = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb"; };
dependencies = {
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
fnv = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.7" { inherit profileName; }).out;
- itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.9" { inherit profileName; }).out;
+ itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.5" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" = overridableMkRustCrate (profileName: rec {
+ name = "http";
+ version = "1.0.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea"; };
+ features = builtins.concatLists [
+ [ "default" ]
+ [ "std" ]
+ ];
+ dependencies = {
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ fnv = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.7" { inherit profileName; }).out;
+ itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" = overridableMkRustCrate (profileName: rec {
name = "http-body";
- version = "0.4.5";
+ version = "0.4.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"; };
+ src = fetchCratesIo { inherit name version; sha256 = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"; };
dependencies = {
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".http-body."1.0.0" = overridableMkRustCrate (profileName: rec {
+ name = "http-body";
+ version = "1.0.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643"; };
+ dependencies = {
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".http-body-util."0.1.0" = overridableMkRustCrate (profileName: rec {
+ name = "http-body-util";
+ version = "0.1.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840"; };
+ dependencies = {
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."1.0.0" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
};
});
@@ -2380,21 +2588,14 @@ in
src = fetchCratesIo { inherit name version; sha256 = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".humantime."2.1.0" = overridableMkRustCrate (profileName: rec {
- name = "humantime";
- version = "2.1.0";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"; };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.28" = overridableMkRustCrate (profileName: rec {
name = "hyper";
- version = "0.14.27";
+ version = "0.14.28";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"; };
+ src = fetchCratesIo { inherit name version; sha256 = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80"; };
features = builtins.concatLists [
[ "client" ]
- [ "default" ]
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "full")
[ "h2" ]
[ "http1" ]
@@ -2406,31 +2607,60 @@ in
[ "tcp" ]
];
dependencies = {
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- futures_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.28" { inherit profileName; }).out;
- futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
- h2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.3.21" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.5" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ futures_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.30" { inherit profileName; }).out;
+ futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ h2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.3.24" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out;
httparse = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".httparse."1.8.0" { inherit profileName; }).out;
httpdate = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".httpdate."1.0.3" { inherit profileName; }).out;
- itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.9" { inherit profileName; }).out;
+ itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
- socket2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.4.9" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ socket2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.5.5" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
tower_service = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.2" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
want = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".want."0.3.1" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.23.2" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".hyper."1.1.0" = overridableMkRustCrate (profileName: rec {
+ name = "hyper";
+ version = "1.1.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75"; };
+ features = builtins.concatLists [
+ [ "client" ]
+ [ "default" ]
+ [ "http1" ]
+ [ "http2" ]
+ [ "server" ]
+ ];
+ dependencies = {
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ futures_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ h2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.4.2" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."1.0.0" { inherit profileName; }).out;
+ httparse = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".httparse."1.8.0" { inherit profileName; }).out;
+ httpdate = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".httpdate."1.0.3" { inherit profileName; }).out;
+ itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out;
+ pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ want = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".want."0.3.1" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.24.2" = overridableMkRustCrate (profileName: rec {
name = "hyper-rustls";
- version = "0.23.2";
+ version = "0.24.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c"; };
+ src = fetchCratesIo { inherit name version; sha256 = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590"; };
features = builtins.concatLists [
+ [ "acceptor" ]
[ "default" ]
[ "http1" ]
[ "http2" ]
@@ -2442,42 +2672,45 @@ in
[ "tokio-runtime" ]
];
dependencies = {
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.28" { inherit profileName; }).out;
log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
- rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.20.8" { inherit profileName; }).out;
+ rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.21.10" { inherit profileName; }).out;
rustls_native_certs = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-native-certs."0.6.3" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- tokio_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.23.4" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ tokio_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.24.1" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.24.1" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.26.0" = overridableMkRustCrate (profileName: rec {
name = "hyper-rustls";
- version = "0.24.1";
+ version = "0.26.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97"; };
+ src = fetchCratesIo { inherit name version; sha256 = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c"; };
features = builtins.concatLists [
- [ "acceptor" ]
[ "default" ]
[ "http1" ]
[ "http2" ]
[ "log" ]
[ "logging" ]
[ "native-tokio" ]
+ [ "ring" ]
[ "rustls-native-certs" ]
[ "tls12" ]
- [ "tokio-runtime" ]
];
dependencies = {
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."1.1.0" { inherit profileName; }).out;
+ hyper_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-util."0.1.3" { inherit profileName; }).out;
log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
- rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.21.6" { inherit profileName; }).out;
- rustls_native_certs = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-native-certs."0.6.3" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- tokio_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.24.1" { inherit profileName; }).out;
+ rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.22.2" { inherit profileName; }).out;
+ rustls_native_certs = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-native-certs."0.7.0" { inherit profileName; }).out;
+ pki_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pki-types."1.2.0" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ tokio_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.25.0" { inherit profileName; }).out;
+ tower_service = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.2" { inherit profileName; }).out;
};
});
@@ -2487,45 +2720,61 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"; };
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "hyper" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "hyper" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.28" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pin_project_lite" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio_io_timeout" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-io-timeout."1.2.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".hyperlocal."0.8.0" = overridableMkRustCrate (profileName: rec {
- name = "hyperlocal";
- version = "0.8.0";
+ "registry+https://github.com/rust-lang/crates.io-index".hyper-util."0.1.3" = overridableMkRustCrate (profileName: rec {
+ name = "hyper-util";
+ version = "0.1.3";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "0fafdf7b2b2de7c9784f76e02c0935e65a8117ec3b768644379983ab333ac98c"; };
+ src = fetchCratesIo { inherit name version; sha256 = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa"; };
features = builtins.concatLists [
+ [ "client" ]
+ [ "client-legacy" ]
+ [ "default" ]
+ [ "full" ]
+ [ "http1" ]
+ [ "http2" ]
[ "server" ]
+ [ "server-auto" ]
+ [ "service" ]
+ [ "tokio" ]
];
dependencies = {
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
- hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
- hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
- pin_project = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.3" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ futures_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ http_body = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."1.0.0" { inherit profileName; }).out;
+ hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."1.1.0" { inherit profileName; }).out;
+ pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
+ socket2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.5.5" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ tower = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower."0.4.13" { inherit profileName; }).out;
+ tower_service = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.2" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".iana-time-zone."0.1.57" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".iana-time-zone."0.1.60" = overridableMkRustCrate (profileName: rec {
name = "iana-time-zone";
- version = "0.1.57";
+ version = "0.1.60";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613"; };
+ src = fetchCratesIo { inherit name version; sha256 = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"; };
features = builtins.concatLists [
[ "fallback" ]
];
dependencies = {
${ if hostPlatform.parsed.kernel.name == "android" then "android_system_properties" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".android_system_properties."0.1.5" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.kernel.name == "darwin" || hostPlatform.parsed.kernel.name == "ios" then "core_foundation_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".core-foundation-sys."0.8.4" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.kernel.name == "darwin" || hostPlatform.parsed.kernel.name == "ios" then "core_foundation_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".core-foundation-sys."0.8.6" { inherit profileName; }).out;
${ if hostPlatform.parsed.kernel.name == "haiku" then "iana_time_zone_haiku" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".iana-time-zone-haiku."0.1.2" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.cpu.name == "wasm32" then "js_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.64" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.cpu.name == "wasm32" then "wasm_bindgen" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.87" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.kernel.name == "windows" then "windows" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows."0.48.0" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.cpu.name == "wasm32" then "js_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.67" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.cpu.name == "wasm32" then "wasm_bindgen" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.90" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.kernel.name == "windows" then "windows_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-core."0.52.0" { inherit profileName; }).out;
};
});
@@ -2546,18 +2795,18 @@ in
src = fetchCratesIo { inherit name version; sha256 = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".idna."0.4.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".idna."0.5.0" = overridableMkRustCrate (profileName: rec {
name = "idna";
- version = "0.4.0";
+ version = "0.5.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c"; };
+ src = fetchCratesIo { inherit name version; sha256 = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
[ "std" ]
];
dependencies = {
- unicode_bidi = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-bidi."0.3.13" { inherit profileName; }).out;
+ unicode_bidi = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-bidi."0.3.15" { inherit profileName; }).out;
unicode_normalization = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-normalization."0.1.22" { inherit profileName; }).out;
};
});
@@ -2567,9 +2816,6 @@ in
version = "1.9.3";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"; };
- features = builtins.concatLists [
- [ "std" ]
- ];
dependencies = {
hashbrown = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hashbrown."0.12.3" { inherit profileName; }).out;
};
@@ -2578,18 +2824,18 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".indexmap."2.0.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".indexmap."2.2.2" = overridableMkRustCrate (profileName: rec {
name = "indexmap";
- version = "2.0.0";
+ version = "2.2.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"; };
+ src = fetchCratesIo { inherit name version; sha256 = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "std")
+ [ "default" ]
+ [ "std" ]
];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "equivalent" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".equivalent."1.0.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "hashbrown" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hashbrown."0.14.0" { inherit profileName; }).out;
+ equivalent = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".equivalent."1.0.1" { inherit profileName; }).out;
+ hashbrown = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hashbrown."0.14.3" { inherit profileName; }).out;
};
});
@@ -2603,11 +2849,11 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".ipnet."2.8.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".ipnet."2.9.0" = overridableMkRustCrate (profileName: rec {
name = "ipnet";
- version = "2.8.0";
+ version = "2.9.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6"; };
+ src = fetchCratesIo { inherit name version; sha256 = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "default")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "std")
@@ -2624,19 +2870,7 @@ in
[ "serde" ]
];
dependencies = {
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".is-terminal."0.4.9" = overridableMkRustCrate (profileName: rec {
- name = "is-terminal";
- version = "0.4.9";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"; };
- dependencies = {
- ${ if (rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") && hostPlatform.parsed.kernel.name == "hermit" then "hermit_abi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hermit-abi."0.3.2" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") && !(hostPlatform.isWindows || hostPlatform.parsed.kernel.name == "hermit" || hostPlatform.parsed.kernel.name == "unknown") then "rustix" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustix."0.38.9" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") && hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.48.0" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
};
});
@@ -2653,6 +2887,21 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"; };
features = builtins.concatLists [
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "default")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "use_alloc")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "use_std")
+ ];
+ dependencies = {
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "either" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".either."1.9.0" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".itertools."0.12.1" = overridableMkRustCrate (profileName: rec {
+ name = "itertools";
+ version = "0.12.1";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"; };
+ features = builtins.concatLists [
[ "default" ]
[ "use_alloc" ]
[ "use_std" ]
@@ -2662,59 +2911,62 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.9" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" = overridableMkRustCrate (profileName: rec {
name = "itoa";
- version = "1.0.9";
+ version = "1.0.10";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"; };
+ src = fetchCratesIo { inherit name version; sha256 = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".jobserver."0.1.26" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".jobserver."0.1.27" = overridableMkRustCrate (profileName: rec {
name = "jobserver";
- version = "0.1.26";
+ version = "0.1.27";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2"; };
+ src = fetchCratesIo { inherit name version; sha256 = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d"; };
dependencies = {
- ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.64" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.67" = overridableMkRustCrate (profileName: rec {
name = "js-sys";
- version = "0.3.64";
+ version = "0.3.67";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a"; };
+ src = fetchCratesIo { inherit name version; sha256 = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1"; };
dependencies = {
- wasm_bindgen = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.87" { inherit profileName; }).out;
+ wasm_bindgen = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.90" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".json-patch."0.2.7" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".json-patch."1.2.0" = overridableMkRustCrate (profileName: rec {
name = "json-patch";
- version = "0.2.7";
+ version = "1.2.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "eb3fa5a61630976fc4c353c70297f2e93f1930e3ccee574d59d618ccbd5154ce"; };
+ src = fetchCratesIo { inherit name version; sha256 = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "diff")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "treediff")
];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "treediff" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".treediff."3.0.2" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "thiserror" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.56" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "treediff" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".treediff."4.0.3" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".jsonpath_lib."0.3.0" = overridableMkRustCrate (profileName: rec {
- name = "jsonpath_lib";
- version = "0.3.0";
+ "registry+https://github.com/rust-lang/crates.io-index".jsonpath-rust."0.4.0" = overridableMkRustCrate (profileName: rec {
+ name = "jsonpath-rust";
+ version = "0.4.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "eaa63191d68230cccb81c5aa23abd53ed64d83337cacbb25a7b8c7979523774f"; };
+ src = fetchCratesIo { inherit name version; sha256 = "96acbc6188d3bd83519d053efec756aa4419de62ec47be7f28dec297f7dc9eb0"; };
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "log" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pest" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pest."2.7.7" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pest_derive" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pest_derive."2.7.7" { profileName = "__noProfile"; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "regex" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.10.3" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "thiserror" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.56" { inherit profileName; }).out;
};
});
@@ -2731,57 +2983,51 @@ in
(lib.optional (rootFeatures' ? "k2v-client/cli" || rootFeatures' ? "k2v-client/tracing-subscriber") "tracing-subscriber")
];
dependencies = {
- aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."0.55.3" { inherit profileName; }).out;
- base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.3" { inherit profileName; }).out;
- ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "clap" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".clap."4.4.0" { inherit profileName; }).out;
+ aws_sdk_config = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sdk-config."1.13.0" { inherit profileName; }).out;
+ aws_sigv4 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aws-sigv4."1.1.4" { inherit profileName; }).out;
+ base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli" then "clap" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".clap."4.4.18" { inherit profileName; }).out;
${ if rootFeatures' ? "k2v-client/cli" || rootFeatures' ? "k2v-client/format_table" then "format_table" else null } = (rustPackages."unknown".format_table."0.1.1" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
- hyper_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.24.1" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
+ http_body_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body-util."0.1.0" { inherit profileName; }).out;
+ hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."1.1.0" { inherit profileName; }).out;
+ hyper_rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.26.0" { inherit profileName; }).out;
+ hyper_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-util."0.1.3" { inherit profileName; }).out;
log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
- percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.0" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- serde_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
- sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.7" { inherit profileName; }).out;
- thiserror = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.47" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "k2v-client/cli" || rootFeatures' ? "k2v-client/tracing" then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
- ${ if rootFeatures' ? "k2v-client/cli" || rootFeatures' ? "k2v-client/tracing-subscriber" then "tracing_subscriber" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-subscriber."0.3.17" { inherit profileName; }).out;
+ percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ serde_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
+ sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.8" { inherit profileName; }).out;
+ thiserror = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.56" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/cli" || rootFeatures' ? "k2v-client/tracing" then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "k2v-client/cli" || rootFeatures' ? "k2v-client/tracing-subscriber" then "tracing_subscriber" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-subscriber."0.3.18" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".k8s-openapi."0.16.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".k8s-openapi."0.21.0" = overridableMkRustCrate (profileName: rec {
name = "k8s-openapi";
- version = "0.16.0";
+ version = "0.21.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "6d9455388f4977de4d0934efa9f7d36296295537d774574113a20f6082de03da"; };
+ src = fetchCratesIo { inherit name version; sha256 = "301f367a36090b7dfdaac248ee3ed4f14a6a8292e7bec0f1c5e6e2e1f181cd33"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "api")
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "http")
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "percent-encoding")
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "url")
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "v1_22")
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "v1_24")
];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "base64" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.13.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "chrono" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.26" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "percent_encoding" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "base64" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "chrono" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.33" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_value" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde-value."0.7.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "url" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".url."2.4.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".kube."0.75.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".kube."0.88.1" = overridableMkRustCrate (profileName: rec {
name = "kube";
- version = "0.75.0";
+ version = "0.88.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "9bb19108692aeafebb108fd0a1c381c06ac4c03859652599420975165e939b8a"; };
+ src = fetchCratesIo { inherit name version; sha256 = "462fe330a0617b276ec864c2255810adcdf519ecb6844253c54074b2086a97bc"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "client")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "config")
@@ -2793,19 +3039,19 @@ in
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "rustls-tls")
];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "k8s_openapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".k8s-openapi."0.16.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube_client" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kube-client."0.75.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kube-core."0.75.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube_derive" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".kube-derive."0.75.0" { profileName = "__noProfile"; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube_runtime" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kube-runtime."0.75.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "k8s_openapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".k8s-openapi."0.21.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube_client" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kube-client."0.88.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kube-core."0.88.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube_derive" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".kube-derive."0.88.1" { profileName = "__noProfile"; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube_runtime" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kube-runtime."0.88.1" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".kube-client."0.75.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".kube-client."0.88.1" = overridableMkRustCrate (profileName: rec {
name = "kube-client";
- version = "0.75.0";
+ version = "0.88.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "97e1a80ecd1b1438a2fc004549e155d47250b9e01fbfcf4cfbe9c8b56a085593"; };
+ src = fetchCratesIo { inherit name version; sha256 = "7fe0d65dd6f3adba29cfb84f19dfe55449c7f6c35425f9d8294bec40313e0b64"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "__non_core")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "base64")
@@ -2813,15 +3059,15 @@ in
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "chrono")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "client")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "config")
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "dirs")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "either")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "futures")
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "home")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "http-body")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "hyper")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "hyper-rustls")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "hyper-timeout")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "jsonpatch")
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "jsonpath_lib")
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "jsonpath-rust")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "pem")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "pin-project")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "rustls")
@@ -2835,42 +3081,42 @@ in
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "tracing")
];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "base64" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.13.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "chrono" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.26" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "dirs" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".dirs-next."2.0.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "base64" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "chrono" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.33" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "either" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".either."1.9.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "futures" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "http_body" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.5" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "hyper" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "hyper_rustls" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.23.2" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "futures" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "home" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".home."0.5.9" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "http_body" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "hyper" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.28" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "hyper_rustls" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.24.2" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "hyper_timeout" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-timeout."0.4.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "jsonpath_lib" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".jsonpath_lib."0.3.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "k8s_openapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".k8s-openapi."0.16.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kube-core."0.75.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pem" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pem."1.1.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pin_project" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.3" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "rustls" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.20.8" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "rustls_pemfile" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pemfile."1.0.3" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "jsonpath_rust" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".jsonpath-rust."0.4.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "k8s_openapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".k8s-openapi."0.21.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kube-core."0.88.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pem" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pem."3.0.3" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pin_project" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.4" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "rustls" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.21.10" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "rustls_pemfile" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pemfile."1.0.4" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "secrecy" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".secrecy."0.8.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_yaml" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_yaml."0.8.26" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "thiserror" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.47" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.8" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_yaml" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_yaml."0.9.31" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "thiserror" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.56" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.10" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tower" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower."0.4.13" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tower_http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-http."0.3.5" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tower_http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-http."0.4.4" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".kube-core."0.75.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".kube-core."0.88.1" = overridableMkRustCrate (profileName: rec {
name = "kube-core";
- version = "0.75.0";
+ version = "0.88.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "f4d780f2bb048eeef64a4c6b2582d26a0fe19e30b4d3cc9e081616e1779c5d47"; };
+ src = fetchCratesIo { inherit name version; sha256 = "a6b42844e9172f631b8263ea9ce003b9251da13beb1401580937ad206dd82f4c"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "json-patch")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "jsonpatch")
@@ -2878,55 +3124,57 @@ in
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "schemars")
];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "chrono" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.26" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "form_urlencoded" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "json_patch" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".json-patch."0.2.7" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "k8s_openapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".k8s-openapi."0.16.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "schemars" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".schemars."0.8.12" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "thiserror" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.47" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "chrono" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.33" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "form_urlencoded" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "json_patch" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".json-patch."1.2.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "k8s_openapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".k8s-openapi."0.21.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "schemars" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".schemars."0.8.16" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "thiserror" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.56" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".kube-derive."0.75.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".kube-derive."0.88.1" = overridableMkRustCrate (profileName: rec {
name = "kube-derive";
- version = "0.75.0";
+ version = "0.88.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "98459d53b2841237392cd6959956185b2df15c19d32c3b275ed6ca7b7ee1adae"; };
+ src = fetchCratesIo { inherit name version; sha256 = "f5b5a111ee287bd237b8190b8c39543ea9fd22f79e9c32a36c24e08234bcda22"; };
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "darling" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".darling."0.14.4" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "darling" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".darling."0.20.5" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".kube-runtime."0.75.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".kube-runtime."0.88.1" = overridableMkRustCrate (profileName: rec {
name = "kube-runtime";
- version = "0.75.0";
+ version = "0.88.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "7769af142ee2e46bfa44bd393cf7f40b9d8b80d2e11f6317399551ed17760beb"; };
+ src = fetchCratesIo { inherit name version; sha256 = "2bc06275064c81056fbb28ea876b3fb339d970e8132282119359afca0835c0ea"; };
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "ahash" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ahash."0.8.3" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "ahash" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ahash."0.8.7" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "async_trait" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" { profileName = "__noProfile"; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "backoff" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".backoff."0.4.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "derivative" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".derivative."2.2.0" { profileName = "__noProfile"; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "futures" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "json_patch" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".json-patch."0.2.7" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "k8s_openapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".k8s-openapi."0.16.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube_client" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kube-client."0.75.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "futures" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "hashbrown" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hashbrown."0.14.3" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "json_patch" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".json-patch."1.2.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "k8s_openapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".k8s-openapi."0.21.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube_client" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kube-client."0.88.1" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "parking_lot" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".parking_lot."0.12.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pin_project" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.3" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "smallvec" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.11.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "thiserror" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.47" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.8" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pin_project" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.4" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "smallvec" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.13.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "thiserror" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.56" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.10" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
@@ -2941,11 +3189,11 @@ in
[ "futures" ]
];
dependencies = {
- futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out;
+ futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
sodiumoxide = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kuska-sodiumoxide."0.2.5-0" { inherit profileName; }).out;
log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
- thiserror = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.47" { inherit profileName; }).out;
+ thiserror = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.56" { inherit profileName; }).out;
};
});
@@ -2961,9 +3209,9 @@ in
(lib.optional (rootFeatures' ? "garage/system-libs" || rootFeatures' ? "garage_rpc/system-libs") "use-pkg-config")
];
dependencies = {
- libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
libsodium_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libsodium-sys."0.2.7" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
};
});
@@ -2974,11 +3222,11 @@ in
src = fetchCratesIo { inherit name version; sha256 = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" = overridableMkRustCrate (profileName: rec {
name = "libc";
- version = "0.2.147";
+ version = "0.2.153";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"; };
+ src = fetchCratesIo { inherit name version; sha256 = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"; };
features = builtins.concatLists [
[ "default" ]
[ "extra_traits" ]
@@ -2995,21 +3243,21 @@ in
(lib.optional (rootFeatures' ? "garage/system-libs" || rootFeatures' ? "garage_rpc/system-libs") "use-pkg-config")
];
dependencies = {
- libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
};
buildDependencies = {
${ if !(hostPlatform.parsed.abi.name == "msvc") then "cc" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".cc."1.0.83" { profileName = "__noProfile"; }).out;
- ${ if hostPlatform.parsed.abi.name == "msvc" then "libc" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { profileName = "__noProfile"; }).out;
- pkg_config = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.27" { profileName = "__noProfile"; }).out;
- walkdir = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".walkdir."2.3.3" { profileName = "__noProfile"; }).out;
+ ${ if hostPlatform.parsed.abi.name == "msvc" then "libc" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { profileName = "__noProfile"; }).out;
+ pkg_config = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.29" { profileName = "__noProfile"; }).out;
+ walkdir = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".walkdir."2.4.0" { profileName = "__noProfile"; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".libsqlite3-sys."0.26.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".libsqlite3-sys."0.27.0" = overridableMkRustCrate (profileName: rec {
name = "libsqlite3-sys";
- version = "0.26.0";
+ version = "0.27.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326"; };
+ src = fetchCratesIo { inherit name version; sha256 = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage_db/bundled-libs") "bundled")
(lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage_db/bundled-libs") "bundled_bindings")
@@ -3021,28 +3269,22 @@ in
];
buildDependencies = {
${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage_db/bundled-libs" then "cc" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".cc."1.0.83" { profileName = "__noProfile"; }).out;
- ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "pkg_config" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.27" { profileName = "__noProfile"; }).out;
+ ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "pkg_config" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.29" { profileName = "__noProfile"; }).out;
${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "vcpkg" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".vcpkg."0.2.15" { profileName = "__noProfile"; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".linked-hash-map."0.5.6" = overridableMkRustCrate (profileName: rec {
- name = "linked-hash-map";
- version = "0.5.6";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"; };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".linux-raw-sys."0.4.5" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".linux-raw-sys."0.4.13" = overridableMkRustCrate (profileName: rec {
name = "linux-raw-sys";
- version = "0.4.5";
+ version = "0.4.13";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503"; };
+ src = fetchCratesIo { inherit name version; sha256 = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "errno")
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "general")
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "ioctl")
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "no_std")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "elf")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "errno")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "general")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "ioctl")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "no_std")
];
});
@@ -3055,19 +3297,19 @@ in
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "default")
];
dependencies = {
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
};
buildDependencies = {
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "cc" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".cc."1.0.83" { profileName = "__noProfile"; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "pkg_config" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.27" { profileName = "__noProfile"; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "pkg_config" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.29" { profileName = "__noProfile"; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".lock_api."0.4.10" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".lock_api."0.4.11" = overridableMkRustCrate (profileName: rec {
name = "lock_api";
- version = "0.4.10";
+ version = "0.4.11";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"; };
+ src = fetchCratesIo { inherit name version; sha256 = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"; };
features = builtins.concatLists [
[ "atomic_usize" ]
[ "default" ]
@@ -3100,44 +3342,33 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".md-5."0.10.5" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".md-5."0.10.6" = overridableMkRustCrate (profileName: rec {
name = "md-5";
- version = "0.10.5";
+ version = "0.10.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca"; };
+ src = fetchCratesIo { inherit name version; sha256 = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
];
dependencies = {
+ cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
digest = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".digest."0.10.7" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".memchr."2.5.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".memchr."2.7.1" = overridableMkRustCrate (profileName: rec {
name = "memchr";
- version = "2.5.0";
+ version = "2.7.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"; };
+ src = fetchCratesIo { inherit name version; sha256 = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"; };
features = builtins.concatLists [
+ [ "alloc" ]
[ "default" ]
[ "std" ]
];
});
- "registry+https://github.com/rust-lang/crates.io-index".memoffset."0.9.0" = overridableMkRustCrate (profileName: rec {
- name = "memoffset";
- version = "0.9.0";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"; };
- features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled") "default")
- ];
- buildDependencies = {
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "autocfg" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".autocfg."1.1.0" { profileName = "__noProfile"; }).out;
- };
- });
-
"registry+https://github.com/rust-lang/crates.io-index".mime."0.3.17" = overridableMkRustCrate (profileName: rec {
name = "mime";
version = "0.3.17";
@@ -3155,59 +3386,59 @@ in
];
});
- "registry+https://github.com/rust-lang/crates.io-index".miniz_oxide."0.7.1" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".miniz_oxide."0.7.2" = overridableMkRustCrate (profileName: rec {
name = "miniz_oxide";
- version = "0.7.1";
+ version = "0.7.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"; };
+ src = fetchCratesIo { inherit name version; sha256 = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"; };
dependencies = {
adler = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".adler."1.0.2" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".mio."0.8.8" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".mio."0.8.10" = overridableMkRustCrate (profileName: rec {
name = "mio";
- version = "0.8.8";
+ version = "0.8.10";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"; };
+ src = fetchCratesIo { inherit name version; sha256 = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"; };
features = builtins.concatLists [
[ "net" ]
[ "os-ext" ]
[ "os-poll" ]
];
dependencies = {
- ${ if hostPlatform.isUnix || hostPlatform.parsed.kernel.name == "wasi" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if hostPlatform.isUnix || hostPlatform.parsed.kernel.name == "wasi" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
${ if hostPlatform.parsed.kernel.name == "wasi" then "wasi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasi."0.11.0+wasi-snapshot-preview1" { inherit profileName; }).out;
${ if hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.48.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".mktemp."0.5.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".mktemp."0.5.1" = overridableMkRustCrate (profileName: rec {
name = "mktemp";
- version = "0.5.0";
+ version = "0.5.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "4bdc1f74dd7bb717d39f784f844e490d935b3aa7e383008006dbbf29c1f7820a"; };
+ src = fetchCratesIo { inherit name version; sha256 = "69fed8fbcd01affec44ac226784c6476a6006d98d13e33bc0ca7977aaf046bd8"; };
dependencies = {
- uuid = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".uuid."1.2.2" { inherit profileName; }).out;
+ uuid = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".uuid."1.4.1" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".multer."2.1.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".multer."3.0.0" = overridableMkRustCrate (profileName: rec {
name = "multer";
- version = "2.1.0";
+ version = "3.0.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "01acbdc23469fd8fe07ab135923371d5f5a422fbf9c522158677c8eb15bc51c2"; };
+ src = fetchCratesIo { inherit name version; sha256 = "a15d522be0a9c3e46fd2632e272d178f56387bdb5c9fbb3a36c649062e9b5219"; };
features = builtins.concatLists [
[ "default" ]
];
dependencies = {
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
encoding_rs = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".encoding_rs."0.8.33" { inherit profileName; }).out;
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
- http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."1.0.0" { inherit profileName; }).out;
httparse = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".httparse."1.8.0" { inherit profileName; }).out;
log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
- memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.5.0" { inherit profileName; }).out;
+ memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.7.1" { inherit profileName; }).out;
mime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".mime."0.3.17" { inherit profileName; }).out;
spin = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".spin."0.9.8" { inherit profileName; }).out;
};
@@ -3236,24 +3467,24 @@ in
];
dependencies = {
arc_swap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".arc-swap."1.6.0" { inherit profileName; }).out;
- async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" { profileName = "__noProfile"; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" { profileName = "__noProfile"; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
err_derive = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.1" { profileName = "__noProfile"; }).out;
- futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out;
+ futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out;
hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out;
kuska_handshake = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kuska-handshake."0.2.0" { inherit profileName; }).out;
sodiumoxide = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kuska-sodiumoxide."0.2.5-0" { inherit profileName; }).out;
log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
opentelemetry = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry."0.17.0" { inherit profileName; }).out;
opentelemetry_contrib = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry-contrib."0.9.0" { inherit profileName; }).out;
- pin_project = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.3" { inherit profileName; }).out;
+ pin_project = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.4" { inherit profileName; }).out;
rand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.5" { inherit profileName; }).out;
rmp_serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp-serde."1.1.2" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
tokio_stream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-stream."0.1.14" { inherit profileName; }).out;
- tokio_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.8" { inherit profileName; }).out;
+ tokio_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.10" { inherit profileName; }).out;
};
});
@@ -3266,9 +3497,9 @@ in
[ "fs" ]
];
dependencies = {
- bitflags = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."2.4.0" { inherit profileName; }).out;
+ bitflags = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."2.4.2" { inherit profileName; }).out;
cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
};
});
@@ -3293,7 +3524,7 @@ in
[ "std" ]
];
dependencies = {
- memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.5.0" { inherit profileName; }).out;
+ memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.7.1" { inherit profileName; }).out;
minimal_lexical = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".minimal-lexical."0.2.1" { inherit profileName; }).out;
};
});
@@ -3309,7 +3540,7 @@ in
[ "std" ]
];
dependencies = {
- memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.5.0" { inherit profileName; }).out;
+ memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.7.1" { inherit profileName; }).out;
};
});
@@ -3340,7 +3571,7 @@ in
num_integer = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-integer."0.1.45" { inherit profileName; }).out;
num_iter = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-iter."0.1.43" { inherit profileName; }).out;
num_rational = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-rational."0.2.4" { inherit profileName; }).out;
- num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.16" { inherit profileName; }).out;
+ num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.17" { inherit profileName; }).out;
};
});
@@ -3354,7 +3585,7 @@ in
];
dependencies = {
num_integer = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-integer."0.1.45" { inherit profileName; }).out;
- num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.16" { inherit profileName; }).out;
+ num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.17" { inherit profileName; }).out;
};
buildDependencies = {
autocfg = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".autocfg."1.1.0" { profileName = "__noProfile"; }).out;
@@ -3370,13 +3601,20 @@ in
[ "std" ]
];
dependencies = {
- num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.16" { inherit profileName; }).out;
+ num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.17" { inherit profileName; }).out;
};
buildDependencies = {
autocfg = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".autocfg."1.1.0" { profileName = "__noProfile"; }).out;
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".num-conv."0.1.0" = overridableMkRustCrate (profileName: rec {
+ name = "num-conv";
+ version = "0.1.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"; };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".num-integer."0.1.45" = overridableMkRustCrate (profileName: rec {
name = "num-integer";
version = "0.1.45";
@@ -3387,7 +3625,7 @@ in
[ "std" ]
];
dependencies = {
- num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.16" { inherit profileName; }).out;
+ num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.17" { inherit profileName; }).out;
};
buildDependencies = {
autocfg = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".autocfg."1.1.0" { profileName = "__noProfile"; }).out;
@@ -3404,7 +3642,7 @@ in
];
dependencies = {
num_integer = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-integer."0.1.45" { inherit profileName; }).out;
- num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.16" { inherit profileName; }).out;
+ num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.17" { inherit profileName; }).out;
};
buildDependencies = {
autocfg = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".autocfg."1.1.0" { profileName = "__noProfile"; }).out;
@@ -3424,18 +3662,18 @@ in
dependencies = {
num_bigint = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-bigint."0.2.6" { inherit profileName; }).out;
num_integer = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-integer."0.1.45" { inherit profileName; }).out;
- num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.16" { inherit profileName; }).out;
+ num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.17" { inherit profileName; }).out;
};
buildDependencies = {
autocfg = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".autocfg."1.1.0" { profileName = "__noProfile"; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.16" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.17" = overridableMkRustCrate (profileName: rec {
name = "num-traits";
- version = "0.2.16";
+ version = "0.2.17";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2"; };
+ src = fetchCratesIo { inherit name version; sha256 = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"; };
features = builtins.concatLists [
[ "std" ]
];
@@ -3450,16 +3688,16 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"; };
dependencies = {
- ${ if hostPlatform.parsed.kernel.name == "hermit" then "hermit_abi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hermit-abi."0.3.2" { inherit profileName; }).out;
- ${ if !hostPlatform.isWindows then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.kernel.name == "hermit" then "hermit_abi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hermit-abi."0.3.4" { inherit profileName; }).out;
+ ${ if !hostPlatform.isWindows then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".object."0.32.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".object."0.32.2" = overridableMkRustCrate (profileName: rec {
name = "object";
- version = "0.32.0";
+ version = "0.32.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe"; };
+ src = fetchCratesIo { inherit name version; sha256 = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"; };
features = builtins.concatLists [
[ "archive" ]
[ "coff" ]
@@ -3470,21 +3708,20 @@ in
[ "unaligned" ]
];
dependencies = {
- memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.5.0" { inherit profileName; }).out;
+ memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.7.1" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" = overridableMkRustCrate (profileName: rec {
name = "once_cell";
- version = "1.18.0";
+ version = "1.19.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"; };
+ src = fetchCratesIo { inherit name version; sha256 = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
[ "race" ]
[ "std" ]
- (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "unstable")
];
});
@@ -3516,20 +3753,20 @@ in
[ "trace" ]
];
dependencies = {
- async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" { profileName = "__noProfile"; }).out;
- crossbeam_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-channel."0.5.8" { inherit profileName; }).out;
+ async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" { profileName = "__noProfile"; }).out;
+ crossbeam_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-channel."0.5.11" { inherit profileName; }).out;
dashmap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".dashmap."4.0.2" { inherit profileName; }).out;
fnv = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.7" { inherit profileName; }).out;
- futures_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.28" { inherit profileName; }).out;
- futures_executor = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-executor."0.3.28" { inherit profileName; }).out;
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.cpu.name == "wasm32" then "js_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.64" { inherit profileName; }).out;
+ futures_channel = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-channel."0.3.30" { inherit profileName; }).out;
+ futures_executor = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-executor."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.cpu.name == "wasm32" then "js_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.67" { inherit profileName; }).out;
lazy_static = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }).out;
- percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.0" { inherit profileName; }).out;
- pin_project = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.3" { inherit profileName; }).out;
+ percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
+ pin_project = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.4" { inherit profileName; }).out;
rand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.5" { inherit profileName; }).out;
- thiserror = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.47" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ thiserror = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.56" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
tokio_stream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-stream."0.1.14" { inherit profileName; }).out;
};
});
@@ -3561,14 +3798,14 @@ in
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "tonic-build")
];
dependencies = {
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "async_trait" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" { profileName = "__noProfile"; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "futures" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "futures_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "async_trait" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" { profileName = "__noProfile"; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "futures" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.30" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "futures_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "opentelemetry" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry."0.17.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "prost" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".prost."0.9.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "thiserror" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.47" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "thiserror" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.56" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tonic" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tonic."0.6.2" { inherit profileName; }).out;
};
buildDependencies = {
@@ -3588,17 +3825,17 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".ordered-float."2.10.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".ordered-float."2.10.1" = overridableMkRustCrate (profileName: rec {
name = "ordered-float";
- version = "2.10.0";
+ version = "2.10.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87"; };
+ src = fetchCratesIo { inherit name version; sha256 = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "std")
];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "num_traits" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.16" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "num_traits" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.17" { inherit profileName; }).out;
};
});
@@ -3616,13 +3853,36 @@ in
src = fetchCratesIo { inherit name version; sha256 = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"; };
});
+ "registry+https://github.com/rust-lang/crates.io-index".p256."0.11.1" = overridableMkRustCrate (profileName: rec {
+ name = "p256";
+ version = "0.11.1";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594"; };
+ features = builtins.concatLists [
+ [ "arithmetic" ]
+ [ "default" ]
+ [ "digest" ]
+ [ "ecdsa" ]
+ [ "ecdsa-core" ]
+ [ "pkcs8" ]
+ [ "sha2" ]
+ [ "sha256" ]
+ [ "std" ]
+ ];
+ dependencies = {
+ ecdsa_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ecdsa."0.14.8" { inherit profileName; }).out;
+ elliptic_curve = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".elliptic-curve."0.12.3" { inherit profileName; }).out;
+ sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.8" { inherit profileName; }).out;
+ };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".page_size."0.4.2" = overridableMkRustCrate (profileName: rec {
name = "page_size";
version = "0.4.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "eebde548fbbf1ea81a99b128872779c437752fb99f217c45245e1a61dcd9edcd"; };
dependencies = {
- ${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") && hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") && hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") && hostPlatform.isWindows then "winapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }).out;
};
});
@@ -3637,7 +3897,7 @@ in
];
dependencies = {
instant = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".instant."0.1.12" { inherit profileName; }).out;
- lock_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lock_api."0.4.10" { inherit profileName; }).out;
+ lock_api = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lock_api."0.4.11" { inherit profileName; }).out;
parking_lot_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".parking_lot_core."0.8.6" { inherit profileName; }).out;
};
});
@@ -3651,8 +3911,8 @@ in
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
];
dependencies = {
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "lock_api" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lock_api."0.4.10" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "parking_lot_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".parking_lot_core."0.9.8" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "lock_api" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lock_api."0.4.11" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "parking_lot_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".parking_lot_core."0.9.9" { inherit profileName; }).out;
};
});
@@ -3664,23 +3924,23 @@ in
dependencies = {
cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
instant = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".instant."0.1.12" { inherit profileName; }).out;
- ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
${ if hostPlatform.parsed.kernel.name == "redox" then "syscall" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".redox_syscall."0.2.16" { inherit profileName; }).out;
- smallvec = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.11.0" { inherit profileName; }).out;
+ smallvec = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.13.1" { inherit profileName; }).out;
${ if hostPlatform.isWindows then "winapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".parking_lot_core."0.9.8" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".parking_lot_core."0.9.9" = overridableMkRustCrate (profileName: rec {
name = "parking_lot_core";
- version = "0.9.8";
+ version = "0.9.9";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"; };
+ src = fetchCratesIo { inherit name version; sha256 = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"; };
dependencies = {
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "cfg_if" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") && hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") && hostPlatform.parsed.kernel.name == "redox" then "syscall" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".redox_syscall."0.3.5" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "smallvec" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.11.0" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") && hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") && hostPlatform.parsed.kernel.name == "redox" then "syscall" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".redox_syscall."0.4.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "smallvec" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.13.1" { inherit profileName; }).out;
${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") && hostPlatform.isWindows then "windows_targets" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-targets."0.48.5" { inherit profileName; }).out;
};
});
@@ -3693,7 +3953,7 @@ in
dependencies = {
lazy_static = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }).out;
num = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num."0.2.1" { inherit profileName; }).out;
- regex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.9.4" { inherit profileName; }).out;
+ regex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.10.3" { inherit profileName; }).out;
};
});
@@ -3704,21 +3964,26 @@ in
src = fetchCratesIo { inherit name version; sha256 = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".pem."1.1.1" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".pem."3.0.3" = overridableMkRustCrate (profileName: rec {
name = "pem";
- version = "1.1.1";
+ version = "3.0.3";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8"; };
+ src = fetchCratesIo { inherit name version; sha256 = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310"; };
+ features = builtins.concatLists [
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "std")
+ ];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "base64" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.13.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "base64" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" = overridableMkRustCrate (profileName: rec {
name = "percent-encoding";
- version = "2.3.0";
+ version = "2.3.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"; };
+ src = fetchCratesIo { inherit name version; sha256 = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
@@ -3726,6 +3991,72 @@ in
];
});
+ "registry+https://github.com/rust-lang/crates.io-index".pest."2.7.7" = overridableMkRustCrate (profileName: rec {
+ name = "pest";
+ version = "2.7.7";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546"; };
+ features = builtins.concatLists [
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "memchr")
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "std")
+ ];
+ dependencies = {
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "memchr" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.7.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "thiserror" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.56" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "ucd_trie" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ucd-trie."0.1.6" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".pest_derive."2.7.7" = overridableMkRustCrate (profileName: rec {
+ name = "pest_derive";
+ version = "2.7.7";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "22e1288dbd7786462961e69bfd4df7848c1e37e8b74303dbdab82c3a9cdd2809"; };
+ features = builtins.concatLists [
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "std")
+ ];
+ dependencies = {
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pest" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pest."2.7.7" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pest_generator" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pest_generator."2.7.7" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".pest_generator."2.7.7" = overridableMkRustCrate (profileName: rec {
+ name = "pest_generator";
+ version = "2.7.7";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "1381c29a877c6d34b8c176e734f35d7f7f5b3adaefe940cb4d1bb7af94678e2e"; };
+ features = builtins.concatLists [
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "std")
+ ];
+ dependencies = {
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pest" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pest."2.7.7" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pest_meta" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pest_meta."2.7.7" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".pest_meta."2.7.7" = overridableMkRustCrate (profileName: rec {
+ name = "pest_meta";
+ version = "2.7.7";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "d0934d6907f148c22a3acbda520c7eed243ad7487a30f51f6ce52b58b7077a8a"; };
+ features = builtins.concatLists [
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
+ ];
+ dependencies = {
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pest" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pest."2.7.7" { inherit profileName; }).out;
+ };
+ buildDependencies = {
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "sha2" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.8" { profileName = "__noProfile"; }).out;
+ };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".petgraph."0.6.4" = overridableMkRustCrate (profileName: rec {
name = "petgraph";
version = "0.6.4";
@@ -3733,29 +4064,29 @@ in
src = fetchCratesIo { inherit name version; sha256 = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9"; };
dependencies = {
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "fixedbitset" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fixedbitset."0.4.2" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "indexmap" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".indexmap."2.0.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "indexmap" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".indexmap."2.2.2" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.4" = overridableMkRustCrate (profileName: rec {
name = "pin-project";
- version = "1.1.3";
+ version = "1.1.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422"; };
+ src = fetchCratesIo { inherit name version; sha256 = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0"; };
dependencies = {
- pin_project_internal = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-internal."1.1.3" { profileName = "__noProfile"; }).out;
+ pin_project_internal = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-internal."1.1.4" { profileName = "__noProfile"; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".pin-project-internal."1.1.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".pin-project-internal."1.1.4" = overridableMkRustCrate (profileName: rec {
name = "pin-project-internal";
- version = "1.1.3";
+ version = "1.1.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"; };
+ src = fetchCratesIo { inherit name version; sha256 = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690"; };
dependencies = {
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.29" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
};
});
@@ -3773,18 +4104,32 @@ in
src = fetchCratesIo { inherit name version; sha256 = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.27" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".pkcs8."0.9.0" = overridableMkRustCrate (profileName: rec {
+ name = "pkcs8";
+ version = "0.9.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba"; };
+ features = builtins.concatLists [
+ [ "alloc" ]
+ ];
+ dependencies = {
+ der = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".der."0.6.1" { inherit profileName; }).out;
+ spki = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".spki."0.6.0" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.29" = overridableMkRustCrate (profileName: rec {
name = "pkg-config";
- version = "0.3.27";
+ version = "0.3.29";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"; };
+ src = fetchCratesIo { inherit name version; sha256 = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".pnet_base."0.33.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".pnet_base."0.34.0" = overridableMkRustCrate (profileName: rec {
name = "pnet_base";
- version = "0.33.0";
+ version = "0.34.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "872e46346144ebf35219ccaa64b1dffacd9c6f188cd7d012bd6977a2a838f42e"; };
+ src = fetchCratesIo { inherit name version; sha256 = "fe4cf6fb3ab38b68d01ab2aea03ed3d1132b4868fa4e06285f29f16da01c5f4c"; };
features = builtins.concatLists [
[ "std" ]
];
@@ -3793,35 +4138,42 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".pnet_datalink."0.33.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".pnet_datalink."0.34.0" = overridableMkRustCrate (profileName: rec {
name = "pnet_datalink";
- version = "0.33.0";
+ version = "0.34.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "c302da22118d2793c312a35fb3da6846cb0fab6c3ad53fd67e37809b06cdafce"; };
+ src = fetchCratesIo { inherit name version; sha256 = "ad5854abf0067ebbd3967f7d45ebc8976ff577ff0c7bd101c4973ae3c70f98fe"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
];
dependencies = {
ipnetwork = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ipnetwork."0.20.0" { inherit profileName; }).out;
- libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
- pnet_base = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pnet_base."0.33.0" { inherit profileName; }).out;
- pnet_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pnet_sys."0.33.0" { inherit profileName; }).out;
+ libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
+ pnet_base = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pnet_base."0.34.0" { inherit profileName; }).out;
+ pnet_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pnet_sys."0.34.0" { inherit profileName; }).out;
${ if hostPlatform.isWindows then "winapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".pnet_sys."0.33.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".pnet_sys."0.34.0" = overridableMkRustCrate (profileName: rec {
name = "pnet_sys";
- version = "0.33.0";
+ version = "0.34.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "faf7a58b2803d818a374be9278a1fe8f88fce14b936afbe225000cfcd9c73f16"; };
+ src = fetchCratesIo { inherit name version; sha256 = "417c0becd1b573f6d544f73671070b039051e5ad819cc64aa96377b536128d00"; };
dependencies = {
- libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
${ if hostPlatform.isWindows then "winapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }).out;
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".powerfmt."0.2.0" = overridableMkRustCrate (profileName: rec {
+ name = "powerfmt";
+ version = "0.2.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"; };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".ppv-lite86."0.2.17" = overridableMkRustCrate (profileName: rec {
name = "ppv-lite86";
version = "0.2.17";
@@ -3833,17 +4185,6 @@ in
];
});
- "registry+https://github.com/rust-lang/crates.io-index".pretty_env_logger."0.5.0" = overridableMkRustCrate (profileName: rec {
- name = "pretty_env_logger";
- version = "0.5.0";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c"; };
- dependencies = {
- ${ if rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger" then "env_logger" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".env_logger."0.10.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger" then "log" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
- };
- });
-
"registry+https://github.com/rust-lang/crates.io-index".proc-macro-error."1.0.4" = overridableMkRustCrate (profileName: rec {
name = "proc-macro-error";
version = "1.0.4";
@@ -3856,8 +4197,8 @@ in
];
dependencies = {
proc_macro_error_attr = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-error-attr."1.0.4" { profileName = "__noProfile"; }).out;
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" { inherit profileName; }).out;
};
buildDependencies = {
@@ -3871,32 +4212,25 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"; };
dependencies = {
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
};
buildDependencies = {
version_check = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".version_check."0.9.4" { profileName = "__noProfile"; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".proc-macro-hack."0.5.20+deprecated" = overridableMkRustCrate (profileName: rec {
- name = "proc-macro-hack";
- version = "0.5.20+deprecated";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"; };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" = overridableMkRustCrate (profileName: rec {
name = "proc-macro2";
- version = "1.0.66";
+ version = "1.0.78";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"; };
+ src = fetchCratesIo { inherit name version; sha256 = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"; };
features = builtins.concatLists [
[ "default" ]
[ "proc-macro" ]
];
dependencies = {
- unicode_ident = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-ident."1.0.11" { inherit profileName; }).out;
+ unicode_ident = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-ident."1.0.12" { inherit profileName; }).out;
};
});
@@ -3913,10 +4247,10 @@ in
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" then "cfg_if" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" then "fnv" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fnv."1.0.7" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" then "lazy_static" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" then "memchr" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.5.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" then "memchr" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.7.1" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" then "parking_lot" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".parking_lot."0.12.1" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" then "protobuf" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".protobuf."2.28.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" then "thiserror" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.47" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" then "thiserror" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.56" { inherit profileName; }).out;
};
});
@@ -3931,7 +4265,7 @@ in
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "std")
];
dependencies = {
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "prost_derive" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".prost-derive."0.9.0" { profileName = "__noProfile"; }).out;
};
});
@@ -3942,7 +4276,7 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5"; };
dependencies = {
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "heck" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heck."0.3.3" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "itertools" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itertools."0.10.5" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "lazy_static" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }).out;
@@ -3951,11 +4285,11 @@ in
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "petgraph" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".petgraph."0.6.4" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "prost" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".prost."0.9.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "prost_types" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".prost-types."0.9.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "regex" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.9.4" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tempfile" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tempfile."3.8.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "regex" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.10.3" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tempfile" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tempfile."3.9.0" { inherit profileName; }).out;
};
buildDependencies = {
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "which" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".which."4.4.0" { profileName = "__noProfile"; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "which" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".which."4.4.2" { profileName = "__noProfile"; }).out;
};
});
@@ -3965,10 +4299,10 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe"; };
dependencies = {
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "anyhow" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anyhow."1.0.75" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "anyhow" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".anyhow."1.0.79" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "itertools" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itertools."0.10.5" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" { inherit profileName; }).out;
};
});
@@ -3979,7 +4313,7 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a"; };
dependencies = {
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "prost" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".prost."0.9.0" { inherit profileName; }).out;
};
});
@@ -4002,22 +4336,22 @@ in
[ "serialize" ]
];
dependencies = {
- memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.5.0" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
+ memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.7.1" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" = overridableMkRustCrate (profileName: rec {
name = "quote";
- version = "1.0.33";
+ version = "1.0.35";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"; };
+ src = fetchCratesIo { inherit name version; sha256 = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"; };
features = builtins.concatLists [
[ "default" ]
[ "proc-macro" ]
];
dependencies = {
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
};
});
@@ -4037,7 +4371,7 @@ in
[ "std_rng" ]
];
dependencies = {
- ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
rand_chacha = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand_chacha."0.3.1" { inherit profileName; }).out;
rand_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand_core."0.6.4" { inherit profileName; }).out;
};
@@ -4068,7 +4402,7 @@ in
[ "std" ]
];
dependencies = {
- getrandom = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.10" { inherit profileName; }).out;
+ getrandom = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.12" { inherit profileName; }).out;
};
});
@@ -4082,33 +4416,21 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".redox_syscall."0.3.5" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".redox_syscall."0.4.1" = overridableMkRustCrate (profileName: rec {
name = "redox_syscall";
- version = "0.3.5";
+ version = "0.4.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"; };
+ src = fetchCratesIo { inherit name version; sha256 = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"; };
dependencies = {
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/opentelemetry-prometheus" || rootFeatures' ? "garage/prometheus" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_api/metrics" || rootFeatures' ? "garage_api/opentelemetry-prometheus" || rootFeatures' ? "garage_api/prometheus" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "bitflags" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."1.3.2" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".redox_users."0.4.3" = overridableMkRustCrate (profileName: rec {
- name = "redox_users";
- version = "0.4.3";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"; };
- dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "getrandom" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.10" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "syscall" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".redox_syscall."0.2.16" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "thiserror" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.47" { inherit profileName; }).out;
- };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".regex."1.9.4" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".regex."1.10.3" = overridableMkRustCrate (profileName: rec {
name = "regex";
- version = "1.9.4";
+ version = "1.10.3";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "12de2eff854e5fa4b1295edd650e227e9d8fb0c9e90b12e7f36d6a6811791a29"; };
+ src = fetchCratesIo { inherit name version; sha256 = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"; };
features = builtins.concatLists [
[ "default" ]
[ "perf" ]
@@ -4129,10 +4451,10 @@ in
[ "unicode-segment" ]
];
dependencies = {
- aho_corasick = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aho-corasick."1.0.4" { inherit profileName; }).out;
- memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.5.0" { inherit profileName; }).out;
- regex_automata = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-automata."0.3.7" { inherit profileName; }).out;
- regex_syntax = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-syntax."0.7.5" { inherit profileName; }).out;
+ aho_corasick = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aho-corasick."1.1.2" { inherit profileName; }).out;
+ memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.7.1" { inherit profileName; }).out;
+ regex_automata = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-automata."0.4.5" { inherit profileName; }).out;
+ regex_syntax = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-syntax."0.8.2" { inherit profileName; }).out;
};
});
@@ -4151,11 +4473,11 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".regex-automata."0.3.7" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".regex-automata."0.4.5" = overridableMkRustCrate (profileName: rec {
name = "regex-automata";
- version = "0.3.7";
+ version = "0.4.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "49530408a136e16e5b486e883fbb6ba058e8e4e8ae6621a77b048b314336e629"; };
+ src = fetchCratesIo { inherit name version; sha256 = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd"; };
features = builtins.concatLists [
[ "alloc" ]
[ "dfa-onepass" ]
@@ -4181,12 +4503,24 @@ in
[ "unicode-word-boundary" ]
];
dependencies = {
- aho_corasick = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aho-corasick."1.0.4" { inherit profileName; }).out;
- memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.5.0" { inherit profileName; }).out;
- regex_syntax = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-syntax."0.7.5" { inherit profileName; }).out;
+ aho_corasick = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".aho-corasick."1.1.2" { inherit profileName; }).out;
+ memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.7.1" { inherit profileName; }).out;
+ regex_syntax = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex-syntax."0.8.2" { inherit profileName; }).out;
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".regex-lite."0.1.5" = overridableMkRustCrate (profileName: rec {
+ name = "regex-lite";
+ version = "0.1.5";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e"; };
+ features = builtins.concatLists [
+ [ "default" ]
+ [ "std" ]
+ [ "string" ]
+ ];
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".regex-syntax."0.6.29" = overridableMkRustCrate (profileName: rec {
name = "regex-syntax";
version = "0.6.29";
@@ -4205,11 +4539,11 @@ in
];
});
- "registry+https://github.com/rust-lang/crates.io-index".regex-syntax."0.7.5" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".regex-syntax."0.8.2" = overridableMkRustCrate (profileName: rec {
name = "regex-syntax";
- version = "0.7.5";
+ version = "0.8.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"; };
+ src = fetchCratesIo { inherit name version; sha256 = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
@@ -4224,74 +4558,85 @@ in
];
});
- "registry+https://github.com/rust-lang/crates.io-index".reqwest."0.11.20" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".reqwest."0.11.24" = overridableMkRustCrate (profileName: rec {
name = "reqwest";
- version = "0.11.20";
+ version = "0.11.24";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1"; };
+ src = fetchCratesIo { inherit name version; sha256 = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "__rustls")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "__tls")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "hyper-rustls")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "json")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "rustls")
- (lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "rustls-pemfile")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "rustls-tls-manual-roots")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "serde_json")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "tokio-rustls")
];
dependencies = {
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "base64" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.3" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "base64" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "encoding_rs" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".encoding_rs."0.8.33" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "futures_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "futures_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "h2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.3.21" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "http_body" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.5" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "hyper" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "hyper_rustls" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.24.1" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "ipnet" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ipnet."2.8.0" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && hostPlatform.parsed.cpu.name == "wasm32" then "js_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.64" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "futures_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "futures_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "h2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.3.24" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "http_body" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "hyper" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.28" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "hyper_rustls" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-rustls."0.24.2" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "ipnet" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ipnet."2.9.0" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && hostPlatform.parsed.cpu.name == "wasm32" then "js_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.67" { inherit profileName; }).out;
${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "log" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "mime" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".mime."0.3.17" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "percent_encoding" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.0" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "percent_encoding" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "pin_project_lite" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "rustls" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.21.6" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "rustls_pemfile" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pemfile."1.0.3" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "rustls" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.21.10" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "rustls_pemfile" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pemfile."1.0.4" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "serde_urlencoded" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_urlencoded."0.7.1" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "sync_wrapper" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sync_wrapper."0.1.2" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && hostPlatform.parsed.kernel.name == "darwin" then "system_configuration" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".system-configuration."0.5.1" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && !(hostPlatform.parsed.cpu.name == "wasm32") then "tokio_rustls" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.24.1" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "tower_service" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.2" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "url" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".url."2.4.0" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && hostPlatform.parsed.cpu.name == "wasm32" then "wasm_bindgen" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.87" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && hostPlatform.parsed.cpu.name == "wasm32" then "wasm_bindgen_futures" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-futures."0.4.37" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && hostPlatform.parsed.cpu.name == "wasm32" then "web_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".web-sys."0.3.64" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "url" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".url."2.5.0" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && hostPlatform.parsed.cpu.name == "wasm32" then "wasm_bindgen" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.90" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && hostPlatform.parsed.cpu.name == "wasm32" then "wasm_bindgen_futures" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-futures."0.4.40" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && hostPlatform.parsed.cpu.name == "wasm32" then "web_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".web-sys."0.3.67" { inherit profileName; }).out;
${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && hostPlatform.isWindows then "winreg" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winreg."0.50.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".ring."0.16.20" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".rfc6979."0.3.1" = overridableMkRustCrate (profileName: rec {
+ name = "rfc6979";
+ version = "0.3.1";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb"; };
+ dependencies = {
+ crypto_bigint = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crypto-bigint."0.4.9" { inherit profileName; }).out;
+ hmac = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hmac."0.12.1" { inherit profileName; }).out;
+ zeroize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.7.0" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".ring."0.17.7" = overridableMkRustCrate (profileName: rec {
name = "ring";
- version = "0.16.20";
+ version = "0.17.7";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"; };
+ src = fetchCratesIo { inherit name version; sha256 = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
[ "dev_urandom_fallback" ]
- [ "once_cell" ]
];
dependencies = {
- ${ if hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "linux" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "linux" || hostPlatform.parsed.kernel.name == "dragonfly" || hostPlatform.parsed.kernel.name == "freebsd" || hostPlatform.parsed.kernel.name == "illumos" || hostPlatform.parsed.kernel.name == "netbsd" || hostPlatform.parsed.kernel.name == "openbsd" || hostPlatform.parsed.kernel.name == "solaris" then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" || (hostPlatform.parsed.cpu.name == "aarch64" || hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l") && (hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "fuchsia" || hostPlatform.parsed.kernel.name == "linux") then "spin" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".spin."0.5.2" { inherit profileName; }).out;
- untrusted = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".untrusted."0.7.1" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.cpu.name == "wasm32" && hostPlatform.parsed.vendor.name == "unknown" && hostPlatform.parsed.kernel.name == "unknown" && hostPlatform.parsed.abi.name == "" then "web_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".web-sys."0.3.64" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.kernel.name == "windows" then "winapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }).out;
+ getrandom = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.12" { inherit profileName; }).out;
+ ${ if (hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "linux") && (hostPlatform.parsed.cpu.name == "aarch64" || hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l") then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.cpu.name == "aarch64" || hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l" || hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" then "spin" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".spin."0.9.8" { inherit profileName; }).out;
+ untrusted = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".untrusted."0.9.0" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.kernel.name == "windows" then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.48.0" { inherit profileName; }).out;
};
buildDependencies = {
cc = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".cc."1.0.83" { profileName = "__noProfile"; }).out;
@@ -4308,8 +4653,8 @@ in
[ "std" ]
];
dependencies = {
- byteorder = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" { inherit profileName; }).out;
- num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.16" { inherit profileName; }).out;
+ byteorder = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.5.0" { inherit profileName; }).out;
+ num_traits = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-traits."0.2.17" { inherit profileName; }).out;
paste = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".paste."1.0.14" { profileName = "__noProfile"; }).out;
};
});
@@ -4320,43 +4665,40 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a"; };
dependencies = {
- byteorder = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" { inherit profileName; }).out;
+ byteorder = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.5.0" { inherit profileName; }).out;
rmp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp."0.8.12" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".roxmltree."0.18.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".roxmltree."0.19.0" = overridableMkRustCrate (profileName: rec {
name = "roxmltree";
- version = "0.18.0";
+ version = "0.19.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "d8f595a457b6b8c6cda66a48503e92ee8d19342f905948f29c383200ec9eb1d8"; };
+ src = fetchCratesIo { inherit name version; sha256 = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f"; };
features = builtins.concatLists [
[ "default" ]
[ "positions" ]
[ "std" ]
];
- dependencies = {
- xmlparser = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".xmlparser."0.13.5" { inherit profileName; }).out;
- };
});
- "registry+https://github.com/rust-lang/crates.io-index".rusqlite."0.29.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".rusqlite."0.30.0" = overridableMkRustCrate (profileName: rec {
name = "rusqlite";
- version = "0.29.0";
+ version = "0.30.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2"; };
+ src = fetchCratesIo { inherit name version; sha256 = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage_db/bundled-libs") "bundled")
(lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage_db/bundled-libs") "modern_sqlite")
];
dependencies = {
- ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "bitflags" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."2.4.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "fallible_iterator" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fallible-iterator."0.2.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "bitflags" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."2.4.2" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "fallible_iterator" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fallible-iterator."0.3.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "fallible_streaming_iterator" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fallible-streaming-iterator."0.1.9" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "hashlink" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hashlink."0.8.3" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "libsqlite3_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libsqlite3-sys."0.26.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "smallvec" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.11.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "hashlink" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hashlink."0.8.4" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "libsqlite3_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libsqlite3-sys."0.27.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "smallvec" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.13.1" { inherit profileName; }).out;
};
});
@@ -4373,38 +4715,38 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"; };
dependencies = {
- semver = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".semver."1.0.18" { inherit profileName; }).out;
+ semver = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".semver."1.0.21" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".rustix."0.38.9" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".rustix."0.38.31" = overridableMkRustCrate (profileName: rec {
name = "rustix";
- version = "0.38.9";
+ version = "0.38.31";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "9bfe0f2582b4931a45d1fa608f8a8722e8b3c7ac54dd6d5f3b3212791fedef49"; };
+ src = fetchCratesIo { inherit name version; sha256 = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "default")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "alloc")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "default")
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "fs")
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "std")
- (lib.optional (rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "termios")
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "use-libc-auxv")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "std")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "use-libc-auxv")
];
dependencies = {
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger" then "bitflags" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."2.4.0" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") && (!hostPlatform.isWindows && !(hostPlatform.parsed.kernel.name == "linux" && hostPlatform.parsed.cpu.significantByte == "littleEndian" && (hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l" || hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.cpu.bits == 64 || hostPlatform.parsed.cpu.name == "riscv64" || hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" && hostPlatform.parsed.cpu.bits == 64)) || hostPlatform.isWindows) then "libc_errno" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".errno."0.3.2" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") && !hostPlatform.isWindows && !(hostPlatform.parsed.kernel.name == "linux" && hostPlatform.parsed.cpu.significantByte == "littleEndian" && (hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l" || hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.cpu.bits == 64 || hostPlatform.parsed.cpu.name == "riscv64" || hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" && hostPlatform.parsed.cpu.bits == 64)) then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") && (hostPlatform.parsed.kernel.name == "linux" && hostPlatform.parsed.cpu.significantByte == "littleEndian" && (hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l" || hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.cpu.bits == 64 || hostPlatform.parsed.cpu.name == "riscv64" || hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" && hostPlatform.parsed.cpu.bits == 64) || (hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "linux") && !(hostPlatform.parsed.kernel.name == "linux" && hostPlatform.parsed.cpu.significantByte == "littleEndian" && (hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l" || hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.cpu.bits == 64 || hostPlatform.parsed.cpu.name == "riscv64" || hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" && hostPlatform.parsed.cpu.bits == 64))) then "linux_raw_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".linux-raw-sys."0.4.5" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") && hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.48.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "bitflags" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."2.4.2" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && (hostPlatform.parsed.kernel.name == "linux" && hostPlatform.parsed.cpu.significantByte == "littleEndian" && (hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l" || hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.cpu.bits == 64 || hostPlatform.parsed.cpu.name == "riscv64" || hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" && hostPlatform.parsed.cpu.bits == 64) || !hostPlatform.isWindows && !(hostPlatform.parsed.kernel.name == "linux" && hostPlatform.parsed.cpu.significantByte == "littleEndian" && (hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l" || hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.cpu.bits == 64 || hostPlatform.parsed.cpu.name == "riscv64" || hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" && hostPlatform.parsed.cpu.bits == 64)) || hostPlatform.isWindows) then "libc_errno" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".errno."0.3.8" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && (hostPlatform.parsed.kernel.name == "linux" && hostPlatform.parsed.cpu.significantByte == "littleEndian" && (hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l" || hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.cpu.bits == 64 || hostPlatform.parsed.cpu.name == "riscv64" || hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" && hostPlatform.parsed.cpu.bits == 64) || !hostPlatform.isWindows && !(hostPlatform.parsed.kernel.name == "linux" && hostPlatform.parsed.cpu.significantByte == "littleEndian" && (hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l" || hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.cpu.bits == 64 || hostPlatform.parsed.cpu.name == "riscv64" || hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" && hostPlatform.parsed.cpu.bits == 64))) then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && (hostPlatform.parsed.kernel.name == "linux" && hostPlatform.parsed.cpu.significantByte == "littleEndian" && (hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l" || hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.cpu.bits == 64 || hostPlatform.parsed.cpu.name == "riscv64" || hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" && hostPlatform.parsed.cpu.bits == 64) || (hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "linux") && !(hostPlatform.parsed.kernel.name == "linux" && hostPlatform.parsed.cpu.significantByte == "littleEndian" && (hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l" || hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.cpu.bits == 64 || hostPlatform.parsed.cpu.name == "riscv64" || hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" && hostPlatform.parsed.cpu.bits == 64))) then "linux_raw_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".linux-raw-sys."0.4.13" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.52.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".rustls."0.20.8" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".rustls."0.21.10" = overridableMkRustCrate (profileName: rec {
name = "rustls";
- version = "0.20.8";
+ version = "0.21.10";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f"; };
+ src = fetchCratesIo { inherit name version; sha256 = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "dangerous_configuration")
+ (lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/reqwest") "dangerous_configuration")
[ "default" ]
[ "log" ]
[ "logging" ]
@@ -4412,29 +4754,30 @@ in
];
dependencies = {
log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
- ring = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.16.20" { inherit profileName; }).out;
- sct = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sct."0.7.0" { inherit profileName; }).out;
- webpki = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".webpki."0.22.0" { inherit profileName; }).out;
+ ring = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.17.7" { inherit profileName; }).out;
+ webpki = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-webpki."0.101.7" { inherit profileName; }).out;
+ sct = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sct."0.7.1" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".rustls."0.21.6" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".rustls."0.22.2" = overridableMkRustCrate (profileName: rec {
name = "rustls";
- version = "0.21.6";
+ version = "0.22.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb"; };
+ src = fetchCratesIo { inherit name version; sha256 = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "dangerous_configuration")
- (lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "default")
[ "log" ]
[ "logging" ]
+ [ "ring" ]
[ "tls12" ]
];
dependencies = {
log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
- ring = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.16.20" { inherit profileName; }).out;
- webpki = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-webpki."0.101.4" { inherit profileName; }).out;
- sct = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sct."0.7.0" { inherit profileName; }).out;
+ ring = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.17.7" { inherit profileName; }).out;
+ pki_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pki-types."1.2.0" { inherit profileName; }).out;
+ webpki = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-webpki."0.102.2" { inherit profileName; }).out;
+ subtle = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".subtle."2.5.0" { inherit profileName; }).out;
+ zeroize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.7.0" { inherit profileName; }).out;
};
});
@@ -4445,35 +4788,93 @@ in
src = fetchCratesIo { inherit name version; sha256 = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00"; };
dependencies = {
${ if hostPlatform.isUnix && !(hostPlatform.parsed.kernel.name == "darwin") then "openssl_probe" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".openssl-probe."0.1.5" { inherit profileName; }).out;
- rustls_pemfile = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pemfile."1.0.3" { inherit profileName; }).out;
- ${ if hostPlatform.isWindows then "schannel" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".schannel."0.1.22" { inherit profileName; }).out;
+ rustls_pemfile = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pemfile."1.0.4" { inherit profileName; }).out;
+ ${ if hostPlatform.isWindows then "schannel" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".schannel."0.1.23" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.kernel.name == "darwin" then "security_framework" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".security-framework."2.9.2" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".rustls-native-certs."0.7.0" = overridableMkRustCrate (profileName: rec {
+ name = "rustls-native-certs";
+ version = "0.7.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792"; };
+ dependencies = {
+ ${ if hostPlatform.isUnix && !(hostPlatform.parsed.kernel.name == "darwin") then "openssl_probe" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".openssl-probe."0.1.5" { inherit profileName; }).out;
+ rustls_pemfile = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pemfile."2.0.0" { inherit profileName; }).out;
+ pki_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pki-types."1.2.0" { inherit profileName; }).out;
+ ${ if hostPlatform.isWindows then "schannel" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".schannel."0.1.23" { inherit profileName; }).out;
${ if hostPlatform.parsed.kernel.name == "darwin" then "security_framework" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".security-framework."2.9.2" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".rustls-pemfile."1.0.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".rustls-pemfile."1.0.4" = overridableMkRustCrate (profileName: rec {
name = "rustls-pemfile";
- version = "1.0.3";
+ version = "1.0.4";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"; };
+ dependencies = {
+ base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".rustls-pemfile."2.0.0" = overridableMkRustCrate (profileName: rec {
+ name = "rustls-pemfile";
+ version = "2.0.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2"; };
+ src = fetchCratesIo { inherit name version; sha256 = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4"; };
+ features = builtins.concatLists [
+ [ "default" ]
+ [ "std" ]
+ ];
dependencies = {
- base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.3" { inherit profileName; }).out;
+ base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out;
+ pki_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pki-types."1.2.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".rustls-webpki."0.101.4" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".rustls-pki-types."1.2.0" = overridableMkRustCrate (profileName: rec {
+ name = "rustls-pki-types";
+ version = "1.2.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf"; };
+ features = builtins.concatLists [
+ [ "alloc" ]
+ [ "default" ]
+ [ "std" ]
+ ];
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".rustls-webpki."0.101.7" = overridableMkRustCrate (profileName: rec {
name = "rustls-webpki";
- version = "0.101.4";
+ version = "0.101.7";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d"; };
+ src = fetchCratesIo { inherit name version; sha256 = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
[ "std" ]
];
dependencies = {
- ring = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.16.20" { inherit profileName; }).out;
- untrusted = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".untrusted."0.7.1" { inherit profileName; }).out;
+ ring = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.17.7" { inherit profileName; }).out;
+ untrusted = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".untrusted."0.9.0" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".rustls-webpki."0.102.2" = overridableMkRustCrate (profileName: rec {
+ name = "rustls-webpki";
+ version = "0.102.2";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610"; };
+ features = builtins.concatLists [
+ [ "alloc" ]
+ [ "ring" ]
+ [ "std" ]
+ ];
+ dependencies = {
+ ring = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.17.7" { inherit profileName; }).out;
+ pki_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pki-types."1.2.0" { inherit profileName; }).out;
+ untrusted = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".untrusted."0.9.0" { inherit profileName; }).out;
};
});
@@ -4484,11 +4885,11 @@ in
src = fetchCratesIo { inherit name version; sha256 = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.15" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.16" = overridableMkRustCrate (profileName: rec {
name = "ryu";
- version = "1.0.15";
+ version = "1.0.16";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"; };
+ src = fetchCratesIo { inherit name version; sha256 = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"; };
});
"registry+https://github.com/rust-lang/crates.io-index".same-file."1.0.6" = overridableMkRustCrate (profileName: rec {
@@ -4497,46 +4898,46 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"; };
dependencies = {
- ${ if hostPlatform.isWindows then "winapi_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi-util."0.1.5" { inherit profileName; }).out;
+ ${ if hostPlatform.isWindows then "winapi_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi-util."0.1.6" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".schannel."0.1.22" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".schannel."0.1.23" = overridableMkRustCrate (profileName: rec {
name = "schannel";
- version = "0.1.22";
+ version = "0.1.23";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88"; };
+ src = fetchCratesIo { inherit name version; sha256 = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"; };
dependencies = {
- windows_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.48.0" { inherit profileName; }).out;
+ windows_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.52.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".schemars."0.8.12" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".schemars."0.8.16" = overridableMkRustCrate (profileName: rec {
name = "schemars";
- version = "0.8.12";
+ version = "0.8.16";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f"; };
+ src = fetchCratesIo { inherit name version; sha256 = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars") "default")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars") "derive")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars") "schemars_derive")
];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "dyn_clone" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".dyn-clone."1.0.13" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "schemars_derive" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".schemars_derive."0.8.12" { profileName = "__noProfile"; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "dyn_clone" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".dyn-clone."1.0.16" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "schemars_derive" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".schemars_derive."0.8.16" { profileName = "__noProfile"; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".schemars_derive."0.8.12" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".schemars_derive."0.8.16" = overridableMkRustCrate (profileName: rec {
name = "schemars_derive";
- version = "0.8.12";
+ version = "0.8.16";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c"; };
+ src = fetchCratesIo { inherit name version; sha256 = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967"; };
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "serde_derive_internals" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_derive_internals."0.26.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" { inherit profileName; }).out;
};
@@ -4549,14 +4950,40 @@ in
src = fetchCratesIo { inherit name version; sha256 = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".sct."0.7.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".sct."0.7.1" = overridableMkRustCrate (profileName: rec {
name = "sct";
- version = "0.7.0";
+ version = "0.7.1";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414"; };
+ dependencies = {
+ ring = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.17.7" { inherit profileName; }).out;
+ untrusted = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".untrusted."0.9.0" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".sec1."0.3.0" = overridableMkRustCrate (profileName: rec {
+ name = "sec1";
+ version = "0.3.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"; };
+ src = fetchCratesIo { inherit name version; sha256 = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928"; };
+ features = builtins.concatLists [
+ [ "alloc" ]
+ [ "base16ct" ]
+ [ "default" ]
+ [ "der" ]
+ [ "generic-array" ]
+ [ "pkcs8" ]
+ [ "point" ]
+ [ "subtle" ]
+ [ "zeroize" ]
+ ];
dependencies = {
- ring = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.16.20" { inherit profileName; }).out;
- untrusted = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".untrusted."0.7.1" { inherit profileName; }).out;
+ base16ct = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base16ct."0.1.1" { inherit profileName; }).out;
+ der = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".der."0.6.1" { inherit profileName; }).out;
+ generic_array = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".generic-array."0.14.7" { inherit profileName; }).out;
+ pkcs8 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pkcs8."0.9.0" { inherit profileName; }).out;
+ subtle = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".subtle."2.5.0" { inherit profileName; }).out;
+ zeroize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.7.0" { inherit profileName; }).out;
};
});
@@ -4571,8 +4998,8 @@ in
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "serde")
];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "zeroize" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.6.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "zeroize" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zeroize."1.7.0" { inherit profileName; }).out;
};
});
@@ -4587,9 +5014,9 @@ in
];
dependencies = {
bitflags = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."1.3.2" { inherit profileName; }).out;
- core_foundation = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".core-foundation."0.9.3" { inherit profileName; }).out;
- core_foundation_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".core-foundation-sys."0.8.4" { inherit profileName; }).out;
- libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ core_foundation = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".core-foundation."0.9.4" { inherit profileName; }).out;
+ core_foundation_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".core-foundation-sys."0.8.6" { inherit profileName; }).out;
+ libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
security_framework_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".security-framework-sys."2.9.1" { inherit profileName; }).out;
};
});
@@ -4603,27 +5030,27 @@ in
[ "OSX_10_9" ]
];
dependencies = {
- core_foundation_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".core-foundation-sys."0.8.4" { inherit profileName; }).out;
- libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ core_foundation_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".core-foundation-sys."0.8.6" { inherit profileName; }).out;
+ libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".semver."1.0.18" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".semver."1.0.21" = overridableMkRustCrate (profileName: rec {
name = "semver";
- version = "1.0.18";
+ version = "1.0.21";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918"; };
+ src = fetchCratesIo { inherit name version; sha256 = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
];
});
- "registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" = overridableMkRustCrate (profileName: rec {
name = "serde";
- version = "1.0.188";
+ version = "1.0.196";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"; };
+ src = fetchCratesIo { inherit name version; sha256 = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
@@ -4633,7 +5060,7 @@ in
[ "std" ]
];
dependencies = {
- serde_derive = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_derive."1.0.188" { profileName = "__noProfile"; }).out;
+ serde_derive = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_derive."1.0.196" { profileName = "__noProfile"; }).out;
};
});
@@ -4643,37 +5070,37 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c"; };
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "ordered_float" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ordered-float."2.10.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "ordered_float" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ordered-float."2.10.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.12" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".serde_bytes."0.11.14" = overridableMkRustCrate (profileName: rec {
name = "serde_bytes";
- version = "0.11.12";
+ version = "0.11.14";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff"; };
+ src = fetchCratesIo { inherit name version; sha256 = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
];
dependencies = {
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".serde_derive."1.0.188" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".serde_derive."1.0.196" = overridableMkRustCrate (profileName: rec {
name = "serde_derive";
- version = "1.0.188";
+ version = "1.0.196";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"; };
+ src = fetchCratesIo { inherit name version; sha256 = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"; };
features = builtins.concatLists [
[ "default" ]
];
dependencies = {
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.29" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
};
});
@@ -4683,42 +5110,39 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c"; };
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" || rootFeatures' ? "garage_rpc/schemars" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" = overridableMkRustCrate (profileName: rec {
name = "serde_json";
- version = "1.0.105";
+ version = "1.0.113";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360"; };
+ src = fetchCratesIo { inherit name version; sha256 = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "alloc")
[ "default" ]
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "indexmap")
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "preserve_order")
[ "std" ]
];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "indexmap" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".indexmap."2.0.0" { inherit profileName; }).out;
- itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.9" { inherit profileName; }).out;
- ryu = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.15" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
+ itoa = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out;
+ ryu = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.16" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".serde_spanned."0.6.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".serde_spanned."0.6.5" = overridableMkRustCrate (profileName: rec {
name = "serde_spanned";
- version = "0.6.3";
+ version = "0.6.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186"; };
+ src = fetchCratesIo { inherit name version; sha256 = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1"; };
features = builtins.concatLists [
[ "serde" ]
];
dependencies = {
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
};
});
@@ -4728,63 +5152,64 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"; };
dependencies = {
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "form_urlencoded" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "itoa" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.9" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "ryu" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.15" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "form_urlencoded" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "itoa" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "ryu" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.16" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".serde_yaml."0.8.26" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".serde_yaml."0.9.31" = overridableMkRustCrate (profileName: rec {
name = "serde_yaml";
- version = "0.8.26";
+ version = "0.9.31";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b"; };
+ src = fetchCratesIo { inherit name version; sha256 = "adf8a49373e98a4c5f0ceb5d05aa7c648d75f63774981ed95b7c7443bbd50c6e"; };
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "indexmap" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".indexmap."1.9.3" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "ryu" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.15" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "yaml_rust" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".yaml-rust."0.4.5" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "indexmap" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".indexmap."2.2.2" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "itoa" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itoa."1.0.10" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "ryu" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ryu."1.0.16" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "unsafe_libyaml" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unsafe-libyaml."0.2.10" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".sha1."0.10.5" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".sha1."0.10.6" = overridableMkRustCrate (profileName: rec {
name = "sha1";
- version = "0.10.5";
+ version = "0.10.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3"; };
+ src = fetchCratesIo { inherit name version; sha256 = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
];
dependencies = {
cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.cpu.name == "aarch64" || hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" then "cpufeatures" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cpufeatures."0.2.9" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.cpu.name == "aarch64" || hostPlatform.parsed.cpu.name == "i686" || hostPlatform.parsed.cpu.name == "x86_64" then "cpufeatures" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cpufeatures."0.2.12" { inherit profileName; }).out;
digest = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".digest."0.10.7" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.7" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.8" = overridableMkRustCrate (profileName: rec {
name = "sha2";
- version = "0.10.7";
+ version = "0.10.8";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8"; };
+ src = fetchCratesIo { inherit name version; sha256 = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
];
dependencies = {
cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.cpu.name == "aarch64" || hostPlatform.parsed.cpu.name == "x86_64" || hostPlatform.parsed.cpu.name == "i686" then "cpufeatures" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cpufeatures."0.2.9" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.cpu.name == "aarch64" || hostPlatform.parsed.cpu.name == "x86_64" || hostPlatform.parsed.cpu.name == "i686" then "cpufeatures" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cpufeatures."0.2.12" { inherit profileName; }).out;
digest = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".digest."0.10.7" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".sharded-slab."0.1.4" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".sharded-slab."0.1.7" = overridableMkRustCrate (profileName: rec {
name = "sharded-slab";
- version = "0.1.4";
+ version = "0.1.7";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"; };
+ src = fetchCratesIo { inherit name version; sha256 = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"; };
dependencies = {
lazy_static = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }).out;
};
@@ -4796,7 +5221,26 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"; };
dependencies = {
- libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".signature."1.6.4" = overridableMkRustCrate (profileName: rec {
+ name = "signature";
+ version = "1.6.4";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c"; };
+ features = builtins.concatLists [
+ [ "digest" ]
+ [ "digest-preview" ]
+ [ "hazmat-preview" ]
+ [ "rand-preview" ]
+ [ "rand_core" ]
+ [ "std" ]
+ ];
+ dependencies = {
+ digest = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".digest."0.10.7" { inherit profileName; }).out;
+ rand_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand_core."0.6.4" { inherit profileName; }).out;
};
});
@@ -4825,58 +5269,37 @@ in
];
dependencies = {
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "crc32fast" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crc32fast."1.3.2" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "crossbeam_epoch" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-epoch."0.9.15" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "crossbeam_utils" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.16" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "crossbeam_epoch" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-epoch."0.9.18" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "crossbeam_utils" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.19" { inherit profileName; }).out;
${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled") && (hostPlatform.parsed.kernel.name == "linux" || hostPlatform.parsed.kernel.name == "darwin" || hostPlatform.parsed.kernel.name == "windows") then "fs2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fs2."0.4.3" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "fxhash" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fxhash."0.2.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "log" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "parking_lot" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".parking_lot."0.11.2" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".smallvec."1.11.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".smallvec."1.13.1" = overridableMkRustCrate (profileName: rec {
name = "smallvec";
- version = "1.11.0";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"; };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".socket2."0.4.9" = overridableMkRustCrate (profileName: rec {
- name = "socket2";
- version = "0.4.9";
+ version = "1.13.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"; };
- features = builtins.concatLists [
- [ "all" ]
- ];
- dependencies = {
- ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
- ${ if hostPlatform.isWindows then "winapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }).out;
- };
+ src = fetchCratesIo { inherit name version; sha256 = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".socket2."0.5.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".socket2."0.5.5" = overridableMkRustCrate (profileName: rec {
name = "socket2";
- version = "0.5.3";
+ version = "0.5.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877"; };
+ src = fetchCratesIo { inherit name version; sha256 = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"; };
features = builtins.concatLists [
[ "all" ]
];
dependencies = {
- ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
${ if hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.48.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".spin."0.5.2" = overridableMkRustCrate (profileName: rec {
- name = "spin";
- version = "0.5.2";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"; };
- });
-
"registry+https://github.com/rust-lang/crates.io-index".spin."0.9.8" = overridableMkRustCrate (profileName: rec {
name = "spin";
version = "0.9.8";
@@ -4884,10 +5307,26 @@ in
src = fetchCratesIo { inherit name version; sha256 = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"; };
features = builtins.concatLists [
[ "mutex" ]
+ [ "once" ]
[ "spin_mutex" ]
];
});
+ "registry+https://github.com/rust-lang/crates.io-index".spki."0.6.0" = overridableMkRustCrate (profileName: rec {
+ name = "spki";
+ version = "0.6.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b"; };
+ features = builtins.concatLists [
+ [ "alloc" ]
+ [ "base64ct" ]
+ ];
+ dependencies = {
+ base64ct = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64ct."1.6.0" { inherit profileName; }).out;
+ der = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".der."0.6.1" { inherit profileName; }).out;
+ };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".static_init."1.0.3" = overridableMkRustCrate (profileName: rec {
name = "static_init";
version = "1.0.3";
@@ -4898,7 +5337,7 @@ in
];
dependencies = {
bitflags = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."1.3.2" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "linux" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.kernel.name == "android" || hostPlatform.parsed.kernel.name == "linux" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
${ if !(hostPlatform.parsed.kernel.name == "linux" || hostPlatform.parsed.kernel.name == "android") then "parking_lot" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".parking_lot."0.11.2" { inherit profileName; }).out;
${ if !(hostPlatform.parsed.kernel.name == "linux" || hostPlatform.parsed.kernel.name == "android") then "parking_lot_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".parking_lot_core."0.8.6" { inherit profileName; }).out;
static_init_macro = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".static_init_macro."1.0.2" { profileName = "__noProfile"; }).out;
@@ -4915,9 +5354,9 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "70a2595fc3aa78f2d0e45dd425b22282dd863273761cc77780914b2cf3003acf"; };
dependencies = {
- memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.5.0" { inherit profileName; }).out;
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
+ memchr = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".memchr."2.7.1" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" { inherit profileName; }).out;
};
buildDependencies = {
@@ -4952,8 +5391,8 @@ in
dependencies = {
heck = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heck."0.3.3" { inherit profileName; }).out;
proc_macro_error = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro-error."1.0.4" { inherit profileName; }).out;
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" { inherit profileName; }).out;
};
});
@@ -4963,6 +5402,11 @@ in
version = "2.5.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"; };
+ features = builtins.concatLists [
+ [ "default" ]
+ [ "i128" ]
+ [ "std" ]
+ ];
});
"registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" = overridableMkRustCrate (profileName: rec {
@@ -4983,17 +5427,17 @@ in
[ "visit" ]
];
dependencies = {
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- unicode_ident = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-ident."1.0.11" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ unicode_ident = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-ident."1.0.12" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".syn."2.0.29" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" = overridableMkRustCrate (profileName: rec {
name = "syn";
- version = "2.0.29";
+ version = "2.0.48";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a"; };
+ src = fetchCratesIo { inherit name version; sha256 = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"; };
features = builtins.concatLists [
[ "clone-impls" ]
[ "default" ]
@@ -5008,19 +5452,26 @@ in
[ "visit-mut" ]
];
dependencies = {
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- unicode_ident = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-ident."1.0.11" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ unicode_ident = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-ident."1.0.12" { inherit profileName; }).out;
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".sync_wrapper."0.1.2" = overridableMkRustCrate (profileName: rec {
+ name = "sync_wrapper";
+ version = "0.1.2";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"; };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".synchronoise."1.0.1" = overridableMkRustCrate (profileName: rec {
name = "synchronoise";
version = "1.0.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "3dbc01390fc626ce8d1cffe3376ded2b72a11bb70e1c75f404a210e4daa4def2"; };
dependencies = {
- ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "crossbeam_queue" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-queue."0.3.8" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "crossbeam_queue" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-queue."0.3.11" { inherit profileName; }).out;
};
});
@@ -5034,34 +5485,47 @@ in
[ "proc-macro" ]
];
dependencies = {
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" { inherit profileName; }).out;
unicode_xid = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-xid."0.2.4" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".tempfile."3.8.0" = overridableMkRustCrate (profileName: rec {
- name = "tempfile";
- version = "3.8.0";
+ "registry+https://github.com/rust-lang/crates.io-index".system-configuration."0.5.1" = overridableMkRustCrate (profileName: rec {
+ name = "system-configuration";
+ version = "0.5.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef"; };
+ src = fetchCratesIo { inherit name version; sha256 = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"; };
dependencies = {
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "cfg_if" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "fastrand" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."2.0.0" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && hostPlatform.parsed.kernel.name == "redox" then "syscall" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".redox_syscall."0.3.5" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && (hostPlatform.isUnix || hostPlatform.parsed.kernel.name == "wasi") then "rustix" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustix."0.38.9" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.48.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "bitflags" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."1.3.2" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "core_foundation" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".core-foundation."0.9.4" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "system_configuration_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".system-configuration-sys."0.5.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".termcolor."1.2.0" = overridableMkRustCrate (profileName: rec {
- name = "termcolor";
- version = "1.2.0";
+ "registry+https://github.com/rust-lang/crates.io-index".system-configuration-sys."0.5.0" = overridableMkRustCrate (profileName: rec {
+ name = "system-configuration-sys";
+ version = "0.5.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"; };
+ src = fetchCratesIo { inherit name version; sha256 = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"; };
dependencies = {
- ${ if (rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") && hostPlatform.isWindows then "winapi_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi-util."0.1.5" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "core_foundation_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".core-foundation-sys."0.8.6" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".tempfile."3.9.0" = overridableMkRustCrate (profileName: rec {
+ name = "tempfile";
+ version = "3.9.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa"; };
+ dependencies = {
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "cfg_if" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "fastrand" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fastrand."2.0.1" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && hostPlatform.parsed.kernel.name == "redox" then "syscall" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".redox_syscall."0.4.1" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && (hostPlatform.isUnix || hostPlatform.parsed.kernel.name == "wasi") then "rustix" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustix."0.38.31" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.52.0" { inherit profileName; }).out;
};
});
@@ -5071,29 +5535,29 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"; };
dependencies = {
- unicode_width = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-width."0.1.10" { inherit profileName; }).out;
+ unicode_width = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".unicode-width."0.1.11" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.47" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".thiserror."1.0.56" = overridableMkRustCrate (profileName: rec {
name = "thiserror";
- version = "1.0.47";
+ version = "1.0.56";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f"; };
+ src = fetchCratesIo { inherit name version; sha256 = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad"; };
dependencies = {
- thiserror_impl = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror-impl."1.0.47" { profileName = "__noProfile"; }).out;
+ thiserror_impl = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".thiserror-impl."1.0.56" { profileName = "__noProfile"; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".thiserror-impl."1.0.47" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".thiserror-impl."1.0.56" = overridableMkRustCrate (profileName: rec {
name = "thiserror-impl";
- version = "1.0.47";
+ version = "1.0.56";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b"; };
+ src = fetchCratesIo { inherit name version; sha256 = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471"; };
dependencies = {
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.29" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
};
});
@@ -5104,27 +5568,15 @@ in
src = fetchCratesIo { inherit name version; sha256 = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"; };
dependencies = {
cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out;
- };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".time."0.1.45" = overridableMkRustCrate (profileName: rec {
- name = "time";
- version = "0.1.45";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"; };
- dependencies = {
- libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
- ${ if hostPlatform.parsed.kernel.name == "wasi" then "wasi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasi."0.10.0+wasi-snapshot-preview1" { inherit profileName; }).out;
- ${ if hostPlatform.isWindows then "winapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }).out;
+ once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".time."0.3.28" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".time."0.3.34" = overridableMkRustCrate (profileName: rec {
name = "time";
- version = "0.3.28";
+ version = "0.3.34";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48"; };
+ src = fetchCratesIo { inherit name version; sha256 = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
@@ -5132,38 +5584,41 @@ in
[ "std" ]
];
dependencies = {
- deranged = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".deranged."0.3.8" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- time_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time-core."0.1.1" { inherit profileName; }).out;
- time_macros = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".time-macros."0.2.14" { profileName = "__noProfile"; }).out;
+ deranged = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".deranged."0.3.11" { inherit profileName; }).out;
+ num_conv = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-conv."0.1.0" { inherit profileName; }).out;
+ powerfmt = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".powerfmt."0.2.0" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ time_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time-core."0.1.2" { inherit profileName; }).out;
+ time_macros = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".time-macros."0.2.17" { profileName = "__noProfile"; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".time-core."0.1.1" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".time-core."0.1.2" = overridableMkRustCrate (profileName: rec {
name = "time-core";
- version = "0.1.1";
+ version = "0.1.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb"; };
+ src = fetchCratesIo { inherit name version; sha256 = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".time-macros."0.2.14" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".time-macros."0.2.17" = overridableMkRustCrate (profileName: rec {
name = "time-macros";
- version = "0.2.14";
+ version = "0.2.17";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572"; };
+ src = fetchCratesIo { inherit name version; sha256 = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774"; };
features = builtins.concatLists [
[ "parsing" ]
];
dependencies = {
- time_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time-core."0.1.1" { inherit profileName; }).out;
+ num_conv = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num-conv."0.1.0" { inherit profileName; }).out;
+ time_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".time-core."0.1.2" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".timeago."0.4.1" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".timeago."0.4.2" = overridableMkRustCrate (profileName: rec {
name = "timeago";
- version = "0.4.1";
+ version = "0.4.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "5082dc942361cdfb74eab98bf995762d6015e5bb3a20bf7c5c71213778b4fcb4"; };
+ src = fetchCratesIo { inherit name version; sha256 = "a1710e589de0a76aaf295cd47a6699f6405737dbfd3cf2b75c92d000b548d0e6"; };
});
"registry+https://github.com/rust-lang/crates.io-index".tinyvec."1.6.0" = overridableMkRustCrate (profileName: rec {
@@ -5188,17 +5643,17 @@ in
src = fetchCratesIo { inherit name version; sha256 = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" = overridableMkRustCrate (profileName: rec {
name = "tokio";
- version = "1.32.0";
+ version = "1.36.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9"; };
+ src = fetchCratesIo { inherit name version; sha256 = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931"; };
features = builtins.concatLists [
[ "bytes" ]
[ "default" ]
[ "fs" ]
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "full")
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "k2v-client/cli") "io-std")
+ [ "io-std" ]
[ "io-util" ]
[ "libc" ]
[ "macros" ]
@@ -5206,7 +5661,7 @@ in
[ "net" ]
[ "num_cpus" ]
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "parking_lot")
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "process")
+ [ "process" ]
[ "rt" ]
[ "rt-multi-thread" ]
[ "signal" ]
@@ -5219,15 +5674,15 @@ in
];
dependencies = {
${ if false then "backtrace" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".backtrace."0.3.69" { inherit profileName; }).out;
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
- mio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".mio."0.8.8" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ ${ if hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.153" { inherit profileName; }).out;
+ mio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".mio."0.8.10" { inherit profileName; }).out;
num_cpus = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".num_cpus."1.16.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "parking_lot" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".parking_lot."0.12.1" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
${ if hostPlatform.isUnix then "signal_hook_registry" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".signal-hook-registry."1.4.1" { inherit profileName; }).out;
- socket2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.5.3" { inherit profileName; }).out;
- tokio_macros = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-macros."2.1.0" { profileName = "__noProfile"; }).out;
+ socket2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".socket2."0.5.5" { inherit profileName; }).out;
+ tokio_macros = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-macros."2.2.0" { profileName = "__noProfile"; }).out;
${ if hostPlatform.isWindows then "windows_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.48.0" { inherit profileName; }).out;
};
});
@@ -5239,51 +5694,51 @@ in
src = fetchCratesIo { inherit name version; sha256 = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf"; };
dependencies = {
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pin_project_lite" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".tokio-macros."2.1.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".tokio-macros."2.2.0" = overridableMkRustCrate (profileName: rec {
name = "tokio-macros";
- version = "2.1.0";
+ version = "2.2.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"; };
+ src = fetchCratesIo { inherit name version; sha256 = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"; };
dependencies = {
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.29" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.23.4" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.24.1" = overridableMkRustCrate (profileName: rec {
name = "tokio-rustls";
- version = "0.23.4";
+ version = "0.24.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"; };
+ src = fetchCratesIo { inherit name version; sha256 = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"; };
features = builtins.concatLists [
+ (lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "default")
[ "logging" ]
[ "tls12" ]
];
dependencies = {
- rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.20.8" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- webpki = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".webpki."0.22.0" { inherit profileName; }).out;
+ rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.21.10" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.24.1" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".tokio-rustls."0.25.0" = overridableMkRustCrate (profileName: rec {
name = "tokio-rustls";
- version = "0.24.1";
+ version = "0.25.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081"; };
+ src = fetchCratesIo { inherit name version; sha256 = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "default")
[ "logging" ]
[ "tls12" ]
];
dependencies = {
- rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.21.6" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ rustls = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls."0.22.2" { inherit profileName; }).out;
+ pki_types = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustls-pki-types."1.2.0" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
};
});
@@ -5298,9 +5753,9 @@ in
[ "time" ]
];
dependencies = {
- futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
+ futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
};
});
@@ -5314,20 +5769,20 @@ in
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "default")
];
dependencies = {
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "futures_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "futures_sink" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.28" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "futures_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "futures_sink" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.30" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "log" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "pin_project_lite" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.8" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.10" = overridableMkRustCrate (profileName: rec {
name = "tokio-util";
- version = "0.7.8";
+ version = "0.7.10";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d"; };
+ src = fetchCratesIo { inherit name version; sha256 = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"; };
features = builtins.concatLists [
[ "codec" ]
[ "compat" ]
@@ -5339,14 +5794,14 @@ in
[ "tracing" ]
];
dependencies = {
- bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
- futures_io = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.28" { inherit profileName; }).out;
- futures_sink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.28" { inherit profileName; }).out;
+ bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ futures_io = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-io."0.3.30" { inherit profileName; }).out;
+ futures_sink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-sink."0.3.30" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "slab" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".slab."0.4.9" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
@@ -5356,13 +5811,11 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "4fb9d890e4dc9298b70f740f615f2e05b9db37dce531f6b24fb77ac993f9f217"; };
features = builtins.concatLists [
- [ "default" ]
- [ "display" ]
[ "parse" ]
];
dependencies = {
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- serde_spanned = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_spanned."0.6.3" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ serde_spanned = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_spanned."0.6.5" { inherit profileName; }).out;
toml_datetime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".toml_datetime."0.5.1" { inherit profileName; }).out;
toml_edit = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".toml_edit."0.18.1" { inherit profileName; }).out;
};
@@ -5377,7 +5830,7 @@ in
[ "serde" ]
];
dependencies = {
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
};
});
@@ -5393,8 +5846,8 @@ in
dependencies = {
indexmap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".indexmap."1.9.3" { inherit profileName; }).out;
nom8 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".nom8."0.2.0" { inherit profileName; }).out;
- serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out;
- serde_spanned = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_spanned."0.6.3" { inherit profileName; }).out;
+ serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.196" { inherit profileName; }).out;
+ serde_spanned = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_spanned."0.6.5" { inherit profileName; }).out;
toml_datetime = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".toml_datetime."0.5.1" { inherit profileName; }).out;
};
});
@@ -5421,27 +5874,27 @@ in
];
dependencies = {
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "async_stream" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".async-stream."0.3.5" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "async_trait" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" { profileName = "__noProfile"; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "async_trait" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.77" { profileName = "__noProfile"; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "base64" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.13.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "futures_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "futures_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "h2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.3.21" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "http_body" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.5" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "hyper" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "futures_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "futures_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "h2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".h2."0.3.24" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "http_body" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "hyper" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.28" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "hyper_timeout" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper-timeout."0.4.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "percent_encoding" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "pin_project" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.3" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "percent_encoding" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "pin_project" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.4" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "prost1" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".prost."0.9.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "prost_derive" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".prost-derive."0.9.0" { profileName = "__noProfile"; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tokio" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tokio_stream" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-stream."0.1.14" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tokio_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.6.10" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tower" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower."0.4.13" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tower_layer" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-layer."0.3.2" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tower_service" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.2" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tracing_futures" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-futures."0.2.5" { inherit profileName; }).out;
};
});
@@ -5457,9 +5910,9 @@ in
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "transport")
];
dependencies = {
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "prost_build" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".prost-build."0.9.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."1.0.109" { inherit profileName; }).out;
};
});
@@ -5482,12 +5935,11 @@ in
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "limit")
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "load")
[ "log" ]
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "make")
+ [ "make" ]
[ "pin-project" ]
[ "pin-project-lite" ]
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "rand")
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "ready-cache")
- [ "retry" ]
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "slab")
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "timeout")
[ "tokio" ]
@@ -5496,47 +5948,50 @@ in
[ "util" ]
];
dependencies = {
- futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
- futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
+ futures_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "indexmap" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".indexmap."1.9.3" { inherit profileName; }).out;
- pin_project = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.3" { inherit profileName; }).out;
+ pin_project = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.4" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "rand" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.5" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "slab" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".slab."0.4.9" { inherit profileName; }).out;
- tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.8" { inherit profileName; }).out;
+ tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.36.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tokio_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-util."0.7.10" { inherit profileName; }).out;
tower_layer = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-layer."0.3.2" { inherit profileName; }).out;
tower_service = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.2" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".tower-http."0.3.5" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".tower-http."0.4.4" = overridableMkRustCrate (profileName: rec {
name = "tower-http";
- version = "0.3.5";
+ version = "0.4.4";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858"; };
+ src = fetchCratesIo { inherit name version; sha256 = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "auth")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "base64")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "default")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "map-response-body")
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "mime")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "trace")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "tracing")
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "validate-request")
];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "base64" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.13.1" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "bitflags" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."1.3.2" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "futures_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.28" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "futures_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "http_body" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.5" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "base64" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.7" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "bitflags" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."2.4.2" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "bytes" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.5.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "futures_core" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-core."0.3.30" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "futures_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.30" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "http" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.11" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "http_body" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-body."0.4.6" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "http_range_header" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http-range-header."0.3.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "mime" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".mime."0.3.17" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "pin_project_lite" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tower_layer" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-layer."0.3.2" { inherit profileName; }).out;
${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tower_service" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tower-service."0.3.2" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
@@ -5554,11 +6009,11 @@ in
src = fetchCratesIo { inherit name version; sha256 = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" = overridableMkRustCrate (profileName: rec {
name = "tracing";
- version = "0.1.37";
+ version = "0.1.40";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"; };
+ src = fetchCratesIo { inherit name version; sha256 = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"; };
features = builtins.concatLists [
[ "attributes" ]
[ "default" ]
@@ -5567,31 +6022,30 @@ in
[ "tracing-attributes" ]
];
dependencies = {
- cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
pin_project_lite = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project-lite."0.2.13" { inherit profileName; }).out;
- tracing_attributes = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-attributes."0.1.26" { profileName = "__noProfile"; }).out;
- tracing_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-core."0.1.31" { inherit profileName; }).out;
+ tracing_attributes = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-attributes."0.1.27" { profileName = "__noProfile"; }).out;
+ tracing_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-core."0.1.32" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".tracing-attributes."0.1.26" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".tracing-attributes."0.1.27" = overridableMkRustCrate (profileName: rec {
name = "tracing-attributes";
- version = "0.1.26";
+ version = "0.1.27";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab"; };
+ src = fetchCratesIo { inherit name version; sha256 = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"; };
dependencies = {
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.29" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".tracing-core."0.1.31" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".tracing-core."0.1.32" = overridableMkRustCrate (profileName: rec {
name = "tracing-core";
- version = "0.1.31";
+ version = "0.1.32";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"; };
+ src = fetchCratesIo { inherit name version; sha256 = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"; };
features = builtins.concatLists [
[ "default" ]
[ "once_cell" ]
@@ -5599,7 +6053,7 @@ in
[ "valuable" ]
];
dependencies = {
- once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out;
+ once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
${ if false then "valuable" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".valuable."0.1.0" { inherit profileName; }).out;
};
});
@@ -5616,32 +6070,32 @@ in
(lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "std-future")
];
dependencies = {
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "pin_project" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.3" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "pin_project" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.4" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "tracing" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".tracing-log."0.1.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".tracing-log."0.2.0" = overridableMkRustCrate (profileName: rec {
name = "tracing-log";
- version = "0.1.3";
+ version = "0.2.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"; };
+ src = fetchCratesIo { inherit name version; sha256 = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"; };
features = builtins.concatLists [
[ "log-tracer" ]
[ "std" ]
];
dependencies = {
- lazy_static = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }).out;
log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
- tracing_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-core."0.1.31" { inherit profileName; }).out;
+ once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ tracing_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-core."0.1.32" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".tracing-subscriber."0.3.17" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".tracing-subscriber."0.3.18" = overridableMkRustCrate (profileName: rec {
name = "tracing-subscriber";
- version = "0.3.17";
+ version = "0.3.18";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77"; };
+ src = fetchCratesIo { inherit name version; sha256 = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"; };
features = builtins.concatLists [
[ "alloc" ]
[ "ansi" ]
@@ -5663,61 +6117,71 @@ in
dependencies = {
matchers = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".matchers."0.1.0" { inherit profileName; }).out;
nu_ansi_term = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".nu-ansi-term."0.46.0" { inherit profileName; }).out;
- once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out;
- regex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.9.4" { inherit profileName; }).out;
- sharded_slab = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sharded-slab."0.1.4" { inherit profileName; }).out;
- smallvec = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.11.0" { inherit profileName; }).out;
+ once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ regex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".regex."1.10.3" { inherit profileName; }).out;
+ sharded_slab = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sharded-slab."0.1.7" { inherit profileName; }).out;
+ smallvec = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.13.1" { inherit profileName; }).out;
thread_local = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".thread_local."1.1.7" { inherit profileName; }).out;
- tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out;
- tracing_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-core."0.1.31" { inherit profileName; }).out;
- tracing_log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-log."0.1.3" { inherit profileName; }).out;
+ tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.40" { inherit profileName; }).out;
+ tracing_core = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-core."0.1.32" { inherit profileName; }).out;
+ tracing_log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing-log."0.2.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".treediff."3.0.2" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".treediff."4.0.3" = overridableMkRustCrate (profileName: rec {
name = "treediff";
- version = "3.0.2";
+ version = "4.0.3";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "761e8d5ad7ce14bb82b7e61ccc0ca961005a275a060b9644a2431aa11553c2ff"; };
+ src = fetchCratesIo { inherit name version; sha256 = "4d127780145176e2b5d16611cc25a900150e86e9fd79d3bde6ff3a37359c9cb5"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "serde_json")
(lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "with-serde-json")
];
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.113" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".try-lock."0.2.4" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".try-lock."0.2.5" = overridableMkRustCrate (profileName: rec {
name = "try-lock";
- version = "0.2.4";
+ version = "0.2.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"; };
+ src = fetchCratesIo { inherit name version; sha256 = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".typenum."1.16.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".typenum."1.17.0" = overridableMkRustCrate (profileName: rec {
name = "typenum";
- version = "1.16.0";
+ version = "1.17.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"; };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".ucd-trie."0.1.6" = overridableMkRustCrate (profileName: rec {
+ name = "ucd-trie";
+ version = "0.1.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"; };
+ src = fetchCratesIo { inherit name version; sha256 = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"; };
+ features = builtins.concatLists [
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "std")
+ ];
});
- "registry+https://github.com/rust-lang/crates.io-index".unicode-bidi."0.3.13" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".unicode-bidi."0.3.15" = overridableMkRustCrate (profileName: rec {
name = "unicode-bidi";
- version = "0.3.13";
+ version = "0.3.15";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"; };
+ src = fetchCratesIo { inherit name version; sha256 = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"; };
features = builtins.concatLists [
[ "hardcoded-data" ]
[ "std" ]
];
});
- "registry+https://github.com/rust-lang/crates.io-index".unicode-ident."1.0.11" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".unicode-ident."1.0.12" = overridableMkRustCrate (profileName: rec {
name = "unicode-ident";
- version = "1.0.11";
+ version = "1.0.12";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"; };
+ src = fetchCratesIo { inherit name version; sha256 = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"; };
});
"registry+https://github.com/rust-lang/crates.io-index".unicode-normalization."0.1.22" = overridableMkRustCrate (profileName: rec {
@@ -5740,11 +6204,11 @@ in
src = fetchCratesIo { inherit name version; sha256 = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".unicode-width."0.1.10" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".unicode-width."0.1.11" = overridableMkRustCrate (profileName: rec {
name = "unicode-width";
- version = "0.1.10";
+ version = "0.1.11";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"; };
+ src = fetchCratesIo { inherit name version; sha256 = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"; };
features = builtins.concatLists [
[ "default" ]
];
@@ -5760,25 +6224,32 @@ in
];
});
- "registry+https://github.com/rust-lang/crates.io-index".untrusted."0.7.1" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".unsafe-libyaml."0.2.10" = overridableMkRustCrate (profileName: rec {
+ name = "unsafe-libyaml";
+ version = "0.2.10";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b"; };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".untrusted."0.9.0" = overridableMkRustCrate (profileName: rec {
name = "untrusted";
- version = "0.7.1";
+ version = "0.9.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"; };
+ src = fetchCratesIo { inherit name version; sha256 = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".url."2.4.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".url."2.5.0" = overridableMkRustCrate (profileName: rec {
name = "url";
- version = "2.4.0";
+ version = "2.5.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb"; };
+ src = fetchCratesIo { inherit name version; sha256 = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"; };
features = builtins.concatLists [
[ "default" ]
];
dependencies = {
- form_urlencoded = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.0" { inherit profileName; }).out;
- idna = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".idna."0.4.0" { inherit profileName; }).out;
- percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.0" { inherit profileName; }).out;
+ form_urlencoded = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".form_urlencoded."1.2.1" { inherit profileName; }).out;
+ idna = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".idna."0.5.0" { inherit profileName; }).out;
+ percent_encoding = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".percent-encoding."2.3.1" { inherit profileName; }).out;
};
});
@@ -5795,15 +6266,15 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"; };
features = builtins.concatLists [
- (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "default")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "default")
];
});
- "registry+https://github.com/rust-lang/crates.io-index".uuid."1.2.2" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".uuid."1.4.1" = overridableMkRustCrate (profileName: rec {
name = "uuid";
- version = "1.2.2";
+ version = "1.4.1";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c"; };
+ src = fetchCratesIo { inherit name version; sha256 = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d"; };
features = builtins.concatLists [
[ "default" ]
[ "getrandom" ]
@@ -5812,7 +6283,7 @@ in
[ "v4" ]
];
dependencies = {
- getrandom = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.10" { inherit profileName; }).out;
+ getrandom = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.12" { inherit profileName; }).out;
};
});
@@ -5853,14 +6324,14 @@ in
];
});
- "registry+https://github.com/rust-lang/crates.io-index".walkdir."2.3.3" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".walkdir."2.4.0" = overridableMkRustCrate (profileName: rec {
name = "walkdir";
- version = "2.3.3";
+ version = "2.4.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698"; };
+ src = fetchCratesIo { inherit name version; sha256 = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"; };
dependencies = {
same_file = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".same-file."1.0.6" { inherit profileName; }).out;
- ${ if hostPlatform.isWindows then "winapi_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi-util."0.1.5" { inherit profileName; }).out;
+ ${ if hostPlatform.isWindows then "winapi_util" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi-util."0.1.6" { inherit profileName; }).out;
};
});
@@ -5870,21 +6341,10 @@ in
registry = "registry+https://github.com/rust-lang/crates.io-index";
src = fetchCratesIo { inherit name version; sha256 = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"; };
dependencies = {
- try_lock = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".try-lock."0.2.4" { inherit profileName; }).out;
+ try_lock = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".try-lock."0.2.5" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".wasi."0.10.0+wasi-snapshot-preview1" = overridableMkRustCrate (profileName: rec {
- name = "wasi";
- version = "0.10.0+wasi-snapshot-preview1";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"; };
- features = builtins.concatLists [
- [ "default" ]
- [ "std" ]
- ];
- });
-
"registry+https://github.com/rust-lang/crates.io-index".wasi."0.11.0+wasi-snapshot-preview1" = overridableMkRustCrate (profileName: rec {
name = "wasi";
version = "0.11.0+wasi-snapshot-preview1";
@@ -5896,11 +6356,11 @@ in
];
});
- "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.87" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.90" = overridableMkRustCrate (profileName: rec {
name = "wasm-bindgen";
- version = "0.2.87";
+ version = "0.2.90";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342"; };
+ src = fetchCratesIo { inherit name version; sha256 = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406"; };
features = builtins.concatLists [
[ "default" ]
[ "spans" ]
@@ -5908,93 +6368,92 @@ in
];
dependencies = {
cfg_if = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- wasm_bindgen_macro = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-macro."0.2.87" { profileName = "__noProfile"; }).out;
+ wasm_bindgen_macro = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-macro."0.2.90" { profileName = "__noProfile"; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-backend."0.2.87" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-backend."0.2.90" = overridableMkRustCrate (profileName: rec {
name = "wasm-bindgen-backend";
- version = "0.2.87";
+ version = "0.2.90";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd"; };
+ src = fetchCratesIo { inherit name version; sha256 = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd"; };
features = builtins.concatLists [
[ "spans" ]
];
dependencies = {
- bumpalo = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bumpalo."3.13.0" { inherit profileName; }).out;
+ bumpalo = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bumpalo."3.14.0" { inherit profileName; }).out;
log = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".log."0.4.20" { inherit profileName; }).out;
- once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out;
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.29" { inherit profileName; }).out;
- wasm_bindgen_shared = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-shared."0.2.87" { inherit profileName; }).out;
+ once_cell = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
+ wasm_bindgen_shared = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-shared."0.2.90" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-futures."0.4.37" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-futures."0.4.40" = overridableMkRustCrate (profileName: rec {
name = "wasm-bindgen-futures";
- version = "0.4.37";
+ version = "0.4.40";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03"; };
+ src = fetchCratesIo { inherit name version; sha256 = "bde2032aeb86bdfaecc8b261eef3cba735cc426c1f3a3416d1e0791be95fc461"; };
dependencies = {
${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "cfg_if" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "js_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.64" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "wasm_bindgen" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.87" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && builtins.elem "atomics" hostPlatformFeatures then "web_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".web-sys."0.3.64" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "js_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.67" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "wasm_bindgen" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.90" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") && builtins.elem "atomics" hostPlatformFeatures then "web_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".web-sys."0.3.67" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-macro."0.2.87" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-macro."0.2.90" = overridableMkRustCrate (profileName: rec {
name = "wasm-bindgen-macro";
- version = "0.2.87";
+ version = "0.2.90";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d"; };
+ src = fetchCratesIo { inherit name version; sha256 = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999"; };
features = builtins.concatLists [
[ "spans" ]
];
dependencies = {
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- wasm_bindgen_macro_support = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-macro-support."0.2.87" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ wasm_bindgen_macro_support = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-macro-support."0.2.90" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-macro-support."0.2.87" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-macro-support."0.2.90" = overridableMkRustCrate (profileName: rec {
name = "wasm-bindgen-macro-support";
- version = "0.2.87";
+ version = "0.2.90";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b"; };
+ src = fetchCratesIo { inherit name version; sha256 = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7"; };
features = builtins.concatLists [
[ "spans" ]
];
dependencies = {
- proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.66" { inherit profileName; }).out;
- quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.33" { inherit profileName; }).out;
- syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.29" { inherit profileName; }).out;
- wasm_bindgen_backend = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-backend."0.2.87" { inherit profileName; }).out;
- wasm_bindgen_shared = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-shared."0.2.87" { inherit profileName; }).out;
+ proc_macro2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ quote = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ syn = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
+ wasm_bindgen_backend = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-backend."0.2.90" { inherit profileName; }).out;
+ wasm_bindgen_shared = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-shared."0.2.90" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-shared."0.2.87" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen-shared."0.2.90" = overridableMkRustCrate (profileName: rec {
name = "wasm-bindgen-shared";
- version = "0.2.87";
+ version = "0.2.90";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1"; };
+ src = fetchCratesIo { inherit name version; sha256 = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".web-sys."0.3.64" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".web-sys."0.3.67" = overridableMkRustCrate (profileName: rec {
name = "web-sys";
- version = "0.3.64";
+ version = "0.3.67";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b"; };
+ src = fetchCratesIo { inherit name version; sha256 = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "AbortController")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "AbortSignal")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "Blob")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "BlobPropertyBag")
- [ "Crypto" ]
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "Event")
- [ "EventTarget" ]
+ (lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "EventTarget")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "File")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "FormData")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "Headers")
@@ -6006,40 +6465,26 @@ in
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "RequestMode")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "Response")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "ServiceWorkerGlobalScope")
- [ "Window" ]
+ (lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "Window")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "Worker")
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "WorkerGlobalScope")
];
dependencies = {
- js_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.64" { inherit profileName; }).out;
- wasm_bindgen = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.87" { inherit profileName; }).out;
- };
- });
-
- "registry+https://github.com/rust-lang/crates.io-index".webpki."0.22.0" = overridableMkRustCrate (profileName: rec {
- name = "webpki";
- version = "0.22.0";
- registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd"; };
- features = builtins.concatLists [
- [ "alloc" ]
- [ "std" ]
- ];
- dependencies = {
- ring = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ring."0.16.20" { inherit profileName; }).out;
- untrusted = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".untrusted."0.7.1" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "js_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".js-sys."0.3.67" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest" then "wasm_bindgen" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".wasm-bindgen."0.2.90" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".which."4.4.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".which."4.4.2" = overridableMkRustCrate (profileName: rec {
name = "which";
- version = "4.4.0";
+ version = "4.4.2";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"; };
+ src = fetchCratesIo { inherit name version; sha256 = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"; };
dependencies = {
${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "either" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".either."1.9.0" { inherit profileName; }).out;
- ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
- ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && hostPlatform.isWindows then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && (hostPlatform.isWindows || hostPlatform.isUnix || hostPlatform.parsed.kernel.name == "redox") then "home" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".home."0.5.9" { inherit profileName; }).out;
+ ${ if (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") && hostPlatform.isWindows then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.19.0" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "rustix" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rustix."0.38.31" { inherit profileName; }).out;
};
});
@@ -6053,29 +6498,19 @@ in
[ "errhandlingapi" ]
[ "fileapi" ]
[ "handleapi" ]
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "knownfolders")
- [ "minwinbase" ]
[ "minwindef" ]
- [ "ntdef" ]
- [ "ntsecapi" ]
[ "ntstatus" ]
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "objbase")
[ "processenv" ]
(lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled") "processthreadsapi")
- [ "profileapi" ]
- (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "shlobj")
[ "std" ]
[ "synchapi" ]
[ "sysinfoapi" ]
- [ "timezoneapi" ]
[ "winbase" ]
[ "wincon" ]
[ "winerror" ]
[ "winnt" ]
[ "winsock2" ]
[ "ws2ipdef" ]
- [ "ws2tcpip" ]
- [ "wtypesbase" ]
];
dependencies = {
${ if hostPlatform.config == "i686-pc-windows-gnu" then "winapi_i686_pc_windows_gnu" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi-i686-pc-windows-gnu."0.4.0" { inherit profileName; }).out;
@@ -6090,11 +6525,11 @@ in
src = fetchCratesIo { inherit name version; sha256 = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".winapi-util."0.1.5" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".winapi-util."0.1.6" = overridableMkRustCrate (profileName: rec {
name = "winapi-util";
- version = "0.1.5";
+ version = "0.1.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"; };
+ src = fetchCratesIo { inherit name version; sha256 = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"; };
dependencies = {
${ if hostPlatform.isWindows then "winapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }).out;
};
@@ -6107,17 +6542,16 @@ in
src = fetchCratesIo { inherit name version; sha256 = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"; };
});
- "registry+https://github.com/rust-lang/crates.io-index".windows."0.48.0" = overridableMkRustCrate (profileName: rec {
- name = "windows";
- version = "0.48.0";
+ "registry+https://github.com/rust-lang/crates.io-index".windows-core."0.52.0" = overridableMkRustCrate (profileName: rec {
+ name = "windows-core";
+ version = "0.52.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"; };
+ src = fetchCratesIo { inherit name version; sha256 = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"; };
features = builtins.concatLists [
- [ "Globalization" ]
[ "default" ]
];
dependencies = {
- windows_targets = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-targets."0.48.5" { inherit profileName; }).out;
+ windows_targets = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-targets."0.52.0" { inherit profileName; }).out;
};
});
@@ -6129,23 +6563,16 @@ in
features = builtins.concatLists [
[ "Win32" ]
[ "Win32_Foundation" ]
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "Win32_NetworkManagement")
- (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "Win32_NetworkManagement_IpHelper")
[ "Win32_Networking" ]
[ "Win32_Networking_WinSock" ]
[ "Win32_Security" ]
- [ "Win32_Security_Authentication" ]
- [ "Win32_Security_Authentication_Identity" ]
- [ "Win32_Security_Credentials" ]
- [ "Win32_Security_Cryptography" ]
[ "Win32_Storage" ]
[ "Win32_Storage_FileSystem" ]
[ "Win32_System" ]
[ "Win32_System_Console" ]
- (lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "Win32_System_Diagnostics")
- (lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "Win32_System_Diagnostics_Debug")
+ (lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "Win32_System_Diagnostics")
+ (lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "Win32_System_Diagnostics_Debug")
[ "Win32_System_IO" ]
- [ "Win32_System_Memory" ]
[ "Win32_System_Pipes" ]
(lib.optional (rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/reqwest") "Win32_System_Registry")
[ "Win32_System_SystemServices" ]
@@ -6159,6 +6586,41 @@ in
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".windows-sys."0.52.0" = overridableMkRustCrate (profileName: rec {
+ name = "windows-sys";
+ version = "0.52.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"; };
+ features = builtins.concatLists [
+ [ "Win32" ]
+ [ "Win32_Foundation" ]
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "Win32_NetworkManagement")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "Win32_NetworkManagement_IpHelper")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "Win32_Networking")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "Win32_Networking_WinSock")
+ [ "Win32_Security" ]
+ [ "Win32_Security_Authentication" ]
+ [ "Win32_Security_Authentication_Identity" ]
+ [ "Win32_Security_Credentials" ]
+ [ "Win32_Security_Cryptography" ]
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "Win32_Storage")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "Win32_Storage_FileSystem")
+ [ "Win32_System" ]
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "Win32_System_Com")
+ (lib.optional (rootFeatures' ? "k2v-client/clap" || rootFeatures' ? "k2v-client/cli") "Win32_System_Console")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "Win32_System_Diagnostics")
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "Win32_System_Diagnostics_Debug")
+ [ "Win32_System_Memory" ]
+ (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "Win32_System_Threading")
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "Win32_UI")
+ (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "Win32_UI_Shell")
+ [ "default" ]
+ ];
+ dependencies = {
+ windows_targets = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows-targets."0.52.0" { inherit profileName; }).out;
+ };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".windows-targets."0.48.5" = overridableMkRustCrate (profileName: rec {
name = "windows-targets";
version = "0.48.5";
@@ -6175,6 +6637,22 @@ in
};
});
+ "registry+https://github.com/rust-lang/crates.io-index".windows-targets."0.52.0" = overridableMkRustCrate (profileName: rec {
+ name = "windows-targets";
+ version = "0.52.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"; };
+ dependencies = {
+ ${ if hostPlatform.config == "aarch64-pc-windows-gnullvm" then "windows_aarch64_gnullvm" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows_aarch64_gnullvm."0.52.0" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.cpu.name == "aarch64" && hostPlatform.parsed.abi.name == "msvc" then "windows_aarch64_msvc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows_aarch64_msvc."0.52.0" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.cpu.name == "i686" && hostPlatform.parsed.abi.name == "gnu" then "windows_i686_gnu" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows_i686_gnu."0.52.0" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.cpu.name == "i686" && hostPlatform.parsed.abi.name == "msvc" then "windows_i686_msvc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows_i686_msvc."0.52.0" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.cpu.name == "x86_64" && hostPlatform.parsed.abi.name == "gnu" then "windows_x86_64_gnu" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows_x86_64_gnu."0.52.0" { inherit profileName; }).out;
+ ${ if hostPlatform.config == "x86_64-pc-windows-gnullvm" then "windows_x86_64_gnullvm" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows_x86_64_gnullvm."0.52.0" { inherit profileName; }).out;
+ ${ if hostPlatform.parsed.cpu.name == "x86_64" && hostPlatform.parsed.abi.name == "msvc" then "windows_x86_64_msvc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".windows_x86_64_msvc."0.52.0" { inherit profileName; }).out;
+ };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".windows_aarch64_gnullvm."0.48.5" = overridableMkRustCrate (profileName: rec {
name = "windows_aarch64_gnullvm";
version = "0.48.5";
@@ -6182,6 +6660,13 @@ in
src = fetchCratesIo { inherit name version; sha256 = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"; };
});
+ "registry+https://github.com/rust-lang/crates.io-index".windows_aarch64_gnullvm."0.52.0" = overridableMkRustCrate (profileName: rec {
+ name = "windows_aarch64_gnullvm";
+ version = "0.52.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"; };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".windows_aarch64_msvc."0.48.5" = overridableMkRustCrate (profileName: rec {
name = "windows_aarch64_msvc";
version = "0.48.5";
@@ -6189,6 +6674,13 @@ in
src = fetchCratesIo { inherit name version; sha256 = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"; };
});
+ "registry+https://github.com/rust-lang/crates.io-index".windows_aarch64_msvc."0.52.0" = overridableMkRustCrate (profileName: rec {
+ name = "windows_aarch64_msvc";
+ version = "0.52.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"; };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".windows_i686_gnu."0.48.5" = overridableMkRustCrate (profileName: rec {
name = "windows_i686_gnu";
version = "0.48.5";
@@ -6196,6 +6688,13 @@ in
src = fetchCratesIo { inherit name version; sha256 = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"; };
});
+ "registry+https://github.com/rust-lang/crates.io-index".windows_i686_gnu."0.52.0" = overridableMkRustCrate (profileName: rec {
+ name = "windows_i686_gnu";
+ version = "0.52.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"; };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".windows_i686_msvc."0.48.5" = overridableMkRustCrate (profileName: rec {
name = "windows_i686_msvc";
version = "0.48.5";
@@ -6203,6 +6702,13 @@ in
src = fetchCratesIo { inherit name version; sha256 = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"; };
});
+ "registry+https://github.com/rust-lang/crates.io-index".windows_i686_msvc."0.52.0" = overridableMkRustCrate (profileName: rec {
+ name = "windows_i686_msvc";
+ version = "0.52.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"; };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".windows_x86_64_gnu."0.48.5" = overridableMkRustCrate (profileName: rec {
name = "windows_x86_64_gnu";
version = "0.48.5";
@@ -6210,6 +6716,13 @@ in
src = fetchCratesIo { inherit name version; sha256 = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"; };
});
+ "registry+https://github.com/rust-lang/crates.io-index".windows_x86_64_gnu."0.52.0" = overridableMkRustCrate (profileName: rec {
+ name = "windows_x86_64_gnu";
+ version = "0.52.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"; };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".windows_x86_64_gnullvm."0.48.5" = overridableMkRustCrate (profileName: rec {
name = "windows_x86_64_gnullvm";
version = "0.48.5";
@@ -6217,6 +6730,13 @@ in
src = fetchCratesIo { inherit name version; sha256 = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"; };
});
+ "registry+https://github.com/rust-lang/crates.io-index".windows_x86_64_gnullvm."0.52.0" = overridableMkRustCrate (profileName: rec {
+ name = "windows_x86_64_gnullvm";
+ version = "0.52.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"; };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".windows_x86_64_msvc."0.48.5" = overridableMkRustCrate (profileName: rec {
name = "windows_x86_64_msvc";
version = "0.48.5";
@@ -6224,6 +6744,13 @@ in
src = fetchCratesIo { inherit name version; sha256 = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"; };
});
+ "registry+https://github.com/rust-lang/crates.io-index".windows_x86_64_msvc."0.52.0" = overridableMkRustCrate (profileName: rec {
+ name = "windows_x86_64_msvc";
+ version = "0.52.0";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"; };
+ });
+
"registry+https://github.com/rust-lang/crates.io-index".winreg."0.50.0" = overridableMkRustCrate (profileName: rec {
name = "winreg";
version = "0.50.0";
@@ -6235,91 +6762,102 @@ in
};
});
- "registry+https://github.com/rust-lang/crates.io-index".xmlparser."0.13.5" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".xmlparser."0.13.6" = overridableMkRustCrate (profileName: rec {
name = "xmlparser";
- version = "0.13.5";
+ version = "0.13.6";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd"; };
+ src = fetchCratesIo { inherit name version; sha256 = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4"; };
features = builtins.concatLists [
[ "default" ]
[ "std" ]
];
});
- "registry+https://github.com/rust-lang/crates.io-index".xxhash-rust."0.8.6" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".xxhash-rust."0.8.8" = overridableMkRustCrate (profileName: rec {
name = "xxhash-rust";
- version = "0.8.6";
+ version = "0.8.8";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "735a71d46c4d68d71d4b24d03fdc2b98e38cea81730595801db779c04fe80d70"; };
+ src = fetchCratesIo { inherit name version; sha256 = "53be06678ed9e83edb1745eb72efc0bbcd7b5c3c35711a860906aed827a13d61"; };
features = builtins.concatLists [
[ "xxh3" ]
];
});
- "registry+https://github.com/rust-lang/crates.io-index".yaml-rust."0.4.5" = overridableMkRustCrate (profileName: rec {
- name = "yaml-rust";
- version = "0.4.5";
+ "registry+https://github.com/rust-lang/crates.io-index".zerocopy."0.7.32" = overridableMkRustCrate (profileName: rec {
+ name = "zerocopy";
+ version = "0.7.32";
+ registry = "registry+https://github.com/rust-lang/crates.io-index";
+ src = fetchCratesIo { inherit name version; sha256 = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"; };
+ features = builtins.concatLists [
+ (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "simd")
+ ];
+ dependencies = {
+ ${ if false then "zerocopy_derive" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".zerocopy-derive."0.7.32" { profileName = "__noProfile"; }).out;
+ };
+ });
+
+ "registry+https://github.com/rust-lang/crates.io-index".zerocopy-derive."0.7.32" = overridableMkRustCrate (profileName: rec {
+ name = "zerocopy-derive";
+ version = "0.7.32";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"; };
+ src = fetchCratesIo { inherit name version; sha256 = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"; };
dependencies = {
- ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "linked_hash_map" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".linked-hash-map."0.5.6" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "proc_macro2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".proc-macro2."1.0.78" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "quote" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".quote."1.0.35" { inherit profileName; }).out;
+ ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "syn" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".syn."2.0.48" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".zeroize."1.6.0" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".zeroize."1.7.0" = overridableMkRustCrate (profileName: rec {
name = "zeroize";
- version = "1.6.0";
+ version = "1.7.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"; };
+ src = fetchCratesIo { inherit name version; sha256 = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"; };
features = builtins.concatLists [
[ "alloc" ]
[ "default" ]
];
});
- "registry+https://github.com/rust-lang/crates.io-index".zstd."0.12.4" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".zstd."0.13.0" = overridableMkRustCrate (profileName: rec {
name = "zstd";
- version = "0.12.4";
+ version = "0.13.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c"; };
+ src = fetchCratesIo { inherit name version; sha256 = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/system-libs" || rootFeatures' ? "garage_block/system-libs") "pkg-config")
];
dependencies = {
- zstd_safe = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zstd-safe."6.0.6" { inherit profileName; }).out;
+ zstd_safe = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zstd-safe."7.0.0" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".zstd-safe."6.0.6" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".zstd-safe."7.0.0" = overridableMkRustCrate (profileName: rec {
name = "zstd-safe";
- version = "6.0.6";
+ version = "7.0.0";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581"; };
+ src = fetchCratesIo { inherit name version; sha256 = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/system-libs" || rootFeatures' ? "garage_block/system-libs") "pkg-config")
[ "std" ]
];
dependencies = {
- libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
- zstd_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zstd-sys."2.0.8+zstd.1.5.5" { inherit profileName; }).out;
+ zstd_sys = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".zstd-sys."2.0.9+zstd.1.5.5" { inherit profileName; }).out;
};
});
- "registry+https://github.com/rust-lang/crates.io-index".zstd-sys."2.0.8+zstd.1.5.5" = overridableMkRustCrate (profileName: rec {
+ "registry+https://github.com/rust-lang/crates.io-index".zstd-sys."2.0.9+zstd.1.5.5" = overridableMkRustCrate (profileName: rec {
name = "zstd-sys";
- version = "2.0.8+zstd.1.5.5";
+ version = "2.0.9+zstd.1.5.5";
registry = "registry+https://github.com/rust-lang/crates.io-index";
- src = fetchCratesIo { inherit name version; sha256 = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c"; };
+ src = fetchCratesIo { inherit name version; sha256 = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656"; };
features = builtins.concatLists [
(lib.optional (rootFeatures' ? "garage/system-libs" || rootFeatures' ? "garage_block/system-libs") "pkg-config")
[ "std" ]
];
- dependencies = {
- libc = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out;
- };
buildDependencies = {
cc = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".cc."1.0.83" { profileName = "__noProfile"; }).out;
- pkg_config = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.27" { profileName = "__noProfile"; }).out;
+ pkg_config = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.29" { profileName = "__noProfile"; }).out;
};
});
diff --git a/Cargo.toml b/Cargo.toml
index 5982859c..cb9c4ee3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -17,6 +17,8 @@ members = [
default-members = ["src/garage"]
[workspace.dependencies]
+
+# Internal Garage crates
format_table = { version = "0.1.1", path = "src/format-table" }
garage_api = { version = "0.10.0", path = "src/api" }
garage_block = { version = "0.10.0", path = "src/block" }
@@ -28,8 +30,112 @@ garage_util = { version = "0.10.0", path = "src/util" }
garage_web = { version = "0.10.0", path = "src/web" }
k2v-client = { version = "0.0.4", path = "src/k2v-client" }
+# Netapp is a special sister crate
+netapp = { version = "0.10", features = ["telemetry"] }
+
+# External crates from crates.io
+arc-swap = "1.0"
+async-trait = "0.1.7"
+backtrace = "0.3"
+base64 = "0.21"
+blake2 = "0.10"
+bytes = "1.0"
+bytesize = "1.1"
+chrono = "0.4"
+crypto-common = "0.1"
+digest = "0.10"
+err-derive = "0.3"
+gethostname = "0.4"
+git-version = "0.3.4"
+hex = "0.4"
+hexdump = "0.1"
+hmac = "0.12"
+idna = "0.5"
+itertools = "0.12"
+lazy_static = "1.4"
+md-5 = "0.10"
+mktemp = "0.5"
+nix = { version = "0.27", default-features = false, features = ["fs"] }
+nom = "7.1"
+parse_duration = "2.1"
+pin-project = "1.0.12"
+pnet_datalink = "0.34"
+rand = "0.8"
+sha2 = "0.10"
+sodiumoxide = { version = "0.2.5-0", package = "kuska-sodiumoxide" }
+timeago = { version = "0.4", default-features = false }
+xxhash-rust = { version = "0.8", default-features = false, features = ["xxh3"] }
+
+clap = { version = "4.1", features = ["derive", "env"] }
+pretty_env_logger = "0.5"
+structopt = { version = "0.3", default-features = false }
+tracing = "0.1"
+tracing-subscriber = { version = "0.3", features = ["env-filter"] }
+
+heed = { version = "0.11", default-features = false, features = ["lmdb"] }
+rusqlite = "0.30.0"
+sled = "0.34"
+
+async-compression = { version = "0.4", features = ["tokio", "zstd"] }
+zstd = { version = "0.13", default-features = false }
+
+quick-xml = { version = "0.26", features = [ "serialize" ] }
+rmp-serde = "1.1.2"
+serde = { version = "1.0", default-features = false, features = ["derive", "rc"] }
+serde_bytes = "0.11"
+serde_json = "1.0"
+toml = { versio = "0.8", default-features = false, features = ["parse"] }
+
+# newer version requires rust edition 2021
+k8s-openapi = { version = "0.21", features = ["v1_24"] }
+kube = { version = "0.88", default-features = false, features = ["runtime", "derive", "client", "rustls-tls"] }
+schemars = "0.8"
+reqwest = { version = "0.11", default-features = false, features = ["rustls-tls-manual-roots", "json"] }
+
+form_urlencoded = "1.0.0"
+http = "1.0"
+httpdate = "1.0"
+http-range = "0.1"
+http-body-util = "0.1"
+hyper = { version = "1.0", features = ["server", "http1"] }
+hyper-util = { version = "0.1", features = [ "full" ] }
+multer = "3.0"
+percent-encoding = "2.2"
+roxmltree = "0.19"
+url = "2.3"
+
+futures = "0.3"
+futures-util = "0.3"
+tokio = { version = "1.0", default-features = false, features = ["rt", "rt-multi-thread", "io-util", "net", "time", "macros", "sync", "signal", "fs"] }
+tokio-util = { version = "0.7", features = ["io"] }
+tokio-stream = { version = "0.1", features = ["net"] }
+
+opentelemetry = { version = "0.17", features = [ "rt-tokio", "metrics", "trace" ] }
+opentelemetry-prometheus = "0.10"
+opentelemetry-otlp = "0.10"
+prometheus = "0.13"
+
+# used by the k2v-client crate only
+aws-sigv4 = {version = "1.1" }
+hyper-rustls = { version = "0.26", features = ["http2"] }
+log = "0.4"
+thiserror = "1.0"
+
+# ---- used only as build / dev dependencies ----
+assert-json-diff = "2.0"
+rustc_version = "0.4.0"
+static_init = "1.0"
+
+aws-config = "1.1.4"
+aws-sdk-config = "1.13"
+aws-sdk-s3 = "1.14"
+
[profile.dev]
+#lto = "thin" # disabled for now, adds 2-4 min to each CI build
lto = "off"
[profile.release]
-debug = true
+lto = true
+codegen-units = 1
+opt-level = "s"
+strip = true
diff --git a/README.md b/README.md
index 9992fff2..a0f082a5 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-Garage [![Build Status](https://drone.deuxfleurs.fr/api/badges/Deuxfleurs/garage/status.svg?ref=refs/heads/main)](https://drone.deuxfleurs.fr/Deuxfleurs/garage)
+Garage [![status-badge](https://woodpecker.deuxfleurs.fr/api/badges/1/status.svg)](https://woodpecker.deuxfleurs.fr/repos/1)
===
<p align="center" style="text-align:center;">
diff --git a/doc/book/connect/apps/index.md b/doc/book/connect/apps/index.md
index f67a29c9..c8571fac 100644
--- a/doc/book/connect/apps/index.md
+++ b/doc/book/connect/apps/index.md
@@ -146,7 +146,7 @@ Keep the Key ID and the Secret key in a pad, they will be needed later.
We need two buckets, one for normal videos (named peertube-video) and one for webtorrent videos (named peertube-playlist).
```bash
-garage bucket create peertube-video
+garage bucket create peertube-videos
garage bucket create peertube-playlist
```
@@ -216,7 +216,7 @@ object_storage:
# Same settings but for webtorrent videos
videos:
- bucket_name: 'peertube-video'
+ bucket_name: 'peertube-videos'
prefix: ''
# You must fill this field to make Peertube use our reverse proxy/website logic
base_url: 'http://peertube-videos.web.garage.localhost'
diff --git a/doc/book/cookbook/real-world.md b/doc/book/cookbook/real-world.md
index ea4ce1f9..ce0abddd 100644
--- a/doc/book/cookbook/real-world.md
+++ b/doc/book/cookbook/real-world.md
@@ -85,14 +85,14 @@ to store 2 TB of data in total.
## Get a Docker image
Our docker image is currently named `dxflrs/garage` and is stored on the [Docker Hub](https://hub.docker.com/r/dxflrs/garage/tags?page=1&ordering=last_updated).
-We encourage you to use a fixed tag (eg. `v0.9.0`) and not the `latest` tag.
-For this example, we will use the latest published version at the time of the writing which is `v0.9.0` but it's up to you
+We encourage you to use a fixed tag (eg. `v0.9.1`) and not the `latest` tag.
+For this example, we will use the latest published version at the time of the writing which is `v0.9.1` but it's up to you
to check [the most recent versions on the Docker Hub](https://hub.docker.com/r/dxflrs/garage/tags?page=1&ordering=last_updated).
For example:
```
-sudo docker pull dxflrs/garage:v0.9.0
+sudo docker pull dxflrs/garage:v0.9.1
```
## Deploying and configuring Garage
@@ -157,7 +157,7 @@ docker run \
-v /etc/garage.toml:/etc/garage.toml \
-v /var/lib/garage/meta:/var/lib/garage/meta \
-v /var/lib/garage/data:/var/lib/garage/data \
- dxflrs/garage:v0.9.0
+ dxflrs/garage:v0.9.1
```
With this command line, Garage should be started automatically at each boot.
@@ -171,7 +171,7 @@ If you want to use `docker-compose`, you may use the following `docker-compose.y
version: "3"
services:
garage:
- image: dxflrs/garage:v0.9.0
+ image: dxflrs/garage:v0.9.1
network_mode: "host"
restart: unless-stopped
volumes:
diff --git a/doc/book/design/goals.md b/doc/book/design/goals.md
index 78ac7978..4efb6349 100644
--- a/doc/book/design/goals.md
+++ b/doc/book/design/goals.md
@@ -48,7 +48,5 @@ locations. They use Garage themselves for the following tasks:
- As a backup target using `rclone` and `restic`
-- In the Drone continuous integration platform to store task logs
-
The Deuxfleurs Garage cluster is a multi-site cluster currently composed of
9 nodes in 3 physical locations.
diff --git a/doc/book/development/devenv.md b/doc/book/development/devenv.md
index dd3bdec0..88f8ba06 100644
--- a/doc/book/development/devenv.md
+++ b/doc/book/development/devenv.md
@@ -80,7 +80,7 @@ nix-build \
--git_version $(git rev-parse HEAD)
```
-*The result is located in `result/bin`. You can pass arguments to cross compile: check `.drone.yml` for examples.*
+*The result is located in `result/bin`. You can pass arguments to cross compile: check `.woodpecker/release.yml` for examples.*
If you modify a `Cargo.toml` or regenerate any `Cargo.lock`, you must run `cargo2nix`:
diff --git a/doc/book/development/miscellaneous-notes.md b/doc/book/development/miscellaneous-notes.md
index f0083ae5..a421943f 100644
--- a/doc/book/development/miscellaneous-notes.md
+++ b/doc/book/development/miscellaneous-notes.md
@@ -81,12 +81,9 @@ Our cache will be checked.
- http://www.lpenz.org/articles/nixchannel/index.html
-## Drone
+## Woodpecker
-Do not try to set a build as trusted from the interface or the CLI tool,
-your request would be ignored. Instead, directly edit the database (table `repos`, column `repo_trusted`).
-
-Drone can do parallelism both at the step and the pipeline level. At the step level, parallelism is restricted to the same runner.
+Woodpecker can do parallelism both at the step and the pipeline level. At the step level, parallelism is restricted to the same runner.
## Building Docker containers
@@ -99,3 +96,4 @@ We were:
- Unable to use the kaniko container provided by Google as we can't run arbitrary logic: we need to put our secret in .docker/config.json.
Finally we chose to build kaniko through nix and use it in a `nix-shell`.
+We then switched to using kaniko from nixpkgs when it was packaged.
diff --git a/doc/book/development/release-process.md b/doc/book/development/release-process.md
index 3fed4add..0c6701c0 100644
--- a/doc/book/development/release-process.md
+++ b/doc/book/development/release-process.md
@@ -42,7 +42,7 @@ and the docker containers on Docker Hub.
## Automation
-We automated our release process with Nix and Drone to make it more reliable.
+We automated our release process with Nix and Woodpecker to make it more reliable.
Here we describe how we have done in case you want to debug or improve it.
### Caching build steps
@@ -62,52 +62,31 @@ Sending to the cache is done through `nix copy`, for example:
nix copy --to 's3://nix?endpoint=garage.deuxfleurs.fr&region=garage&secret-key=/etc/nix/signing-key.sec' result
```
-*Note that you need the signing key. In our case, it is stored as a secret in Drone.*
+*The signing key possessed by the Garage maintainers is required to update the Nix cache.*
-The previous command will only send the built packet and not its dependencies.
-To send its dependency, a tool named `nix-copy-closure` has been created but it is not compatible with the S3 protocol.
-
-Instead, you can use the following commands to list all the runtime dependencies:
+The previous command will only send the built package and not its dependencies.
+In the case of our CI pipeline, we want to cache all intermediate build steps
+as well. This can be done using this quite involved command (here as an example
+for the `pkgs.amd64.relase` package):
```bash
-nix copy \
- --to 's3://nix?endpoint=garage.deuxfleurs.fr&region=garage&secret-key=/etc/nix/signing-key.sec' \
- $(nix-store -qR result/)
+nix copy -j8 \
+ --to 's3://nix?endpoint=garage.deuxfleurs.fr&region=garage&secret-key=/etc/nix/nix-signing-key.sec' \
+ $(nix path-info pkgs.amd64.release --file default.nix --derivation --recursive | sed 's/\.drv$/.drv^*/')
```
-*We could also write this expression with xargs but this tool is not available in our container.*
-
-But in certain cases, we want to cache compile time dependencies also.
-For example, the Nix project does not provide binaries for cross compiling to i686 and thus we need to compile gcc on our own.
-We do not want to compile gcc each time, so even if it is a compile time dependency, we want to cache it.
+This command will simultaneously build all of the required Nix paths (using at
+most 8 parallel Nix builder jobs) and send the resulting objects to the cache.
-This time, the command is a bit more involved:
-
-```bash
-nix copy --to \
- 's3://nix?endpoint=garage.deuxfleurs.fr&region=garage&secret-key=/etc/nix/signing-key.sec' \
- $(nix-store -qR --include-outputs \
- $(nix-instantiate))
-```
-
-This is the command we use in our CI as we expect the final binary to change, so we mainly focus on
-caching our development dependencies.
-
-*Currently there is no automatic garbage collection of the cache: we should monitor its growth.
-Hopefully, we can erase it totally without breaking any build, the next build will only be slower.*
-
-In practise, we concluded that we do not want to cache all the compilation dependencies.
-Instead, we want to cache the toolchain we use to build Garage each time we change it.
-So we removed from Drone any automatic update of the cache and instead handle them manually with:
+This can be run for all the Garage packages we build using the following command:
```
source ~/.awsrc
-nix-shell --run 'refresh_toolchain'
+nix-shell --attr cache --run 'refresh_cache'
```
-Internally, it will run `nix-build` on `nix/toolchain.nix` and send the output plus its depedencies to the cache.
-
-To erase the cache:
+We don't automate this step at each CI build, as *there is currently no automatic garbage collection of the cache.*
+This means we should also monitor the cache's size; if it ever becomes too big we can erase it with:
```
mc rm --recursive --force 'garage/nix/'
@@ -157,9 +136,9 @@ nix-shell --run refresh_index
If you want to compile for different architectures, you will need to repeat all these commands for each architecture.
-**In practise, and except for debugging, you will never directly run these commands. Release is handled by drone**
+**In practice, and except for debugging, you will never directly run these commands. Release is handled by Woodpecker.**
-### Drone
+### Drone (obsolete)
Our instance is available at [https://drone.deuxfleurs.fr](https://drone.deuxfleurs.fr).
You need an account on [https://git.deuxfleurs.fr](https://git.deuxfleurs.fr) to use it.
diff --git a/doc/book/operations/durability-repairs.md b/doc/book/operations/durability-repairs.md
index b0d2c78a..578899a8 100644
--- a/doc/book/operations/durability-repairs.md
+++ b/doc/book/operations/durability-repairs.md
@@ -49,7 +49,7 @@ verifications. Of course, scrubbing the entire data store will also take longer.
## Block check and resync
In some cases, nodes hold a reference to a block but do not actually have the block
-stored on disk. Conversely, they may also have on disk blocks that are not referenced
+stored on disk. Conversely, they may also have on-disk blocks that are not referenced
any more. To fix both cases, a block repair may be run with `garage repair blocks`.
This will scan the entire block reference counter table to check that the blocks
exist on disk, and will scan the entire disk store to check that stored blocks
@@ -95,7 +95,7 @@ using the `garage block purge` command.
In [multi-HDD setups](@/documentation/operations/multi-hdd.md), to ensure that
data blocks are well balanced between storage locations, you may run a
-rebalance operation using `garage repair rebalance`. This is usefull when
+rebalance operation using `garage repair rebalance`. This is useful when
adding storage locations or when capacities of the storage locations have been
changed. Once this is finished, Garage will know for each block of a single
possible location where it can be, which can increase access speed. This
diff --git a/doc/book/operations/layout.md b/doc/book/operations/layout.md
index ee05aba1..cf1372b0 100644
--- a/doc/book/operations/layout.md
+++ b/doc/book/operations/layout.md
@@ -13,7 +13,7 @@ In Garage, all of the data that can be stored in a given cluster is divided
into slices which we call *partitions*. Each partition is stored by
one or several nodes in the cluster
(see [`replication_mode`](@/documentation/reference-manual/configuration.md#replication_mode)).
-The layout determines the correspondence between these partition,
+The layout determines the correspondence between these partitions,
which exist on a logical level, and actual storage nodes.
## How cluster layouts work in Garage
@@ -94,10 +94,10 @@ follow the following recommendations:
## Understanding unexpected layout calculations
When adding, removing or modifying nodes in a cluster layout, sometimes
-unexpected assigntations of partitions to node can occur. These assignations
-are in fact normal and logical, given the objectives of the algorihtm. Indeed,
-**the layout algorithm prioritizes moving less data between nodes over the fact
-of achieving equal distribution of load. It also tries to use all links between
+unexpected assignations of partitions to node can occur. These assignations
+are in fact normal and logical, given the objectives of the algorithm. Indeed,
+**the layout algorithm prioritizes moving less data between nodes over
+achieving equal distribution of load. It also tries to use all links between
pairs of nodes in equal proportions when moving data.** This section presents
two examples and illustrates how one can control Garage's behavior to obtain
the desired results.
@@ -270,5 +270,5 @@ that is moved to node1).
This illustrates the second principle of the layout computation: **if there is
a choice in moving data out of some nodes, then all links between pairs of
nodes are used in equal proportions** (this is approximately true, there is
-randomness in the algorihtm to achieve this so there might be some small
+randomness in the algorithm to achieve this so there might be some small
fluctuations, as we see above).
diff --git a/doc/book/operations/upgrading.md b/doc/book/operations/upgrading.md
index 9a738282..6b6ea26d 100644
--- a/doc/book/operations/upgrading.md
+++ b/doc/book/operations/upgrading.md
@@ -9,7 +9,7 @@ On a new version release, there is 2 possibilities:
- protocols and data structures remained the same ➡️ this is a **minor upgrade**
- protocols or data structures changed ➡️ this is a **major upgrade**
-You can quickly now what type of update you will have to operate by looking at the version identifier:
+You can quickly know what type of update you will have to operate by looking at the version identifier:
when we require our users to do a major upgrade, we will always bump the first nonzero component of the version identifier
(e.g. from v0.7.2 to v0.8.0).
Conversely, for versions that only require a minor upgrade, the first nonzero component will always stay the same (e.g. from v0.8.0 to v0.8.1).
diff --git a/doc/book/quick-start/_index.md b/doc/book/quick-start/_index.md
index 1b129f36..cf6eabde 100644
--- a/doc/book/quick-start/_index.md
+++ b/doc/book/quick-start/_index.md
@@ -110,10 +110,11 @@ garage -c path/to/garage.toml server
If you have placed the `garage.toml` file in `/etc` (its default location), you can simply run `garage server`.
-You can tune Garage's verbosity as follows (from less verbose to more verbose):
+You can tune Garage's verbosity by setting the `RUST_LOG=` environment variable. \
+Available log levels are (from less verbose to more verbose): `error`, `warn`, `info` *(default)*, `debug` and `trace`.
-```
-RUST_LOG=garage=info garage server
+```bash
+RUST_LOG=garage=info garage server # default
RUST_LOG=garage=debug garage server
RUST_LOG=garage=trace garage server
```
diff --git a/doc/book/reference-manual/configuration.md b/doc/book/reference-manual/configuration.md
index 18d160bb..5e12a7da 100644
--- a/doc/book/reference-manual/configuration.md
+++ b/doc/book/reference-manual/configuration.md
@@ -394,7 +394,7 @@ Compression is done synchronously, setting a value too high will add latency to
This value can be different between nodes, compression is done by the node which receive the
API call.
-#### `rpc_secret`, `rpc_secret_file` or `GARAGE_RPC_SECRET` (env) {#rpc_secret}
+#### `rpc_secret`, `rpc_secret_file` or `GARAGE_RPC_SECRET`, `GARAGE_RPC_SECRET_FILE` (env) {#rpc_secret}
Garage uses a secret key, called an RPC secret, that is shared between all
nodes of the cluster in order to identify these nodes and allow them to
@@ -406,6 +406,9 @@ Since Garage `v0.8.2`, the RPC secret can also be stored in a file whose path is
given in the configuration variable `rpc_secret_file`, or specified as an
environment variable `GARAGE_RPC_SECRET`.
+Since Garage `v0.8.5` and `v0.9.1`, you can also specify the path of a file
+storing the secret as the `GARAGE_RPC_SECRET_FILE` environment variable.
+
#### `rpc_bind_addr` {#rpc_bind_addr}
The address and port on which to bind for inter-cluster communcations
@@ -438,6 +441,17 @@ be obtained by running `garage node id` and then included directly in the
key will be returned by `garage node id` and you will have to add the IP
yourself.
+### `allow_world_readable_secrets`
+
+Garage checks the permissions of your secret files to make sure they're not
+world-readable. In some cases, the check might fail and consider your files as
+world-readable even if they're not, for instance when using Posix ACLs.
+
+Setting `allow_world_readable_secrets` to `true` bypass this
+permission verification.
+
+Alternatively, you can set the `GARAGE_ALLOW_WORLD_READABLE_SECRETS`
+environment variable to `true` to bypass the permissions check.
### The `[consul_discovery]` section
@@ -583,7 +597,7 @@ See [administration API reference](@/documentation/reference-manual/admin-api.md
Alternatively, since `v0.8.5`, a path can be used to create a unix socket. Note that for security reasons,
the socket will have 0220 mode. Make sure to set user and group permissions accordingly.
-#### `metrics_token`, `metrics_token_file` or `GARAGE_METRICS_TOKEN` (env) {#admin_metrics_token}
+#### `metrics_token`, `metrics_token_file` or `GARAGE_METRICS_TOKEN`, `GARAGE_METRICS_TOKEN_FILE` (env) {#admin_metrics_token}
The token for accessing the Metrics endpoint. If this token is not set, the
Metrics endpoint can be accessed without access control.
@@ -593,8 +607,9 @@ You can use any random string for this value. We recommend generating a random t
`metrics_token` was introduced in Garage `v0.7.2`.
`metrics_token_file` and the `GARAGE_METRICS_TOKEN` environment variable are supported since Garage `v0.8.2`.
+`GARAGE_METRICS_TOKEN_FILE` is supported since `v0.8.5` / `v0.9.1`.
-#### `admin_token`, `admin_token_file` or `GARAGE_ADMIN_TOKEN` (env) {#admin_token}
+#### `admin_token`, `admin_token_file` or `GARAGE_ADMIN_TOKEN`, `GARAGE_ADMIN_TOKEN_FILE` (env) {#admin_token}
The token for accessing all of the other administration endpoints. If this
token is not set, access to these endpoints is disabled entirely.
@@ -604,6 +619,7 @@ You can use any random string for this value. We recommend generating a random t
`admin_token` was introduced in Garage `v0.7.2`.
`admin_token_file` and the `GARAGE_ADMIN_TOKEN` environment variable are supported since Garage `v0.8.2`.
+`GARAGE_ADMIN_TOKEN_FILE` is supported since `v0.8.5` / `v0.9.1`.
#### `trace_sink` {#admin_trace_sink}
diff --git a/doc/talks/2024-01-12-seed/.gitignore b/doc/talks/2024-01-12-seed/.gitignore
new file mode 100644
index 00000000..b7e0ced2
--- /dev/null
+++ b/doc/talks/2024-01-12-seed/.gitignore
@@ -0,0 +1,10 @@
+*
+
+!*.txt
+!*.md
+!*.tex
+
+!talk.pdf
+!Makefile
+!.gitignore
+
diff --git a/doc/talks/2024-01-12-seed/Makefile b/doc/talks/2024-01-12-seed/Makefile
new file mode 100644
index 00000000..5f0befbe
--- /dev/null
+++ b/doc/talks/2024-01-12-seed/Makefile
@@ -0,0 +1,10 @@
+ASSETS=../assets/deuxfleurs.pdf
+
+talk.pdf: talk.tex $(ASSETS)
+ pdflatex talk.tex
+
+assets/%.pdf: assets/%.svg
+ inkscape -D -z --file=$^ --export-pdf=$@
+
+assets/%.pdf_tex: assets/%.svg
+ inkscape -D -z --file=$^ --export-pdf=$@ --export-latex
diff --git a/doc/talks/2024-01-12-seed/talk.pdf b/doc/talks/2024-01-12-seed/talk.pdf
new file mode 100644
index 00000000..85c3bcde
--- /dev/null
+++ b/doc/talks/2024-01-12-seed/talk.pdf
Binary files differ
diff --git a/doc/talks/2024-01-12-seed/talk.tex b/doc/talks/2024-01-12-seed/talk.tex
new file mode 100644
index 00000000..cd6c4681
--- /dev/null
+++ b/doc/talks/2024-01-12-seed/talk.tex
@@ -0,0 +1,370 @@
+\nonstopmode
+\documentclass[aspectratio=169]{beamer}
+\usepackage[utf8]{inputenc}
+% \usepackage[frenchb]{babel}
+\usepackage{amsmath}
+\usepackage{mathtools}
+\usepackage{breqn}
+\usepackage{multirow}
+\usetheme{boxes}
+\usepackage{graphicx}
+\usepackage{import}
+\usepackage{adjustbox}
+%\useoutertheme[footline=authortitle,subsection=false]{miniframes}
+%\useoutertheme[footline=authorinstitute,subsection=false]{miniframes}
+\useoutertheme{infolines}
+\setbeamertemplate{headline}{}
+
+\beamertemplatenavigationsymbolsempty
+
+\definecolor{TitleOrange}{RGB}{255,137,0}
+\setbeamercolor{title}{fg=TitleOrange}
+\setbeamercolor{frametitle}{fg=TitleOrange}
+
+\definecolor{ListOrange}{RGB}{255,145,5}
+\setbeamertemplate{itemize item}{\color{ListOrange}$\blacktriangleright$}
+
+\definecolor{verygrey}{RGB}{70,70,70}
+\setbeamercolor{normal text}{fg=verygrey}
+
+
+\usepackage{tabu}
+\usepackage{multicol}
+\usepackage{vwcol}
+\usepackage{stmaryrd}
+\usepackage{graphicx}
+
+\usepackage[normalem]{ulem}
+
+\AtBeginSection[]{
+ \begin{frame}
+ \vfill
+ \centering
+ \begin{beamercolorbox}[sep=8pt,center,shadow=true,rounded=true]{title}
+ \usebeamerfont{title}\insertsectionhead\par%
+ \end{beamercolorbox}
+ \vfill
+ \end{frame}
+}
+
+\title{Garage}
+\subtitle{a lightweight and robust geo-distributed data storage system}
+\author{Alex Auvolat, Deuxfleurs}
+\date{SEED webinar, 2024-01-12}
+
+\begin{document}
+
+% \begin{frame}
+% \centering
+% \includegraphics[width=.3\linewidth]{../../sticker/Garage.png}
+% \vspace{1em}
+%
+% {\large\bf Alex Auvolat, Deuxfleurs Association}
+% \vspace{1em}
+%
+% \url{https://garagehq.deuxfleurs.fr/}
+%
+% %Matrix channel: \texttt{\#garage:deuxfleurs.fr}
+% \end{frame}
+
+\begin{frame}
+ %\frametitle{Who I am}
+ \begin{columns}[t]
+ \begin{column}{.2\textwidth}
+ \centering
+ \adjincludegraphics[width=.4\linewidth, valign=t]{../assets/alex.jpg}
+ \end{column}
+ \begin{column}{.6\textwidth}
+ \textbf{Alex Auvolat}\\
+ Member of Deuxfleurs, lead developer of Garage
+ \end{column}
+ \begin{column}{.2\textwidth}
+ ~
+ \end{column}
+ \end{columns}
+ \vspace{.5em}
+
+ \begin{columns}[t]
+ \begin{column}{.2\textwidth}
+ \centering
+ \adjincludegraphics[width=.6\linewidth, valign=t]{../../logo/garage-notext.png}
+ \end{column}
+ \begin{column}{.6\textwidth}
+ \\\textbf{Garage}\\
+ A self-hosted alternative to S3 for object storage
+ \end{column}
+ \begin{column}{.2\textwidth}
+ ~
+ \end{column}
+ \end{columns}
+ \vspace{2em}
+
+ \begin{columns}[t]
+ \begin{column}{.2\textwidth}
+ \centering
+ \adjincludegraphics[width=.5\linewidth, valign=t]{../assets/deuxfleurs.pdf}
+ \end{column}
+ \begin{column}{.6\textwidth}
+ \textbf{Deuxfleurs}\\
+ A non-profit self-hosting collective,\\
+ member of the CHATONS network
+ \end{column}
+ \begin{column}{.2\textwidth}
+ \centering
+ \adjincludegraphics[width=.7\linewidth, valign=t]{../assets/logo_chatons.png}
+ \end{column}
+ \end{columns}
+
+\end{frame}
+
+\begin{frame}
+ \frametitle{Stable vs Resilient}
+
+ \hspace{1em}
+ \begin{minipage}{7cm}
+ \textbf{Building a "stable" system:}
+ \vspace{1em}
+
+ Enterprise-grade systems typically employ:
+ \vspace{1em}
+ \begin{itemize}
+ \item RAID
+ \item Redundant power grid + UPS
+ \item Redundant Internet connections
+ \item Low-latency links
+ \item ...
+ \end{itemize}
+ \vspace{1em}
+ $\to$ costly, only worth at DC scale\\
+ $\to$ still risk of DC-level incident...
+ \end{minipage}
+ \hfill
+ \begin{minipage}{7cm}
+ \textbf{Building a \underline{resilient} system:}
+ \vspace{1em}
+
+ An alternative, cheaper way:
+ \vspace{1em}
+ \begin{itemize}
+ \item Commodity hardware \\(e.g. old desktop PCs)
+ \vspace{.5em}
+ \item Commodity Internet \\(e.g. FTTB, FTTH) and power grid
+ \vspace{.5em}
+ \item \textbf{Geographical redundancy} \\(multi-site replication)
+ \end{itemize}
+ \vspace{1.5em}
+ \end{minipage}
+ \hspace{1em}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Example: our infrastructure at Deuxfleurs}
+ \only<1>{
+ \begin{center}
+ \includegraphics[width=.8\linewidth]{../assets/neptune.jpg}
+ \end{center}
+ }
+ \only<2>{
+ \begin{center}
+ \includegraphics[width=.8\linewidth]{../assets/atuin.jpg}
+ \end{center}
+ }
+ \only<3>{
+ \begin{center}
+ \includegraphics[width=.8\linewidth]{../assets/inframap_jdll2023.pdf}
+ \end{center}
+ }
+\end{frame}
+
+\begin{frame}
+ \frametitle{Object storage: simpler than file systems}
+
+ \begin{minipage}{6cm}
+ Only two operations:
+ \vspace{1em}
+ \begin{itemize}
+ \item Put an object at a key
+ \vspace{1em}
+ \item Retrieve an object from its key
+ \end{itemize}
+ \vspace{1em}
+ {\footnotesize (and a few others)}
+
+ \vspace{1em}
+ Sufficient for many applications!
+ \end{minipage}
+ \hfill
+ \begin{minipage}{8cm}
+ \begin{center}
+ \vspace{2em}
+ \includegraphics[height=6em]{../2020-12-02_wide-team/img/Amazon-S3.jpg}
+ \hspace{2em}
+ \includegraphics[height=5em]{../assets/minio.png}
+
+ \vspace{2em}
+ \includegraphics[height=6em]{../../logo/garage_hires_crop.png}
+ \end{center}
+ \vspace{1em}
+ \end{minipage}
+\end{frame}
+
+
+\begin{frame}
+ \frametitle{The data model of object storage}
+ Object storage is basically a key-value store:
+ \vspace{1em}
+
+ \begin{center}
+ \begin{tabular}{|l|p{8cm}|}
+ \hline
+ \textbf{Key: file path + name} & \textbf{Value: file data + metadata} \\
+ \hline
+ \hline
+ \texttt{index.html} &
+ \texttt{Content-Type: text/html; charset=utf-8} \newline
+ \texttt{Content-Length: 24929} \newline
+ \texttt{<binary blob>} \\
+ \hline
+ \texttt{img/logo.svg} &
+ \texttt{Content-Type: text/svg+xml} \newline
+ \texttt{Content-Length: 13429} \newline
+ \texttt{<binary blob>} \\
+ \hline
+ \texttt{download/index.html} &
+ \texttt{Content-Type: text/html; charset=utf-8} \newline
+ \texttt{Content-Length: 26563} \newline
+ \texttt{<binary blob>} \\
+ \hline
+ \end{tabular}
+ \end{center}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Implementation: consensus vs weak consistency}
+
+ \hspace{1em}
+ \begin{minipage}{7cm}
+ \textbf{Consensus-based systems:}
+ \vspace{1em}
+ \begin{itemize}
+ \item \textbf{Leader-based:} a leader is elected to coordinate
+ all reads and writes
+ \vspace{1em}
+ \item Allows for \textbf{sequential reasoning}:
+ program as if running on a single machine
+ \vspace{1em}
+ \item Serializability is one of the \\
+ \textbf{strongest consistency guarantees}
+ \vspace{1em}
+ \item \textbf{Costly}, the leader is a bottleneck;
+ leader elections on failure take time
+ \end{itemize}
+ \end{minipage}
+ \hfill
+ \begin{minipage}{7cm} \visible<2->{
+ \textbf{Weakly consistent systems:}
+ \vspace{1em}
+ \begin{itemize}
+ \item \textbf{Nodes are equivalent}, any node
+ can originate a read or write operation
+ \vspace{1em}
+ \item \textbf{Operations must be independent},
+ conflicts are resolved after the fact
+ \vspace{1em}
+ \item Strongest achievable consistency:\\
+ \textbf{read-after-write consistency}\\(using quorums)
+ \vspace{1em}
+ \item \textbf{Fast}, no single bottleneck;\\
+ works transparently with offline nodes
+ \end{itemize}
+ } \end{minipage}
+ \hspace{1em}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Why avoid consensus?}
+ Consensus can be implemented reasonably well in practice, so why avoid it?
+ \vspace{2em}
+ \begin{itemize}
+ \item \textbf{Software complexity:} RAFT and PAXOS are complex beasts;\\
+ harder to prove, harder to reason about
+ \vspace{1.5em}
+ \item \textbf{Performance issues:}
+ \vspace{1em}
+ \begin{itemize}
+ \item Taking a decision may take an \textbf{arbitrary number of steps} (in adverse scenarios)
+ \vspace{1em}
+ \item The leader is a \textbf{bottleneck} for all requests;\\
+ even in leaderless approaches, \textbf{all nodes must process all operations in order}
+ \vspace{1em}
+ \item Particularly \textbf{sensitive to higher latency} between nodes
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Objective: the right level of consistency for Garage}
+
+ \underline{Constraints:} slow network (geographical distance), node unavailability/crashes\\
+ \underline{Objective:} maximize availability, maintain an \emph{appropriate level of consistency}\\
+ \vspace{1em}
+ \begin{enumerate}
+ \item<2-> \textbf{Weak consistency for most things}\\
+ \vspace{1em}
+ \underline{Example:} \texttt{PutObject}\\
+ \vspace{.5em}
+ If two clients write the same
+ object at the same time, one of the two is implicitly overwritten.
+ No need to coordinate, use a \emph{last-writer-wins register}.
+ \vspace{1em}
+ \item<3-> \textbf{Stronger consistency only when necessary}\\
+ \vspace{1em}
+ \underline{Example:} \texttt{CreateBucket}\\
+ \vspace{.5em}
+ A bucket is a reserved name in a shared namespace,
+ two clients should be prevented from both creating the same bucket
+ (\emph{mutual exclusion}).
+ \end{enumerate}
+\end{frame}
+
+\begin{frame}
+ \frametitle{The possibility of \emph{leaderless consensus}}
+ Currently, Garage \emph{only has weak consistency}. Is fast, but \texttt{CreateBucket} is broken!
+
+ \visible<2->{
+ \vspace{1em}
+ Leaderless consensus (Antoniadis et al., 2023) alleviates issues with RAFT and PAXOS:
+ \vspace{1em}
+ \begin{itemize}
+ \item \textbf{No leader.} All nodes participate equally at each time step,
+ and different nodes can be unavailable at different times without issues.
+ \\ \vspace{.5em} $\to$ better tolerance to the high latency (remove bottleneck issue)
+ \\ $\to$ tolerates crash transparently
+ \vspace{1em}
+ \item \textbf{Simpler formalization.} The algorithm is very simple to express and to analyze in mathematical terms.
+ \end{itemize}
+ }
+ \visible<3->{
+ \vspace{1em}
+ One of the possible subjects for this PhD:
+ \\$\to$ \emph{integration of leaderless consensus in Garage} + testing + perf eval, etc.
+ }
+\end{frame}
+
+\begin{frame}
+ \begin{center}
+ \includegraphics[width=.25\linewidth]{../../logo/garage_hires.png}\\
+ \vspace{-1em}
+ \url{https://garagehq.deuxfleurs.fr/}\\
+ \url{mailto:garagehq@deuxfleurs.fr}\\
+ \texttt{\#garage:deuxfleurs.fr} on Matrix
+
+ \vspace{1.5em}
+ \includegraphics[width=.06\linewidth]{../assets/rust_logo.png}
+ \includegraphics[width=.13\linewidth]{../assets/AGPLv3_Logo.png}
+ \end{center}
+\end{frame}
+
+\end{document}
+
+%% vim: set ts=4 sw=4 tw=0 noet spelllang=en :
diff --git a/doc/talks/2024-02-03-fosdem/.gitignore b/doc/talks/2024-02-03-fosdem/.gitignore
new file mode 100644
index 00000000..9f1f00e6
--- /dev/null
+++ b/doc/talks/2024-02-03-fosdem/.gitignore
@@ -0,0 +1,17 @@
+*
+
+!*.txt
+!*.md
+
+!assets
+
+!.gitignore
+!*.svg
+!*.png
+!*.jpg
+!*.tex
+!Makefile
+!.gitignore
+!assets/*.drawio.pdf
+
+!talk.pdf
diff --git a/doc/talks/2024-02-03-fosdem/Makefile b/doc/talks/2024-02-03-fosdem/Makefile
new file mode 100644
index 00000000..f0aae6a8
--- /dev/null
+++ b/doc/talks/2024-02-03-fosdem/Makefile
@@ -0,0 +1,19 @@
+ASSETS=../assets/lattice/lattice1.pdf_tex \
+ ../assets/lattice/lattice2.pdf_tex \
+ ../assets/lattice/lattice3.pdf_tex \
+ ../assets/lattice/lattice4.pdf_tex \
+ ../assets/lattice/lattice5.pdf_tex \
+ ../assets/lattice/lattice6.pdf_tex \
+ ../assets/lattice/lattice7.pdf_tex \
+ ../assets/lattice/lattice8.pdf_tex \
+ ../assets/logos/deuxfleurs.pdf \
+ ../assets/timeline-22-24.pdf
+
+talk.pdf: talk.tex $(ASSETS)
+ pdflatex talk.tex
+
+%.pdf: %.svg
+ inkscape -D -z --file=$^ --export-pdf=$@
+
+%.pdf_tex: %.svg
+ inkscape -D -z --file=$^ --export-pdf=$@ --export-latex
diff --git a/doc/talks/2024-02-03-fosdem/talk.pdf b/doc/talks/2024-02-03-fosdem/talk.pdf
new file mode 100644
index 00000000..ef3f5c81
--- /dev/null
+++ b/doc/talks/2024-02-03-fosdem/talk.pdf
Binary files differ
diff --git a/doc/talks/2024-02-03-fosdem/talk.tex b/doc/talks/2024-02-03-fosdem/talk.tex
new file mode 100644
index 00000000..b36bf893
--- /dev/null
+++ b/doc/talks/2024-02-03-fosdem/talk.tex
@@ -0,0 +1,764 @@
+\nonstopmode
+\documentclass[aspectratio=169,xcolor={svgnames}]{beamer}
+\usepackage[utf8]{inputenc}
+% \usepackage[frenchb]{babel}
+\usepackage{amsmath}
+\usepackage{mathtools}
+\usepackage{breqn}
+\usepackage{multirow}
+\usetheme{boxes}
+\usepackage{graphicx}
+\usepackage{import}
+\usepackage{adjustbox}
+\usepackage[absolute,overlay]{textpos}
+%\useoutertheme[footline=authortitle,subsection=false]{miniframes}
+%\useoutertheme[footline=authorinstitute,subsection=false]{miniframes}
+\useoutertheme{infolines}
+\setbeamertemplate{headline}{}
+
+\beamertemplatenavigationsymbolsempty
+
+\definecolor{TitleOrange}{RGB}{255,137,0}
+\setbeamercolor{title}{fg=TitleOrange}
+\setbeamercolor{frametitle}{fg=TitleOrange}
+
+\definecolor{ListOrange}{RGB}{255,145,5}
+\setbeamertemplate{itemize item}{\color{ListOrange}$\blacktriangleright$}
+
+\definecolor{verygrey}{RGB}{70,70,70}
+\setbeamercolor{normal text}{fg=verygrey}
+
+
+\usepackage{tabu}
+\usepackage{multicol}
+\usepackage{vwcol}
+\usepackage{stmaryrd}
+\usepackage{graphicx}
+
+\usepackage[normalem]{ulem}
+
+\AtBeginSection[]{
+ \begin{frame}
+ \vfill
+ \centering
+ \begin{beamercolorbox}[sep=8pt,center,shadow=true,rounded=true]{title}
+ \usebeamerfont{title}\insertsectionhead\par%
+ \end{beamercolorbox}
+ \vfill
+ \end{frame}
+}
+
+\title{Garage, the low-tech storage platform for geo-distributed clusters}
+\author{Alex Auvolat, Deuxfleurs}
+\date{FOSDEM'24, 2024-02-03}
+
+\begin{document}
+
+\begin{frame}
+ \centering
+ \includegraphics[width=.3\linewidth]{../../sticker/Garage.png}
+ \vspace{1em}
+
+ {\large\bf Alex Auvolat, Deuxfleurs Association}
+ \vspace{1em}
+
+ \url{https://garagehq.deuxfleurs.fr/}
+
+ Matrix channel: \texttt{\#garage:deuxfleurs.fr}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Who I am}
+ \begin{columns}[t]
+ \begin{column}{.2\textwidth}
+ \centering
+ \adjincludegraphics[width=.4\linewidth, valign=t]{../assets/alex.jpg}
+ \end{column}
+ \begin{column}{.6\textwidth}
+ \textbf{Alex Auvolat}\\
+ PhD; co-founder of Deuxfleurs
+ \end{column}
+ \begin{column}{.2\textwidth}
+ ~
+ \end{column}
+ \end{columns}
+ \vspace{2em}
+
+ \begin{columns}[t]
+ \begin{column}{.2\textwidth}
+ \centering
+ \adjincludegraphics[width=.5\linewidth, valign=t]{../assets/logos/deuxfleurs.pdf}
+ \end{column}
+ \begin{column}{.6\textwidth}
+ \textbf{Deuxfleurs}\\
+ A non-profit self-hosting collective,\\
+ member of the CHATONS network
+ \end{column}
+ \begin{column}{.2\textwidth}
+ \centering
+ \adjincludegraphics[width=.7\linewidth, valign=t]{../assets/logos/logo_chatons.png}
+ \end{column}
+ \end{columns}
+
+\end{frame}
+
+\begin{frame}
+ \frametitle{Our objective at Deuxfleurs}
+
+ \begin{center}
+ \textbf{Promote self-hosting and small-scale hosting\\
+ as an alternative to large cloud providers}
+ \end{center}
+ \vspace{2em}
+ \visible<2->{
+ Why is it hard?
+ }
+ \visible<3->{
+ \vspace{2em}
+ \begin{center}
+ \textbf{\underline{Resilience}}\\
+ {\footnotesize we want good uptime/availability with low supervision}
+ \end{center}
+ }
+\end{frame}
+
+\begin{frame}
+ \frametitle{Building a resilient system with cheap stuff}
+
+ \only<1,4-7>{
+ \begin{itemize}
+ \item \textcolor<5->{gray}{Commodity hardware (e.g. old desktop PCs)\\
+ \vspace{.5em}
+ \visible<4->{{\footnotesize (can die at any time)}}}
+ \vspace{1.5em}
+ \item<5-> \textcolor<7->{gray}{Regular Internet (e.g. FTTB, FTTH) and power grid connections\\
+ \vspace{.5em}
+ \visible<6->{{\footnotesize (can be unavailable randomly)}}}
+ \vspace{1.5em}
+ \item<7-> \textbf{Geographical redundancy} (multi-site replication)
+ \end{itemize}
+ }
+ \only<2>{
+ \begin{center}
+ \includegraphics[width=.8\linewidth]{../assets/neptune.jpg}
+ \end{center}
+ }
+ \only<3>{
+ \begin{center}
+ \includegraphics[width=.8\linewidth]{../assets/atuin.jpg}
+ \end{center}
+ }
+ \only<8>{
+ \begin{center}
+ \includegraphics[width=.8\linewidth]{../assets/inframap_jdll2023.pdf}
+ \end{center}
+ }
+\end{frame}
+
+\begin{frame}
+ \frametitle{Object storage: a crucial component}
+ \begin{center}
+ \includegraphics[height=6em]{../assets/logos/Amazon-S3.jpg}
+ \hspace{3em}
+ \visible<2->{\includegraphics[height=5em]{../assets/logos/minio.png}}
+ \hspace{3em}
+ \visible<3>{\includegraphics[height=6em]{../../logo/garage_hires_crop.png}}
+ \end{center}
+ \vspace{1em}
+ S3: a de-facto standard, many compatible applications
+
+ \vspace{1em}
+ \visible<2->{MinIO is self-hostable but not suited for geo-distributed deployments}
+
+ \vspace{1em}
+ \visible<3->{\textbf{Garage is a self-hosted drop-in replacement for the Amazon S3 object store}}
+\end{frame}
+
+\begin{frame}
+ \frametitle{CRDTs / weak consistency instead of consensus}
+
+ \underline{Internally, Garage uses only CRDTs} (conflict-free replicated data types)
+
+ \vspace{2em}
+ Why not Raft, Paxos, ...? Issues of consensus algorithms:
+
+ \vspace{1em}
+ \begin{itemize}
+ \item<2-> \textbf{Software complexity}
+ \vspace{1em}
+ \item<3-> \textbf{Performance issues:}
+ \vspace{.5em}
+ \begin{itemize}
+ \item<4-> The leader is a \textbf{bottleneck} for all requests\\
+ \vspace{.5em}
+ \item<5-> \textbf{Sensitive to higher latency} between nodes
+ \vspace{.5em}
+ \item<6-> \textbf{Takes time to reconverge} when disrupted (e.g. node going down)
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{The data model of object storage}
+ Object storage is basically a \textbf{key-value store}:
+ \vspace{.5em}
+
+ {\scriptsize
+ \begin{center}
+ \begin{tabular}{|l|p{7cm}|}
+ \hline
+ \textbf{Key: file path + name} & \textbf{Value: file data + metadata} \\
+ \hline
+ \hline
+ \texttt{index.html} &
+ \texttt{Content-Type: text/html; charset=utf-8} \newline
+ \texttt{Content-Length: 24929} \newline
+ \texttt{<binary blob>} \\
+ \hline
+ \texttt{img/logo.svg} &
+ \texttt{Content-Type: text/svg+xml} \newline
+ \texttt{Content-Length: 13429} \newline
+ \texttt{<binary blob>} \\
+ \hline
+ \texttt{download/index.html} &
+ \texttt{Content-Type: text/html; charset=utf-8} \newline
+ \texttt{Content-Length: 26563} \newline
+ \texttt{<binary blob>} \\
+ \hline
+ \end{tabular}
+ \end{center}
+ }
+
+ \vspace{1em}
+ \begin{itemize}
+ \item<2> Maps well to CRDT data types
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Performance gains in practice}
+ \begin{center}
+ \includegraphics[width=.8\linewidth]{../assets/perf/endpoint_latency_0.7_0.8_minio.png}
+ \end{center}
+\end{frame}
+
+
+% ======================================== TIMELINE
+% ======================================== TIMELINE
+% ======================================== TIMELINE
+
+\section{Recent developments}
+
+% ====================== v0.7.0 ===============================
+
+\begin{frame}
+ \begin{center}
+ \includegraphics[width=.8\linewidth]{../assets/timeline-22-24.pdf}
+ \end{center}
+\end{frame}
+
+\begin{frame}
+ \frametitle{April 2022 - Garage v0.7.0}
+ Focus on \underline{observability and ecosystem integration}
+ \vspace{2em}
+ \begin{itemize}
+ \item \textbf{Monitoring:} metrics and traces, using OpenTelemetry
+ \vspace{1em}
+ \item Replication modes with 1 or 2 copies / weaker consistency
+ \vspace{1em}
+ \item Kubernetes integration for node discovery
+ \vspace{1em}
+ \item Admin API (v0.7.2)
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Metrics (Prometheus + Grafana)}
+ \begin{center}
+ \includegraphics[width=.9\linewidth]{../assets/screenshots/grafana_dashboard.png}
+ \end{center}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Traces (Jaeger)}
+ \begin{center}
+ \includegraphics[width=.8\linewidth]{../assets/screenshots/jaeger_listobjects.png}
+ \end{center}
+\end{frame}
+
+% ====================== v0.8.0 ===============================
+
+\begin{frame}
+ \begin{center}
+ \includegraphics[width=.8\linewidth]{../assets/timeline-22-24.pdf}
+ \end{center}
+\end{frame}
+
+\begin{frame}
+ \frametitle{November 2022 - Garage v0.8.0}
+ Focus on \underline{performance}
+ \vspace{2em}
+ \begin{itemize}
+ \item \textbf{Alternative metadata DB engines} (LMDB, Sqlite)
+ \vspace{1em}
+ \item \textbf{Performance improvements:} block streaming, various optimizations...
+ \vspace{1em}
+ \item Bucket quotas (max size, max \#objects)
+ \vspace{1em}
+ \item Quality of life improvements, observability, etc.
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{About metadata DB engines}
+ \textbf{Issues with Sled:}
+ \vspace{1em}
+ \begin{itemize}
+ \item Huge files on disk
+ \vspace{.5em}
+ \item Unpredictable performance, especially on HDD
+ \vspace{.5em}
+ \item API limitations
+ \vspace{.5em}
+ \item Not actively maintained
+ \end{itemize}
+
+ \vspace{2em}
+ \textbf{LMDB:} very stable, good performance, file size is reasonable\\
+ \textbf{Sqlite} also available as a second choice
+
+ \vspace{1em}
+ Sled will be removed in Garage v1.0
+\end{frame}
+
+\begin{frame}
+ \frametitle{DB engine performance comparison}
+ \begin{center}
+ \includegraphics[width=.6\linewidth]{../assets/perf/db_engine.png}
+ \end{center}
+ NB: Sqlite was slow due to synchronous mode, now configurable
+\end{frame}
+
+\begin{frame}
+ \frametitle{Block streaming}
+ \begin{center}
+ \only<1>{\includegraphics[width=.8\linewidth]{../assets/schema-streaming-1.png}}
+ \only<2>{\includegraphics[width=.8\linewidth]{../assets/schema-streaming-2.png}}
+ \end{center}
+\end{frame}
+
+\begin{frame}
+ \frametitle{TTFB benchmark}
+ \begin{center}
+ \includegraphics[width=.8\linewidth]{../assets/perf/ttfb.png}
+ \end{center}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Throughput benchmark}
+ \begin{center}
+ \includegraphics[width=.7\linewidth]{../assets/perf/io-0.7-0.8-minio.png}
+ \end{center}
+\end{frame}
+
+% ====================== v0.9.0 ===============================
+
+\begin{frame}
+ \begin{center}
+ \includegraphics[width=.8\linewidth]{../assets/timeline-22-24.pdf}
+ \end{center}
+\end{frame}
+
+\begin{frame}
+ \frametitle{October 2023 - Garage v0.9.0}
+ Focus on \underline{streamlining \& usability}
+ \vspace{2em}
+ \begin{itemize}
+ \item Support multiple HDDs per node
+ \vspace{1em}
+ \item S3 compatibility:
+ \vspace{1em}
+ \begin{itemize}
+ \item support basic lifecycle configurations
+ \vspace{.5em}
+ \item allow for multipart upload part retries
+ \end{itemize}
+ \vspace{1em}
+ \item LMDB by default, deprecation of Sled
+ \vspace{1em}
+ \item New layout computation algorithm
+ \end{itemize}
+\end{frame}
+
+
+\begin{frame}
+ \frametitle{Layout computation}
+ \begin{overprint}
+ \onslide<1>
+ \begin{center}
+ \includegraphics[width=\linewidth, trim=0 0 0 -4cm]{../assets/screenshots/garage_status_0.9_prod_zonehl.png}
+ \end{center}
+ \onslide<2>
+ \begin{center}
+ \includegraphics[width=.7\linewidth]{../assets/map.png}
+ \end{center}
+ \end{overprint}
+ \vspace{1em}
+ Garage stores replicas on different zones when possible
+\end{frame}
+
+\begin{frame}
+ \frametitle{What a "layout" is}
+ \textbf{A layout is a precomputed index table:}
+ \vspace{1em}
+
+ {\footnotesize
+ \begin{center}
+ \begin{tabular}{|l|l|l|l|}
+ \hline
+ \textbf{Partition} & \textbf{Node 1} & \textbf{Node 2} & \textbf{Node 3} \\
+ \hline
+ \hline
+ Partition 0 & df-ymk (bespin) & Abricot (scorpio) & Courgette (neptune) \\
+ \hline
+ Partition 1 & Ananas (scorpio) & Courgette (neptune) & df-ykl (bespin) \\
+ \hline
+ Partition 2 & df-ymf (bespin) & Celeri (neptune) & Abricot (scorpio) \\
+ \hline
+ \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ & \hspace{1em}$\vdots$ \\
+ \hline
+ Partition 255 & Concombre (neptune) & df-ykl (bespin) & Abricot (scorpio) \\
+ \hline
+ \end{tabular}
+ \end{center}
+ }
+
+ \vspace{2em}
+ \visible<2->{
+ The index table is built centrally using an optimal algorithm,\\
+ then propagated to all nodes
+ }
+
+ \vspace{1em}
+ \visible<3->{
+ \footnotesize
+ Oulamara, M., \& Auvolat, A. (2023). \emph{An algorithm for geo-distributed and redundant storage in Garage}.\\ arXiv preprint arXiv:2302.13798.
+ }
+\end{frame}
+
+
+
+% ====================== v0.10.0 ===============================
+
+\begin{frame}
+ \begin{center}
+ \includegraphics[width=.8\linewidth]{../assets/timeline-22-24.pdf}
+ \end{center}
+\end{frame}
+
+\begin{frame}
+ \frametitle{October 2023 - Garage v0.10.0 beta}
+ Focus on \underline{consistency}
+ \vspace{2em}
+ \begin{itemize}
+ \item Fix consistency issues when reshuffling data
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Working with weak consistency}
+ Not using consensus limits us to the following:
+ \vspace{2em}
+ \begin{itemize}
+ \item<2-> \textbf{Conflict-free replicated data types} (CRDT)\\
+ \vspace{1em}
+ {\footnotesize Non-transactional key-value stores such as S3 are equivalent to a simple CRDT:\\
+ a map of \textbf{last-writer-wins registers} (each key is its own CRDT)}
+ \vspace{1.5em}
+ \item<3-> \textbf{Read-after-write consistency}\\
+ \vspace{1em}
+ {\footnotesize Can be implemented using quorums on read and write operations}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}[t]
+ \frametitle{CRDT read-after-write consistency using quorums}
+
+ \vspace{1em}
+ {\small
+ \textbf{Property:} If client 1 did an operation $write(x)$ and received an OK response,\\
+ \hspace{2cm} and client 2 starts an operation $read()$ after client 1 received OK,\\
+ \hspace{2cm} then client 2 will read a value $x' \sqsupseteq x$.
+ }
+
+ \vspace{1.5em}
+ \begin{overprint}
+ \onslide<2-9>
+ \begin{figure}
+ \centering
+ \footnotesize
+ \def\svgwidth{.7\textwidth}
+ \only<2>{\import{../assets/lattice/}{lattice1.pdf_tex}}%
+ \only<3>{\import{../assets/lattice/}{lattice2.pdf_tex}}%
+ \only<4>{\import{../assets/lattice/}{lattice3.pdf_tex}}%
+ \only<5>{\import{../assets/lattice/}{lattice4.pdf_tex}}%
+ \only<6>{\import{../assets/lattice/}{lattice5.pdf_tex}}%
+ \only<7>{\import{../assets/lattice/}{lattice6.pdf_tex}}%
+ \only<8>{\import{../assets/lattice/}{lattice7.pdf_tex}}%
+ \only<9>{\import{../assets/lattice/}{lattice8.pdf_tex}}%
+ \end{figure}
+
+ \onslide<10>
+ \begin{minipage}{.10\textwidth}
+ ~
+ \end{minipage}
+ \begin{minipage}{.40\textwidth}
+ \footnotesize
+ \textbf{Algorithm $write(x)$:}
+ \begin{enumerate}
+ \item Broadcast $write(x)$ to all nodes
+ \item Wait for $k > n/2$ nodes to reply OK
+ \item Return OK
+ \end{enumerate}
+ \end{minipage}
+ \begin{minipage}{.40\textwidth}
+ \footnotesize
+ \vspace{1em}
+ \textbf{Algorithm $read()$:}
+ \begin{enumerate}
+ \item Broadcast $read()$ to all nodes
+ \item Wait for $k > n/2$ nodes to reply\\
+ with values $x_1, \dots, x_k$
+ \item Return $x_1 \sqcup \dots \sqcup x_k$
+ \end{enumerate}
+ \end{minipage}
+ \end{overprint}
+\end{frame}
+
+\begin{frame}
+ \frametitle{A hard problem: layout changes}
+ \begin{itemize}
+ \item We rely on quorums $k > n/2$ within each partition:\\
+ $$n=3,~~~~~~~k\ge 2$$
+ \item<2-> When rebalancing, the set of nodes responsible for a partition can change:\\
+
+ \vspace{1em}
+ \begin{minipage}{.04\linewidth}~
+ \end{minipage}
+ \begin{minipage}{.40\linewidth}
+ {\tiny
+ \begin{tabular}{|l|l|l|l|}
+ \hline
+ \textbf{Partition} & \textbf{Node 1} & \textbf{Node 2} & \textbf{Node 3} \\
+ \hline
+ \hline
+ Partition 0 & \textcolor{Crimson}{df-ymk} & Abricot & \textcolor{Crimson}{Courgette} \\
+ \hline
+ Partition 1 & Ananas & \textcolor{Crimson}{Courgette} & \textcolor{Crimson}{df-ykl} \\
+ \hline
+ Partition 2 & \textcolor{Crimson}{df-ymf} & \textcolor{Crimson}{Celeri} & Abricot \\
+ \hline
+ \hspace{1em}$\dots$ & \hspace{1em}$\dots$ & \hspace{1em}$\dots$ & \hspace{1em}$\dots$ \\
+ \hline
+ \end{tabular}
+ }
+ \end{minipage}
+ \begin{minipage}{.04\linewidth}
+ $\to$
+ \end{minipage}
+ \begin{minipage}{.40\linewidth}
+ {\tiny
+ \begin{tabular}{|l|l|l|l|}
+ \hline
+ \textbf{Partition} & \textbf{Node 1} & \textbf{Node 2} & \textbf{Node 3} \\
+ \hline
+ \hline
+ Partition 0 & \textcolor{ForestGreen}{Dahlia} & Abricot & \textcolor{ForestGreen}{Eucalyptus} \\
+ \hline
+ Partition 1 & Ananas & \textcolor{ForestGreen}{Euphorbe} & \textcolor{ForestGreen}{Doradille} \\
+ \hline
+ Partition 2 & \textcolor{ForestGreen}{Dahlia} & \textcolor{ForestGreen}{Echinops} & Abricot \\
+ \hline
+ \hspace{1em}$\dots$ & \hspace{1em}$\dots$ & \hspace{1em}$\dots$ & \hspace{1em}$\dots$ \\
+ \hline
+ \end{tabular}
+ }
+ \end{minipage}
+
+ \vspace{2em}
+ \item<3-> During the rebalancing, new nodes don't yet have the data,\\
+ ~~~~~~~~~~~~~~~~~~~and old nodes want to get rid of the data to free up space\\
+ \vspace{1.2em}
+ $\to$ risk of inconsistency, \textbf{how to coordinate?}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Handling layout changes without losing consistency}
+ \begin{minipage}{.55\textwidth}
+ \begin{itemize}
+ \item \textbf{Solution:}\\
+ \vspace{.5em}
+ \begin{itemize}
+ \item keep track of data transfer to new nodes
+ \vspace{.5em}
+ \item use multiple write quorums\\
+ (new nodes + old nodes\\
+ while data transfer is in progress)
+ \vspace{.5em}
+ \item switching reads to new nodes\\
+ only once copy is finished
+ \end{itemize}
+ \vspace{1em}
+ \item \textbf{Implemented} in v0.10
+ \vspace{1em}
+ \item \textbf{Validated} with Jepsen testing
+ \end{itemize}
+ \end{minipage}
+ \begin{minipage}{.23\textwidth}
+ \includegraphics[width=3cm]{../assets/jepsen-0.9.png}\\
+ {\footnotesize Garage v0.9.0}
+ \end{minipage}
+ \begin{minipage}{.2\textwidth}
+ \includegraphics[width=3cm]{../assets/jepsen-0.10.png}\\
+ {\footnotesize Garage v0.10 beta}
+ \end{minipage}
+\end{frame}
+
+% ====================== v0.10.0 ===============================
+
+\begin{frame}
+ \begin{center}
+ \includegraphics[width=.8\linewidth]{../assets/timeline-22-24.pdf}
+ \end{center}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Towards v1.0...}
+ Focus on \underline{security \& stability}
+ \vspace{2em}
+ \begin{itemize}
+ \item \textbf{Security audit} in progress by Radically Open Security
+ \vspace{1em}
+ \item Misc. S3 features (SSE-C, ...) and compatibility fixes
+ \vspace{1em}
+ \item Improve UX
+ \vspace{1em}
+ \item Fix bugs
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{...and beyond!}
+ \begin{center}
+ \includegraphics[width=.6\linewidth]{../assets/survey_requested_features.png}
+ \end{center}
+\end{frame}
+
+% ======================================== OPERATING
+% ======================================== OPERATING
+% ======================================== OPERATING
+
+
+\section{Operating big Garage clusters}
+
+\begin{frame}
+ \frametitle{Operating Garage}
+ \begin{center}
+ \only<1-2>{
+ \includegraphics[width=.9\linewidth]{../assets/screenshots/garage_status_0.10.png}
+ \\\vspace{1em}
+ \visible<2>{\includegraphics[width=.9\linewidth]{../assets/screenshots/garage_status_unhealthy_0.10.png}}
+ }
+ \end{center}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Garage's architecture}
+ \begin{center}
+ \only<1>{\includegraphics[width=.45\linewidth]{../assets/garage.drawio.pdf}}%
+ \only<2>{\includegraphics[width=.6\linewidth]{../assets/garage_sync.drawio.pdf}}%
+ \end{center}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Digging deeper}
+ \begin{center}
+ \only<1>{\includegraphics[width=.9\linewidth]{../assets/screenshots/garage_stats_0.10.png}}
+ \only<2>{\includegraphics[width=.5\linewidth]{../assets/screenshots/garage_worker_list_0.10.png}}
+ \only<3>{\includegraphics[width=.6\linewidth]{../assets/screenshots/garage_worker_param_0.10.png}}
+ \end{center}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Potential limitations and bottlenecks}
+ \begin{itemize}
+ \item Global:
+ \begin{itemize}
+ \item Max. $\sim$100 nodes per cluster (excluding gateways)
+ \end{itemize}
+ \vspace{1em}
+ \item Metadata:
+ \begin{itemize}
+ \item One big bucket = bottleneck, object list on 3 nodes only
+ \end{itemize}
+ \vspace{1em}
+ \item Block manager:
+ \begin{itemize}
+ \item Lots of small files on disk
+ \item Processing the resync queue can be slow
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Deployment advice for very large clusters}
+ \begin{itemize}
+ \item Metadata storage:
+ \begin{itemize}
+ \item ZFS mirror (x2) on fast NVMe
+ \item Use LMDB storage engine
+ \end{itemize}
+ \vspace{.5em}
+ \item Data block storage:
+ \begin{itemize}
+ \item Use Garage's native multi-HDD support
+ \item XFS on individual drives
+ \item Increase block size (1MB $\to$ 10MB, requires more RAM and good networking)
+ \item Tune \texttt{resync-tranquility} and \texttt{resync-worker-count} dynamically
+ \end{itemize}
+ \vspace{.5em}
+ \item Other :
+ \begin{itemize}
+ \item Split data over several buckets
+ \item Use less than 100 storage nodes
+ \item Use gateway nodes
+ \end{itemize}
+ \vspace{.5em}
+ \end{itemize}
+ Our deployments: $< 10$ TB. Some people have done more!
+\end{frame}
+
+
+% ======================================== END
+% ======================================== END
+% ======================================== END
+
+\begin{frame}
+ \frametitle{Where to find us}
+ \begin{center}
+ \includegraphics[width=.25\linewidth]{../../logo/garage_hires.png}\\
+ \vspace{-1em}
+ \url{https://garagehq.deuxfleurs.fr/}\\
+ \url{mailto:garagehq@deuxfleurs.fr}\\
+ \texttt{\#garage:deuxfleurs.fr} on Matrix
+
+ \vspace{1.5em}
+ \includegraphics[width=.06\linewidth]{../assets/logos/rust_logo.png}
+ \includegraphics[width=.13\linewidth]{../assets/logos/AGPLv3_Logo.png}
+ \end{center}
+\end{frame}
+
+\end{document}
+
+%% vim: set ts=4 sw=4 tw=0 noet spelllang=en :
diff --git a/doc/talks/assets/.gitignore b/doc/talks/assets/.gitignore
new file mode 100644
index 00000000..9ce0997d
--- /dev/null
+++ b/doc/talks/assets/.gitignore
@@ -0,0 +1,8 @@
+# Files that are auto-generated when building pdfs
+deuxfleurs.pdf
+timeline-22-24.pdf
+lattice*.pdf_tex
+lattice*.pdf
+
+# tmp files generated by krita
+*~
diff --git a/doc/talks/assets/alex.jpg b/doc/talks/assets/alex.jpg
new file mode 100644
index 00000000..eac0f0a9
--- /dev/null
+++ b/doc/talks/assets/alex.jpg
Binary files differ
diff --git a/doc/talks/assets/atuin.jpg b/doc/talks/assets/atuin.jpg
new file mode 100644
index 00000000..f2fbd61d
--- /dev/null
+++ b/doc/talks/assets/atuin.jpg
Binary files differ
diff --git a/doc/talks/assets/garage.drawio.pdf b/doc/talks/assets/garage.drawio.pdf
new file mode 100644
index 00000000..a54a163c
--- /dev/null
+++ b/doc/talks/assets/garage.drawio.pdf
Binary files differ
diff --git a/doc/talks/assets/garage.drawio.png b/doc/talks/assets/garage.drawio.png
new file mode 100644
index 00000000..386dd862
--- /dev/null
+++ b/doc/talks/assets/garage.drawio.png
Binary files differ
diff --git a/doc/talks/assets/garage2.drawio.png b/doc/talks/assets/garage2.drawio.png
new file mode 100644
index 00000000..8562fbcf
--- /dev/null
+++ b/doc/talks/assets/garage2.drawio.png
Binary files differ
diff --git a/doc/talks/assets/garage_sync.drawio.pdf b/doc/talks/assets/garage_sync.drawio.pdf
new file mode 100644
index 00000000..a94b3572
--- /dev/null
+++ b/doc/talks/assets/garage_sync.drawio.pdf
Binary files differ
diff --git a/doc/talks/assets/garage_sync.drawio.png b/doc/talks/assets/garage_sync.drawio.png
new file mode 100644
index 00000000..2e7b5af0
--- /dev/null
+++ b/doc/talks/assets/garage_sync.drawio.png
Binary files differ
diff --git a/doc/talks/assets/geodistrib_paper.png b/doc/talks/assets/geodistrib_paper.png
new file mode 100644
index 00000000..318d8e55
--- /dev/null
+++ b/doc/talks/assets/geodistrib_paper.png
Binary files differ
diff --git a/doc/talks/assets/inframap_jdll2023.pdf b/doc/talks/assets/inframap_jdll2023.pdf
new file mode 100644
index 00000000..77f97baa
--- /dev/null
+++ b/doc/talks/assets/inframap_jdll2023.pdf
Binary files differ
diff --git a/doc/talks/assets/jepsen-0.10.png b/doc/talks/assets/jepsen-0.10.png
new file mode 100644
index 00000000..d7895e31
--- /dev/null
+++ b/doc/talks/assets/jepsen-0.10.png
Binary files differ
diff --git a/doc/talks/assets/jepsen-0.9.png b/doc/talks/assets/jepsen-0.9.png
new file mode 100644
index 00000000..3f654038
--- /dev/null
+++ b/doc/talks/assets/jepsen-0.9.png
Binary files differ
diff --git a/doc/talks/assets/lattice/lattice1.svg b/doc/talks/assets/lattice/lattice1.svg
new file mode 100644
index 00000000..8bfa5aa7
--- /dev/null
+++ b/doc/talks/assets/lattice/lattice1.svg
@@ -0,0 +1,433 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="1000"
+ height="400"
+ viewBox="0 0 264.58333 105.83333"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ sodipodi:docname="lattice1.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="false"
+ inkscape:zoom="1.0419012"
+ inkscape:cx="445.81962"
+ inkscape:cy="222.66987"
+ inkscape:window-width="1920"
+ inkscape:window-height="999"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer2" />
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="Arrow2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6-4" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ sodipodi:insensitive="true">
+ <rect
+ style="fill:#ffffff;stroke:none;stroke-width:1;stop-color:#000000"
+ id="rect288"
+ width="209.84705"
+ height="104.42732"
+ x="0.77790999"
+ y="0.93738818" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Layer 2">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442"
+ id="text951"><tspan
+ sodipodi:role="line"
+ id="tspan949"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442">$\{\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893"
+ id="text1005"><tspan
+ sodipodi:role="line"
+ id="tspan1003"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893">$\{a,b,c\}$</tspan></text>
+ <g
+ id="g1175"
+ transform="translate(51.996784,3.5774043)">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698"
+ id="text1009"><tspan
+ sodipodi:role="line"
+ id="tspan1007"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698">$\{a\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166"
+ id="text1009-3"><tspan
+ sodipodi:role="line"
+ id="tspan1007-6"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166">$\{b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698"
+ id="text1009-7"><tspan
+ sodipodi:role="line"
+ id="tspan1007-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698">$\{c\}$</tspan></text>
+ </g>
+ <g
+ id="g1183"
+ transform="translate(51.996784,1.0317046)">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526"
+ id="text1117"><tspan
+ sodipodi:role="line"
+ id="tspan1115"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526">$\{a,c\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526"
+ id="text1117-3"><tspan
+ sodipodi:role="line"
+ id="tspan1115-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526">$\{a,b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526"
+ id="text1117-6"><tspan
+ sodipodi:role="line"
+ id="tspan1115-2"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526">$\{b,c\}$</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2)"
+ d="M 153.33622,90.367682 118.34198,73.428915"
+ id="path1300" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9)"
+ d="M 177.46016,90.367682 212.4544,73.428915"
+ id="path1300-2" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93)"
+ d="M 153.33622,61.655656 118.34198,44.716889"
+ id="path1300-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7)"
+ d="M 177.46016,61.655656 212.4544,44.716889"
+ id="path1300-2-6" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1)"
+ d="M 118.34198,61.655656 153.33622,44.716889"
+ id="path1300-0-7" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2)"
+ d="M 212.4544,61.655656 177.46016,44.716889"
+ id="path1300-2-6-9" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1-4)"
+ d="M 118.34198,34.227412 153.33622,17.288645"
+ id="path1300-0-7-5" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2-8)"
+ d="M 212.4544,34.227412 177.46016,17.288645"
+ id="path1300-2-6-9-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75)"
+ d="m 228.52843,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-2)"
+ d="m 101.90418,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-9"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7)"
+ d="m 165.29305,89.571762 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7-1)"
+ d="m 165.29305,32.445235 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6-9"
+ sodipodi:nodetypes="cc" />
+ </g>
+</svg>
diff --git a/doc/talks/assets/lattice/lattice2.svg b/doc/talks/assets/lattice/lattice2.svg
new file mode 100644
index 00000000..adcd92cb
--- /dev/null
+++ b/doc/talks/assets/lattice/lattice2.svg
@@ -0,0 +1,514 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="1000"
+ height="400"
+ viewBox="0 0 264.58333 105.83333"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ sodipodi:docname="lattice2.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="false"
+ inkscape:zoom="1.0419012"
+ inkscape:cx="384.39345"
+ inkscape:cy="227.46879"
+ inkscape:window-width="1920"
+ inkscape:window-height="999"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer2" />
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="Arrow2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6-4" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ sodipodi:insensitive="true">
+ <rect
+ style="fill:#ffffff;stroke:none;stroke-width:1;stop-color:#000000"
+ id="rect288"
+ width="209.84705"
+ height="104.42732"
+ x="0.77790999"
+ y="0.93738818" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Layer 2">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442"
+ id="text951"><tspan
+ sodipodi:role="line"
+ id="tspan949"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442">$\{\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893"
+ id="text1005"><tspan
+ sodipodi:role="line"
+ id="tspan1003"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893">$\{a,b,c\}$</tspan></text>
+ <g
+ id="g1175"
+ transform="translate(51.996784,3.5774043)">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698"
+ id="text1009"><tspan
+ sodipodi:role="line"
+ id="tspan1007"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698">$\{a\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166"
+ id="text1009-3"><tspan
+ sodipodi:role="line"
+ id="tspan1007-6"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166">$\{b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698"
+ id="text1009-7"><tspan
+ sodipodi:role="line"
+ id="tspan1007-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698">$\{c\}$</tspan></text>
+ </g>
+ <g
+ id="g1183"
+ transform="translate(51.996784,1.0317046)"
+ style="fill:#000000">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526"
+ id="text1117"><tspan
+ sodipodi:role="line"
+ id="tspan1115"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526">$\{a,c\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526"
+ id="text1117-3"><tspan
+ sodipodi:role="line"
+ id="tspan1115-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526">$\{a,b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526"
+ id="text1117-6"><tspan
+ sodipodi:role="line"
+ id="tspan1115-2"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526">$\{b,c\}$</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2)"
+ d="M 153.33622,90.367682 118.34198,73.428915"
+ id="path1300" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9)"
+ d="M 177.46016,90.367682 212.4544,73.428915"
+ id="path1300-2" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93)"
+ d="M 153.33622,61.655656 118.34198,44.716889"
+ id="path1300-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7)"
+ d="M 177.46016,61.655656 212.4544,44.716889"
+ id="path1300-2-6" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1)"
+ d="M 118.34198,61.655656 153.33622,44.716889"
+ id="path1300-0-7" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2)"
+ d="M 212.4544,61.655656 177.46016,44.716889"
+ id="path1300-2-6-9" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1-4)"
+ d="M 118.34198,34.227412 153.33622,17.288645"
+ id="path1300-0-7-5" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2-8)"
+ d="M 212.4544,34.227412 177.46016,17.288645"
+ id="path1300-2-6-9-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75)"
+ d="m 228.52843,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-2)"
+ d="m 101.90418,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-9"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7)"
+ d="m 165.29305,89.571762 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7-1)"
+ d="m 165.29305,32.445235 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6-9"
+ sodipodi:nodetypes="cc" />
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663"
+ cx="147.35568"
+ cy="95.24971"
+ r="2.7302806" />
+ <circle
+ style="fill:#008000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-3"
+ cx="139.48744"
+ cy="95.24971"
+ r="2.7302806" />
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6"
+ cx="131.61919"
+ cy="95.24971"
+ r="2.7302806" />
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-1"
+ cx="18.004833"
+ cy="39.402473"
+ r="2.7302806" />
+ <circle
+ style="fill:#008000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-3-0"
+ cx="18.004833"
+ cy="30.371933"
+ r="2.7302806" />
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6-6"
+ cx="18.004833"
+ cy="21.341394"
+ r="2.7302806" />
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#000000"
+ x="6.9525447"
+ y="13.702217"
+ id="text3707"><tspan
+ sodipodi:role="line"
+ id="tspan3705"
+ style="stroke-width:0.264583;fill:#000000"
+ x="6.9525447"
+ y="13.702217">$write(\{a\})$:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="24.042637"
+ id="text3750"><tspan
+ sodipodi:role="line"
+ id="tspan3748"
+ style="fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="24.042637">$\not\sqsupseteq \{a\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="33.02087"
+ id="text3750-3"><tspan
+ sodipodi:role="line"
+ id="tspan3748-2"
+ style="fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="33.02087">$\not\sqsupseteq \{a\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="41.972523"
+ id="text3750-0"><tspan
+ sodipodi:role="line"
+ id="tspan3748-6"
+ style="fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="41.972523">$\not\sqsupseteq \{a\}$</tspan></text>
+ </g>
+</svg>
diff --git a/doc/talks/assets/lattice/lattice3.svg b/doc/talks/assets/lattice/lattice3.svg
new file mode 100644
index 00000000..640dc468
--- /dev/null
+++ b/doc/talks/assets/lattice/lattice3.svg
@@ -0,0 +1,515 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="1000"
+ height="400"
+ viewBox="0 0 264.58333 105.83333"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ sodipodi:docname="lattice3.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="false"
+ inkscape:zoom="1.4734708"
+ inkscape:cx="324.06479"
+ inkscape:cy="168.98876"
+ inkscape:window-width="1920"
+ inkscape:window-height="999"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer2" />
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="Arrow2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6-4" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ sodipodi:insensitive="true">
+ <rect
+ style="fill:#ffffff;stroke:none;stroke-width:1;stop-color:#000000"
+ id="rect288"
+ width="209.84705"
+ height="104.42732"
+ x="0.77790999"
+ y="0.93738818" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Layer 2">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442"
+ id="text951"><tspan
+ sodipodi:role="line"
+ id="tspan949"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442">$\{\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893"
+ id="text1005"><tspan
+ sodipodi:role="line"
+ id="tspan1003"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893">$\{a,b,c\}$</tspan></text>
+ <g
+ id="g1175"
+ transform="translate(51.996784,3.5774043)"
+ style="fill:#000000">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698"
+ id="text1009"><tspan
+ sodipodi:role="line"
+ id="tspan1007"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698">$\{a\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166"
+ id="text1009-3"><tspan
+ sodipodi:role="line"
+ id="tspan1007-6"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166">$\{b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698"
+ id="text1009-7"><tspan
+ sodipodi:role="line"
+ id="tspan1007-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698">$\{c\}$</tspan></text>
+ </g>
+ <g
+ id="g1183"
+ transform="translate(51.996784,1.0317046)"
+ style="fill:#000000">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526"
+ id="text1117"><tspan
+ sodipodi:role="line"
+ id="tspan1115"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526">$\{a,c\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526"
+ id="text1117-3"><tspan
+ sodipodi:role="line"
+ id="tspan1115-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526">$\{a,b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526"
+ id="text1117-6"><tspan
+ sodipodi:role="line"
+ id="tspan1115-2"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526">$\{b,c\}$</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2)"
+ d="M 153.33622,90.367682 118.34198,73.428915"
+ id="path1300" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9)"
+ d="M 177.46016,90.367682 212.4544,73.428915"
+ id="path1300-2" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93)"
+ d="M 153.33622,61.655656 118.34198,44.716889"
+ id="path1300-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7)"
+ d="M 177.46016,61.655656 212.4544,44.716889"
+ id="path1300-2-6" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1)"
+ d="M 118.34198,61.655656 153.33622,44.716889"
+ id="path1300-0-7" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2)"
+ d="M 212.4544,61.655656 177.46016,44.716889"
+ id="path1300-2-6-9" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1-4)"
+ d="M 118.34198,34.227412 153.33622,17.288645"
+ id="path1300-0-7-5" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2-8)"
+ d="M 212.4544,34.227412 177.46016,17.288645"
+ id="path1300-2-6-9-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75)"
+ d="m 228.52843,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-2)"
+ d="m 101.90418,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-9"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7)"
+ d="m 165.29305,89.571762 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7-1)"
+ d="m 165.29305,32.445235 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6-9"
+ sodipodi:nodetypes="cc" />
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663"
+ cx="147.35568"
+ cy="95.24971"
+ r="2.7302806" />
+ <circle
+ style="fill:#008000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-3"
+ cx="139.48744"
+ cy="95.24971"
+ r="2.7302806" />
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6"
+ cx="119.58919"
+ cy="67.645035"
+ r="2.7302806" />
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-1"
+ cx="18.004833"
+ cy="39.402473"
+ r="2.7302806" />
+ <circle
+ style="fill:#008000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-3-0"
+ cx="18.004833"
+ cy="30.371933"
+ r="2.7302806" />
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6-6"
+ cx="18.004833"
+ cy="21.341394"
+ r="2.7302806" />
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#000000"
+ x="6.9525447"
+ y="13.702217"
+ id="text3707"><tspan
+ sodipodi:role="line"
+ id="tspan3705"
+ style="stroke-width:0.264583;fill:#000000"
+ x="6.9525447"
+ y="13.702217">$write(\{a\})$:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="24.042637"
+ id="text3750"><tspan
+ sodipodi:role="line"
+ id="tspan3748"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="24.042637">$\sqsupseteq \{a\} \to$ OK</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="33.02087"
+ id="text3750-3"><tspan
+ sodipodi:role="line"
+ id="tspan3748-2"
+ style="fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="33.02087">$\not\sqsupseteq \{a\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="41.972523"
+ id="text3750-0"><tspan
+ sodipodi:role="line"
+ id="tspan3748-6"
+ style="fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="41.972523">$\not\sqsupseteq \{a\}$</tspan></text>
+ </g>
+</svg>
diff --git a/doc/talks/assets/lattice/lattice4.svg b/doc/talks/assets/lattice/lattice4.svg
new file mode 100644
index 00000000..b2a99e28
--- /dev/null
+++ b/doc/talks/assets/lattice/lattice4.svg
@@ -0,0 +1,525 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="1000"
+ height="400"
+ viewBox="0 0 264.58333 105.83333"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ sodipodi:docname="lattice4.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="false"
+ inkscape:zoom="0.73673541"
+ inkscape:cx="287.07728"
+ inkscape:cy="294.54265"
+ inkscape:window-width="1920"
+ inkscape:window-height="999"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer2" />
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="Arrow2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6-4" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ sodipodi:insensitive="true">
+ <rect
+ style="fill:#ffffff;stroke:none;stroke-width:1;stop-color:#000000"
+ id="rect288"
+ width="209.84705"
+ height="104.42732"
+ x="0.77790999"
+ y="0.93738818" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Layer 2">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442"
+ id="text951"><tspan
+ sodipodi:role="line"
+ id="tspan949"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442">$\{\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893"
+ id="text1005"><tspan
+ sodipodi:role="line"
+ id="tspan1003"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893">$\{a,b,c\}$</tspan></text>
+ <g
+ id="g1175"
+ transform="translate(51.996784,3.5774043)">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698"
+ id="text1009"><tspan
+ sodipodi:role="line"
+ id="tspan1007"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698">$\{a\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166"
+ id="text1009-3"><tspan
+ sodipodi:role="line"
+ id="tspan1007-6"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166">$\{b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698"
+ id="text1009-7"><tspan
+ sodipodi:role="line"
+ id="tspan1007-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698">$\{c\}$</tspan></text>
+ </g>
+ <g
+ id="g1183"
+ transform="translate(51.996784,1.0317046)"
+ style="fill:#000000">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526"
+ id="text1117"><tspan
+ sodipodi:role="line"
+ id="tspan1115"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526">$\{a,c\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526"
+ id="text1117-3"><tspan
+ sodipodi:role="line"
+ id="tspan1115-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526">$\{a,b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526"
+ id="text1117-6"><tspan
+ sodipodi:role="line"
+ id="tspan1115-2"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526">$\{b,c\}$</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2)"
+ d="M 153.33622,90.367682 118.34198,73.428915"
+ id="path1300" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9)"
+ d="M 177.46016,90.367682 212.4544,73.428915"
+ id="path1300-2" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93)"
+ d="M 153.33622,61.655656 118.34198,44.716889"
+ id="path1300-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7)"
+ d="M 177.46016,61.655656 212.4544,44.716889"
+ id="path1300-2-6" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1)"
+ d="M 118.34198,61.655656 153.33622,44.716889"
+ id="path1300-0-7" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2)"
+ d="M 212.4544,61.655656 177.46016,44.716889"
+ id="path1300-2-6-9" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1-4)"
+ d="M 118.34198,34.227412 153.33622,17.288645"
+ id="path1300-0-7-5" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2-8)"
+ d="M 212.4544,34.227412 177.46016,17.288645"
+ id="path1300-2-6-9-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75)"
+ d="m 228.52843,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-2)"
+ d="m 101.90418,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-9"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7)"
+ d="m 165.29305,89.571762 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7-1)"
+ d="m 165.29305,32.445235 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6-9"
+ sodipodi:nodetypes="cc" />
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663"
+ cx="147.35568"
+ cy="95.24971"
+ r="2.7302806" />
+ <circle
+ style="fill:#008000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-3"
+ cx="126.08154"
+ cy="67.968384"
+ r="2.7302806" />
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6"
+ cx="119.58919"
+ cy="67.645035"
+ r="2.7302806" />
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-1"
+ cx="18.004833"
+ cy="39.402473"
+ r="2.7302806" />
+ <circle
+ style="fill:#008000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-3-0"
+ cx="18.004833"
+ cy="30.371933"
+ r="2.7302806" />
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6-6"
+ cx="18.004833"
+ cy="21.341394"
+ r="2.7302806" />
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#000000"
+ x="6.9525447"
+ y="13.702217"
+ id="text3707"><tspan
+ sodipodi:role="line"
+ id="tspan3705"
+ style="stroke-width:0.264583;fill:#000000"
+ x="6.9525447"
+ y="13.702217">$write(\{a\})$:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="24.042637"
+ id="text3750"><tspan
+ sodipodi:role="line"
+ id="tspan3748"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="24.042637">$\sqsupseteq \{a\} \to$ OK</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="33.02087"
+ id="text3750-3"><tspan
+ sodipodi:role="line"
+ id="tspan3748-2"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="33.02087">$\sqsupseteq \{a\} \to$ OK</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="41.972523"
+ id="text3750-0"><tspan
+ sodipodi:role="line"
+ id="tspan3748-6"
+ style="fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="41.972523">$\not\sqsupseteq \{a\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="14.395845"
+ y="52.022549"
+ id="text4280"><tspan
+ sodipodi:role="line"
+ id="tspan4278"
+ style="fill:#000000;stroke-width:0.264583"
+ x="14.395845"
+ y="52.022549">return OK</tspan></text>
+ </g>
+</svg>
diff --git a/doc/talks/assets/lattice/lattice5.svg b/doc/talks/assets/lattice/lattice5.svg
new file mode 100644
index 00000000..bc6b7195
--- /dev/null
+++ b/doc/talks/assets/lattice/lattice5.svg
@@ -0,0 +1,536 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="1000"
+ height="400"
+ viewBox="0 0 264.58333 105.83333"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ sodipodi:docname="lattice5.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="false"
+ inkscape:zoom="1.0419012"
+ inkscape:cx="276.89766"
+ inkscape:cy="254.34273"
+ inkscape:window-width="1920"
+ inkscape:window-height="999"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer2" />
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="Arrow2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6-4" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ sodipodi:insensitive="true">
+ <rect
+ style="fill:#ffffff;stroke:none;stroke-width:1;stop-color:#000000"
+ id="rect288"
+ width="209.84705"
+ height="104.42732"
+ x="0.77790999"
+ y="0.93738818" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Layer 2">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442"
+ id="text951"><tspan
+ sodipodi:role="line"
+ id="tspan949"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442">$\{\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893"
+ id="text1005"><tspan
+ sodipodi:role="line"
+ id="tspan1003"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893">$\{a,b,c\}$</tspan></text>
+ <g
+ id="g1175"
+ transform="translate(51.996784,3.5774043)">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698"
+ id="text1009"><tspan
+ sodipodi:role="line"
+ id="tspan1007"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698">$\{a\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166"
+ id="text1009-3"><tspan
+ sodipodi:role="line"
+ id="tspan1007-6"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166">$\{b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698"
+ id="text1009-7"><tspan
+ sodipodi:role="line"
+ id="tspan1007-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698">$\{c\}$</tspan></text>
+ </g>
+ <g
+ id="g1183"
+ transform="translate(51.996784,1.0317046)"
+ style="fill:#000000">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526"
+ id="text1117"><tspan
+ sodipodi:role="line"
+ id="tspan1115"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526">$\{a,c\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526"
+ id="text1117-3"><tspan
+ sodipodi:role="line"
+ id="tspan1115-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526">$\{a,b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526"
+ id="text1117-6"><tspan
+ sodipodi:role="line"
+ id="tspan1115-2"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526">$\{b,c\}$</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2)"
+ d="M 153.33622,90.367682 118.34198,73.428915"
+ id="path1300" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9)"
+ d="M 177.46016,90.367682 212.4544,73.428915"
+ id="path1300-2" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93)"
+ d="M 153.33622,61.655656 118.34198,44.716889"
+ id="path1300-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7)"
+ d="M 177.46016,61.655656 212.4544,44.716889"
+ id="path1300-2-6" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1)"
+ d="M 118.34198,61.655656 153.33622,44.716889"
+ id="path1300-0-7" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2)"
+ d="M 212.4544,61.655656 177.46016,44.716889"
+ id="path1300-2-6-9" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1-4)"
+ d="M 118.34198,34.227412 153.33622,17.288645"
+ id="path1300-0-7-5" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2-8)"
+ d="M 212.4544,34.227412 177.46016,17.288645"
+ id="path1300-2-6-9-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75)"
+ d="m 228.52843,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-2)"
+ d="m 101.90418,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-9"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7)"
+ d="m 165.29305,89.571762 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7-1)"
+ d="m 165.29305,32.445235 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6-9"
+ sodipodi:nodetypes="cc" />
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663"
+ cx="147.35568"
+ cy="95.24971"
+ r="2.7302806" />
+ <circle
+ style="fill:#008000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-3"
+ cx="126.08154"
+ cy="67.968384"
+ r="2.7302806" />
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6"
+ cx="119.58919"
+ cy="67.645035"
+ r="2.7302806" />
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-1"
+ cx="18.004833"
+ cy="39.402473"
+ r="2.7302806" />
+ <circle
+ style="fill:#008000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-3-0"
+ cx="18.004833"
+ cy="30.371933"
+ r="2.7302806" />
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6-6"
+ cx="18.004833"
+ cy="21.341394"
+ r="2.7302806" />
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#000000"
+ x="6.9525447"
+ y="13.702217"
+ id="text3707"><tspan
+ sodipodi:role="line"
+ id="tspan3705"
+ style="stroke-width:0.264583;fill:#000000"
+ x="6.9525447"
+ y="13.702217">$write(\{a\})$:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="6.9525447"
+ y="65.261436"
+ id="text3707-1"><tspan
+ sodipodi:role="line"
+ id="tspan3705-5"
+ style="fill:#000000;stroke-width:0.264583"
+ x="6.9525447"
+ y="65.261436">$read()$:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="24.042637"
+ id="text3750"><tspan
+ sodipodi:role="line"
+ id="tspan3748"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="24.042637">$\sqsupseteq \{a\} \to$ OK</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="33.02087"
+ id="text3750-3"><tspan
+ sodipodi:role="line"
+ id="tspan3748-2"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="33.02087">$\sqsupseteq \{a\} \to$ OK</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="41.972523"
+ id="text3750-0"><tspan
+ sodipodi:role="line"
+ id="tspan3748-6"
+ style="fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="41.972523">$\not\sqsupseteq \{a\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="14.395845"
+ y="52.022549"
+ id="text4280"><tspan
+ sodipodi:role="line"
+ id="tspan4278"
+ style="fill:#000000;stroke-width:0.264583"
+ x="14.395845"
+ y="52.022549">return OK</tspan></text>
+ </g>
+</svg>
diff --git a/doc/talks/assets/lattice/lattice6.svg b/doc/talks/assets/lattice/lattice6.svg
new file mode 100644
index 00000000..176b1715
--- /dev/null
+++ b/doc/talks/assets/lattice/lattice6.svg
@@ -0,0 +1,553 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="1000"
+ height="400"
+ viewBox="0 0 264.58333 105.83333"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ sodipodi:docname="lattice6.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="false"
+ inkscape:zoom="1.0419012"
+ inkscape:cx="277.85744"
+ inkscape:cy="254.34273"
+ inkscape:window-width="1920"
+ inkscape:window-height="999"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer2" />
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="Arrow2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6-4" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ sodipodi:insensitive="true">
+ <rect
+ style="fill:#ffffff;stroke:none;stroke-width:1;stop-color:#000000"
+ id="rect288"
+ width="209.84705"
+ height="104.42732"
+ x="0.77790999"
+ y="0.93738818" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Layer 2">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442"
+ id="text951"><tspan
+ sodipodi:role="line"
+ id="tspan949"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442">$\{\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893"
+ id="text1005"><tspan
+ sodipodi:role="line"
+ id="tspan1003"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893">$\{a,b,c\}$</tspan></text>
+ <g
+ id="g1175"
+ transform="translate(51.996784,3.5774043)">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698"
+ id="text1009"><tspan
+ sodipodi:role="line"
+ id="tspan1007"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698">$\{a\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166"
+ id="text1009-3"><tspan
+ sodipodi:role="line"
+ id="tspan1007-6"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166">$\{b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698"
+ id="text1009-7"><tspan
+ sodipodi:role="line"
+ id="tspan1007-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698">$\{c\}$</tspan></text>
+ </g>
+ <g
+ id="g1183"
+ transform="translate(51.996784,1.0317046)"
+ style="fill:#000000">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526"
+ id="text1117"><tspan
+ sodipodi:role="line"
+ id="tspan1115"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526">$\{a,c\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526"
+ id="text1117-3"><tspan
+ sodipodi:role="line"
+ id="tspan1115-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526">$\{a,b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526"
+ id="text1117-6"><tspan
+ sodipodi:role="line"
+ id="tspan1115-2"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526">$\{b,c\}$</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2)"
+ d="M 153.33622,90.367682 118.34198,73.428915"
+ id="path1300" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9)"
+ d="M 177.46016,90.367682 212.4544,73.428915"
+ id="path1300-2" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93)"
+ d="M 153.33622,61.655656 118.34198,44.716889"
+ id="path1300-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7)"
+ d="M 177.46016,61.655656 212.4544,44.716889"
+ id="path1300-2-6" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1)"
+ d="M 118.34198,61.655656 153.33622,44.716889"
+ id="path1300-0-7" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2)"
+ d="M 212.4544,61.655656 177.46016,44.716889"
+ id="path1300-2-6-9" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1-4)"
+ d="M 118.34198,34.227412 153.33622,17.288645"
+ id="path1300-0-7-5" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2-8)"
+ d="M 212.4544,34.227412 177.46016,17.288645"
+ id="path1300-2-6-9-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75)"
+ d="m 228.52843,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-2)"
+ d="m 101.90418,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-9"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7)"
+ d="m 165.29305,89.571762 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7-1)"
+ d="m 165.29305,32.445235 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6-9"
+ sodipodi:nodetypes="cc" />
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663"
+ cx="147.35568"
+ cy="95.24971"
+ r="2.7302806" />
+ <circle
+ style="fill:#008000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-3"
+ cx="126.08154"
+ cy="67.968384"
+ r="2.7302806" />
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6"
+ cx="119.58919"
+ cy="67.645035"
+ r="2.7302806" />
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-1"
+ cx="18.004833"
+ cy="39.402473"
+ r="2.7302806" />
+ <circle
+ style="fill:#008000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-3-0"
+ cx="18.004833"
+ cy="30.371933"
+ r="2.7302806" />
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6-6"
+ cx="18.004833"
+ cy="21.341394"
+ r="2.7302806" />
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#000000"
+ x="6.9525447"
+ y="13.702217"
+ id="text3707"><tspan
+ sodipodi:role="line"
+ id="tspan3705"
+ style="stroke-width:0.264583;fill:#000000"
+ x="6.9525447"
+ y="13.702217">$write(\{a\})$:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="6.9525447"
+ y="65.261436"
+ id="text3707-1"><tspan
+ sodipodi:role="line"
+ id="tspan3705-5"
+ style="fill:#000000;stroke-width:0.264583"
+ x="6.9525447"
+ y="65.261436">$read()$:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="24.042637"
+ id="text3750"><tspan
+ sodipodi:role="line"
+ id="tspan3748"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="24.042637">$\sqsupseteq \{a\} \to$ OK</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="33.02087"
+ id="text3750-3"><tspan
+ sodipodi:role="line"
+ id="tspan3748-2"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="33.02087">$\sqsupseteq \{a\} \to$ OK</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="41.972523"
+ id="text3750-0"><tspan
+ sodipodi:role="line"
+ id="tspan3748-6"
+ style="fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="41.972523">$\not\sqsupseteq \{a\}$</tspan></text>
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6-6-4"
+ cx="18.004833"
+ cy="70.942116"
+ r="2.7302806" />
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="73.643356"
+ id="text3750-7"><tspan
+ sodipodi:role="line"
+ id="tspan3748-65"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="73.643356">$\to \{\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="14.395845"
+ y="52.022549"
+ id="text4280"><tspan
+ sodipodi:role="line"
+ id="tspan4278"
+ style="fill:#000000;stroke-width:0.264583"
+ x="14.395845"
+ y="52.022549">return OK</tspan></text>
+ </g>
+</svg>
diff --git a/doc/talks/assets/lattice/lattice7.svg b/doc/talks/assets/lattice/lattice7.svg
new file mode 100644
index 00000000..7ce8bda8
--- /dev/null
+++ b/doc/talks/assets/lattice/lattice7.svg
@@ -0,0 +1,581 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="1000"
+ height="400"
+ viewBox="0 0 264.58333 105.83333"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ sodipodi:docname="lattice7.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="false"
+ inkscape:zoom="1.0419012"
+ inkscape:cx="276.89766"
+ inkscape:cy="254.34273"
+ inkscape:window-width="1920"
+ inkscape:window-height="999"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer2" />
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="Arrow2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6-4" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ sodipodi:insensitive="true">
+ <rect
+ style="fill:#ffffff;stroke:none;stroke-width:1;stop-color:#000000"
+ id="rect288"
+ width="209.84705"
+ height="104.42732"
+ x="0.77790999"
+ y="0.93738818" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Layer 2">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442"
+ id="text951"><tspan
+ sodipodi:role="line"
+ id="tspan949"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442">$\{\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893"
+ id="text1005"><tspan
+ sodipodi:role="line"
+ id="tspan1003"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893">$\{a,b,c\}$</tspan></text>
+ <g
+ id="g1175"
+ transform="translate(51.996784,3.5774043)">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698"
+ id="text1009"><tspan
+ sodipodi:role="line"
+ id="tspan1007"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698">$\{a\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166"
+ id="text1009-3"><tspan
+ sodipodi:role="line"
+ id="tspan1007-6"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166">$\{b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698"
+ id="text1009-7"><tspan
+ sodipodi:role="line"
+ id="tspan1007-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698">$\{c\}$</tspan></text>
+ </g>
+ <g
+ id="g1183"
+ transform="translate(51.996784,1.0317046)"
+ style="fill:#000000">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526"
+ id="text1117"><tspan
+ sodipodi:role="line"
+ id="tspan1115"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526">$\{a,c\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526"
+ id="text1117-3"><tspan
+ sodipodi:role="line"
+ id="tspan1115-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526">$\{a,b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526"
+ id="text1117-6"><tspan
+ sodipodi:role="line"
+ id="tspan1115-2"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526">$\{b,c\}$</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2)"
+ d="M 153.33622,90.367682 118.34198,73.428915"
+ id="path1300" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9)"
+ d="M 177.46016,90.367682 212.4544,73.428915"
+ id="path1300-2" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93)"
+ d="M 153.33622,61.655656 118.34198,44.716889"
+ id="path1300-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7)"
+ d="M 177.46016,61.655656 212.4544,44.716889"
+ id="path1300-2-6" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1)"
+ d="M 118.34198,61.655656 153.33622,44.716889"
+ id="path1300-0-7" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2)"
+ d="M 212.4544,61.655656 177.46016,44.716889"
+ id="path1300-2-6-9" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1-4)"
+ d="M 118.34198,34.227412 153.33622,17.288645"
+ id="path1300-0-7-5" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2-8)"
+ d="M 212.4544,34.227412 177.46016,17.288645"
+ id="path1300-2-6-9-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75)"
+ d="m 228.52843,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-2)"
+ d="m 101.90418,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-9"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7)"
+ d="m 165.29305,89.571762 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7-1)"
+ d="m 165.29305,32.445235 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6-9"
+ sodipodi:nodetypes="cc" />
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663"
+ cx="147.35568"
+ cy="95.24971"
+ r="2.7302806" />
+ <circle
+ style="fill:#008000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-3"
+ cx="126.08154"
+ cy="67.968384"
+ r="2.7302806" />
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6"
+ cx="119.58919"
+ cy="67.645035"
+ r="2.7302806" />
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-1"
+ cx="18.004833"
+ cy="39.402473"
+ r="2.7302806" />
+ <circle
+ style="fill:#008000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-3-0"
+ cx="18.004833"
+ cy="30.371933"
+ r="2.7302806" />
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6-6"
+ cx="18.004833"
+ cy="21.341394"
+ r="2.7302806" />
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#000000"
+ x="6.9525447"
+ y="13.702217"
+ id="text3707"><tspan
+ sodipodi:role="line"
+ id="tspan3705"
+ style="stroke-width:0.264583;fill:#000000"
+ x="6.9525447"
+ y="13.702217">$write(\{a\})$:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="6.9525447"
+ y="65.261436"
+ id="text3707-1"><tspan
+ sodipodi:role="line"
+ id="tspan3705-5"
+ style="fill:#000000;stroke-width:0.264583"
+ x="6.9525447"
+ y="65.261436">$read()$:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="24.042637"
+ id="text3750"><tspan
+ sodipodi:role="line"
+ id="tspan3748"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="24.042637">$\sqsupseteq \{a\} \to$ OK</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="33.02087"
+ id="text3750-3"><tspan
+ sodipodi:role="line"
+ id="tspan3748-2"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="33.02087">$\sqsupseteq \{a\} \to$ OK</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="41.972523"
+ id="text3750-0"><tspan
+ sodipodi:role="line"
+ id="tspan3748-6"
+ style="fill:#999999;stroke-width:0.264583"
+ x="23.457415"
+ y="41.972523">$\not\sqsupseteq \{a\}$</tspan></text>
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6-6-4"
+ cx="18.004833"
+ cy="70.942116"
+ r="2.7302806" />
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="73.643356"
+ id="text3750-7"><tspan
+ sodipodi:role="line"
+ id="tspan3748-65"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="73.643356">$\to \{\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="14.395845"
+ y="52.022549"
+ id="text4280"><tspan
+ sodipodi:role="line"
+ id="tspan4278"
+ style="fill:#000000;stroke-width:0.264583"
+ x="14.395845"
+ y="52.022549">return OK</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="14.395845"
+ y="92.005798"
+ id="text4280-3"><tspan
+ sodipodi:role="line"
+ id="tspan4278-7"
+ style="fill:#000000;stroke-width:0.264583"
+ x="14.395845"
+ y="92.005798">return $\{\}\sqcup\{a\}=\{a\}$</tspan></text>
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-1-5"
+ cx="18.004833"
+ cy="81.007744"
+ r="2.7302806" />
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="83.577797"
+ id="text3750-0-6"><tspan
+ sodipodi:role="line"
+ id="tspan3748-6-9"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="83.577797">$\to \{a\}$</tspan></text>
+ </g>
+</svg>
diff --git a/doc/talks/assets/lattice/lattice8.svg b/doc/talks/assets/lattice/lattice8.svg
new file mode 100644
index 00000000..c94a69b2
--- /dev/null
+++ b/doc/talks/assets/lattice/lattice8.svg
@@ -0,0 +1,581 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="1000"
+ height="400"
+ viewBox="0 0 264.58333 105.83333"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ sodipodi:docname="lattice8.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="false"
+ inkscape:zoom="1.4734708"
+ inkscape:cx="399.39712"
+ inkscape:cy="248.39311"
+ inkscape:window-width="1920"
+ inkscape:window-height="999"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer2" />
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="Arrow2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-75-7-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-9-3-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-93-1-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-6-8-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2-9-7-2-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Arrow2"
+ markerWidth="7.6999998"
+ markerHeight="5.5999999"
+ viewBox="0 0 7.7 5.6"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.7)"
+ d="M -2,-4 9,0 -2,4 c 2,-2.33 2,-5.66 0,-8 z"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:none"
+ id="arrow2L-1-0-6-4" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ sodipodi:insensitive="true">
+ <rect
+ style="fill:#ffffff;stroke:none;stroke-width:1;stop-color:#000000"
+ id="rect288"
+ width="209.84705"
+ height="104.42732"
+ x="0.77790999"
+ y="0.93738818" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Layer 2">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442"
+ id="text951"><tspan
+ sodipodi:role="line"
+ id="tspan949"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="99.307442">$\{\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893"
+ id="text1005"><tspan
+ sodipodi:role="line"
+ id="tspan1003"
+ style="stroke-width:0.264583;fill:#000000"
+ x="164.56372"
+ y="13.151893">$\{a,b,c\}$</tspan></text>
+ <g
+ id="g1175"
+ transform="translate(51.996784,3.5774043)">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698"
+ id="text1009"><tspan
+ sodipodi:role="line"
+ id="tspan1007"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="67.008698">$\{a\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166"
+ id="text1009-3"><tspan
+ sodipodi:role="line"
+ id="tspan1007-6"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="67.017166">$\{b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698"
+ id="text1009-7"><tspan
+ sodipodi:role="line"
+ id="tspan1007-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="67.008698">$\{c\}$</tspan></text>
+ </g>
+ <g
+ id="g1183"
+ transform="translate(51.996784,1.0317046)"
+ style="fill:#000000">
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526"
+ id="text1117"><tspan
+ sodipodi:role="line"
+ id="tspan1115"
+ style="stroke-width:0.264583;fill:#000000"
+ x="112.90984"
+ y="40.841526">$\{a,c\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526"
+ id="text1117-3"><tspan
+ sodipodi:role="line"
+ id="tspan1115-5"
+ style="stroke-width:0.264583;fill:#000000"
+ x="49.27084"
+ y="40.841526">$\{a,b\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;text-align:center;text-anchor:middle;stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526"
+ id="text1117-6"><tspan
+ sodipodi:role="line"
+ id="tspan1115-2"
+ style="stroke-width:0.264583;fill:#000000"
+ x="176.20593"
+ y="40.841526">$\{b,c\}$</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2)"
+ d="M 153.33622,90.367682 118.34198,73.428915"
+ id="path1300" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9)"
+ d="M 177.46016,90.367682 212.4544,73.428915"
+ id="path1300-2" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93)"
+ d="M 153.33622,61.655656 118.34198,44.716889"
+ id="path1300-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7)"
+ d="M 177.46016,61.655656 212.4544,44.716889"
+ id="path1300-2-6" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1)"
+ d="M 118.34198,61.655656 153.33622,44.716889"
+ id="path1300-0-7" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2)"
+ d="M 212.4544,61.655656 177.46016,44.716889"
+ id="path1300-2-6-9" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-93-1-4)"
+ d="M 118.34198,34.227412 153.33622,17.288645"
+ id="path1300-0-7-5" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-7-2-8)"
+ d="M 212.4544,34.227412 177.46016,17.288645"
+ id="path1300-2-6-9-0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75)"
+ d="m 228.52843,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-2)"
+ d="m 101.90418,61.091809 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-9"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7)"
+ d="m 165.29305,89.571762 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2-9-75-7-1)"
+ d="m 165.29305,32.445235 0.33313,-12.554874 m -0.33313,12.554874 0.33313,-12.554874"
+ id="path1300-2-2-6-9"
+ sodipodi:nodetypes="cc" />
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663"
+ cx="132.33408"
+ cy="68.007973"
+ r="2.7302806" />
+ <circle
+ style="fill:#008000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-3"
+ cx="126.08154"
+ cy="67.968384"
+ r="2.7302806" />
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6"
+ cx="119.58919"
+ cy="67.645035"
+ r="2.7302806" />
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-1"
+ cx="18.004833"
+ cy="39.402473"
+ r="2.7302806" />
+ <circle
+ style="fill:#008000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-3-0"
+ cx="18.004833"
+ cy="30.371933"
+ r="2.7302806" />
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6-6"
+ cx="18.004833"
+ cy="21.341394"
+ r="2.7302806" />
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;stroke-width:0.264583;fill:#000000"
+ x="6.9525447"
+ y="13.702217"
+ id="text3707"><tspan
+ sodipodi:role="line"
+ id="tspan3705"
+ style="stroke-width:0.264583;fill:#000000"
+ x="6.9525447"
+ y="13.702217">$write(\{a\})$:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="6.9525447"
+ y="65.261436"
+ id="text3707-1"><tspan
+ sodipodi:role="line"
+ id="tspan3705-5"
+ style="fill:#000000;stroke-width:0.264583"
+ x="6.9525447"
+ y="65.261436">$read()$:</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="24.042637"
+ id="text3750"><tspan
+ sodipodi:role="line"
+ id="tspan3748"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="24.042637">$\sqsupseteq \{a\} \to$ OK</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="33.02087"
+ id="text3750-3"><tspan
+ sodipodi:role="line"
+ id="tspan3748-2"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="33.02087">$\sqsupseteq \{a\} \to$ OK</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="41.972523"
+ id="text3750-0"><tspan
+ sodipodi:role="line"
+ id="tspan3748-6"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="41.972523">$\sqsupseteq \{a\}$</tspan></text>
+ <circle
+ style="fill:#ff0000;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-6-6-4"
+ cx="18.004833"
+ cy="70.942116"
+ r="2.7302806" />
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="73.643356"
+ id="text3750-7"><tspan
+ sodipodi:role="line"
+ id="tspan3748-65"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="73.643356">$\to \{\}$</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="14.395845"
+ y="52.022549"
+ id="text4280"><tspan
+ sodipodi:role="line"
+ id="tspan4278"
+ style="fill:#000000;stroke-width:0.264583"
+ x="14.395845"
+ y="52.022549">return OK</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="14.395845"
+ y="92.005798"
+ id="text4280-3"><tspan
+ sodipodi:role="line"
+ id="tspan4278-7"
+ style="fill:#000000;stroke-width:0.264583"
+ x="14.395845"
+ y="92.005798">return $\{\}\sqcup\{a\}=\{a\}$</tspan></text>
+ <circle
+ style="fill:#800080;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stop-color:#000000"
+ id="path3663-1-5"
+ cx="18.004833"
+ cy="81.007744"
+ r="2.7302806" />
+ <text
+ xml:space="preserve"
+ style="font-size:8.46667px;line-height:1.25;font-family:sans-serif;fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="83.577797"
+ id="text3750-0-6"><tspan
+ sodipodi:role="line"
+ id="tspan3748-6-9"
+ style="fill:#000000;stroke-width:0.264583"
+ x="23.457415"
+ y="83.577797">$\to \{a\}$</tspan></text>
+ </g>
+</svg>
diff --git a/doc/talks/assets/logos/AGPLv3_Logo.png b/doc/talks/assets/logos/AGPLv3_Logo.png
new file mode 100644
index 00000000..445284a3
--- /dev/null
+++ b/doc/talks/assets/logos/AGPLv3_Logo.png
Binary files differ
diff --git a/doc/talks/assets/logos/Amazon-S3.jpg b/doc/talks/assets/logos/Amazon-S3.jpg
new file mode 100644
index 00000000..a9501973
--- /dev/null
+++ b/doc/talks/assets/logos/Amazon-S3.jpg
Binary files differ
diff --git a/doc/talks/assets/logos/NGI0Entrust_tag.png b/doc/talks/assets/logos/NGI0Entrust_tag.png
new file mode 100644
index 00000000..064c4aee
--- /dev/null
+++ b/doc/talks/assets/logos/NGI0Entrust_tag.png
Binary files differ
diff --git a/doc/talks/assets/logos/NGI0Entrust_tag.svg b/doc/talks/assets/logos/NGI0Entrust_tag.svg
new file mode 100644
index 00000000..ca0d2814
--- /dev/null
+++ b/doc/talks/assets/logos/NGI0Entrust_tag.svg
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ version="1.1"
+ id="svg2"
+ xml:space="preserve"
+ width="1600.5095"
+ height="502.77777"
+ viewBox="0 0 480.15286 150.83333"
+ sodipodi:docname="NGI0Entrust_tag.svg"
+ inkscape:export-filename="NGI0Entrust_tag.png"
+ inkscape:export-xdpi="96"
+ inkscape:export-ydpi="96"
+ inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"><sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:export-bgcolor="#ffffff00"
+ inkscape:zoom="0.32251476"
+ inkscape:cx="581.36873"
+ inkscape:cy="93.018997"
+ inkscape:window-width="1900"
+ inkscape:window-height="1008"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" /><metadata
+ id="metadata8"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs6"><linearGradient
+ id="linearGradient1220"><stop
+ id="stop1216"
+ offset="0"
+ style="stop-color:#98bf00;stop-opacity:1;" /><stop
+ id="stop1218"
+ offset="1"
+ style="stop-color:#98bf00;stop-opacity:0.51" /></linearGradient><linearGradient
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-139.45511,-135.52185,-135.52185,139.45511,177.4727,131.75308)"
+ spreadMethod="pad"
+ id="linearGradient28"><stop
+ style="stop-opacity:1;stop-color:#00afbc"
+ offset="0"
+ id="stop24" /><stop
+ style="stop-opacity:1;stop-color:#205374"
+ offset="1"
+ id="stop26" /></linearGradient><clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath38"><path
+ d="M 0,127.984 H 415.474 V 0 H 0 Z"
+ id="path36" /></clipPath><linearGradient
+ xlink:href="#linearGradient1220"
+ id="linearGradient947"
+ gradientUnits="userSpaceOnUse"
+ x1="14.915152"
+ y1="14.167241"
+ x2="214.11908"
+ y2="111.76186"
+ gradientTransform="matrix(4.4444443,0,0,-4.4444443,-33.008887,535.8)" /><clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath38-9"><path
+ d="M 0,127.984 H 415.474 V 0 H 0 Z"
+ id="path36-1" /></clipPath></defs><path
+ id="path30-1"
+ style="fill:#f9f9f9;fill-opacity:1;stroke:none;stroke-width:1.33333"
+ d="m 23.734571,9.0000043 c -8.105334,0 -14.7345708,6.6305707 -14.7345708,14.7345707 V 127.09864 c 0,8.10534 6.6292368,14.73457 14.7345708,14.73457 H 243.78106 c 8.104,0 14.73516,-6.63057 14.73516,-14.73457 v -24.34687 c 0,-2.69601 1.07032,-5.28263 2.97832,-7.19063 l 12.12832,-12.127734 c 3.38667,-3.385335 3.37709,-8.876115 -0.0176,-12.250783 L 261.51622,59.159772 c -1.92,-1.908 -3,-4.505052 -3,-7.211718 V 23.734575 c 0,-8.104 -6.63116,-14.7345707 -14.73516,-14.7345707 z M 167.57344,31.463678 c 7.44667,0 14.20688,1.256061 20.27754,3.764061 2.632,1.088001 5.08275,2.388849 7.34942,3.903516 4.80533,3.209334 5.06012,10.281271 0.42011,13.935937 -2.97733,2.345334 -7.22163,2.377851 -10.34296,0.228516 -4.91334,-3.384 -10.49187,-5.075976 -16.73321,-5.075976 -5.424,0 -10.24005,1.134438 -14.44805,3.398439 -4.21066,2.269332 -7.48813,5.464221 -9.83613,9.593553 -2.348,4.128 -3.5209,8.863551 -3.5209,14.204884 0,5.262666 1.1729,9.957351 3.5209,14.085351 2.348,4.128 5.60586,7.346655 9.7752,9.653322 4.168,2.306669 8.92374,3.459959 14.2664,3.459959 3.10534,0 6.04131,-0.3652 8.80664,-1.09453 2.94134,-0.776 5.18537,-2.993344 6.0627,-5.777344 0.30933,-0.986667 -0.44658,-1.991601 -1.48125,-1.991601 -5.64933,0 -10.18571,-4.761453 -9.81504,-10.489452 0.33867,-5.226669 4.91211,-9.179884 10.15078,-9.179884 h 9.71074 c 0.0867,0 0.17072,0.01023 0.25606,0.0129 0.0867,-0.0027 0.17072,-0.0129 0.25605,-0.0129 h 0.67442 c 4.77733,0 8.64844,3.871852 8.64844,8.647852 v 12.062694 c 0,9.916005 -6.37351,18.792905 -15.84551,21.728905 -0.06,0.0187 -0.12164,0.0376 -0.18164,0.0563 -6.072,1.86133 -12.18391,2.79317 -18.33458,2.79317 -8.82399,0 -16.75577,-1.88135 -23.79843,-5.64668 -7.04267,-3.764 -12.56658,-8.98403 -16.57324,-15.662698 -4.00667,-6.678666 -6.01055,-14.225313 -6.01055,-22.645314 0,-8.417335 2.00388,-15.966223 6.01055,-22.643554 4.00666,-6.678669 9.57036,-11.900032 16.6957,-15.662698 7.12,-3.763998 15.13451,-5.646678 24.03984,-5.646678 z M 42.631642,32.920319 h 1.957032 c 2.911998,0 5.670649,1.305063 7.514647,3.558396 l 32.180275,39.300002 c 2.402667,2.936001 7.160157,1.236303 7.160157,-2.55703 V 42.633404 c 0,-5.365335 4.347753,-9.713085 9.713087,-9.713085 5.36533,0 9.71484,4.34775 9.71484,9.713085 v 65.568166 c 0,5.364 -4.34951,9.71309 -9.71484,9.71309 h -1.841018 c -2.907999,0 -5.662869,-1.30236 -7.508202,-3.54903 L 59.502542,75.025789 c -2.405334,-2.929336 -7.157814,-1.228363 -7.157814,2.562303 v 30.613478 c 0,5.364 -4.347754,9.71309 -9.713086,9.71309 -5.364,0 -9.713085,-4.34909 -9.713085,-9.71309 V 42.633404 c 0,-5.365335 4.349085,-9.713085 9.713085,-9.713085 z m 182.129888,6e-4 c 5.432,0 9.83496,4.402374 9.83496,9.834375 v 65.323826 c 0,5.432 -4.40296,9.83497 -9.83496,9.83497 -5.432,0 -9.83437,-4.40297 -9.83437,-9.83497 V 42.755279 c 0,-5.432001 4.40237,-9.834375 9.83437,-9.834375 z" /><g
+ id="g10"
+ transform="matrix(1.3333333,0,0,-1.3333333,-9.9026662,160.74)"><g
+ id="g40"
+ transform="translate(175.9982,95.8645)" /><g
+ id="g44"
+ transform="translate(152.1193,64.9934)" />
+
+
+
+
+
+
+<g
+ id="NGI0Entrust"><title
+ id="title12661">NGI Zero Entrust</title><path
+ id="path7692"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.999999"
+ d="m 133.10651,96.933602 c -6.67899,0 -12.68988,-1.41201 -18.02988,-4.23501 -5.344,-2.822 -9.51678,-6.73803 -12.52178,-11.74702 -3.004994,-5.008 -4.507906,-10.66967 -4.507906,-16.982669 0,-6.314995 1.502912,-11.974991 4.507906,-16.983985 3.005,-5.008995 7.14794,-8.924024 12.42993,-11.747021 5.282,-2.823998 11.23084,-4.23501 17.84883,-4.23501 4.613,0 9.19693,0.698875 13.75093,2.094873 0.045,0.014 0.0912,0.02819 0.13623,0.04219 7.10399,2.201999 11.88413,8.859686 11.88413,16.29668 v 9.047022 c 0,3.581996 -2.90333,6.485889 -6.48633,6.485889 h -0.50581 c -0.064,0 -0.12704,-0.0077 -0.19204,-0.0097 -0.064,0.002 -0.12704,0.0097 -0.19204,0.0097 h -7.28306 c -3.92899,0 -7.35908,-2.964914 -7.61308,-6.884912 -0.278,-4.295996 3.12428,-7.86709 7.36128,-7.86709 0.776,0 1.34293,-0.753702 1.11093,-1.493702 -0.65799,-2.087998 -2.34102,-3.751009 -4.54702,-4.333008 -2.07399,-0.546999 -4.27598,-0.820898 -6.60498,-0.820898 -4.00699,0 -7.57381,0.864972 -10.6998,2.594971 -3.127,1.729999 -5.5704,4.143993 -7.3314,7.23999 -1.761,3.095997 -2.64067,6.617018 -2.64067,10.564014 0,4.005996 0.87967,7.557666 2.64067,10.653656 1.761,3.097 4.2191,5.49317 7.3771,7.19517 3.156,1.698 6.76804,2.54883 10.83604,2.54883 4.68099,0 8.8649,-1.26899 12.5499,-3.80699 2.341,-1.61199 5.52423,-1.58761 7.75723,0.17139 3.47999,2.741 3.2889,8.04495 -0.31509,10.45196 -1.7,1.13599 -3.53807,2.11163 -5.51206,2.92763 -4.553,1.881 -9.62316,2.82305 -15.20816,2.82305 z m -93.706345,-1.09248 c -4.022996,0 -7.284815,-3.26081 -7.284815,-7.28482 v -49.17612 c 0,-4.022993 3.261819,-7.284815 7.284815,-7.284815 4.023996,0 7.284814,3.261822 7.284814,7.284815 V 62.34029 c 0,2.842996 3.564362,4.118722 5.36836,1.921728 L 76.282148,34.757135 c 1.383999,-1.685 3.450155,-2.661768 5.631153,-2.661768 h 1.380761 c 4.023997,0 7.286133,3.261822 7.286133,7.284815 v 49.17612 c 0,4.02401 -3.262136,7.28482 -7.286133,7.28482 -4.023995,0 -7.284815,-3.26081 -7.284815,-7.28482 V 65.615095 c 0,-2.844997 -3.568118,-4.119773 -5.370117,-1.917774 L 46.503925,93.172322 c -1.382997,1.69 -3.45199,2.6688 -5.635987,2.6688 z m 136.597415,-4.4e-4 c -4.074,0 -7.37578,-3.30178 -7.37578,-7.37578 V 39.472027 c 0,-4.073996 3.30178,-7.37622 7.37578,-7.37622 4.074,0 7.37622,3.302224 7.37622,7.37622 v 48.992875 c 0,4.074 -3.30222,7.37578 -7.37622,7.37578 z" /><path
+ id="path30"
+ style="fill:url(#linearGradient947);fill-opacity:1;stroke:none;stroke-width:4.44444"
+ d="M 79.115234 30 C 52.097457 30 30 52.101902 30 79.115234 L 30 423.66211 C 30 450.67989 52.097457 472.77734 79.115234 472.77734 L 812.60352 472.77734 C 839.61685 472.77734 861.7207 450.67544 861.7207 423.66211 L 861.7207 342.50586 C 861.7207 333.51919 865.28844 324.89711 871.64844 318.53711 L 912.07617 278.11133 C 923.36506 266.82688 923.33313 248.52428 912.01758 237.27539 L 871.7207 197.19922 C 865.3207 190.83922 861.7207 182.18238 861.7207 173.16016 L 861.7207 79.115234 C 861.7207 52.101902 839.61685 30 812.60352 30 L 79.115234 30 z M 558.57812 104.87891 C 583.40035 104.87891 605.93437 109.06578 626.16992 117.42578 C 634.94325 121.05245 643.11241 125.38861 650.66797 130.4375 C 666.68575 141.13528 667.53503 164.7084 652.06836 176.89062 C 642.14392 184.7084 627.99624 184.81679 617.5918 177.65234 C 601.21402 166.37234 582.6189 160.73242 561.81445 160.73242 C 543.73445 160.73242 527.68096 164.51388 513.6543 172.06055 C 499.61874 179.62499 488.69385 190.27462 480.86719 204.03906 C 473.04052 217.79906 469.13086 233.58423 469.13086 251.38867 C 469.13086 268.93089 473.04052 284.57984 480.86719 298.33984 C 488.69385 312.09984 499.55339 322.82869 513.45117 330.51758 C 527.3445 338.20647 543.19697 342.05078 561.00586 342.05078 C 571.35697 342.05078 581.14355 340.83345 590.36133 338.40234 C 600.16577 335.81568 607.64587 328.42453 610.57031 319.14453 C 611.60142 315.85564 609.0817 312.50586 605.63281 312.50586 C 586.8017 312.50586 571.68046 296.63435 572.91602 277.54102 C 574.0449 260.11879 589.28973 246.94141 606.75195 246.94141 L 639.12109 246.94141 C 639.40998 246.94141 639.69016 246.97549 639.97461 246.98438 C 640.2635 246.97549 640.54368 246.94141 640.82812 246.94141 L 643.07617 246.94141 C 659.00062 246.94141 671.9043 259.84758 671.9043 275.76758 L 671.9043 315.97656 C 671.9043 349.0299 650.65927 378.61958 619.08594 388.40625 C 618.88594 388.46847 618.68047 388.53153 618.48047 388.59375 C 598.24047 394.79819 577.86746 397.9043 557.36523 397.9043 C 527.9519 397.9043 501.51266 391.63314 478.03711 379.08203 C 454.56155 366.53536 436.14852 349.13527 422.79297 326.87305 C 409.43741 304.61083 402.75781 279.45534 402.75781 251.38867 C 402.75781 223.33089 409.43741 198.16793 422.79297 175.91016 C 436.14852 153.64793 454.6942 136.24339 478.44531 123.70117 C 502.17865 111.15451 528.89368 104.87891 558.57812 104.87891 z M 142.10547 109.73438 L 148.62891 109.73438 C 158.33557 109.73438 167.53107 114.08459 173.67773 121.5957 L 280.94531 252.5957 C 288.9542 262.38237 304.8125 256.71671 304.8125 244.07227 L 304.8125 142.11133 C 304.8125 124.22688 319.30501 109.73438 337.18945 109.73438 C 355.0739 109.73438 369.57227 124.22688 369.57227 142.11133 L 369.57227 360.67188 C 369.57227 378.55187 355.0739 393.04883 337.18945 393.04883 L 331.05273 393.04883 C 321.3594 393.04883 312.1765 388.70764 306.02539 381.21875 L 198.3418 250.08594 C 190.32402 240.32149 174.48242 245.9914 174.48242 258.62695 L 174.48242 360.67188 C 174.48242 378.55187 159.98991 393.04883 142.10547 393.04883 C 124.22547 393.04883 109.72852 378.55187 109.72852 360.67188 L 109.72852 142.11133 C 109.72852 124.22688 124.22547 109.73438 142.10547 109.73438 z M 749.20508 109.73633 C 767.31174 109.73633 781.98828 124.41091 781.98828 142.51758 L 781.98828 360.26367 C 781.98828 378.37034 767.31174 393.04688 749.20508 393.04688 C 731.09841 393.04688 716.42383 378.37034 716.42383 360.26367 L 716.42383 142.51758 C 716.42383 124.41091 731.09841 109.73633 749.20508 109.73633 z "
+ transform="matrix(0.22500001,0,0,-0.22500001,7.4269998,120.555)" /><g
+ aria-label="Z E R O"
+ transform="scale(1,-1)"
+ id="text56"
+ style="font-weight:600;font-size:31.76px;font-family:'Montserrat SemiBold';-inkscape-font-specification:Montserrat-SemiBold;fill:#6f9aa8"><path
+ d="m 261.75384,-85.665085 -13.08512,15.97528 h 13.498 v 3.4936 H 243.206 v -2.76312 l 13.08512,-15.97528 h -12.8628 v -3.4936 h 18.32552 z"
+ id="path12603" /><path
+ d="m 278.84063,-75.787725 v 6.12968 h 12.5452 v 3.46184 h -16.674 v -22.232 h 16.22936 v 3.46184 h -12.10056 v 5.78032 h 10.73488 v 3.39832 z"
+ id="path12605" /><path
+ d="m 323.74919,-66.196205 h -4.4464 l -4.54168,-6.5108 q -0.28584,0.03176 -0.85752,0.03176 h -5.01808 v 6.47904 h -4.1288 v -22.232 h 9.14688 q 2.89016,0 5.01808,0.9528 2.15968,0.9528 3.30304,2.73136 1.14336,1.77856 1.14336,4.22408 0,2.50904 -1.23864,4.31936 -1.20688,1.81032 -3.4936,2.6996 z m -4.54168,-14.32376 q 0,-2.12792 -1.39744,-3.27128 -1.39744,-1.14336 -4.09704,-1.14336 h -4.82752 v 8.86104 h 4.82752 q 2.6996,0 4.09704,-1.14336 1.39744,-1.17512 1.39744,-3.30304 z"
+ id="path12607" /><path
+ d="m 347.12448,-65.878605 q -3.39832,0 -6.12968,-1.46096 -2.73136,-1.49272 -4.2876,-4.09704 -1.55624,-2.63608 -1.55624,-5.8756 0,-3.23952 1.55624,-5.84384 1.55624,-2.63608 4.2876,-4.09704 2.73136,-1.49272 6.12968,-1.49272 3.39832,0 6.12968,1.49272 2.73136,1.46096 4.2876,4.06528 1.55624,2.60432 1.55624,5.8756 0,3.27128 -1.55624,5.8756 -1.55624,2.60432 -4.2876,4.09704 -2.73136,1.46096 -6.12968,1.46096 z m 0,-3.62064 q 2.2232,0 4.00176,-0.98456 1.77856,-1.01632 2.79488,-2.79488 1.01632,-1.81032 1.01632,-4.03352 0,-2.2232 -1.01632,-4.00176 -1.01632,-1.81032 -2.79488,-2.79488 -1.77856,-1.01632 -4.00176,-1.01632 -2.2232,0 -4.00176,1.01632 -1.77856,0.98456 -2.79488,2.79488 -1.01632,1.77856 -1.01632,4.00176 0,2.2232 1.01632,4.03352 1.01632,1.77856 2.79488,2.79488 1.77856,0.98456 4.00176,0.98456 z"
+ id="path12609" /></g><g
+ aria-label="ENTRUST"
+ transform="scale(0.99994801,-1.000052)"
+ id="Entrust"
+ style="font-weight:bold;font-size:20.009px;font-family:'Montserrat SemiBold';-inkscape-font-specification:'Montserrat SemiBold, Bold';letter-spacing:3.55932px;fill:#6f9aa8;stroke-width:0.999947"><path
+ d="m 245.81989,-41.935548 v 3.861737 h 7.90356 v 2.180981 h -10.50473 v -14.0063 h 10.2246 v 2.180981 h -7.62343 v 3.641638 h 6.76304 v 2.140963 z"
+ id="path12612" /><path
+ d="m 270.04847,-40.414864 v -9.484266 h 2.58116 v 14.0063 h -2.14096 l -7.72347,-9.484266 v 9.484266 h -2.58117 v -14.0063 h 2.14097 z"
+ id="path12614" /><path
+ d="m 285.39308,-35.89283 h -2.60117 v -11.80531 h -4.64209 v -2.20099 h 11.88535 v 2.20099 h -4.64209 z"
+ id="path12616" /><path
+ d="m 307.52074,-35.89283 h -2.80126 l -2.86129,-4.101845 q -0.18008,0.02001 -0.54024,0.02001 h -3.16142 v 4.081836 h -2.60117 v -14.0063 h 5.76259 q 1.82082,0 3.16142,0.60027 1.36061,0.60027 2.08094,1.720774 0.72032,1.120504 0.72032,2.661197 0,1.580711 -0.78035,2.721224 -0.76034,1.140513 -2.20099,1.700765 z m -2.86129,-9.024059 q 0,-1.340603 -0.88039,-2.060927 -0.8804,-0.720324 -2.58116,-0.720324 h -3.04137 v 5.582511 h 3.04137 q 1.70076,0 2.58116,-0.720324 0.88039,-0.740333 0.88039,-2.080936 z"
+ id="path12618" /><path
+ d="m 319.76395,-35.69274 q -2.90131,0 -4.52204,-1.620729 -1.62073,-1.640738 -1.62073,-4.682106 v -7.903555 h 2.60117 v 7.80351 q 0,4.121854 3.5616,4.121854 3.5416,0 3.5416,-4.121854 v -7.80351 h 2.56115 v 7.903555 q 0,3.041368 -1.62073,4.682106 -1.60072,1.620729 -4.50202,1.620729 z"
+ id="path12620" /><path
+ d="m 337.4296,-35.69274 q -1.62073,0 -3.14141,-0.460207 -1.50068,-0.460207 -2.38107,-1.220549 l 0.9004,-2.020909 q 0.86039,0.680306 2.10095,1.120504 1.26056,0.420189 2.52113,0.420189 1.5607,0 2.32105,-0.500225 0.78035,-0.500225 0.78035,-1.320594 0,-0.60027 -0.4402,-0.980441 -0.42019,-0.40018 -1.08049,-0.620279 -0.66029,-0.220099 -1.80081,-0.500225 -1.60072,-0.380171 -2.60117,-0.760342 -0.98044,-0.380171 -1.70076,-1.180531 -0.70032,-0.820369 -0.70032,-2.20099 0,-1.160522 0.62028,-2.100945 0.64029,-0.960432 1.90086,-1.520684 1.28057,-0.560252 3.1214,-0.560252 1.28058,0 2.52113,0.320144 1.24056,0.320144 2.14097,0.920414 l -0.82037,2.020909 q -0.92042,-0.540243 -1.92087,-0.820369 -1.00045,-0.280126 -1.94087,-0.280126 -1.54069,0 -2.30103,0.520234 -0.74034,0.520234 -0.74034,1.380621 0,0.60027 0.42019,0.980441 0.4402,0.380171 1.1005,0.60027 0.66029,0.220099 1.80081,0.500225 1.5607,0.360162 2.56115,0.760342 1.00045,0.380171 1.70076,1.180531 0.72033,0.80036 0.72033,2.160972 0,1.160522 -0.64029,2.100945 -0.62028,0.940423 -1.90085,1.500675 -1.28058,0.560252 -3.12141,0.560252 z"
+ id="path12622" /><path
+ d="m 354.47498,-35.89283 h -2.60117 v -11.80531 h -4.64209 v -2.20099 h 11.88535 v 2.20099 h -4.64209 z"
+ id="path12624" /></g></g>
+
+
+
+<text
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:20.01px;font-family:'Montserrat SemiBold';-inkscape-font-specification:'Montserrat SemiBold, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#6f9aa8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1"
+ id="text2843"
+ x="240.16206"
+ y="-35.894695"
+ transform="scale(1,-1)"><tspan
+ id="tspan2841"
+ x="240.16206"
+ y="-35.894695" /></text></g></svg>
diff --git a/doc/talks/assets/logos/capitole_du_libre.png b/doc/talks/assets/logos/capitole_du_libre.png
new file mode 100644
index 00000000..eaa521af
--- /dev/null
+++ b/doc/talks/assets/logos/capitole_du_libre.png
Binary files differ
diff --git a/doc/talks/assets/logos/deuxfleurs.svg b/doc/talks/assets/logos/deuxfleurs.svg
new file mode 100644
index 00000000..c298c22b
--- /dev/null
+++ b/doc/talks/assets/logos/deuxfleurs.svg
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ viewBox="0 0 70.424515 70.300102"
+ version="1.1"
+ id="svg8"
+ sodipodi:docname="logo.svg"
+ inkscape:version="1.1 (c68e22c387, 2021-05-23)"
+ inkscape:export-filename="/home/quentin/Documents/dev/deuxfleurs/site/src/img/logo.png"
+ inkscape:export-xdpi="699.30194"
+ inkscape:export-ydpi="699.30194"
+ width="70.424515"
+ height="70.300102"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <defs
+ id="defs12" />
+ <sodipodi:namedview
+ id="namedview10"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ showgrid="false"
+ inkscape:zoom="12.125"
+ inkscape:cx="43.092783"
+ inkscape:cy="48.082474"
+ inkscape:window-width="3072"
+ inkscape:window-height="1659"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg8" />
+ <g
+ id="g79969"
+ transform="translate(-0.827,34.992103)">
+ <path
+ fill="#ffffff"
+ d="m 15.632,34.661 c -0.799,-0.597 -1.498,-1.484 -2.035,-2.592 l -0.228,-0.47 -0.46,0.249 c -0.975,0.528 -1.913,0.858 -2.744,0.969 L 9.963,29.061 6.327,30.029 C 6.17,29.175 6.202,28.142 6.423,27.007 L 6.526,26.482 5.994,26.416 C 4.752,26.262 3.688,25.891 2.89,25.336 L 4.411,22.419 1.423,20.896 C 1.742,19.952 2.371,19.014 3.257,18.161 L 3.634,17.798 3.255,17.438 C 2.452,16.674 1.847,15.884 1.485,15.127 L 4.995,13.774 2.95,10.615 C 3.69,10.213 4.643,9.929 5.739,9.783 L 6.258,9.715 6.167,9.201 C 5.952,7.99 5.995,6.863 6.291,5.913 l 3.308,0.523 0.524,-3.308 c 0.988,0.013 2.08,0.326 3.164,0.907 L 13.749,4.283 13.975,3.81 C 14.454,2.807 15.019,1.986 15.628,1.406 L 18,4.326 20.372,1.406 c 0.609,0.58 1.175,1.401 1.653,2.404 l 0.226,0.473 0.462,-0.247 C 23.798,3.455 24.891,3.142 25.877,3.13 L 26.4,6.438 29.71,5.913 c 0.296,0.951 0.34,2.078 0.124,3.288 l -0.092,0.515 0.518,0.069 c 1.095,0.145 2.048,0.43 2.788,0.832 l -2.046,3.156 3.511,1.355 c -0.361,0.757 -0.966,1.547 -1.77,2.311 l -0.379,0.36 0.377,0.363 c 0.888,0.854 1.516,1.793 1.835,2.736 l -2.984,1.52 1.521,2.984 c -0.812,0.574 -1.871,0.964 -3.094,1.134 l -0.518,0.072 0.096,0.514 c 0.201,1.089 0.226,2.083 0.073,2.909 l -3.634,-0.97 -0.204,3.757 c -0.83,-0.11 -1.768,-0.44 -2.742,-0.968 l -0.459,-0.249 -0.228,0.47 c -0.539,1.107 -1.237,1.994 -2.036,2.591 L 18,32.293 Z"
+ id="path2" />
+ <path
+ d="M 7.092,10.678 C 6.562,9.189 6.394,7.708 6.66,6.478 l 2.368,0.375 0.987,0.156 0.157,-0.988 0.375,-2.368 C 11.808,3.78 13.16,4.396 14.409,5.359 14.527,5.022 14.653,4.696 14.791,4.392 13.24,3.257 11.568,2.629 10.061,2.629 9.938,2.629 9.816,2.633 9.695,2.642 L 9.184,5.865 5.96,5.354 C 5.36,6.841 5.395,8.769 6.045,10.747 6.38,10.71 6.729,10.686 7.092,10.678 Z M 21.593,5.359 c 1.248,-0.962 2.6,-1.578 3.86,-1.705 l 0.376,2.368 0.156,0.988 0.987,-0.157 2.369,-0.376 c 0.266,1.23 0.098,2.71 -0.432,4.2 0.361,0.009 0.711,0.032 1.046,0.07 C 30.606,8.769 30.64,6.841 30.04,5.353 L 26.815,5.865 26.304,2.641 c -0.12,-0.008 -0.242,-0.012 -0.365,-0.012 -1.507,0 -3.179,0.628 -4.73,1.762 0.14,0.306 0.266,0.631 0.384,0.968 z M 7.368,27 h 0.035 c 0.067,0 0.157,-0.604 0.26,-0.947 -0.098,0.004 -0.197,0.046 -0.294,0.046 -1.496,0 -2.826,-0.303 -3.83,-0.89 L 4.628,23.081 5.082,22.194 4.191,21.742 2.055,20.654 C 2.563,19.503 3.57,18.404 4.873,17.511 4.586,17.292 4.312,17.07 4.063,16.842 2.376,18.059 1.217,19.597 0.828,21.152 l 2.908,1.483 -1.482,2.843 C 3.475,26.501 5.303,27 7.368,27 Z m 27.806,-5.846 c -0.39,-1.555 -1.548,-3.093 -3.234,-4.311 -0.25,0.228 -0.523,0.451 -0.81,0.669 1.304,0.893 2.31,1.992 2.817,3.145 l -2.136,1.088 -0.891,0.453 0.454,0.892 1.089,2.137 c -1.004,0.587 -2.332,0.904 -3.828,0.904 -0.099,0 -0.199,-0.01 -0.299,-0.013 0.103,0.344 0.192,0.683 0.26,1.011 l 0.039,0.002 c 2.066,0 3.892,-0.563 5.112,-1.587 l -1.482,-2.908 z m -12.653,9.182 c -0.447,1.517 -1.181,2.812 -2.119,3.651 L 18.707,32.293 18,31.586 l -0.707,0.707 -1.695,1.694 c -0.938,-0.839 -1.673,-2.136 -2.12,-3.652 -0.296,0.206 -0.593,0.397 -0.886,0.563 0.636,1.98 1.741,3.559 3.1,4.409 L 18,33 l 2.308,2.308 c 1.358,-0.851 2.464,-2.428 3.101,-4.408 -0.295,-0.168 -0.591,-0.359 -0.888,-0.564 z"
+ fill="#ea596e"
+ id="path4" />
+ <path
+ fill="#ea596e"
+ d="m 20.118,5.683 c 0.426,1.146 0.748,2.596 0.841,4.284 l 0.2,3.683 3.564,-0.946 c 1.32,-0.351 2.655,-0.536 3.86,-0.536 0.16,0 0.318,0.003 0.474,0.01 l -1.827,2.819 3.139,1.211 c -0.958,0.759 -2.237,1.514 -3.814,2.123 l -3.441,1.328 2.001,3.099 c 0.918,1.42 1.509,2.782 1.838,3.96 L 23.709,25.853 23.527,29.21 C 22.508,28.533 21.395,27.55 20.329,26.237 L 18,23.374 15.672,26.236 c -1.066,1.312 -2.179,2.295 -3.198,2.972 l -0.18,-3.354 -3.248,0.864 c 0.329,-1.178 0.921,-2.54 1.839,-3.961 L 12.889,19.658 9.447,18.33 C 7.87,17.721 6.591,16.967 5.633,16.208 L 8.768,15 6.941,12.177 c 0.155,-0.006 0.313,-0.01 0.473,-0.01 1.206,0 2.541,0.185 3.861,0.536 l 3.564,0.947 0.202,-3.683 c 0.092,-1.688 0.415,-3.138 0.84,-4.284 L 18,8.292 20.118,5.683 M 20.308,0.692 18,3.533 15.692,0.692 C 13.703,2.224 12.271,5.684 12.046,9.804 10.429,9.374 8.854,9.167 7.414,9.167 c -2.11,0 -3.929,0.445 -5.161,1.289 l 1.989,3.073 -3.415,1.316 c 0.842,2.366 3.69,4.797 7.54,6.283 -2.241,3.465 -3.116,7.106 -2.407,9.516 l 3.537,-0.941 0.196,3.654 c 2.512,-0.07 5.703,-2.027 8.307,-5.228 2.603,3.201 5.796,5.158 8.306,5.228 l 0.198,-3.655 3.535,0.943 c 0.71,-2.411 -0.165,-6.05 -2.404,-9.517 3.849,-1.485 6.696,-3.918 7.538,-6.283 l -3.415,-1.318 1.99,-3.07 c -1.233,-0.844 -3.053,-1.29 -5.164,-1.29 -1.438,0 -3.013,0.207 -4.63,0.636 C 23.729,5.684 22.297,2.224 20.308,0.692 Z"
+ id="path6" />
+ </g>
+ <g
+ id="g79964"
+ transform="translate(-1.043816,35.993714)">
+ <path
+ fill="#ffffff"
+ d="m 51.92633,-2.0247139 c -0.799,-0.597 -1.498,-1.484 -2.035,-2.592 l -0.228,-0.47 -0.46,0.249 c -0.975,0.528 -1.913,0.858 -2.744,0.969 l -0.202,-3.7560001 -3.636,0.968 c -0.157,-0.854 -0.125,-1.887 0.096,-3.022 l 0.103,-0.525 -0.532,-0.066 c -1.242,-0.154 -2.306,-0.525 -3.104,-1.08 l 1.521,-2.917 -2.988,-1.523 c 0.319,-0.944 0.948,-1.882 1.834,-2.735 l 0.377,-0.363 -0.379,-0.36 c -0.803,-0.764 -1.408,-1.554 -1.77,-2.311 l 3.51,-1.353 -2.045,-3.159 c 0.74,-0.402 1.693,-0.686 2.789,-0.832 l 0.519,-0.068 -0.091,-0.514 c -0.215,-1.211 -0.172,-2.338 0.124,-3.288 l 3.308,0.523 0.524,-3.308 c 0.988,0.013 2.08,0.326 3.164,0.907 l 0.462,0.248 0.226,-0.473 c 0.479,-1.003 1.044,-1.824 1.653,-2.404 l 2.372,2.92 2.372,-2.92 c 0.609,0.58 1.175,1.401 1.653,2.404 l 0.226,0.473 0.462,-0.247 c 1.085,-0.581 2.178,-0.894 3.164,-0.906 l 0.523,3.308 3.31,-0.525 c 0.296,0.951 0.34,2.078 0.124,3.288 l -0.092,0.515 0.518,0.069 c 1.095,0.145 2.048,0.43 2.788,0.832 l -2.046,3.156 3.511,1.355 c -0.361,0.757 -0.966,1.547 -1.77,2.311 l -0.379,0.36 0.377,0.363 c 0.888,0.854 1.516,1.793 1.835,2.736 l -2.984,1.52 1.521,2.984 c -0.812,0.574 -1.871,0.964 -3.094,1.134 l -0.518,0.072 0.096,0.514 c 0.201,1.089 0.226,2.083 0.073,2.909 l -3.634,-0.97 -0.204,3.7570001 c -0.83,-0.11 -1.768,-0.44 -2.742,-0.968 l -0.459,-0.249 -0.228,0.47 c -0.539,1.107 -1.237,1.994 -2.036,2.591 l -2.367,-2.369 z"
+ id="path2-9" />
+ <path
+ d="m 43.38633,-26.007714 c -0.53,-1.489 -0.698,-2.97 -0.432,-4.2 l 2.368,0.375 0.987,0.156 0.157,-0.988 0.375,-2.368 c 1.261,0.127 2.613,0.743 3.862,1.706 0.118,-0.337 0.244,-0.663 0.382,-0.967 -1.551,-1.135 -3.223,-1.763 -4.73,-1.763 -0.123,0 -0.245,0.004 -0.366,0.013 l -0.511,3.223 -3.224,-0.511 c -0.6,1.487 -0.565,3.415 0.085,5.393 0.335,-0.037 0.684,-0.061 1.047,-0.069 z m 14.501,-5.319 c 1.248,-0.962 2.6,-1.578 3.86,-1.705 l 0.376,2.368 0.156,0.988 0.987,-0.157 2.369,-0.376 c 0.266,1.23 0.098,2.71 -0.432,4.2 0.361,0.009 0.711,0.032 1.046,0.07 0.651,-1.978 0.685,-3.906 0.085,-5.394 l -3.225,0.512 -0.511,-3.224 c -0.12,-0.008 -0.242,-0.012 -0.365,-0.012 -1.507,0 -3.179,0.628 -4.73,1.762 0.14,0.306 0.266,0.631 0.384,0.968 z m -14.225,21.641 h 0.035 c 0.067,0 0.157,-0.604 0.26,-0.947 -0.098,0.004 -0.197,0.046 -0.294,0.046 -1.496,0 -2.826,-0.303 -3.83,-0.89 l 1.089,-2.128 0.454,-0.887 -0.891,-0.452 -2.136,-1.088 c 0.508,-1.151 1.515,-2.25 2.818,-3.143 -0.287,-0.219 -0.561,-0.441 -0.81,-0.669 -1.687,1.217 -2.846,2.755 -3.235,4.31 l 2.908,1.483 -1.482,2.843 c 1.221,1.023 3.049,1.522 5.114,1.522 z m 27.806,-5.846 c -0.39,-1.555 -1.548,-3.093 -3.234,-4.311 -0.25,0.228 -0.523,0.451 -0.81,0.669 1.304,0.893 2.31,1.992 2.817,3.145 l -2.136,1.088 -0.891,0.453 0.454,0.892 1.089,2.137 c -1.004,0.587 -2.332,0.904 -3.828,0.904 -0.099,0 -0.199,-0.01 -0.299,-0.013 0.103,0.344 0.192,0.683 0.26,1.011 l 0.039,0.002 c 2.066,0 3.892,-0.563 5.112,-1.587 l -1.482,-2.908 z m -12.653,9.182 c -0.447,1.5170001 -1.181,2.8120001 -2.119,3.6510001 l -1.695,-1.694 -0.707,-0.707 -0.707,0.707 -1.695,1.694 c -0.938,-0.839 -1.673,-2.136 -2.12,-3.6520001 -0.296,0.2060001 -0.593,0.3970001 -0.886,0.5630001 0.636,1.98 1.741,3.559 3.1,4.409 l 2.308,-2.307 2.308,2.308 c 1.358,-0.851 2.464,-2.428 3.101,-4.408 -0.295,-0.168 -0.591,-0.359 -0.888,-0.5640001 z"
+ fill="#ea596e"
+ id="path4-3" />
+ <path
+ fill="#ea596e"
+ d="m 56.41233,-31.002714 c 0.426,1.146 0.748,2.596 0.841,4.284 l 0.2,3.683 3.564,-0.946 c 1.32,-0.351 2.655,-0.536 3.86,-0.536 0.16,0 0.318,0.003 0.474,0.01 l -1.827,2.819 3.139,1.211 c -0.958,0.759 -2.237,1.514 -3.814,2.123 l -3.441,1.328 2.001,3.099 c 0.918,1.42 1.509,2.782 1.838,3.96 l -3.244,-0.865 -0.182,3.357 c -1.019,-0.677 -2.132,-1.66 -3.198,-2.973 l -2.329,-2.863 -2.328,2.862 c -1.066,1.312 -2.179,2.295 -3.198,2.972 l -0.18,-3.354 -3.248,0.864 c 0.329,-1.178 0.921,-2.54 1.839,-3.961 l 2.004,-3.099 -3.442,-1.328 c -1.577,-0.609 -2.856,-1.363 -3.814,-2.122 l 3.135,-1.208 -1.827,-2.823 c 0.155,-0.006 0.313,-0.01 0.473,-0.01 1.206,0 2.541,0.185 3.861,0.536 l 3.564,0.947 0.202,-3.683 c 0.092,-1.688 0.415,-3.138 0.84,-4.284 l 2.119,2.609 2.118,-2.609 m 0.19,-4.991 -2.308,2.841 -2.308,-2.841 c -1.989,1.532 -3.421,4.992 -3.646,9.112 -1.617,-0.43 -3.192,-0.637 -4.632,-0.637 -2.11,0 -3.929,0.445 -5.161,1.289 l 1.989,3.073 -3.415,1.316 c 0.842,2.366 3.69,4.797 7.54,6.283 -2.241,3.465 -3.116,7.106 -2.407,9.5160001 l 3.537,-0.9410001 0.196,3.6540001 c 2.512,-0.07 5.703,-2.027 8.307,-5.2280001 2.603,3.2010001 5.796,5.1580001 8.306,5.2280001 l 0.198,-3.6550001 3.535,0.9430001 c 0.71,-2.4110001 -0.165,-6.0500001 -2.404,-9.5170001 3.849,-1.485 6.696,-3.918 7.538,-6.283 l -3.415,-1.318 1.99,-3.07 c -1.233,-0.844 -3.053,-1.29 -5.164,-1.29 -1.438,0 -3.013,0.207 -4.63,0.636 -0.225,-4.119 -1.657,-7.579 -3.646,-9.111 z"
+ id="path6-6" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:42.6667px;line-height:1.25;font-family:sans-serif;fill:#ea596e;fill-opacity:1;stroke:none"
+ x="2.2188232"
+ y="31.430677"
+ id="text46212"><tspan
+ sodipodi:role="line"
+ id="tspan46210"
+ x="2.2188232"
+ y="31.430677"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:42.6667px;font-family:'TeX Gyre Termes';-inkscape-font-specification:'TeX Gyre Termes'">D</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:42.6667px;line-height:1.25;font-family:sans-serif;fill:#ea596e;fill-opacity:1;stroke:none"
+ x="41.347008"
+ y="67.114784"
+ id="text46212-1"><tspan
+ sodipodi:role="line"
+ id="tspan46210-5"
+ x="41.347008"
+ y="67.114784"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:42.6667px;font-family:'TeX Gyre Termes';-inkscape-font-specification:'TeX Gyre Termes'">F</tspan></text>
+</svg>
diff --git a/doc/talks/assets/logos/fosdem22.png b/doc/talks/assets/logos/fosdem22.png
new file mode 100644
index 00000000..17332e4b
--- /dev/null
+++ b/doc/talks/assets/logos/fosdem22.png
Binary files differ
diff --git a/doc/talks/assets/logos/fosdem24.png b/doc/talks/assets/logos/fosdem24.png
new file mode 100644
index 00000000..11631695
--- /dev/null
+++ b/doc/talks/assets/logos/fosdem24.png
Binary files differ
diff --git a/doc/talks/assets/logos/jdll.png b/doc/talks/assets/logos/jdll.png
new file mode 100644
index 00000000..a7cbe091
--- /dev/null
+++ b/doc/talks/assets/logos/jdll.png
Binary files differ
diff --git a/doc/talks/assets/logos/logo_chatons.png b/doc/talks/assets/logos/logo_chatons.png
new file mode 100644
index 00000000..890cf17e
--- /dev/null
+++ b/doc/talks/assets/logos/logo_chatons.png
Binary files differ
diff --git a/doc/talks/assets/logos/minio.png b/doc/talks/assets/logos/minio.png
new file mode 100644
index 00000000..a71e9ccc
--- /dev/null
+++ b/doc/talks/assets/logos/minio.png
Binary files differ
diff --git a/doc/talks/assets/logos/ngi-pointer.png b/doc/talks/assets/logos/ngi-pointer.png
new file mode 100644
index 00000000..730ececa
--- /dev/null
+++ b/doc/talks/assets/logos/ngi-pointer.png
Binary files differ
diff --git a/doc/talks/assets/logos/nlnet.svg b/doc/talks/assets/logos/nlnet.svg
new file mode 100644
index 00000000..373c8d8f
--- /dev/null
+++ b/doc/talks/assets/logos/nlnet.svg
@@ -0,0 +1,34 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<!-- Created using Karbon14, part of koffice: http://www.koffice.org/karbon -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="449px" height="168px">
+ <defs>
+ </defs>
+ <g id="Layer">
+ </g>
+ <g id="Layer">
+ <path fill="#98bf00" d="M446.602 73.8789L449.102 60.234L436.207 60.234L439.957 40.145L424.512 46.191L422.012 60.234L412.617 60.234L410.117 73.8789L419.363 73.8789L416.215 91.1719C416.066 92.125 415.816 93.5234 415.566 95.3203C415.316 97.1211 415.164 98.7188 415.164 100.07C415.215 106.316 416.715 111.465 419.664 115.516C422.613 119.66 427.41 122.109 434.109 122.859L440.555 109.566C437.105 109.117 434.508 107.766 432.66 105.469C430.809 103.117 429.91 100.168 429.91 96.5703C429.91 95.8711 430.012 94.8711 430.16 93.5234C430.309 92.1719 430.461 91.0742 430.609 90.2227L433.609 73.8789L446.602 73.8789L446.602 73.8789Z" />
+ <path fill="#98bf00" d="M310.707 72.332C313.105 71.4805 315.207 71.0312 316.957 71.0312C318.855 71.0312 320.453 71.582 321.754 72.6797C323.004 73.7305 323.602 75.2812 323.602 77.4297C323.602 78.0273 323.504 78.9297 323.301 80.1797C323.102 81.3281 322.953 82.3789 322.805 83.2773L319.203 100.168C318.953 101.469 318.703 102.82 318.453 104.219C318.203 105.668 318.105 106.918 318.105 107.965C318.105 112.016 319.203 115.414 321.453 118.113C323.602 120.812 327.449 122.41 333 122.859L339.348 110.016C337.195 109.668 335.648 108.867 334.699 107.617C333.699 106.418 333.199 104.719 333.199 102.57C333.199 102.07 333.25 101.469 333.348 100.82C333.398 100.168 333.5 99.6211 333.547 99.2188L337.195 82.0273C337.496 80.5781 337.746 79.1289 337.945 77.6797C338.148 76.2812 338.246 74.8789 338.246 73.5312C338.246 68.582 336.797 64.586 333.898 61.637C330.949 58.688 326.852 57.188 321.602 57.188C318.555 57.188 315.656 57.688 312.809 58.688C310.008 59.637 306.609 61.234 302.66 63.586C302.512 62.637 302.16 61.484 301.66 60.188C301.113 58.938 300.512 57.836 299.863 56.836L286.469 62.586C287.617 64.336 288.516 66.184 289.066 68.082C289.566 69.9805 289.816 71.7812 289.816 73.4297C289.816 74.2812 289.766 75.3281 289.617 76.4805C289.516 77.6289 289.367 78.5273 289.215 79.1797L281.27 121.512L295.664 121.512L304.109 75.8281C306.16 74.2812 308.359 73.1289 310.707 72.332L310.707 72.332Z" />
+ <path fill="#98bf00" d="M350.742 80.0781C349.191 84.6758 348.441 89.5742 348.441 94.7227C348.441 99.2188 349.043 103.219 350.191 106.719C351.34 110.215 352.992 113.164 355.09 115.516C357.141 117.914 359.688 119.711 362.637 120.961C365.586 122.211 368.883 122.859 372.484 122.859C376.832 122.859 381.129 122.062 385.43 120.461C389.777 118.863 393.574 116.363 396.824 113.016L391.426 100.519C388.926 103.32 386.176 105.418 383.129 106.867C380.078 108.316 377.031 109.016 374.031 109.016C370.535 109.016 367.785 107.918 365.785 105.719C363.836 103.469 362.836 100.668 362.836 97.3711L362.836 96.4219C362.836 96.0234 362.887 95.6211 362.988 95.2227C365.637 94.8711 368.633 94.4219 371.984 93.8242C375.332 93.2227 378.73 92.5234 382.18 91.7227C385.629 90.875 388.977 89.9258 392.273 88.9258C395.523 87.9258 398.422 86.875 400.871 85.8242L400.871 80.0781C400.871 76.5312 400.32 73.332 399.223 70.4805C398.074 67.734 396.574 65.332 394.625 63.285C392.676 61.285 390.324 59.785 387.676 58.785C385.078 57.738 382.23 57.188 379.18 57.188C374.73 57.188 370.582 58.188 366.836 60.137C363.035 62.086 359.789 64.785 357.141 68.2344C354.391 71.6328 352.293 75.5781 350.742 80.0781L350.742 80.0781ZM372.383 69.9805C373.934 69.1328 375.684 68.7344 377.633 68.7344C380.281 68.7344 382.48 69.582 384.227 71.332C385.977 73.0312 386.879 75.5781 386.879 79.0273C385.43 79.4766 383.727 80.0273 381.73 80.5781C379.68 81.0781 377.633 81.5781 375.531 82.0273C373.383 82.4766 371.332 82.9258 369.285 83.3281C367.234 83.6758 365.484 83.9766 363.984 84.2266C364.234 82.1289 364.688 80.1289 365.387 78.2773C366.137 76.4297 367.086 74.7812 368.234 73.3789C369.484 71.9805 370.832 70.832 372.383 69.9805L372.383 69.9805Z" fill-rule="evenodd" />
+ <path fill="#000000" d="M404.172 140.453C404.172 139.203 403.969 138.055 403.57 137.055C403.172 136.055 402.621 135.207 401.973 134.457C401.27 133.758 400.473 133.207 399.523 132.856C398.574 132.508 397.523 132.309 396.422 132.309C394.973 132.309 393.625 132.606 392.375 133.156C391.125 133.707 390.027 134.508 389.078 135.504C388.125 136.504 387.379 137.656 386.828 139.004C386.277 140.356 385.977 141.805 385.977 143.402C385.977 144.652 386.176 145.75 386.578 146.801C386.926 147.801 387.477 148.652 388.176 149.352C388.828 150.101 389.676 150.648 390.625 151.051C391.574 151.399 392.625 151.598 393.773 151.598C395.176 151.598 396.523 151.301 397.773 150.75C399.023 150.199 400.121 149.398 401.07 148.402C402.02 147.449 402.77 146.25 403.32 144.902C403.871 143.551 404.172 142.055 404.172 140.453L404.172 140.453ZM390.277 140.402C390.574 139.504 390.977 138.703 391.477 138.004C392.023 137.305 392.676 136.754 393.426 136.305C394.176 135.856 394.973 135.656 395.922 135.656C397.371 135.656 398.422 136.106 399.172 137.004C399.922 137.856 400.32 139.106 400.32 140.652C400.32 141.602 400.172 142.555 399.871 143.504C399.621 144.402 399.223 145.203 398.672 145.902C398.121 146.602 397.473 147.152 396.723 147.601C395.973 148 395.125 148.199 394.223 148.199C392.773 148.199 391.727 147.75 390.977 146.902C390.227 146 389.824 144.801 389.824 143.254C389.824 142.305 389.977 141.352 390.277 140.402L390.277 140.402Z" fill-rule="evenodd" />
+ <path fill="#000000" d="M434.559 132.559L431.008 132.559L429.109 143.602C429.059 143.754 429.012 144.004 429.012 144.352C429.012 144.703 429.012 144.953 429.012 145.203L428.859 145.203L422.465 132.559L419.113 132.559L415.766 151.301L419.363 151.301L421.363 140.004C421.414 139.856 421.414 139.606 421.414 139.356C421.414 139.106 421.414 138.805 421.414 138.504L421.563 138.504L428.109 151.449L431.309 151.149L434.559 132.559L434.559 132.559Z" />
+ <path fill="#000000" d="M374.383 132.559L370.734 132.559L367.387 151.301L371.082 151.301L374.383 132.559L374.383 132.559Z" />
+ <path fill="#000000" d="M328.949 132.559L324.703 132.559C323.902 133.906 323.051 135.457 322.102 137.106C321.152 138.754 320.254 140.453 319.355 142.152C318.453 143.852 317.656 145.5 316.906 147.102C316.156 148.699 315.555 150.101 315.105 151.301L318.953 151.301C319.105 150.949 319.254 150.5 319.453 150.051C319.652 149.602 319.855 149.102 320.105 148.652C320.305 148.199 320.504 147.75 320.703 147.301C320.902 146.852 321.102 146.453 321.254 146.102L327.75 146.102C327.801 146.551 327.801 147 327.852 147.5L328 148.949C328.051 149.398 328.102 149.852 328.152 150.301C328.199 150.75 328.199 151.098 328.199 151.449L331.898 151.149C331.898 150.449 331.848 149.648 331.75 148.699C331.699 147.75 331.551 146.75 331.398 145.703C331.25 144.652 331.098 143.504 330.898 142.351C330.75 141.203 330.551 140.055 330.301 138.906C330.102 137.754 329.898 136.656 329.648 135.555C329.398 134.508 329.199 133.508 328.949 132.559L328.949 132.559ZM326.602 138.106C326.703 138.656 326.801 139.254 326.902 139.902C327 140.504 327.102 141.106 327.152 141.652C327.25 142.203 327.301 142.601 327.352 142.953L322.703 142.953C322.953 142.504 323.203 142.004 323.453 141.453C323.754 140.902 324.051 140.305 324.352 139.703C324.703 139.106 325 138.555 325.301 138.004C325.602 137.453 325.852 136.957 326.102 136.606L326.301 136.606C326.402 137.004 326.5 137.504 326.602 138.106L326.602 138.106Z" fill-rule="evenodd" />
+ <path fill="#000000" d="M357.641 135.957L358.188 132.559L345.395 132.559L344.844 135.957L349.391 135.957L346.742 151.301L350.391 151.301L353.09 135.957L357.641 135.957L357.641 135.957Z" />
+ <path fill="#000000" d="M297.465 132.309C296.414 132.309 295.363 132.356 294.312 132.457C293.266 132.606 292.266 132.758 291.316 133.008L288.168 150.852C289.117 151.098 290.215 151.25 291.414 151.399C292.566 151.551 293.664 151.598 294.715 151.598C296.262 151.598 297.664 151.348 299.012 150.852C300.363 150.301 301.562 149.602 302.562 148.652C303.559 147.699 304.359 146.551 304.961 145.203C305.508 143.852 305.809 142.305 305.809 140.606C305.809 139.254 305.609 138.106 305.211 137.055C304.762 136.004 304.211 135.156 303.461 134.457C302.711 133.758 301.812 133.207 300.812 132.856C299.762 132.508 298.664 132.309 297.465 132.309L297.465 132.309ZM296.664 135.707C297.414 135.707 298.113 135.805 298.762 135.957C299.414 136.106 299.961 136.406 300.41 136.805C300.91 137.203 301.312 137.703 301.562 138.356C301.812 138.953 301.961 139.703 301.961 140.652C301.961 141.852 301.812 142.902 301.461 143.852C301.16 144.801 300.711 145.602 300.113 146.25C299.512 146.902 298.812 147.352 297.961 147.699C297.113 148.051 296.215 148.199 295.164 148.199C294.715 148.199 294.266 148.199 293.715 148.152C293.164 148.102 292.664 148.051 292.316 148L294.465 135.906C294.766 135.856 295.164 135.805 295.613 135.754C296.062 135.707 296.414 135.707 296.664 135.707L296.664 135.707Z" fill-rule="evenodd" />
+ <path fill="#000000" d="M185.809 62.586C186.957 64.336 187.855 66.184 188.406 68.082C188.906 69.9805 189.156 71.7812 189.156 73.4297C189.156 74.2812 189.105 75.3281 188.957 76.4805C188.855 77.6289 188.707 78.5273 188.555 79.1797L180.609 121.512L195.004 121.512L203.449 75.8281C205.5 74.2812 207.699 73.1289 210.047 72.332C212.445 71.4805 214.547 71.0312 216.297 71.0312C218.195 71.0312 219.793 71.582 221.094 72.6797C222.344 73.7305 222.941 75.2812 222.941 77.4297C222.941 78.0273 222.844 78.9297 222.645 80.1797C222.441 81.3281 222.293 82.3789 222.145 83.2773L218.543 100.168C218.293 101.469 218.043 102.82 217.793 104.219C217.547 105.668 217.445 106.918 217.445 107.965C217.445 112.016 218.543 115.414 220.793 118.113C222.941 120.812 226.793 122.41 232.34 122.859L238.688 110.016C236.539 109.668 234.988 108.867 234.039 107.617C233.039 106.418 232.539 104.719 232.539 102.57C232.539 102.07 232.59 101.469 232.688 100.82C232.738 100.168 232.84 99.6211 232.891 99.2188L236.539 82.0273C236.836 80.5781 237.086 79.1289 237.285 77.6797C237.488 76.2812 237.586 74.8789 237.586 73.5312C237.586 68.582 236.137 64.586 233.238 61.637C230.289 58.688 226.191 57.188 220.945 57.188C217.895 57.188 214.996 57.688 212.148 58.688C209.348 59.637 205.949 61.234 202 63.586C201.852 62.637 201.5 61.484 201 60.188C200.453 58.938 199.852 57.836 199.203 56.836L185.809 62.586L185.809 62.586Z" />
+ <path fill="#000000" d="M276.82 31.547L262.676 31.547L251.883 90.0234C251.43 91.9727 251.082 94.0234 250.832 96.1719C250.582 98.2695 250.434 100.219 250.434 102.019C250.434 107.816 251.531 112.566 253.781 116.262C256.031 119.961 259.828 122.16 265.176 122.859L271.672 109.566C270.625 109.066 269.723 108.516 268.875 107.918C268.023 107.367 267.324 106.617 266.773 105.769C266.176 104.918 265.727 103.918 265.477 102.719C265.227 101.519 265.074 100.019 265.074 98.2695C265.074 97.4219 265.125 96.4727 265.227 95.4727C265.375 94.4219 265.527 93.3711 265.676 92.2734L276.82 31.547L276.82 31.547Z" />
+ <path fill="#000000" d="M246.434 132.559L242.785 132.559L240.387 146.25C239.887 146.801 239.285 147.25 238.535 147.652C237.785 148 236.988 148.199 236.086 148.199C235.188 148.199 234.488 148 233.988 147.601C233.438 147.152 233.188 146.453 233.188 145.402C233.188 145.203 233.238 144.902 233.289 144.504C233.34 144.152 233.34 143.801 233.387 143.504L235.387 132.559L231.688 132.559L229.738 143.453C229.691 143.902 229.641 144.352 229.59 144.801C229.539 145.25 229.539 145.602 229.539 145.953C229.539 146.953 229.691 147.801 229.988 148.551C230.289 149.301 230.691 149.852 231.191 150.301C231.738 150.75 232.34 151.098 232.988 151.301C233.688 151.5 234.387 151.598 235.137 151.598C236.988 151.598 238.637 151.051 240.137 149.898C240.137 150.148 240.137 150.449 240.188 150.75C240.188 151 240.188 151.25 240.234 151.5L243.883 151.25C243.836 151 243.836 150.75 243.836 150.449C243.785 150.199 243.785 149.898 243.785 149.551C243.785 148.949 243.836 148.301 243.883 147.652C243.934 146.953 243.984 146.301 244.133 145.703L246.434 132.559L246.434 132.559Z" />
+ <path fill="#000000" d="M276.621 132.559L273.074 132.559L271.172 143.602C271.125 143.754 271.074 144.004 271.074 144.352C271.074 144.703 271.074 144.953 271.074 145.203L270.922 145.203L264.527 132.559L261.176 132.559L257.828 151.301L261.426 151.301L263.426 140.004C263.477 139.856 263.477 139.606 263.477 139.356C263.477 139.106 263.477 138.805 263.477 138.504L263.625 138.504L270.176 151.449L273.371 151.149L276.621 132.559L276.621 132.559Z" />
+ <path fill="#000000" d="M214.797 134.457C214.098 133.758 213.297 133.207 212.348 132.856C211.398 132.508 210.348 132.309 209.25 132.309C207.801 132.309 206.449 132.606 205.199 133.156C203.949 133.707 202.852 134.508 201.902 135.504C200.953 136.504 200.203 137.656 199.652 139.004C199.102 140.356 198.801 141.805 198.801 143.402C198.801 144.652 199.004 145.75 199.402 146.801C199.754 147.801 200.301 148.652 201 149.352C201.652 150.101 202.5 150.648 203.449 151.051C204.398 151.399 205.449 151.598 206.598 151.598C208 151.598 209.348 151.301 210.598 150.75C211.848 150.199 212.945 149.398 213.895 148.402C214.848 147.449 215.598 146.25 216.145 144.902C216.695 143.551 216.996 142.055 216.996 140.453C216.996 139.203 216.797 138.055 216.395 137.055C215.996 136.055 215.445 135.207 214.797 134.457L214.797 134.457ZM204.301 138.004C204.852 137.305 205.5 136.754 206.25 136.305C207 135.856 207.801 135.656 208.75 135.656C210.199 135.656 211.246 136.106 211.996 137.004C212.746 137.856 213.148 139.106 213.148 140.652C213.148 141.602 212.996 142.555 212.695 143.504C212.445 144.402 212.047 145.203 211.496 145.902C210.949 146.602 210.297 147.152 209.547 147.601C208.797 148 207.949 148.199 207.051 148.199C205.602 148.199 204.551 147.75 203.801 146.902C203.051 146 202.652 144.801 202.652 143.254C202.652 142.305 202.801 141.352 203.102 140.402C203.402 139.504 203.801 138.703 204.301 138.004L204.301 138.004Z" fill-rule="evenodd" />
+ <path fill="#000000" d="M188.258 132.559L177.961 132.559L174.613 151.301L178.312 151.301L179.559 144.152L186.309 144.152L186.906 140.754L180.16 140.754L181.008 135.957L187.656 135.957L188.258 132.559L188.258 132.559Z" />
+ <path fill="#98bf00" d="M127.082 44.891C128.43 33.945 125.684 24.102 118.883 15.402C112.086 6.707 103.191 1.66 92.2461 0.309C81.3008 -1.039 71.4531 1.711 62.7578 8.508C54.7109 14.754 49.8125 22.801 48.0625 32.648C47.9141 33.496 47.7617 34.297 47.6641 35.145C47.5625 35.996 47.5117 36.797 47.4648 37.594C47.1133 42.191 47.5625 46.59 48.7617 50.789C50.1133 55.688 52.4609 60.285 55.8594 64.633C59.2578 68.9805 63.1563 72.3828 67.6055 74.9297C71.3516 77.0781 75.5 78.5273 80.0508 79.3281C80.8516 79.4766 81.6484 79.5781 82.5 79.7266C82.9492 79.7773 83.3984 79.8281 83.8477 79.8789C84.9492 75.4297 86.6484 71.2812 88.9961 67.531C87.4453 67.582 85.8477 67.531 84.25 67.383C84.1484 67.332 84.0977 67.332 84.0469 67.332C82.1992 67.082 80.3984 66.734 78.75 66.184C73.6016 64.535 69.2539 61.484 65.707 56.938C62.1562 52.391 60.2578 47.441 59.9062 42.043C59.8086 40.293 59.8594 38.543 60.1094 36.695C60.1094 36.645 60.1094 36.547 60.1094 36.496C61.0586 29.047 64.5078 23 70.4531 18.352C76.4531 13.703 83.1992 11.805 90.7461 12.754C98.293 13.656 104.391 17.102 109.039 23.102C113.688 29.098 115.586 35.844 114.688 43.395C114.438 45.094 114.137 46.691 113.688 48.242C117.887 46.891 122.281 46.191 126.883 46.242C126.93 45.793 127.031 45.344 127.082 44.891L127.082 44.891Z" />
+ <path fill="#98bf00" d="M132.328 51.488C131.48 51.391 130.68 51.289 129.828 51.238C125.23 50.941 120.832 51.391 116.637 52.539C111.738 53.887 107.141 56.289 102.789 59.688C98.4414 63.035 95.043 66.934 92.5469 71.3828C90.3945 75.1289 88.9453 79.2773 88.0977 83.8281C92.4453 84.5742 96.4453 85.8242 100.141 87.6758C100.391 85.875 100.742 84.1758 101.242 82.5781C102.891 77.4297 105.941 73.082 110.488 69.5312C115.035 65.984 119.984 64.035 125.434 63.684C127.18 63.586 128.93 63.633 130.781 63.883C130.828 63.883 130.879 63.883 130.93 63.883C138.375 64.836 144.426 68.332 149.074 74.2812C153.77 80.2266 155.668 86.9766 154.719 94.5234C153.77 102.07 150.32 108.168 144.375 112.863C138.426 117.512 131.68 119.363 124.23 118.461C125.082 122.512 125.332 126.758 125.031 131.156C134.977 131.809 143.973 128.957 152.02 122.711C160.719 115.914 165.766 107.016 167.113 96.0703C168.465 85.125 165.715 75.2812 158.918 66.582C152.621 58.535 144.574 53.637 134.777 51.891C133.93 51.738 133.129 51.59 132.328 51.488L132.328 51.488Z" />
+ <path fill="#000000" d="M128.93 78.7266C125.48 78.3281 122.434 79.1797 119.684 81.3281C116.934 83.4766 115.387 86.2266 114.984 89.625C114.535 93.0742 115.387 96.1211 117.535 98.8711C119.684 101.621 122.434 103.168 125.883 103.57C129.281 104.019 132.328 103.168 135.078 101.019C137.828 98.8711 139.375 96.1211 139.824 92.6719C140.227 89.2734 139.375 86.2266 137.227 83.4766C135.078 80.7266 132.328 79.1797 128.93 78.7266L128.93 78.7266Z" />
+ <path fill="#98bf00" d="M12.8281 73.6289C13.7773 66.082 17.2266 59.938 23.2227 55.289C29.1719 50.641 35.8672 48.742 43.3164 49.691C42.4648 45.641 42.1641 41.395 42.5156 36.996C32.5703 36.344 23.5742 39.145 15.5273 45.441C6.77734 52.238 1.78125 61.137 0.433594 72.082C-0.917969 83.0273 1.78125 92.8242 8.62891 101.57C14.875 109.617 22.9219 114.516 32.7695 116.262C33.5703 116.414 34.3672 116.512 35.2188 116.664C36.0664 116.762 36.8672 116.863 37.7188 116.914C42.3164 117.215 46.7148 116.762 50.9102 115.613C55.7578 114.215 60.4062 111.816 64.7578 108.465C69.0547 105.066 72.4531 101.168 75.0039 96.7695C77.1523 93.0234 78.6016 88.875 79.4492 84.3281C75.1016 83.5781 71.1055 82.2773 67.4062 80.4766C67.1563 82.2266 66.8047 83.9258 66.3047 85.5742C64.6562 90.7227 61.6055 95.0703 57.0586 98.6211C52.5117 102.168 47.5625 104.117 42.1641 104.469C40.4141 104.566 38.6172 104.519 36.7656 104.269C36.7188 104.269 36.668 104.269 36.6172 104.219C29.1719 103.269 23.1211 99.8203 18.4727 93.8711C13.7773 87.875 11.8789 81.1289 12.8281 73.6289L12.8281 73.6289Z" />
+ <path fill="#000000" d="M32.4688 67.133C29.7188 69.2305 28.1719 72.0312 27.7227 75.4805C27.3203 78.8281 28.1719 81.8789 30.3203 84.625C32.418 87.375 35.168 88.9727 38.6172 89.4258C42.0664 89.7734 45.1133 88.9258 47.8633 86.8242C50.5625 84.6758 52.1094 81.8789 52.5625 78.5273C53.0117 75.0781 52.1602 71.9805 50.0117 69.2812C47.8633 66.535 45.1133 64.984 41.6641 64.586C38.2148 64.133 35.168 64.984 32.4688 67.133L32.4688 67.133Z" />
+ <path fill="#000000" d="M97.293 32.348C95.1445 29.598 92.3438 28.047 88.9453 27.648C85.4961 27.199 82.4492 28.047 79.75 30.199C77 32.297 75.4023 35.098 75.0039 38.543C74.5508 41.941 75.4531 44.992 77.6016 47.742C79.6992 50.441 82.4492 52.039 85.8984 52.488C89.2969 52.84 92.3438 51.988 95.0938 49.891C97.8438 47.742 99.3906 44.941 99.8438 41.594C100.242 38.145 99.3906 35.047 97.293 32.348L97.293 32.348Z" />
+ <path fill="#98bf00" d="M85.0469 88.4258C84.5977 88.375 84.1484 88.3242 83.6992 88.2734C82.5977 92.7227 80.8984 96.8711 78.5508 100.621C80.1016 100.519 81.6992 100.57 83.3477 100.769C83.3984 100.769 83.4492 100.769 83.5 100.82C85.3477 101.019 87.0977 101.371 88.7969 101.918C93.9453 103.57 98.293 106.668 101.84 111.215C105.391 115.715 107.289 120.66 107.641 126.109C107.738 127.859 107.688 129.609 107.438 131.457C107.438 131.508 107.438 131.559 107.438 131.656C106.488 139.106 103.039 145.152 97.0938 149.801C91.0938 154.449 84.3477 156.348 76.8008 155.398C69.2539 154.449 63.1563 151 58.5078 145.051C53.8086 139.055 51.9102 132.309 52.8594 124.762C53.0625 123.062 53.4102 121.461 53.9102 119.91C49.6641 121.262 45.2656 121.91 40.6641 121.91C40.6172 122.359 40.5156 122.812 40.4648 123.262C39.1172 134.207 41.8164 144.004 48.6641 152.75C55.4609 161.445 64.3555 166.492 75.3008 167.844C86.2461 169.191 96.043 166.445 104.789 159.645C112.836 153.348 117.734 145.301 119.484 135.457C119.633 134.656 119.734 133.856 119.883 133.008C119.934 132.156 120.035 131.359 120.082 130.559C120.383 125.91 119.934 121.512 118.785 117.363C117.434 112.465 115.035 107.867 111.688 103.519C108.289 99.1719 104.391 95.7227 99.9922 93.2227C96.1953 91.0742 92.0469 89.625 87.4961 88.8242C86.6992 88.6758 85.8984 88.5234 85.0469 88.4258L85.0469 88.4258Z" />
+ <path fill="#000000" d="M89.9961 120.41C87.8477 117.664 85.0977 116.113 81.6484 115.664C78.1992 115.266 75.1523 116.113 72.4531 118.262C69.7031 120.41 68.1562 123.16 67.7031 126.559C67.2539 130.008 68.1562 133.059 70.3047 135.805C72.4024 138.555 75.1523 140.106 78.6016 140.504C82.0508 140.953 85.0977 140.106 87.8477 137.953C90.5469 135.805 92.0938 133.059 92.5469 129.609C92.9453 126.211 92.0938 123.16 89.9961 120.41L89.9961 120.41Z" />
+ </g>
+</svg>
diff --git a/doc/talks/assets/logos/pses.png b/doc/talks/assets/logos/pses.png
new file mode 100644
index 00000000..da871f83
--- /dev/null
+++ b/doc/talks/assets/logos/pses.png
Binary files differ
diff --git a/doc/talks/assets/logos/rust_logo.png b/doc/talks/assets/logos/rust_logo.png
new file mode 100644
index 00000000..0e4809ec
--- /dev/null
+++ b/doc/talks/assets/logos/rust_logo.png
Binary files differ
diff --git a/doc/talks/assets/map.png b/doc/talks/assets/map.png
new file mode 100644
index 00000000..1dff3ab6
--- /dev/null
+++ b/doc/talks/assets/map.png
Binary files differ
diff --git a/doc/talks/assets/neptune.jpg b/doc/talks/assets/neptune.jpg
new file mode 100644
index 00000000..61fcbff6
--- /dev/null
+++ b/doc/talks/assets/neptune.jpg
Binary files differ
diff --git a/doc/talks/assets/perf/db_engine.png b/doc/talks/assets/perf/db_engine.png
new file mode 100644
index 00000000..b1124b04
--- /dev/null
+++ b/doc/talks/assets/perf/db_engine.png
Binary files differ
diff --git a/doc/talks/assets/perf/endpoint_latency_0.7_0.8_minio.png b/doc/talks/assets/perf/endpoint_latency_0.7_0.8_minio.png
new file mode 100644
index 00000000..92eac3fb
--- /dev/null
+++ b/doc/talks/assets/perf/endpoint_latency_0.7_0.8_minio.png
Binary files differ
diff --git a/doc/talks/assets/perf/io-0.7-0.8-minio.png b/doc/talks/assets/perf/io-0.7-0.8-minio.png
new file mode 100644
index 00000000..f581a22e
--- /dev/null
+++ b/doc/talks/assets/perf/io-0.7-0.8-minio.png
Binary files differ
diff --git a/doc/talks/assets/perf/ttfb.png b/doc/talks/assets/perf/ttfb.png
new file mode 100644
index 00000000..c0335bd9
--- /dev/null
+++ b/doc/talks/assets/perf/ttfb.png
Binary files differ
diff --git a/doc/talks/assets/schema-streaming-1.png b/doc/talks/assets/schema-streaming-1.png
new file mode 100644
index 00000000..4113f030
--- /dev/null
+++ b/doc/talks/assets/schema-streaming-1.png
Binary files differ
diff --git a/doc/talks/assets/schema-streaming-2.png b/doc/talks/assets/schema-streaming-2.png
new file mode 100644
index 00000000..2f97bb33
--- /dev/null
+++ b/doc/talks/assets/schema-streaming-2.png
Binary files differ
diff --git a/doc/talks/assets/schema-streaming.png b/doc/talks/assets/schema-streaming.png
new file mode 100644
index 00000000..3b24d910
--- /dev/null
+++ b/doc/talks/assets/schema-streaming.png
Binary files differ
diff --git a/doc/talks/assets/screenshots/garage_stats_0.10.png b/doc/talks/assets/screenshots/garage_stats_0.10.png
new file mode 100644
index 00000000..78a36ead
--- /dev/null
+++ b/doc/talks/assets/screenshots/garage_stats_0.10.png
Binary files differ
diff --git a/doc/talks/assets/screenshots/garage_status_0.10.png b/doc/talks/assets/screenshots/garage_status_0.10.png
new file mode 100644
index 00000000..510717ca
--- /dev/null
+++ b/doc/talks/assets/screenshots/garage_status_0.10.png
Binary files differ
diff --git a/doc/talks/assets/screenshots/garage_status_0.9_prod.png b/doc/talks/assets/screenshots/garage_status_0.9_prod.png
new file mode 100644
index 00000000..e1a05899
--- /dev/null
+++ b/doc/talks/assets/screenshots/garage_status_0.9_prod.png
Binary files differ
diff --git a/doc/talks/assets/screenshots/garage_status_0.9_prod_zonehl.png b/doc/talks/assets/screenshots/garage_status_0.9_prod_zonehl.png
new file mode 100644
index 00000000..99d46f98
--- /dev/null
+++ b/doc/talks/assets/screenshots/garage_status_0.9_prod_zonehl.png
Binary files differ
diff --git a/doc/talks/assets/screenshots/garage_status_unhealthy_0.10.png b/doc/talks/assets/screenshots/garage_status_unhealthy_0.10.png
new file mode 100644
index 00000000..b167687d
--- /dev/null
+++ b/doc/talks/assets/screenshots/garage_status_unhealthy_0.10.png
Binary files differ
diff --git a/doc/talks/assets/screenshots/garage_worker_list_0.10.png b/doc/talks/assets/screenshots/garage_worker_list_0.10.png
new file mode 100644
index 00000000..078f0607
--- /dev/null
+++ b/doc/talks/assets/screenshots/garage_worker_list_0.10.png
Binary files differ
diff --git a/doc/talks/assets/screenshots/garage_worker_param_0.10.png b/doc/talks/assets/screenshots/garage_worker_param_0.10.png
new file mode 100644
index 00000000..39ee11aa
--- /dev/null
+++ b/doc/talks/assets/screenshots/garage_worker_param_0.10.png
Binary files differ
diff --git a/doc/talks/assets/screenshots/grafana_dashboard.png b/doc/talks/assets/screenshots/grafana_dashboard.png
new file mode 100644
index 00000000..bda2d732
--- /dev/null
+++ b/doc/talks/assets/screenshots/grafana_dashboard.png
Binary files differ
diff --git a/doc/talks/assets/screenshots/jaeger_listobjects.png b/doc/talks/assets/screenshots/jaeger_listobjects.png
new file mode 100644
index 00000000..ab7d68f4
--- /dev/null
+++ b/doc/talks/assets/screenshots/jaeger_listobjects.png
Binary files differ
diff --git a/doc/talks/assets/screenshots/jaeger_putobject.png b/doc/talks/assets/screenshots/jaeger_putobject.png
new file mode 100644
index 00000000..7966275e
--- /dev/null
+++ b/doc/talks/assets/screenshots/jaeger_putobject.png
Binary files differ
diff --git a/doc/talks/assets/survey_requested_features.png b/doc/talks/assets/survey_requested_features.png
new file mode 100644
index 00000000..07247c46
--- /dev/null
+++ b/doc/talks/assets/survey_requested_features.png
Binary files differ
diff --git a/doc/talks/assets/timeline-22-24.svg b/doc/talks/assets/timeline-22-24.svg
new file mode 100644
index 00000000..90fe5de4
--- /dev/null
+++ b/doc/talks/assets/timeline-22-24.svg
@@ -0,0 +1,327 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="1280"
+ height="720"
+ viewBox="0 0 338.66667 190.5"
+ version="1.1"
+ id="svg1"
+ xml:space="preserve"
+ inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
+ sodipodi:docname="timeline-22-24.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ inkscape:zoom="1.1111933"
+ inkscape:cx="692.04881"
+ inkscape:cy="471.56512"
+ inkscape:window-width="1900"
+ inkscape:window-height="1008"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer3" /><defs
+ id="defs1" /><g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Arrow"
+ sodipodi:insensitive="true"
+ style="display:inline"><path
+ id="path10"
+ style="color:#000000;fill:#f9caa0;fill-opacity:1;stroke:#e98422;stroke-width:0.999998;stroke-dasharray:none;stroke-opacity:0.886504"
+ d="M 237.35507,59.23014 V 75.743458 H 36.919757 V 114.75501 H 237.35507 v 16.51484 l 63.89274,-36.020869 z" /></g><g
+ inkscape:label="Fundings"
+ inkscape:groupmode="layer"
+ id="layer1"><rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-dasharray:none;stroke-opacity:0.886504"
+ id="rect11"
+ width="95.280144"
+ height="13.963966"
+ x="36.860611"
+ y="100.81324" /><rect
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-dasharray:none;stroke-opacity:0.886504"
+ id="rect11-3"
+ width="95.280144"
+ height="13.963966"
+ x="169.36374"
+ y="100.81324" /><image
+ width="41.049427"
+ height="10.433395"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,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&#10;"
+ id="image1-9"
+ x="38.001358"
+ y="102.57852"
+ style="stroke-width:3.37509" /><image
+ width="38.551971"
+ height="12.112205"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,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&#10;"
+ id="image1"
+ x="170.56721"
+ y="101.73912"
+ style="stroke-width:10.9877" /><image
+ preserveAspectRatio="none"
+ inkscape:svg-dpi="96"
+ width="24.848778"
+ height="9.2975378"
+ xlink:href="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJ&#10;QyAiLS8vVzNDLy9EVEQgU1ZHIDIwMDEwOTA0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSLzIw&#10;MDEvUkVDLVNWRy0yMDAxMDkwNC9EVEQvc3ZnMTAuZHRkIj4KPCEtLSBDcmVhdGVkIHVzaW5nIEth&#10;cmJvbjE0LCBwYXJ0IG9mIGtvZmZpY2U6IGh0dHA6Ly93d3cua29mZmljZS5vcmcva2FyYm9uIC0t&#10;Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0&#10;dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI0NDlweCIgaGVpZ2h0PSIxNjhweCI+&#10;CiAgPGRlZnM+CiAgPC9kZWZzPgogIDxnIGlkPSJMYXllciI+CiAgPC9nPgogIDxnIGlkPSJMYXll&#10;ciI+CiAgICA8cGF0aCBmaWxsPSIjOThiZjAwIiBkPSJNNDQ2LjYwMiA3My44Nzg5TDQ0OS4xMDIg&#10;NjAuMjM0TDQzNi4yMDcgNjAuMjM0TDQzOS45NTcgNDAuMTQ1TDQyNC41MTIgNDYuMTkxTDQyMi4w&#10;MTIgNjAuMjM0TDQxMi42MTcgNjAuMjM0TDQxMC4xMTcgNzMuODc4OUw0MTkuMzYzIDczLjg3ODlM&#10;NDE2LjIxNSA5MS4xNzE5QzQxNi4wNjYgOTIuMTI1IDQxNS44MTYgOTMuNTIzNCA0MTUuNTY2IDk1&#10;LjMyMDNDNDE1LjMxNiA5Ny4xMjExIDQxNS4xNjQgOTguNzE4OCA0MTUuMTY0IDEwMC4wN0M0MTUu&#10;MjE1IDEwNi4zMTYgNDE2LjcxNSAxMTEuNDY1IDQxOS42NjQgMTE1LjUxNkM0MjIuNjEzIDExOS42&#10;NiA0MjcuNDEgMTIyLjEwOSA0MzQuMTA5IDEyMi44NTlMNDQwLjU1NSAxMDkuNTY2QzQzNy4xMDUg&#10;MTA5LjExNyA0MzQuNTA4IDEwNy43NjYgNDMyLjY2IDEwNS40NjlDNDMwLjgwOSAxMDMuMTE3IDQy&#10;OS45MSAxMDAuMTY4IDQyOS45MSA5Ni41NzAzQzQyOS45MSA5NS44NzExIDQzMC4wMTIgOTQuODcx&#10;MSA0MzAuMTYgOTMuNTIzNEM0MzAuMzA5IDkyLjE3MTkgNDMwLjQ2MSA5MS4wNzQyIDQzMC42MDkg&#10;OTAuMjIyN0w0MzMuNjA5IDczLjg3ODlMNDQ2LjYwMiA3My44Nzg5TDQ0Ni42MDIgNzMuODc4OVoi&#10;ICAvPgogICAgPHBhdGggZmlsbD0iIzk4YmYwMCIgZD0iTTMxMC43MDcgNzIuMzMyQzMxMy4xMDUg&#10;NzEuNDgwNSAzMTUuMjA3IDcxLjAzMTIgMzE2Ljk1NyA3MS4wMzEyQzMxOC44NTUgNzEuMDMxMiAz&#10;MjAuNDUzIDcxLjU4MiAzMjEuNzU0IDcyLjY3OTdDMzIzLjAwNCA3My43MzA1IDMyMy42MDIgNzUu&#10;MjgxMiAzMjMuNjAyIDc3LjQyOTdDMzIzLjYwMiA3OC4wMjczIDMyMy41MDQgNzguOTI5NyAzMjMu&#10;MzAxIDgwLjE3OTdDMzIzLjEwMiA4MS4zMjgxIDMyMi45NTMgODIuMzc4OSAzMjIuODA1IDgzLjI3&#10;NzNMMzE5LjIwMyAxMDAuMTY4QzMxOC45NTMgMTAxLjQ2OSAzMTguNzAzIDEwMi44MiAzMTguNDUz&#10;IDEwNC4yMTlDMzE4LjIwMyAxMDUuNjY4IDMxOC4xMDUgMTA2LjkxOCAzMTguMTA1IDEwNy45NjVD&#10;MzE4LjEwNSAxMTIuMDE2IDMxOS4yMDMgMTE1LjQxNCAzMjEuNDUzIDExOC4xMTNDMzIzLjYwMiAx&#10;MjAuODEyIDMyNy40NDkgMTIyLjQxIDMzMyAxMjIuODU5TDMzOS4zNDggMTEwLjAxNkMzMzcuMTk1&#10;IDEwOS42NjggMzM1LjY0OCAxMDguODY3IDMzNC42OTkgMTA3LjYxN0MzMzMuNjk5IDEwNi40MTgg&#10;MzMzLjE5OSAxMDQuNzE5IDMzMy4xOTkgMTAyLjU3QzMzMy4xOTkgMTAyLjA3IDMzMy4yNSAxMDEu&#10;NDY5IDMzMy4zNDggMTAwLjgyQzMzMy4zOTggMTAwLjE2OCAzMzMuNSA5OS42MjExIDMzMy41NDcg&#10;OTkuMjE4OEwzMzcuMTk1IDgyLjAyNzNDMzM3LjQ5NiA4MC41NzgxIDMzNy43NDYgNzkuMTI4OSAz&#10;MzcuOTQ1IDc3LjY3OTdDMzM4LjE0OCA3Ni4yODEyIDMzOC4yNDYgNzQuODc4OSAzMzguMjQ2IDcz&#10;LjUzMTJDMzM4LjI0NiA2OC41ODIgMzM2Ljc5NyA2NC41ODYgMzMzLjg5OCA2MS42MzdDMzMwLjk0&#10;OSA1OC42ODggMzI2Ljg1MiA1Ny4xODggMzIxLjYwMiA1Ny4xODhDMzE4LjU1NSA1Ny4xODggMzE1&#10;LjY1NiA1Ny42ODggMzEyLjgwOSA1OC42ODhDMzEwLjAwOCA1OS42MzcgMzA2LjYwOSA2MS4yMzQg&#10;MzAyLjY2IDYzLjU4NkMzMDIuNTEyIDYyLjYzNyAzMDIuMTYgNjEuNDg0IDMwMS42NiA2MC4xODhD&#10;MzAxLjExMyA1OC45MzggMzAwLjUxMiA1Ny44MzYgMjk5Ljg2MyA1Ni44MzZMMjg2LjQ2OSA2Mi41&#10;ODZDMjg3LjYxNyA2NC4zMzYgMjg4LjUxNiA2Ni4xODQgMjg5LjA2NiA2OC4wODJDMjg5LjU2NiA2&#10;OS45ODA1IDI4OS44MTYgNzEuNzgxMiAyODkuODE2IDczLjQyOTdDMjg5LjgxNiA3NC4yODEyIDI4&#10;OS43NjYgNzUuMzI4MSAyODkuNjE3IDc2LjQ4MDVDMjg5LjUxNiA3Ny42Mjg5IDI4OS4zNjcgNzgu&#10;NTI3MyAyODkuMjE1IDc5LjE3OTdMMjgxLjI3IDEyMS41MTJMMjk1LjY2NCAxMjEuNTEyTDMwNC4x&#10;MDkgNzUuODI4MUMzMDYuMTYgNzQuMjgxMiAzMDguMzU5IDczLjEyODkgMzEwLjcwNyA3Mi4zMzJM&#10;MzEwLjcwNyA3Mi4zMzJaIiAgLz4KICAgIDxwYXRoIGZpbGw9IiM5OGJmMDAiIGQ9Ik0zNTAuNzQy&#10;IDgwLjA3ODFDMzQ5LjE5MSA4NC42NzU4IDM0OC40NDEgODkuNTc0MiAzNDguNDQxIDk0LjcyMjdD&#10;MzQ4LjQ0MSA5OS4yMTg4IDM0OS4wNDMgMTAzLjIxOSAzNTAuMTkxIDEwNi43MTlDMzUxLjM0IDEx&#10;MC4yMTUgMzUyLjk5MiAxMTMuMTY0IDM1NS4wOSAxMTUuNTE2QzM1Ny4xNDEgMTE3LjkxNCAzNTku&#10;Njg4IDExOS43MTEgMzYyLjYzNyAxMjAuOTYxQzM2NS41ODYgMTIyLjIxMSAzNjguODgzIDEyMi44&#10;NTkgMzcyLjQ4NCAxMjIuODU5QzM3Ni44MzIgMTIyLjg1OSAzODEuMTI5IDEyMi4wNjIgMzg1LjQz&#10;IDEyMC40NjFDMzg5Ljc3NyAxMTguODYzIDM5My41NzQgMTE2LjM2MyAzOTYuODI0IDExMy4wMTZM&#10;MzkxLjQyNiAxMDAuNTE5QzM4OC45MjYgMTAzLjMyIDM4Ni4xNzYgMTA1LjQxOCAzODMuMTI5IDEw&#10;Ni44NjdDMzgwLjA3OCAxMDguMzE2IDM3Ny4wMzEgMTA5LjAxNiAzNzQuMDMxIDEwOS4wMTZDMzcw&#10;LjUzNSAxMDkuMDE2IDM2Ny43ODUgMTA3LjkxOCAzNjUuNzg1IDEwNS43MTlDMzYzLjgzNiAxMDMu&#10;NDY5IDM2Mi44MzYgMTAwLjY2OCAzNjIuODM2IDk3LjM3MTFMMzYyLjgzNiA5Ni40MjE5QzM2Mi44&#10;MzYgOTYuMDIzNCAzNjIuODg3IDk1LjYyMTEgMzYyLjk4OCA5NS4yMjI3QzM2NS42MzcgOTQuODcx&#10;MSAzNjguNjMzIDk0LjQyMTkgMzcxLjk4NCA5My44MjQyQzM3NS4zMzIgOTMuMjIyNyAzNzguNzMg&#10;OTIuNTIzNCAzODIuMTggOTEuNzIyN0MzODUuNjI5IDkwLjg3NSAzODguOTc3IDg5LjkyNTggMzky&#10;LjI3MyA4OC45MjU4QzM5NS41MjMgODcuOTI1OCAzOTguNDIyIDg2Ljg3NSA0MDAuODcxIDg1Ljgy&#10;NDJMNDAwLjg3MSA4MC4wNzgxQzQwMC44NzEgNzYuNTMxMiA0MDAuMzIgNzMuMzMyIDM5OS4yMjMg&#10;NzAuNDgwNUMzOTguMDc0IDY3LjczNCAzOTYuNTc0IDY1LjMzMiAzOTQuNjI1IDYzLjI4NUMzOTIu&#10;Njc2IDYxLjI4NSAzOTAuMzI0IDU5Ljc4NSAzODcuNjc2IDU4Ljc4NUMzODUuMDc4IDU3LjczOCAz&#10;ODIuMjMgNTcuMTg4IDM3OS4xOCA1Ny4xODhDMzc0LjczIDU3LjE4OCAzNzAuNTgyIDU4LjE4OCAz&#10;NjYuODM2IDYwLjEzN0MzNjMuMDM1IDYyLjA4NiAzNTkuNzg5IDY0Ljc4NSAzNTcuMTQxIDY4LjIz&#10;NDRDMzU0LjM5MSA3MS42MzI4IDM1Mi4yOTMgNzUuNTc4MSAzNTAuNzQyIDgwLjA3ODFMMzUwLjc0&#10;MiA4MC4wNzgxWk0zNzIuMzgzIDY5Ljk4MDVDMzczLjkzNCA2OS4xMzI4IDM3NS42ODQgNjguNzM0&#10;NCAzNzcuNjMzIDY4LjczNDRDMzgwLjI4MSA2OC43MzQ0IDM4Mi40OCA2OS41ODIgMzg0LjIyNyA3&#10;MS4zMzJDMzg1Ljk3NyA3My4wMzEyIDM4Ni44NzkgNzUuNTc4MSAzODYuODc5IDc5LjAyNzNDMzg1&#10;LjQzIDc5LjQ3NjYgMzgzLjcyNyA4MC4wMjczIDM4MS43MyA4MC41NzgxQzM3OS42OCA4MS4wNzgx&#10;IDM3Ny42MzMgODEuNTc4MSAzNzUuNTMxIDgyLjAyNzNDMzczLjM4MyA4Mi40NzY2IDM3MS4zMzIg&#10;ODIuOTI1OCAzNjkuMjg1IDgzLjMyODFDMzY3LjIzNCA4My42NzU4IDM2NS40ODQgODMuOTc2NiAz&#10;NjMuOTg0IDg0LjIyNjZDMzY0LjIzNCA4Mi4xMjg5IDM2NC42ODggODAuMTI4OSAzNjUuMzg3IDc4&#10;LjI3NzNDMzY2LjEzNyA3Ni40Mjk3IDM2Ny4wODYgNzQuNzgxMiAzNjguMjM0IDczLjM3ODlDMzY5&#10;LjQ4NCA3MS45ODA1IDM3MC44MzIgNzAuODMyIDM3Mi4zODMgNjkuOTgwNUwzNzIuMzgzIDY5Ljk4&#10;MDVaIiAgZmlsbC1ydWxlPSJldmVub2RkIiAvPgogICAgPHBhdGggZmlsbD0iIzAwMDAwMCIgZD0i&#10;TTQwNC4xNzIgMTQwLjQ1M0M0MDQuMTcyIDEzOS4yMDMgNDAzLjk2OSAxMzguMDU1IDQwMy41NyAx&#10;MzcuMDU1QzQwMy4xNzIgMTM2LjA1NSA0MDIuNjIxIDEzNS4yMDcgNDAxLjk3MyAxMzQuNDU3QzQw&#10;MS4yNyAxMzMuNzU4IDQwMC40NzMgMTMzLjIwNyAzOTkuNTIzIDEzMi44NTZDMzk4LjU3NCAxMzIu&#10;NTA4IDM5Ny41MjMgMTMyLjMwOSAzOTYuNDIyIDEzMi4zMDlDMzk0Ljk3MyAxMzIuMzA5IDM5My42&#10;MjUgMTMyLjYwNiAzOTIuMzc1IDEzMy4xNTZDMzkxLjEyNSAxMzMuNzA3IDM5MC4wMjcgMTM0LjUw&#10;OCAzODkuMDc4IDEzNS41MDRDMzg4LjEyNSAxMzYuNTA0IDM4Ny4zNzkgMTM3LjY1NiAzODYuODI4&#10;IDEzOS4wMDRDMzg2LjI3NyAxNDAuMzU2IDM4NS45NzcgMTQxLjgwNSAzODUuOTc3IDE0My40MDJD&#10;Mzg1Ljk3NyAxNDQuNjUyIDM4Ni4xNzYgMTQ1Ljc1IDM4Ni41NzggMTQ2LjgwMUMzODYuOTI2IDE0&#10;Ny44MDEgMzg3LjQ3NyAxNDguNjUyIDM4OC4xNzYgMTQ5LjM1MkMzODguODI4IDE1MC4xMDEgMzg5&#10;LjY3NiAxNTAuNjQ4IDM5MC42MjUgMTUxLjA1MUMzOTEuNTc0IDE1MS4zOTkgMzkyLjYyNSAxNTEu&#10;NTk4IDM5My43NzMgMTUxLjU5OEMzOTUuMTc2IDE1MS41OTggMzk2LjUyMyAxNTEuMzAxIDM5Ny43&#10;NzMgMTUwLjc1QzM5OS4wMjMgMTUwLjE5OSA0MDAuMTIxIDE0OS4zOTggNDAxLjA3IDE0OC40MDJD&#10;NDAyLjAyIDE0Ny40NDkgNDAyLjc3IDE0Ni4yNSA0MDMuMzIgMTQ0LjkwMkM0MDMuODcxIDE0My41&#10;NTEgNDA0LjE3MiAxNDIuMDU1IDQwNC4xNzIgMTQwLjQ1M0w0MDQuMTcyIDE0MC40NTNaTTM5MC4y&#10;NzcgMTQwLjQwMkMzOTAuNTc0IDEzOS41MDQgMzkwLjk3NyAxMzguNzAzIDM5MS40NzcgMTM4LjAw&#10;NEMzOTIuMDIzIDEzNy4zMDUgMzkyLjY3NiAxMzYuNzU0IDM5My40MjYgMTM2LjMwNUMzOTQuMTc2&#10;IDEzNS44NTYgMzk0Ljk3MyAxMzUuNjU2IDM5NS45MjIgMTM1LjY1NkMzOTcuMzcxIDEzNS42NTYg&#10;Mzk4LjQyMiAxMzYuMTA2IDM5OS4xNzIgMTM3LjAwNEMzOTkuOTIyIDEzNy44NTYgNDAwLjMyIDEz&#10;OS4xMDYgNDAwLjMyIDE0MC42NTJDNDAwLjMyIDE0MS42MDIgNDAwLjE3MiAxNDIuNTU1IDM5OS44&#10;NzEgMTQzLjUwNEMzOTkuNjIxIDE0NC40MDIgMzk5LjIyMyAxNDUuMjAzIDM5OC42NzIgMTQ1Ljkw&#10;MkMzOTguMTIxIDE0Ni42MDIgMzk3LjQ3MyAxNDcuMTUyIDM5Ni43MjMgMTQ3LjYwMUMzOTUuOTcz&#10;IDE0OCAzOTUuMTI1IDE0OC4xOTkgMzk0LjIyMyAxNDguMTk5QzM5Mi43NzMgMTQ4LjE5OSAzOTEu&#10;NzI3IDE0Ny43NSAzOTAuOTc3IDE0Ni45MDJDMzkwLjIyNyAxNDYgMzg5LjgyNCAxNDQuODAxIDM4&#10;OS44MjQgMTQzLjI1NEMzODkuODI0IDE0Mi4zMDUgMzg5Ljk3NyAxNDEuMzUyIDM5MC4yNzcgMTQw&#10;LjQwMkwzOTAuMjc3IDE0MC40MDJaIiAgZmlsbC1ydWxlPSJldmVub2RkIiAvPgogICAgPHBhdGgg&#10;ZmlsbD0iIzAwMDAwMCIgZD0iTTQzNC41NTkgMTMyLjU1OUw0MzEuMDA4IDEzMi41NTlMNDI5LjEw&#10;OSAxNDMuNjAyQzQyOS4wNTkgMTQzLjc1NCA0MjkuMDEyIDE0NC4wMDQgNDI5LjAxMiAxNDQuMzUy&#10;QzQyOS4wMTIgMTQ0LjcwMyA0MjkuMDEyIDE0NC45NTMgNDI5LjAxMiAxNDUuMjAzTDQyOC44NTkg&#10;MTQ1LjIwM0w0MjIuNDY1IDEzMi41NTlMNDE5LjExMyAxMzIuNTU5TDQxNS43NjYgMTUxLjMwMUw0&#10;MTkuMzYzIDE1MS4zMDFMNDIxLjM2MyAxNDAuMDA0QzQyMS40MTQgMTM5Ljg1NiA0MjEuNDE0IDEz&#10;OS42MDYgNDIxLjQxNCAxMzkuMzU2QzQyMS40MTQgMTM5LjEwNiA0MjEuNDE0IDEzOC44MDUgNDIx&#10;LjQxNCAxMzguNTA0TDQyMS41NjMgMTM4LjUwNEw0MjguMTA5IDE1MS40NDlMNDMxLjMwOSAxNTEu&#10;MTQ5TDQzNC41NTkgMTMyLjU1OUw0MzQuNTU5IDEzMi41NTlaIiAgLz4KICAgIDxwYXRoIGZpbGw9&#10;IiMwMDAwMDAiIGQ9Ik0zNzQuMzgzIDEzMi41NTlMMzcwLjczNCAxMzIuNTU5TDM2Ny4zODcgMTUx&#10;LjMwMUwzNzEuMDgyIDE1MS4zMDFMMzc0LjM4MyAxMzIuNTU5TDM3NC4zODMgMTMyLjU1OVoiICAv&#10;PgogICAgPHBhdGggZmlsbD0iIzAwMDAwMCIgZD0iTTMyOC45NDkgMTMyLjU1OUwzMjQuNzAzIDEz&#10;Mi41NTlDMzIzLjkwMiAxMzMuOTA2IDMyMy4wNTEgMTM1LjQ1NyAzMjIuMTAyIDEzNy4xMDZDMzIx&#10;LjE1MiAxMzguNzU0IDMyMC4yNTQgMTQwLjQ1MyAzMTkuMzU1IDE0Mi4xNTJDMzE4LjQ1MyAxNDMu&#10;ODUyIDMxNy42NTYgMTQ1LjUgMzE2LjkwNiAxNDcuMTAyQzMxNi4xNTYgMTQ4LjY5OSAzMTUuNTU1&#10;IDE1MC4xMDEgMzE1LjEwNSAxNTEuMzAxTDMxOC45NTMgMTUxLjMwMUMzMTkuMTA1IDE1MC45NDkg&#10;MzE5LjI1NCAxNTAuNSAzMTkuNDUzIDE1MC4wNTFDMzE5LjY1MiAxNDkuNjAyIDMxOS44NTUgMTQ5&#10;LjEwMiAzMjAuMTA1IDE0OC42NTJDMzIwLjMwNSAxNDguMTk5IDMyMC41MDQgMTQ3Ljc1IDMyMC43&#10;MDMgMTQ3LjMwMUMzMjAuOTAyIDE0Ni44NTIgMzIxLjEwMiAxNDYuNDUzIDMyMS4yNTQgMTQ2LjEw&#10;MkwzMjcuNzUgMTQ2LjEwMkMzMjcuODAxIDE0Ni41NTEgMzI3LjgwMSAxNDcgMzI3Ljg1MiAxNDcu&#10;NUwzMjggMTQ4Ljk0OUMzMjguMDUxIDE0OS4zOTggMzI4LjEwMiAxNDkuODUyIDMyOC4xNTIgMTUw&#10;LjMwMUMzMjguMTk5IDE1MC43NSAzMjguMTk5IDE1MS4wOTggMzI4LjE5OSAxNTEuNDQ5TDMzMS44&#10;OTggMTUxLjE0OUMzMzEuODk4IDE1MC40NDkgMzMxLjg0OCAxNDkuNjQ4IDMzMS43NSAxNDguNjk5&#10;QzMzMS42OTkgMTQ3Ljc1IDMzMS41NTEgMTQ2Ljc1IDMzMS4zOTggMTQ1LjcwM0MzMzEuMjUgMTQ0&#10;LjY1MiAzMzEuMDk4IDE0My41MDQgMzMwLjg5OCAxNDIuMzUxQzMzMC43NSAxNDEuMjAzIDMzMC41&#10;NTEgMTQwLjA1NSAzMzAuMzAxIDEzOC45MDZDMzMwLjEwMiAxMzcuNzU0IDMyOS44OTggMTM2LjY1&#10;NiAzMjkuNjQ4IDEzNS41NTVDMzI5LjM5OCAxMzQuNTA4IDMyOS4xOTkgMTMzLjUwOCAzMjguOTQ5&#10;IDEzMi41NTlMMzI4Ljk0OSAxMzIuNTU5Wk0zMjYuNjAyIDEzOC4xMDZDMzI2LjcwMyAxMzguNjU2&#10;IDMyNi44MDEgMTM5LjI1NCAzMjYuOTAyIDEzOS45MDJDMzI3IDE0MC41MDQgMzI3LjEwMiAxNDEu&#10;MTA2IDMyNy4xNTIgMTQxLjY1MkMzMjcuMjUgMTQyLjIwMyAzMjcuMzAxIDE0Mi42MDEgMzI3LjM1&#10;MiAxNDIuOTUzTDMyMi43MDMgMTQyLjk1M0MzMjIuOTUzIDE0Mi41MDQgMzIzLjIwMyAxNDIuMDA0&#10;IDMyMy40NTMgMTQxLjQ1M0MzMjMuNzU0IDE0MC45MDIgMzI0LjA1MSAxNDAuMzA1IDMyNC4zNTIg&#10;MTM5LjcwM0MzMjQuNzAzIDEzOS4xMDYgMzI1IDEzOC41NTUgMzI1LjMwMSAxMzguMDA0QzMyNS42&#10;MDIgMTM3LjQ1MyAzMjUuODUyIDEzNi45NTcgMzI2LjEwMiAxMzYuNjA2TDMyNi4zMDEgMTM2LjYw&#10;NkMzMjYuNDAyIDEzNy4wMDQgMzI2LjUgMTM3LjUwNCAzMjYuNjAyIDEzOC4xMDZMMzI2LjYwMiAx&#10;MzguMTA2WiIgIGZpbGwtcnVsZT0iZXZlbm9kZCIgLz4KICAgIDxwYXRoIGZpbGw9IiMwMDAwMDAi&#10;IGQ9Ik0zNTcuNjQxIDEzNS45NTdMMzU4LjE4OCAxMzIuNTU5TDM0NS4zOTUgMTMyLjU1OUwzNDQu&#10;ODQ0IDEzNS45NTdMMzQ5LjM5MSAxMzUuOTU3TDM0Ni43NDIgMTUxLjMwMUwzNTAuMzkxIDE1MS4z&#10;MDFMMzUzLjA5IDEzNS45NTdMMzU3LjY0MSAxMzUuOTU3TDM1Ny42NDEgMTM1Ljk1N1oiICAvPgog&#10;ICAgPHBhdGggZmlsbD0iIzAwMDAwMCIgZD0iTTI5Ny40NjUgMTMyLjMwOUMyOTYuNDE0IDEzMi4z&#10;MDkgMjk1LjM2MyAxMzIuMzU2IDI5NC4zMTIgMTMyLjQ1N0MyOTMuMjY2IDEzMi42MDYgMjkyLjI2&#10;NiAxMzIuNzU4IDI5MS4zMTYgMTMzLjAwOEwyODguMTY4IDE1MC44NTJDMjg5LjExNyAxNTEuMDk4&#10;IDI5MC4yMTUgMTUxLjI1IDI5MS40MTQgMTUxLjM5OUMyOTIuNTY2IDE1MS41NTEgMjkzLjY2NCAx&#10;NTEuNTk4IDI5NC43MTUgMTUxLjU5OEMyOTYuMjYyIDE1MS41OTggMjk3LjY2NCAxNTEuMzQ4IDI5&#10;OS4wMTIgMTUwLjg1MkMzMDAuMzYzIDE1MC4zMDEgMzAxLjU2MiAxNDkuNjAyIDMwMi41NjIgMTQ4&#10;LjY1MkMzMDMuNTU5IDE0Ny42OTkgMzA0LjM1OSAxNDYuNTUxIDMwNC45NjEgMTQ1LjIwM0MzMDUu&#10;NTA4IDE0My44NTIgMzA1LjgwOSAxNDIuMzA1IDMwNS44MDkgMTQwLjYwNkMzMDUuODA5IDEzOS4y&#10;NTQgMzA1LjYwOSAxMzguMTA2IDMwNS4yMTEgMTM3LjA1NUMzMDQuNzYyIDEzNi4wMDQgMzA0LjIx&#10;MSAxMzUuMTU2IDMwMy40NjEgMTM0LjQ1N0MzMDIuNzExIDEzMy43NTggMzAxLjgxMiAxMzMuMjA3&#10;IDMwMC44MTIgMTMyLjg1NkMyOTkuNzYyIDEzMi41MDggMjk4LjY2NCAxMzIuMzA5IDI5Ny40NjUg&#10;MTMyLjMwOUwyOTcuNDY1IDEzMi4zMDlaTTI5Ni42NjQgMTM1LjcwN0MyOTcuNDE0IDEzNS43MDcg&#10;Mjk4LjExMyAxMzUuODA1IDI5OC43NjIgMTM1Ljk1N0MyOTkuNDE0IDEzNi4xMDYgMjk5Ljk2MSAx&#10;MzYuNDA2IDMwMC40MSAxMzYuODA1QzMwMC45MSAxMzcuMjAzIDMwMS4zMTIgMTM3LjcwMyAzMDEu&#10;NTYyIDEzOC4zNTZDMzAxLjgxMiAxMzguOTUzIDMwMS45NjEgMTM5LjcwMyAzMDEuOTYxIDE0MC42&#10;NTJDMzAxLjk2MSAxNDEuODUyIDMwMS44MTIgMTQyLjkwMiAzMDEuNDYxIDE0My44NTJDMzAxLjE2&#10;IDE0NC44MDEgMzAwLjcxMSAxNDUuNjAyIDMwMC4xMTMgMTQ2LjI1QzI5OS41MTIgMTQ2LjkwMiAy&#10;OTguODEyIDE0Ny4zNTIgMjk3Ljk2MSAxNDcuNjk5QzI5Ny4xMTMgMTQ4LjA1MSAyOTYuMjE1IDE0&#10;OC4xOTkgMjk1LjE2NCAxNDguMTk5QzI5NC43MTUgMTQ4LjE5OSAyOTQuMjY2IDE0OC4xOTkgMjkz&#10;LjcxNSAxNDguMTUyQzI5My4xNjQgMTQ4LjEwMiAyOTIuNjY0IDE0OC4wNTEgMjkyLjMxNiAxNDhM&#10;Mjk0LjQ2NSAxMzUuOTA2QzI5NC43NjYgMTM1Ljg1NiAyOTUuMTY0IDEzNS44MDUgMjk1LjYxMyAx&#10;MzUuNzU0QzI5Ni4wNjIgMTM1LjcwNyAyOTYuNDE0IDEzNS43MDcgMjk2LjY2NCAxMzUuNzA3TDI5&#10;Ni42NjQgMTM1LjcwN1oiICBmaWxsLXJ1bGU9ImV2ZW5vZGQiIC8+CiAgICA8cGF0aCBmaWxsPSIj&#10;MDAwMDAwIiBkPSJNMTg1LjgwOSA2Mi41ODZDMTg2Ljk1NyA2NC4zMzYgMTg3Ljg1NSA2Ni4xODQg&#10;MTg4LjQwNiA2OC4wODJDMTg4LjkwNiA2OS45ODA1IDE4OS4xNTYgNzEuNzgxMiAxODkuMTU2IDcz&#10;LjQyOTdDMTg5LjE1NiA3NC4yODEyIDE4OS4xMDUgNzUuMzI4MSAxODguOTU3IDc2LjQ4MDVDMTg4&#10;Ljg1NSA3Ny42Mjg5IDE4OC43MDcgNzguNTI3MyAxODguNTU1IDc5LjE3OTdMMTgwLjYwOSAxMjEu&#10;NTEyTDE5NS4wMDQgMTIxLjUxMkwyMDMuNDQ5IDc1LjgyODFDMjA1LjUgNzQuMjgxMiAyMDcuNjk5&#10;IDczLjEyODkgMjEwLjA0NyA3Mi4zMzJDMjEyLjQ0NSA3MS40ODA1IDIxNC41NDcgNzEuMDMxMiAy&#10;MTYuMjk3IDcxLjAzMTJDMjE4LjE5NSA3MS4wMzEyIDIxOS43OTMgNzEuNTgyIDIyMS4wOTQgNzIu&#10;Njc5N0MyMjIuMzQ0IDczLjczMDUgMjIyLjk0MSA3NS4yODEyIDIyMi45NDEgNzcuNDI5N0MyMjIu&#10;OTQxIDc4LjAyNzMgMjIyLjg0NCA3OC45Mjk3IDIyMi42NDUgODAuMTc5N0MyMjIuNDQxIDgxLjMy&#10;ODEgMjIyLjI5MyA4Mi4zNzg5IDIyMi4xNDUgODMuMjc3M0wyMTguNTQzIDEwMC4xNjhDMjE4LjI5&#10;MyAxMDEuNDY5IDIxOC4wNDMgMTAyLjgyIDIxNy43OTMgMTA0LjIxOUMyMTcuNTQ3IDEwNS42Njgg&#10;MjE3LjQ0NSAxMDYuOTE4IDIxNy40NDUgMTA3Ljk2NUMyMTcuNDQ1IDExMi4wMTYgMjE4LjU0MyAx&#10;MTUuNDE0IDIyMC43OTMgMTE4LjExM0MyMjIuOTQxIDEyMC44MTIgMjI2Ljc5MyAxMjIuNDEgMjMy&#10;LjM0IDEyMi44NTlMMjM4LjY4OCAxMTAuMDE2QzIzNi41MzkgMTA5LjY2OCAyMzQuOTg4IDEwOC44&#10;NjcgMjM0LjAzOSAxMDcuNjE3QzIzMy4wMzkgMTA2LjQxOCAyMzIuNTM5IDEwNC43MTkgMjMyLjUz&#10;OSAxMDIuNTdDMjMyLjUzOSAxMDIuMDcgMjMyLjU5IDEwMS40NjkgMjMyLjY4OCAxMDAuODJDMjMy&#10;LjczOCAxMDAuMTY4IDIzMi44NCA5OS42MjExIDIzMi44OTEgOTkuMjE4OEwyMzYuNTM5IDgyLjAy&#10;NzNDMjM2LjgzNiA4MC41NzgxIDIzNy4wODYgNzkuMTI4OSAyMzcuMjg1IDc3LjY3OTdDMjM3LjQ4&#10;OCA3Ni4yODEyIDIzNy41ODYgNzQuODc4OSAyMzcuNTg2IDczLjUzMTJDMjM3LjU4NiA2OC41ODIg&#10;MjM2LjEzNyA2NC41ODYgMjMzLjIzOCA2MS42MzdDMjMwLjI4OSA1OC42ODggMjI2LjE5MSA1Ny4x&#10;ODggMjIwLjk0NSA1Ny4xODhDMjE3Ljg5NSA1Ny4xODggMjE0Ljk5NiA1Ny42ODggMjEyLjE0OCA1&#10;OC42ODhDMjA5LjM0OCA1OS42MzcgMjA1Ljk0OSA2MS4yMzQgMjAyIDYzLjU4NkMyMDEuODUyIDYy&#10;LjYzNyAyMDEuNSA2MS40ODQgMjAxIDYwLjE4OEMyMDAuNDUzIDU4LjkzOCAxOTkuODUyIDU3Ljgz&#10;NiAxOTkuMjAzIDU2LjgzNkwxODUuODA5IDYyLjU4NkwxODUuODA5IDYyLjU4NloiICAvPgogICAg&#10;PHBhdGggZmlsbD0iIzAwMDAwMCIgZD0iTTI3Ni44MiAzMS41NDdMMjYyLjY3NiAzMS41NDdMMjUx&#10;Ljg4MyA5MC4wMjM0QzI1MS40MyA5MS45NzI3IDI1MS4wODIgOTQuMDIzNCAyNTAuODMyIDk2LjE3&#10;MTlDMjUwLjU4MiA5OC4yNjk1IDI1MC40MzQgMTAwLjIxOSAyNTAuNDM0IDEwMi4wMTlDMjUwLjQz&#10;NCAxMDcuODE2IDI1MS41MzEgMTEyLjU2NiAyNTMuNzgxIDExNi4yNjJDMjU2LjAzMSAxMTkuOTYx&#10;IDI1OS44MjggMTIyLjE2IDI2NS4xNzYgMTIyLjg1OUwyNzEuNjcyIDEwOS41NjZDMjcwLjYyNSAx&#10;MDkuMDY2IDI2OS43MjMgMTA4LjUxNiAyNjguODc1IDEwNy45MThDMjY4LjAyMyAxMDcuMzY3IDI2&#10;Ny4zMjQgMTA2LjYxNyAyNjYuNzczIDEwNS43NjlDMjY2LjE3NiAxMDQuOTE4IDI2NS43MjcgMTAz&#10;LjkxOCAyNjUuNDc3IDEwMi43MTlDMjY1LjIyNyAxMDEuNTE5IDI2NS4wNzQgMTAwLjAxOSAyNjUu&#10;MDc0IDk4LjI2OTVDMjY1LjA3NCA5Ny40MjE5IDI2NS4xMjUgOTYuNDcyNyAyNjUuMjI3IDk1LjQ3&#10;MjdDMjY1LjM3NSA5NC40MjE5IDI2NS41MjcgOTMuMzcxMSAyNjUuNjc2IDkyLjI3MzRMMjc2Ljgy&#10;IDMxLjU0N0wyNzYuODIgMzEuNTQ3WiIgIC8+CiAgICA8cGF0aCBmaWxsPSIjMDAwMDAwIiBkPSJN&#10;MjQ2LjQzNCAxMzIuNTU5TDI0Mi43ODUgMTMyLjU1OUwyNDAuMzg3IDE0Ni4yNUMyMzkuODg3IDE0&#10;Ni44MDEgMjM5LjI4NSAxNDcuMjUgMjM4LjUzNSAxNDcuNjUyQzIzNy43ODUgMTQ4IDIzNi45ODgg&#10;MTQ4LjE5OSAyMzYuMDg2IDE0OC4xOTlDMjM1LjE4OCAxNDguMTk5IDIzNC40ODggMTQ4IDIzMy45&#10;ODggMTQ3LjYwMUMyMzMuNDM4IDE0Ny4xNTIgMjMzLjE4OCAxNDYuNDUzIDIzMy4xODggMTQ1LjQw&#10;MkMyMzMuMTg4IDE0NS4yMDMgMjMzLjIzOCAxNDQuOTAyIDIzMy4yODkgMTQ0LjUwNEMyMzMuMzQg&#10;MTQ0LjE1MiAyMzMuMzQgMTQzLjgwMSAyMzMuMzg3IDE0My41MDRMMjM1LjM4NyAxMzIuNTU5TDIz&#10;MS42ODggMTMyLjU1OUwyMjkuNzM4IDE0My40NTNDMjI5LjY5MSAxNDMuOTAyIDIyOS42NDEgMTQ0&#10;LjM1MiAyMjkuNTkgMTQ0LjgwMUMyMjkuNTM5IDE0NS4yNSAyMjkuNTM5IDE0NS42MDIgMjI5LjUz&#10;OSAxNDUuOTUzQzIyOS41MzkgMTQ2Ljk1MyAyMjkuNjkxIDE0Ny44MDEgMjI5Ljk4OCAxNDguNTUx&#10;QzIzMC4yODkgMTQ5LjMwMSAyMzAuNjkxIDE0OS44NTIgMjMxLjE5MSAxNTAuMzAxQzIzMS43Mzgg&#10;MTUwLjc1IDIzMi4zNCAxNTEuMDk4IDIzMi45ODggMTUxLjMwMUMyMzMuNjg4IDE1MS41IDIzNC4z&#10;ODcgMTUxLjU5OCAyMzUuMTM3IDE1MS41OThDMjM2Ljk4OCAxNTEuNTk4IDIzOC42MzcgMTUxLjA1&#10;MSAyNDAuMTM3IDE0OS44OThDMjQwLjEzNyAxNTAuMTQ4IDI0MC4xMzcgMTUwLjQ0OSAyNDAuMTg4&#10;IDE1MC43NUMyNDAuMTg4IDE1MSAyNDAuMTg4IDE1MS4yNSAyNDAuMjM0IDE1MS41TDI0My44ODMg&#10;MTUxLjI1QzI0My44MzYgMTUxIDI0My44MzYgMTUwLjc1IDI0My44MzYgMTUwLjQ0OUMyNDMuNzg1&#10;IDE1MC4xOTkgMjQzLjc4NSAxNDkuODk4IDI0My43ODUgMTQ5LjU1MUMyNDMuNzg1IDE0OC45NDkg&#10;MjQzLjgzNiAxNDguMzAxIDI0My44ODMgMTQ3LjY1MkMyNDMuOTM0IDE0Ni45NTMgMjQzLjk4NCAx&#10;NDYuMzAxIDI0NC4xMzMgMTQ1LjcwM0wyNDYuNDM0IDEzMi41NTlMMjQ2LjQzNCAxMzIuNTU5WiIg&#10;IC8+CiAgICA8cGF0aCBmaWxsPSIjMDAwMDAwIiBkPSJNMjc2LjYyMSAxMzIuNTU5TDI3My4wNzQg&#10;MTMyLjU1OUwyNzEuMTcyIDE0My42MDJDMjcxLjEyNSAxNDMuNzU0IDI3MS4wNzQgMTQ0LjAwNCAy&#10;NzEuMDc0IDE0NC4zNTJDMjcxLjA3NCAxNDQuNzAzIDI3MS4wNzQgMTQ0Ljk1MyAyNzEuMDc0IDE0&#10;NS4yMDNMMjcwLjkyMiAxNDUuMjAzTDI2NC41MjcgMTMyLjU1OUwyNjEuMTc2IDEzMi41NTlMMjU3&#10;LjgyOCAxNTEuMzAxTDI2MS40MjYgMTUxLjMwMUwyNjMuNDI2IDE0MC4wMDRDMjYzLjQ3NyAxMzku&#10;ODU2IDI2My40NzcgMTM5LjYwNiAyNjMuNDc3IDEzOS4zNTZDMjYzLjQ3NyAxMzkuMTA2IDI2My40&#10;NzcgMTM4LjgwNSAyNjMuNDc3IDEzOC41MDRMMjYzLjYyNSAxMzguNTA0TDI3MC4xNzYgMTUxLjQ0&#10;OUwyNzMuMzcxIDE1MS4xNDlMMjc2LjYyMSAxMzIuNTU5TDI3Ni42MjEgMTMyLjU1OVoiICAvPgog&#10;ICAgPHBhdGggZmlsbD0iIzAwMDAwMCIgZD0iTTIxNC43OTcgMTM0LjQ1N0MyMTQuMDk4IDEzMy43&#10;NTggMjEzLjI5NyAxMzMuMjA3IDIxMi4zNDggMTMyLjg1NkMyMTEuMzk4IDEzMi41MDggMjEwLjM0&#10;OCAxMzIuMzA5IDIwOS4yNSAxMzIuMzA5QzIwNy44MDEgMTMyLjMwOSAyMDYuNDQ5IDEzMi42MDYg&#10;MjA1LjE5OSAxMzMuMTU2QzIwMy45NDkgMTMzLjcwNyAyMDIuODUyIDEzNC41MDggMjAxLjkwMiAx&#10;MzUuNTA0QzIwMC45NTMgMTM2LjUwNCAyMDAuMjAzIDEzNy42NTYgMTk5LjY1MiAxMzkuMDA0QzE5&#10;OS4xMDIgMTQwLjM1NiAxOTguODAxIDE0MS44MDUgMTk4LjgwMSAxNDMuNDAyQzE5OC44MDEgMTQ0&#10;LjY1MiAxOTkuMDA0IDE0NS43NSAxOTkuNDAyIDE0Ni44MDFDMTk5Ljc1NCAxNDcuODAxIDIwMC4z&#10;MDEgMTQ4LjY1MiAyMDEgMTQ5LjM1MkMyMDEuNjUyIDE1MC4xMDEgMjAyLjUgMTUwLjY0OCAyMDMu&#10;NDQ5IDE1MS4wNTFDMjA0LjM5OCAxNTEuMzk5IDIwNS40NDkgMTUxLjU5OCAyMDYuNTk4IDE1MS41&#10;OThDMjA4IDE1MS41OTggMjA5LjM0OCAxNTEuMzAxIDIxMC41OTggMTUwLjc1QzIxMS44NDggMTUw&#10;LjE5OSAyMTIuOTQ1IDE0OS4zOTggMjEzLjg5NSAxNDguNDAyQzIxNC44NDggMTQ3LjQ0OSAyMTUu&#10;NTk4IDE0Ni4yNSAyMTYuMTQ1IDE0NC45MDJDMjE2LjY5NSAxNDMuNTUxIDIxNi45OTYgMTQyLjA1&#10;NSAyMTYuOTk2IDE0MC40NTNDMjE2Ljk5NiAxMzkuMjAzIDIxNi43OTcgMTM4LjA1NSAyMTYuMzk1&#10;IDEzNy4wNTVDMjE1Ljk5NiAxMzYuMDU1IDIxNS40NDUgMTM1LjIwNyAyMTQuNzk3IDEzNC40NTdM&#10;MjE0Ljc5NyAxMzQuNDU3Wk0yMDQuMzAxIDEzOC4wMDRDMjA0Ljg1MiAxMzcuMzA1IDIwNS41IDEz&#10;Ni43NTQgMjA2LjI1IDEzNi4zMDVDMjA3IDEzNS44NTYgMjA3LjgwMSAxMzUuNjU2IDIwOC43NSAx&#10;MzUuNjU2QzIxMC4xOTkgMTM1LjY1NiAyMTEuMjQ2IDEzNi4xMDYgMjExLjk5NiAxMzcuMDA0QzIx&#10;Mi43NDYgMTM3Ljg1NiAyMTMuMTQ4IDEzOS4xMDYgMjEzLjE0OCAxNDAuNjUyQzIxMy4xNDggMTQx&#10;LjYwMiAyMTIuOTk2IDE0Mi41NTUgMjEyLjY5NSAxNDMuNTA0QzIxMi40NDUgMTQ0LjQwMiAyMTIu&#10;MDQ3IDE0NS4yMDMgMjExLjQ5NiAxNDUuOTAyQzIxMC45NDkgMTQ2LjYwMiAyMTAuMjk3IDE0Ny4x&#10;NTIgMjA5LjU0NyAxNDcuNjAxQzIwOC43OTcgMTQ4IDIwNy45NDkgMTQ4LjE5OSAyMDcuMDUxIDE0&#10;OC4xOTlDMjA1LjYwMiAxNDguMTk5IDIwNC41NTEgMTQ3Ljc1IDIwMy44MDEgMTQ2LjkwMkMyMDMu&#10;MDUxIDE0NiAyMDIuNjUyIDE0NC44MDEgMjAyLjY1MiAxNDMuMjU0QzIwMi42NTIgMTQyLjMwNSAy&#10;MDIuODAxIDE0MS4zNTIgMjAzLjEwMiAxNDAuNDAyQzIwMy40MDIgMTM5LjUwNCAyMDMuODAxIDEz&#10;OC43MDMgMjA0LjMwMSAxMzguMDA0TDIwNC4zMDEgMTM4LjAwNFoiICBmaWxsLXJ1bGU9ImV2ZW5v&#10;ZGQiIC8+CiAgICA8cGF0aCBmaWxsPSIjMDAwMDAwIiBkPSJNMTg4LjI1OCAxMzIuNTU5TDE3Ny45&#10;NjEgMTMyLjU1OUwxNzQuNjEzIDE1MS4zMDFMMTc4LjMxMiAxNTEuMzAxTDE3OS41NTkgMTQ0LjE1&#10;MkwxODYuMzA5IDE0NC4xNTJMMTg2LjkwNiAxNDAuNzU0TDE4MC4xNiAxNDAuNzU0TDE4MS4wMDgg&#10;MTM1Ljk1N0wxODcuNjU2IDEzNS45NTdMMTg4LjI1OCAxMzIuNTU5TDE4OC4yNTggMTMyLjU1OVoi&#10;ICAvPgogICAgPHBhdGggZmlsbD0iIzk4YmYwMCIgZD0iTTEyNy4wODIgNDQuODkxQzEyOC40MyAz&#10;My45NDUgMTI1LjY4NCAyNC4xMDIgMTE4Ljg4MyAxNS40MDJDMTEyLjA4NiA2LjcwNyAxMDMuMTkx&#10;IDEuNjYgOTIuMjQ2MSAwLjMwOUM4MS4zMDA4IC0xLjAzOSA3MS40NTMxIDEuNzExIDYyLjc1Nzgg&#10;OC41MDhDNTQuNzEwOSAxNC43NTQgNDkuODEyNSAyMi44MDEgNDguMDYyNSAzMi42NDhDNDcuOTE0&#10;MSAzMy40OTYgNDcuNzYxNyAzNC4yOTcgNDcuNjY0MSAzNS4xNDVDNDcuNTYyNSAzNS45OTYgNDcu&#10;NTExNyAzNi43OTcgNDcuNDY0OCAzNy41OTRDNDcuMTEzMyA0Mi4xOTEgNDcuNTYyNSA0Ni41OSA0&#10;OC43NjE3IDUwLjc4OUM1MC4xMTMzIDU1LjY4OCA1Mi40NjA5IDYwLjI4NSA1NS44NTk0IDY0LjYz&#10;M0M1OS4yNTc4IDY4Ljk4MDUgNjMuMTU2MyA3Mi4zODI4IDY3LjYwNTUgNzQuOTI5N0M3MS4zNTE2&#10;IDc3LjA3ODEgNzUuNSA3OC41MjczIDgwLjA1MDggNzkuMzI4MUM4MC44NTE2IDc5LjQ3NjYgODEu&#10;NjQ4NCA3OS41NzgxIDgyLjUgNzkuNzI2NkM4Mi45NDkyIDc5Ljc3NzMgODMuMzk4NCA3OS44Mjgx&#10;IDgzLjg0NzcgNzkuODc4OUM4NC45NDkyIDc1LjQyOTcgODYuNjQ4NCA3MS4yODEyIDg4Ljk5NjEg&#10;NjcuNTMxQzg3LjQ0NTMgNjcuNTgyIDg1Ljg0NzcgNjcuNTMxIDg0LjI1IDY3LjM4M0M4NC4xNDg0&#10;IDY3LjMzMiA4NC4wOTc3IDY3LjMzMiA4NC4wNDY5IDY3LjMzMkM4Mi4xOTkyIDY3LjA4MiA4MC4z&#10;OTg0IDY2LjczNCA3OC43NSA2Ni4xODRDNzMuNjAxNiA2NC41MzUgNjkuMjUzOSA2MS40ODQgNjUu&#10;NzA3IDU2LjkzOEM2Mi4xNTYyIDUyLjM5MSA2MC4yNTc4IDQ3LjQ0MSA1OS45MDYyIDQyLjA0M0M1&#10;OS44MDg2IDQwLjI5MyA1OS44NTk0IDM4LjU0MyA2MC4xMDk0IDM2LjY5NUM2MC4xMDk0IDM2LjY0&#10;NSA2MC4xMDk0IDM2LjU0NyA2MC4xMDk0IDM2LjQ5NkM2MS4wNTg2IDI5LjA0NyA2NC41MDc4IDIz&#10;IDcwLjQ1MzEgMTguMzUyQzc2LjQ1MzEgMTMuNzAzIDgzLjE5OTIgMTEuODA1IDkwLjc0NjEgMTIu&#10;NzU0Qzk4LjI5MyAxMy42NTYgMTA0LjM5MSAxNy4xMDIgMTA5LjAzOSAyMy4xMDJDMTEzLjY4OCAy&#10;OS4wOTggMTE1LjU4NiAzNS44NDQgMTE0LjY4OCA0My4zOTVDMTE0LjQzOCA0NS4wOTQgMTE0LjEz&#10;NyA0Ni42OTEgMTEzLjY4OCA0OC4yNDJDMTE3Ljg4NyA0Ni44OTEgMTIyLjI4MSA0Ni4xOTEgMTI2&#10;Ljg4MyA0Ni4yNDJDMTI2LjkzIDQ1Ljc5MyAxMjcuMDMxIDQ1LjM0NCAxMjcuMDgyIDQ0Ljg5MUwx&#10;MjcuMDgyIDQ0Ljg5MVoiICAvPgogICAgPHBhdGggZmlsbD0iIzk4YmYwMCIgZD0iTTEzMi4zMjgg&#10;NTEuNDg4QzEzMS40OCA1MS4zOTEgMTMwLjY4IDUxLjI4OSAxMjkuODI4IDUxLjIzOEMxMjUuMjMg&#10;NTAuOTQxIDEyMC44MzIgNTEuMzkxIDExNi42MzcgNTIuNTM5QzExMS43MzggNTMuODg3IDEwNy4x&#10;NDEgNTYuMjg5IDEwMi43ODkgNTkuNjg4Qzk4LjQ0MTQgNjMuMDM1IDk1LjA0MyA2Ni45MzQgOTIu&#10;NTQ2OSA3MS4zODI4QzkwLjM5NDUgNzUuMTI4OSA4OC45NDUzIDc5LjI3NzMgODguMDk3NyA4My44&#10;MjgxQzkyLjQ0NTMgODQuNTc0MiA5Ni40NDUzIDg1LjgyNDIgMTAwLjE0MSA4Ny42NzU4QzEwMC4z&#10;OTEgODUuODc1IDEwMC43NDIgODQuMTc1OCAxMDEuMjQyIDgyLjU3ODFDMTAyLjg5MSA3Ny40Mjk3&#10;IDEwNS45NDEgNzMuMDgyIDExMC40ODggNjkuNTMxMkMxMTUuMDM1IDY1Ljk4NCAxMTkuOTg0IDY0&#10;LjAzNSAxMjUuNDM0IDYzLjY4NEMxMjcuMTggNjMuNTg2IDEyOC45MyA2My42MzMgMTMwLjc4MSA2&#10;My44ODNDMTMwLjgyOCA2My44ODMgMTMwLjg3OSA2My44ODMgMTMwLjkzIDYzLjg4M0MxMzguMzc1&#10;IDY0LjgzNiAxNDQuNDI2IDY4LjMzMiAxNDkuMDc0IDc0LjI4MTJDMTUzLjc3IDgwLjIyNjYgMTU1&#10;LjY2OCA4Ni45NzY2IDE1NC43MTkgOTQuNTIzNEMxNTMuNzcgMTAyLjA3IDE1MC4zMiAxMDguMTY4&#10;IDE0NC4zNzUgMTEyLjg2M0MxMzguNDI2IDExNy41MTIgMTMxLjY4IDExOS4zNjMgMTI0LjIzIDEx&#10;OC40NjFDMTI1LjA4MiAxMjIuNTEyIDEyNS4zMzIgMTI2Ljc1OCAxMjUuMDMxIDEzMS4xNTZDMTM0&#10;Ljk3NyAxMzEuODA5IDE0My45NzMgMTI4Ljk1NyAxNTIuMDIgMTIyLjcxMUMxNjAuNzE5IDExNS45&#10;MTQgMTY1Ljc2NiAxMDcuMDE2IDE2Ny4xMTMgOTYuMDcwM0MxNjguNDY1IDg1LjEyNSAxNjUuNzE1&#10;IDc1LjI4MTIgMTU4LjkxOCA2Ni41ODJDMTUyLjYyMSA1OC41MzUgMTQ0LjU3NCA1My42MzcgMTM0&#10;Ljc3NyA1MS44OTFDMTMzLjkzIDUxLjczOCAxMzMuMTI5IDUxLjU5IDEzMi4zMjggNTEuNDg4TDEz&#10;Mi4zMjggNTEuNDg4WiIgIC8+CiAgICA8cGF0aCBmaWxsPSIjMDAwMDAwIiBkPSJNMTI4LjkzIDc4&#10;LjcyNjZDMTI1LjQ4IDc4LjMyODEgMTIyLjQzNCA3OS4xNzk3IDExOS42ODQgODEuMzI4MUMxMTYu&#10;OTM0IDgzLjQ3NjYgMTE1LjM4NyA4Ni4yMjY2IDExNC45ODQgODkuNjI1QzExNC41MzUgOTMuMDc0&#10;MiAxMTUuMzg3IDk2LjEyMTEgMTE3LjUzNSA5OC44NzExQzExOS42ODQgMTAxLjYyMSAxMjIuNDM0&#10;IDEwMy4xNjggMTI1Ljg4MyAxMDMuNTdDMTI5LjI4MSAxMDQuMDE5IDEzMi4zMjggMTAzLjE2OCAx&#10;MzUuMDc4IDEwMS4wMTlDMTM3LjgyOCA5OC44NzExIDEzOS4zNzUgOTYuMTIxMSAxMzkuODI0IDky&#10;LjY3MTlDMTQwLjIyNyA4OS4yNzM0IDEzOS4zNzUgODYuMjI2NiAxMzcuMjI3IDgzLjQ3NjZDMTM1&#10;LjA3OCA4MC43MjY2IDEzMi4zMjggNzkuMTc5NyAxMjguOTMgNzguNzI2NkwxMjguOTMgNzguNzI2&#10;NloiICAvPgogICAgPHBhdGggZmlsbD0iIzk4YmYwMCIgZD0iTTEyLjgyODEgNzMuNjI4OUMxMy43&#10;NzczIDY2LjA4MiAxNy4yMjY2IDU5LjkzOCAyMy4yMjI3IDU1LjI4OUMyOS4xNzE5IDUwLjY0MSAz&#10;NS44NjcyIDQ4Ljc0MiA0My4zMTY0IDQ5LjY5MUM0Mi40NjQ4IDQ1LjY0MSA0Mi4xNjQxIDQxLjM5&#10;NSA0Mi41MTU2IDM2Ljk5NkMzMi41NzAzIDM2LjM0NCAyMy41NzQyIDM5LjE0NSAxNS41MjczIDQ1&#10;LjQ0MUM2Ljc3NzM0IDUyLjIzOCAxLjc4MTI1IDYxLjEzNyAwLjQzMzU5NCA3Mi4wODJDLTAuOTE3&#10;OTY5IDgzLjAyNzMgMS43ODEyNSA5Mi44MjQyIDguNjI4OTEgMTAxLjU3QzE0Ljg3NSAxMDkuNjE3&#10;IDIyLjkyMTkgMTE0LjUxNiAzMi43Njk1IDExNi4yNjJDMzMuNTcwMyAxMTYuNDE0IDM0LjM2NzIg&#10;MTE2LjUxMiAzNS4yMTg4IDExNi42NjRDMzYuMDY2NCAxMTYuNzYyIDM2Ljg2NzIgMTE2Ljg2MyAz&#10;Ny43MTg4IDExNi45MTRDNDIuMzE2NCAxMTcuMjE1IDQ2LjcxNDggMTE2Ljc2MiA1MC45MTAyIDEx&#10;NS42MTNDNTUuNzU3OCAxMTQuMjE1IDYwLjQwNjIgMTExLjgxNiA2NC43NTc4IDEwOC40NjVDNjku&#10;MDU0NyAxMDUuMDY2IDcyLjQ1MzEgMTAxLjE2OCA3NS4wMDM5IDk2Ljc2OTVDNzcuMTUyMyA5My4w&#10;MjM0IDc4LjYwMTYgODguODc1IDc5LjQ0OTIgODQuMzI4MUM3NS4xMDE2IDgzLjU3ODEgNzEuMTA1&#10;NSA4Mi4yNzczIDY3LjQwNjIgODAuNDc2NkM2Ny4xNTYzIDgyLjIyNjYgNjYuODA0NyA4My45MjU4&#10;IDY2LjMwNDcgODUuNTc0MkM2NC42NTYyIDkwLjcyMjcgNjEuNjA1NSA5NS4wNzAzIDU3LjA1ODYg&#10;OTguNjIxMUM1Mi41MTE3IDEwMi4xNjggNDcuNTYyNSAxMDQuMTE3IDQyLjE2NDEgMTA0LjQ2OUM0&#10;MC40MTQxIDEwNC41NjYgMzguNjE3MiAxMDQuNTE5IDM2Ljc2NTYgMTA0LjI2OUMzNi43MTg4IDEw&#10;NC4yNjkgMzYuNjY4IDEwNC4yNjkgMzYuNjE3MiAxMDQuMjE5QzI5LjE3MTkgMTAzLjI2OSAyMy4x&#10;MjExIDk5LjgyMDMgMTguNDcyNyA5My44NzExQzEzLjc3NzMgODcuODc1IDExLjg3ODkgODEuMTI4&#10;OSAxMi44MjgxIDczLjYyODlMMTIuODI4MSA3My42Mjg5WiIgIC8+CiAgICA8cGF0aCBmaWxsPSIj&#10;MDAwMDAwIiBkPSJNMzIuNDY4OCA2Ny4xMzNDMjkuNzE4OCA2OS4yMzA1IDI4LjE3MTkgNzIuMDMx&#10;MiAyNy43MjI3IDc1LjQ4MDVDMjcuMzIwMyA3OC44MjgxIDI4LjE3MTkgODEuODc4OSAzMC4zMjAz&#10;IDg0LjYyNUMzMi40MTggODcuMzc1IDM1LjE2OCA4OC45NzI3IDM4LjYxNzIgODkuNDI1OEM0Mi4w&#10;NjY0IDg5Ljc3MzQgNDUuMTEzMyA4OC45MjU4IDQ3Ljg2MzMgODYuODI0MkM1MC41NjI1IDg0LjY3&#10;NTggNTIuMTA5NCA4MS44Nzg5IDUyLjU2MjUgNzguNTI3M0M1My4wMTE3IDc1LjA3ODEgNTIuMTYw&#10;MiA3MS45ODA1IDUwLjAxMTcgNjkuMjgxMkM0Ny44NjMzIDY2LjUzNSA0NS4xMTMzIDY0Ljk4NCA0&#10;MS42NjQxIDY0LjU4NkMzOC4yMTQ4IDY0LjEzMyAzNS4xNjggNjQuOTg0IDMyLjQ2ODggNjcuMTMz&#10;TDMyLjQ2ODggNjcuMTMzWiIgIC8+CiAgICA8cGF0aCBmaWxsPSIjMDAwMDAwIiBkPSJNOTcuMjkz&#10;IDMyLjM0OEM5NS4xNDQ1IDI5LjU5OCA5Mi4zNDM4IDI4LjA0NyA4OC45NDUzIDI3LjY0OEM4NS40&#10;OTYxIDI3LjE5OSA4Mi40NDkyIDI4LjA0NyA3OS43NSAzMC4xOTlDNzcgMzIuMjk3IDc1LjQwMjMg&#10;MzUuMDk4IDc1LjAwMzkgMzguNTQzQzc0LjU1MDggNDEuOTQxIDc1LjQ1MzEgNDQuOTkyIDc3LjYw&#10;MTYgNDcuNzQyQzc5LjY5OTIgNTAuNDQxIDgyLjQ0OTIgNTIuMDM5IDg1Ljg5ODQgNTIuNDg4Qzg5&#10;LjI5NjkgNTIuODQgOTIuMzQzOCA1MS45ODggOTUuMDkzOCA0OS44OTFDOTcuODQzOCA0Ny43NDIg&#10;OTkuMzkwNiA0NC45NDEgOTkuODQzOCA0MS41OTRDMTAwLjI0MiAzOC4xNDUgOTkuMzkwNiAzNS4w&#10;NDcgOTcuMjkzIDMyLjM0OEw5Ny4yOTMgMzIuMzQ4WiIgIC8+CiAgICA8cGF0aCBmaWxsPSIjOThi&#10;ZjAwIiBkPSJNODUuMDQ2OSA4OC40MjU4Qzg0LjU5NzcgODguMzc1IDg0LjE0ODQgODguMzI0MiA4&#10;My42OTkyIDg4LjI3MzRDODIuNTk3NyA5Mi43MjI3IDgwLjg5ODQgOTYuODcxMSA3OC41NTA4IDEw&#10;MC42MjFDODAuMTAxNiAxMDAuNTE5IDgxLjY5OTIgMTAwLjU3IDgzLjM0NzcgMTAwLjc2OUM4My4z&#10;OTg0IDEwMC43NjkgODMuNDQ5MiAxMDAuNzY5IDgzLjUgMTAwLjgyQzg1LjM0NzcgMTAxLjAxOSA4&#10;Ny4wOTc3IDEwMS4zNzEgODguNzk2OSAxMDEuOTE4QzkzLjk0NTMgMTAzLjU3IDk4LjI5MyAxMDYu&#10;NjY4IDEwMS44NCAxMTEuMjE1QzEwNS4zOTEgMTE1LjcxNSAxMDcuMjg5IDEyMC42NiAxMDcuNjQx&#10;IDEyNi4xMDlDMTA3LjczOCAxMjcuODU5IDEwNy42ODggMTI5LjYwOSAxMDcuNDM4IDEzMS40NTdD&#10;MTA3LjQzOCAxMzEuNTA4IDEwNy40MzggMTMxLjU1OSAxMDcuNDM4IDEzMS42NTZDMTA2LjQ4OCAx&#10;MzkuMTA2IDEwMy4wMzkgMTQ1LjE1MiA5Ny4wOTM4IDE0OS44MDFDOTEuMDkzOCAxNTQuNDQ5IDg0&#10;LjM0NzcgMTU2LjM0OCA3Ni44MDA4IDE1NS4zOThDNjkuMjUzOSAxNTQuNDQ5IDYzLjE1NjMgMTUx&#10;IDU4LjUwNzggMTQ1LjA1MUM1My44MDg2IDEzOS4wNTUgNTEuOTEwMiAxMzIuMzA5IDUyLjg1OTQg&#10;MTI0Ljc2MkM1My4wNjI1IDEyMy4wNjIgNTMuNDEwMiAxMjEuNDYxIDUzLjkxMDIgMTE5LjkxQzQ5&#10;LjY2NDEgMTIxLjI2MiA0NS4yNjU2IDEyMS45MSA0MC42NjQxIDEyMS45MUM0MC42MTcyIDEyMi4z&#10;NTkgNDAuNTE1NiAxMjIuODEyIDQwLjQ2NDggMTIzLjI2MkMzOS4xMTcyIDEzNC4yMDcgNDEuODE2&#10;NCAxNDQuMDA0IDQ4LjY2NDEgMTUyLjc1QzU1LjQ2MDkgMTYxLjQ0NSA2NC4zNTU1IDE2Ni40OTIg&#10;NzUuMzAwOCAxNjcuODQ0Qzg2LjI0NjEgMTY5LjE5MSA5Ni4wNDMgMTY2LjQ0NSAxMDQuNzg5IDE1&#10;OS42NDVDMTEyLjgzNiAxNTMuMzQ4IDExNy43MzQgMTQ1LjMwMSAxMTkuNDg0IDEzNS40NTdDMTE5&#10;LjYzMyAxMzQuNjU2IDExOS43MzQgMTMzLjg1NiAxMTkuODgzIDEzMy4wMDhDMTE5LjkzNCAxMzIu&#10;MTU2IDEyMC4wMzUgMTMxLjM1OSAxMjAuMDgyIDEzMC41NTlDMTIwLjM4MyAxMjUuOTEgMTE5Ljkz&#10;NCAxMjEuNTEyIDExOC43ODUgMTE3LjM2M0MxMTcuNDM0IDExMi40NjUgMTE1LjAzNSAxMDcuODY3&#10;IDExMS42ODggMTAzLjUxOUMxMDguMjg5IDk5LjE3MTkgMTA0LjM5MSA5NS43MjI3IDk5Ljk5MjIg&#10;OTMuMjIyN0M5Ni4xOTUzIDkxLjA3NDIgOTIuMDQ2OSA4OS42MjUgODcuNDk2MSA4OC44MjQyQzg2&#10;LjY5OTIgODguNjc1OCA4NS44OTg0IDg4LjUyMzQgODUuMDQ2OSA4OC40MjU4TDg1LjA0NjkgODgu&#10;NDI1OFoiICAvPgogICAgPHBhdGggZmlsbD0iIzAwMDAwMCIgZD0iTTg5Ljk5NjEgMTIwLjQxQzg3&#10;Ljg0NzcgMTE3LjY2NCA4NS4wOTc3IDExNi4xMTMgODEuNjQ4NCAxMTUuNjY0Qzc4LjE5OTIgMTE1&#10;LjI2NiA3NS4xNTIzIDExNi4xMTMgNzIuNDUzMSAxMTguMjYyQzY5LjcwMzEgMTIwLjQxIDY4LjE1&#10;NjIgMTIzLjE2IDY3LjcwMzEgMTI2LjU1OUM2Ny4yNTM5IDEzMC4wMDggNjguMTU2MiAxMzMuMDU5&#10;IDcwLjMwNDcgMTM1LjgwNUM3Mi40MDI0IDEzOC41NTUgNzUuMTUyMyAxNDAuMTA2IDc4LjYwMTYg&#10;MTQwLjUwNEM4Mi4wNTA4IDE0MC45NTMgODUuMDk3NyAxNDAuMTA2IDg3Ljg0NzcgMTM3Ljk1M0M5&#10;MC41NDY5IDEzNS44MDUgOTIuMDkzOCAxMzMuMDU5IDkyLjU0NjkgMTI5LjYwOUM5Mi45NDUzIDEy&#10;Ni4yMTEgOTIuMDkzOCAxMjMuMTYgODkuOTk2MSAxMjAuNDFMODkuOTk2MSAxMjAuNDFaIiAgLz4K&#10;ICA8L2c+Cjwvc3ZnPgo=&#10;"
+ id="image1-7"
+ x="237.26282"
+ y="102.60466"
+ style="stroke-width:4.78084" /></g><g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="Dates"
+ inkscape:highlight-color="#21f371"><image
+ width="44.919369"
+ height="12.226574"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKkAAAAuEAYAAAAD8OUMAAABbmlDQ1BpY2MAACiRdZG9S0JhFIcf&#10;tTDKcigiouEOFg0KURCNZYOLhJhBVotevwI/LvcqIa1BS4PQELX0NfQf1Bq0FgRBEUQ0Nve1hNzO&#10;VUEJPZf3noffe36Hc88FezCr5oyuecjli3o44FdWo2uK8x0bwwzgZTCmGtpCKBSkY/w8SrXEg8/q&#10;1bmubfQlkoYKth7hWVXTi8IyDcGtombxnvCQmoklhE+EvboMKHxr6fE6v1mcrvOXxXokvAh2q6eS&#10;buF4C6sZPSc8KezJZUtqYx7rS1zJ/Mqy5FE5YxiECeBHIU6JTbIU8UnOy87a+6ZqviUK4lHlrVFG&#10;F0eajHi9opaka1JySvSkPFnK1t7/79NIzUzXu7v80P1qmp/j4NyHasU0f09Ns3oGjhe4zjf9BdnT&#10;3LfolabmOQb3DlzeNLX4AVztwsizFtNjNckhx55KwccF9Edh8B561+u7atxz/gSRbflFd3B4BBNS&#10;7974Aw6UaBBrfb2rAAAACXBIWXMAAAsSAAALEgHS3X78AAAbD0lEQVR4Xu09DXgU1bV3ZjYLCX8i&#10;qVSsGDTWEArGigbRghQoVPS1WKRR4tdEstDIT5rg99zyMKRbmi/QmigS85GEBExQKlSrCKItCooY&#10;WpUE2oQ+UJFSkMhPEUlIdmfm3TMnl012d3buJNmAfffO9wWSuffcc8/cOff8DyGiCQoICggKCAoI&#10;CggKCAoICggKCAoICggKCAoICggKCAoICggKCAoICggKCAoICggKCAoICggKCAoICggKCAoICggK&#10;CAoICggKCAoICggKCAoICggKCAoICggKCAoICggKCAoICggKCAoICggKCAoICggKCAoICggKCAr8&#10;/6KANOfptOrZG7KycNm9e/fU8qV5MFNz82rH2tQ1KStXdm5eRclMn71h9oZJk7Qy3aN77r1XLyZE&#10;yr3rLoQ/eDD81D3f+AbC//e/4aeU29iIv+/bJ7u0xbJ7yxY1yXlKyt68uTQLrrNnO4eP9aicIric&#10;zvMLzl599ur778cRP/whYEnIbbfh71dfjf8OGMDwll3wvxMn4Kfs/vvfYRVawYcfqkmtB5QTr71W&#10;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&#10;"
+ id="image1-0"
+ x="57.65522"
+ y="153.26154"
+ style="stroke-width:1.32725" /><image
+ width="44.919369"
+ height="12.226574"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,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&#10;AABJRU5ErkJggg==&#10;"
+ id="image1-06"
+ x="241.69444"
+ y="153.26154"
+ style="stroke-width:1.32725" /><path
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;stroke-opacity:0.886504"
+ d="m 52.934431,114.12544 v 55.27842"
+ id="path11"
+ sodipodi:nodetypes="cc" /><path
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;stroke-opacity:0.886504"
+ d="m 49.23298,20.480311 v 55.27842"
+ id="path11-6"
+ sodipodi:nodetypes="cc" /><path
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;stroke-opacity:0.886504"
+ d="m 236.47983,114.12544 v 55.27842"
+ id="path11-2"
+ sodipodi:nodetypes="cc" /><text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Mono';-inkscape-font-specification:'Liberation Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:start;text-anchor:start;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-dasharray:none;stroke-opacity:0.886504"
+ x="64.821449"
+ y="172.98299"
+ id="text11"><tspan
+ sodipodi:role="line"
+ id="tspan11"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
+ x="64.821449"
+ y="172.98299">Feb 6, 2022</tspan></text><text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Mono';-inkscape-font-specification:'Liberation Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:start;text-anchor:start;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-dasharray:none;stroke-opacity:0.886504"
+ x="248.76283"
+ y="172.98299"
+ id="text11-4"><tspan
+ sodipodi:role="line"
+ id="tspan11-9"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
+ x="248.76283"
+ y="172.98299">Feb 3, 2024</tspan></text><text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stroke-opacity:0.886504"
+ x="51.116585"
+ y="22.542809"
+ id="text12"><tspan
+ sodipodi:role="line"
+ id="tspan12"
+ style="stroke-width:0.5"
+ x="51.116585"
+ y="22.542809">v0.6.0</tspan><tspan
+ sodipodi:role="line"
+ style="stroke-width:0.5"
+ x="51.116585"
+ y="29.59836"
+ id="tspan13">Feb 2, 2022</tspan></text><path
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;stroke-opacity:0.886504"
+ d="m 94.018698,20.480311 v 55.27842"
+ id="path11-6-1"
+ sodipodi:nodetypes="cc" /><text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stroke-opacity:0.886504"
+ x="95.777336"
+ y="22.542809"
+ id="text12-5"><tspan
+ sodipodi:role="line"
+ id="tspan12-9"
+ style="stroke-width:0.5"
+ x="95.777336"
+ y="22.542809">v0.7.0</tspan><tspan
+ sodipodi:role="line"
+ style="stroke-width:0.5"
+ x="95.777336"
+ y="29.59836"
+ id="tspan13-4">Apr 8, 2022</tspan></text><path
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;stroke-opacity:0.886504"
+ d="m 137.19967,20.480311 v 55.27842"
+ id="path11-6-1-1"
+ sodipodi:nodetypes="cc" /><text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stroke-opacity:0.886504"
+ x="138.9583"
+ y="22.542809"
+ id="text12-5-7"><tspan
+ sodipodi:role="line"
+ id="tspan12-9-7"
+ style="stroke-width:0.5"
+ x="138.9583"
+ y="22.542809">v0.8.0</tspan><tspan
+ sodipodi:role="line"
+ style="stroke-width:0.5"
+ x="138.9583"
+ y="29.598358"
+ id="tspan13-4-1">Nov 21, 2022</tspan></text><path
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;stroke-opacity:0.886504"
+ d="m 208.07969,20.480311 v 55.27842"
+ id="path11-6-1-1-7"
+ sodipodi:nodetypes="cc" /><text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stroke-opacity:0.886504"
+ x="209.83833"
+ y="22.542809"
+ id="text12-5-7-7"><tspan
+ sodipodi:role="line"
+ id="tspan12-9-7-6"
+ style="stroke-width:0.5"
+ x="209.83833"
+ y="22.542809">v0.9.0</tspan><tspan
+ sodipodi:role="line"
+ style="stroke-width:0.5"
+ x="209.83833"
+ y="29.598358"
+ id="tspan13-4-1-7">Oct 10, 2023</tspan></text><path
+ style="fill:#999999;fill-opacity:1;stroke:#777777;stroke-width:0.5;stroke-dasharray:none;stroke-opacity:0.88650423"
+ d="M 226.82766,42.387797 V 75.758731"
+ id="path11-6-1-1-7-6"
+ sodipodi:nodetypes="cc" /><text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:start;text-anchor:start;fill:#999999;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stroke-opacity:0.886504"
+ x="228.5863"
+ y="48.160954"
+ id="text12-5-7-7-3"><tspan
+ sodipodi:role="line"
+ style="stroke-width:0.5;fill:#999999"
+ x="228.5863"
+ y="48.160954"
+ id="tspan13-4-1-7-5">v0.10.0 beta</tspan></text><text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stroke-opacity:0.886504"
+ x="220.41653"
+ y="23.763472"
+ id="text14"><tspan
+ sodipodi:role="line"
+ id="tspan14"
+ style="stroke-width:0.5" /></text><g
+ id="g1"
+ transform="translate(133.85599)"><path
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;stroke-opacity:0.886504"
+ d="m 132.14996,20.480311 v 55.27842"
+ id="path11-6-1-1-6"
+ sodipodi:nodetypes="cc" /><text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-dasharray:none;stroke-opacity:0.886504"
+ x="133.9086"
+ y="22.542809"
+ id="text12-5-7-3"><tspan
+ sodipodi:role="line"
+ id="tspan12-9-7-9"
+ style="stroke-width:0.5"
+ x="133.9086"
+ y="22.542809">Towards v1.0 ?</tspan><tspan
+ sodipodi:role="line"
+ style="stroke-width:0.5"
+ x="133.9086"
+ y="29.598358"
+ id="tspan13-4-1-4">Apr/May, 2024</tspan></text></g><g
+ id="g4"><path
+ style="opacity:0.753135;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;stroke-opacity:0.886504"
+ d="m 135.96321,114.12544 0,56.46883"
+ id="path11-8"
+ sodipodi:nodetypes="cc" /><text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Mono';-inkscape-font-specification:'Liberation Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:start;text-anchor:start;opacity:0.753135;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-dasharray:none;stroke-opacity:0.886504"
+ x="136.93481"
+ y="185.6306"
+ id="text11-47"><tspan
+ sodipodi:role="line"
+ id="tspan11-6"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
+ x="136.93481"
+ y="185.6306">Nov 19, 2022</tspan></text><image
+ width="33.465637"
+ height="16.50149"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAosAAAFBCAYAAAAfceVYAAABbmlDQ1BpY2MAACiRdZE5SwNhEIaf&#10;HKJoJIUiIhYBo1gkIApiqbFIEyTECEZtNptLyLHsJkiwFWwsAhaijVfhP9BWsFUQBEUQsbT2aiSs&#10;s0kgQZJZvp2H95t3mJ0Feyir5gznPOTyRT0SDHhWY2ue7ndsDOHGyZiiGtpCOByiY/w8SrXEg9/q&#10;1bmubfQlkoYKth7hWVXTi8IyDaGtombxnvCgmlESwifCPl0GFL619Hid3yxO1/nLYj0aWQS71dOT&#10;buF4C6sZPSc8KezNZUtqYx7rS1zJ/Mqy5BE5oxhECBLAQ5wSm2Qp4pecl521903VfEsUxKPKW6OM&#10;Lo40GfH6RC1J16TklOhJebKUrb3/36eRmpmud3cFoOvVND/HoXsfqhXT/D01zeoZOF7gOt/0F2RP&#10;c9+iV5qa9xjcO3B509TiB3C1C8PPmqIrNckhx55KwccF9Mdg4B561+u7atxz/gTRbflFd3B4BBNS&#10;7974A9yKZ/lBxzedAAAACXBIWXMAAB7CAAAewgFu0HU+AAAgAElEQVR4Xuy9a5BcxZUuuveud3f1&#10;U1JLavFoLMlIvAwCyxb2YFngkcGWkUEHI+YyPueAYwbwORH33rhxI+bG/XUfJ+6NmDgxcWzPRBif&#10;CB/mgM0VGFk2mAFkzGAEMggBQjzUbZqHWqIl9bO66733XWt37WZ3qbpqP3LtV60Npaquyly58suV&#10;mStXZq4lSfwwAowAI8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgwAowAI8AI&#10;MAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgw&#10;AowAI8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDAC&#10;jAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKM&#10;ACPACDACjAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgwAowA&#10;I8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDACjAAj&#10;wAgwAowAI8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKMACPA&#10;CDACjAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgwAowAI8AI&#10;MAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgw&#10;AowAI8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDACjAAjwAgwAowAI8AIMAKMACPACDAC&#10;jMByCMgMDSPACDACjAAjwAgwAo0QOHqZdJv5ezUj7cC/lZR0j1qUfqbkpYNXH5ceZ/SijUA82tXj&#10;2jECjAAj0BiBRpMgTnz1qXkiZAlqBwTq+0PqoqEuNSV/O97T2xtfsXqtkkp3yslUpwKvqWcf6tAV&#10;xqT0QEXS8CMrixEXElYWI97AXD1GgBFYioAxKcaHBvdkPn/llbkj/7IZtlhkRZZkKSvdD3OfBtOf&#10;lt3yl+/k33/rraPSmE6AlUaWpLAjUK8QYn06rrp2oFKe3hnL9nYlVq2+UMlke2ZeeHSgXPhQlgqS&#10;VJ2WpOJHYa858+8WAd6Gdosg52cEGIFQIIATJW6hJVcP9qtzp+4E1dDS+Nezfe/EuQMPP8LbbaFo&#10;ZmayAQLmBVLH5muuUTKZbjmV6QIrYdfkUz9zhVllVvvxltekH7oiwpkDj4ClwTLwtWAGGQFGgBFo&#10;goChKMaz8v1WlcR6clpZK1YL0oOsNLKohQ0BlP8V37/3MbeKYaN6s7IYNmlwxq/iLBvnYgQYAUYg&#10;HAgsKopd8gNOFUWsqZyQUyt23bUXrZONtvPCgQZzyQgwAoyAfQRYWbSPGedgBBiBkCCwRFEUwPP0&#10;84/0o3XSuBEqgCSTYAQYAUYg8Aiwshj4JmIGGQFGwAkCohXFRR7grGMsLd3L1kUnrcJ5GAFGIIwI&#10;sLIYxlZjnhkBRqAlAmj9088oEjy4Jc3b0QTAMklGgBEIJAKsLAayWZgpRoARcIMAWv3w1rObM4qt&#10;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&#10;oNCk1hSJ1Njapklb2jxzr+HuuX/ulytJulKtv19dPiW7O2oopRjmTJpO0rZydHIbRX270w7CpO3a&#10;9t556+7meZFtpzGh8/B3VdNwGOd8nITdOP3Iy6ffeNYPDnfC4PW4vLFZKVeqW/GaGV3oL79dnO1/&#10;7wXyWTOD5sN9qbV0+nHdeIkPOUuPNK6LVgtpxp532+Qvjqu7tVq0+YqyuhRldT1+b+hP3XW629Pe&#10;TnTzuieruxkdvxXgd15Hm7f2Z5TXYRg0H+e29ob5u1gcJvTP5/1O7KyPwPe70XVeFroMlH++moft&#10;KDcNF9E2z3lyLAJpBAZdDGVZN62ZaWagmG2TdZel3mLBQfkiU4pZY0ZNgAABAgQIECBAgAABAgQI&#10;ECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA&#10;gAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB&#10;AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI&#10;ECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA&#10;gAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAB&#10;AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQI&#10;ECBQbIEvdT7/6mhJTzUAAAAASUVORK5CYII=&#10;"
+ id="image1-3"
+ x="135.49545"
+ y="161.31094"
+ style="opacity:0.753135;stroke-width:2.4705" /></g><g
+ id="g3"
+ transform="translate(-2.0759988)"><path
+ style="opacity:0.753135;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;stroke-opacity:0.886504"
+ d="m 162.94013,114.12544 v 27.52148"
+ id="path11-8-9"
+ sodipodi:nodetypes="cc" /><text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Mono';-inkscape-font-specification:'Liberation Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:start;text-anchor:start;opacity:0.753135;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-dasharray:none;stroke-opacity:0.886504"
+ x="161.24034"
+ y="152.97523"
+ id="text11-47-6"><tspan
+ sodipodi:role="line"
+ id="tspan11-6-2"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
+ x="161.24034"
+ y="152.97523">Apr 1, 2023</tspan></text><image
+ width="24.577082"
+ height="23.058804"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,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&#10;"
+ id="image1-4"
+ x="163.98067"
+ y="122.29238"
+ style="opacity:0.75;stroke-width:3.71767" /></g><g
+ id="g5"
+ transform="translate(3.6943849)"><path
+ style="opacity:0.753135;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;stroke-opacity:0.886504"
+ d="m 187.15444,114.12544 v 56.46883"
+ id="path11-8-0"
+ sodipodi:nodetypes="cc" /><text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Mono';-inkscape-font-specification:'Liberation Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;opacity:0.753135;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-dasharray:none;stroke-opacity:0.886504"
+ x="202.87534"
+ y="178.51309"
+ id="text11-47-9"><tspan
+ sodipodi:role="line"
+ id="tspan11-6-3"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
+ x="202.87534"
+ y="178.51309">PSES</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:5.64444px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
+ x="202.87534"
+ y="185.6306"
+ id="tspan4">Jun 6, 2023</tspan></text><image
+ width="22.417627"
+ height="22.417627"
+ preserveAspectRatio="none"
+ xlink:href="data:image/png;base64,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&#10;"
+ id="image1-2"
+ x="191.60727"
+ y="150.17558"
+ style="stroke-width:4.72099" /></g></g></svg>
diff --git a/doc/talks/shell.nix b/doc/talks/shell.nix
index 161a61e1..bbee0714 100644
--- a/doc/talks/shell.nix
+++ b/doc/talks/shell.nix
@@ -5,7 +5,7 @@ let
scheme-basic
beamer amsmath mathtools breqn
environ
- multirow graphics import adjustbox tabu vwcol stmaryrd ulem ragged2e
+ multirow graphics import adjustbox tabu vwcol stmaryrd ulem ragged2e textpos
dvisvgm dvipng wrapfig hyperref capt-of;
});
in pkgs.mkShell { nativeBuildInputs = [ pkgs.gnumake latex ]; }
diff --git a/flake.lock b/flake.lock
index 8de99c3e..2479fb5a 100644
--- a/flake.lock
+++ b/flake.lock
@@ -95,17 +95,17 @@
},
"nixpkgs_2": {
"locked": {
- "lastModified": 1682423271,
- "narHash": "sha256-WHhl1GiOij1ob4cTLL+yhqr+vFOUH8E5wAX8Ir8fvjE=",
+ "lastModified": 1707091808,
+ "narHash": "sha256-LahKBAfGbY836gtpVNnWwBTIzN7yf/uYM/S0g393r0Y=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "94517a501434a627c5d9e72ac6e7f26174b978d3",
+ "rev": "9f2ee8c91ac42da3ae6c6a1d21555f283458247e",
"type": "github"
},
"original": {
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "94517a501434a627c5d9e72ac6e7f26174b978d3",
+ "rev": "9f2ee8c91ac42da3ae6c6a1d21555f283458247e",
"type": "github"
}
},
@@ -126,11 +126,11 @@
"nixpkgs": "nixpkgs"
},
"locked": {
- "lastModified": 1682389182,
- "narHash": "sha256-8t2nmFnH+8V48+IJsf8AK51ebXNlVbOSVYOpiqJKvJE=",
+ "lastModified": 1707271822,
+ "narHash": "sha256-/DZsoPH5GBzOpVEGz5PgJ7vh8Q6TcrJq5u8FcBjqAfI=",
"owner": "oxalica",
"repo": "rust-overlay",
- "rev": "74f1a64dd28faeeb85ef081f32cad2989850322c",
+ "rev": "7a94fe7690d2bdfe1aab475382a505e14dc114a6",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index 5cb2c407..06c74220 100644
--- a/flake.nix
+++ b/flake.nix
@@ -2,9 +2,9 @@
description =
"Garage, an S3-compatible distributed object store for self-hosted deployments";
- # Nixpkgs unstable as of 2023-04-25, has rustc v1.68
+ # Nixpkgs 23.11 as of 2024-02-07, has rustc v1.73
inputs.nixpkgs.url =
- "github:NixOS/nixpkgs/94517a501434a627c5d9e72ac6e7f26174b978d3";
+ "github:NixOS/nixpkgs/9f2ee8c91ac42da3ae6c6a1d21555f283458247e";
inputs.flake-compat.url = "github:nix-community/flake-compat";
@@ -17,9 +17,9 @@
# - rustc v1.66
# url = "github:cargo2nix/cargo2nix/8fb57a670f7993bfc24099c33eb9c5abb51f29a2";
- # Rust overlay as of 2023-04-25
+ # Rust overlay as of 2024-02-07
inputs.rust-overlay.url =
- "github:oxalica/rust-overlay/74f1a64dd28faeeb85ef081f32cad2989850322c";
+ "github:oxalica/rust-overlay/7a94fe7690d2bdfe1aab475382a505e14dc114a6";
inputs.nixpkgs.follows = "nixpkgs";
inputs.flake-compat.follows = "flake-compat";
@@ -33,25 +33,57 @@
compile = import ./nix/compile.nix;
in
flake-utils.lib.eachDefaultSystem (system:
- let pkgs = nixpkgs.legacyPackages.${system};
- in {
- packages = {
- default = (compile {
- inherit system git_version;
- pkgsSrc = nixpkgs;
- cargo2nixOverlay = cargo2nix.overlays.default;
- release = true;
- }).workspace.garage { compileMode = "build"; };
- };
- devShell = (compile {
- inherit system git_version;
- pkgsSrc = nixpkgs;
- cargo2nixOverlay = cargo2nix.overlays.default;
- release = false;
- }).workspaceShell { packages = with pkgs; [
- rustfmt
- clang
- mold
- ]; };
+ let
+ pkgs = nixpkgs.legacyPackages.${system};
+ in
+ {
+ packages =
+ let
+ packageFor = target: (compile {
+ inherit system git_version target;
+ pkgsSrc = nixpkgs;
+ cargo2nixOverlay = cargo2nix.overlays.default;
+ release = true;
+ }).workspace.garage { compileMode = "build"; };
+ in
+ {
+ # default = native release build
+ default = packageFor null;
+ # other = cross-compiled, statically-linked builds
+ amd64 = packageFor "x86_64-unknown-linux-musl";
+ i386 = packageFor "i686-unknown-linux-musl";
+ arm64 = packageFor "aarch64-unknown-linux-musl";
+ arm = packageFor "armv6l-unknown-linux-musl";
+ };
+
+ # ---- developpment shell, for making native builds only ----
+ devShells =
+ let
+ shellWithPackages = (packages: (compile {
+ inherit system git_version;
+ pkgsSrc = nixpkgs;
+ cargo2nixOverlay = cargo2nix.overlays.default;
+ }).workspaceShell { inherit packages; });
+ in
+ {
+ default = shellWithPackages
+ (with pkgs; [
+ rustfmt
+ clang
+ mold
+ ]);
+
+ # import the full shell using `nix develop .#full`
+ full = shellWithPackages (with pkgs; [
+ rustfmt
+ clang
+ mold
+ # ---- extra packages for dev tasks ----
+ cargo-audit
+ cargo-outdated
+ cargo-machete
+ nixpkgs-fmt
+ ]);
+ };
});
}
diff --git a/nix/common.nix b/nix/common.nix
index 323c3882..1ad809bb 100644
--- a/nix/common.nix
+++ b/nix/common.nix
@@ -14,4 +14,5 @@ rec {
pkgsSrc = flake.defaultNix.inputs.nixpkgs;
cargo2nix = flake.defaultNix.inputs.cargo2nix;
cargo2nixOverlay = cargo2nix.overlays.default;
+ devShells = builtins.getAttr builtins.currentSystem flake.defaultNix.devShells;
}
diff --git a/nix/compile.nix b/nix/compile.nix
index efd88bbf..1e712710 100644
--- a/nix/compile.nix
+++ b/nix/compile.nix
@@ -19,30 +19,9 @@ let
overlays = [ cargo2nixOverlay ];
};
- /* Cargo2nix is built for rustOverlay which installs Rust from Mozilla releases.
- This is fine for 64-bit platforms, but for 32-bit platforms, we need our own Rust
- to avoid incompatibilities with time_t between different versions of musl
- (>= 1.2.0 shipped by NixOS, < 1.2.0 with which rustc was built), which lead to compilation breakage.
- So we want a Rust release that is bound to our Nix repository to avoid these problems.
- See here for more info: https://musl.libc.org/time64.html
- Because Cargo2nix does not support the Rust environment shipped by NixOS,
- we emulate the structure of the Rust object created by rustOverlay.
- In practise, rustOverlay ships rustc+cargo in a single derivation while
- NixOS ships them in separate ones. We reunite them with symlinkJoin.
- */
- toolchainOptions = if target == null || target == "x86_64-unknown-linux-musl"
- || target == "aarch64-unknown-linux-musl" then {
- rustVersion = "1.68.0";
+ toolchainOptions = {
+ rustVersion = "1.73.0";
extraRustComponents = [ "clippy" ];
- } else {
- rustToolchain = pkgs.symlinkJoin {
- name = "rust-static-toolchain-${target}";
- paths = [
- pkgs.rustPlatform.rust.cargo
- pkgs.rustPlatform.rust.rustc
- # clippy not needed, it only runs on amd64
- ];
- };
};
buildEnv = (drv:
diff --git a/nix/kaniko.nix b/nix/kaniko.nix
deleted file mode 100644
index 8380fa2f..00000000
--- a/nix/kaniko.nix
+++ /dev/null
@@ -1,24 +0,0 @@
-pkgs:
-pkgs.buildGoModule rec {
- pname = "kaniko";
- version = "1.9.2";
-
- src = pkgs.fetchFromGitHub {
- owner = "GoogleContainerTools";
- repo = "kaniko";
- rev = "v${version}";
- sha256 = "dXQ0/o1qISv+sjNVIpfF85bkbM9sGOGwqVbWZpMWfMY=";
- };
-
- vendorSha256 = null;
-
- checkPhase = "true";
-
- meta = with pkgs.lib; {
- description =
- "kaniko is a tool to build container images from a Dockerfile, inside a container or Kubernetes cluster.";
- homepage = "https://github.com/GoogleContainerTools/kaniko";
- license = licenses.asl20;
- platforms = platforms.linux;
- };
-}
diff --git a/nix/manifest-tool.nix b/nix/manifest-tool.nix
deleted file mode 100644
index 1090a6ef..00000000
--- a/nix/manifest-tool.nix
+++ /dev/null
@@ -1,24 +0,0 @@
-pkgs:
-pkgs.buildGoModule rec {
- pname = "manifest-tool";
- version = "2.0.5";
-
- src = pkgs.fetchFromGitHub {
- owner = "estesp";
- repo = "manifest-tool";
- rev = "v${version}";
- sha256 = "hjCGKnE0yrlnF/VIzOwcDzmQX3Wft+21KCny/opqdLg=";
- } + "/v2";
-
- vendorSha256 = null;
-
- checkPhase = "true";
-
- meta = with pkgs.lib; {
- description =
- "Command line tool to create and query container image manifest list/indexes";
- homepage = "https://github.com/estesp/manifest-tool";
- license = licenses.asl20;
- platforms = platforms.linux;
- };
-}
diff --git a/nix/toolchain.nix b/nix/toolchain.nix
deleted file mode 100644
index 532db74e..00000000
--- a/nix/toolchain.nix
+++ /dev/null
@@ -1,31 +0,0 @@
-{ system ? builtins.currentSystem, }:
-
-with import ./common.nix;
-
-let
- platforms = [
- #"x86_64-unknown-linux-musl"
- "i686-unknown-linux-musl"
- #"aarch64-unknown-linux-musl"
- "armv6l-unknown-linux-musleabihf"
- ];
- pkgsList = builtins.map (target:
- import pkgsSrc {
- inherit system;
- crossSystem = {
- config = target;
- isStatic = true;
- };
- overlays = [ cargo2nixOverlay ];
- }) platforms;
- pkgsHost = import pkgsSrc { };
- lib = pkgsHost.lib;
- kaniko = (import ./kaniko.nix) pkgsHost;
- winscp = (import ./winscp.nix) pkgsHost;
- manifestTool = (import ./manifest-tool.nix) pkgsHost;
-in lib.flatten (builtins.map (pkgs: [
- pkgs.rustPlatform.rust.rustc
- pkgs.rustPlatform.rust.cargo
- pkgs.buildPackages.stdenv.cc
-]) pkgsList) ++ [ kaniko winscp manifestTool ]
-
diff --git a/script/helm/garage/Chart.yaml b/script/helm/garage/Chart.yaml
index 346e68ad..31b75c1f 100644
--- a/script/helm/garage/Chart.yaml
+++ b/script/helm/garage/Chart.yaml
@@ -21,4 +21,4 @@ version: 0.4.1
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
-appVersion: "v0.9.0"
+appVersion: "v0.9.1"
diff --git a/shell.nix b/shell.nix
index 991417b5..0fa02b66 100644
--- a/shell.nix
+++ b/shell.nix
@@ -5,101 +5,48 @@ with import ./nix/common.nix;
let
pkgs = import pkgsSrc {
inherit system;
- overlays = [ cargo2nixOverlay ];
};
- kaniko = (import ./nix/kaniko.nix) pkgs;
- manifest-tool = (import ./nix/manifest-tool.nix) pkgs;
winscp = (import ./nix/winscp.nix) pkgs;
+in
+{
+ # --- Dev shell inherited from flake.nix ---
+ devShell = devShells.default;
-in {
- # --- Rust Shell ---
- # Use it to compile Garage
- rust = pkgs.mkShell {
+ # --- Continuous integration shell ---
+ # The shell used for all CI jobs (along with devShell)
+ ci = pkgs.mkShell {
nativeBuildInputs = with pkgs; [
- #rustPlatform.rust.rustc
- rustPlatform.rust.cargo
- clang
- mold
- #clippy
- rustfmt
- #perl
- #protobuf
- #pkg-config
- #openssl
- file
- #cargo2nix.packages.x86_64-linux.cargo2nix
- ];
- };
-
- # --- Integration shell ---
- # Use it to test Garage with common S3 clients
- integration = pkgs.mkShell {
- nativeBuildInputs = [
winscp
- pkgs.s3cmd
- pkgs.awscli2
- pkgs.minio-client
- pkgs.rclone
- pkgs.socat
- pkgs.psmisc
- pkgs.which
- pkgs.openssl
- pkgs.curl
- pkgs.jq
- ];
- };
- # --- Release shell ---
- # A shell built to make releasing easier
- release = pkgs.mkShell {
+ kaniko
+ manifest-tool
+ awscli2
+ file
+ s3cmd
+ minio-client
+ rclone
+ socat
+ psmisc
+ which
+ openssl
+ curl
+ jq
+ ];
shellHook = ''
- function refresh_toolchain {
- pass show deuxfleurs/nix_priv_key > /tmp/nix-signing-key.sec
- nix copy \
- --to 's3://nix?endpoint=garage.deuxfleurs.fr&region=garage&secret-key=/tmp/nix-signing-key.sec' \
- $(nix-store -qR \
- $(nix-build --no-build-output --no-out-link nix/toolchain.nix))
- rm /tmp/nix-signing-key.sec
- }
-
- function refresh_cache {
- pass show deuxfleurs/nix_priv_key > /tmp/nix-signing-key.sec
- for attr in clippy.amd64 test.amd64 pkgs.{amd64,i386,arm,arm64}.{debug,release}; do
- echo "Updating cache for ''${attr}"
- derivation=$(nix-instantiate --attr ''${attr})
- nix copy -j8 \
- --to 's3://nix?endpoint=garage.deuxfleurs.fr&region=garage&secret-key=/tmp/nix-signing-key.sec' \
- $(nix-store -qR ''${derivation%\!bin})
- done
- rm /tmp/nix-signing-key.sec
- }
-
- function refresh_flake_cache {
- pass show deuxfleurs/nix_priv_key > /tmp/nix-signing-key.sec
- for attr in packages.x86_64-linux.default devShell.x86_64-linux; do
- echo "Updating cache for ''${attr}"
- derivation=$(nix path-info --derivation ".#''${attr}")
- nix copy -j8 \
- --to 's3://nix?endpoint=garage.deuxfleurs.fr&region=garage&secret-key=/tmp/nix-signing-key.sec' \
- $(nix-store -qR ''${derivation})
- done
- rm /tmp/nix-signing-key.sec
- }
-
function to_s3 {
aws \
--endpoint-url https://garage.deuxfleurs.fr \
--region garage \
s3 cp \
./result-bin/bin/garage \
- s3://garagehq.deuxfleurs.fr/_releases/''${DRONE_TAG:-$DRONE_COMMIT}/''${TARGET}/garage
+ s3://garagehq.deuxfleurs.fr/_releases/''${CI_COMMIT_TAG:-$CI_COMMIT_SHA}/''${TARGET}/garage
}
function to_docker {
executor \
--force \
- --customPlatform="''${DOCKER_PLATFORM}" \
- --destination "''${CONTAINER_NAME}:''${CONTAINER_TAG}" \
+ --customPlatform="$(echo "''${DOCKER_PLATFORM}" | sed 's/i386/386/')" \
+ --destination "$(echo "''${CONTAINER_NAME}" | sed 's/i386/386/'):''${CONTAINER_TAG}" \
--context dir://`pwd` \
--verbosity=debug
}
@@ -158,7 +105,25 @@ in {
s3://garagehq.deuxfleurs.fr/
}
'';
- nativeBuildInputs = [ pkgs.awscli2 kaniko manifest-tool ];
+
+ };
+
+ # --- Cache shell ---
+ # A shell for refreshing caches
+ cache = pkgs.mkShell {
+ shellHook = ''
+ function refresh_cache {
+ pass show deuxfleurs/nix_priv_key > /tmp/nix-signing-key.sec
+ for attr in clippy.amd64 test.amd64 pkgs.{amd64,i386,arm,arm64}.release; do
+ echo "Updating cache for ''${attr}"
+ nix copy -j8 \
+ --to 's3://nix?endpoint=garage.deuxfleurs.fr&region=garage&secret-key=/tmp/nix-signing-key.sec' \
+ $(nix path-info ''${attr} --file default.nix --derivation --recursive | sed 's/\.drv$/.drv^*/')
+
+ done
+ rm /tmp/nix-signing-key.sec
+ }
+ '';
};
}
diff --git a/src/api/Cargo.toml b/src/api/Cargo.toml
index 15bf757e..9fb562a3 100644
--- a/src/api/Cargo.toml
+++ b/src/api/Cargo.toml
@@ -20,44 +20,46 @@ garage_block.workspace = true
garage_util.workspace = true
garage_rpc.workspace = true
-async-trait = "0.1.7"
-base64 = "0.21"
-bytes = "1.0"
-chrono = "0.4"
-crypto-common = "0.1"
-err-derive = "0.3"
-hex = "0.4"
-hmac = "0.12"
-idna = "0.4"
-tracing = "0.1"
-md-5 = "0.10"
-nom = "7.1"
-sha2 = "0.10"
+async-trait.workspace = true
+base64.workspace = true
+bytes.workspace = true
+chrono.workspace = true
+crypto-common.workspace = true
+err-derive.workspace = true
+hex.workspace = true
+hmac.workspace = true
+idna.workspace = true
+tracing.workspace = true
+md-5.workspace = true
+nom.workspace = true
+pin-project.workspace = true
+sha2.workspace = true
-futures = "0.3"
-futures-util = "0.3"
-pin-project = "1.0.12"
-tokio = { version = "1.0", default-features = false, features = ["rt", "rt-multi-thread", "io-util", "net", "time", "macros", "sync", "signal", "fs"] }
-tokio-stream = "0.1"
+futures.workspace = true
+futures-util.workspace = true
+tokio.workspace = true
+tokio-stream.workspace = true
-form_urlencoded = "1.0.0"
-http = "0.2"
-httpdate = "1.0"
-http-range = "0.1"
-hyper = { version = "0.14", features = ["server", "http1", "runtime", "tcp", "stream"] }
-hyperlocal = { version = "0.8.0", default-features = false, features = ["server"] }
-multer = "2.0"
-percent-encoding = "2.1.0"
-roxmltree = "0.18"
-serde = { version = "1.0", features = ["derive"] }
-serde_bytes = "0.11"
-serde_json = "1.0"
-quick-xml = { version = "0.26", features = [ "serialize" ] }
-url = "2.3"
+form_urlencoded.workspace = true
+http.workspace = true
+httpdate.workspace = true
+http-range.workspace = true
+http-body-util.workspace = true
+hyper.workspace = true
+hyper-util.workspace = true
+multer.workspace = true
+percent-encoding.workspace = true
+roxmltree.workspace = true
+url.workspace = true
-opentelemetry = "0.17"
-opentelemetry-prometheus = { version = "0.10", optional = true }
-prometheus = { version = "0.13", optional = true }
+serde.workspace = true
+serde_bytes.workspace = true
+serde_json.workspace = true
+quick-xml.workspace = true
+
+opentelemetry.workspace = true
+opentelemetry-prometheus = { workspace = true, optional = true }
+prometheus = { workspace = true, optional = true }
[features]
k2v = [ "garage_util/k2v", "garage_model/k2v" ]
diff --git a/src/api/admin/api_server.rs b/src/api/admin/api_server.rs
index 41a5e68c..2b9be24e 100644
--- a/src/api/admin/api_server.rs
+++ b/src/api/admin/api_server.rs
@@ -3,9 +3,9 @@ use std::sync::Arc;
use async_trait::async_trait;
-use futures::future::Future;
use http::header::{ACCESS_CONTROL_ALLOW_METHODS, ACCESS_CONTROL_ALLOW_ORIGIN, ALLOW};
-use hyper::{Body, Request, Response, StatusCode};
+use hyper::{body::Incoming as IncomingBody, Request, Response, StatusCode};
+use tokio::sync::watch;
use opentelemetry::trace::SpanRef;
@@ -27,7 +27,9 @@ use crate::admin::error::*;
use crate::admin::key::*;
use crate::admin::router_v0;
use crate::admin::router_v1::{Authorization, Endpoint};
-use crate::helpers::host_to_bucket;
+use crate::helpers::*;
+
+pub type ResBody = BoxBody<Error>;
pub struct AdminApiServer {
garage: Arc<Garage>,
@@ -63,24 +65,27 @@ impl AdminApiServer {
pub async fn run(
self,
bind_addr: UnixOrTCPSocketAddress,
- shutdown_signal: impl Future<Output = ()>,
+ must_exit: watch::Receiver<bool>,
) -> Result<(), GarageError> {
let region = self.garage.config.s3_api.s3_region.clone();
ApiServer::new(region, self)
- .run_server(bind_addr, Some(0o220), shutdown_signal)
+ .run_server(bind_addr, Some(0o220), must_exit)
.await
}
- fn handle_options(&self, _req: &Request<Body>) -> Result<Response<Body>, Error> {
+ fn handle_options(&self, _req: &Request<IncomingBody>) -> Result<Response<ResBody>, Error> {
Ok(Response::builder()
.status(StatusCode::NO_CONTENT)
.header(ALLOW, "OPTIONS, GET, POST")
.header(ACCESS_CONTROL_ALLOW_METHODS, "OPTIONS, GET, POST")
.header(ACCESS_CONTROL_ALLOW_ORIGIN, "*")
- .body(Body::empty())?)
+ .body(empty_body())?)
}
- async fn handle_check_domain(&self, req: Request<Body>) -> Result<Response<Body>, Error> {
+ async fn handle_check_domain(
+ &self,
+ req: Request<IncomingBody>,
+ ) -> Result<Response<ResBody>, Error> {
let query_params: HashMap<String, String> = req
.uri()
.query()
@@ -104,7 +109,7 @@ impl AdminApiServer {
if self.check_domain(domain).await? {
Ok(Response::builder()
.status(StatusCode::OK)
- .body(Body::from(format!(
+ .body(string_body(format!(
"Domain '{domain}' is managed by Garage"
)))?)
} else {
@@ -167,7 +172,7 @@ impl AdminApiServer {
}
}
- fn handle_health(&self) -> Result<Response<Body>, Error> {
+ fn handle_health(&self) -> Result<Response<ResBody>, Error> {
let health = self.garage.system.health();
let (status, status_str) = match health.status {
@@ -189,10 +194,10 @@ impl AdminApiServer {
Ok(Response::builder()
.status(status)
.header(http::header::CONTENT_TYPE, "text/plain")
- .body(Body::from(status_str))?)
+ .body(string_body(status_str))?)
}
- fn handle_metrics(&self) -> Result<Response<Body>, Error> {
+ fn handle_metrics(&self) -> Result<Response<ResBody>, Error> {
#[cfg(feature = "metrics")]
{
use opentelemetry::trace::Tracer;
@@ -212,7 +217,7 @@ impl AdminApiServer {
Ok(Response::builder()
.status(StatusCode::OK)
.header(http::header::CONTENT_TYPE, encoder.format_type())
- .body(Body::from(buffer))?)
+ .body(bytes_body(buffer.into()))?)
}
#[cfg(not(feature = "metrics"))]
Err(Error::bad_request(
@@ -229,7 +234,7 @@ impl ApiHandler for AdminApiServer {
type Endpoint = Endpoint;
type Error = Error;
- fn parse_endpoint(&self, req: &Request<Body>) -> Result<Endpoint, Error> {
+ fn parse_endpoint(&self, req: &Request<IncomingBody>) -> Result<Endpoint, Error> {
if req.uri().path().starts_with("/v0/") {
let endpoint_v0 = router_v0::Endpoint::from_request(req)?;
Endpoint::from_v0(endpoint_v0)
@@ -240,9 +245,9 @@ impl ApiHandler for AdminApiServer {
async fn handle(
&self,
- req: Request<Body>,
+ req: Request<IncomingBody>,
endpoint: Endpoint,
- ) -> Result<Response<Body>, Error> {
+ ) -> Result<Response<ResBody>, Error> {
let expected_auth_header =
match endpoint.authorization_type() {
Authorization::None => None,
diff --git a/src/api/admin/bucket.rs b/src/api/admin/bucket.rs
index 65929d61..a8718a9f 100644
--- a/src/api/admin/bucket.rs
+++ b/src/api/admin/bucket.rs
@@ -1,7 +1,7 @@
use std::collections::HashMap;
use std::sync::Arc;
-use hyper::{Body, Request, Response, StatusCode};
+use hyper::{body::Incoming as IncomingBody, Request, Response, StatusCode};
use serde::{Deserialize, Serialize};
use garage_util::crdt::*;
@@ -17,12 +17,13 @@ use garage_model::permission::*;
use garage_model::s3::mpu_table;
use garage_model::s3::object_table::*;
+use crate::admin::api_server::ResBody;
use crate::admin::error::*;
use crate::admin::key::ApiBucketKeyPerm;
use crate::common_error::CommonError;
-use crate::helpers::{json_ok_response, parse_json_body};
+use crate::helpers::*;
-pub async fn handle_list_buckets(garage: &Arc<Garage>) -> Result<Response<Body>, Error> {
+pub async fn handle_list_buckets(garage: &Arc<Garage>) -> Result<Response<ResBody>, Error> {
let buckets = garage
.bucket_table
.get_range(
@@ -90,7 +91,7 @@ pub async fn handle_get_bucket_info(
garage: &Arc<Garage>,
id: Option<String>,
global_alias: Option<String>,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let bucket_id = match (id, global_alias) {
(Some(id), None) => parse_bucket_id(&id)?,
(None, Some(ga)) => garage
@@ -111,7 +112,7 @@ pub async fn handle_get_bucket_info(
async fn bucket_info_results(
garage: &Arc<Garage>,
bucket_id: Uuid,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let bucket = garage
.bucket_helper()
.get_existing_bucket(bucket_id)
@@ -268,9 +269,9 @@ struct GetBucketInfoKey {
pub async fn handle_create_bucket(
garage: &Arc<Garage>,
- req: Request<Body>,
-) -> Result<Response<Body>, Error> {
- let req = parse_json_body::<CreateBucketRequest>(req).await?;
+ req: Request<IncomingBody>,
+) -> Result<Response<ResBody>, Error> {
+ let req = parse_json_body::<CreateBucketRequest, _, Error>(req).await?;
if let Some(ga) = &req.global_alias {
if !is_valid_bucket_name(ga) {
@@ -360,7 +361,7 @@ struct CreateBucketLocalAlias {
pub async fn handle_delete_bucket(
garage: &Arc<Garage>,
id: String,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let helper = garage.bucket_helper();
let bucket_id = parse_bucket_id(&id)?;
@@ -403,15 +404,15 @@ pub async fn handle_delete_bucket(
Ok(Response::builder()
.status(StatusCode::NO_CONTENT)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
pub async fn handle_update_bucket(
garage: &Arc<Garage>,
id: String,
- req: Request<Body>,
-) -> Result<Response<Body>, Error> {
- let req = parse_json_body::<UpdateBucketRequest>(req).await?;
+ req: Request<IncomingBody>,
+) -> Result<Response<ResBody>, Error> {
+ let req = parse_json_body::<UpdateBucketRequest, _, Error>(req).await?;
let bucket_id = parse_bucket_id(&id)?;
let mut bucket = garage
@@ -470,10 +471,10 @@ struct UpdateBucketWebsiteAccess {
pub async fn handle_bucket_change_key_perm(
garage: &Arc<Garage>,
- req: Request<Body>,
+ req: Request<IncomingBody>,
new_perm_flag: bool,
-) -> Result<Response<Body>, Error> {
- let req = parse_json_body::<BucketKeyPermChangeRequest>(req).await?;
+) -> Result<Response<ResBody>, Error> {
+ let req = parse_json_body::<BucketKeyPermChangeRequest, _, Error>(req).await?;
let bucket_id = parse_bucket_id(&req.bucket_id)?;
@@ -526,7 +527,7 @@ pub async fn handle_global_alias_bucket(
garage: &Arc<Garage>,
bucket_id: String,
alias: String,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let bucket_id = parse_bucket_id(&bucket_id)?;
garage
@@ -541,7 +542,7 @@ pub async fn handle_global_unalias_bucket(
garage: &Arc<Garage>,
bucket_id: String,
alias: String,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let bucket_id = parse_bucket_id(&bucket_id)?;
garage
@@ -557,7 +558,7 @@ pub async fn handle_local_alias_bucket(
bucket_id: String,
access_key_id: String,
alias: String,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let bucket_id = parse_bucket_id(&bucket_id)?;
garage
@@ -573,7 +574,7 @@ pub async fn handle_local_unalias_bucket(
bucket_id: String,
access_key_id: String,
alias: String,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let bucket_id = parse_bucket_id(&bucket_id)?;
garage
diff --git a/src/api/admin/cluster.rs b/src/api/admin/cluster.rs
index 8677257d..8ce6c5ed 100644
--- a/src/api/admin/cluster.rs
+++ b/src/api/admin/cluster.rs
@@ -2,7 +2,7 @@ use std::collections::HashMap;
use std::net::SocketAddr;
use std::sync::Arc;
-use hyper::{Body, Request, Response};
+use hyper::{body::Incoming as IncomingBody, Request, Response};
use serde::{Deserialize, Serialize};
use garage_util::crdt::*;
@@ -12,10 +12,11 @@ use garage_rpc::layout;
use garage_model::garage::Garage;
+use crate::admin::api_server::ResBody;
use crate::admin::error::*;
use crate::helpers::{json_ok_response, parse_json_body};
-pub async fn handle_get_cluster_status(garage: &Arc<Garage>) -> Result<Response<Body>, Error> {
+pub async fn handle_get_cluster_status(garage: &Arc<Garage>) -> Result<Response<ResBody>, Error> {
let layout = garage.system.cluster_layout();
let mut nodes = garage
.system
@@ -110,7 +111,7 @@ pub async fn handle_get_cluster_status(garage: &Arc<Garage>) -> Result<Response<
Ok(json_ok_response(&res)?)
}
-pub async fn handle_get_cluster_health(garage: &Arc<Garage>) -> Result<Response<Body>, Error> {
+pub async fn handle_get_cluster_health(garage: &Arc<Garage>) -> Result<Response<ResBody>, Error> {
use garage_rpc::system::ClusterHealthStatus;
let health = garage.system.health();
let health = ClusterHealth {
@@ -132,9 +133,9 @@ pub async fn handle_get_cluster_health(garage: &Arc<Garage>) -> Result<Response<
pub async fn handle_connect_cluster_nodes(
garage: &Arc<Garage>,
- req: Request<Body>,
-) -> Result<Response<Body>, Error> {
- let req = parse_json_body::<Vec<String>>(req).await?;
+ req: Request<IncomingBody>,
+) -> Result<Response<ResBody>, Error> {
+ let req = parse_json_body::<Vec<String>, _, Error>(req).await?;
let res = futures::future::join_all(req.iter().map(|node| garage.system.connect(node)))
.await
@@ -154,7 +155,7 @@ pub async fn handle_connect_cluster_nodes(
Ok(json_ok_response(&res)?)
}
-pub async fn handle_get_cluster_layout(garage: &Arc<Garage>) -> Result<Response<Body>, Error> {
+pub async fn handle_get_cluster_layout(garage: &Arc<Garage>) -> Result<Response<ResBody>, Error> {
let res = format_cluster_layout(&garage.system.cluster_layout());
Ok(json_ok_response(&res)?)
@@ -290,9 +291,9 @@ struct NodeResp {
pub async fn handle_update_cluster_layout(
garage: &Arc<Garage>,
- req: Request<Body>,
-) -> Result<Response<Body>, Error> {
- let updates = parse_json_body::<UpdateClusterLayoutRequest>(req).await?;
+ req: Request<IncomingBody>,
+) -> Result<Response<ResBody>, Error> {
+ let updates = parse_json_body::<UpdateClusterLayoutRequest, _, Error>(req).await?;
let mut layout = garage.system.cluster_layout().clone();
@@ -336,9 +337,9 @@ pub async fn handle_update_cluster_layout(
pub async fn handle_apply_cluster_layout(
garage: &Arc<Garage>,
- req: Request<Body>,
-) -> Result<Response<Body>, Error> {
- let param = parse_json_body::<ApplyLayoutRequest>(req).await?;
+ req: Request<IncomingBody>,
+) -> Result<Response<ResBody>, Error> {
+ let param = parse_json_body::<ApplyLayoutRequest, _, Error>(req).await?;
let layout = garage.system.cluster_layout().clone();
let (layout, msg) = layout.apply_staged_changes(Some(param.version))?;
@@ -356,7 +357,9 @@ pub async fn handle_apply_cluster_layout(
Ok(json_ok_response(&res)?)
}
-pub async fn handle_revert_cluster_layout(garage: &Arc<Garage>) -> Result<Response<Body>, Error> {
+pub async fn handle_revert_cluster_layout(
+ garage: &Arc<Garage>,
+) -> Result<Response<ResBody>, Error> {
let layout = garage.system.cluster_layout().clone();
let layout = layout.revert_staged_changes()?;
garage
diff --git a/src/api/admin/error.rs b/src/api/admin/error.rs
index ed1a07bd..2668b42d 100644
--- a/src/api/admin/error.rs
+++ b/src/api/admin/error.rs
@@ -1,13 +1,13 @@
use err_derive::Error;
use hyper::header::HeaderValue;
-use hyper::{Body, HeaderMap, StatusCode};
+use hyper::{HeaderMap, StatusCode};
pub use garage_model::helper::error::Error as HelperError;
use crate::common_error::CommonError;
pub use crate::common_error::{CommonErrorDerivative, OkOrBadRequest, OkOrInternalError};
use crate::generic_server::ApiError;
-use crate::helpers::CustomApiErrorBody;
+use crate::helpers::*;
/// Errors of this crate
#[derive(Debug, Error)]
@@ -40,18 +40,6 @@ where
impl CommonErrorDerivative for Error {}
-impl From<HelperError> for Error {
- fn from(err: HelperError) -> Self {
- match err {
- HelperError::Internal(i) => Self::Common(CommonError::InternalError(i)),
- HelperError::BadRequest(b) => Self::Common(CommonError::BadRequest(b)),
- HelperError::InvalidBucketName(n) => Self::Common(CommonError::InvalidBucketName(n)),
- HelperError::NoSuchBucket(n) => Self::Common(CommonError::NoSuchBucket(n)),
- HelperError::NoSuchAccessKey(n) => Self::NoSuchAccessKey(n),
- }
- }
-}
-
impl Error {
fn code(&self) -> &'static str {
match self {
@@ -77,14 +65,14 @@ impl ApiError for Error {
header_map.append(header::CONTENT_TYPE, "application/json".parse().unwrap());
}
- fn http_body(&self, garage_region: &str, path: &str) -> Body {
+ fn http_body(&self, garage_region: &str, path: &str) -> ErrorBody {
let error = CustomApiErrorBody {
code: self.code().to_string(),
message: format!("{}", self),
path: path.to_string(),
region: garage_region.to_string(),
};
- Body::from(serde_json::to_string_pretty(&error).unwrap_or_else(|_| {
+ let error_str = serde_json::to_string_pretty(&error).unwrap_or_else(|_| {
r#"
{
"code": "InternalError",
@@ -92,6 +80,7 @@ impl ApiError for Error {
}
"#
.into()
- }))
+ });
+ error_body(error_str)
}
}
diff --git a/src/api/admin/key.rs b/src/api/admin/key.rs
index 8d1c6890..1efaca16 100644
--- a/src/api/admin/key.rs
+++ b/src/api/admin/key.rs
@@ -1,7 +1,7 @@
use std::collections::HashMap;
use std::sync::Arc;
-use hyper::{Body, Request, Response, StatusCode};
+use hyper::{body::Incoming as IncomingBody, Request, Response, StatusCode};
use serde::{Deserialize, Serialize};
use garage_table::*;
@@ -9,10 +9,11 @@ use garage_table::*;
use garage_model::garage::Garage;
use garage_model::key_table::*;
+use crate::admin::api_server::ResBody;
use crate::admin::error::*;
-use crate::helpers::{is_default, json_ok_response, parse_json_body};
+use crate::helpers::*;
-pub async fn handle_list_keys(garage: &Arc<Garage>) -> Result<Response<Body>, Error> {
+pub async fn handle_list_keys(garage: &Arc<Garage>) -> Result<Response<ResBody>, Error> {
let res = garage
.key_table
.get_range(
@@ -45,7 +46,7 @@ pub async fn handle_get_key_info(
id: Option<String>,
search: Option<String>,
show_secret_key: bool,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let key = if let Some(id) = id {
garage.key_helper().get_existing_key(&id).await?
} else if let Some(search) = search {
@@ -62,9 +63,9 @@ pub async fn handle_get_key_info(
pub async fn handle_create_key(
garage: &Arc<Garage>,
- req: Request<Body>,
-) -> Result<Response<Body>, Error> {
- let req = parse_json_body::<CreateKeyRequest>(req).await?;
+ req: Request<IncomingBody>,
+) -> Result<Response<ResBody>, Error> {
+ let req = parse_json_body::<CreateKeyRequest, _, Error>(req).await?;
let key = Key::new(req.name.as_deref().unwrap_or("Unnamed key"));
garage.key_table.insert(&key).await?;
@@ -80,9 +81,9 @@ struct CreateKeyRequest {
pub async fn handle_import_key(
garage: &Arc<Garage>,
- req: Request<Body>,
-) -> Result<Response<Body>, Error> {
- let req = parse_json_body::<ImportKeyRequest>(req).await?;
+ req: Request<IncomingBody>,
+) -> Result<Response<ResBody>, Error> {
+ let req = parse_json_body::<ImportKeyRequest, _, Error>(req).await?;
let prev_key = garage.key_table.get(&EmptyKey, &req.access_key_id).await?;
if prev_key.is_some() {
@@ -111,9 +112,9 @@ struct ImportKeyRequest {
pub async fn handle_update_key(
garage: &Arc<Garage>,
id: String,
- req: Request<Body>,
-) -> Result<Response<Body>, Error> {
- let req = parse_json_body::<UpdateKeyRequest>(req).await?;
+ req: Request<IncomingBody>,
+) -> Result<Response<ResBody>, Error> {
+ let req = parse_json_body::<UpdateKeyRequest, _, Error>(req).await?;
let mut key = garage.key_helper().get_existing_key(&id).await?;
@@ -146,7 +147,10 @@ struct UpdateKeyRequest {
deny: Option<KeyPerm>,
}
-pub async fn handle_delete_key(garage: &Arc<Garage>, id: String) -> Result<Response<Body>, Error> {
+pub async fn handle_delete_key(
+ garage: &Arc<Garage>,
+ id: String,
+) -> Result<Response<ResBody>, Error> {
let mut key = garage.key_helper().get_existing_key(&id).await?;
key.state.as_option().unwrap();
@@ -155,14 +159,14 @@ pub async fn handle_delete_key(garage: &Arc<Garage>, id: String) -> Result<Respo
Ok(Response::builder()
.status(StatusCode::NO_CONTENT)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
async fn key_info_results(
garage: &Arc<Garage>,
key: Key,
show_secret: bool,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let mut relevant_buckets = HashMap::new();
let key_state = key.state.as_option().unwrap();
diff --git a/src/api/common_error.rs b/src/api/common_error.rs
index ecb22fd8..c47555d4 100644
--- a/src/api/common_error.rs
+++ b/src/api/common_error.rs
@@ -3,6 +3,8 @@ use hyper::StatusCode;
use garage_util::error::Error as GarageError;
+use garage_model::helper::error::Error as HelperError;
+
/// Errors of this crate
#[derive(Debug, Error)]
pub enum CommonError {
@@ -28,6 +30,10 @@ pub enum CommonError {
#[error(display = "Bad request: {}", _0)]
BadRequest(String),
+ /// The client sent a header with invalid value
+ #[error(display = "Invalid header value: {}", _0)]
+ InvalidHeader(#[error(source)] hyper::header::ToStrError),
+
// ---- SPECIFIC ERROR CONDITIONS ----
// These have to be error codes referenced in the S3 spec here:
// https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList
@@ -62,7 +68,9 @@ impl CommonError {
CommonError::Forbidden(_) => StatusCode::FORBIDDEN,
CommonError::NoSuchBucket(_) => StatusCode::NOT_FOUND,
CommonError::BucketNotEmpty | CommonError::BucketAlreadyExists => StatusCode::CONFLICT,
- CommonError::InvalidBucketName(_) => StatusCode::BAD_REQUEST,
+ CommonError::InvalidBucketName(_) | CommonError::InvalidHeader(_) => {
+ StatusCode::BAD_REQUEST
+ }
}
}
@@ -80,6 +88,7 @@ impl CommonError {
CommonError::BucketAlreadyExists => "BucketAlreadyExists",
CommonError::BucketNotEmpty => "BucketNotEmpty",
CommonError::InvalidBucketName(_) => "InvalidBucketName",
+ CommonError::InvalidHeader(_) => "InvalidHeaderValue",
}
}
@@ -88,6 +97,18 @@ impl CommonError {
}
}
+impl From<HelperError> for CommonError {
+ fn from(err: HelperError) -> Self {
+ match err {
+ HelperError::Internal(i) => Self::InternalError(i),
+ HelperError::BadRequest(b) => Self::BadRequest(b),
+ HelperError::InvalidBucketName(n) => Self::InvalidBucketName(n),
+ HelperError::NoSuchBucket(n) => Self::NoSuchBucket(n),
+ e => Self::bad_request(format!("{}", e)),
+ }
+ }
+}
+
pub trait CommonErrorDerivative: From<CommonError> {
fn internal_error<M: ToString>(msg: M) -> Self {
Self::from(CommonError::InternalError(GarageError::Message(
diff --git a/src/api/generic_server.rs b/src/api/generic_server.rs
index fa346f48..9c49fdf3 100644
--- a/src/api/generic_server.rs
+++ b/src/api/generic_server.rs
@@ -1,3 +1,4 @@
+use std::convert::Infallible;
use std::fs::{self, Permissions};
use std::os::unix::fs::PermissionsExt;
use std::sync::Arc;
@@ -5,16 +6,19 @@ use std::sync::Arc;
use async_trait::async_trait;
use futures::future::Future;
+use futures::stream::{futures_unordered::FuturesUnordered, StreamExt};
+use http_body_util::BodyExt;
use hyper::header::HeaderValue;
-use hyper::server::conn::AddrStream;
-use hyper::service::{make_service_fn, service_fn};
-use hyper::{Body, Request, Response, Server};
+use hyper::server::conn::http1;
+use hyper::service::service_fn;
+use hyper::{body::Incoming as IncomingBody, Request, Response};
use hyper::{HeaderMap, StatusCode};
+use hyper_util::rt::TokioIo;
-use hyperlocal::UnixServerExt;
-
-use tokio::net::UnixStream;
+use tokio::io::{AsyncRead, AsyncWrite};
+use tokio::net::{TcpListener, TcpStream, UnixListener, UnixStream};
+use tokio::sync::watch;
use opentelemetry::{
global,
@@ -28,6 +32,8 @@ use garage_util::forwarded_headers;
use garage_util::metrics::{gen_trace_id, RecordDuration};
use garage_util::socket_address::UnixOrTCPSocketAddress;
+use crate::helpers::{BoxBody, ErrorBody};
+
pub(crate) trait ApiEndpoint: Send + Sync + 'static {
fn name(&self) -> &'static str;
fn add_span_attributes(&self, span: SpanRef<'_>);
@@ -36,7 +42,7 @@ pub(crate) trait ApiEndpoint: Send + Sync + 'static {
pub trait ApiError: std::error::Error + Send + Sync + 'static {
fn http_status_code(&self) -> StatusCode;
fn add_http_headers(&self, header_map: &mut HeaderMap<HeaderValue>);
- fn http_body(&self, garage_region: &str, path: &str) -> Body;
+ fn http_body(&self, garage_region: &str, path: &str) -> ErrorBody;
}
#[async_trait]
@@ -47,12 +53,12 @@ pub(crate) trait ApiHandler: Send + Sync + 'static {
type Endpoint: ApiEndpoint;
type Error: ApiError;
- fn parse_endpoint(&self, r: &Request<Body>) -> Result<Self::Endpoint, Self::Error>;
+ fn parse_endpoint(&self, r: &Request<IncomingBody>) -> Result<Self::Endpoint, Self::Error>;
async fn handle(
&self,
- req: Request<Body>,
+ req: Request<IncomingBody>,
endpoint: Self::Endpoint,
- ) -> Result<Response<Body>, Self::Error>;
+ ) -> Result<Response<BoxBody<Self::Error>>, Self::Error>;
}
pub(crate) struct ApiServer<A: ApiHandler> {
@@ -99,74 +105,42 @@ impl<A: ApiHandler> ApiServer<A> {
self: Arc<Self>,
bind_addr: UnixOrTCPSocketAddress,
unix_bind_addr_mode: Option<u32>,
- shutdown_signal: impl Future<Output = ()>,
+ must_exit: watch::Receiver<bool>,
) -> Result<(), GarageError> {
- let tcp_service = make_service_fn(|conn: &AddrStream| {
- let this = self.clone();
-
- let client_addr = conn.remote_addr();
- async move {
- Ok::<_, GarageError>(service_fn(move |req: Request<Body>| {
- let this = this.clone();
-
- this.handler(req, client_addr.to_string())
- }))
- }
- });
-
- let unix_service = make_service_fn(|_: &UnixStream| {
- let this = self.clone();
-
- let path = bind_addr.to_string();
- async move {
- Ok::<_, GarageError>(service_fn(move |req: Request<Body>| {
- let this = this.clone();
-
- this.handler(req, path.clone())
- }))
- }
- });
-
- info!(
- "{} API server listening on {}",
- A::API_NAME_DISPLAY,
- bind_addr
- );
+ let server_name = format!("{} API", A::API_NAME_DISPLAY);
+ info!("{} server listening on {}", server_name, bind_addr);
match bind_addr {
UnixOrTCPSocketAddress::TCPSocket(addr) => {
- Server::bind(&addr)
- .serve(tcp_service)
- .with_graceful_shutdown(shutdown_signal)
- .await?
+ let listener = TcpListener::bind(addr).await?;
+
+ let handler = move |request, socketaddr| self.clone().handler(request, socketaddr);
+ server_loop(server_name, listener, handler, must_exit).await
}
UnixOrTCPSocketAddress::UnixSocket(ref path) => {
if path.exists() {
fs::remove_file(path)?
}
- let bound = Server::bind_unix(path)?;
+ let listener = UnixListener::bind(path)?;
+ let listener = UnixListenerOn(listener, path.display().to_string());
fs::set_permissions(
path,
Permissions::from_mode(unix_bind_addr_mode.unwrap_or(0o222)),
)?;
- bound
- .serve(unix_service)
- .with_graceful_shutdown(shutdown_signal)
- .await?;
+ let handler = move |request, socketaddr| self.clone().handler(request, socketaddr);
+ server_loop(server_name, listener, handler, must_exit).await
}
- };
-
- Ok(())
+ }
}
async fn handler(
self: Arc<Self>,
- req: Request<Body>,
+ req: Request<IncomingBody>,
addr: String,
- ) -> Result<Response<Body>, GarageError> {
+ ) -> Result<Response<BoxBody<A::Error>>, http::Error> {
let uri = req.uri().clone();
if let Ok(forwarded_for_ip_addr) =
@@ -205,7 +179,7 @@ impl<A: ApiHandler> ApiServer<A> {
Ok(x)
}
Err(e) => {
- let body: Body = e.http_body(&self.region, uri.path());
+ let body = e.http_body(&self.region, uri.path());
let mut http_error_builder = Response::builder().status(e.http_status_code());
if let Some(header_map) = http_error_builder.headers_mut() {
@@ -219,12 +193,16 @@ impl<A: ApiHandler> ApiServer<A> {
} else {
info!("Response: error {}, {}", e.http_status_code(), e);
}
- Ok(http_error)
+ Ok(http_error
+ .map(|body| BoxBody::new(body.map_err(|_: Infallible| unreachable!()))))
}
}
}
- async fn handler_stage2(&self, req: Request<Body>) -> Result<Response<Body>, A::Error> {
+ async fn handler_stage2(
+ &self,
+ req: Request<IncomingBody>,
+ ) -> Result<Response<BoxBody<A::Error>>, A::Error> {
let endpoint = self.api_handler.parse_endpoint(&req)?;
debug!("Endpoint: {}", endpoint.name());
@@ -265,3 +243,123 @@ impl<A: ApiHandler> ApiServer<A> {
res
}
}
+
+// ==== helper functions ====
+
+#[async_trait]
+pub trait Accept: Send + Sync + 'static {
+ type Stream: AsyncRead + AsyncWrite + Send + Sync + 'static;
+ async fn accept(&self) -> std::io::Result<(Self::Stream, String)>;
+}
+
+#[async_trait]
+impl Accept for TcpListener {
+ type Stream = TcpStream;
+ async fn accept(&self) -> std::io::Result<(Self::Stream, String)> {
+ self.accept()
+ .await
+ .map(|(stream, addr)| (stream, addr.to_string()))
+ }
+}
+
+pub struct UnixListenerOn(pub UnixListener, pub String);
+
+#[async_trait]
+impl Accept for UnixListenerOn {
+ type Stream = UnixStream;
+ async fn accept(&self) -> std::io::Result<(Self::Stream, String)> {
+ self.0
+ .accept()
+ .await
+ .map(|(stream, _addr)| (stream, self.1.clone()))
+ }
+}
+
+pub async fn server_loop<A, H, F, E>(
+ server_name: String,
+ listener: A,
+ handler: H,
+ mut must_exit: watch::Receiver<bool>,
+) -> Result<(), GarageError>
+where
+ A: Accept,
+ H: Fn(Request<IncomingBody>, String) -> F + Send + Sync + Clone + 'static,
+ F: Future<Output = Result<Response<BoxBody<E>>, http::Error>> + Send + 'static,
+ E: Send + Sync + std::error::Error + 'static,
+{
+ let (conn_in, mut conn_out) = tokio::sync::mpsc::unbounded_channel();
+ let connection_collector = tokio::spawn({
+ let server_name = server_name.clone();
+ async move {
+ let mut connections = FuturesUnordered::new();
+ loop {
+ let collect_next = async {
+ if connections.is_empty() {
+ futures::future::pending().await
+ } else {
+ connections.next().await
+ }
+ };
+ tokio::select! {
+ result = collect_next => {
+ trace!("{} server: HTTP connection finished: {:?}", server_name, result);
+ }
+ new_fut = conn_out.recv() => {
+ match new_fut {
+ Some(f) => connections.push(f),
+ None => break,
+ }
+ }
+ }
+ }
+ if !connections.is_empty() {
+ info!(
+ "{} server: {} connections still open",
+ server_name,
+ connections.len()
+ );
+ while let Some(conn_res) = connections.next().await {
+ trace!(
+ "{} server: HTTP connection finished: {:?}",
+ server_name,
+ conn_res
+ );
+ info!(
+ "{} server: {} connections still open",
+ server_name,
+ connections.len()
+ );
+ }
+ }
+ }
+ });
+
+ while !*must_exit.borrow() {
+ let (stream, client_addr) = tokio::select! {
+ acc = listener.accept() => acc?,
+ _ = must_exit.changed() => continue,
+ };
+
+ let io = TokioIo::new(stream);
+
+ let handler = handler.clone();
+ let serve = move |req: Request<IncomingBody>| handler(req, client_addr.clone());
+
+ let fut = tokio::task::spawn(async move {
+ let io = Box::pin(io);
+ if let Err(e) = http1::Builder::new()
+ .serve_connection(io, service_fn(serve))
+ .await
+ {
+ debug!("Error handling HTTP connection: {}", e);
+ }
+ });
+ conn_in.send(fut)?;
+ }
+
+ info!("{} server exiting", server_name);
+ drop(conn_in);
+ connection_collector.await?;
+
+ Ok(())
+}
diff --git a/src/api/helpers.rs b/src/api/helpers.rs
index 1d55ebd5..5f488912 100644
--- a/src/api/helpers.rs
+++ b/src/api/helpers.rs
@@ -1,7 +1,17 @@
-use hyper::{Body, Request, Response};
+use std::convert::Infallible;
+
+use futures::{Stream, StreamExt, TryStreamExt};
+
+use http_body_util::{BodyExt, Full as FullBody};
+use hyper::{
+ body::{Body, Bytes},
+ Request, Response,
+};
use idna::domain_to_unicode;
use serde::{Deserialize, Serialize};
+use garage_util::error::Error as GarageError;
+
use crate::common_error::{CommonError as Error, *};
/// What kind of authorization is required to perform a given action
@@ -138,18 +148,64 @@ pub fn key_after_prefix(pfx: &str) -> Option<String> {
None
}
-pub async fn parse_json_body<T: for<'de> Deserialize<'de>>(req: Request<Body>) -> Result<T, Error> {
- let body = hyper::body::to_bytes(req.into_body()).await?;
+// =============== body helpers =================
+
+pub type EmptyBody = http_body_util::Empty<bytes::Bytes>;
+pub type ErrorBody = FullBody<bytes::Bytes>;
+pub type BoxBody<E> = http_body_util::combinators::BoxBody<bytes::Bytes, E>;
+
+pub fn string_body<E>(s: String) -> BoxBody<E> {
+ bytes_body(bytes::Bytes::from(s.into_bytes()))
+}
+pub fn bytes_body<E>(b: bytes::Bytes) -> BoxBody<E> {
+ BoxBody::new(FullBody::new(b).map_err(|_: Infallible| unreachable!()))
+}
+pub fn empty_body<E>() -> BoxBody<E> {
+ BoxBody::new(http_body_util::Empty::new().map_err(|_: Infallible| unreachable!()))
+}
+pub fn error_body(s: String) -> ErrorBody {
+ ErrorBody::from(bytes::Bytes::from(s.into_bytes()))
+}
+
+pub async fn parse_json_body<T, B, E>(req: Request<B>) -> Result<T, E>
+where
+ T: for<'de> Deserialize<'de>,
+ B: Body,
+ E: From<<B as Body>::Error> + From<Error>,
+{
+ let body = req.into_body().collect().await?.to_bytes();
let resp: T = serde_json::from_slice(&body).ok_or_bad_request("Invalid JSON")?;
Ok(resp)
}
-pub fn json_ok_response<T: Serialize>(res: &T) -> Result<Response<Body>, Error> {
- let resp_json = serde_json::to_string_pretty(res).map_err(garage_util::error::Error::from)?;
+pub fn json_ok_response<E, T: Serialize>(res: &T) -> Result<Response<BoxBody<E>>, E>
+where
+ E: From<Error>,
+{
+ let resp_json = serde_json::to_string_pretty(res)
+ .map_err(GarageError::from)
+ .map_err(Error::from)?;
Ok(Response::builder()
.status(hyper::StatusCode::OK)
.header(http::header::CONTENT_TYPE, "application/json")
- .body(Body::from(resp_json))?)
+ .body(string_body(resp_json))
+ .unwrap())
+}
+
+pub fn body_stream<B, E>(body: B) -> impl Stream<Item = Result<Bytes, E>>
+where
+ B: Body<Data = Bytes>,
+ <B as Body>::Error: Into<E>,
+ E: From<Error>,
+{
+ let stream = http_body_util::BodyStream::new(body);
+ let stream = TryStreamExt::map_err(stream, Into::into);
+ stream.map(|x| {
+ x.and_then(|f| {
+ f.into_data()
+ .map_err(|_| E::from(Error::bad_request("non-data frame")))
+ })
+ })
}
pub fn is_default<T: Default + PartialEq>(v: &T) -> bool {
diff --git a/src/api/k2v/api_server.rs b/src/api/k2v/api_server.rs
index 3a032aba..e97da2af 100644
--- a/src/api/k2v/api_server.rs
+++ b/src/api/k2v/api_server.rs
@@ -2,8 +2,8 @@ use std::sync::Arc;
use async_trait::async_trait;
-use futures::future::Future;
-use hyper::{Body, Method, Request, Response};
+use hyper::{body::Incoming as IncomingBody, Method, Request, Response};
+use tokio::sync::watch;
use opentelemetry::{trace::SpanRef, KeyValue};
@@ -25,6 +25,9 @@ use crate::k2v::item::*;
use crate::k2v::router::Endpoint;
use crate::s3::cors::*;
+pub use crate::signature::streaming::ReqBody;
+pub type ResBody = BoxBody<Error>;
+
pub struct K2VApiServer {
garage: Arc<Garage>,
}
@@ -39,10 +42,10 @@ impl K2VApiServer {
garage: Arc<Garage>,
bind_addr: UnixOrTCPSocketAddress,
s3_region: String,
- shutdown_signal: impl Future<Output = ()>,
+ must_exit: watch::Receiver<bool>,
) -> Result<(), GarageError> {
ApiServer::new(s3_region, K2VApiServer { garage })
- .run_server(bind_addr, None, shutdown_signal)
+ .run_server(bind_addr, None, must_exit)
.await
}
}
@@ -55,7 +58,7 @@ impl ApiHandler for K2VApiServer {
type Endpoint = K2VApiEndpoint;
type Error = Error;
- fn parse_endpoint(&self, req: &Request<Body>) -> Result<K2VApiEndpoint, Error> {
+ fn parse_endpoint(&self, req: &Request<IncomingBody>) -> Result<K2VApiEndpoint, Error> {
let (endpoint, bucket_name) = Endpoint::from_request(req)?;
Ok(K2VApiEndpoint {
@@ -66,9 +69,9 @@ impl ApiHandler for K2VApiServer {
async fn handle(
&self,
- req: Request<Body>,
+ req: Request<IncomingBody>,
endpoint: K2VApiEndpoint,
- ) -> Result<Response<Body>, Error> {
+ ) -> Result<Response<ResBody>, Error> {
let K2VApiEndpoint {
bucket_name,
endpoint,
@@ -77,9 +80,10 @@ impl ApiHandler for K2VApiServer {
// The OPTIONS method is procesed early, before we even check for an API key
if let Endpoint::Options = endpoint {
- return Ok(handle_options_s3api(garage, &req, Some(bucket_name))
+ let options_res = handle_options_api(garage, &req, Some(bucket_name))
.await
- .ok_or_bad_request("Error handling OPTIONS")?);
+ .ok_or_bad_request("Error handling OPTIONS")?;
+ return Ok(options_res.map(|_empty_body: EmptyBody| empty_body()));
}
let (api_key, mut content_sha256) = check_payload_signature(&garage, "k2v", &req).await?;
diff --git a/src/api/k2v/batch.rs b/src/api/k2v/batch.rs
index 294380ea..ae2778b1 100644
--- a/src/api/k2v/batch.rs
+++ b/src/api/k2v/batch.rs
@@ -1,7 +1,7 @@
use std::sync::Arc;
use base64::prelude::*;
-use hyper::{Body, Request, Response, StatusCode};
+use hyper::{Request, Response, StatusCode};
use serde::{Deserialize, Serialize};
use garage_util::data::*;
@@ -13,15 +13,16 @@ use garage_model::k2v::causality::*;
use garage_model::k2v::item_table::*;
use crate::helpers::*;
+use crate::k2v::api_server::{ReqBody, ResBody};
use crate::k2v::error::*;
use crate::k2v::range::read_range;
pub async fn handle_insert_batch(
garage: Arc<Garage>,
bucket_id: Uuid,
- req: Request<Body>,
-) -> Result<Response<Body>, Error> {
- let items = parse_json_body::<Vec<InsertBatchItem>>(req).await?;
+ req: Request<ReqBody>,
+) -> Result<Response<ResBody>, Error> {
+ let items = parse_json_body::<Vec<InsertBatchItem>, _, Error>(req).await?;
let mut items2 = vec![];
for it in items {
@@ -41,15 +42,15 @@ pub async fn handle_insert_batch(
Ok(Response::builder()
.status(StatusCode::NO_CONTENT)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
pub async fn handle_read_batch(
garage: Arc<Garage>,
bucket_id: Uuid,
- req: Request<Body>,
-) -> Result<Response<Body>, Error> {
- let queries = parse_json_body::<Vec<ReadBatchQuery>>(req).await?;
+ req: Request<ReqBody>,
+) -> Result<Response<ResBody>, Error> {
+ let queries = parse_json_body::<Vec<ReadBatchQuery>, _, Error>(req).await?;
let resp_results = futures::future::join_all(
queries
@@ -139,9 +140,9 @@ async fn handle_read_batch_query(
pub async fn handle_delete_batch(
garage: Arc<Garage>,
bucket_id: Uuid,
- req: Request<Body>,
-) -> Result<Response<Body>, Error> {
- let queries = parse_json_body::<Vec<DeleteBatchQuery>>(req).await?;
+ req: Request<ReqBody>,
+) -> Result<Response<ResBody>, Error> {
+ let queries = parse_json_body::<Vec<DeleteBatchQuery>, _, Error>(req).await?;
let resp_results = futures::future::join_all(
queries
@@ -253,11 +254,11 @@ pub(crate) async fn handle_poll_range(
garage: Arc<Garage>,
bucket_id: Uuid,
partition_key: &str,
- req: Request<Body>,
-) -> Result<Response<Body>, Error> {
+ req: Request<ReqBody>,
+) -> Result<Response<ResBody>, Error> {
use garage_model::k2v::sub::PollRange;
- let query = parse_json_body::<PollRangeQuery>(req).await?;
+ let query = parse_json_body::<PollRangeQuery, _, Error>(req).await?;
let timeout_msec = query.timeout.unwrap_or(300).clamp(1, 600) * 1000;
@@ -292,7 +293,7 @@ pub(crate) async fn handle_poll_range(
} else {
Ok(Response::builder()
.status(StatusCode::NOT_MODIFIED)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
}
diff --git a/src/api/k2v/error.rs b/src/api/k2v/error.rs
index 4eb017ab..16479227 100644
--- a/src/api/k2v/error.rs
+++ b/src/api/k2v/error.rs
@@ -1,13 +1,11 @@
use err_derive::Error;
use hyper::header::HeaderValue;
-use hyper::{Body, HeaderMap, StatusCode};
-
-use garage_model::helper::error::Error as HelperError;
+use hyper::{HeaderMap, StatusCode};
use crate::common_error::CommonError;
pub use crate::common_error::{CommonErrorDerivative, OkOrBadRequest, OkOrInternalError};
use crate::generic_server::ApiError;
-use crate::helpers::CustomApiErrorBody;
+use crate::helpers::*;
use crate::signature::error::Error as SignatureError;
/// Errors of this crate
@@ -30,10 +28,6 @@ pub enum Error {
#[error(display = "Invalid base64: {}", _0)]
InvalidBase64(#[error(source)] base64::DecodeError),
- /// The client sent a header with invalid value
- #[error(display = "Invalid header value: {}", _0)]
- InvalidHeader(#[error(source)] hyper::header::ToStrError),
-
/// The client asked for an invalid return format (invalid Accept header)
#[error(display = "Not acceptable: {}", _0)]
NotAcceptable(String),
@@ -54,18 +48,6 @@ where
impl CommonErrorDerivative for Error {}
-impl From<HelperError> for Error {
- fn from(err: HelperError) -> Self {
- match err {
- HelperError::Internal(i) => Self::Common(CommonError::InternalError(i)),
- HelperError::BadRequest(b) => Self::Common(CommonError::BadRequest(b)),
- HelperError::InvalidBucketName(n) => Self::Common(CommonError::InvalidBucketName(n)),
- HelperError::NoSuchBucket(n) => Self::Common(CommonError::NoSuchBucket(n)),
- e => Self::Common(CommonError::BadRequest(format!("{}", e))),
- }
- }
-}
-
impl From<SignatureError> for Error {
fn from(err: SignatureError) -> Self {
match err {
@@ -74,7 +56,6 @@ impl From<SignatureError> for Error {
Self::AuthorizationHeaderMalformed(c)
}
SignatureError::InvalidUtf8Str(i) => Self::InvalidUtf8Str(i),
- SignatureError::InvalidHeader(h) => Self::InvalidHeader(h),
}
}
}
@@ -90,7 +71,6 @@ impl Error {
Error::NotAcceptable(_) => "NotAcceptable",
Error::AuthorizationHeaderMalformed(_) => "AuthorizationHeaderMalformed",
Error::InvalidBase64(_) => "InvalidBase64",
- Error::InvalidHeader(_) => "InvalidHeaderValue",
Error::InvalidUtf8Str(_) => "InvalidUtf8String",
}
}
@@ -105,7 +85,6 @@ impl ApiError for Error {
Error::NotAcceptable(_) => StatusCode::NOT_ACCEPTABLE,
Error::AuthorizationHeaderMalformed(_)
| Error::InvalidBase64(_)
- | Error::InvalidHeader(_)
| Error::InvalidUtf8Str(_) => StatusCode::BAD_REQUEST,
}
}
@@ -115,14 +94,14 @@ impl ApiError for Error {
header_map.append(header::CONTENT_TYPE, "application/json".parse().unwrap());
}
- fn http_body(&self, garage_region: &str, path: &str) -> Body {
+ fn http_body(&self, garage_region: &str, path: &str) -> ErrorBody {
let error = CustomApiErrorBody {
code: self.code().to_string(),
message: format!("{}", self),
path: path.to_string(),
region: garage_region.to_string(),
};
- Body::from(serde_json::to_string_pretty(&error).unwrap_or_else(|_| {
+ let error_str = serde_json::to_string_pretty(&error).unwrap_or_else(|_| {
r#"
{
"code": "InternalError",
@@ -130,6 +109,7 @@ impl ApiError for Error {
}
"#
.into()
- }))
+ });
+ error_body(error_str)
}
}
diff --git a/src/api/k2v/index.rs b/src/api/k2v/index.rs
index e8cd1fba..291464ab 100644
--- a/src/api/k2v/index.rs
+++ b/src/api/k2v/index.rs
@@ -1,6 +1,6 @@
use std::sync::Arc;
-use hyper::{Body, Response};
+use hyper::Response;
use serde::Serialize;
use garage_util::data::*;
@@ -11,6 +11,7 @@ use garage_model::garage::Garage;
use garage_model::k2v::item_table::{BYTES, CONFLICTS, ENTRIES, VALUES};
use crate::helpers::*;
+use crate::k2v::api_server::ResBody;
use crate::k2v::error::*;
use crate::k2v::range::read_range;
@@ -22,7 +23,7 @@ pub async fn handle_read_index(
end: Option<String>,
limit: Option<u64>,
reverse: Option<bool>,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let reverse = reverse.unwrap_or(false);
let node_id_vec = garage
@@ -71,7 +72,7 @@ pub async fn handle_read_index(
next_start,
};
- Ok(json_ok_response(&resp)?)
+ json_ok_response::<Error, _>(&resp)
}
#[derive(Serialize)]
diff --git a/src/api/k2v/item.rs b/src/api/k2v/item.rs
index e13a0f30..0c5931a1 100644
--- a/src/api/k2v/item.rs
+++ b/src/api/k2v/item.rs
@@ -3,7 +3,7 @@ use std::sync::Arc;
use base64::prelude::*;
use http::header;
-use hyper::{Body, Request, Response, StatusCode};
+use hyper::{Request, Response, StatusCode};
use garage_util::data::*;
@@ -11,6 +11,8 @@ use garage_model::garage::Garage;
use garage_model::k2v::causality::*;
use garage_model::k2v::item_table::*;
+use crate::helpers::*;
+use crate::k2v::api_server::{ReqBody, ResBody};
use crate::k2v::error::*;
pub const X_GARAGE_CAUSALITY_TOKEN: &str = "X-Garage-Causality-Token";
@@ -22,7 +24,7 @@ pub enum ReturnFormat {
}
impl ReturnFormat {
- pub fn from(req: &Request<Body>) -> Result<Self, Error> {
+ pub fn from(req: &Request<ReqBody>) -> Result<Self, Error> {
let accept = match req.headers().get(header::ACCEPT) {
Some(a) => a.to_str()?,
None => return Ok(Self::Json),
@@ -40,7 +42,7 @@ impl ReturnFormat {
}
}
- pub fn make_response(&self, item: &K2VItem) -> Result<Response<Body>, Error> {
+ pub fn make_response(&self, item: &K2VItem) -> Result<Response<ResBody>, Error> {
let vals = item.values();
if vals.is_empty() {
@@ -52,7 +54,7 @@ impl ReturnFormat {
Self::Binary if vals.len() > 1 => Ok(Response::builder()
.header(X_GARAGE_CAUSALITY_TOKEN, ct)
.status(StatusCode::CONFLICT)
- .body(Body::empty())?),
+ .body(empty_body())?),
Self::Binary => {
assert!(vals.len() == 1);
Self::make_binary_response(ct, vals[0])
@@ -62,22 +64,22 @@ impl ReturnFormat {
}
}
- fn make_binary_response(ct: String, v: &DvvsValue) -> Result<Response<Body>, Error> {
+ fn make_binary_response(ct: String, v: &DvvsValue) -> Result<Response<ResBody>, Error> {
match v {
DvvsValue::Deleted => Ok(Response::builder()
.header(X_GARAGE_CAUSALITY_TOKEN, ct)
.header(header::CONTENT_TYPE, "application/octet-stream")
.status(StatusCode::NO_CONTENT)
- .body(Body::empty())?),
+ .body(empty_body())?),
DvvsValue::Value(v) => Ok(Response::builder()
.header(X_GARAGE_CAUSALITY_TOKEN, ct)
.header(header::CONTENT_TYPE, "application/octet-stream")
.status(StatusCode::OK)
- .body(Body::from(v.to_vec()))?),
+ .body(bytes_body(v.to_vec().into()))?),
}
}
- fn make_json_response(ct: String, v: &[&DvvsValue]) -> Result<Response<Body>, Error> {
+ fn make_json_response(ct: String, v: &[&DvvsValue]) -> Result<Response<ResBody>, Error> {
let items = v
.iter()
.map(|v| match v {
@@ -91,7 +93,7 @@ impl ReturnFormat {
.header(X_GARAGE_CAUSALITY_TOKEN, ct)
.header(header::CONTENT_TYPE, "application/json")
.status(StatusCode::OK)
- .body(Body::from(json_body))?)
+ .body(string_body(json_body))?)
}
}
@@ -99,11 +101,11 @@ impl ReturnFormat {
#[allow(clippy::ptr_arg)]
pub async fn handle_read_item(
garage: Arc<Garage>,
- req: &Request<Body>,
+ req: &Request<ReqBody>,
bucket_id: Uuid,
partition_key: &str,
sort_key: &String,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let format = ReturnFormat::from(req)?;
let item = garage
@@ -124,11 +126,11 @@ pub async fn handle_read_item(
pub async fn handle_insert_item(
garage: Arc<Garage>,
- req: Request<Body>,
+ req: Request<ReqBody>,
bucket_id: Uuid,
partition_key: &str,
sort_key: &str,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let causal_context = req
.headers()
.get(X_GARAGE_CAUSALITY_TOKEN)
@@ -137,7 +139,10 @@ pub async fn handle_insert_item(
.map(CausalContext::parse_helper)
.transpose()?;
- let body = hyper::body::to_bytes(req.into_body()).await?;
+ let body = http_body_util::BodyExt::collect(req.into_body())
+ .await?
+ .to_bytes();
+
let value = DvvsValue::Value(body.to_vec());
garage
@@ -154,16 +159,16 @@ pub async fn handle_insert_item(
Ok(Response::builder()
.status(StatusCode::NO_CONTENT)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
pub async fn handle_delete_item(
garage: Arc<Garage>,
- req: Request<Body>,
+ req: Request<ReqBody>,
bucket_id: Uuid,
partition_key: &str,
sort_key: &str,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let causal_context = req
.headers()
.get(X_GARAGE_CAUSALITY_TOKEN)
@@ -188,20 +193,20 @@ pub async fn handle_delete_item(
Ok(Response::builder()
.status(StatusCode::NO_CONTENT)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
/// Handle ReadItem request
#[allow(clippy::ptr_arg)]
pub async fn handle_poll_item(
garage: Arc<Garage>,
- req: &Request<Body>,
+ req: &Request<ReqBody>,
bucket_id: Uuid,
partition_key: String,
sort_key: String,
causality_token: String,
timeout_secs: Option<u64>,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let format = ReturnFormat::from(req)?;
let causal_context =
@@ -226,6 +231,6 @@ pub async fn handle_poll_item(
} else {
Ok(Response::builder()
.status(StatusCode::NOT_MODIFIED)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
}
diff --git a/src/api/s3/api_server.rs b/src/api/s3/api_server.rs
index 887839dd..7fac6261 100644
--- a/src/api/s3/api_server.rs
+++ b/src/api/s3/api_server.rs
@@ -2,9 +2,9 @@ use std::sync::Arc;
use async_trait::async_trait;
-use futures::future::Future;
use hyper::header;
-use hyper::{Body, Request, Response};
+use hyper::{body::Incoming as IncomingBody, Request, Response};
+use tokio::sync::watch;
use opentelemetry::{trace::SpanRef, KeyValue};
@@ -34,6 +34,9 @@ use crate::s3::put::*;
use crate::s3::router::Endpoint;
use crate::s3::website::*;
+pub use crate::signature::streaming::ReqBody;
+pub type ResBody = BoxBody<Error>;
+
pub struct S3ApiServer {
garage: Arc<Garage>,
}
@@ -48,19 +51,19 @@ impl S3ApiServer {
garage: Arc<Garage>,
addr: UnixOrTCPSocketAddress,
s3_region: String,
- shutdown_signal: impl Future<Output = ()>,
+ must_exit: watch::Receiver<bool>,
) -> Result<(), GarageError> {
ApiServer::new(s3_region, S3ApiServer { garage })
- .run_server(addr, None, shutdown_signal)
+ .run_server(addr, None, must_exit)
.await
}
async fn handle_request_without_bucket(
&self,
- _req: Request<Body>,
+ _req: Request<ReqBody>,
api_key: Key,
endpoint: Endpoint,
- ) -> Result<Response<Body>, Error> {
+ ) -> Result<Response<ResBody>, Error> {
match endpoint {
Endpoint::ListBuckets => handle_list_buckets(&self.garage, &api_key).await,
endpoint => Err(Error::NotImplemented(endpoint.name().to_owned())),
@@ -76,7 +79,7 @@ impl ApiHandler for S3ApiServer {
type Endpoint = S3ApiEndpoint;
type Error = Error;
- fn parse_endpoint(&self, req: &Request<Body>) -> Result<S3ApiEndpoint, Error> {
+ fn parse_endpoint(&self, req: &Request<IncomingBody>) -> Result<S3ApiEndpoint, Error> {
let authority = req
.headers()
.get(header::HOST)
@@ -104,9 +107,9 @@ impl ApiHandler for S3ApiServer {
async fn handle(
&self,
- req: Request<Body>,
+ req: Request<IncomingBody>,
endpoint: S3ApiEndpoint,
- ) -> Result<Response<Body>, Error> {
+ ) -> Result<Response<ResBody>, Error> {
let S3ApiEndpoint {
bucket_name,
endpoint,
@@ -118,7 +121,8 @@ impl ApiHandler for S3ApiServer {
return handle_post_object(garage, req, bucket_name.unwrap()).await;
}
if let Endpoint::Options = endpoint {
- return handle_options_s3api(garage, &req, bucket_name).await;
+ let options_res = handle_options_api(garage, &req, bucket_name).await?;
+ return Ok(options_res.map(|_empty_body: EmptyBody| empty_body()));
}
let (api_key, mut content_sha256) = check_payload_signature(&garage, "s3", &req).await?;
@@ -174,8 +178,26 @@ impl ApiHandler for S3ApiServer {
key, part_number, ..
} => handle_head(garage, &req, bucket_id, &key, part_number).await,
Endpoint::GetObject {
- key, part_number, ..
- } => handle_get(garage, &req, bucket_id, &key, part_number).await,
+ key,
+ part_number,
+ response_cache_control,
+ response_content_disposition,
+ response_content_encoding,
+ response_content_language,
+ response_content_type,
+ response_expires,
+ ..
+ } => {
+ let overrides = GetObjectOverrides {
+ response_cache_control,
+ response_content_disposition,
+ response_content_encoding,
+ response_content_language,
+ response_content_type,
+ response_expires,
+ };
+ handle_get(garage, &req, bucket_id, &key, part_number, overrides).await
+ }
Endpoint::UploadPart {
key,
part_number,
@@ -235,8 +257,7 @@ impl ApiHandler for S3ApiServer {
}
Endpoint::CreateBucket {} => unreachable!(),
Endpoint::HeadBucket {} => {
- let empty_body: Body = Body::from(vec![]);
- let response = Response::builder().body(empty_body).unwrap();
+ let response = Response::builder().body(empty_body()).unwrap();
Ok(response)
}
Endpoint::DeleteBucket {} => {
@@ -257,7 +278,7 @@ impl ApiHandler for S3ApiServer {
common: ListQueryCommon {
bucket_name,
bucket_id,
- delimiter: delimiter.map(|d| d.to_string()),
+ delimiter,
page_size: max_keys.unwrap_or(1000).clamp(1, 1000),
prefix: prefix.unwrap_or_default(),
urlencode_resp: encoding_type.map(|e| e == "url").unwrap_or(false),
@@ -287,7 +308,7 @@ impl ApiHandler for S3ApiServer {
common: ListQueryCommon {
bucket_name,
bucket_id,
- delimiter: delimiter.map(|d| d.to_string()),
+ delimiter,
page_size: max_keys.unwrap_or(1000).clamp(1, 1000),
urlencode_resp: encoding_type.map(|e| e == "url").unwrap_or(false),
prefix: prefix.unwrap_or_default(),
@@ -320,7 +341,7 @@ impl ApiHandler for S3ApiServer {
common: ListQueryCommon {
bucket_name,
bucket_id,
- delimiter: delimiter.map(|d| d.to_string()),
+ delimiter,
page_size: max_uploads.unwrap_or(1000).clamp(1, 1000),
prefix: prefix.unwrap_or_default(),
urlencode_resp: encoding_type.map(|e| e == "url").unwrap_or(false),
diff --git a/src/api/s3/bucket.rs b/src/api/s3/bucket.rs
index 733981e1..fa2f1b6d 100644
--- a/src/api/s3/bucket.rs
+++ b/src/api/s3/bucket.rs
@@ -1,7 +1,8 @@
use std::collections::HashMap;
use std::sync::Arc;
-use hyper::{Body, Request, Response, StatusCode};
+use http_body_util::BodyExt;
+use hyper::{Request, Response, StatusCode};
use garage_model::bucket_alias_table::*;
use garage_model::bucket_table::Bucket;
@@ -14,11 +15,13 @@ use garage_util::data::*;
use garage_util::time::*;
use crate::common_error::CommonError;
+use crate::helpers::*;
+use crate::s3::api_server::{ReqBody, ResBody};
use crate::s3::error::*;
use crate::s3::xml as s3_xml;
use crate::signature::verify_signed_content;
-pub fn handle_get_bucket_location(garage: Arc<Garage>) -> Result<Response<Body>, Error> {
+pub fn handle_get_bucket_location(garage: Arc<Garage>) -> Result<Response<ResBody>, Error> {
let loc = s3_xml::LocationConstraint {
xmlns: (),
region: garage.config.s3_api.s3_region.to_string(),
@@ -27,10 +30,10 @@ pub fn handle_get_bucket_location(garage: Arc<Garage>) -> Result<Response<Body>,
Ok(Response::builder()
.header("Content-Type", "application/xml")
- .body(Body::from(xml.into_bytes()))?)
+ .body(string_body(xml))?)
}
-pub fn handle_get_bucket_versioning() -> Result<Response<Body>, Error> {
+pub fn handle_get_bucket_versioning() -> Result<Response<ResBody>, Error> {
let versioning = s3_xml::VersioningConfiguration {
xmlns: (),
status: None,
@@ -40,10 +43,13 @@ pub fn handle_get_bucket_versioning() -> Result<Response<Body>, Error> {
Ok(Response::builder()
.header("Content-Type", "application/xml")
- .body(Body::from(xml.into_bytes()))?)
+ .body(string_body(xml))?)
}
-pub async fn handle_list_buckets(garage: &Garage, api_key: &Key) -> Result<Response<Body>, Error> {
+pub async fn handle_list_buckets(
+ garage: &Garage,
+ api_key: &Key,
+) -> Result<Response<ResBody>, Error> {
let key_p = api_key.params().ok_or_internal_error(
"Key should not be in deleted state at this point (in handle_list_buckets)",
)?;
@@ -109,17 +115,17 @@ pub async fn handle_list_buckets(garage: &Garage, api_key: &Key) -> Result<Respo
Ok(Response::builder()
.header("Content-Type", "application/xml")
- .body(Body::from(xml))?)
+ .body(string_body(xml))?)
}
pub async fn handle_create_bucket(
garage: &Garage,
- req: Request<Body>,
+ req: Request<ReqBody>,
content_sha256: Option<Hash>,
api_key: Key,
bucket_name: String,
-) -> Result<Response<Body>, Error> {
- let body = hyper::body::to_bytes(req.into_body()).await?;
+) -> Result<Response<ResBody>, Error> {
+ let body = BodyExt::collect(req.into_body()).await?.to_bytes();
if let Some(content_sha256) = content_sha256 {
verify_signed_content(content_sha256, &body[..])?;
@@ -194,7 +200,7 @@ pub async fn handle_create_bucket(
Ok(Response::builder()
.header("Location", format!("/{}", bucket_name))
- .body(Body::empty())
+ .body(empty_body())
.unwrap())
}
@@ -203,7 +209,7 @@ pub async fn handle_delete_bucket(
bucket_id: Uuid,
bucket_name: String,
api_key: Key,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let key_params = api_key
.params()
.ok_or_internal_error("Key should not be deleted at this point")?;
@@ -282,7 +288,7 @@ pub async fn handle_delete_bucket(
Ok(Response::builder()
.status(StatusCode::NO_CONTENT)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
fn parse_create_bucket_xml(xml_bytes: &[u8]) -> Option<Option<String>> {
diff --git a/src/api/s3/copy.rs b/src/api/s3/copy.rs
index 68b4f0c9..ba9bfc88 100644
--- a/src/api/s3/copy.rs
+++ b/src/api/s3/copy.rs
@@ -6,7 +6,7 @@ use futures::{stream, stream::Stream, StreamExt};
use md5::{Digest as Md5Digest, Md5};
use bytes::Bytes;
-use hyper::{Body, Request, Response};
+use hyper::{Request, Response};
use serde::Serialize;
use garage_rpc::netapp::bytes_buf::BytesBuf;
@@ -22,7 +22,8 @@ use garage_model::s3::mpu_table::*;
use garage_model::s3::object_table::*;
use garage_model::s3::version_table::*;
-use crate::helpers::parse_bucket_key;
+use crate::helpers::*;
+use crate::s3::api_server::{ReqBody, ResBody};
use crate::s3::error::*;
use crate::s3::multipart;
use crate::s3::put::get_headers;
@@ -31,10 +32,10 @@ use crate::s3::xml::{self as s3_xml, xmlns_tag};
pub async fn handle_copy(
garage: Arc<Garage>,
api_key: &Key,
- req: &Request<Body>,
+ req: &Request<ReqBody>,
dest_bucket_id: Uuid,
dest_key: &str,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let copy_precondition = CopyPreconditionHeaders::parse(req)?;
let source_object = get_copy_source(&garage, api_key, req).await?;
@@ -176,18 +177,18 @@ pub async fn handle_copy(
"x-amz-copy-source-version-id",
hex::encode(source_version.uuid),
)
- .body(Body::from(xml))?)
+ .body(string_body(xml))?)
}
pub async fn handle_upload_part_copy(
garage: Arc<Garage>,
api_key: &Key,
- req: &Request<Body>,
+ req: &Request<ReqBody>,
dest_bucket_id: Uuid,
dest_key: &str,
part_number: u64,
upload_id: &str,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let copy_precondition = CopyPreconditionHeaders::parse(req)?;
let dest_upload_id = multipart::decode_upload_id(upload_id)?;
@@ -432,13 +433,13 @@ pub async fn handle_upload_part_copy(
"x-amz-copy-source-version-id",
hex::encode(source_object_version.uuid),
)
- .body(Body::from(resp_xml))?)
+ .body(string_body(resp_xml))?)
}
async fn get_copy_source(
garage: &Garage,
api_key: &Key,
- req: &Request<Body>,
+ req: &Request<ReqBody>,
) -> Result<Object, Error> {
let copy_source = req.headers().get("x-amz-copy-source").unwrap().to_str()?;
let copy_source = percent_encoding::percent_decode_str(copy_source).decode_utf8()?;
@@ -501,7 +502,7 @@ struct CopyPreconditionHeaders {
}
impl CopyPreconditionHeaders {
- fn parse(req: &Request<Body>) -> Result<Self, Error> {
+ fn parse(req: &Request<ReqBody>) -> Result<Self, Error> {
Ok(Self {
copy_source_if_match: req
.headers()
diff --git a/src/api/s3/cors.rs b/src/api/s3/cors.rs
index 49097ad1..e069cae4 100644
--- a/src/api/s3/cors.rs
+++ b/src/api/s3/cors.rs
@@ -5,10 +5,18 @@ use http::header::{
ACCESS_CONTROL_ALLOW_HEADERS, ACCESS_CONTROL_ALLOW_METHODS, ACCESS_CONTROL_ALLOW_ORIGIN,
ACCESS_CONTROL_EXPOSE_HEADERS, ACCESS_CONTROL_REQUEST_HEADERS, ACCESS_CONTROL_REQUEST_METHOD,
};
-use hyper::{header::HeaderName, Body, Method, Request, Response, StatusCode};
+use hyper::{
+ body::Body, body::Incoming as IncomingBody, header::HeaderName, Method, Request, Response,
+ StatusCode,
+};
+
+use http_body_util::BodyExt;
use serde::{Deserialize, Serialize};
+use crate::common_error::CommonError;
+use crate::helpers::*;
+use crate::s3::api_server::{ReqBody, ResBody};
use crate::s3::error::*;
use crate::s3::xml::{to_xml_with_header, xmlns_tag, IntValue, Value};
use crate::signature::verify_signed_content;
@@ -17,7 +25,7 @@ use garage_model::bucket_table::{Bucket, CorsRule as GarageCorsRule};
use garage_model::garage::Garage;
use garage_util::data::*;
-pub async fn handle_get_cors(bucket: &Bucket) -> Result<Response<Body>, Error> {
+pub async fn handle_get_cors(bucket: &Bucket) -> Result<Response<ResBody>, Error> {
let param = bucket
.params()
.ok_or_internal_error("Bucket should not be deleted at this point")?;
@@ -34,18 +42,18 @@ pub async fn handle_get_cors(bucket: &Bucket) -> Result<Response<Body>, Error> {
Ok(Response::builder()
.status(StatusCode::OK)
.header(http::header::CONTENT_TYPE, "application/xml")
- .body(Body::from(xml))?)
+ .body(string_body(xml))?)
} else {
Ok(Response::builder()
.status(StatusCode::NO_CONTENT)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
}
pub async fn handle_delete_cors(
garage: Arc<Garage>,
mut bucket: Bucket,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let param = bucket
.params_mut()
.ok_or_internal_error("Bucket should not be deleted at this point")?;
@@ -55,16 +63,16 @@ pub async fn handle_delete_cors(
Ok(Response::builder()
.status(StatusCode::NO_CONTENT)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
pub async fn handle_put_cors(
garage: Arc<Garage>,
mut bucket: Bucket,
- req: Request<Body>,
+ req: Request<ReqBody>,
content_sha256: Option<Hash>,
-) -> Result<Response<Body>, Error> {
- let body = hyper::body::to_bytes(req.into_body()).await?;
+) -> Result<Response<ResBody>, Error> {
+ let body = BodyExt::collect(req.into_body()).await?.to_bytes();
if let Some(content_sha256) = content_sha256 {
verify_signed_content(content_sha256, &body[..])?;
@@ -84,14 +92,14 @@ pub async fn handle_put_cors(
Ok(Response::builder()
.status(StatusCode::OK)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
-pub async fn handle_options_s3api(
+pub async fn handle_options_api(
garage: Arc<Garage>,
- req: &Request<Body>,
+ req: &Request<IncomingBody>,
bucket_name: Option<String>,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<EmptyBody>, CommonError> {
// FIXME: CORS rules of buckets with local aliases are
// not taken into account.
@@ -121,7 +129,7 @@ pub async fn handle_options_s3api(
.header(ACCESS_CONTROL_ALLOW_ORIGIN, "*")
.header(ACCESS_CONTROL_ALLOW_METHODS, "*")
.status(StatusCode::OK)
- .body(Body::empty())?)
+ .body(EmptyBody::new())?)
}
} else {
// If there is no bucket name in the request,
@@ -131,14 +139,14 @@ pub async fn handle_options_s3api(
.header(ACCESS_CONTROL_ALLOW_ORIGIN, "*")
.header(ACCESS_CONTROL_ALLOW_METHODS, "GET")
.status(StatusCode::OK)
- .body(Body::empty())?)
+ .body(EmptyBody::new())?)
}
}
pub fn handle_options_for_bucket(
- req: &Request<Body>,
+ req: &Request<IncomingBody>,
bucket: &Bucket,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<EmptyBody>, CommonError> {
let origin = req
.headers()
.get("Origin")
@@ -161,18 +169,20 @@ pub fn handle_options_for_bucket(
if let Some(rule) = matching_rule {
let mut resp = Response::builder()
.status(StatusCode::OK)
- .body(Body::empty())?;
+ .body(EmptyBody::new())?;
add_cors_headers(&mut resp, rule).ok_or_internal_error("Invalid CORS configuration")?;
return Ok(resp);
}
}
- Err(Error::forbidden("This CORS request is not allowed."))
+ Err(CommonError::Forbidden(
+ "This CORS request is not allowed.".into(),
+ ))
}
pub fn find_matching_cors_rule<'a>(
bucket: &'a Bucket,
- req: &Request<Body>,
+ req: &Request<impl Body>,
) -> Result<Option<&'a GarageCorsRule>, Error> {
if let Some(cors_config) = bucket.params().unwrap().cors_config.get() {
if let Some(origin) = req.headers().get("Origin") {
@@ -209,7 +219,7 @@ where
}
pub fn add_cors_headers(
- resp: &mut Response<Body>,
+ resp: &mut Response<impl Body>,
rule: &GarageCorsRule,
) -> Result<(), http::header::InvalidHeaderValue> {
let h = resp.headers_mut();
diff --git a/src/api/s3/delete.rs b/src/api/s3/delete.rs
index 1c491eac..3fb39147 100644
--- a/src/api/s3/delete.rs
+++ b/src/api/s3/delete.rs
@@ -1,12 +1,15 @@
use std::sync::Arc;
-use hyper::{Body, Request, Response, StatusCode};
+use http_body_util::BodyExt;
+use hyper::{Request, Response, StatusCode};
use garage_util::data::*;
use garage_model::garage::Garage;
use garage_model::s3::object_table::*;
+use crate::helpers::*;
+use crate::s3::api_server::{ReqBody, ResBody};
use crate::s3::error::*;
use crate::s3::put::next_timestamp;
use crate::s3::xml as s3_xml;
@@ -59,11 +62,11 @@ pub async fn handle_delete(
garage: Arc<Garage>,
bucket_id: Uuid,
key: &str,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
match handle_delete_internal(&garage, bucket_id, key).await {
Ok(_) | Err(Error::NoSuchKey) => Ok(Response::builder()
.status(StatusCode::NO_CONTENT)
- .body(Body::from(vec![]))
+ .body(empty_body())
.unwrap()),
Err(e) => Err(e),
}
@@ -72,10 +75,10 @@ pub async fn handle_delete(
pub async fn handle_delete_objects(
garage: Arc<Garage>,
bucket_id: Uuid,
- req: Request<Body>,
+ req: Request<ReqBody>,
content_sha256: Option<Hash>,
-) -> Result<Response<Body>, Error> {
- let body = hyper::body::to_bytes(req.into_body()).await?;
+) -> Result<Response<ResBody>, Error> {
+ let body = BodyExt::collect(req.into_body()).await?.to_bytes();
if let Some(content_sha256) = content_sha256 {
verify_signed_content(content_sha256, &body[..])?;
@@ -118,7 +121,7 @@ pub async fn handle_delete_objects(
Ok(Response::builder()
.header("Content-Type", "application/xml")
- .body(Body::from(xml))?)
+ .body(string_body(xml))?)
}
struct DeleteRequest {
diff --git a/src/api/s3/error.rs b/src/api/s3/error.rs
index c50cff9f..f86c19a6 100644
--- a/src/api/s3/error.rs
+++ b/src/api/s3/error.rs
@@ -2,13 +2,12 @@ use std::convert::TryInto;
use err_derive::Error;
use hyper::header::HeaderValue;
-use hyper::{Body, HeaderMap, StatusCode};
-
-use garage_model::helper::error::Error as HelperError;
+use hyper::{HeaderMap, StatusCode};
use crate::common_error::CommonError;
pub use crate::common_error::{CommonErrorDerivative, OkOrBadRequest, OkOrInternalError};
use crate::generic_server::ApiError;
+use crate::helpers::*;
use crate::s3::xml as s3_xml;
use crate::signature::error::Error as SignatureError;
@@ -62,10 +61,6 @@ pub enum Error {
#[error(display = "Invalid XML: {}", _0)]
InvalidXml(String),
- /// The client sent a header with invalid value
- #[error(display = "Invalid header value: {}", _0)]
- InvalidHeader(#[error(source)] hyper::header::ToStrError),
-
/// The client sent a range header with invalid value
#[error(display = "Invalid HTTP range: {:?}", _0)]
InvalidRange(#[error(from)] (http_range::HttpRangeParseError, u64)),
@@ -86,18 +81,6 @@ where
impl CommonErrorDerivative for Error {}
-impl From<HelperError> for Error {
- fn from(err: HelperError) -> Self {
- match err {
- HelperError::Internal(i) => Self::Common(CommonError::InternalError(i)),
- HelperError::BadRequest(b) => Self::Common(CommonError::BadRequest(b)),
- HelperError::InvalidBucketName(n) => Self::Common(CommonError::InvalidBucketName(n)),
- HelperError::NoSuchBucket(n) => Self::Common(CommonError::NoSuchBucket(n)),
- e => Self::bad_request(format!("{}", e)),
- }
- }
-}
-
impl From<roxmltree::Error> for Error {
fn from(err: roxmltree::Error) -> Self {
Self::InvalidXml(format!("{}", err))
@@ -118,7 +101,6 @@ impl From<SignatureError> for Error {
Self::AuthorizationHeaderMalformed(c)
}
SignatureError::InvalidUtf8Str(i) => Self::InvalidUtf8Str(i),
- SignatureError::InvalidHeader(h) => Self::InvalidHeader(h),
}
}
}
@@ -143,9 +125,7 @@ impl Error {
Error::NotImplemented(_) => "NotImplemented",
Error::InvalidXml(_) => "MalformedXML",
Error::InvalidRange(_) => "InvalidRange",
- Error::InvalidUtf8Str(_) | Error::InvalidUtf8String(_) | Error::InvalidHeader(_) => {
- "InvalidRequest"
- }
+ Error::InvalidUtf8Str(_) | Error::InvalidUtf8String(_) => "InvalidRequest",
}
}
}
@@ -165,8 +145,7 @@ impl ApiError for Error {
| Error::EntityTooSmall
| Error::InvalidXml(_)
| Error::InvalidUtf8Str(_)
- | Error::InvalidUtf8String(_)
- | Error::InvalidHeader(_) => StatusCode::BAD_REQUEST,
+ | Error::InvalidUtf8String(_) => StatusCode::BAD_REQUEST,
}
}
@@ -189,22 +168,23 @@ impl ApiError for Error {
}
}
- fn http_body(&self, garage_region: &str, path: &str) -> Body {
+ fn http_body(&self, garage_region: &str, path: &str) -> ErrorBody {
let error = s3_xml::Error {
code: s3_xml::Value(self.aws_code().to_string()),
message: s3_xml::Value(format!("{}", self)),
resource: Some(s3_xml::Value(path.to_string())),
region: Some(s3_xml::Value(garage_region.to_string())),
};
- Body::from(s3_xml::to_xml_with_header(&error).unwrap_or_else(|_| {
+ let error_str = s3_xml::to_xml_with_header(&error).unwrap_or_else(|_| {
r#"
<?xml version="1.0" encoding="UTF-8"?>
<Error>
- <Code>InternalError</Code>
- <Message>XML encoding of error failed</Message>
+ <Code>InternalError</Code>
+ <Message>XML encoding of error failed</Message>
</Error>
- "#
+ "#
.into()
- }))
+ });
+ error_body(error_str)
}
}
diff --git a/src/api/s3/get.rs b/src/api/s3/get.rs
index 5e682726..53f0a345 100644
--- a/src/api/s3/get.rs
+++ b/src/api/s3/get.rs
@@ -1,17 +1,20 @@
//! Function related to GET and HEAD requests
+use std::convert::TryInto;
use std::sync::Arc;
use std::time::{Duration, UNIX_EPOCH};
use futures::future;
use futures::stream::{self, StreamExt};
use http::header::{
- ACCEPT_RANGES, CONTENT_LENGTH, CONTENT_RANGE, CONTENT_TYPE, ETAG, IF_MODIFIED_SINCE,
- IF_NONE_MATCH, LAST_MODIFIED, RANGE,
+ ACCEPT_RANGES, CACHE_CONTROL, CONTENT_DISPOSITION, CONTENT_ENCODING, CONTENT_LANGUAGE,
+ CONTENT_LENGTH, CONTENT_RANGE, CONTENT_TYPE, ETAG, EXPIRES, IF_MODIFIED_SINCE, IF_NONE_MATCH,
+ LAST_MODIFIED, RANGE,
};
-use hyper::{Body, Request, Response, StatusCode};
+use hyper::{body::Body, Request, Response, StatusCode};
use tokio::sync::mpsc;
-use garage_rpc::rpc_helper::{netapp::stream::ByteStream, OrderTag};
+use garage_block::manager::BlockStream;
+use garage_rpc::rpc_helper::OrderTag;
use garage_table::EmptyKey;
use garage_util::data::*;
use garage_util::error::OkOrMessage;
@@ -20,10 +23,22 @@ use garage_model::garage::Garage;
use garage_model::s3::object_table::*;
use garage_model::s3::version_table::*;
+use crate::helpers::*;
+use crate::s3::api_server::ResBody;
use crate::s3::error::*;
const X_AMZ_MP_PARTS_COUNT: &str = "x-amz-mp-parts-count";
+#[derive(Default)]
+pub struct GetObjectOverrides {
+ pub(crate) response_cache_control: Option<String>,
+ pub(crate) response_content_disposition: Option<String>,
+ pub(crate) response_content_encoding: Option<String>,
+ pub(crate) response_content_language: Option<String>,
+ pub(crate) response_content_type: Option<String>,
+ pub(crate) response_expires: Option<String>,
+}
+
fn object_headers(
version: &ObjectVersion,
version_meta: &ObjectVersionMeta,
@@ -49,11 +64,37 @@ fn object_headers(
resp
}
+/// Override headers according to specific query parameters, see
+/// section "Overriding response header values through the request" in
+/// https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html
+fn getobject_override_headers(
+ overrides: GetObjectOverrides,
+ resp: &mut http::response::Builder,
+) -> Result<(), Error> {
+ // TODO: this only applies for signed requests, so when we support
+ // anonymous access in the future we will have to do a permission check here
+ let overrides = [
+ (CACHE_CONTROL, overrides.response_cache_control),
+ (CONTENT_DISPOSITION, overrides.response_content_disposition),
+ (CONTENT_ENCODING, overrides.response_content_encoding),
+ (CONTENT_LANGUAGE, overrides.response_content_language),
+ (CONTENT_TYPE, overrides.response_content_type),
+ (EXPIRES, overrides.response_expires),
+ ];
+ for (hdr, val_opt) in overrides {
+ if let Some(val) = val_opt {
+ let val = val.try_into().ok_or_bad_request("invalid header value")?;
+ resp.headers_mut().unwrap().insert(hdr, val);
+ }
+ }
+ Ok(())
+}
+
fn try_answer_cached(
version: &ObjectVersion,
version_meta: &ObjectVersionMeta,
- req: &Request<Body>,
-) -> Option<Response<Body>> {
+ req: &Request<impl Body>,
+) -> Option<Response<ResBody>> {
// <trinity> It is possible, and is even usually the case, [that both If-None-Match and
// If-Modified-Since] are present in a request. In this situation If-None-Match takes
// precedence and If-Modified-Since is ignored (as per 6.Precedence from rfc7232). The rational
@@ -80,7 +121,7 @@ fn try_answer_cached(
Some(
Response::builder()
.status(StatusCode::NOT_MODIFIED)
- .body(Body::empty())
+ .body(empty_body())
.unwrap(),
)
} else {
@@ -91,11 +132,11 @@ fn try_answer_cached(
/// Handle HEAD request
pub async fn handle_head(
garage: Arc<Garage>,
- req: &Request<Body>,
+ req: &Request<impl Body>,
bucket_id: Uuid,
key: &str,
part_number: Option<u64>,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let object = garage
.object_table
.get(&bucket_id, &key.to_string())
@@ -138,7 +179,7 @@ pub async fn handle_head(
)
.header(X_AMZ_MP_PARTS_COUNT, "1")
.status(StatusCode::PARTIAL_CONTENT)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
ObjectVersionData::FirstBlock(_, _) => {
let version = garage
@@ -163,7 +204,7 @@ pub async fn handle_head(
)
.header(X_AMZ_MP_PARTS_COUNT, format!("{}", version.n_parts()?))
.status(StatusCode::PARTIAL_CONTENT)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
_ => unreachable!(),
}
@@ -171,18 +212,19 @@ pub async fn handle_head(
Ok(object_headers(object_version, version_meta)
.header(CONTENT_LENGTH, format!("{}", version_meta.size))
.status(StatusCode::OK)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
}
/// Handle GET request
pub async fn handle_get(
garage: Arc<Garage>,
- req: &Request<Body>,
+ req: &Request<impl Body>,
bucket_id: Uuid,
key: &str,
part_number: Option<u64>,
-) -> Result<Response<Body>, Error> {
+ overrides: GetObjectOverrides,
+) -> Result<Response<ResBody>, Error> {
let object = garage
.object_table
.get(&bucket_id, &key.to_string())
@@ -233,18 +275,18 @@ pub async fn handle_get(
(None, None) => (),
}
- let resp_builder = object_headers(last_v, last_v_meta)
+ let mut resp_builder = object_headers(last_v, last_v_meta)
.header(CONTENT_LENGTH, format!("{}", last_v_meta.size))
.status(StatusCode::OK);
+ getobject_override_headers(overrides, &mut resp_builder)?;
match &last_v_data {
ObjectVersionData::DeleteMarker => unreachable!(),
ObjectVersionData::Inline(_, bytes) => {
- let body: Body = Body::from(bytes.to_vec());
- Ok(resp_builder.body(body)?)
+ Ok(resp_builder.body(bytes_body(bytes.to_vec().into()))?)
}
ObjectVersionData::FirstBlock(_, first_block_hash) => {
- let (tx, rx) = mpsc::channel(2);
+ let (tx, rx) = mpsc::channel::<BlockStream>(2);
let order_stream = OrderTag::stream();
let first_block_hash = *first_block_hash;
@@ -282,20 +324,12 @@ pub async fn handle_get(
{
Ok(()) => (),
Err(e) => {
- let err = std::io::Error::new(
- std::io::ErrorKind::Other,
- format!("Error while getting object data: {}", e),
- );
- let _ = tx
- .send(Box::pin(stream::once(future::ready(Err(err)))))
- .await;
+ let _ = tx.send(error_stream_item(e)).await;
}
}
});
- let body_stream = tokio_stream::wrappers::ReceiverStream::new(rx).flatten();
-
- let body = hyper::body::Body::wrap_stream(body_stream);
+ let body = response_body_from_block_stream(rx);
Ok(resp_builder.body(body)?)
}
}
@@ -308,7 +342,10 @@ async fn handle_get_range(
version_meta: &ObjectVersionMeta,
begin: u64,
end: u64,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
+ // Here we do not use getobject_override_headers because we don't
+ // want to add any overridden headers (those should not be added
+ // when returning PARTIAL_CONTENT)
let resp_builder = object_headers(version, version_meta)
.header(CONTENT_LENGTH, format!("{}", end - begin))
.header(
@@ -321,7 +358,7 @@ async fn handle_get_range(
ObjectVersionData::DeleteMarker => unreachable!(),
ObjectVersionData::Inline(_meta, bytes) => {
if end as usize <= bytes.len() {
- let body: Body = Body::from(bytes[begin as usize..end as usize].to_vec());
+ let body = bytes_body(bytes[begin as usize..end as usize].to_vec().into());
Ok(resp_builder.body(body)?)
} else {
Err(Error::internal_error(
@@ -348,7 +385,8 @@ async fn handle_get_part(
version_data: &ObjectVersionData,
version_meta: &ObjectVersionMeta,
part_number: u64,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
+ // Same as for get_range, no getobject_override_headers
let resp_builder =
object_headers(object_version, version_meta).status(StatusCode::PARTIAL_CONTENT);
@@ -364,7 +402,7 @@ async fn handle_get_part(
format!("bytes {}-{}/{}", 0, bytes.len() - 1, bytes.len()),
)
.header(X_AMZ_MP_PARTS_COUNT, "1")
- .body(Body::from(bytes.to_vec()))?)
+ .body(bytes_body(bytes.to_vec().into()))?)
}
ObjectVersionData::FirstBlock(_, _) => {
let version = garage
@@ -392,7 +430,7 @@ async fn handle_get_part(
}
fn parse_range_header(
- req: &Request<Body>,
+ req: &Request<impl Body>,
total_size: u64,
) -> Result<Option<http_range::HttpRange>, Error> {
let range = match req.headers().get(RANGE) {
@@ -434,7 +472,7 @@ fn body_from_blocks_range(
all_blocks: &[(VersionBlockKey, VersionBlock)],
begin: u64,
end: u64,
-) -> Body {
+) -> ResBody {
// We will store here the list of blocks that have an intersection with the requested
// range, as well as their "true offset", which is their actual offset in the complete
// file (whereas block.offset designates the offset of the block WITHIN THE PART
@@ -456,17 +494,17 @@ fn body_from_blocks_range(
}
let order_stream = OrderTag::stream();
- let body_stream = futures::stream::iter(blocks)
- .enumerate()
- .map(move |(i, (block, block_offset))| {
+ let (tx, rx) = mpsc::channel::<BlockStream>(2);
+
+ tokio::spawn(async move {
+ match async {
let garage = garage.clone();
- async move {
- garage
+ for (i, (block, block_offset)) in blocks.iter().enumerate() {
+ let block_stream = garage
.block_manager
.rpc_get_block_streaming(&block.hash, Some(order_stream.order(i as u64)))
- .await
- .unwrap_or_else(|e| error_stream(i, e))
- .scan(block_offset, move |chunk_offset, chunk| {
+ .await?
+ .scan(*block_offset, move |chunk_offset, chunk| {
let r = match chunk {
Ok(chunk_bytes) => {
let chunk_len = chunk_bytes.len() as u64;
@@ -502,20 +540,42 @@ fn body_from_blocks_range(
};
futures::future::ready(r)
})
- .filter_map(futures::future::ready)
+ .filter_map(futures::future::ready);
+
+ let block_stream: BlockStream = Box::pin(block_stream);
+ tx.send(Box::pin(block_stream))
+ .await
+ .ok_or_message("channel closed")?;
}
- })
- .buffered(2)
- .flatten();
- hyper::body::Body::wrap_stream(body_stream)
+ Ok::<(), Error>(())
+ }
+ .await
+ {
+ Ok(()) => (),
+ Err(e) => {
+ let _ = tx.send(error_stream_item(e)).await;
+ }
+ }
+ });
+
+ response_body_from_block_stream(rx)
+}
+
+fn response_body_from_block_stream(rx: mpsc::Receiver<BlockStream>) -> ResBody {
+ let body_stream = tokio_stream::wrappers::ReceiverStream::new(rx)
+ .flatten()
+ .map(|x| {
+ x.map(hyper::body::Frame::data)
+ .map_err(|e| Error::from(garage_util::error::Error::from(e)))
+ });
+ ResBody::new(http_body_util::StreamBody::new(body_stream))
}
-fn error_stream(i: usize, e: garage_util::error::Error) -> ByteStream {
- Box::pin(futures::stream::once(async move {
- Err(std::io::Error::new(
- std::io::ErrorKind::Other,
- format!("Could not get block {}: {}", i, e),
- ))
- }))
+fn error_stream_item<E: std::fmt::Display>(e: E) -> BlockStream {
+ let err = std::io::Error::new(
+ std::io::ErrorKind::Other,
+ format!("Error while getting object data: {}", e),
+ );
+ Box::pin(stream::once(future::ready(Err(err))))
}
diff --git a/src/api/s3/lifecycle.rs b/src/api/s3/lifecycle.rs
index 1e7d6755..35757e8c 100644
--- a/src/api/s3/lifecycle.rs
+++ b/src/api/s3/lifecycle.rs
@@ -1,10 +1,13 @@
use quick_xml::de::from_reader;
use std::sync::Arc;
-use hyper::{Body, Request, Response, StatusCode};
+use http_body_util::BodyExt;
+use hyper::{Request, Response, StatusCode};
use serde::{Deserialize, Serialize};
+use crate::helpers::*;
+use crate::s3::api_server::{ReqBody, ResBody};
use crate::s3::error::*;
use crate::s3::xml::{to_xml_with_header, xmlns_tag, IntValue, Value};
use crate::signature::verify_signed_content;
@@ -16,7 +19,7 @@ use garage_model::bucket_table::{
use garage_model::garage::Garage;
use garage_util::data::*;
-pub async fn handle_get_lifecycle(bucket: &Bucket) -> Result<Response<Body>, Error> {
+pub async fn handle_get_lifecycle(bucket: &Bucket) -> Result<Response<ResBody>, Error> {
let param = bucket
.params()
.ok_or_internal_error("Bucket should not be deleted at this point")?;
@@ -27,18 +30,18 @@ pub async fn handle_get_lifecycle(bucket: &Bucket) -> Result<Response<Body>, Err
Ok(Response::builder()
.status(StatusCode::OK)
.header(http::header::CONTENT_TYPE, "application/xml")
- .body(Body::from(xml))?)
+ .body(string_body(xml))?)
} else {
Ok(Response::builder()
.status(StatusCode::NO_CONTENT)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
}
pub async fn handle_delete_lifecycle(
garage: Arc<Garage>,
mut bucket: Bucket,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let param = bucket
.params_mut()
.ok_or_internal_error("Bucket should not be deleted at this point")?;
@@ -48,16 +51,16 @@ pub async fn handle_delete_lifecycle(
Ok(Response::builder()
.status(StatusCode::NO_CONTENT)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
pub async fn handle_put_lifecycle(
garage: Arc<Garage>,
mut bucket: Bucket,
- req: Request<Body>,
+ req: Request<ReqBody>,
content_sha256: Option<Hash>,
-) -> Result<Response<Body>, Error> {
- let body = hyper::body::to_bytes(req.into_body()).await?;
+) -> Result<Response<ResBody>, Error> {
+ let body = BodyExt::collect(req.into_body()).await?.to_bytes();
if let Some(content_sha256) = content_sha256 {
verify_signed_content(content_sha256, &body[..])?;
@@ -77,7 +80,7 @@ pub async fn handle_put_lifecycle(
Ok(Response::builder()
.status(StatusCode::OK)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
// ---- SERIALIZATION AND DESERIALIZATION TO/FROM S3 XML ----
diff --git a/src/api/s3/list.rs b/src/api/s3/list.rs
index 1b9e8cd5..b832a4f4 100644
--- a/src/api/s3/list.rs
+++ b/src/api/s3/list.rs
@@ -3,7 +3,7 @@ use std::iter::{Iterator, Peekable};
use std::sync::Arc;
use base64::prelude::*;
-use hyper::{Body, Response};
+use hyper::Response;
use garage_util::data::*;
use garage_util::error::Error as GarageError;
@@ -16,7 +16,8 @@ use garage_model::s3::object_table::*;
use garage_table::EnumerationOrder;
use crate::encoding::*;
-use crate::helpers::key_after_prefix;
+use crate::helpers::*;
+use crate::s3::api_server::ResBody;
use crate::s3::error::*;
use crate::s3::multipart as s3_multipart;
use crate::s3::xml as s3_xml;
@@ -63,7 +64,7 @@ pub struct ListPartsQuery {
pub async fn handle_list(
garage: Arc<Garage>,
query: &ListObjectsQuery,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let io = |bucket, key, count| {
let t = &garage.object_table;
async move {
@@ -162,13 +163,13 @@ pub async fn handle_list(
let xml = s3_xml::to_xml_with_header(&result)?;
Ok(Response::builder()
.header("Content-Type", "application/xml")
- .body(Body::from(xml.into_bytes()))?)
+ .body(string_body(xml))?)
}
pub async fn handle_list_multipart_upload(
garage: Arc<Garage>,
query: &ListMultipartUploadsQuery,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let io = |bucket, key, count| {
let t = &garage.object_table;
async move {
@@ -264,13 +265,13 @@ pub async fn handle_list_multipart_upload(
Ok(Response::builder()
.header("Content-Type", "application/xml")
- .body(Body::from(xml.into_bytes()))?)
+ .body(string_body(xml))?)
}
pub async fn handle_list_parts(
garage: Arc<Garage>,
query: &ListPartsQuery,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
debug!("ListParts {:?}", query);
let upload_id = s3_multipart::decode_upload_id(&query.upload_id)?;
@@ -319,7 +320,7 @@ pub async fn handle_list_parts(
Ok(Response::builder()
.header("Content-Type", "application/xml")
- .body(Body::from(xml.into_bytes()))?)
+ .body(string_body(xml))?)
}
/*
diff --git a/src/api/s3/multipart.rs b/src/api/s3/multipart.rs
index 6b786318..b9d15b21 100644
--- a/src/api/s3/multipart.rs
+++ b/src/api/s3/multipart.rs
@@ -2,7 +2,6 @@ use std::collections::HashMap;
use std::sync::Arc;
use futures::prelude::*;
-use hyper::body::Body;
use hyper::{Request, Response};
use md5::{Digest as Md5Digest, Md5};
@@ -17,6 +16,8 @@ use garage_model::s3::mpu_table::*;
use garage_model::s3::object_table::*;
use garage_model::s3::version_table::*;
+use crate::helpers::*;
+use crate::s3::api_server::{ReqBody, ResBody};
use crate::s3::error::*;
use crate::s3::put::*;
use crate::s3::xml as s3_xml;
@@ -26,11 +27,11 @@ use crate::signature::verify_signed_content;
pub async fn handle_create_multipart_upload(
garage: Arc<Garage>,
- req: &Request<Body>,
+ req: &Request<ReqBody>,
bucket_name: &str,
bucket_id: Uuid,
key: &String,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let existing_object = garage.object_table.get(&bucket_id, &key).await?;
let upload_id = gen_uuid();
@@ -65,18 +66,18 @@ pub async fn handle_create_multipart_upload(
};
let xml = s3_xml::to_xml_with_header(&result)?;
- Ok(Response::new(Body::from(xml.into_bytes())))
+ Ok(Response::new(string_body(xml)))
}
pub async fn handle_put_part(
garage: Arc<Garage>,
- req: Request<Body>,
+ req: Request<ReqBody>,
bucket_id: Uuid,
key: &str,
part_number: u64,
upload_id: &str,
content_sha256: Option<Hash>,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let upload_id = decode_upload_id(upload_id)?;
let content_md5 = match req.headers().get("content-md5") {
@@ -87,8 +88,8 @@ pub async fn handle_put_part(
// Read first chuck, and at the same time try to get object to see if it exists
let key = key.to_string();
- let body = req.into_body().map_err(Error::from);
- let mut chunker = StreamChunker::new(body, garage.config.block_size);
+ let stream = body_stream(req.into_body());
+ let mut chunker = StreamChunker::new(stream, garage.config.block_size);
let ((_, _, mut mpu), first_block) = futures::try_join!(
get_upload(&garage, &bucket_id, &key, &upload_id),
@@ -172,7 +173,7 @@ pub async fn handle_put_part(
let response = Response::builder()
.header("ETag", format!("\"{}\"", data_md5sum_hex))
- .body(Body::empty())
+ .body(empty_body())
.unwrap();
Ok(response)
}
@@ -210,14 +211,16 @@ impl Drop for InterruptedCleanup {
pub async fn handle_complete_multipart_upload(
garage: Arc<Garage>,
- req: Request<Body>,
+ req: Request<ReqBody>,
bucket_name: &str,
bucket: &Bucket,
key: &str,
upload_id: &str,
content_sha256: Option<Hash>,
-) -> Result<Response<Body>, Error> {
- let body = hyper::body::to_bytes(req.into_body()).await?;
+) -> Result<Response<ResBody>, Error> {
+ let body = http_body_util::BodyExt::collect(req.into_body())
+ .await?
+ .to_bytes();
if let Some(content_sha256) = content_sha256 {
verify_signed_content(content_sha256, &body[..])?;
@@ -365,7 +368,7 @@ pub async fn handle_complete_multipart_upload(
};
let xml = s3_xml::to_xml_with_header(&result)?;
- Ok(Response::new(Body::from(xml.into_bytes())))
+ Ok(Response::new(string_body(xml)))
}
pub async fn handle_abort_multipart_upload(
@@ -373,7 +376,7 @@ pub async fn handle_abort_multipart_upload(
bucket_id: Uuid,
key: &str,
upload_id: &str,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let upload_id = decode_upload_id(upload_id)?;
let (_, mut object_version, _) =
@@ -383,7 +386,7 @@ pub async fn handle_abort_multipart_upload(
let final_object = Object::new(bucket_id, key.to_string(), vec![object_version]);
garage.object_table.insert(&final_object).await?;
- Ok(Response::new(Body::from(vec![])))
+ Ok(Response::new(empty_body()))
}
// ======== helpers ============
diff --git a/src/api/s3/post_object.rs b/src/api/s3/post_object.rs
index 542b7a81..bca8d6c6 100644
--- a/src/api/s3/post_object.rs
+++ b/src/api/s3/post_object.rs
@@ -1,5 +1,5 @@
use std::collections::HashMap;
-use std::convert::TryInto;
+use std::convert::{Infallible, TryInto};
use std::ops::RangeInclusive;
use std::sync::Arc;
use std::task::{Context, Poll};
@@ -9,12 +9,15 @@ use bytes::Bytes;
use chrono::{DateTime, Duration, Utc};
use futures::{Stream, StreamExt};
use hyper::header::{self, HeaderMap, HeaderName, HeaderValue};
-use hyper::{Body, Request, Response, StatusCode};
+use hyper::{body::Incoming as IncomingBody, Request, Response, StatusCode};
use multer::{Constraints, Multipart, SizeLimit};
use serde::Deserialize;
use garage_model::garage::Garage;
+use crate::helpers::*;
+use crate::s3::api_server::ResBody;
+use crate::s3::cors::*;
use crate::s3::error::*;
use crate::s3::put::{get_headers, save_stream};
use crate::s3::xml as s3_xml;
@@ -22,9 +25,9 @@ use crate::signature::payload::{parse_date, verify_v4};
pub async fn handle_post_object(
garage: Arc<Garage>,
- req: Request<Body>,
+ req: Request<IncomingBody>,
bucket_name: String,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let boundary = req
.headers()
.get(header::CONTENT_TYPE)
@@ -41,7 +44,8 @@ pub async fn handle_post_object(
);
let (head, body) = req.into_parts();
- let mut multipart = Multipart::with_constraints(body, boundary, constraints);
+ let stream = body_stream::<_, Error>(body);
+ let mut multipart = Multipart::with_constraints(stream, boundary, constraints);
let mut params = HeaderMap::new();
let field = loop {
@@ -242,7 +246,7 @@ pub async fn handle_post_object(
let etag = format!("\"{}\"", md5);
- let resp = if let Some(mut target) = params
+ let mut resp = if let Some(mut target) = params
.get("success_action_redirect")
.and_then(|h| h.to_str().ok())
.and_then(|u| url::Url::parse(u).ok())
@@ -258,12 +262,11 @@ pub async fn handle_post_object(
.status(StatusCode::SEE_OTHER)
.header(header::LOCATION, target.clone())
.header(header::ETAG, etag)
- .body(target.into())?
+ .body(string_body(target))?
} else {
let path = head
.uri
- .into_parts()
- .path_and_query
+ .path_and_query()
.map(|paq| paq.path().to_string())
.unwrap_or_else(|| "/".to_string());
let authority = head
@@ -290,7 +293,7 @@ pub async fn handle_post_object(
.header(header::LOCATION, location.clone())
.header(header::ETAG, etag.clone());
match action {
- "200" => builder.status(StatusCode::OK).body(Body::empty())?,
+ "200" => builder.status(StatusCode::OK).body(empty_body())?,
"201" => {
let xml = s3_xml::PostObject {
xmlns: (),
@@ -302,12 +305,21 @@ pub async fn handle_post_object(
let body = s3_xml::to_xml_with_header(&xml)?;
builder
.status(StatusCode::CREATED)
- .body(Body::from(body.into_bytes()))?
+ .body(string_body(body))?
}
- _ => builder.status(StatusCode::NO_CONTENT).body(Body::empty())?,
+ _ => builder.status(StatusCode::NO_CONTENT).body(empty_body())?,
}
};
+ let matching_cors_rule = find_matching_cors_rule(
+ &bucket,
+ &Request::from_parts(head, empty_body::<Infallible>()),
+ )?;
+ if let Some(rule) = matching_cors_rule {
+ add_cors_headers(&mut resp, rule)
+ .ok_or_internal_error("Invalid bucket CORS configuration")?;
+ }
+
Ok(resp)
}
diff --git a/src/api/s3/put.rs b/src/api/s3/put.rs
index d1c88a76..8902b14c 100644
--- a/src/api/s3/put.rs
+++ b/src/api/s3/put.rs
@@ -4,12 +4,13 @@ use std::sync::Arc;
use base64::prelude::*;
use futures::prelude::*;
use futures::try_join;
-use hyper::body::{Body, Bytes};
-use hyper::header::{HeaderMap, HeaderValue};
-use hyper::{Request, Response};
use md5::{digest::generic_array::*, Digest as Md5Digest, Md5};
use sha2::Sha256;
+use hyper::body::Bytes;
+use hyper::header::{HeaderMap, HeaderValue};
+use hyper::{Request, Response};
+
use opentelemetry::{
trace::{FutureExt as OtelFutureExt, TraceContextExt, Tracer},
Context,
@@ -30,15 +31,17 @@ use garage_model::s3::block_ref_table::*;
use garage_model::s3::object_table::*;
use garage_model::s3::version_table::*;
+use crate::helpers::*;
+use crate::s3::api_server::{ReqBody, ResBody};
use crate::s3::error::*;
pub async fn handle_put(
garage: Arc<Garage>,
- req: Request<Body>,
+ req: Request<ReqBody>,
bucket: &Bucket,
key: &String,
content_sha256: Option<Hash>,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
// Retrieve interesting headers from request
let headers = get_headers(req.headers())?;
debug!("Object headers: {:?}", headers);
@@ -48,13 +51,12 @@ pub async fn handle_put(
None => None,
};
- let (_head, body) = req.into_parts();
- let body = body.map_err(Error::from);
+ let stream = body_stream(req.into_body());
save_stream(
garage,
headers,
- body,
+ stream,
bucket,
key,
content_md5,
@@ -434,11 +436,11 @@ impl<S: Stream<Item = Result<Bytes, Error>> + Unpin> StreamChunker<S> {
}
}
-pub fn put_response(version_uuid: Uuid, md5sum_hex: String) -> Response<Body> {
+pub fn put_response(version_uuid: Uuid, md5sum_hex: String) -> Response<ResBody> {
Response::builder()
.header("x-amz-version-id", hex::encode(version_uuid))
.header("ETag", format!("\"{}\"", md5sum_hex))
- .body(Body::from(vec![]))
+ .body(empty_body())
.unwrap()
}
diff --git a/src/api/s3/router.rs b/src/api/s3/router.rs
index 821b0e07..e7ac1d77 100644
--- a/src/api/s3/router.rs
+++ b/src/api/s3/router.rs
@@ -125,6 +125,12 @@ pub enum Endpoint {
key: String,
part_number: Option<u64>,
version_id: Option<String>,
+ response_cache_control: Option<String>,
+ response_content_disposition: Option<String>,
+ response_content_encoding: Option<String>,
+ response_content_language: Option<String>,
+ response_content_type: Option<String>,
+ response_expires: Option<String>,
},
GetObjectAcl {
key: String,
@@ -170,7 +176,7 @@ pub enum Endpoint {
},
ListBuckets,
ListMultipartUploads {
- delimiter: Option<char>,
+ delimiter: Option<String>,
encoding_type: Option<String>,
key_marker: Option<String>,
max_uploads: Option<usize>,
@@ -178,7 +184,7 @@ pub enum Endpoint {
upload_id_marker: Option<String>,
},
ListObjects {
- delimiter: Option<char>,
+ delimiter: Option<String>,
encoding_type: Option<String>,
marker: Option<String>,
max_keys: Option<usize>,
@@ -188,7 +194,7 @@ pub enum Endpoint {
// This value should always be 2. It is not checked when constructing the struct
list_type: String,
continuation_token: Option<String>,
- delimiter: Option<char>,
+ delimiter: Option<String>,
encoding_type: Option<String>,
fetch_owner: Option<bool>,
max_keys: Option<usize>,
@@ -196,7 +202,7 @@ pub enum Endpoint {
start_after: Option<String>,
},
ListObjectVersions {
- delimiter: Option<char>,
+ delimiter: Option<String>,
encoding_type: Option<String>,
key_marker: Option<String>,
max_keys: Option<u64>,
@@ -358,7 +364,14 @@ impl Endpoint {
(query.keyword.take().unwrap_or_default(), key, query, None),
key: [
EMPTY if upload_id => ListParts (query::upload_id, opt_parse::max_parts, opt_parse::part_number_marker),
- EMPTY => GetObject (query_opt::version_id, opt_parse::part_number),
+ EMPTY => GetObject (query_opt::version_id,
+ opt_parse::part_number,
+ query_opt::response_cache_control,
+ query_opt::response_content_disposition,
+ query_opt::response_content_encoding,
+ query_opt::response_content_language,
+ query_opt::response_content_type,
+ query_opt::response_expires),
ACL => GetObjectAcl (query_opt::version_id),
LEGAL_HOLD => GetObjectLegalHold (query_opt::version_id),
RETENTION => GetObjectRetention (query_opt::version_id),
@@ -671,6 +684,12 @@ generateQueryParameters! {
"partNumber" => part_number,
"part-number-marker" => part_number_marker,
"prefix" => prefix,
+ "response-cache-control" => response_cache_control,
+ "response-content-disposition" => response_content_disposition,
+ "response-content-encoding" => response_content_encoding,
+ "response-content-language" => response_content_language,
+ "response-content-type" => response_content_type,
+ "response-expires" => response_expires,
"select-type" => select_type,
"start-after" => start_after,
"uploadId" => upload_id,
diff --git a/src/api/s3/website.rs b/src/api/s3/website.rs
index 7f2ab925..1c1dbf20 100644
--- a/src/api/s3/website.rs
+++ b/src/api/s3/website.rs
@@ -1,9 +1,12 @@
use quick_xml::de::from_reader;
use std::sync::Arc;
-use hyper::{Body, Request, Response, StatusCode};
+use http_body_util::BodyExt;
+use hyper::{Request, Response, StatusCode};
use serde::{Deserialize, Serialize};
+use crate::helpers::*;
+use crate::s3::api_server::{ReqBody, ResBody};
use crate::s3::error::*;
use crate::s3::xml::{to_xml_with_header, xmlns_tag, IntValue, Value};
use crate::signature::verify_signed_content;
@@ -12,7 +15,7 @@ use garage_model::bucket_table::*;
use garage_model::garage::Garage;
use garage_util::data::*;
-pub async fn handle_get_website(bucket: &Bucket) -> Result<Response<Body>, Error> {
+pub async fn handle_get_website(bucket: &Bucket) -> Result<Response<ResBody>, Error> {
let param = bucket
.params()
.ok_or_internal_error("Bucket should not be deleted at this point")?;
@@ -33,18 +36,18 @@ pub async fn handle_get_website(bucket: &Bucket) -> Result<Response<Body>, Error
Ok(Response::builder()
.status(StatusCode::OK)
.header(http::header::CONTENT_TYPE, "application/xml")
- .body(Body::from(xml))?)
+ .body(string_body(xml))?)
} else {
Ok(Response::builder()
.status(StatusCode::NO_CONTENT)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
}
pub async fn handle_delete_website(
garage: Arc<Garage>,
mut bucket: Bucket,
-) -> Result<Response<Body>, Error> {
+) -> Result<Response<ResBody>, Error> {
let param = bucket
.params_mut()
.ok_or_internal_error("Bucket should not be deleted at this point")?;
@@ -54,16 +57,16 @@ pub async fn handle_delete_website(
Ok(Response::builder()
.status(StatusCode::NO_CONTENT)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
pub async fn handle_put_website(
garage: Arc<Garage>,
mut bucket: Bucket,
- req: Request<Body>,
+ req: Request<ReqBody>,
content_sha256: Option<Hash>,
-) -> Result<Response<Body>, Error> {
- let body = hyper::body::to_bytes(req.into_body()).await?;
+) -> Result<Response<ResBody>, Error> {
+ let body = BodyExt::collect(req.into_body()).await?.to_bytes();
if let Some(content_sha256) = content_sha256 {
verify_signed_content(content_sha256, &body[..])?;
@@ -83,7 +86,7 @@ pub async fn handle_put_website(
Ok(Response::builder()
.status(StatusCode::OK)
- .body(Body::empty())?)
+ .body(empty_body())?)
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
diff --git a/src/api/signature/error.rs b/src/api/signature/error.rs
index f0d7c816..2d92a072 100644
--- a/src/api/signature/error.rs
+++ b/src/api/signature/error.rs
@@ -18,10 +18,6 @@ pub enum Error {
/// The request contained an invalid UTF-8 sequence in its path or in other parameters
#[error(display = "Invalid UTF-8: {}", _0)]
InvalidUtf8Str(#[error(source)] std::str::Utf8Error),
-
- /// The client sent a header with invalid value
- #[error(display = "Invalid header value: {}", _0)]
- InvalidHeader(#[error(source)] hyper::header::ToStrError),
}
impl<T> From<T> for Error
diff --git a/src/api/signature/payload.rs b/src/api/signature/payload.rs
index b50fb3bb..423aad93 100644
--- a/src/api/signature/payload.rs
+++ b/src/api/signature/payload.rs
@@ -1,8 +1,8 @@
use std::collections::HashMap;
-use chrono::{DateTime, Duration, NaiveDateTime, Utc};
+use chrono::{DateTime, Duration, NaiveDateTime, TimeZone, Utc};
use hmac::Mac;
-use hyper::{Body, Method, Request};
+use hyper::{body::Incoming as IncomingBody, Method, Request};
use sha2::{Digest, Sha256};
use garage_table::*;
@@ -20,7 +20,7 @@ use crate::signature::error::*;
pub async fn check_payload_signature(
garage: &Garage,
service: &'static str,
- request: &Request<Body>,
+ request: &Request<IncomingBody>,
) -> Result<(Option<Key>, Option<Hash>), Error> {
let mut headers = HashMap::new();
for (key, val) in request.headers() {
@@ -316,7 +316,7 @@ fn canonical_query_string(uri: &hyper::Uri) -> String {
pub fn parse_date(date: &str) -> Result<DateTime<Utc>, Error> {
let date: NaiveDateTime =
NaiveDateTime::parse_from_str(date, LONG_DATETIME).ok_or_bad_request("Invalid date")?;
- Ok(DateTime::from_utc(date, Utc))
+ Ok(Utc.from_utc_datetime(&date))
}
pub async fn verify_v4(
diff --git a/src/api/signature/streaming.rs b/src/api/signature/streaming.rs
index c8358c4f..39147ca0 100644
--- a/src/api/signature/streaming.rs
+++ b/src/api/signature/streaming.rs
@@ -1,26 +1,30 @@
use std::pin::Pin;
-use chrono::{DateTime, NaiveDateTime, Utc};
+use chrono::{DateTime, NaiveDateTime, TimeZone, Utc};
use futures::prelude::*;
use futures::task;
use garage_model::key_table::Key;
use hmac::Mac;
-use hyper::body::Bytes;
-use hyper::{Body, Request};
+use http_body_util::StreamBody;
+use hyper::body::{Bytes, Incoming as IncomingBody};
+use hyper::Request;
use garage_util::data::Hash;
use super::{compute_scope, sha256sum, HmacSha256, LONG_DATETIME};
+use crate::helpers::*;
use crate::signature::error::*;
+pub type ReqBody = BoxBody<Error>;
+
pub fn parse_streaming_body(
api_key: &Key,
- req: Request<Body>,
+ req: Request<IncomingBody>,
content_sha256: &mut Option<Hash>,
region: &str,
service: &str,
-) -> Result<Request<Body>, Error> {
+) -> Result<Request<ReqBody>, Error> {
match req.headers().get("x-amz-content-sha256") {
Some(header) if header == "STREAMING-AWS4-HMAC-SHA256-PAYLOAD" => {
let signature = content_sha256
@@ -40,26 +44,22 @@ pub fn parse_streaming_body(
.to_str()?;
let date: NaiveDateTime = NaiveDateTime::parse_from_str(date, LONG_DATETIME)
.ok_or_bad_request("Invalid date")?;
- let date: DateTime<Utc> = DateTime::from_utc(date, Utc);
+ let date: DateTime<Utc> = Utc.from_utc_datetime(&date);
let scope = compute_scope(&date, region, service);
let signing_hmac = crate::signature::signing_hmac(&date, secret_key, region, service)
.ok_or_internal_error("Unable to build signing HMAC")?;
Ok(req.map(move |body| {
- Body::wrap_stream(
- SignedPayloadStream::new(
- body.map_err(Error::from),
- signing_hmac,
- date,
- &scope,
- signature,
- )
- .map_err(Error::from),
- )
+ let stream = body_stream::<_, Error>(body);
+ let signed_payload_stream =
+ SignedPayloadStream::new(stream, signing_hmac, date, &scope, signature)
+ .map(|x| x.map(hyper::body::Frame::data))
+ .map_err(Error::from);
+ ReqBody::new(StreamBody::new(signed_payload_stream))
}))
}
- _ => Ok(req),
+ _ => Ok(req.map(|body| ReqBody::new(http_body_util::BodyExt::map_err(body, Error::from)))),
}
}
diff --git a/src/block/Cargo.toml b/src/block/Cargo.toml
index e4265cbe..7cf82ce6 100644
--- a/src/block/Cargo.toml
+++ b/src/block/Cargo.toml
@@ -19,26 +19,26 @@ garage_rpc.workspace = true
garage_util.workspace = true
garage_table.workspace = true
-opentelemetry = "0.17"
-
-arc-swap = "1.5"
-async-trait = "0.1.7"
-bytes = "1.0"
-bytesize = "1.2"
-hex = "0.4"
-tracing = "0.1"
-rand = "0.8"
-
-async-compression = { version = "0.4", features = ["tokio", "zstd"] }
-zstd = { version = "0.12", default-features = false }
-
-serde = { version = "1.0", default-features = false, features = ["derive", "rc"] }
-serde_bytes = "0.11"
-
-futures = "0.3"
-futures-util = "0.3"
-tokio = { version = "1.0", default-features = false, features = ["rt", "rt-multi-thread", "io-util", "net", "time", "macros", "sync", "signal", "fs"] }
-tokio-util = { version = "0.7", features = ["io"] }
+opentelemetry.workspace = true
+
+arc-swap.workspace = true
+async-trait.workspace = true
+bytes.workspace = true
+bytesize.workspace = true
+hex.workspace = true
+tracing.workspace = true
+rand.workspace = true
+
+async-compression.workspace = true
+zstd.workspace = true
+
+serde.workspace = true
+serde_bytes.workspace = true
+
+futures.workspace = true
+futures-util.workspace = true
+tokio.workspace = true
+tokio-util.workspace = true
[features]
system-libs = [ "zstd/pkg-config" ]
diff --git a/src/block/manager.rs b/src/block/manager.rs
index bfd390ee..aae1ce45 100644
--- a/src/block/manager.rs
+++ b/src/block/manager.rs
@@ -53,6 +53,9 @@ pub const INLINE_THRESHOLD: usize = 3072;
// to delete the block locally.
pub(crate) const BLOCK_GC_DELAY: Duration = Duration::from_secs(600);
+pub type BlockStream =
+ Pin<Box<dyn Stream<Item = Result<Bytes, std::io::Error>> + Send + Sync + 'static>>;
+
/// RPC messages used to share blocks of data between nodes
#[derive(Debug, Serialize, Deserialize)]
pub enum BlockRpc {
@@ -326,10 +329,7 @@ impl BlockManager {
&self,
hash: &Hash,
order_tag: Option<OrderTag>,
- ) -> Result<
- Pin<Box<dyn Stream<Item = Result<Bytes, std::io::Error>> + Send + Sync + 'static>>,
- Error,
- > {
+ ) -> Result<BlockStream, Error> {
let (header, stream) = self.rpc_get_raw_block_streaming(hash, order_tag).await?;
match header {
DataBlockHeader::Plain => Ok(stream),
diff --git a/src/db/Cargo.toml b/src/db/Cargo.toml
index 530f1966..fddc5cca 100644
--- a/src/db/Cargo.toml
+++ b/src/db/Cargo.toml
@@ -12,24 +12,19 @@ readme = "../../README.md"
path = "lib.rs"
[dependencies]
-err-derive = "0.3"
-hexdump = "0.1"
-tracing = "0.1"
+err-derive.workspace = true
+hexdump.workspace = true
+tracing.workspace = true
-heed = { version = "0.11", default-features = false, features = ["lmdb"], optional = true }
-rusqlite = { version = "0.29", optional = true }
-sled = { version = "0.34", optional = true }
-
-# cli deps
-clap = { version = "4.1", optional = true, features = ["derive", "env"] }
-pretty_env_logger = { version = "0.5", optional = true }
+heed = { workspace = true, optional = true }
+rusqlite = { workspace = true, optional = true }
+sled = { workspace = true, optional = true }
[dev-dependencies]
-mktemp = "0.5"
+mktemp.workspace = true
[features]
default = [ "sled", "lmdb", "sqlite" ]
bundled-libs = [ "rusqlite?/bundled" ]
-cli = ["clap", "pretty_env_logger"]
lmdb = [ "heed" ]
sqlite = [ "rusqlite" ]
diff --git a/src/db/lib.rs b/src/db/lib.rs
index fe44b01e..eef3e177 100644
--- a/src/db/lib.rs
+++ b/src/db/lib.rs
@@ -171,6 +171,48 @@ impl Db {
}
}
+/// List of supported database engine types
+///
+/// The `enum` holds list of *all* database engines that are are be supported by crate, no matter
+/// if relevant feature is enabled or not. It allows us to distinguish between invalid engine
+/// and valid engine, whose support is not enabled via feature flag.
+#[derive(Clone, Copy, Debug, PartialEq, Eq)]
+pub enum Engine {
+ Lmdb,
+ Sqlite,
+ Sled,
+}
+
+impl Engine {
+ /// Return variant name as static `&str`
+ pub fn as_str(&self) -> &'static str {
+ match self {
+ Self::Lmdb => "lmdb",
+ Self::Sqlite => "sqlite",
+ Self::Sled => "sled",
+ }
+ }
+}
+
+impl std::fmt::Display for Engine {
+ fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
+ self.as_str().fmt(fmt)
+ }
+}
+
+impl std::str::FromStr for Engine {
+ type Err = Error;
+
+ fn from_str(text: &str) -> Result<Engine> {
+ match text {
+ "lmdb" | "heed" => Ok(Self::Lmdb),
+ "sqlite" | "sqlite3" | "rusqlite" => Ok(Self::Sqlite),
+ "sled" => Ok(Self::Sled),
+ kind => Err(Error(format!("Invalid DB engine: {}", kind).into())),
+ }
+ }
+}
+
#[allow(clippy::len_without_is_empty)]
impl Tree {
#[inline]
diff --git a/src/garage/Cargo.toml b/src/garage/Cargo.toml
index dce7ea73..02a72502 100644
--- a/src/garage/Cargo.toml
+++ b/src/garage/Cargo.toml
@@ -31,48 +31,51 @@ garage_table.workspace = true
garage_util.workspace = true
garage_web.workspace = true
-backtrace = "0.3"
-bytes = "1.0"
-bytesize = "1.2"
-timeago = { version = "0.4", default-features = false }
-parse_duration = "2.1"
-hex = "0.4"
-tracing = { version = "0.1" }
-tracing-subscriber = { version = "0.3", features = ["env-filter"] }
-rand = "0.8"
-async-trait = "0.1.7"
-sodiumoxide = { version = "0.2.5-0", package = "kuska-sodiumoxide" }
-git-version = "0.3.4"
-
-serde = { version = "1.0", default-features = false, features = ["derive", "rc"] }
-serde_bytes = "0.11"
-structopt = { version = "0.3", default-features = false }
-toml = "0.6"
-
-futures = "0.3"
-futures-util = "0.3"
-tokio = { version = "1.0", default-features = false, features = ["rt", "rt-multi-thread", "io-util", "net", "time", "macros", "sync", "signal", "fs"] }
-
-netapp = "0.10"
-
-opentelemetry = { version = "0.17", features = [ "rt-tokio" ] }
-opentelemetry-prometheus = { version = "0.10", optional = true }
-opentelemetry-otlp = { version = "0.10", optional = true }
-prometheus = { version = "0.13", optional = true }
+backtrace.workspace = true
+bytes.workspace = true
+bytesize.workspace = true
+timeago.workspace = true
+parse_duration.workspace = true
+hex.workspace = true
+tracing.workspace = true
+tracing-subscriber.workspace = true
+rand.workspace = true
+async-trait.workspace = true
+sodiumoxide.workspace = true
+structopt.workspace = true
+git-version.workspace = true
+
+serde.workspace = true
+serde_bytes.workspace = true
+toml.workspace = true
+
+futures.workspace = true
+futures-util.workspace = true
+tokio.workspace = true
+
+netapp.workspace = true
+
+opentelemetry.workspace = true
+opentelemetry-prometheus = { workspace = true, optional = true }
+opentelemetry-otlp = { workspace = true, optional = true }
+prometheus = { workspace = true, optional = true }
[dev-dependencies]
-aws-config = "0.55.2"
-aws-sdk-s3 = "0.28"
-chrono = "0.4"
-http = "0.2"
-hmac = "0.12"
-hyper = { version = "0.14", features = ["client", "http1", "runtime"] }
-sha2 = "0.10"
-
-static_init = "1.0"
-assert-json-diff = "2.0"
-serde_json = "1.0"
-base64 = "0.21"
+aws-config.workspace = true
+aws-sdk-s3.workspace = true
+chrono.workspace = true
+http.workspace = true
+hmac.workspace = true
+http-body-util.workspace = true
+hyper.workspace = true
+hyper-util.workspace = true
+mktemp.workspace = true
+sha2.workspace = true
+
+static_init.workspace = true
+assert-json-diff.workspace = true
+serde_json.workspace = true
+base64.workspace = true
k2v-client.workspace = true
diff --git a/src/garage/admin/block.rs b/src/garage/admin/block.rs
index c4a45738..edeb88c0 100644
--- a/src/garage/admin/block.rs
+++ b/src/garage/admin/block.rs
@@ -25,8 +25,7 @@ impl AdminRpcHandler {
}
async fn handle_block_info(&self, hash: &String) -> Result<AdminRpc, Error> {
- let hash = hex::decode(hash).ok_or_bad_request("invalid hash")?;
- let hash = Hash::try_from(&hash).ok_or_bad_request("invalid hash")?;
+ let hash = self.find_block_hash_by_prefix(hash)?;
let refcount = self.garage.block_manager.get_block_rc(&hash)?;
let block_refs = self
.garage
@@ -189,4 +188,48 @@ impl AdminRpcHandler {
Ok(())
}
+
+ // ---- helper function ----
+ fn find_block_hash_by_prefix(&self, prefix: &str) -> Result<Hash, Error> {
+ if prefix.len() < 4 {
+ return Err(Error::BadRequest(
+ "Please specify at least 4 characters of the block hash".into(),
+ ));
+ }
+
+ let prefix_bin =
+ hex::decode(&prefix[..prefix.len() & !1]).ok_or_bad_request("invalid hash")?;
+
+ let iter = self
+ .garage
+ .block_ref_table
+ .data
+ .store
+ .range(&prefix_bin[..]..)
+ .map_err(GarageError::from)?;
+ let mut found = None;
+ for item in iter {
+ let (k, _v) = item.map_err(GarageError::from)?;
+ let hash = Hash::try_from(&k[..32]).unwrap();
+ if &hash.as_slice()[..prefix_bin.len()] != prefix_bin {
+ break;
+ }
+ if hex::encode(hash.as_slice()).starts_with(prefix) {
+ match &found {
+ Some(x) if *x == hash => (),
+ Some(_) => {
+ return Err(Error::BadRequest(format!(
+ "Several blocks match prefix `{}`",
+ prefix
+ )));
+ }
+ None => {
+ found = Some(hash);
+ }
+ }
+ }
+ }
+
+ found.ok_or_else(|| Error::BadRequest("No matching block found".into()))
+ }
}
diff --git a/src/garage/cli/convert_db.rs b/src/garage/cli/convert_db.rs
index 3c6ce69c..6b854ccb 100644
--- a/src/garage/cli/convert_db.rs
+++ b/src/garage/cli/convert_db.rs
@@ -14,44 +14,73 @@ pub struct ConvertDbOpt {
/// Input database engine (sled, lmdb or sqlite; limited by db engines
/// enabled in this build)
#[structopt(short = "a")]
- input_engine: String,
+ input_engine: Engine,
/// Output database path
#[structopt(short = "o")]
output_path: PathBuf,
/// Output database engine
#[structopt(short = "b")]
- output_engine: String,
+ output_engine: Engine,
+
+ #[structopt(flatten)]
+ db_open: OpenDbOpt,
+}
+
+/// Overrides for database open operation
+#[derive(StructOpt, Debug, Default)]
+pub struct OpenDbOpt {
+ #[cfg(feature = "lmdb")]
+ #[structopt(flatten)]
+ lmdb: OpenLmdbOpt,
+}
+
+/// Overrides for LMDB database open operation
+#[cfg(feature = "lmdb")]
+#[derive(StructOpt, Debug, Default)]
+pub struct OpenLmdbOpt {
+ /// LMDB map size override
+ /// (supported suffixes: B, KiB, MiB, GiB, TiB, PiB)
+ #[cfg(feature = "lmdb")]
+ #[structopt(long = "lmdb-map-size", name = "bytes", display_order = 1_000)]
+ map_size: Option<bytesize::ByteSize>,
}
pub(crate) fn do_conversion(args: ConvertDbOpt) -> Result<()> {
- let input = open_db(args.input_path, args.input_engine)?;
- let output = open_db(args.output_path, args.output_engine)?;
+ if args.input_engine == args.output_engine {
+ return Err(Error("input and output database engine must differ".into()));
+ }
+
+ let input = open_db(args.input_path, args.input_engine, &args.db_open)?;
+ let output = open_db(args.output_path, args.output_engine, &args.db_open)?;
output.import(&input)?;
Ok(())
}
-fn open_db(path: PathBuf, engine: String) -> Result<Db> {
- match engine.as_str() {
+fn open_db(path: PathBuf, engine: Engine, open: &OpenDbOpt) -> Result<Db> {
+ match engine {
#[cfg(feature = "sled")]
- "sled" => {
+ Engine::Sled => {
let db = sled_adapter::sled::Config::default().path(&path).open()?;
Ok(sled_adapter::SledDb::init(db))
}
#[cfg(feature = "sqlite")]
- "sqlite" | "sqlite3" | "rusqlite" => {
+ Engine::Sqlite => {
let db = sqlite_adapter::rusqlite::Connection::open(&path)?;
- db.pragma_update(None, "journal_mode", &"WAL")?;
- db.pragma_update(None, "synchronous", &"NORMAL")?;
+ db.pragma_update(None, "journal_mode", "WAL")?;
+ db.pragma_update(None, "synchronous", "NORMAL")?;
Ok(sqlite_adapter::SqliteDb::init(db))
}
#[cfg(feature = "lmdb")]
- "lmdb" | "heed" => {
+ Engine::Lmdb => {
std::fs::create_dir_all(&path).map_err(|e| {
Error(format!("Unable to create LMDB data directory: {}", e).into())
})?;
- let map_size = lmdb_adapter::recommended_map_size();
+ let map_size = match open.lmdb.map_size {
+ Some(c) => c.as_u64() as usize,
+ None => lmdb_adapter::recommended_map_size(),
+ };
let mut env_builder = lmdb_adapter::heed::EnvOpenOptions::new();
env_builder.max_dbs(100);
@@ -62,8 +91,13 @@ fn open_db(path: PathBuf, engine: String) -> Result<Db> {
let db = env_builder.open(&path)?;
Ok(lmdb_adapter::LmdbDb::init(db))
}
- e => Err(Error(
- format!("Invalid or unsupported DB engine: {}", e).into(),
+
+ // Pattern is unreachable when all supported DB engines are compiled into binary. The allow
+ // attribute is added so that we won't have to change this match in case stop building
+ // support for one or more engines by default.
+ #[allow(unreachable_patterns)]
+ engine => Err(Error(
+ format!("Engine support not available in this build: {}", engine).into(),
)),
}
}
diff --git a/src/garage/cli/init.rs b/src/garage/cli/init.rs
index 20813f1c..43ca5c09 100644
--- a/src/garage/cli/init.rs
+++ b/src/garage/cli/init.rs
@@ -43,7 +43,7 @@ pub fn node_id_command(config_file: PathBuf, quiet: bool) -> Result<(), Error> {
idstr
);
eprintln!(
- "where <remote_node> is their own node identifier in the format: <pubkey>@<ip>:<port>"
+ "where <remote_node> is their own node identifier in the format: <full-node-id>@<ip>:<port>"
);
eprintln!();
eprintln!("This node identifier can also be added as a bootstrap node in other node's garage.toml files:");
diff --git a/src/garage/cli/structs.rs b/src/garage/cli/structs.rs
index 6bc3da22..40e47ee1 100644
--- a/src/garage/cli/structs.rs
+++ b/src/garage/cli/structs.rs
@@ -64,7 +64,8 @@ pub enum Command {
#[derive(StructOpt, Debug)]
pub enum NodeOperation {
- /// Print identifier (public key) of this Garage node
+ /// Print the full node ID (public key) of this Garage node, and its publicly reachable IP
+ /// address and port if they are specified in config file under `rpc_public_addr`
#[structopt(name = "id", version = garage_version())]
NodeId(NodeIdOpt),
@@ -82,8 +83,9 @@ pub struct NodeIdOpt {
#[derive(StructOpt, Debug)]
pub struct ConnectNodeOpt {
- /// Node public key and address, in the format:
- /// `<public key hexadecimal>@<ip or hostname>:<port>`
+ /// Full node ID (public key) and IP address and port, in the format:
+ /// `<full node ID>@<ip or hostname>:<port>`.
+ /// You can retrieve this information on the target node using `garage node id`.
pub(crate) node: String,
}
diff --git a/src/garage/main.rs b/src/garage/main.rs
index 66403d05..1a6a6e32 100644
--- a/src/garage/main.rs
+++ b/src/garage/main.rs
@@ -7,6 +7,7 @@ extern crate tracing;
mod admin;
mod cli;
mod repair;
+mod secrets;
mod server;
#[cfg(feature = "telemetry-otlp")]
mod tracing_setup;
@@ -28,7 +29,6 @@ use structopt::StructOpt;
use netapp::util::parse_and_resolve_peer_addr;
use netapp::NetworkKey;
-use garage_util::config::Config;
use garage_util::error::*;
use garage_rpc::system::*;
@@ -38,6 +38,7 @@ use garage_model::helper::error::Error as HelperError;
use admin::*;
use cli::*;
+use secrets::Secrets;
#[derive(StructOpt, Debug)]
#[structopt(
@@ -45,8 +46,7 @@ use cli::*;
about = "S3-compatible object store for self-hosted geo-distributed deployments"
)]
struct Opt {
- /// Host to connect to for admin operations, in the format:
- /// <public-key>@<ip>:<port>
+ /// Host to connect to for admin operations, in the format: <full-node-id>@<ip>:<port>
#[structopt(short = "h", long = "rpc-host", env = "GARAGE_RPC_HOST")]
pub rpc_host: Option<String>,
@@ -66,24 +66,6 @@ struct Opt {
cmd: Command,
}
-#[derive(StructOpt, Debug)]
-pub struct Secrets {
- /// RPC secret network key, used to replace rpc_secret in config.toml when running the
- /// daemon or doing admin operations
- #[structopt(short = "s", long = "rpc-secret", env = "GARAGE_RPC_SECRET")]
- pub rpc_secret: Option<String>,
-
- /// Metrics API authentication token, replaces admin.metrics_token in config.toml when
- /// running the Garage daemon
- #[structopt(long = "admin-token", env = "GARAGE_ADMIN_TOKEN")]
- pub admin_token: Option<String>,
-
- /// Metrics API authentication token, replaces admin.metrics_token in config.toml when
- /// running the Garage daemon
- #[structopt(long = "metrics-token", env = "GARAGE_METRICS_TOKEN")]
- pub metrics_token: Option<String>,
-}
-
#[tokio::main]
async fn main() {
// Initialize version and features info
@@ -192,7 +174,9 @@ async fn main() {
}
async fn cli_command(opt: Opt) -> Result<(), Error> {
- let config = if opt.secrets.rpc_secret.is_none() || opt.rpc_host.is_none() {
+ let config = if (opt.secrets.rpc_secret.is_none() && opt.secrets.rpc_secret_file.is_none())
+ || opt.rpc_host.is_none()
+ {
Some(garage_util::config::read_config(opt.config_file.clone())
.err_context(format!("Unable to read configuration file {}. Configuration file is needed because -h or -s is not provided on the command line.", opt.config_file.to_string_lossy()))?)
} else {
@@ -200,14 +184,19 @@ async fn cli_command(opt: Opt) -> Result<(), Error> {
};
// Find and parse network RPC secret
- let net_key_hex_str = opt
- .secrets
- .rpc_secret
- .as_ref()
- .or_else(|| config.as_ref().and_then(|c| c.rpc_secret.as_ref()))
- .ok_or("No RPC secret provided")?;
+ let mut rpc_secret = config.as_ref().and_then(|c| c.rpc_secret.clone());
+ secrets::fill_secret(
+ &mut rpc_secret,
+ &config.as_ref().and_then(|c| c.rpc_secret_file.clone()),
+ &opt.secrets.rpc_secret,
+ &opt.secrets.rpc_secret_file,
+ "rpc_secret",
+ true,
+ )?;
+
+ let net_key_hex_str = rpc_secret.ok_or("No RPC secret provided")?;
let network_key = NetworkKey::from_slice(
- &hex::decode(net_key_hex_str).err_context("Invalid RPC secret key (bad hex)")?[..],
+ &hex::decode(&net_key_hex_str).err_context("Invalid RPC secret key (bad hex)")?[..],
)
.ok_or("Invalid RPC secret provided (wrong length)")?;
@@ -218,7 +207,7 @@ async fn cli_command(opt: Opt) -> Result<(), Error> {
// Find and parse the address of the target host
let (id, addr, is_default_addr) = if let Some(h) = opt.rpc_host {
- let (id, addrs) = parse_and_resolve_peer_addr(&h).ok_or_else(|| format!("Invalid RPC remote node identifier: {}. Expected format is <pubkey>@<IP or hostname>:<port>.", h))?;
+ let (id, addrs) = parse_and_resolve_peer_addr(&h).ok_or_else(|| format!("Invalid RPC remote node identifier: {}. Expected format is <full node id>@<IP or hostname>:<port>.", h))?;
(id, addrs[0], false)
} else {
let node_id = garage_rpc::system::read_node_id(&config.as_ref().unwrap().metadata_dir)
@@ -248,7 +237,7 @@ async fn cli_command(opt: Opt) -> Result<(), Error> {
addr
);
}
- Err(e).err_context("Unable to connect to destination RPC host. Check that you are using the same value of rpc_secret as them, and that you have their correct public key.")?;
+ Err(e).err_context("Unable to connect to destination RPC host. Check that you are using the same value of rpc_secret as them, and that you have their correct full-length node ID (public key).")?;
}
let system_rpc_endpoint = netapp.endpoint::<SystemRpc, ()>(SYSTEM_RPC_PATH.into());
@@ -261,16 +250,3 @@ async fn cli_command(opt: Opt) -> Result<(), Error> {
Ok(x) => Ok(x),
}
}
-
-fn fill_secrets(mut config: Config, secrets: Secrets) -> Config {
- if secrets.rpc_secret.is_some() {
- config.rpc_secret = secrets.rpc_secret;
- }
- if secrets.admin_token.is_some() {
- config.admin.admin_token = secrets.admin_token;
- }
- if secrets.metrics_token.is_some() {
- config.admin.metrics_token = secrets.metrics_token;
- }
- config
-}
diff --git a/src/garage/repair/offline.rs b/src/garage/repair/offline.rs
index f4edcf03..45024e71 100644
--- a/src/garage/repair/offline.rs
+++ b/src/garage/repair/offline.rs
@@ -6,7 +6,7 @@ use garage_util::error::*;
use garage_model::garage::Garage;
use crate::cli::structs::*;
-use crate::{fill_secrets, Secrets};
+use crate::secrets::{fill_secrets, Secrets};
pub async fn offline_repair(
config_file: PathBuf,
@@ -20,7 +20,7 @@ pub async fn offline_repair(
}
info!("Loading configuration...");
- let config = fill_secrets(read_config(config_file)?, secrets);
+ let config = fill_secrets(read_config(config_file)?, secrets)?;
info!("Initializing Garage main data store...");
let garage = Garage::new(config)?;
diff --git a/src/garage/secrets.rs b/src/garage/secrets.rs
new file mode 100644
index 00000000..c3d704aa
--- /dev/null
+++ b/src/garage/secrets.rs
@@ -0,0 +1,320 @@
+use std::path::PathBuf;
+
+use structopt::StructOpt;
+
+use garage_util::config::Config;
+use garage_util::error::Error;
+
+/// Structure for secret values or paths that are passed as CLI arguments or environment
+/// variables, instead of in the config file.
+#[derive(StructOpt, Debug, Default, Clone)]
+pub struct Secrets {
+ /// Skip permission check on files containing secrets
+ #[cfg(unix)]
+ #[structopt(
+ long = "allow-world-readable-secrets",
+ env = "GARAGE_ALLOW_WORLD_READABLE_SECRETS"
+ )]
+ pub allow_world_readable_secrets: Option<bool>,
+
+ /// RPC secret network key, used to replace rpc_secret in config.toml when running the
+ /// daemon or doing admin operations
+ #[structopt(short = "s", long = "rpc-secret", env = "GARAGE_RPC_SECRET")]
+ pub rpc_secret: Option<String>,
+
+ /// RPC secret network key, used to replace rpc_secret in config.toml and rpc-secret
+ /// when running the daemon or doing admin operations
+ #[structopt(long = "rpc-secret-file", env = "GARAGE_RPC_SECRET_FILE")]
+ pub rpc_secret_file: Option<PathBuf>,
+
+ /// Admin API authentication token, replaces admin.admin_token in config.toml when
+ /// running the Garage daemon
+ #[structopt(long = "admin-token", env = "GARAGE_ADMIN_TOKEN")]
+ pub admin_token: Option<String>,
+
+ /// Admin API authentication token file path, replaces admin.admin_token in config.toml
+ /// and admin-token when running the Garage daemon
+ #[structopt(long = "admin-token-file", env = "GARAGE_ADMIN_TOKEN_FILE")]
+ pub admin_token_file: Option<PathBuf>,
+
+ /// Metrics API authentication token, replaces admin.metrics_token in config.toml when
+ /// running the Garage daemon
+ #[structopt(long = "metrics-token", env = "GARAGE_METRICS_TOKEN")]
+ pub metrics_token: Option<String>,
+
+ /// Metrics API authentication token file path, replaces admin.metrics_token in config.toml
+ /// and metrics-token when running the Garage daemon
+ #[structopt(long = "metrics-token-file", env = "GARAGE_METRICS_TOKEN_FILE")]
+ pub metrics_token_file: Option<PathBuf>,
+}
+
+/// Single function to fill all secrets in the Config struct from their correct source (value
+/// from config or CLI param or env variable or read from a file specified in config or CLI
+/// param or env variable)
+pub fn fill_secrets(mut config: Config, secrets: Secrets) -> Result<Config, Error> {
+ let allow_world_readable = secrets
+ .allow_world_readable_secrets
+ .unwrap_or(config.allow_world_readable_secrets);
+
+ fill_secret(
+ &mut config.rpc_secret,
+ &config.rpc_secret_file,
+ &secrets.rpc_secret,
+ &secrets.rpc_secret_file,
+ "rpc_secret",
+ allow_world_readable,
+ )?;
+
+ fill_secret(
+ &mut config.admin.admin_token,
+ &config.admin.admin_token_file,
+ &secrets.admin_token,
+ &secrets.admin_token_file,
+ "admin.admin_token",
+ allow_world_readable,
+ )?;
+ fill_secret(
+ &mut config.admin.metrics_token,
+ &config.admin.metrics_token_file,
+ &secrets.metrics_token,
+ &secrets.metrics_token_file,
+ "admin.metrics_token",
+ allow_world_readable,
+ )?;
+
+ Ok(config)
+}
+
+pub(crate) fn fill_secret(
+ config_secret: &mut Option<String>,
+ config_secret_file: &Option<PathBuf>,
+ cli_secret: &Option<String>,
+ cli_secret_file: &Option<PathBuf>,
+ name: &'static str,
+ allow_world_readable: bool,
+) -> Result<(), Error> {
+ let cli_value = match (&cli_secret, &cli_secret_file) {
+ (Some(_), Some(_)) => {
+ return Err(format!("only one of `{}` and `{}_file` can be set", name, name).into());
+ }
+ (Some(secret), None) => Some(secret.to_string()),
+ (None, Some(file)) => Some(read_secret_file(file, allow_world_readable)?),
+ (None, None) => None,
+ };
+
+ if let Some(val) = cli_value {
+ if config_secret.is_some() || config_secret_file.is_some() {
+ debug!("Overriding secret `{}` using value specified using CLI argument or environnement variable.", name);
+ }
+
+ *config_secret = Some(val);
+ } else if let Some(file_path) = &config_secret_file {
+ if config_secret.is_some() {
+ return Err(format!("only one of `{}` and `{}_file` can be set", name, name).into());
+ }
+
+ *config_secret = Some(read_secret_file(file_path, allow_world_readable)?);
+ }
+
+ Ok(())
+}
+
+fn read_secret_file(file_path: &PathBuf, allow_world_readable: bool) -> Result<String, Error> {
+ if !allow_world_readable {
+ #[cfg(unix)]
+ {
+ use std::os::unix::fs::MetadataExt;
+ let metadata = std::fs::metadata(file_path)?;
+ if metadata.mode() & 0o077 != 0 {
+ return Err(format!("File {} is world-readable! (mode: 0{:o}, expected 0600)\nRefusing to start until this is fixed, or environment variable GARAGE_ALLOW_WORLD_READABLE_SECRETS is set to true.", file_path.display(), metadata.mode()).into());
+ }
+ }
+ }
+
+ let secret_buf = std::fs::read_to_string(file_path)?;
+
+ // trim_end: allows for use case such as `echo "$(openssl rand -hex 32)" > somefile`.
+ // also editors sometimes add a trailing newline
+ Ok(String::from(secret_buf.trim_end()))
+}
+
+#[cfg(test)]
+mod tests {
+ use std::fs::File;
+ use std::io::Write;
+
+ use garage_util::config::read_config;
+ use garage_util::error::Error;
+
+ use super::*;
+
+ #[test]
+ fn test_rpc_secret_file_works() -> Result<(), Error> {
+ let path_secret = mktemp::Temp::new_file()?;
+ let mut file_secret = File::create(path_secret.as_path())?;
+ writeln!(file_secret, "foo")?;
+ drop(file_secret);
+
+ let path_config = mktemp::Temp::new_file()?;
+ let mut file_config = File::create(path_config.as_path())?;
+ let path_secret_path = path_secret.as_path();
+ writeln!(
+ file_config,
+ r#"
+ metadata_dir = "/tmp/garage/meta"
+ data_dir = "/tmp/garage/data"
+ replication_mode = "3"
+ rpc_bind_addr = "[::]:3901"
+ rpc_secret_file = "{}"
+
+ [s3_api]
+ s3_region = "garage"
+ api_bind_addr = "[::]:3900"
+ "#,
+ path_secret_path.display()
+ )?;
+ drop(file_config);
+
+ // Second configuration file, same as previous one
+ // except it allows world-readable secrets.
+ let path_config_allow_world_readable = mktemp::Temp::new_file()?;
+ let mut file_config_allow_world_readable =
+ File::create(path_config_allow_world_readable.as_path())?;
+ writeln!(
+ file_config_allow_world_readable,
+ r#"
+ metadata_dir = "/tmp/garage/meta"
+ data_dir = "/tmp/garage/data"
+ replication_mode = "3"
+ rpc_bind_addr = "[::]:3901"
+ rpc_secret_file = "{}"
+ allow_world_readable_secrets = true
+
+ [s3_api]
+ s3_region = "garage"
+ api_bind_addr = "[::]:3900"
+ "#,
+ path_secret_path.display()
+ )?;
+ drop(file_config_allow_world_readable);
+
+ let config = read_config(path_config.to_path_buf())?;
+ let config = fill_secrets(config, Secrets::default())?;
+ assert_eq!("foo", config.rpc_secret.unwrap());
+
+ // ---- Check non world-readable secrets config ----
+ #[cfg(unix)]
+ {
+ let secrets_allow_world_readable = Secrets {
+ allow_world_readable_secrets: Some(true),
+ ..Default::default()
+ };
+ let secrets_no_allow_world_readable = Secrets {
+ allow_world_readable_secrets: Some(false),
+ ..Default::default()
+ };
+
+ use std::os::unix::fs::PermissionsExt;
+ let metadata = std::fs::metadata(path_secret_path)?;
+ let mut perm = metadata.permissions();
+ perm.set_mode(0o660);
+ std::fs::set_permissions(path_secret_path, perm)?;
+
+ // Config file that just specifies the path
+ let config = read_config(path_config.to_path_buf())?;
+ assert!(fill_secrets(config, Secrets::default()).is_err());
+
+ let config = read_config(path_config.to_path_buf())?;
+ assert!(fill_secrets(config, secrets_allow_world_readable.clone()).is_ok());
+
+ let config = read_config(path_config.to_path_buf())?;
+ assert!(fill_secrets(config, secrets_no_allow_world_readable.clone()).is_err());
+
+ // Config file that also specifies to allow world_readable_secrets
+ let config = read_config(path_config_allow_world_readable.to_path_buf())?;
+ assert!(fill_secrets(config, Secrets::default()).is_ok());
+
+ let config = read_config(path_config_allow_world_readable.to_path_buf())?;
+ assert!(fill_secrets(config, secrets_allow_world_readable).is_ok());
+
+ let config = read_config(path_config_allow_world_readable.to_path_buf())?;
+ assert!(fill_secrets(config, secrets_no_allow_world_readable).is_err());
+ }
+
+ // ---- Check alternative secrets specified on CLI ----
+
+ let path_secret2 = mktemp::Temp::new_file()?;
+ let mut file_secret2 = File::create(path_secret2.as_path())?;
+ writeln!(file_secret2, "bar")?;
+ drop(file_secret2);
+
+ let config = read_config(path_config.to_path_buf())?;
+ let config = fill_secrets(
+ config,
+ Secrets {
+ rpc_secret: Some("baz".into()),
+ ..Default::default()
+ },
+ )?;
+ assert_eq!(config.rpc_secret.as_deref(), Some("baz"));
+
+ let config = read_config(path_config.to_path_buf())?;
+ let config = fill_secrets(
+ config,
+ Secrets {
+ rpc_secret_file: Some(path_secret2.clone()),
+ ..Default::default()
+ },
+ )?;
+ assert_eq!(config.rpc_secret.as_deref(), Some("bar"));
+
+ let config = read_config(path_config.to_path_buf())?;
+ assert!(fill_secrets(
+ config,
+ Secrets {
+ rpc_secret: Some("baz".into()),
+ rpc_secret_file: Some(path_secret2.clone()),
+ ..Default::default()
+ }
+ )
+ .is_err());
+
+ drop(path_secret);
+ drop(path_secret2);
+ drop(path_config);
+ drop(path_config_allow_world_readable);
+
+ Ok(())
+ }
+
+ #[test]
+ fn test_rcp_secret_and_rpc_secret_file_cannot_be_set_both() -> Result<(), Error> {
+ let path_config = mktemp::Temp::new_file()?;
+ let mut file_config = File::create(path_config.as_path())?;
+ writeln!(
+ file_config,
+ r#"
+ metadata_dir = "/tmp/garage/meta"
+ data_dir = "/tmp/garage/data"
+ replication_mode = "3"
+ rpc_bind_addr = "[::]:3901"
+ rpc_secret= "dummy"
+ rpc_secret_file = "dummy"
+
+ [s3_api]
+ s3_region = "garage"
+ api_bind_addr = "[::]:3900"
+ "#
+ )?;
+ let config = read_config(path_config.to_path_buf())?;
+ assert_eq!(
+ "only one of `rpc_secret` and `rpc_secret_file` can be set",
+ fill_secrets(config, Secrets::default())
+ .unwrap_err()
+ .to_string()
+ );
+ drop(path_config);
+ drop(file_config);
+ Ok(())
+ }
+}
diff --git a/src/garage/server.rs b/src/garage/server.rs
index 3ad10b72..51b06b8e 100644
--- a/src/garage/server.rs
+++ b/src/garage/server.rs
@@ -15,9 +15,9 @@ use garage_web::WebServer;
use garage_api::k2v::api_server::K2VApiServer;
use crate::admin::*;
+use crate::secrets::{fill_secrets, Secrets};
#[cfg(feature = "telemetry-otlp")]
use crate::tracing_setup::*;
-use crate::{fill_secrets, Secrets};
async fn wait_from(mut chan: watch::Receiver<bool>) {
while !*chan.borrow() {
@@ -29,12 +29,19 @@ async fn wait_from(mut chan: watch::Receiver<bool>) {
pub async fn run_server(config_file: PathBuf, secrets: Secrets) -> Result<(), Error> {
info!("Loading configuration...");
- let config = fill_secrets(read_config(config_file)?, secrets);
+ let config = fill_secrets(read_config(config_file)?, secrets)?;
// ---- Initialize Garage internals ----
#[cfg(feature = "metrics")]
- let metrics_exporter = opentelemetry_prometheus::exporter().init();
+ let metrics_exporter = opentelemetry_prometheus::exporter()
+ .with_default_summary_quantiles(vec![0.25, 0.5, 0.75, 0.9, 0.95, 0.99])
+ .with_default_histogram_boundaries(vec![
+ 0.001, 0.0015, 0.002, 0.003, 0.005, 0.007, 0.01, 0.015, 0.02, 0.03, 0.05, 0.07, 0.1,
+ 0.15, 0.2, 0.3, 0.5, 0.7, 1., 1.5, 2., 3., 5., 7., 10., 15., 20., 30., 40., 50., 60.,
+ 70., 100.,
+ ])
+ .init();
info!("Initializing Garage main data store...");
let garage = Garage::new(config.clone())?;
@@ -81,7 +88,7 @@ pub async fn run_server(config_file: PathBuf, secrets: Secrets) -> Result<(), Er
garage.clone(),
s3_bind_addr.clone(),
config.s3_api.s3_region.clone(),
- wait_from(watch_cancel.clone()),
+ watch_cancel.clone(),
)),
));
}
@@ -96,7 +103,7 @@ pub async fn run_server(config_file: PathBuf, secrets: Secrets) -> Result<(), Er
garage.clone(),
config.k2v_api.as_ref().unwrap().api_bind_addr.clone(),
config.s3_api.s3_region.clone(),
- wait_from(watch_cancel.clone()),
+ watch_cancel.clone(),
)),
));
}
@@ -106,14 +113,10 @@ pub async fn run_server(config_file: PathBuf, secrets: Secrets) -> Result<(), Er
if let Some(web_config) = &config.s3_web {
info!("Initializing web server...");
+ let web_server = WebServer::new(garage.clone(), web_config.root_domain.clone());
servers.push((
"Web",
- tokio::spawn(WebServer::run(
- garage.clone(),
- web_config.bind_addr.clone(),
- web_config.root_domain.clone(),
- wait_from(watch_cancel.clone()),
- )),
+ tokio::spawn(web_server.run(web_config.bind_addr.clone(), watch_cancel.clone())),
));
}
@@ -121,9 +124,7 @@ pub async fn run_server(config_file: PathBuf, secrets: Secrets) -> Result<(), Er
info!("Launching Admin API server...");
servers.push((
"Admin",
- tokio::spawn(
- admin_server.run(admin_bind_addr.clone(), wait_from(watch_cancel.clone())),
- ),
+ tokio::spawn(admin_server.run(admin_bind_addr.clone(), watch_cancel.clone())),
));
}
diff --git a/src/garage/tests/common/client.rs b/src/garage/tests/common/client.rs
index ef4daa5d..ffa4cae8 100644
--- a/src/garage/tests/common/client.rs
+++ b/src/garage/tests/common/client.rs
@@ -1,3 +1,4 @@
+use aws_sdk_s3::config::BehaviorVersion;
use aws_sdk_s3::config::Credentials;
use aws_sdk_s3::{Client, Config};
@@ -11,6 +12,7 @@ pub fn build_client(key: &Key) -> Client {
.endpoint_url(format!("http://127.0.0.1:{}", DEFAULT_PORT))
.region(super::REGION)
.credentials_provider(credentials)
+ .behavior_version(BehaviorVersion::v2023_11_09())
.build();
Client::from_conf(config)
diff --git a/src/garage/tests/common/custom_requester.rs b/src/garage/tests/common/custom_requester.rs
index 4133bb8b..e5f4cca1 100644
--- a/src/garage/tests/common/custom_requester.rs
+++ b/src/garage/tests/common/custom_requester.rs
@@ -5,12 +5,17 @@ use std::convert::TryFrom;
use chrono::{offset::Utc, DateTime};
use hmac::{Hmac, Mac};
-use hyper::client::HttpConnector;
-use hyper::{Body, Client, Method, Request, Response, Uri};
+use http_body_util::BodyExt;
+use http_body_util::Full as FullBody;
+use hyper::{Method, Request, Response, Uri};
+use hyper_util::client::legacy::{connect::HttpConnector, Client};
+use hyper_util::rt::TokioExecutor;
use super::garage::{Instance, Key};
use garage_api::signature;
+pub type Body = FullBody<hyper::body::Bytes>;
+
/// You should ever only use this to send requests AWS sdk won't send,
/// like to reproduce behavior of unusual implementations found to be
/// problematic.
@@ -19,7 +24,7 @@ pub struct CustomRequester {
key: Key,
uri: Uri,
service: &'static str,
- client: Client<HttpConnector>,
+ client: Client<HttpConnector, Body>,
}
impl CustomRequester {
@@ -28,7 +33,7 @@ impl CustomRequester {
key: key.clone(),
uri: instance.s3_uri(),
service: "s3",
- client: Client::new(),
+ client: Client::builder(TokioExecutor::new()).build_http(),
}
}
@@ -37,7 +42,7 @@ impl CustomRequester {
key: key.clone(),
uri: instance.k2v_uri(),
service: "k2v",
- client: Client::new(),
+ client: Client::builder(TokioExecutor::new()).build_http(),
}
}
@@ -139,7 +144,7 @@ impl<'a> RequestBuilder<'a> {
self
}
- pub async fn send(&mut self) -> hyper::Result<Response<Body>> {
+ pub async fn send(&mut self) -> Result<Response<Body>, String> {
// TODO this is a bit incorrect in that path and query params should be url-encoded and
// aren't, but this is good enought for now.
@@ -200,8 +205,8 @@ impl<'a> RequestBuilder<'a> {
all_headers.insert("x-amz-content-sha256".to_owned(), body_sha.clone());
let mut signed_headers = all_headers
- .iter()
- .map(|(k, _)| k.as_ref())
+ .keys()
+ .map(|k| k.as_ref())
.collect::<Vec<&str>>();
signed_headers.sort();
let signed_headers = signed_headers.join(";");
@@ -242,7 +247,22 @@ impl<'a> RequestBuilder<'a> {
.method(self.method.clone())
.body(Body::from(body))
.unwrap();
- self.requester.client.request(request).await
+
+ let result = self
+ .requester
+ .client
+ .request(request)
+ .await
+ .map_err(|err| format!("hyper client error: {}", err))?;
+
+ let (head, body) = result.into_parts();
+ let body = Body::new(
+ body.collect()
+ .await
+ .map_err(|err| format!("hyper client error in body.collect: {}", err))?
+ .to_bytes(),
+ );
+ Ok(Response::from_parts(head, body))
}
}
diff --git a/src/garage/tests/k2v/batch.rs b/src/garage/tests/k2v/batch.rs
index 71de91bf..39554d4d 100644
--- a/src/garage/tests/k2v/batch.rs
+++ b/src/garage/tests/k2v/batch.rs
@@ -7,6 +7,7 @@ use base64::prelude::*;
use serde_json::json;
use crate::json_body;
+use http_body_util::BodyExt;
use hyper::{Method, StatusCode};
#[tokio::test]
@@ -77,10 +78,7 @@ async fn test_batch() {
.unwrap()
.to_string(),
);
- let res_body = hyper::body::to_bytes(res.into_body())
- .await
- .unwrap()
- .to_vec();
+ let res_body = res.into_body().collect().await.unwrap().to_bytes();
assert_eq!(res_body, values.get(sk).unwrap().as_bytes());
}
diff --git a/src/garage/tests/k2v/item.rs b/src/garage/tests/k2v/item.rs
index 20add889..5a347bd9 100644
--- a/src/garage/tests/k2v/item.rs
+++ b/src/garage/tests/k2v/item.rs
@@ -7,6 +7,7 @@ use base64::prelude::*;
use serde_json::json;
use crate::json_body;
+use http_body_util::BodyExt;
use hyper::{Method, StatusCode};
#[tokio::test]
@@ -83,10 +84,7 @@ async fn test_items_and_indices() {
.to_str()
.unwrap()
.to_string();
- let res_body = hyper::body::to_bytes(res.into_body())
- .await
- .unwrap()
- .to_vec();
+ let res_body = res.into_body().collect().await.unwrap().to_bytes();
assert_eq!(res_body, content);
// ReadIndex -- now there should be some stuff
@@ -152,10 +150,7 @@ async fn test_items_and_indices() {
res.headers().get("content-type").unwrap().to_str().unwrap(),
"application/octet-stream"
);
- let res_body = hyper::body::to_bytes(res.into_body())
- .await
- .unwrap()
- .to_vec();
+ let res_body = res.into_body().collect().await.unwrap().to_bytes();
assert_eq!(res_body, content2);
// ReadIndex -- now there should be some stuff
@@ -394,10 +389,7 @@ async fn test_item_return_format() {
.to_str()
.unwrap()
.to_string();
- let res_body = hyper::body::to_bytes(res.into_body())
- .await
- .unwrap()
- .to_vec();
+ let res_body = res.into_body().collect().await.unwrap().to_bytes();
assert_eq!(res_body, single_value);
// f1: not specified
@@ -434,10 +426,7 @@ async fn test_item_return_format() {
res.headers().get("content-type").unwrap().to_str().unwrap(),
"application/octet-stream"
);
- let res_body = hyper::body::to_bytes(res.into_body())
- .await
- .unwrap()
- .to_vec();
+ let res_body = res.into_body().collect().await.unwrap().to_bytes();
assert_eq!(res_body, single_value);
// f3: json
diff --git a/src/garage/tests/k2v/poll.rs b/src/garage/tests/k2v/poll.rs
index 452317c2..277f8bc8 100644
--- a/src/garage/tests/k2v/poll.rs
+++ b/src/garage/tests/k2v/poll.rs
@@ -1,4 +1,5 @@
use base64::prelude::*;
+use http_body_util::BodyExt;
use hyper::{Method, StatusCode};
use std::time::Duration;
@@ -47,11 +48,8 @@ async fn test_poll_item() {
.unwrap()
.to_string();
- let res2_body = hyper::body::to_bytes(res2.into_body())
- .await
- .unwrap()
- .to_vec();
- assert_eq!(res2_body, b"Initial value");
+ let res2_body = res2.into_body().collect().await.unwrap().to_bytes();
+ assert_eq!(res2_body, b"Initial value"[..]);
// Start poll operation
let poll = {
@@ -95,11 +93,8 @@ async fn test_poll_item() {
assert_eq!(poll_res.status(), StatusCode::OK);
- let poll_res_body = hyper::body::to_bytes(poll_res.into_body())
- .await
- .unwrap()
- .to_vec();
- assert_eq!(poll_res_body, b"New value");
+ let poll_res_body = poll_res.into_body().collect().await.unwrap().to_bytes();
+ assert_eq!(poll_res_body, b"New value"[..]);
}
#[tokio::test]
diff --git a/src/garage/tests/k2v/simple.rs b/src/garage/tests/k2v/simple.rs
index 465fc24d..1017330d 100644
--- a/src/garage/tests/k2v/simple.rs
+++ b/src/garage/tests/k2v/simple.rs
@@ -1,5 +1,6 @@
use crate::common;
+use http_body_util::BodyExt;
use hyper::{Method, StatusCode};
#[tokio::test]
@@ -32,9 +33,6 @@ async fn test_simple() {
.unwrap();
assert_eq!(res2.status(), StatusCode::OK);
- let res2_body = hyper::body::to_bytes(res2.into_body())
- .await
- .unwrap()
- .to_vec();
- assert_eq!(res2_body, b"Hello, world!");
+ let res2_body = res2.into_body().collect().await.unwrap().to_bytes();
+ assert_eq!(res2_body, b"Hello, world!"[..]);
}
diff --git a/src/garage/tests/lib.rs b/src/garage/tests/lib.rs
index ab92bc0a..ef370db3 100644
--- a/src/garage/tests/lib.rs
+++ b/src/garage/tests/lib.rs
@@ -11,15 +11,15 @@ mod k2v;
#[cfg(feature = "k2v")]
mod k2v_client;
-use hyper::{Body, Response};
+use http_body_util::BodyExt;
+use hyper::{body::Body, Response};
-pub async fn json_body(res: Response<Body>) -> serde_json::Value {
- let res_body: serde_json::Value = serde_json::from_slice(
- &hyper::body::to_bytes(res.into_body())
- .await
- .unwrap()
- .to_vec()[..],
- )
- .unwrap();
+pub async fn json_body<B>(res: Response<B>) -> serde_json::Value
+where
+ B: Body,
+ <B as Body>::Error: std::fmt::Debug,
+{
+ let body = res.into_body().collect().await.unwrap().to_bytes();
+ let res_body: serde_json::Value = serde_json::from_slice(&body).unwrap();
res_body
}
diff --git a/src/garage/tests/s3/list.rs b/src/garage/tests/s3/list.rs
index bb03f250..1b0c006d 100644
--- a/src/garage/tests/s3/list.rs
+++ b/src/garage/tests/s3/list.rs
@@ -613,3 +613,63 @@ async fn test_listmultipart() {
assert!(r.common_prefixes.is_none());
}
}
+
+#[tokio::test]
+async fn test_multichar_delimiter() {
+ // Test case from dpape from issue #692 with reference results from Amazon
+
+ let ctx = common::context();
+ let bucket = ctx.create_bucket("multichardelim");
+
+ for k in [
+ "a/", "a/b/", "a/b/c/", "a/b/c/d", "a/c/", "a/c/b/", "a/c/b/e",
+ ] {
+ ctx.client
+ .put_object()
+ .bucket(&bucket)
+ .key(k)
+ .send()
+ .await
+ .unwrap();
+ }
+
+ // With delimiter /
+ {
+ let r = ctx
+ .client
+ .list_objects_v2()
+ .bucket(&bucket)
+ .delimiter("/")
+ .send()
+ .await
+ .unwrap();
+
+ assert!(r.contents.is_none());
+
+ let common_prefixes = r.common_prefixes.unwrap();
+ assert_eq!(common_prefixes.len(), 1);
+ assert_eq!(common_prefixes[0].prefix.as_deref().unwrap(), "a/");
+ }
+
+ // With delimiter b/
+ {
+ let r = ctx
+ .client
+ .list_objects_v2()
+ .bucket(&bucket)
+ .delimiter("b/")
+ .send()
+ .await
+ .unwrap();
+
+ let contents = r.contents.unwrap();
+ assert_eq!(contents.len(), 2);
+ assert_eq!(contents[0].key.as_deref().unwrap(), "a/");
+ assert_eq!(contents[1].key.as_deref().unwrap(), "a/c/");
+
+ let common_prefixes = r.common_prefixes.unwrap();
+ assert_eq!(common_prefixes.len(), 2);
+ assert_eq!(common_prefixes[0].prefix.as_deref().unwrap(), "a/b/");
+ assert_eq!(common_prefixes[1].prefix.as_deref().unwrap(), "a/c/b/");
+ }
+}
diff --git a/src/garage/tests/s3/multipart.rs b/src/garage/tests/s3/multipart.rs
index 09ae5e5b..51c9df74 100644
--- a/src/garage/tests/s3/multipart.rs
+++ b/src/garage/tests/s3/multipart.rs
@@ -154,7 +154,7 @@ async fn test_multipart_upload() {
.await
.unwrap();
- assert_eq!(r.content_length, (SZ_5MB * 3) as i64);
+ assert_eq!(r.content_length.unwrap(), (SZ_5MB * 3) as i64);
}
{
@@ -183,7 +183,7 @@ async fn test_multipart_upload() {
.unwrap();
eprintln!("get_object with part_number = {}", part_number);
- assert_eq!(o.content_length, SZ_5MB as i64);
+ assert_eq!(o.content_length.unwrap(), SZ_5MB as i64);
assert_bytes_eq!(o.body, data);
}
}
@@ -249,14 +249,14 @@ async fn test_uploadlistpart() {
let ps = r.parts.unwrap();
assert_eq!(ps.len(), 1);
- assert_eq!(ps[0].part_number, 2);
+ assert_eq!(ps[0].part_number.unwrap(), 2);
let fp = &ps[0];
assert!(fp.last_modified.is_some());
assert_eq!(
fp.e_tag.as_ref().unwrap(),
"\"3366bb9dcf710d6801b5926467d02e19\""
);
- assert_eq!(fp.size, SZ_5MB as i64);
+ assert_eq!(fp.size.unwrap(), SZ_5MB as i64);
}
let p2 = ctx
@@ -286,23 +286,23 @@ async fn test_uploadlistpart() {
let ps = r.parts.unwrap();
assert_eq!(ps.len(), 2);
- assert_eq!(ps[0].part_number, 1);
+ assert_eq!(ps[0].part_number.unwrap(), 1);
let fp = &ps[0];
assert!(fp.last_modified.is_some());
assert_eq!(
fp.e_tag.as_ref().unwrap(),
"\"3c484266f9315485694556e6c693bfa2\""
);
- assert_eq!(fp.size, SZ_5MB as i64);
+ assert_eq!(fp.size.unwrap(), SZ_5MB as i64);
- assert_eq!(ps[1].part_number, 2);
+ assert_eq!(ps[1].part_number.unwrap(), 2);
let sp = &ps[1];
assert!(sp.last_modified.is_some());
assert_eq!(
sp.e_tag.as_ref().unwrap(),
"\"3366bb9dcf710d6801b5926467d02e19\""
);
- assert_eq!(sp.size, SZ_5MB as i64);
+ assert_eq!(sp.size.unwrap(), SZ_5MB as i64);
}
{
@@ -320,14 +320,14 @@ async fn test_uploadlistpart() {
assert!(r.part_number_marker.is_none());
assert_eq!(r.next_part_number_marker.as_deref(), Some("1"));
- assert_eq!(r.max_parts, 1_i32);
- assert!(r.is_truncated);
+ assert_eq!(r.max_parts.unwrap(), 1_i32);
+ assert!(r.is_truncated.unwrap());
assert_eq!(r.key.unwrap(), "a");
assert_eq!(r.upload_id.unwrap().as_str(), uid.as_str());
let parts = r.parts.unwrap();
assert_eq!(parts.len(), 1);
let fp = &parts[0];
- assert_eq!(fp.part_number, 1);
+ assert_eq!(fp.part_number.unwrap(), 1);
assert_eq!(
fp.e_tag.as_ref().unwrap(),
"\"3c484266f9315485694556e6c693bfa2\""
@@ -349,19 +349,19 @@ async fn test_uploadlistpart() {
r2.part_number_marker.as_ref().unwrap(),
r.next_part_number_marker.as_ref().unwrap()
);
- assert_eq!(r2.max_parts, 1_i32);
+ assert_eq!(r2.max_parts.unwrap(), 1_i32);
assert_eq!(r2.key.unwrap(), "a");
assert_eq!(r2.upload_id.unwrap().as_str(), uid.as_str());
let parts = r2.parts.unwrap();
assert_eq!(parts.len(), 1);
let fp = &parts[0];
- assert_eq!(fp.part_number, 2);
+ assert_eq!(fp.part_number.unwrap(), 2);
assert_eq!(
fp.e_tag.as_ref().unwrap(),
"\"3366bb9dcf710d6801b5926467d02e19\""
);
//assert!(r2.is_truncated); // WHY? (this was the test before)
- assert!(!r2.is_truncated);
+ assert!(!r2.is_truncated.unwrap());
}
let cmp = CompletedMultipartUpload::builder()
@@ -411,7 +411,7 @@ async fn test_uploadlistpart() {
.await
.unwrap();
- assert_eq!(r.content_length, (SZ_5MB * 2) as i64);
+ assert_eq!(r.content_length.unwrap(), (SZ_5MB * 2) as i64);
}
}
diff --git a/src/garage/tests/s3/objects.rs b/src/garage/tests/s3/objects.rs
index 27697d45..ad5f63f1 100644
--- a/src/garage/tests/s3/objects.rs
+++ b/src/garage/tests/s3/objects.rs
@@ -50,9 +50,9 @@ async fn test_putobject() {
// assert_eq!(o.version_id.unwrap(), _version);
assert_eq!(o.content_type.unwrap(), content_type);
assert!(o.last_modified.is_some());
- assert_eq!(o.content_length, 0);
- assert_eq!(o.parts_count, 0);
- assert_eq!(o.tag_count, 0);
+ assert_eq!(o.content_length.unwrap(), 0);
+ assert_eq!(o.parts_count, None);
+ assert_eq!(o.tag_count, None);
}
{
@@ -86,9 +86,9 @@ async fn test_putobject() {
assert_bytes_eq!(o.body, b"hi");
assert_eq!(o.e_tag.unwrap(), etag);
assert!(o.last_modified.is_some());
- assert_eq!(o.content_length, 2);
- assert_eq!(o.parts_count, 0);
- assert_eq!(o.tag_count, 0);
+ assert_eq!(o.content_length.unwrap(), 2);
+ assert_eq!(o.parts_count, None);
+ assert_eq!(o.tag_count, None);
}
{
@@ -119,9 +119,9 @@ async fn test_putobject() {
assert_bytes_eq!(o.body, b"");
assert_eq!(o.e_tag.unwrap(), etag);
assert!(o.last_modified.is_some());
- assert_eq!(o.content_length, 0);
- assert_eq!(o.parts_count, 0);
- assert_eq!(o.tag_count, 0);
+ assert_eq!(o.content_length.unwrap(), 0);
+ assert_eq!(o.parts_count, None);
+ assert_eq!(o.tag_count, None);
}
}
@@ -185,6 +185,30 @@ async fn test_getobject() {
assert_eq!(o.content_range.unwrap().as_str(), "bytes 57-61/62");
assert_bytes_eq!(o.body, &BODY[57..]);
}
+ {
+ let exp = aws_sdk_s3::primitives::DateTime::from_secs(10000000000);
+ let o = ctx
+ .client
+ .get_object()
+ .bucket(&bucket)
+ .key(STD_KEY)
+ .response_content_type("application/x-dummy-test")
+ .response_cache_control("ccdummy")
+ .response_content_disposition("cddummy")
+ .response_content_encoding("cedummy")
+ .response_content_language("cldummy")
+ .response_expires(exp)
+ .send()
+ .await
+ .unwrap();
+ assert_eq!(o.content_type.unwrap().as_str(), "application/x-dummy-test");
+ assert_eq!(o.cache_control.unwrap().as_str(), "ccdummy");
+ assert_eq!(o.content_disposition.unwrap().as_str(), "cddummy");
+ assert_eq!(o.content_encoding.unwrap().as_str(), "cedummy");
+ assert_eq!(o.content_language.unwrap().as_str(), "cldummy");
+ assert_eq!(o.expires.unwrap(), exp);
+ assert_bytes_eq!(o.body, &BODY[..]);
+ }
}
#[tokio::test]
@@ -205,7 +229,7 @@ async fn test_deleteobject() {
.await
.unwrap();
if i > 0 {
- to_del = to_del.objects(ObjectIdentifier::builder().key(k).build());
+ to_del = to_del.objects(ObjectIdentifier::builder().key(k).build().unwrap());
}
}
@@ -223,7 +247,7 @@ async fn test_deleteobject() {
.unwrap();
if i > 0 {
- to_del = to_del.objects(ObjectIdentifier::builder().key(k).build());
+ to_del = to_del.objects(ObjectIdentifier::builder().key(k).build().unwrap());
}
}
@@ -247,7 +271,7 @@ async fn test_deleteobject() {
.client
.delete_objects()
.bucket(&bucket)
- .delete(to_del.build())
+ .delete(to_del.build().unwrap())
.send()
.await
.unwrap();
diff --git a/src/garage/tests/s3/streaming_signature.rs b/src/garage/tests/s3/streaming_signature.rs
index b7a1acae..224b9ed5 100644
--- a/src/garage/tests/s3/streaming_signature.rs
+++ b/src/garage/tests/s3/streaming_signature.rs
@@ -57,9 +57,9 @@ async fn test_putobject_streaming() {
// assert_eq!(o.version_id.unwrap(), _version);
assert_eq!(o.content_type.unwrap(), content_type);
assert!(o.last_modified.is_some());
- assert_eq!(o.content_length, 0);
- assert_eq!(o.parts_count, 0);
- assert_eq!(o.tag_count, 0);
+ assert_eq!(o.content_length.unwrap(), 0);
+ assert_eq!(o.parts_count, None);
+ assert_eq!(o.tag_count, None);
}
{
@@ -95,9 +95,9 @@ async fn test_putobject_streaming() {
assert_bytes_eq!(o.body, BODY);
assert_eq!(o.e_tag.unwrap(), etag);
assert!(o.last_modified.is_some());
- assert_eq!(o.content_length, 62);
- assert_eq!(o.parts_count, 0);
- assert_eq!(o.tag_count, 0);
+ assert_eq!(o.content_length.unwrap(), 62);
+ assert_eq!(o.parts_count, None);
+ assert_eq!(o.tag_count, None);
}
}
@@ -187,7 +187,7 @@ async fn test_put_website_streaming() {
.await
.unwrap();
- assert_eq!(o.index_document.unwrap().suffix.unwrap(), "home.html");
- assert_eq!(o.error_document.unwrap().key.unwrap(), "err/error.html");
+ assert_eq!(o.index_document.unwrap().suffix, "home.html");
+ assert_eq!(o.error_document.unwrap().key, "err/error.html");
}
}
diff --git a/src/garage/tests/s3/website.rs b/src/garage/tests/s3/website.rs
index eeafb5fa..0cadc388 100644
--- a/src/garage/tests/s3/website.rs
+++ b/src/garage/tests/s3/website.rs
@@ -8,15 +8,18 @@ use aws_sdk_s3::{
types::{CorsConfiguration, CorsRule, ErrorDocument, IndexDocument, WebsiteConfiguration},
};
use http::{Request, StatusCode};
-use hyper::{
- body::{to_bytes, Body},
- Client,
-};
+use http_body_util::BodyExt;
+use http_body_util::Full as FullBody;
+use hyper::body::Bytes;
+use hyper_util::client::legacy::Client;
+use hyper_util::rt::TokioExecutor;
use serde_json::json;
const BODY: &[u8; 16] = b"<h1>bonjour</h1>";
const BODY_ERR: &[u8; 6] = b"erreur";
+pub type Body = FullBody<Bytes>;
+
#[tokio::test]
async fn test_website() {
const BCKT_NAME: &str = "my-website";
@@ -34,14 +37,14 @@ async fn test_website() {
.await
.unwrap();
- let client = Client::new();
+ let client = Client::builder(TokioExecutor::new()).build_http();
let req = || {
Request::builder()
.method("GET")
.uri(format!("http://127.0.0.1:{}/", ctx.garage.web_port))
.header("Host", format!("{}.web.garage", BCKT_NAME))
- .body(Body::empty())
+ .body(Body::new(Bytes::new()))
.unwrap()
};
@@ -49,7 +52,7 @@ async fn test_website() {
assert_eq!(resp.status(), StatusCode::NOT_FOUND);
assert_ne!(
- to_bytes(resp.body_mut()).await.unwrap().as_ref(),
+ BodyExt::collect(resp.into_body()).await.unwrap().to_bytes(),
BODY.as_ref()
); /* check that we do not leak body */
@@ -58,10 +61,9 @@ async fn test_website() {
.method("GET")
.uri(format!(
"http://127.0.0.1:{0}/check?domain={1}",
- ctx.garage.admin_port,
- BCKT_NAME.to_string()
+ ctx.garage.admin_port, BCKT_NAME
))
- .body(Body::empty())
+ .body(Body::new(Bytes::new()))
.unwrap()
};
@@ -87,7 +89,7 @@ async fn test_website() {
resp = client.request(req()).await.unwrap();
assert_eq!(resp.status(), StatusCode::OK);
assert_eq!(
- to_bytes(resp.body_mut()).await.unwrap().as_ref(),
+ resp.into_body().collect().await.unwrap().to_bytes(),
BODY.as_ref()
);
@@ -103,14 +105,14 @@ async fn test_website() {
"http://127.0.0.1:{0}/check?domain={1}",
ctx.garage.admin_port, bname
))
- .body(Body::empty())
+ .body(Body::new(Bytes::new()))
.unwrap()
};
- let mut admin_resp = client.request(admin_req()).await.unwrap();
+ let admin_resp = client.request(admin_req()).await.unwrap();
assert_eq!(admin_resp.status(), StatusCode::OK);
assert_eq!(
- to_bytes(admin_resp.body_mut()).await.unwrap().as_ref(),
+ admin_resp.into_body().collect().await.unwrap().to_bytes(),
format!("Domain '{bname}' is managed by Garage").as_bytes()
);
}
@@ -124,7 +126,7 @@ async fn test_website() {
resp = client.request(req()).await.unwrap();
assert_eq!(resp.status(), StatusCode::NOT_FOUND);
assert_ne!(
- to_bytes(resp.body_mut()).await.unwrap().as_ref(),
+ resp.into_body().collect().await.unwrap().to_bytes(),
BODY.as_ref()
); /* check that we do not leak body */
@@ -133,10 +135,9 @@ async fn test_website() {
.method("GET")
.uri(format!(
"http://127.0.0.1:{0}/check?domain={1}",
- ctx.garage.admin_port,
- BCKT_NAME.to_string()
+ ctx.garage.admin_port, BCKT_NAME
))
- .body(Body::empty())
+ .body(Body::new(Bytes::new()))
.unwrap()
};
@@ -181,8 +182,18 @@ async fn test_website_s3_api() {
.unwrap();
let conf = WebsiteConfiguration::builder()
- .index_document(IndexDocument::builder().suffix("home.html").build())
- .error_document(ErrorDocument::builder().key("err/error.html").build())
+ .index_document(
+ IndexDocument::builder()
+ .suffix("home.html")
+ .build()
+ .unwrap(),
+ )
+ .error_document(
+ ErrorDocument::builder()
+ .key("err/error.html")
+ .build()
+ .unwrap(),
+ )
.build();
ctx.client
@@ -201,9 +212,11 @@ async fn test_website_s3_api() {
.allowed_methods("GET")
.allowed_methods("PUT")
.allowed_origins("*")
- .build(),
+ .build()
+ .unwrap(),
)
- .build();
+ .build()
+ .unwrap();
ctx.client
.put_bucket_cors()
@@ -222,24 +235,21 @@ async fn test_website_s3_api() {
.await
.unwrap();
- let main_rule = cors_res.cors_rules().unwrap().iter().next().unwrap();
+ let main_rule = cors_res.cors_rules().iter().next().unwrap();
assert_eq!(main_rule.id.as_ref().unwrap(), "main-rule");
assert_eq!(
main_rule.allowed_headers.as_ref().unwrap(),
&vec!["*".to_string()]
);
+ assert_eq!(&main_rule.allowed_origins, &vec!["*".to_string()]);
assert_eq!(
- main_rule.allowed_origins.as_ref().unwrap(),
- &vec!["*".to_string()]
- );
- assert_eq!(
- main_rule.allowed_methods.as_ref().unwrap(),
+ &main_rule.allowed_methods,
&vec!["GET".to_string(), "PUT".to_string()]
);
}
- let client = Client::new();
+ let client = Client::builder(TokioExecutor::new()).build_http();
// Test direct requests with CORS
{
@@ -248,10 +258,10 @@ async fn test_website_s3_api() {
.uri(format!("http://127.0.0.1:{}/site/", ctx.garage.web_port))
.header("Host", format!("{}.web.garage", BCKT_NAME))
.header("Origin", "https://example.com")
- .body(Body::empty())
+ .body(Body::new(Bytes::new()))
.unwrap();
- let mut resp = client.request(req).await.unwrap();
+ let resp = client.request(req).await.unwrap();
assert_eq!(resp.status(), StatusCode::OK);
assert_eq!(
@@ -259,7 +269,7 @@ async fn test_website_s3_api() {
"*"
);
assert_eq!(
- to_bytes(resp.body_mut()).await.unwrap().as_ref(),
+ resp.into_body().collect().await.unwrap().to_bytes(),
BODY.as_ref()
);
}
@@ -273,14 +283,14 @@ async fn test_website_s3_api() {
ctx.garage.web_port
))
.header("Host", format!("{}.web.garage", BCKT_NAME))
- .body(Body::empty())
+ .body(Body::new(Bytes::new()))
.unwrap();
- let mut resp = client.request(req).await.unwrap();
+ let resp = client.request(req).await.unwrap();
assert_eq!(resp.status(), StatusCode::NOT_FOUND);
assert_eq!(
- to_bytes(resp.body_mut()).await.unwrap().as_ref(),
+ resp.into_body().collect().await.unwrap().to_bytes(),
BODY_ERR.as_ref()
);
}
@@ -293,10 +303,10 @@ async fn test_website_s3_api() {
.header("Host", format!("{}.web.garage", BCKT_NAME))
.header("Origin", "https://example.com")
.header("Access-Control-Request-Method", "PUT")
- .body(Body::empty())
+ .body(Body::new(Bytes::new()))
.unwrap();
- let mut resp = client.request(req).await.unwrap();
+ let resp = client.request(req).await.unwrap();
assert_eq!(resp.status(), StatusCode::OK);
assert_eq!(
@@ -304,7 +314,7 @@ async fn test_website_s3_api() {
"*"
);
assert_ne!(
- to_bytes(resp.body_mut()).await.unwrap().as_ref(),
+ resp.into_body().collect().await.unwrap().to_bytes(),
BODY.as_ref()
);
}
@@ -317,14 +327,14 @@ async fn test_website_s3_api() {
.header("Host", format!("{}.web.garage", BCKT_NAME))
.header("Origin", "https://example.com")
.header("Access-Control-Request-Method", "DELETE")
- .body(Body::empty())
+ .body(Body::new(Bytes::new()))
.unwrap();
- let mut resp = client.request(req).await.unwrap();
+ let resp = client.request(req).await.unwrap();
assert_eq!(resp.status(), StatusCode::FORBIDDEN);
assert_ne!(
- to_bytes(resp.body_mut()).await.unwrap().as_ref(),
+ resp.into_body().collect().await.unwrap().to_bytes(),
BODY.as_ref()
);
}
@@ -358,14 +368,14 @@ async fn test_website_s3_api() {
.header("Host", format!("{}.web.garage", BCKT_NAME))
.header("Origin", "https://example.com")
.header("Access-Control-Request-Method", "PUT")
- .body(Body::empty())
+ .body(Body::new(Bytes::new()))
.unwrap();
- let mut resp = client.request(req).await.unwrap();
+ let resp = client.request(req).await.unwrap();
assert_eq!(resp.status(), StatusCode::FORBIDDEN);
assert_ne!(
- to_bytes(resp.body_mut()).await.unwrap().as_ref(),
+ resp.into_body().collect().await.unwrap().to_bytes(),
BODY.as_ref()
);
}
@@ -384,20 +394,15 @@ async fn test_website_s3_api() {
.method("GET")
.uri(format!("http://127.0.0.1:{}/site/", ctx.garage.web_port))
.header("Host", format!("{}.web.garage", BCKT_NAME))
- .body(Body::empty())
+ .body(Body::new(Bytes::new()))
.unwrap();
- let mut resp = client.request(req).await.unwrap();
+ let resp = client.request(req).await.unwrap();
assert_eq!(resp.status(), StatusCode::NOT_FOUND);
- assert_ne!(
- to_bytes(resp.body_mut()).await.unwrap().as_ref(),
- BODY_ERR.as_ref()
- );
- assert_ne!(
- to_bytes(resp.body_mut()).await.unwrap().as_ref(),
- BODY.as_ref()
- );
+ let resp_bytes = resp.into_body().collect().await.unwrap().to_bytes();
+ assert_ne!(resp_bytes, BODY_ERR.as_ref());
+ assert_ne!(resp_bytes, BODY.as_ref());
}
}
@@ -405,13 +410,13 @@ async fn test_website_s3_api() {
async fn test_website_check_domain() {
let ctx = common::context();
- let client = Client::new();
+ let client = Client::builder(TokioExecutor::new()).build_http();
let admin_req = || {
Request::builder()
.method("GET")
.uri(format!("http://127.0.0.1:{}/check", ctx.garage.admin_port))
- .body(Body::empty())
+ .body(Body::new(Bytes::new()))
.unwrap()
};
@@ -435,7 +440,7 @@ async fn test_website_check_domain() {
"http://127.0.0.1:{}/check?domain=",
ctx.garage.admin_port
))
- .body(Body::empty())
+ .body(Body::new(Bytes::new()))
.unwrap()
};
@@ -459,7 +464,7 @@ async fn test_website_check_domain() {
"http://127.0.0.1:{}/check?domain=foobar",
ctx.garage.admin_port
))
- .body(Body::empty())
+ .body(Body::new(Bytes::new()))
.unwrap()
};
@@ -483,7 +488,7 @@ async fn test_website_check_domain() {
"http://127.0.0.1:{}/check?domain=%E2%98%B9",
ctx.garage.admin_port
))
- .body(Body::empty())
+ .body(Body::new(Bytes::new()))
.unwrap()
};
diff --git a/src/k2v-client/Cargo.toml b/src/k2v-client/Cargo.toml
index 2ccb9fe5..694be1f8 100644
--- a/src/k2v-client/Cargo.toml
+++ b/src/k2v-client/Cargo.toml
@@ -9,25 +9,28 @@ repository = "https://git.deuxfleurs.fr/Deuxfleurs/garage"
readme = "../../README.md"
[dependencies]
-base64 = "0.21"
-sha2 = "0.10"
-hex = "0.4"
-http = "0.2"
-log = "0.4"
-aws-sigv4 = "0.55"
-percent-encoding = "2.2"
-hyper = { version = "0.14", default-features = false, features = ["client", "http1", "http2"] }
-hyper-rustls = { version = "0.24", features = ["http2"] }
-serde = { version = "1.0", features = [ "derive" ] }
-serde_json = "1.0"
-thiserror = "1.0"
-tokio = { version = "1.0", default-features = false, features = ["rt", "rt-multi-thread", "io-util", "net", "time", "macros", "sync", "signal", "fs"] }
+base64.workspace = true
+sha2.workspace = true
+hex.workspace = true
+http.workspace = true
+http-body-util.workspace = true
+log.workspace = true
+aws-sigv4.workspace = true
+aws-sdk-config.workspace = true
+percent-encoding.workspace = true
+hyper = { workspace = true, default-features = false, features = ["http1", "http2"] }
+hyper-util.workspace = true
+hyper-rustls.workspace = true
+serde.workspace = true
+serde_json.workspace = true
+thiserror.workspace = true
+tokio.workspace = true
# cli deps
-clap = { version = "4.1", optional = true, features = ["derive", "env"] }
+clap = { workspace = true, optional = true }
format_table = { workspace = true, optional = true }
-tracing = { version = "0.1", optional = true }
-tracing-subscriber = { version = "0.3", optional = true, features = ["env-filter"] }
+tracing = { workspace = true, optional = true }
+tracing-subscriber = { workspace = true, optional = true }
[features]
diff --git a/src/k2v-client/error.rs b/src/k2v-client/error.rs
index 564ce497..96f5674a 100644
--- a/src/k2v-client/error.rs
+++ b/src/k2v-client/error.rs
@@ -22,12 +22,14 @@ pub enum Error {
Http(#[from] http::Error),
#[error("hyper error: {0}")]
Hyper(#[from] hyper::Error),
+ #[error("hyper client error: {0}")]
+ HyperClient(#[from] hyper_util::client::legacy::Error),
#[error("invalid header: {0}")]
Header(#[from] hyper::header::ToStrError),
#[error("deserialization error: {0}")]
Deserialization(#[from] serde_json::Error),
#[error("invalid signature parameters: {0}")]
- SignParameters(#[from] aws_sigv4::signing_params::BuildError),
+ SignParameters(#[from] aws_sigv4::sign::v4::signing_params::BuildError),
#[error("could not sign request: {0}")]
SignRequest(#[from] aws_sigv4::http_request::SigningError),
#[error("request timed out")]
diff --git a/src/k2v-client/lib.rs b/src/k2v-client/lib.rs
index 4aa7a20a..852274a7 100644
--- a/src/k2v-client/lib.rs
+++ b/src/k2v-client/lib.rs
@@ -9,11 +9,15 @@ use percent_encoding::{utf8_percent_encode, AsciiSet, NON_ALPHANUMERIC};
use http::header::{ACCEPT, CONTENT_TYPE};
use http::status::StatusCode;
use http::{HeaderName, HeaderValue, Request};
-use hyper::{body::Bytes, Body};
-use hyper::{client::connect::HttpConnector, Client as HttpClient};
+use http_body_util::{BodyExt, Full as FullBody};
+use hyper::body::Bytes;
use hyper_rustls::HttpsConnector;
+use hyper_util::client::legacy::{connect::HttpConnector, Client as HttpClient};
+use hyper_util::rt::TokioExecutor;
-use aws_sigv4::http_request::{sign, SignableRequest, SigningParams, SigningSettings};
+use aws_sdk_config::config::Credentials;
+use aws_sigv4::http_request::{sign, SignableBody, SignableRequest, SigningSettings};
+use aws_sigv4::sign::v4::SigningParams;
use serde::de::Error as DeError;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
@@ -22,6 +26,8 @@ mod error;
pub use error::Error;
+pub type Body = FullBody<Bytes>;
+
const DEFAULT_TIMEOUT: Duration = Duration::from_secs(5);
const DEFAULT_POLL_TIMEOUT: Duration = Duration::from_secs(300);
const SERVICE: &str = "k2v";
@@ -53,19 +59,19 @@ pub struct K2vClientConfig {
pub struct K2vClient {
config: K2vClientConfig,
user_agent: HeaderValue,
- client: HttpClient<HttpsConnector<HttpConnector>>,
+ client: HttpClient<HttpsConnector<HttpConnector>, Body>,
}
impl K2vClient {
/// Create a new K2V client.
pub fn new(config: K2vClientConfig) -> Result<Self, Error> {
let connector = hyper_rustls::HttpsConnectorBuilder::new()
- .with_native_roots()
+ .with_native_roots()?
.https_or_http()
.enable_http1()
.enable_http2()
.build();
- let client = HttpClient::builder().build(connector);
+ let client = HttpClient::builder(TokioExecutor::new()).build(connector);
let user_agent: std::borrow::Cow<str> = match &config.user_agent {
Some(ua) => ua.into(),
None => format!("k2v/{}", env!("CARGO_PKG_VERSION")).into(),
@@ -363,21 +369,37 @@ impl K2vClient {
// Sign request
let signing_settings = SigningSettings::default();
+ let identity = Credentials::new(
+ &self.config.aws_access_key_id,
+ &self.config.aws_secret_access_key,
+ None,
+ None,
+ "k2v-client",
+ )
+ .into();
let signing_params = SigningParams::builder()
- .access_key(&self.config.aws_access_key_id)
- .secret_key(&self.config.aws_secret_access_key)
+ .identity(&identity)
.region(&self.config.region)
- .service_name(SERVICE)
+ .name(SERVICE)
.time(SystemTime::now())
.settings(signing_settings)
- .build()?;
+ .build()?
+ .into();
// Convert the HTTP request into a signable request
- let signable_request = SignableRequest::from(&req);
+ let signable_request = SignableRequest::new(
+ req.method().as_str(),
+ req.uri().to_string(),
+ // TODO: get rid of Unwrap
+ req.headers()
+ .iter()
+ .map(|(x, y)| (x.as_str(), y.to_str().unwrap())),
+ SignableBody::Bytes(req.body().as_ref()),
+ )?;
// Sign and then apply the signature to the request
let (signing_instructions, _signature) =
sign(signable_request, &signing_params)?.into_parts();
- signing_instructions.apply_to_request(&mut req);
+ signing_instructions.apply_to_request_http1x(&mut req);
// Send and wait for timeout
let res = tokio::select! {
@@ -398,12 +420,16 @@ impl K2vClient {
};
let body = match res.status {
- StatusCode::OK => hyper::body::to_bytes(body).await?,
+ StatusCode::OK => BodyExt::collect(body).await?.to_bytes(),
StatusCode::NO_CONTENT => Bytes::new(),
StatusCode::NOT_FOUND => return Err(Error::NotFound),
StatusCode::NOT_MODIFIED => Bytes::new(),
s => {
- let err_body = hyper::body::to_bytes(body).await.unwrap_or_default();
+ let err_body = body
+ .collect()
+ .await
+ .map(|x| x.to_bytes())
+ .unwrap_or_default();
let err_body_str = std::str::from_utf8(&err_body)
.map(String::from)
.unwrap_or_else(|_| BASE64_STANDARD.encode(&err_body));
@@ -451,7 +477,11 @@ impl K2vClient {
}
fn build_url<V: AsRef<str>>(&self, partition_key: Option<&str>, query: &[(&str, V)]) -> String {
- let mut url = format!("{}/{}", self.config.endpoint, self.config.bucket);
+ let mut url = format!(
+ "{}/{}",
+ self.config.endpoint.trim_end_matches('/'),
+ self.config.bucket
+ );
if let Some(pk) = partition_key {
url.push('/');
url.extend(utf8_percent_encode(pk, &PATH_ENCODE_SET));
diff --git a/src/model/Cargo.toml b/src/model/Cargo.toml
index 124b84b0..fd0abc3a 100644
--- a/src/model/Cargo.toml
+++ b/src/model/Cargo.toml
@@ -20,26 +20,26 @@ garage_table.workspace = true
garage_block.workspace = true
garage_util.workspace = true
-async-trait = "0.1.7"
-arc-swap = "1.0"
-blake2 = "0.10"
-chrono = "0.4"
-err-derive = "0.3"
-hex = "0.4"
-base64 = "0.21"
-tracing = "0.1"
-rand = "0.8"
-zstd = { version = "0.12", default-features = false }
-
-serde = { version = "1.0", default-features = false, features = ["derive", "rc"] }
-serde_bytes = "0.11"
-
-futures = "0.3"
-futures-util = "0.3"
-tokio = { version = "1.0", default-features = false, features = ["rt", "rt-multi-thread", "io-util", "net", "time", "macros", "sync", "signal", "fs"] }
-opentelemetry = "0.17"
-
-netapp = "0.10"
+async-trait.workspace = true
+arc-swap.workspace = true
+blake2.workspace = true
+chrono.workspace = true
+err-derive.workspace = true
+hex.workspace = true
+base64.workspace = true
+tracing.workspace = true
+rand.workspace = true
+zstd.workspace = true
+
+serde.workspace = true
+serde_bytes.workspace = true
+
+futures.workspace = true
+futures-util.workspace = true
+tokio.workspace = true
+opentelemetry.workspace = true
+
+netapp.workspace = true
[features]
default = [ "sled", "lmdb", "sqlite" ]
diff --git a/src/model/helper/bucket.rs b/src/model/helper/bucket.rs
index efa3e27b..222cfc83 100644
--- a/src/model/helper/bucket.rs
+++ b/src/model/helper/bucket.rs
@@ -126,7 +126,7 @@ impl<'a> BucketHelper<'a> {
}
// Checks ok, add alias
- let mut bucket_p = bucket.state.as_option_mut().unwrap();
+ let bucket_p = bucket.state.as_option_mut().unwrap();
let alias_ts = increment_logical_clock_2(
bucket_p.aliases.get_timestamp(alias_name),
@@ -163,7 +163,7 @@ impl<'a> BucketHelper<'a> {
alias_name: &String,
) -> Result<(), Error> {
let mut bucket = self.get_existing_bucket(bucket_id).await?;
- let mut bucket_state = bucket.state.as_option_mut().unwrap();
+ let bucket_state = bucket.state.as_option_mut().unwrap();
let mut alias = self
.0
@@ -245,7 +245,7 @@ impl<'a> BucketHelper<'a> {
self.0.bucket_alias_table.insert(&alias).await?;
}
- if let Some(mut bucket_state) = bucket.state.as_option_mut() {
+ if let Some(bucket_state) = bucket.state.as_option_mut() {
bucket_state.aliases = LwwMap::raw_item(alias_name.clone(), alias_ts, false);
self.0.bucket_table.insert(&bucket).await?;
}
@@ -274,7 +274,7 @@ impl<'a> BucketHelper<'a> {
let mut bucket = self.get_existing_bucket(bucket_id).await?;
let mut key = key_helper.get_existing_key(key_id).await?;
- let mut key_param = key.state.as_option_mut().unwrap();
+ let key_param = key.state.as_option_mut().unwrap();
if let Some(Some(existing_alias)) = key_param.local_aliases.get(alias_name) {
if *existing_alias != bucket_id {
@@ -283,7 +283,7 @@ impl<'a> BucketHelper<'a> {
}
// Checks ok, add alias
- let mut bucket_p = bucket.state.as_option_mut().unwrap();
+ let bucket_p = bucket.state.as_option_mut().unwrap();
let bucket_p_local_alias_key = (key.key_id.clone(), alias_name.clone());
// Calculate the timestamp to assign to this aliasing in the two local_aliases maps
@@ -326,7 +326,7 @@ impl<'a> BucketHelper<'a> {
let mut bucket = self.get_existing_bucket(bucket_id).await?;
let mut key = key_helper.get_existing_key(key_id).await?;
- let mut bucket_p = bucket.state.as_option_mut().unwrap();
+ let bucket_p = bucket.state.as_option_mut().unwrap();
if key
.state
@@ -359,7 +359,7 @@ impl<'a> BucketHelper<'a> {
}
// Checks ok, remove alias
- let mut key_param = key.state.as_option_mut().unwrap();
+ let key_param = key.state.as_option_mut().unwrap();
let bucket_p_local_alias_key = (key.key_id.clone(), alias_name.clone());
let alias_ts = increment_logical_clock_2(
diff --git a/src/model/index_counter.rs b/src/model/index_counter.rs
index e8702bf1..aa13ee7b 100644
--- a/src/model/index_counter.rs
+++ b/src/model/index_counter.rs
@@ -232,7 +232,7 @@ impl<T: CountedItem> IndexCounter<T> {
let now = now_msec();
for (s, inc) in counts.iter() {
- let mut ent = entry.values.entry(s.to_string()).or_insert((0, 0));
+ let ent = entry.values.entry(s.to_string()).or_insert((0, 0));
ent.0 = std::cmp::max(ent.0 + 1, now);
ent.1 += *inc;
}
@@ -348,7 +348,7 @@ impl<T: CountedItem> IndexCounter<T> {
},
};
for (s, v) in counts.iter() {
- let mut tv = local_counter.values.entry(s.to_string()).or_insert((0, 0));
+ let tv = local_counter.values.entry(s.to_string()).or_insert((0, 0));
tv.0 = std::cmp::max(tv.0 + 1, now);
tv.1 += v;
}
diff --git a/src/rpc/Cargo.toml b/src/rpc/Cargo.toml
index e19f80a8..1b2867a5 100644
--- a/src/rpc/Cargo.toml
+++ b/src/rpc/Cargo.toml
@@ -18,38 +18,38 @@ format_table.workspace = true
garage_db.workspace = true
garage_util.workspace = true
-arc-swap = "1.0"
-bytes = "1.0"
-bytesize = "1.1"
-gethostname = "0.4"
-hex = "0.4"
-tracing = "0.1"
-rand = "0.8"
-itertools="0.10"
-sodiumoxide = { version = "0.2.5-0", package = "kuska-sodiumoxide" }
-nix = { version = "0.27", default-features = false, features = ["fs"] }
-
-async-trait = "0.1.7"
-serde = { version = "1.0", default-features = false, features = ["derive", "rc"] }
-serde_bytes = "0.11"
-serde_json = "1.0"
-err-derive = { version = "0.3", optional = true }
+arc-swap.workspace = true
+bytes.workspace = true
+bytesize.workspace = true
+gethostname.workspace = true
+hex.workspace = true
+tracing.workspace = true
+rand.workspace = true
+itertools.workspace = true
+sodiumoxide.workspace = true
+nix.workspace = true
+
+async-trait.workspace = true
+serde.workspace = true
+serde_bytes.workspace = true
+serde_json.workspace = true
+err-derive = { workspace = true, optional = true }
# newer version requires rust edition 2021
-kube = { version = "0.75", default-features = false, features = ["runtime", "derive", "client", "rustls-tls"], optional = true }
-k8s-openapi = { version = "0.16", features = ["v1_22"], optional = true }
-schemars = { version = "0.8", optional = true }
-reqwest = { version = "0.11", optional = true, default-features = false, features = ["rustls-tls-manual-roots", "json"] }
+kube = { workspace = true, optional = true }
+k8s-openapi = { workspace = true, optional = true }
+schemars = { workspace = true, optional = true }
+reqwest = { workspace = true, optional = true }
-pnet_datalink = "0.33"
+pnet_datalink.workspace = true
-futures = "0.3"
-futures-util = "0.3"
-tokio = { version = "1.0", default-features = false, features = ["rt", "rt-multi-thread", "io-util", "net", "time", "macros", "sync", "signal", "fs"] }
-tokio-stream = { version = "0.1", features = ["net"] }
-opentelemetry = "0.17"
+futures.workspace = true
+futures-util.workspace = true
+tokio.workspace = true
+tokio-stream.workspace = true
+opentelemetry.workspace = true
-netapp = { version = "0.10", features = ["telemetry"] }
+netapp.workspace = true
[features]
kubernetes-discovery = [ "kube", "k8s-openapi", "schemars" ]
diff --git a/src/rpc/consul.rs b/src/rpc/consul.rs
index ab8d1112..71fd71b0 100644
--- a/src/rpc/consul.rs
+++ b/src/rpc/consul.rs
@@ -148,7 +148,7 @@ impl ConsulDiscovery {
ret.push((pubkey, SocketAddr::new(ip, ent.service_port)));
} else {
warn!(
- "Could not process node spec from Consul: {:?} (invalid IP or public key)",
+ "Could not process node spec from Consul: {:?} (invalid IP address or node ID/pubkey)",
ent
);
}
diff --git a/src/rpc/system.rs b/src/rpc/system.rs
index 83cc6816..f22247c3 100644
--- a/src/rpc/system.rs
+++ b/src/rpc/system.rs
@@ -57,7 +57,7 @@ pub const SYSTEM_RPC_PATH: &str = "garage_rpc/system.rs/SystemRpc";
pub enum SystemRpc {
/// Response to successfull advertisements
Ok,
- /// Request to connect to a specific node (in <pubkey>@<host>:<port> format)
+ /// Request to connect to a specific node (in <pubkey>@<host>:<port> format, pubkey = full-length node ID)
Connect(String),
/// Advertise Garage status. Answered with another AdvertiseStatus.
/// Exchanged with every node on a regular basis.
diff --git a/src/table/Cargo.toml b/src/table/Cargo.toml
index 62cffac7..cac17da6 100644
--- a/src/table/Cargo.toml
+++ b/src/table/Cargo.toml
@@ -18,19 +18,19 @@ garage_db.workspace = true
garage_rpc.workspace = true
garage_util.workspace = true
-opentelemetry = "0.17"
+opentelemetry.workspace = true
-async-trait = "0.1.7"
-arc-swap = "1.0"
-bytes = "1.0"
-hex = "0.4"
-hexdump = "0.1"
-tracing = "0.1"
-rand = "0.8"
+async-trait.workspace = true
+arc-swap.workspace = true
+bytes.workspace = true
+hex.workspace = true
+hexdump.workspace = true
+tracing.workspace = true
+rand.workspace = true
-serde = { version = "1.0", default-features = false, features = ["derive", "rc"] }
-serde_bytes = "0.11"
+serde.workspace = true
+serde_bytes.workspace = true
-futures = "0.3"
-futures-util = "0.3"
-tokio = { version = "1.0", default-features = false, features = ["rt", "rt-multi-thread", "io-util", "net", "time", "macros", "sync", "signal", "fs"] }
+futures.workspace = true
+futures-util.workspace = true
+tokio.workspace = true
diff --git a/src/util/Cargo.toml b/src/util/Cargo.toml
index afc4d3c3..d72245dd 100644
--- a/src/util/Cargo.toml
+++ b/src/util/Cargo.toml
@@ -16,42 +16,42 @@ path = "lib.rs"
[dependencies]
garage_db.workspace = true
-arc-swap = "1.0"
-async-trait = "0.1"
-blake2 = "0.10"
-bytes = "1.0"
-bytesize = "1.2"
-digest = "0.10"
-err-derive = "0.3"
-hexdump = "0.1"
-xxhash-rust = { version = "0.8", default-features = false, features = ["xxh3"] }
-hex = "0.4"
-lazy_static = "1.4"
-tracing = "0.1"
-rand = "0.8"
-sha2 = "0.10"
-
-chrono = "0.4"
-rmp-serde = "1.1.2"
-serde = { version = "1.0", default-features = false, features = ["derive", "rc"] }
-serde_json = "1.0"
-toml = "0.6"
-
-futures = "0.3"
-tokio = { version = "1.0", default-features = false, features = ["rt", "rt-multi-thread", "io-util", "net", "time", "macros", "sync", "signal", "fs"] }
-
-netapp = "0.10"
-
-http = "0.2"
-hyper = "0.14"
-
-opentelemetry = { version = "0.17", features = [ "rt-tokio", "metrics", "trace" ] }
+arc-swap.workspace = true
+async-trait.workspace = true
+blake2.workspace = true
+bytes.workspace = true
+bytesize.workspace = true
+digest.workspace = true
+err-derive.workspace = true
+hexdump.workspace = true
+xxhash-rust.workspace = true
+hex.workspace = true
+lazy_static.workspace = true
+tracing.workspace = true
+rand.workspace = true
+sha2.workspace = true
+
+chrono.workspace = true
+rmp-serde.workspace = true
+serde.workspace = true
+serde_json.workspace = true
+toml.workspace = true
+
+futures.workspace = true
+tokio.workspace = true
+
+netapp.workspace = true
+
+http.workspace = true
+hyper.workspace = true
+
+opentelemetry.workspace = true
[build-dependencies]
-rustc_version = "0.4.0"
+rustc_version.workspace = true
[dev-dependencies]
-mktemp = "0.5"
+mktemp.workspace = true
[features]
k2v = []
diff --git a/src/util/config.rs b/src/util/config.rs
index ad5c8e1f..a9a72110 100644
--- a/src/util/config.rs
+++ b/src/util/config.rs
@@ -1,6 +1,5 @@
//! Contains type and functions related to Garage configuration file
use std::convert::TryFrom;
-use std::io::Read;
use std::net::SocketAddr;
use std::path::PathBuf;
@@ -45,11 +44,15 @@ pub struct Config {
)]
pub compression_level: Option<i32>,
+ /// Skip the permission check of secret files. Useful when
+ /// POSIX ACLs (or more complex chmods) are used.
+ #[serde(default)]
+ pub allow_world_readable_secrets: bool,
+
/// RPC secret key: 32 bytes hex encoded
pub rpc_secret: Option<String>,
/// Optional file where RPC secret key is read from
- pub rpc_secret_file: Option<String>,
-
+ pub rpc_secret_file: Option<PathBuf>,
/// Address to bind for RPC
pub rpc_bind_addr: SocketAddr,
/// Public IP address of this node
@@ -163,12 +166,12 @@ pub struct AdminConfig {
/// Bearer token to use to scrape metrics
pub metrics_token: Option<String>,
/// File to read metrics token from
- pub metrics_token_file: Option<String>,
+ pub metrics_token_file: Option<PathBuf>,
/// Bearer token to use to access Admin API endpoints
pub admin_token: Option<String>,
/// File to read admin token from
- pub admin_token_file: Option<String>,
+ pub admin_token_file: Option<PathBuf>,
/// OTLP server to where to export traces
pub trace_sink: Option<String>,
@@ -221,6 +224,13 @@ pub struct KubernetesDiscoveryConfig {
pub skip_crd: bool,
}
+/// Read and parse configuration
+pub fn read_config(config_file: PathBuf) -> Result<Config, Error> {
+ let config = std::fs::read_to_string(config_file)?;
+
+ Ok(toml::from_str(&config)?)
+}
+
fn default_db_engine() -> String {
"lmdb".into()
}
@@ -235,68 +245,6 @@ fn default_block_size() -> usize {
1048576
}
-/// Read and parse configuration
-pub fn read_config(config_file: PathBuf) -> Result<Config, Error> {
- let mut file = std::fs::OpenOptions::new()
- .read(true)
- .open(config_file.as_path())?;
-
- let mut config = String::new();
- file.read_to_string(&mut config)?;
-
- let mut parsed_config: Config = toml::from_str(&config)?;
-
- secret_from_file(
- &mut parsed_config.rpc_secret,
- &parsed_config.rpc_secret_file,
- "rpc_secret",
- )?;
- secret_from_file(
- &mut parsed_config.admin.metrics_token,
- &parsed_config.admin.metrics_token_file,
- "admin.metrics_token",
- )?;
- secret_from_file(
- &mut parsed_config.admin.admin_token,
- &parsed_config.admin.admin_token_file,
- "admin.admin_token",
- )?;
-
- Ok(parsed_config)
-}
-
-fn secret_from_file(
- secret: &mut Option<String>,
- secret_file: &Option<String>,
- name: &'static str,
-) -> Result<(), Error> {
- match (&secret, &secret_file) {
- (_, None) => {
- // no-op
- }
- (Some(_), Some(_)) => {
- return Err(format!("only one of `{}` and `{}_file` can be set", name, name).into());
- }
- (None, Some(file_path)) => {
- #[cfg(unix)]
- if std::env::var("GARAGE_ALLOW_WORLD_READABLE_SECRETS").as_deref() != Ok("true") {
- use std::os::unix::fs::MetadataExt;
- let metadata = std::fs::metadata(file_path)?;
- if metadata.mode() & 0o077 != 0 {
- return Err(format!("File {} is world-readable! (mode: 0{:o}, expected 0600)\nRefusing to start until this is fixed, or environment variable GARAGE_ALLOW_WORLD_READABLE_SECRETS is set to true.", file_path, metadata.mode()).into());
- }
- }
- let mut file = std::fs::OpenOptions::new().read(true).open(file_path)?;
- let mut secret_buf = String::new();
- file.read_to_string(&mut secret_buf)?;
- // trim_end: allows for use case such as `echo "$(openssl rand -hex 32)" > somefile`.
- // also editors sometimes add a trailing newline
- *secret = Some(String::from(secret_buf.trim_end()));
- }
- }
- Ok(())
-}
-
fn default_compression() -> Option<i32> {
Some(1)
}
@@ -425,83 +373,4 @@ mod tests {
Ok(())
}
-
- #[test]
- fn test_rpc_secret_file_works() -> Result<(), Error> {
- let path_secret = mktemp::Temp::new_file()?;
- let mut file_secret = File::create(path_secret.as_path())?;
- writeln!(file_secret, "foo")?;
- drop(file_secret);
-
- let path_config = mktemp::Temp::new_file()?;
- let mut file_config = File::create(path_config.as_path())?;
- let path_secret_path = path_secret.as_path();
- writeln!(
- file_config,
- r#"
- metadata_dir = "/tmp/garage/meta"
- data_dir = "/tmp/garage/data"
- replication_mode = "3"
- rpc_bind_addr = "[::]:3901"
- rpc_secret_file = "{}"
-
- [s3_api]
- s3_region = "garage"
- api_bind_addr = "[::]:3900"
- "#,
- path_secret_path.display()
- )?;
- let config = super::read_config(path_config.to_path_buf())?;
- assert_eq!("foo", config.rpc_secret.unwrap());
-
- #[cfg(unix)]
- {
- use std::os::unix::fs::PermissionsExt;
- let metadata = std::fs::metadata(&path_secret_path)?;
- let mut perm = metadata.permissions();
- perm.set_mode(0o660);
- std::fs::set_permissions(&path_secret_path, perm)?;
-
- std::env::set_var("GARAGE_ALLOW_WORLD_READABLE_SECRETS", "false");
- assert!(super::read_config(path_config.to_path_buf()).is_err());
-
- std::env::set_var("GARAGE_ALLOW_WORLD_READABLE_SECRETS", "true");
- assert!(super::read_config(path_config.to_path_buf()).is_ok());
- }
-
- drop(path_config);
- drop(path_secret);
- drop(file_config);
- Ok(())
- }
-
- #[test]
- fn test_rcp_secret_and_rpc_secret_file_cannot_be_set_both() -> Result<(), Error> {
- let path_config = mktemp::Temp::new_file()?;
- let mut file_config = File::create(path_config.as_path())?;
- writeln!(
- file_config,
- r#"
- metadata_dir = "/tmp/garage/meta"
- data_dir = "/tmp/garage/data"
- replication_mode = "3"
- rpc_bind_addr = "[::]:3901"
- rpc_secret= "dummy"
- rpc_secret_file = "dummy"
-
- [s3_api]
- s3_region = "garage"
- api_bind_addr = "[::]:3900"
- "#
- )?;
- assert_eq!(
- "only one of `rpc_secret` and `rpc_secret_file` can be set",
- super::read_config(path_config.to_path_buf())
- .unwrap_err()
- .to_string()
- );
- drop(path_config);
- drop(file_config);
- Ok(())
- }
}
diff --git a/src/web/Cargo.toml b/src/web/Cargo.toml
index 9f7720da..49549c9b 100644
--- a/src/web/Cargo.toml
+++ b/src/web/Cargo.toml
@@ -19,16 +19,17 @@ garage_model.workspace = true
garage_util.workspace = true
garage_table.workspace = true
-err-derive = "0.3"
-tracing = "0.1"
-percent-encoding = "2.1.0"
+err-derive.workspace = true
+tracing.workspace = true
+percent-encoding.workspace = true
-futures = "0.3"
+futures.workspace = true
-http = "0.2"
-hyper = { version = "0.14", features = ["server", "http1", "runtime", "tcp", "stream"] }
-hyperlocal = { version = "0.8.0", default-features = false, features = ["server"] }
+http.workspace = true
+http-body-util.workspace = true
+hyper.workspace = true
+hyper-util.workspace = true
-tokio = { version = "1.0", default-features = false, features = ["net"] }
+tokio.workspace = true
-opentelemetry = "0.17"
+opentelemetry.workspace = true
diff --git a/src/web/web_server.rs b/src/web/web_server.rs
index 73780efb..0f9b5dc8 100644
--- a/src/web/web_server.rs
+++ b/src/web/web_server.rs
@@ -2,19 +2,15 @@ use std::fs::{self, Permissions};
use std::os::unix::prelude::PermissionsExt;
use std::{convert::Infallible, sync::Arc};
-use futures::future::Future;
+use tokio::net::{TcpListener, UnixListener};
+use tokio::sync::watch;
use hyper::{
+ body::Incoming as IncomingBody,
header::{HeaderValue, HOST},
- server::conn::AddrStream,
- service::{make_service_fn, service_fn},
- Body, Method, Request, Response, Server, StatusCode,
+ Method, Request, Response, StatusCode,
};
-use hyperlocal::UnixServerExt;
-
-use tokio::net::UnixStream;
-
use opentelemetry::{
global,
metrics::{Counter, ValueRecorder},
@@ -24,7 +20,8 @@ use opentelemetry::{
use crate::error::*;
-use garage_api::helpers::{authority_to_host, host_to_bucket};
+use garage_api::generic_server::{server_loop, UnixListenerOn};
+use garage_api::helpers::*;
use garage_api::s3::cors::{add_cors_headers, find_matching_cors_rule, handle_options_for_bucket};
use garage_api::s3::error::{
CommonErrorDerivative, Error as ApiError, OkOrBadRequest, OkOrInternalError,
@@ -74,78 +71,53 @@ pub struct WebServer {
impl WebServer {
/// Run a web server
- pub async fn run(
- garage: Arc<Garage>,
- addr: UnixOrTCPSocketAddress,
- root_domain: String,
- shutdown_signal: impl Future<Output = ()>,
- ) -> Result<(), GarageError> {
+ pub fn new(garage: Arc<Garage>, root_domain: String) -> Arc<Self> {
let metrics = Arc::new(WebMetrics::new());
- let web_server = Arc::new(WebServer {
+ Arc::new(WebServer {
garage,
metrics,
root_domain,
- });
-
- let tcp_service = make_service_fn(|conn: &AddrStream| {
- let web_server = web_server.clone();
-
- let client_addr = conn.remote_addr();
- async move {
- Ok::<_, Error>(service_fn(move |req: Request<Body>| {
- let web_server = web_server.clone();
-
- web_server.handle_request(req, client_addr.to_string())
- }))
- }
- });
-
- let unix_service = make_service_fn(|_: &UnixStream| {
- let web_server = web_server.clone();
-
- let path = addr.to_string();
- async move {
- Ok::<_, Error>(service_fn(move |req: Request<Body>| {
- let web_server = web_server.clone();
-
- web_server.handle_request(req, path.clone())
- }))
- }
- });
+ })
+ }
- info!("Web server listening on {}", addr);
+ pub async fn run(
+ self: Arc<Self>,
+ bind_addr: UnixOrTCPSocketAddress,
+ must_exit: watch::Receiver<bool>,
+ ) -> Result<(), GarageError> {
+ let server_name = "Web".into();
+ info!("Web server listening on {}", bind_addr);
- match addr {
+ match bind_addr {
UnixOrTCPSocketAddress::TCPSocket(addr) => {
- Server::bind(&addr)
- .serve(tcp_service)
- .with_graceful_shutdown(shutdown_signal)
- .await?
+ let listener = TcpListener::bind(addr).await?;
+
+ let handler =
+ move |stream, socketaddr| self.clone().handle_request(stream, socketaddr);
+ server_loop(server_name, listener, handler, must_exit).await
}
UnixOrTCPSocketAddress::UnixSocket(ref path) => {
if path.exists() {
fs::remove_file(path)?
}
- let bound = Server::bind_unix(path)?;
+ let listener = UnixListener::bind(path)?;
+ let listener = UnixListenerOn(listener, path.display().to_string());
fs::set_permissions(path, Permissions::from_mode(0o222))?;
- bound
- .serve(unix_service)
- .with_graceful_shutdown(shutdown_signal)
- .await?;
+ let handler =
+ move |stream, socketaddr| self.clone().handle_request(stream, socketaddr);
+ server_loop(server_name, listener, handler, must_exit).await
}
- };
-
- Ok(())
+ }
}
async fn handle_request(
self: Arc<Self>,
- req: Request<Body>,
+ req: Request<IncomingBody>,
addr: String,
- ) -> Result<Response<Body>, Infallible> {
+ ) -> Result<Response<BoxBody<Error>>, http::Error> {
if let Ok(forwarded_for_ip_addr) =
forwarded_headers::handle_forwarded_for_headers(req.headers())
{
@@ -187,7 +159,8 @@ impl WebServer {
match res {
Ok(res) => {
debug!("{} {} {}", req.method(), res.status(), req.uri());
- Ok(res)
+ Ok(res
+ .map(|body| BoxBody::new(http_body_util::BodyExt::map_err(body, Error::from))))
}
Err(error) => {
info!(
@@ -220,7 +193,10 @@ impl WebServer {
Ok(exists)
}
- async fn serve_file(self: &Arc<Self>, req: &Request<Body>) -> Result<Response<Body>, Error> {
+ async fn serve_file(
+ self: &Arc<Self>,
+ req: &Request<IncomingBody>,
+ ) -> Result<Response<BoxBody<ApiError>>, Error> {
// Get http authority string (eg. [::1]:3902 or garage.tld:80)
let authority = req
.headers()
@@ -267,9 +243,21 @@ impl WebServer {
);
let ret_doc = match *req.method() {
- Method::OPTIONS => handle_options_for_bucket(req, &bucket),
- Method::HEAD => handle_head(self.garage.clone(), req, bucket_id, &key, None).await,
- Method::GET => handle_get(self.garage.clone(), req, bucket_id, &key, None).await,
+ Method::OPTIONS => handle_options_for_bucket(req, &bucket)
+ .map_err(ApiError::from)
+ .map(|res| res.map(|_empty_body: EmptyBody| empty_body())),
+ Method::HEAD => handle_head(self.garage.clone(), &req, bucket_id, &key, None).await,
+ Method::GET => {
+ handle_get(
+ self.garage.clone(),
+ &req,
+ bucket_id,
+ &key,
+ None,
+ Default::default(),
+ )
+ .await
+ }
_ => Err(ApiError::bad_request("HTTP method not supported")),
};
@@ -281,7 +269,7 @@ impl WebServer {
Ok(Response::builder()
.status(StatusCode::FOUND)
.header("Location", url)
- .body(Body::empty())
+ .body(empty_body())
.unwrap())
}
_ => ret_doc,
@@ -310,10 +298,18 @@ impl WebServer {
// Create a fake HTTP request with path = the error document
let req2 = Request::builder()
.uri(format!("http://{}/{}", host, &error_document))
- .body(Body::empty())
+ .body(empty_body::<Infallible>())
.unwrap();
- match handle_get(self.garage.clone(), &req2, bucket_id, &error_document, None).await
+ match handle_get(
+ self.garage.clone(),
+ &req2,
+ bucket_id,
+ &error_document,
+ None,
+ Default::default(),
+ )
+ .await
{
Ok(mut error_doc) => {
// The error won't be logged back in handle_request,
@@ -358,7 +354,7 @@ impl WebServer {
}
}
-fn error_to_res(e: Error) -> Response<Body> {
+fn error_to_res(e: Error) -> Response<BoxBody<Error>> {
// If we are here, it is either that:
// - there was an error before trying to get the requested URL
// from the bucket (e.g. bucket not found)
@@ -366,7 +362,7 @@ fn error_to_res(e: Error) -> Response<Body> {
// was a HEAD request or we couldn't get the error document)
// We do NOT enter this code path when returning the bucket's
// error document (this is handled in serve_file)
- let body = Body::from(format!("{}\n", e));
+ let body = string_body(format!("{}\n", e));
let mut http_error = Response::new(body);
*http_error.status_mut() = e.http_status_code();
e.add_headers(http_error.headers_mut());