diff --git a/.docker/.env b/.docker/.env
index 7c9b6e1b99cba36d3523561ec5c9fe567935d80c..821b16a5c08b6577f7aa1728baded9960c24b311 100644
--- a/.docker/.env
+++ b/.docker/.env
@@ -1,11 +1,13 @@
 APP_VERSION=1.8
+FLUENTBIT_VERSION=4.0.0
+GRAFANA_VERSION=11.4.0
 MARIADB_VERSION=11.3.2
-POSTGRES_VERSION=17.0.0
-KEYCLOAK_VERSION=26.2.2
-RABBITMQ_VERSION=3.13.7
-OPENSEARCH_VERSION=2.10.0
-NGINX_VERSION=1.27.3-alpine3.20-slim
+KEYCLOAK_VERSION=26.2.4
+MYSQLD_EXPORTER_VERSION=0.15.1
+NGINX_VERSION=1.28.0
 OPENLDAP_VERSION=2.6.8
-SEAWEEDFS_VERSION=3.71.0
+OPENSEARCH_VERSION=2.18.0
+POSTGRES_VERSION=17.0.0
 PROMETHEUS_VERSION=2.54.1
-MYSQLD_EXPORTER_VERSION=0.15.1
+RABBITMQ_VERSION=3.13.1
+SEAWEEDFS_VERSION=3.87.0
diff --git a/.docker/docker-compose.yml b/.docker/docker-compose.yml
index e801c4dc9c7c60d5c95d2a1b9da4bbab9aef390c..4e2a940f8ecf5f8e08f844dfdae3b822fcbccc82 100644
--- a/.docker/docker-compose.yml
+++ b/.docker/docker-compose.yml
@@ -1,57 +1,3 @@
-x-resources-nano: &resources-nano
-  resources:
-    reservations:
-      cpus: '0.1'
-      memory: 128M
-    limits:
-      cpus: '0.15'
-      memory: 192M
-
-x-resources-micro: &resources-micro
-  resources:
-    reservations:
-      cpus: '0.25'
-      memory: 256M
-    limits:
-      cpus: '0.375'
-      memory: 384M
-
-x-resources-small: &resources-small
-  resources:
-    reservations:
-      cpus: '0.5'
-      memory: 512M
-    limits:
-      cpus: '0.75'
-      memory: 768M
-
-x-resources-medium: &resources-medium
-  resources:
-    reservations:
-      cpus: '0.5'
-      memory: 1024M
-    limits:
-      cpus: '0.75'
-      memory: 1536M
-
-x-resources-large: &resources-large
-  resources:
-    reservations:
-      cpus: '1'
-      memory: 2048M
-    limits:
-      cpus: '1.5'
-      memory: 3072M
-
-x-resources-xlarge: &resources-xlarge
-  resources:
-    reservations:
-      cpus: '1.5'
-      memory: 3072M
-    limits:
-      cpus: '2'
-      memory: 6144M
-
 x-healthcheck-params: &healthcheck-params
   interval: 30s
   timeout: 10s
@@ -90,8 +36,6 @@ services:
     healthcheck:
       test: /opt/bitnami/scripts/mariadb-galera/healthcheck.sh --connect --innodb_initialized
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-xlarge
     logging:
       driver: json-file
 
@@ -104,12 +48,10 @@ services:
       - --mysqld.address=metadata-db:3306
       - --config.my-cnf=/.my.cnf
     volumes:
-      - ./dbrepo-metadata-db/metrics.cnf:/.my.cnf
+      - ./config/metrics.cnf:/.my.cnf
     healthcheck:
       test: -h
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-nano
     depends_on:
       dbrepo-metadata-db:
         condition: service_healthy
@@ -123,7 +65,7 @@ services:
     image: docker.io/bitnami/mariadb-galera:${MARIADB_VERSION}
     volumes:
       - data-db-data:/var/lib/mysql
-      - ./dbrepo-data-db/1_grant-user.sql:/docker-entrypoint-initdb.d/1_grant-user.sql
+      - ./config/1_grant-user.sql:/docker-entrypoint-initdb.d/1_grant-user.sql
     ports:
       - "3307:3306"
     environment:
@@ -135,8 +77,6 @@ services:
     healthcheck:
       test: /opt/bitnami/scripts/mariadb-galera/healthcheck.sh --connect --innodb_initialized
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-xlarge
     logging:
       driver: json-file
 
@@ -153,8 +93,6 @@ services:
     healthcheck:
       test: -h
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-nano
     depends_on:
       dbrepo-data-db:
         condition: service_healthy
@@ -176,8 +114,6 @@ services:
     healthcheck:
       test: "psql -U ${AUTH_DB_USERNAME:-keycloak} -h 127.0.0.1 -p 5432 -d ${AUTH_DB_NAME:-keycloak} -c 'select version();'"
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-micro
     logging:
       driver: json-file
 
@@ -195,8 +131,6 @@ services:
     healthcheck:
       test: "psql -U ${DASHBOARD_DB_USERNAME:-grafana} -h 127.0.0.1 -p 5432 -d ${DASHBOARD_DB_NAME:-grafana} -c 'select version();'"
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-micro
     logging:
       driver: json-file
 
@@ -231,8 +165,6 @@ services:
     healthcheck:
       test: curl -fsS localhost:8080/realms/master
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-medium
     depends_on:
       dbrepo-identity-service:
         condition: service_healthy
@@ -245,7 +177,7 @@ services:
     init: true
     restart: "no"
     container_name: dbrepo-auth-service-init
-    image: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:${APP_VERSION}
+    image: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.8.2
     environment:
       AUTH_SERVICE_ENDPOINT: ${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080}
       METADATA_DB: "${METADATA_DB:-dbrepo}"
@@ -254,8 +186,6 @@ services:
       READONLY_USERNAME: "${READONLY_USERNAME:-readonly}"
       SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}"
       SYSTEM_PASSWORD: ${SYSTEM_PASSWORD:-admin}
-    deploy:
-      <<: *resources-nano
     depends_on:
       dbrepo-auth-service:
         condition: service_healthy
@@ -270,7 +200,7 @@ services:
     restart: "no"
     container_name: dbrepo-metadata-service
     hostname: metadata-service
-    image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:${APP_VERSION}
+    image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.8.2
     environment:
       ADMIN_EMAIL: "${ADMIN_EMAIL:-noreply@localhost}"
       ANALYSE_SERVICE_ENDPOINT: "${ANALYSE_SERVICE_ENDPOINT:-http://analyse-service:8080}"
@@ -312,8 +242,6 @@ services:
     healthcheck:
       test: curl -sSL localhost:8080/actuator/health/liveness | grep 'UP' || exit 1
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-small
     depends_on:
       dbrepo-auth-service:
         condition: service_healthy
@@ -334,7 +262,7 @@ services:
     restart: "no"
     container_name: dbrepo-analyse-service
     hostname: analyse-service
-    image: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:${APP_VERSION}
+    image: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.8.2
     environment:
       AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client}
       AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}
@@ -351,8 +279,6 @@ services:
     healthcheck:
       test: curl -sSL localhost:8080/health | grep 'UP' || exit 1
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-micro
     logging:
       driver: json-file
 
@@ -378,8 +304,6 @@ services:
     healthcheck:
       test: rabbitmq-diagnostics -q is_running | grep 'is fully booted and running'
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-micro
     logging:
       driver: json-file
 
@@ -395,8 +319,6 @@ services:
     healthcheck:
       test: curl -sSL 127.0.0.1:9200
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-medium
     logging:
       driver: json-file
 
@@ -404,7 +326,7 @@ services:
     restart: "no"
     container_name: dbrepo-search-service
     hostname: search-service
-    image: registry.datalab.tuwien.ac.at/dbrepo/search-service:${APP_VERSION}
+    image: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.8.2
     environment:
       AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client}
       AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT_SECRET:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}
@@ -419,8 +341,6 @@ services:
     healthcheck:
       test: curl -sSL localhost:8080/health | grep 'UP' || exit 1
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-micro
     logging:
       driver: json-file
 
@@ -428,7 +348,7 @@ services:
     restart: "no"
     container_name: dbrepo-ui
     hostname: ui
-    image: registry.datalab.tuwien.ac.at/dbrepo/ui:${APP_VERSION}
+    image: registry.datalab.tuwien.ac.at/dbrepo/ui:1.8.2
     environment:
       NUXT_PUBLIC_API_CLIENT: "${BASE_URL:-http://localhost}"
       NUXT_PUBLIC_API_SERVER: "${BASE_URL:-http://gateway-service}"
@@ -445,8 +365,6 @@ services:
     healthcheck:
       test: curl -fsSL 127.0.0.1:3000 && curl -fsSL 127.0.0.1:3000/health
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-micro
     depends_on:
       dbrepo-search-service:
         condition: service_healthy
@@ -459,16 +377,14 @@ services:
     restart: "no"
     container_name: dbrepo-gateway-service
     hostname: gateway-service
-    image: docker.io/nginx:${NGINX_VERSION}
+    image: docker.io/bitnami/nginx:${NGINX_VERSION}
     ports:
       - "80:8080"
     volumes:
-      - ./config/dbrepo.conf:/etc/nginx/conf.d/default.conf
+      - ./dbrepo-gateway-service/dbrepo.conf:/opt/bitnami/nginx/conf/server_blocks/dbrepo.conf:ro
     healthcheck:
-      test: lsof -i TCP:80 || exit 1
+      test: wget -O- http://127.0.0.1:8080
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-nano
     depends_on:
       dbrepo-analyse-service:
         condition: service_healthy
@@ -505,8 +421,6 @@ services:
     healthcheck:
       test: "ldapwhoami -H ldap://localhost:1389 -D ${IDENTITY_SERVICE_ADMIN_DN:-cn=admin,dc=dbrepo,dc=at} -w ${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin} || exit 1"
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-nano
     logging:
       driver: json-file
 
@@ -515,7 +429,7 @@ services:
     init: true
     container_name: dbrepo-search-service-init
     hostname: search-service-init
-    image: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:${APP_VERSION}
+    image: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.8.2
     environment:
       LOG_LEVEL: ${LOG_LEVEL:-info}
       METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080}
@@ -523,8 +437,6 @@ services:
       OPENSEARCH_PORT: ${OPENSEARCH_PORT:-9200}
       SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}"
       SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}"
-    deploy:
-      <<: *resources-nano
     depends_on:
       dbrepo-search-db:
         condition: service_healthy
@@ -538,15 +450,13 @@ services:
     init: true
     container_name: dbrepo-dashboard-service-init
     hostname: search-dashboard-init
-    image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:${APP_VERSION}
+    image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:1.8.2
     environment:
       LOG_LEVEL: ${LOG_LEVEL:-info}
       DASHBOARD_UI_ENDPOINT: "${DASHBOARD_UI_ENDPOINT:-http://dashboard-ui:3000}"
       METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080}
       SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}"
       SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}"
-    deploy:
-      <<: *resources-nano
     depends_on:
       dbrepo-dashboard-ui:
         condition: service_healthy
@@ -569,8 +479,6 @@ services:
     healthcheck:
       test: echo "cluster.check" | weed shell | grep "checking master.*ok" || exit 1
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-nano
     logging:
       driver: json-file
 
@@ -585,8 +493,6 @@ services:
     healthcheck:
       test: promtool check healthy
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-nano
     logging:
       driver: json-file
 
@@ -595,14 +501,12 @@ services:
     init: true
     container_name: dbrepo-storage-service-init
     hostname: storage-service-init
-    image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:${APP_VERSION}
+    image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.8.2
     environment:
       S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:-seaweedfsadmin}
       S3_BUCKET: "${S3_BUCKET:-dbrepo}"
       S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-seaweedfsadmin}
       STORAGE_ENDPOINT: ${STORAGE_ENDPOINT:-http://storage-service:9000}
-    deploy:
-      <<: *resources-nano
     depends_on:
       dbrepo-storage-service:
         condition: service_healthy
@@ -613,7 +517,7 @@ services:
     restart: "no"
     container_name: dbrepo-data-service
     hostname: data-service
-    image: registry.datalab.tuwien.ac.at/dbrepo/data-service:${APP_VERSION}
+    image: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.8.2
     environment:
       AUTH_SERVICE_CLIENT: "${AUTH_SERVICE_CLIENT:-dbrepo-client}"
       AUTH_SERVICE_CLIENT_SECRET: "${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}"
@@ -648,8 +552,6 @@ services:
     healthcheck:
       test: curl -sSL localhost:8080/actuator/health/liveness | grep 'UP' || exit 1
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-large
     depends_on:
       dbrepo-data-db:
         condition: service_healthy
@@ -660,7 +562,7 @@ services:
     restart: "no"
     container_name: dbrepo-dashboard-ui
     hostname: dashboard-ui
-    image: docker.io/bitnami/grafana:11.5.3
+    image: docker.io/bitnami/grafana:${GRAFANA_VERSION}
     ports:
       - "3000:3000"
     volumes:
@@ -670,6 +572,7 @@ services:
       - ./config/provisioning/dashboards/provider.yaml:/opt/bitnami/grafana/conf/provisioning/dashboards/provider.yaml
       - ./config/provisioning/datasources/infinity.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/infinity.yaml
       - ./config/provisioning/datasources/prometheus.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/prometheus.yaml
+      - ./config/provisioning/datasources/opensearch.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/opensearch.yaml
     environment:
       BASE_URL: "${BASE_URL:-http://localhost}"
       DASHBOARD_DB_NAME: "${DASHBOARD_DB_NAME:-grafana}"
@@ -684,8 +587,6 @@ services:
     healthcheck:
       test: curl -fsSL --head 127.0.0.1:3000
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-nano
     extra_hosts:
       - "localhost:host-gateway"
     logging:
@@ -695,9 +596,7 @@ services:
     restart: "no"
     container_name: dbrepo-dashboard-service
     hostname: dashboard-service
-    image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:${APP_VERSION}
-    ports:
-      - "4070:8080"
+    image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.8.2
     environment:
       AUTH_SERVICE_ENDPOINT: ${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080}
       BASE_URL: "${BASE_URL:-http://localhost}"
@@ -707,8 +606,6 @@ services:
     healthcheck:
       test: curl -fsSL --head 127.0.0.1:8080/health
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-micro
     depends_on:
       dbrepo-dashboard-ui:
         condition: service_healthy
diff --git a/.docs/.openapi/api-analyse.yaml b/.docs/.openapi/api-analyse-service.yaml
similarity index 100%
rename from .docs/.openapi/api-analyse.yaml
rename to .docs/.openapi/api-analyse-service.yaml
diff --git a/.docs/.openapi/api-dashboard-service.yaml b/.docs/.openapi/api-dashboard-service.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a5f61af6c080dcde0d8908da20ac9e53e3e4b0dd
--- /dev/null
+++ b/.docs/.openapi/api-dashboard-service.yaml
@@ -0,0 +1,231 @@
+{
+  "components": {
+    "schemas": {
+      "ApiError": {
+        "properties": {
+          "code": {
+            "example": "error.dashboard.create",
+            "type": "string"
+          },
+          "message": {
+            "example": "Message",
+            "type": "string"
+          },
+          "status": {
+            "example": "BAD_REQUEST",
+            "type": "string"
+          }
+        },
+        "type": "object"
+      }
+    },
+    "securitySchemes": {
+      "basicAuth": {
+        "in": "header",
+        "scheme": "basic",
+        "type": "http"
+      },
+      "bearerAuth": {
+        "bearerFormat": "JWT",
+        "in": "header",
+        "scheme": "bearer",
+        "type": "http"
+      }
+    }
+  },
+  "externalDocs": {
+    "description": "Sourcecode Documentation",
+    "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/"
+  },
+  "info": {
+    "contact": {
+      "email": "andreas.rauber@tuwien.ac.at",
+      "name": "Prof. Andreas Rauber"
+    },
+    "description": "Service that manages the dashboards",
+    "license": {
+      "name": "Apache 2.0",
+      "url": "https://www.apache.org/licenses/LICENSE-2.0"
+    },
+    "title": "Database Repository Dashboard Service API",
+    "version": "1.8.1"
+  },
+  "openapi": "3.0.0",
+  "paths": {
+    "/api/dashboard": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "description": "Creates a dashboard in the Dashboard UI. Requires role `system`.",
+        "operationId": "create_dashboard",
+        "parameters": [
+          {
+            "in": "body",
+            "name": "body",
+            "required": true,
+            "schema": {
+              "properties": {
+                "database_name": {
+                  "example": "some_database",
+                  "type": "string"
+                },
+                "is_public": {
+                  "example": true,
+                  "type": "boolean"
+                },
+                "is_schema_public": {
+                  "example": true,
+                  "type": "boolean"
+                },
+                "owner_username": {
+                  "example": "foobar",
+                  "type": "string"
+                }
+              },
+              "required": [
+                "is_public",
+                "is_schema_public",
+                "database_name",
+                "owner_username"
+              ],
+              "type": "object"
+            }
+          }
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "responses": {
+          "201": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Created dashboard successfully"
+          },
+          "409": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiError"
+                }
+              }
+            },
+            "description": "Dashboard exists with same name"
+          },
+          "500": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiError"
+                }
+              }
+            },
+            "description": "Unexpected system error"
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ],
+        "summary": "Create dashboard",
+        "tags": [
+          "dashboard-endpoint"
+        ]
+      }
+    },
+    "/api/dashboard/{uid}": {
+      "put": {
+        "consumes": [
+          "application/json"
+        ],
+        "description": "Updates a dashboard in the Dashboard UI. Requires role `system`.",
+        "operationId": "update_dashboard",
+        "parameters": [
+          {
+            "in": "path",
+            "name": "uid",
+            "required": true,
+            "schema": {
+              "format": "uuid",
+              "type": "string"
+            }
+          },
+          {
+            "in": "body",
+            "name": "body",
+            "required": true,
+            "schema": {
+              "type": "object"
+            }
+          }
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "responses": {
+          "202": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object"
+                }
+              }
+            },
+            "description": "Updated dashboard successfully"
+          },
+          "404": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiError"
+                }
+              }
+            },
+            "description": "Dashboard not found"
+          },
+          "500": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiError"
+                }
+              }
+            },
+            "description": "Unexpected system error"
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ],
+        "summary": "Update dashboard",
+        "tags": [
+          "dashboard-endpoint"
+        ]
+      }
+    }
+  },
+  "servers": [
+    {
+      "description": "Generated server url",
+      "url": "http://localhost"
+    },
+    {
+      "description": "Sandbox",
+      "url": "https://test.dbrepo.tuwien.ac.at"
+    }
+  ]
+}
diff --git a/.docs/.openapi/api-dashboard.yaml b/.docs/.openapi/api-dashboard.yaml
deleted file mode 100644
index 54a27444f68e0760fded5be2a5b9d1770a1d8c39..0000000000000000000000000000000000000000
--- a/.docs/.openapi/api-dashboard.yaml
+++ /dev/null
@@ -1 +0,0 @@
-"<!doctype html> <html lang=en> <title>500 Internal Server Error</title> <h1>Internal Server Error</h1> <p>The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.</p>"
diff --git a/.docs/.openapi/api-data-service.yaml b/.docs/.openapi/api-data-service.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..826cd46410b65d281c1b52a1c222bc7ad072d0d9
--- /dev/null
+++ b/.docs/.openapi/api-data-service.yaml
@@ -0,0 +1,3884 @@
+{
+  "openapi": "3.1.0",
+  "info": {
+    "title": "Database Repository Data Service API",
+    "description": "Service that manages the data",
+    "contact": {
+      "name": "Prof. Andreas Rauber",
+      "email": "andreas.rauber@tuwien.ac.at"
+    },
+    "license": {
+      "name": "Apache 2.0",
+      "url": "https://www.apache.org/licenses/LICENSE-2.0"
+    },
+    "version": "1.8.2"
+  },
+  "externalDocs": {
+    "description": "Sourcecode Documentation",
+    "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8.2/system-services-metadata/"
+  },
+  "servers": [
+    {
+      "url": "http://localhost",
+      "description": "Development instance"
+    },
+    {
+      "url": "https://test.dbrepo.tuwien.ac.at",
+      "description": "Staging instance"
+    }
+  ],
+  "paths": {
+    "/api/database/{databaseId}/view/{viewId}/data": {
+      "get": {
+        "tags": [
+          "view-endpoint"
+        ],
+        "summary": "Get view data",
+        "description": "Gets data from a view of a database. For private databases, the user needs at least *READ* access to the associated database.",
+        "operationId": "getData",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "viewId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "page",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "size",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "format": "date-time"
+            }
+          },
+          {
+            "name": "Accept",
+            "in": "header",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Retrieved view data",
+            "headers": {
+              "Access-Control-Expose-Headers": {
+                "description": "Expose `X-Count` custom header",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "X-Count": {
+                "description": "Number of rows",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "integer",
+                  "format": "int64"
+                }
+              }
+            },
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "text/csv": {}
+            }
+          },
+          "400": {
+            "description": "Request pagination is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not allowed to retrieve view data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find view in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "406": {
+            "description": "Failed to format data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "409": {
+            "description": "View schema could not be mapped",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to establish connection with the metadata service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      },
+      "head": {
+        "tags": [
+          "view-endpoint"
+        ],
+        "summary": "Get view data",
+        "description": "Gets data from a view of a database. For private databases, the user needs at least *READ* access to the associated database.",
+        "operationId": "getData_1",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "viewId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "page",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "size",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "format": "date-time"
+            }
+          },
+          {
+            "name": "Accept",
+            "in": "header",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Retrieved view data",
+            "headers": {
+              "Access-Control-Expose-Headers": {
+                "description": "Expose `X-Count` custom header",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "X-Count": {
+                "description": "Number of rows",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "integer",
+                  "format": "int64"
+                }
+              }
+            },
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "text/csv": {}
+            }
+          },
+          "400": {
+            "description": "Request pagination is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not allowed to retrieve view data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find view in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "406": {
+            "description": "Failed to format data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "409": {
+            "description": "View schema could not be mapped",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to establish connection with the metadata service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/table/{tableId}/data": {
+      "get": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Get table data",
+        "description": "Gets data from a table with id. For a table in a private database, the user needs to have at least *READ* access to the associated database. Requests with HTTP method **GET** return the full dataset, requests with HTTP method **HEAD** only the number of tuples in the `X-Count` header.",
+        "operationId": "getData_2",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tableId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "format": "date-time"
+            }
+          },
+          {
+            "name": "page",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "size",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "Accept",
+            "in": "header",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Get table data",
+            "headers": {
+              "Access-Control-Expose-Headers": {
+                "description": "Expose `X-Count` custom header",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "X-Count": {
+                "description": "Number of rows",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "integer",
+                  "format": "int64"
+                }
+              }
+            },
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "text/csv": {}
+            }
+          },
+          "400": {
+            "description": "Request pagination or table data select query is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not allowed to get table data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find table in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "406": {
+            "description": "Failed to format data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to establish connection with the metadata service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      },
+      "put": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Update tuple",
+        "description": "Updates a data tuple into a table, then the table statistics are updated. The user needs to have at least *WRITE_OWN* access to the associated database. Requires role `insert-table-data`.",
+        "operationId": "updateRawTuple",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tableId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "Authorization",
+            "in": "header",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/TupleUpdateDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Updated table data"
+          },
+          "400": {
+            "description": "Request pagination or table data select query is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Update table data not allowed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find table in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to establish connection with the metadata service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      },
+      "post": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Insert tuple",
+        "description": "Inserts a data tuple into a table, then the table statistics are updated. The user needs to have at least *WRITE_OWN* access to the associated database. Requires role `insert-table-data`.",
+        "operationId": "insertRawTuple",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tableId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "Authorization",
+            "in": "header",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/TupleDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "description": "Created table data"
+          },
+          "400": {
+            "description": "Request pagination or table data select query is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Create table data not allowed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find table in metadata database or blob in storage service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to establish connection with the metadata service or storage service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      },
+      "delete": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Delete tuple",
+        "description": "Deletes a data tuple into a table, then the table statistics are updated. The user needs to have at least *WRITE_OWN* access to the associated database. Requires role `delete-table-data`.",
+        "operationId": "deleteRawTuple",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tableId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "Authorization",
+            "in": "header",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/TupleDeleteDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Deleted table data"
+          },
+          "400": {
+            "description": "Request pagination or table data select query is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Delete table data not allowed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find table in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to establish connection with the metadata service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      },
+      "head": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Get table data",
+        "description": "Gets data from a table with id. For a table in a private database, the user needs to have at least *READ* access to the associated database. Requests with HTTP method **GET** return the full dataset, requests with HTTP method **HEAD** only the number of tuples in the `X-Count` header.",
+        "operationId": "getData_3",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tableId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "format": "date-time"
+            }
+          },
+          {
+            "name": "page",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "size",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "Accept",
+            "in": "header",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Get table data",
+            "headers": {
+              "Access-Control-Expose-Headers": {
+                "description": "Expose `X-Count` custom header",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "X-Count": {
+                "description": "Number of rows",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "integer",
+                  "format": "int64"
+                }
+              }
+            },
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "text/csv": {}
+            }
+          },
+          "400": {
+            "description": "Request pagination or table data select query is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not allowed to get table data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find table in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "406": {
+            "description": "Failed to format data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to establish connection with the metadata service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/subset/{subsetId}/data": {
+      "get": {
+        "tags": [
+          "subset-endpoint"
+        ],
+        "summary": "Get subset data",
+        "description": "Gets data of subset with id. For private databases, the user needs at least *READ* access to the associated database. Requests with HTTP method **GET** return the subset dataset, requests with HTTP method **HEAD** only the number of rows in the subset dataset in the `X-Count` header",
+        "operationId": "getData_4",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "subsetId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "Accept",
+            "in": "header",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "format": "date-time"
+            }
+          },
+          {
+            "name": "page",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "size",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Retrieved subset data",
+            "headers": {
+              "Access-Control-Expose-Headers": {
+                "description": "Reverse proxy exposing of custom headers",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "X-Count": {
+                "description": "Number of rows",
+                "style": "simple",
+                "schema": {
+                  "type": "string",
+                  "format": "uuid"
+                }
+              },
+              "X-Id": {
+                "description": "The subset id",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "string",
+                  "format": "uuid"
+                }
+              },
+              "X-Headers": {
+                "description": "The list of headers separated by comma",
+                "style": "simple",
+                "schema": {
+                  "type": "string"
+                }
+              }
+            },
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "text/csv": {}
+            }
+          },
+          "400": {
+            "description": "Invalid pagination",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not allowed to retrieve subset data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database in metadata database or query in query store of the data database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "406": {
+            "description": "Failed to format data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to communicate with database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "head": {
+        "tags": [
+          "subset-endpoint"
+        ],
+        "summary": "Get subset data",
+        "description": "Gets data of subset with id. For private databases, the user needs at least *READ* access to the associated database. Requests with HTTP method **GET** return the subset dataset, requests with HTTP method **HEAD** only the number of rows in the subset dataset in the `X-Count` header",
+        "operationId": "getData_5",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "subsetId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "Accept",
+            "in": "header",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "format": "date-time"
+            }
+          },
+          {
+            "name": "page",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "size",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Retrieved subset data",
+            "headers": {
+              "Access-Control-Expose-Headers": {
+                "description": "Reverse proxy exposing of custom headers",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "X-Count": {
+                "description": "Number of rows",
+                "style": "simple",
+                "schema": {
+                  "type": "string",
+                  "format": "uuid"
+                }
+              },
+              "X-Id": {
+                "description": "The subset id",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "string",
+                  "format": "uuid"
+                }
+              },
+              "X-Headers": {
+                "description": "The list of headers separated by comma",
+                "style": "simple",
+                "schema": {
+                  "type": "string"
+                }
+              }
+            },
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "text/csv": {}
+            }
+          },
+          "400": {
+            "description": "Invalid pagination",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not allowed to retrieve subset data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database in metadata database or query in query store of the data database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "406": {
+            "description": "Failed to format data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to communicate with database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/subset/{queryId}": {
+      "put": {
+        "tags": [
+          "subset-endpoint"
+        ],
+        "summary": "Persist subset",
+        "description": "Persists a subset with id. Requires role `persist-query`.",
+        "operationId": "persist",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "queryId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/QueryPersistDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Persisted subset",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/QueryDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Malformed select query",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not allowed to persist subset",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database in metadata database or query in query store of the data database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "417": {
+            "description": "Failed to persist subset",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to communicate with database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/upload": {
+      "post": {
+        "tags": [
+          "upload-endpoint"
+        ],
+        "summary": "Uploads a multipart file",
+        "description": "Uploads a multipart file to the Storage Service. Requires role `upload-file`.",
+        "operationId": "create",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "type": "object",
+                "properties": {
+                  "file": {
+                    "type": "string",
+                    "format": "binary"
+                  }
+                },
+                "required": [
+                  "file"
+                ]
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "description": "Uploaded the file",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ViewDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to establish connection with the storage service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/table/{tableId}/data/import": {
+      "post": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Import dataset",
+        "description": "Imports a dataset in a table. Then update the table statistics. The user needs to have at least *WRITE_OWN* access to the associated database when importing into a owned table. Otherwise *WRITE_ALL* access in needed. Requires role `insert-table-data`.",
+        "operationId": "importDataset",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tableId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "Authorization",
+            "in": "header",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ImportDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Imported dataset successfully"
+          },
+          "400": {
+            "description": "Dataset and/or query are malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Import table dataset not allowed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find table in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to establish connection with the metadata service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/subset": {
+      "get": {
+        "tags": [
+          "subset-endpoint"
+        ],
+        "summary": "Find subsets",
+        "description": "Finds subsets in the query store. When the database schema is marked as hidden, the user needs to be authorized, have at least read-access to the database. The result can be optionally filtered by setting `persisted`. When set to *true*, only persisted queries are returned, otherwise only non-persisted queries are returned.",
+        "operationId": "list",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "persisted",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "boolean"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Found subsets",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/QueryDto"
+                  }
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not allowed to find subsets",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database or user in metadata database or query in query store of the data database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to communicate with database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      },
+      "post": {
+        "tags": [
+          "subset-endpoint"
+        ],
+        "summary": "Create subset",
+        "description": "Creates a subset in the query store of the data database. Can also be used without authentication if (and only if) the database is marked as public (i.e. when `is_public` = `is_schema_public` is set to `true`). Otherwise at least read access is required.",
+        "operationId": "create_1",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "format": "date-time"
+            }
+          },
+          {
+            "name": "page",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          },
+          {
+            "name": "size",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/SubsetDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "description": "Created subset",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "string"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Malformed select query",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not allowed to find subset",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database in metadata database or query in query store of the data database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "406": {
+            "description": "Failed to format data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "417": {
+            "description": "Failed to insert query into query store of data database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "501": {
+            "description": "Failed to execute query as it contains non-supported keywords",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to communicate with database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/table/{tableId}/history": {
+      "get": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Get history",
+        "description": "Gets the insert/delete operations history performed. For tables in private databases, the user needs to have at least *READ* access to the associated database.",
+        "operationId": "getHistory",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tableId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "size",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int64"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Found table history",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/TableHistoryDto"
+                  }
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Invalid pagination size request, must be > 0",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Find table history not allowed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find table history in data database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to establish connection with the metadata service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/subset/{subsetId}": {
+      "get": {
+        "tags": [
+          "subset-endpoint"
+        ],
+        "summary": "Find subset",
+        "description": "Finds a subset in the data database.  When the database schema is marked as hidden, the user needs to be authorized, have at least read-access to the database.  Requests with HTTP header `Accept=application/json` return the metadata, requests with HTTP header `Accept=text/csv` return the data as downloadable file.",
+        "operationId": "findById",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "subsetId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "timestamp",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "format": "date-time"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Found subset",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/QueryDto"
+                }
+              },
+              "text/csv": {}
+            }
+          },
+          "400": {
+            "description": "Malformed select query",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not allowed to find subset",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database in metadata database or query in query store of the data database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "406": {
+            "description": "Failed to find acceptable representation",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to communicate with database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "basicAuth": []
+          },
+          {
+            "bearerAuth": []
+          }
+        ]
+      }
+    }
+  },
+  "components": {
+    "schemas": {
+      "ApiErrorDto": {
+        "type": "object",
+        "properties": {
+          "status": {
+            "type": "string",
+            "enum": [
+              "100 CONTINUE",
+              "101 SWITCHING_PROTOCOLS",
+              "102 PROCESSING",
+              "103 EARLY_HINTS",
+              "103 CHECKPOINT",
+              "200 OK",
+              "201 CREATED",
+              "202 ACCEPTED",
+              "203 NON_AUTHORITATIVE_INFORMATION",
+              "204 NO_CONTENT",
+              "205 RESET_CONTENT",
+              "206 PARTIAL_CONTENT",
+              "207 MULTI_STATUS",
+              "208 ALREADY_REPORTED",
+              "226 IM_USED",
+              "300 MULTIPLE_CHOICES",
+              "301 MOVED_PERMANENTLY",
+              "302 FOUND",
+              "302 MOVED_TEMPORARILY",
+              "303 SEE_OTHER",
+              "304 NOT_MODIFIED",
+              "305 USE_PROXY",
+              "307 TEMPORARY_REDIRECT",
+              "308 PERMANENT_REDIRECT",
+              "400 BAD_REQUEST",
+              "401 UNAUTHORIZED",
+              "402 PAYMENT_REQUIRED",
+              "403 FORBIDDEN",
+              "404 NOT_FOUND",
+              "405 METHOD_NOT_ALLOWED",
+              "406 NOT_ACCEPTABLE",
+              "407 PROXY_AUTHENTICATION_REQUIRED",
+              "408 REQUEST_TIMEOUT",
+              "409 CONFLICT",
+              "410 GONE",
+              "411 LENGTH_REQUIRED",
+              "412 PRECONDITION_FAILED",
+              "413 PAYLOAD_TOO_LARGE",
+              "413 REQUEST_ENTITY_TOO_LARGE",
+              "414 URI_TOO_LONG",
+              "414 REQUEST_URI_TOO_LONG",
+              "415 UNSUPPORTED_MEDIA_TYPE",
+              "416 REQUESTED_RANGE_NOT_SATISFIABLE",
+              "417 EXPECTATION_FAILED",
+              "418 I_AM_A_TEAPOT",
+              "419 INSUFFICIENT_SPACE_ON_RESOURCE",
+              "420 METHOD_FAILURE",
+              "421 DESTINATION_LOCKED",
+              "422 UNPROCESSABLE_ENTITY",
+              "423 LOCKED",
+              "424 FAILED_DEPENDENCY",
+              "425 TOO_EARLY",
+              "426 UPGRADE_REQUIRED",
+              "428 PRECONDITION_REQUIRED",
+              "429 TOO_MANY_REQUESTS",
+              "431 REQUEST_HEADER_FIELDS_TOO_LARGE",
+              "451 UNAVAILABLE_FOR_LEGAL_REASONS",
+              "500 INTERNAL_SERVER_ERROR",
+              "501 NOT_IMPLEMENTED",
+              "502 BAD_GATEWAY",
+              "503 SERVICE_UNAVAILABLE",
+              "504 GATEWAY_TIMEOUT",
+              "505 HTTP_VERSION_NOT_SUPPORTED",
+              "506 VARIANT_ALSO_NEGOTIATES",
+              "507 INSUFFICIENT_STORAGE",
+              "508 LOOP_DETECTED",
+              "509 BANDWIDTH_LIMIT_EXCEEDED",
+              "510 NOT_EXTENDED",
+              "511 NETWORK_AUTHENTICATION_REQUIRED"
+            ],
+            "example": "NOT_FOUND"
+          },
+          "message": {
+            "type": "string",
+            "example": "Error message"
+          },
+          "code": {
+            "type": "string",
+            "example": "error.service.code"
+          }
+        },
+        "required": [
+          "code",
+          "message",
+          "status"
+        ]
+      },
+      "TupleUpdateDto": {
+        "type": "object",
+        "properties": {
+          "data": {
+            "type": "object",
+            "additionalProperties": {
+              "type": "object"
+            },
+            "example": {
+              "key": "value"
+            }
+          },
+          "keys": {
+            "type": "object",
+            "additionalProperties": {
+              "type": "object"
+            },
+            "example": {
+              "id": 1
+            }
+          }
+        },
+        "required": [
+          "data",
+          "keys"
+        ]
+      },
+      "QueryPersistDto": {
+        "type": "object",
+        "properties": {
+          "persist": {
+            "type": "boolean",
+            "example": true
+          }
+        },
+        "required": [
+          "persist"
+        ]
+      },
+      "CreatorBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "e41f94a6-2b94-4a12-ac0e-678684e1c070"
+          },
+          "affiliation": {
+            "type": "string",
+            "example": "Brown University"
+          },
+          "creator_name": {
+            "type": "string",
+            "example": "Carberry, Josiah"
+          },
+          "name_type": {
+            "type": "string",
+            "enum": [
+              "Personal",
+              "Organizational"
+            ],
+            "example": "Personal"
+          },
+          "name_identifier": {
+            "type": "string",
+            "example": "0000-0002-1825-0097"
+          },
+          "name_identifier_scheme": {
+            "type": "string",
+            "enum": [
+              "ORCID",
+              "ROR",
+              "ISNI",
+              "GRID"
+            ],
+            "example": "ORCID"
+          },
+          "affiliation_identifier": {
+            "type": "string",
+            "example": "https://ror.org/05gq02987"
+          },
+          "affiliation_identifier_scheme": {
+            "type": "string",
+            "enum": [
+              "ROR",
+              "GRID",
+              "ISNI"
+            ],
+            "example": "ROR"
+          }
+        },
+        "required": [
+          "creator_name",
+          "id"
+        ]
+      },
+      "IdentifierBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "b97cd56b-66ca-4354-9e6c-f47210cfaaec"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "database",
+              "subset",
+              "table",
+              "view"
+            ],
+            "example": "database"
+          },
+          "creators": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/CreatorBriefDto"
+            }
+          },
+          "titles": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierTitleDto"
+            }
+          },
+          "descriptions": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierDescriptionDto"
+            }
+          },
+          "doi": {
+            "type": "string",
+            "example": "10.1038/nphys1170"
+          },
+          "publisher": {
+            "type": "string",
+            "example": "TU Wien"
+          },
+          "status": {
+            "type": "string",
+            "enum": [
+              "draft",
+              "published"
+            ],
+            "example": "draft"
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc"
+          },
+          "query_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": 1
+          },
+          "table_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": 1
+          },
+          "view_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": 1
+          },
+          "publication_year": {
+            "type": "integer",
+            "format": "int32",
+            "example": 2022
+          },
+          "owned_by": {
+            "type": "string",
+            "format": "uuid",
+            "example": "2f45ef7a-7f9b-4667-9156-152c87fe1ca5"
+          }
+        },
+        "required": [
+          "creators",
+          "database_id",
+          "descriptions",
+          "id",
+          "owned_by",
+          "publication_year",
+          "publisher",
+          "status",
+          "titles",
+          "type"
+        ]
+      },
+      "IdentifierDescriptionDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "e0e9692c-910b-4b60-b53a-fc7c358a917d"
+          },
+          "description": {
+            "type": "string",
+            "example": "Air quality reports at Stephansplatz, Vienna"
+          },
+          "language": {
+            "type": "string",
+            "enum": [
+              "ab",
+              "aa",
+              "af",
+              "ak",
+              "sq",
+              "am",
+              "ar",
+              "an",
+              "hy",
+              "as",
+              "av",
+              "ae",
+              "ay",
+              "az",
+              "bm",
+              "ba",
+              "eu",
+              "be",
+              "bn",
+              "bh",
+              "bi",
+              "bs",
+              "br",
+              "bg",
+              "my",
+              "ca",
+              "km",
+              "ch",
+              "ce",
+              "ny",
+              "zh",
+              "cu",
+              "cv",
+              "kw",
+              "co",
+              "cr",
+              "hr",
+              "cs",
+              "da",
+              "dv",
+              "nl",
+              "dz",
+              "en",
+              "eo",
+              "et",
+              "ee",
+              "fo",
+              "fj",
+              "fi",
+              "fr",
+              "ff",
+              "gd",
+              "gl",
+              "lg",
+              "ka",
+              "de",
+              "ki",
+              "el",
+              "kl",
+              "gn",
+              "gu",
+              "ht",
+              "ha",
+              "he",
+              "hz",
+              "hi",
+              "ho",
+              "hu",
+              "is",
+              "io",
+              "ig",
+              "id",
+              "ia",
+              "ie",
+              "iu",
+              "ik",
+              "ga",
+              "it",
+              "ja",
+              "jv",
+              "kn",
+              "kr",
+              "ks",
+              "kk",
+              "rw",
+              "kv",
+              "kg",
+              "ko",
+              "kj",
+              "ku",
+              "ky",
+              "lo",
+              "la",
+              "lv",
+              "lb",
+              "li",
+              "ln",
+              "lt",
+              "lu",
+              "mk",
+              "mg",
+              "ms",
+              "ml",
+              "mt",
+              "gv",
+              "mi",
+              "mr",
+              "mh",
+              "ro",
+              "mn",
+              "na",
+              "nv",
+              "nd",
+              "ng",
+              "ne",
+              "se",
+              "no",
+              "nb",
+              "nn",
+              "ii",
+              "oc",
+              "oj",
+              "or",
+              "om",
+              "os",
+              "pi",
+              "pa",
+              "ps",
+              "fa",
+              "pl",
+              "pt",
+              "qu",
+              "rm",
+              "rn",
+              "ru",
+              "sm",
+              "sg",
+              "sa",
+              "sc",
+              "sr",
+              "sn",
+              "sd",
+              "si",
+              "sk",
+              "sl",
+              "so",
+              "st",
+              "nr",
+              "es",
+              "su",
+              "sw",
+              "ss",
+              "sv",
+              "tl",
+              "ty",
+              "tg",
+              "ta",
+              "tt",
+              "te",
+              "th",
+              "bo",
+              "ti",
+              "to",
+              "ts",
+              "tn",
+              "tr",
+              "tk",
+              "tw",
+              "ug",
+              "uk",
+              "ur",
+              "uz",
+              "ve",
+              "vi",
+              "vo",
+              "wa",
+              "cy",
+              "fy",
+              "wo",
+              "xh",
+              "yi",
+              "yo",
+              "za",
+              "zu"
+            ],
+            "example": "en"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "Abstract",
+              "Methods",
+              "SeriesInformation",
+              "TableOfContents",
+              "TechnicalInfo",
+              "Other"
+            ],
+            "example": "Abstract"
+          }
+        },
+        "required": [
+          "id"
+        ]
+      },
+      "IdentifierTitleDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "70ce5164-fd74-413f-8712-f996b91defbf"
+          },
+          "title": {
+            "type": "string",
+            "example": "Airquality Demonstrator"
+          },
+          "language": {
+            "type": "string",
+            "enum": [
+              "ab",
+              "aa",
+              "af",
+              "ak",
+              "sq",
+              "am",
+              "ar",
+              "an",
+              "hy",
+              "as",
+              "av",
+              "ae",
+              "ay",
+              "az",
+              "bm",
+              "ba",
+              "eu",
+              "be",
+              "bn",
+              "bh",
+              "bi",
+              "bs",
+              "br",
+              "bg",
+              "my",
+              "ca",
+              "km",
+              "ch",
+              "ce",
+              "ny",
+              "zh",
+              "cu",
+              "cv",
+              "kw",
+              "co",
+              "cr",
+              "hr",
+              "cs",
+              "da",
+              "dv",
+              "nl",
+              "dz",
+              "en",
+              "eo",
+              "et",
+              "ee",
+              "fo",
+              "fj",
+              "fi",
+              "fr",
+              "ff",
+              "gd",
+              "gl",
+              "lg",
+              "ka",
+              "de",
+              "ki",
+              "el",
+              "kl",
+              "gn",
+              "gu",
+              "ht",
+              "ha",
+              "he",
+              "hz",
+              "hi",
+              "ho",
+              "hu",
+              "is",
+              "io",
+              "ig",
+              "id",
+              "ia",
+              "ie",
+              "iu",
+              "ik",
+              "ga",
+              "it",
+              "ja",
+              "jv",
+              "kn",
+              "kr",
+              "ks",
+              "kk",
+              "rw",
+              "kv",
+              "kg",
+              "ko",
+              "kj",
+              "ku",
+              "ky",
+              "lo",
+              "la",
+              "lv",
+              "lb",
+              "li",
+              "ln",
+              "lt",
+              "lu",
+              "mk",
+              "mg",
+              "ms",
+              "ml",
+              "mt",
+              "gv",
+              "mi",
+              "mr",
+              "mh",
+              "ro",
+              "mn",
+              "na",
+              "nv",
+              "nd",
+              "ng",
+              "ne",
+              "se",
+              "no",
+              "nb",
+              "nn",
+              "ii",
+              "oc",
+              "oj",
+              "or",
+              "om",
+              "os",
+              "pi",
+              "pa",
+              "ps",
+              "fa",
+              "pl",
+              "pt",
+              "qu",
+              "rm",
+              "rn",
+              "ru",
+              "sm",
+              "sg",
+              "sa",
+              "sc",
+              "sr",
+              "sn",
+              "sd",
+              "si",
+              "sk",
+              "sl",
+              "so",
+              "st",
+              "nr",
+              "es",
+              "su",
+              "sw",
+              "ss",
+              "sv",
+              "tl",
+              "ty",
+              "tg",
+              "ta",
+              "tt",
+              "te",
+              "th",
+              "bo",
+              "ti",
+              "to",
+              "ts",
+              "tn",
+              "tr",
+              "tk",
+              "tw",
+              "ug",
+              "uk",
+              "ur",
+              "uz",
+              "ve",
+              "vi",
+              "vo",
+              "wa",
+              "cy",
+              "fy",
+              "wo",
+              "xh",
+              "yi",
+              "yo",
+              "za",
+              "zu"
+            ],
+            "example": "en"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "AlternativeTitle",
+              "Subtitle",
+              "TranslatedTitle",
+              "Other"
+            ]
+          }
+        },
+        "required": [
+          "id"
+        ]
+      },
+      "QueryDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "83ea2326-f8f6-4263-baf8-cdf88a54efc7"
+          },
+          "owner": {
+            "$ref": "#/components/schemas/UserBriefDto"
+          },
+          "execution": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2021-03-12T15:26:21Z"
+          },
+          "query": {
+            "type": "string",
+            "example": "SELECT `id` FROM `air_quality`"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "query",
+              "view"
+            ],
+            "example": "query"
+          },
+          "identifiers": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierBriefDto"
+            }
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc"
+          },
+          "query_normalized": {
+            "type": "string",
+            "example": "SELECT `id` FROM `air_quality`"
+          },
+          "query_hash": {
+            "type": "string",
+            "example": "17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76"
+          },
+          "is_persisted": {
+            "type": "boolean",
+            "example": true
+          },
+          "result_hash": {
+            "type": "string",
+            "example": "17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76"
+          },
+          "result_number": {
+            "type": "integer",
+            "format": "int64",
+            "example": 1
+          }
+        },
+        "required": [
+          "database_id",
+          "execution",
+          "id",
+          "identifiers",
+          "is_persisted",
+          "owner",
+          "query",
+          "query_hash",
+          "query_normalized"
+        ]
+      },
+      "UserBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4"
+          },
+          "username": {
+            "type": "string",
+            "description": "Only contains lowercase characters",
+            "example": "jcarberry"
+          },
+          "name": {
+            "type": "string",
+            "example": "Josiah Carberry"
+          },
+          "orcid": {
+            "type": "string",
+            "example": "0000-0002-1825-0097"
+          },
+          "qualified_name": {
+            "type": "string",
+            "example": "Josiah Carberry — @jcarberry"
+          },
+          "given_name": {
+            "type": "string",
+            "example": "Josiah"
+          },
+          "family_name": {
+            "type": "string",
+            "example": "Carberry"
+          }
+        },
+        "required": [
+          "id",
+          "username"
+        ]
+      },
+      "CreatorDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "e41f94a6-2b94-4a12-ac0e-678684e1c070"
+          },
+          "firstname": {
+            "type": "string",
+            "example": "Josiah"
+          },
+          "lastname": {
+            "type": "string",
+            "example": "Carberry"
+          },
+          "affiliation": {
+            "type": "string",
+            "example": "Brown University"
+          },
+          "creator_name": {
+            "type": "string",
+            "example": "Carberry, Josiah"
+          },
+          "name_type": {
+            "type": "string",
+            "enum": [
+              "Personal",
+              "Organizational"
+            ],
+            "example": "Personal"
+          },
+          "name_identifier": {
+            "type": "string",
+            "example": "0000-0002-1825-0097"
+          },
+          "name_identifier_scheme": {
+            "type": "string",
+            "enum": [
+              "ORCID",
+              "ROR",
+              "ISNI",
+              "GRID"
+            ],
+            "example": "ORCID"
+          },
+          "name_identifier_scheme_uri": {
+            "type": "string",
+            "example": "https://orcid.org/"
+          },
+          "affiliation_identifier": {
+            "type": "string",
+            "example": "https://ror.org/05gq02987"
+          },
+          "affiliation_identifier_scheme": {
+            "type": "string",
+            "enum": [
+              "ROR",
+              "GRID",
+              "ISNI"
+            ],
+            "example": "ROR"
+          },
+          "affiliation_identifier_scheme_uri": {
+            "type": "string",
+            "example": "https://ror.org/"
+          }
+        },
+        "required": [
+          "creator_name",
+          "id"
+        ]
+      },
+      "EnumDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "5343bb3d-14d3-4eb7-a86f-b8fc553cb315"
+          },
+          "value": {
+            "type": "string",
+            "example": 3
+          }
+        },
+        "required": [
+          "id",
+          "value"
+        ]
+      },
+      "IdentifierDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "b97cd56b-66ca-4354-9e6c-f47210cfaaec"
+          },
+          "links": {
+            "$ref": "#/components/schemas/LinksDto"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "database",
+              "subset",
+              "table",
+              "view"
+            ],
+            "example": "database"
+          },
+          "titles": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierTitleDto"
+            }
+          },
+          "descriptions": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierDescriptionDto"
+            }
+          },
+          "funders": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierFunderDto"
+            }
+          },
+          "query": {
+            "type": "string",
+            "example": "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location` = \"09:STEF\""
+          },
+          "execution": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2021-03-12T15:26:21Z"
+          },
+          "doi": {
+            "type": "string",
+            "example": "10.1038/nphys1170"
+          },
+          "publisher": {
+            "type": "string",
+            "example": "TU Wien"
+          },
+          "owner": {
+            "$ref": "#/components/schemas/UserBriefDto"
+          },
+          "language": {
+            "type": "string",
+            "enum": [
+              "ab",
+              "aa",
+              "af",
+              "ak",
+              "sq",
+              "am",
+              "ar",
+              "an",
+              "hy",
+              "as",
+              "av",
+              "ae",
+              "ay",
+              "az",
+              "bm",
+              "ba",
+              "eu",
+              "be",
+              "bn",
+              "bh",
+              "bi",
+              "bs",
+              "br",
+              "bg",
+              "my",
+              "ca",
+              "km",
+              "ch",
+              "ce",
+              "ny",
+              "zh",
+              "cu",
+              "cv",
+              "kw",
+              "co",
+              "cr",
+              "hr",
+              "cs",
+              "da",
+              "dv",
+              "nl",
+              "dz",
+              "en",
+              "eo",
+              "et",
+              "ee",
+              "fo",
+              "fj",
+              "fi",
+              "fr",
+              "ff",
+              "gd",
+              "gl",
+              "lg",
+              "ka",
+              "de",
+              "ki",
+              "el",
+              "kl",
+              "gn",
+              "gu",
+              "ht",
+              "ha",
+              "he",
+              "hz",
+              "hi",
+              "ho",
+              "hu",
+              "is",
+              "io",
+              "ig",
+              "id",
+              "ia",
+              "ie",
+              "iu",
+              "ik",
+              "ga",
+              "it",
+              "ja",
+              "jv",
+              "kn",
+              "kr",
+              "ks",
+              "kk",
+              "rw",
+              "kv",
+              "kg",
+              "ko",
+              "kj",
+              "ku",
+              "ky",
+              "lo",
+              "la",
+              "lv",
+              "lb",
+              "li",
+              "ln",
+              "lt",
+              "lu",
+              "mk",
+              "mg",
+              "ms",
+              "ml",
+              "mt",
+              "gv",
+              "mi",
+              "mr",
+              "mh",
+              "ro",
+              "mn",
+              "na",
+              "nv",
+              "nd",
+              "ng",
+              "ne",
+              "se",
+              "no",
+              "nb",
+              "nn",
+              "ii",
+              "oc",
+              "oj",
+              "or",
+              "om",
+              "os",
+              "pi",
+              "pa",
+              "ps",
+              "fa",
+              "pl",
+              "pt",
+              "qu",
+              "rm",
+              "rn",
+              "ru",
+              "sm",
+              "sg",
+              "sa",
+              "sc",
+              "sr",
+              "sn",
+              "sd",
+              "si",
+              "sk",
+              "sl",
+              "so",
+              "st",
+              "nr",
+              "es",
+              "su",
+              "sw",
+              "ss",
+              "sv",
+              "tl",
+              "ty",
+              "tg",
+              "ta",
+              "tt",
+              "te",
+              "th",
+              "bo",
+              "ti",
+              "to",
+              "ts",
+              "tn",
+              "tr",
+              "tk",
+              "tw",
+              "ug",
+              "uk",
+              "ur",
+              "uz",
+              "ve",
+              "vi",
+              "vo",
+              "wa",
+              "cy",
+              "fy",
+              "wo",
+              "xh",
+              "yi",
+              "yo",
+              "za",
+              "zu"
+            ]
+          },
+          "licenses": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/LicenseDto"
+            }
+          },
+          "creators": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/CreatorDto"
+            }
+          },
+          "status": {
+            "type": "string",
+            "enum": [
+              "draft",
+              "published"
+            ],
+            "example": "draft"
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "query_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "table_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "view_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "query_normalized": {
+            "type": "string",
+            "example": "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location` = \"09:STEF\""
+          },
+          "related_identifiers": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/RelatedIdentifierDto"
+            }
+          },
+          "query_hash": {
+            "type": "string",
+            "description": "query hash in sha512"
+          },
+          "result_hash": {
+            "type": "string",
+            "example": "34fe82cda2c53f13f8d90cfd7a3469e3a939ff311add50dce30d9136397bf8e5"
+          },
+          "result_number": {
+            "type": "integer",
+            "format": "int64",
+            "example": 1
+          },
+          "publication_day": {
+            "type": "integer",
+            "format": "int32",
+            "example": 15
+          },
+          "publication_month": {
+            "type": "integer",
+            "format": "int32",
+            "example": 12
+          },
+          "publication_year": {
+            "type": "integer",
+            "format": "int32",
+            "example": 2022
+          }
+        },
+        "required": [
+          "creators",
+          "database_id",
+          "descriptions",
+          "funders",
+          "id",
+          "language",
+          "licenses",
+          "links",
+          "owner",
+          "publication_year",
+          "publisher",
+          "query",
+          "query_hash",
+          "query_normalized",
+          "status",
+          "titles",
+          "type"
+        ]
+      },
+      "IdentifierFunderDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "39693413-e0ce-46da-ad5e-029c0556d439"
+          },
+          "funder_name": {
+            "type": "string",
+            "example": "European Commission"
+          },
+          "funder_identifier": {
+            "type": "string",
+            "example": "http://doi.org/10.13039/501100000780"
+          },
+          "funder_identifier_type": {
+            "type": "string",
+            "enum": [
+              "Crossref Funder ID",
+              "ROR",
+              "GND",
+              "ISNI",
+              "Other"
+            ],
+            "example": "Crossref Funder ID"
+          },
+          "scheme_uri": {
+            "type": "string",
+            "example": "http://doi.org/"
+          },
+          "award_number": {
+            "type": "string",
+            "example": 824087
+          },
+          "award_title": {
+            "type": "string",
+            "example": "EOSC-Life"
+          }
+        },
+        "required": [
+          "funder_name",
+          "id"
+        ]
+      },
+      "LicenseDto": {
+        "type": "object",
+        "properties": {
+          "identifier": {
+            "type": "string",
+            "example": "MIT"
+          },
+          "uri": {
+            "type": "string",
+            "example": "https://opensource.org/licenses/MIT"
+          },
+          "description": {
+            "type": "string",
+            "example": "A short and simple permissive license with conditions only requiring preservation of copyright and license notices. Licensed works, modifications, and larger works may be distributed under different terms and without source code."
+          }
+        },
+        "required": [
+          "identifier",
+          "uri"
+        ]
+      },
+      "LinksDto": {
+        "type": "object",
+        "properties": {
+          "self": {
+            "type": "string",
+            "example": "http://example.com/api/"
+          },
+          "data": {
+            "type": "string",
+            "example": "http://example.com"
+          },
+          "self_html": {
+            "type": "string",
+            "example": "http://example.com"
+          },
+          "dashboard_html": {
+            "type": "string",
+            "example": "http://example.com/d/defi2baxqawaod"
+          }
+        },
+        "required": [
+          "self",
+          "self_html"
+        ]
+      },
+      "RelatedIdentifierDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "ce9d11f0-60a2-448d-a3e4-44719a443e8a"
+          },
+          "value": {
+            "type": "string",
+            "example": "10.70124/dc4zh-9ce78"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "DOI",
+              "URL",
+              "URN",
+              "ARK",
+              "arXiv",
+              "bibcode",
+              "EAN13",
+              "EISSN",
+              "Handle",
+              "IGSN",
+              "ISBN",
+              "ISTC",
+              "LISSN",
+              "LSID",
+              "PMID",
+              "PURL",
+              "UPC",
+              "w3id"
+            ],
+            "example": "DOI"
+          },
+          "relation": {
+            "type": "string",
+            "enum": [
+              "IsCitedBy",
+              "Cites",
+              "IsSupplementTo",
+              "IsSupplementedBy",
+              "IsContinuedBy",
+              "Continues",
+              "IsDescribedBy",
+              "Describes",
+              "HasMetadata",
+              "IsMetadataFor",
+              "HasVersion",
+              "IsVersionOf",
+              "IsNewVersionOf",
+              "IsPreviousVersionOf",
+              "IsPartOf",
+              "HasPart",
+              "IsPublishedIn",
+              "IsReferencedBy",
+              "References",
+              "IsDocumentedBy",
+              "Documents",
+              "IsCompiledBy",
+              "Compiles",
+              "IsVariantFormOf",
+              "IsOriginalFormOf",
+              "IsIdenticalTo",
+              "IsReviewedBy",
+              "Reviews",
+              "IsDerivedFrom",
+              "IsSourceOf",
+              "IsRequiredBy",
+              "Requires",
+              "IsObsoletedBy",
+              "Obsoletes"
+            ],
+            "example": "Cites"
+          }
+        },
+        "required": [
+          "id",
+          "relation",
+          "type",
+          "value"
+        ]
+      },
+      "SetDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "7eb4eded-bacc-4a91-84db-a9ae6ddafda7"
+          },
+          "value": {
+            "type": "string",
+            "example": 3
+          }
+        },
+        "required": [
+          "id",
+          "value"
+        ]
+      },
+      "ViewColumnDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "6aec3a91-2e0b-4e92-a16a-9c3c5e892da1"
+          },
+          "name": {
+            "type": "string",
+            "example": "Given Name",
+            "maxLength": 64,
+            "minLength": 0
+          },
+          "size": {
+            "type": "integer",
+            "format": "int64",
+            "example": 255
+          },
+          "d": {
+            "type": "integer",
+            "format": "int64",
+            "example": 0
+          },
+          "description": {
+            "type": "string",
+            "example": "Column comment",
+            "maxLength": 2048,
+            "minLength": 0
+          },
+          "enums": {
+            "type": "array",
+            "description": "enum values, only considered when type = ENUM",
+            "items": {
+              "$ref": "#/components/schemas/EnumDto"
+            }
+          },
+          "sets": {
+            "type": "array",
+            "description": "enum values, only considered when type = ENUM",
+            "items": {
+              "$ref": "#/components/schemas/SetDto"
+            }
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4"
+          },
+          "ord": {
+            "type": "integer",
+            "format": "int32",
+            "example": 0
+          },
+          "internal_name": {
+            "type": "string",
+            "example": "given_name",
+            "maxLength": 64,
+            "minLength": 0
+          },
+          "index_length": {
+            "type": "integer",
+            "format": "int64",
+            "example": 255
+          },
+          "length": {
+            "type": "integer",
+            "format": "int64",
+            "example": 255
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "char",
+              "varchar",
+              "binary",
+              "varbinary",
+              "tinyblob",
+              "tinytext",
+              "text",
+              "blob",
+              "mediumtext",
+              "mediumblob",
+              "longtext",
+              "longblob",
+              "enum",
+              "set",
+              "serial",
+              "bit",
+              "tinyint",
+              "bool",
+              "smallint",
+              "mediumint",
+              "int",
+              "bigint",
+              "float",
+              "double",
+              "decimal",
+              "date",
+              "datetime",
+              "timestamp",
+              "time",
+              "year"
+            ],
+            "example": "varchar"
+          },
+          "is_null_allowed": {
+            "type": "boolean",
+            "example": false
+          }
+        },
+        "required": [
+          "database_id",
+          "id",
+          "internal_name",
+          "is_null_allowed",
+          "name",
+          "ord",
+          "type"
+        ]
+      },
+      "ViewDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "787439d0-e85e-400c-a7e6-996a023bfad9"
+          },
+          "name": {
+            "type": "string",
+            "example": "Air Quality"
+          },
+          "identifiers": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierDto"
+            }
+          },
+          "query": {
+            "type": "string",
+            "example": "SELECT `id` FROM `air_quality` ORDER BY `value` DESC"
+          },
+          "owner": {
+            "$ref": "#/components/schemas/UserBriefDto"
+          },
+          "columns": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/ViewColumnDto"
+            }
+          },
+          "created": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2022-01-01 08:00:00.000"
+          },
+          "last_retrieved": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2025-01-23T12:09:01"
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc"
+          },
+          "internal_name": {
+            "type": "string",
+            "example": "air_quality"
+          },
+          "is_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "is_schema_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "initial_view": {
+            "type": "boolean",
+            "description": "True if it is the default view for the database",
+            "example": true
+          },
+          "query_hash": {
+            "type": "string",
+            "example": "7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916"
+          }
+        },
+        "required": [
+          "columns",
+          "created",
+          "database_id",
+          "id",
+          "identifiers",
+          "internal_name",
+          "name",
+          "owner",
+          "query",
+          "query_hash"
+        ]
+      },
+      "TupleDto": {
+        "type": "object",
+        "properties": {
+          "data": {
+            "type": "object",
+            "additionalProperties": {
+              "type": "object"
+            },
+            "example": {
+              "key": "value"
+            }
+          }
+        },
+        "required": [
+          "data"
+        ]
+      },
+      "ImportDto": {
+        "type": "object",
+        "properties": {
+          "location": {
+            "type": "string",
+            "example": "file.csv"
+          },
+          "header": {
+            "type": "boolean",
+            "description": "If true, the first line contains the column names, otherwise it contains only data",
+            "example": true
+          },
+          "separator": {
+            "type": "string",
+            "example": ","
+          },
+          "quote": {
+            "type": "string",
+            "example": "\""
+          },
+          "line_termination": {
+            "type": "string",
+            "example": "\\r\\n"
+          }
+        },
+        "required": [
+          "header",
+          "location",
+          "separator"
+        ]
+      },
+      "FilterDto": {
+        "type": "object",
+        "properties": {
+          "type": {
+            "type": "string",
+            "enum": [
+              "where",
+              "or",
+              "and"
+            ],
+            "example": "where"
+          },
+          "value": {
+            "type": "string",
+            "example": 1
+          },
+          "column_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "14128033-54b5-4818-a489-21b0dded86e2"
+          },
+          "operator_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "67c5b54d-2eb0-4f42-8dc1-a504562e9f32"
+          }
+        },
+        "required": [
+          "column_id",
+          "operator_id",
+          "type"
+        ]
+      },
+      "OrderDto": {
+        "type": "object",
+        "properties": {
+          "direction": {
+            "type": "string",
+            "enum": [
+              "asc",
+              "desc"
+            ],
+            "example": "asc"
+          },
+          "column_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "e891ba86-0258-41a6-a8d9-ff58bc10b618"
+          }
+        },
+        "required": [
+          "column_id"
+        ]
+      },
+      "SubsetDto": {
+        "type": "object",
+        "properties": {
+          "columns": {
+            "type": "array",
+            "example": [
+              "e891ba86-0258-41a6-a8d9-ff58bc10b618"
+            ],
+            "items": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          "filter": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/FilterDto"
+            }
+          },
+          "order": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/OrderDto"
+            }
+          },
+          "datasource_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "f7df2a7d-4ade-4c78-97b0-7c744d0893c7"
+          },
+          "datasource_type": {
+            "type": "string",
+            "enum": [
+              "table",
+              "view"
+            ]
+          }
+        },
+        "required": [
+          "columns",
+          "datasource_id",
+          "datasource_type"
+        ]
+      },
+      "TableHistoryDto": {
+        "type": "object",
+        "properties": {
+          "timestamp": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2021-03-12T15:26:21Z"
+          },
+          "event": {
+            "type": "string",
+            "enum": [
+              "insert",
+              "delete"
+            ],
+            "example": "INSERT"
+          },
+          "total": {
+            "type": "integer",
+            "format": "int64",
+            "example": 1
+          }
+        },
+        "required": [
+          "event",
+          "timestamp",
+          "total"
+        ]
+      },
+      "TupleDeleteDto": {
+        "type": "object",
+        "properties": {
+          "keys": {
+            "type": "object",
+            "additionalProperties": {
+              "type": "object"
+            },
+            "example": {
+              "id": 1
+            }
+          }
+        },
+        "required": [
+          "keys"
+        ]
+      }
+    },
+    "securitySchemes": {
+      "basicAuth": {
+        "type": "http",
+        "scheme": "basic"
+      },
+      "bearerAuth": {
+        "type": "http",
+        "scheme": "bearer",
+        "bearerFormat": "JWT"
+      }
+    }
+  }
+}
diff --git a/.docs/.openapi/api-data.yaml b/.docs/.openapi/api-data.yaml
deleted file mode 100644
index 60be46ea4a7431b28e45424374fc3390699a62fd..0000000000000000000000000000000000000000
--- a/.docs/.openapi/api-data.yaml
+++ /dev/null
@@ -1,2872 +0,0 @@
-openapi: 3.1.0
-info:
-  title: Database Repository Data Service API
-  description: Service that manages the data
-  contact:
-    name: Prof. Andreas Rauber
-    email: andreas.rauber@tuwien.ac.at
-  license:
-    name: Apache 2.0
-    url: https://www.apache.org/licenses/LICENSE-2.0
-  version: 1.8.2
-externalDocs:
-  description: Sourcecode Documentation
-  url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8.1/system-services-metadata/
-servers:
-- url: http://localhost
-  description: Development instance
-- url: https://test.dbrepo.tuwien.ac.at
-  description: Staging instance
-paths:
-  /api/database/{databaseId}/view/{viewId}/data:
-    get:
-      tags:
-      - view-endpoint
-      summary: Get view data
-      description: "Gets data from a view of a database. For private databases, the\
-        \ user needs at least *READ* access to the associated database."
-      operationId: getData
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: viewId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: page
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      - name: size
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      - name: timestamp
-        in: query
-        required: false
-        schema:
-          type: string
-          format: date-time
-      - name: Accept
-        in: header
-        required: true
-        schema:
-          type: string
-      responses:
-        "200":
-          description: Retrieved view data
-          headers:
-            Access-Control-Expose-Headers:
-              description: Expose `X-Count` custom header
-              required: true
-              style: simple
-              schema:
-                type: string
-            X-Count:
-              description: Number of rows
-              required: true
-              style: simple
-              schema:
-                type: integer
-                format: int64
-          content:
-            application/json:
-              schema:
-                type: string
-            text/csv: {}
-        "400":
-          description: Request pagination is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Not allowed to retrieve view data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find view in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "406":
-          description: Failed to format data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "409":
-          description: View schema could not be mapped
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to establish connection with the metadata service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - basicAuth: []
-      - bearerAuth: []
-    head:
-      tags:
-      - view-endpoint
-      summary: Get view data
-      description: "Gets data from a view of a database. For private databases, the\
-        \ user needs at least *READ* access to the associated database."
-      operationId: getData_1
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: viewId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: page
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      - name: size
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      - name: timestamp
-        in: query
-        required: false
-        schema:
-          type: string
-          format: date-time
-      - name: Accept
-        in: header
-        required: true
-        schema:
-          type: string
-      responses:
-        "200":
-          description: Retrieved view data
-          headers:
-            Access-Control-Expose-Headers:
-              description: Expose `X-Count` custom header
-              required: true
-              style: simple
-              schema:
-                type: string
-            X-Count:
-              description: Number of rows
-              required: true
-              style: simple
-              schema:
-                type: integer
-                format: int64
-          content:
-            application/json:
-              schema:
-                type: string
-            text/csv: {}
-        "400":
-          description: Request pagination is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Not allowed to retrieve view data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find view in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "406":
-          description: Failed to format data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "409":
-          description: View schema could not be mapped
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to establish connection with the metadata service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - basicAuth: []
-      - bearerAuth: []
-  /api/database/{databaseId}/table/{tableId}/data:
-    get:
-      tags:
-      - table-endpoint
-      summary: Get table data
-      description: "Gets data from a table with id. For a table in a private database,\
-        \ the user needs to have at least *READ* access to the associated database.\
-        \ Requests with HTTP method **GET** return the full dataset, requests with\
-        \ HTTP method **HEAD** only the number of tuples in the `X-Count` header."
-      operationId: getData_2
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: tableId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: timestamp
-        in: query
-        required: false
-        schema:
-          type: string
-          format: date-time
-      - name: page
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      - name: size
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      - name: Accept
-        in: header
-        required: true
-        schema:
-          type: string
-      responses:
-        "200":
-          description: Get table data
-          headers:
-            Access-Control-Expose-Headers:
-              description: Expose `X-Count` custom header
-              required: true
-              style: simple
-              schema:
-                type: string
-            X-Count:
-              description: Number of rows
-              required: true
-              style: simple
-              schema:
-                type: integer
-                format: int64
-          content:
-            application/json:
-              schema:
-                type: string
-            text/csv: {}
-        "400":
-          description: Request pagination or table data select query is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Not allowed to get table data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find table in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "406":
-          description: Failed to format data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to establish connection with the metadata service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - basicAuth: []
-      - bearerAuth: []
-    put:
-      tags:
-      - table-endpoint
-      summary: Update tuple
-      description: "Updates a data tuple into a table, then the table statistics are\
-        \ updated. The user needs to have at least *WRITE_OWN* access to the associated\
-        \ database. Requires role `insert-table-data`."
-      operationId: updateRawTuple
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: tableId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: Authorization
-        in: header
-        required: true
-        schema:
-          type: string
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/TupleUpdateDto"
-        required: true
-      responses:
-        "202":
-          description: Updated table data
-        "400":
-          description: Request pagination or table data select query is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Update table data not allowed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find table in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to establish connection with the metadata service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - basicAuth: []
-      - bearerAuth: []
-    post:
-      tags:
-      - table-endpoint
-      summary: Insert tuple
-      description: "Inserts a data tuple into a table, then the table statistics are\
-        \ updated. The user needs to have at least *WRITE_OWN* access to the associated\
-        \ database. Requires role `insert-table-data`."
-      operationId: insertRawTuple
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: tableId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: Authorization
-        in: header
-        required: true
-        schema:
-          type: string
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/TupleDto"
-        required: true
-      responses:
-        "201":
-          description: Created table data
-        "400":
-          description: Request pagination or table data select query is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Create table data not allowed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find table in metadata database or blob in storage
-            service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to establish connection with the metadata service or
-            storage service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - basicAuth: []
-      - bearerAuth: []
-    delete:
-      tags:
-      - table-endpoint
-      summary: Delete tuple
-      description: "Deletes a data tuple into a table, then the table statistics are\
-        \ updated. The user needs to have at least *WRITE_OWN* access to the associated\
-        \ database. Requires role `delete-table-data`."
-      operationId: deleteRawTuple
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: tableId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: Authorization
-        in: header
-        required: true
-        schema:
-          type: string
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/TupleDeleteDto"
-        required: true
-      responses:
-        "202":
-          description: Deleted table data
-        "400":
-          description: Request pagination or table data select query is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Delete table data not allowed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find table in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to establish connection with the metadata service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - basicAuth: []
-      - bearerAuth: []
-    head:
-      tags:
-      - table-endpoint
-      summary: Get table data
-      description: "Gets data from a table with id. For a table in a private database,\
-        \ the user needs to have at least *READ* access to the associated database.\
-        \ Requests with HTTP method **GET** return the full dataset, requests with\
-        \ HTTP method **HEAD** only the number of tuples in the `X-Count` header."
-      operationId: getData_3
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: tableId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: timestamp
-        in: query
-        required: false
-        schema:
-          type: string
-          format: date-time
-      - name: page
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      - name: size
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      - name: Accept
-        in: header
-        required: true
-        schema:
-          type: string
-      responses:
-        "200":
-          description: Get table data
-          headers:
-            Access-Control-Expose-Headers:
-              description: Expose `X-Count` custom header
-              required: true
-              style: simple
-              schema:
-                type: string
-            X-Count:
-              description: Number of rows
-              required: true
-              style: simple
-              schema:
-                type: integer
-                format: int64
-          content:
-            application/json:
-              schema:
-                type: string
-            text/csv: {}
-        "400":
-          description: Request pagination or table data select query is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Not allowed to get table data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find table in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "406":
-          description: Failed to format data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to establish connection with the metadata service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - basicAuth: []
-      - bearerAuth: []
-  /api/database/{databaseId}/subset/{subsetId}/data:
-    get:
-      tags:
-      - subset-endpoint
-      summary: Get subset data
-      description: "Gets data of subset with id. For private databases, the user needs\
-        \ at least *READ* access to the associated database. Requests with HTTP method\
-        \ **GET** return the subset dataset, requests with HTTP method **HEAD** only\
-        \ the number of rows in the subset dataset in the `X-Count` header"
-      operationId: getData_4
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: subsetId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: Accept
-        in: header
-        required: true
-        schema:
-          type: string
-      - name: timestamp
-        in: query
-        required: false
-        schema:
-          type: string
-          format: date-time
-      - name: page
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      - name: size
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      responses:
-        "200":
-          description: Retrieved subset data
-          headers:
-            Access-Control-Expose-Headers:
-              description: Reverse proxy exposing of custom headers
-              required: true
-              style: simple
-              schema:
-                type: string
-            X-Count:
-              description: Number of rows
-              style: simple
-              schema:
-                type: string
-                format: uuid
-            X-Id:
-              description: The subset id
-              required: true
-              style: simple
-              schema:
-                type: string
-                format: uuid
-            X-Headers:
-              description: The list of headers separated by comma
-              style: simple
-              schema:
-                type: string
-          content:
-            application/json:
-              schema:
-                type: string
-            text/csv: {}
-        "400":
-          description: Invalid pagination
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Not allowed to retrieve subset data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find database in metadata database or query in query
-            store of the data database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "406":
-          description: Failed to format data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to communicate with database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    head:
-      tags:
-      - subset-endpoint
-      summary: Get subset data
-      description: "Gets data of subset with id. For private databases, the user needs\
-        \ at least *READ* access to the associated database. Requests with HTTP method\
-        \ **GET** return the subset dataset, requests with HTTP method **HEAD** only\
-        \ the number of rows in the subset dataset in the `X-Count` header"
-      operationId: getData_5
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: subsetId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: Accept
-        in: header
-        required: true
-        schema:
-          type: string
-      - name: timestamp
-        in: query
-        required: false
-        schema:
-          type: string
-          format: date-time
-      - name: page
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      - name: size
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      responses:
-        "200":
-          description: Retrieved subset data
-          headers:
-            Access-Control-Expose-Headers:
-              description: Reverse proxy exposing of custom headers
-              required: true
-              style: simple
-              schema:
-                type: string
-            X-Count:
-              description: Number of rows
-              style: simple
-              schema:
-                type: string
-                format: uuid
-            X-Id:
-              description: The subset id
-              required: true
-              style: simple
-              schema:
-                type: string
-                format: uuid
-            X-Headers:
-              description: The list of headers separated by comma
-              style: simple
-              schema:
-                type: string
-          content:
-            application/json:
-              schema:
-                type: string
-            text/csv: {}
-        "400":
-          description: Invalid pagination
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Not allowed to retrieve subset data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find database in metadata database or query in query
-            store of the data database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "406":
-          description: Failed to format data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to communicate with database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/subset/{queryId}:
-    put:
-      tags:
-      - subset-endpoint
-      summary: Persist subset
-      description: Persists a subset with id. Requires role `persist-query`.
-      operationId: persist
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: queryId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/QueryPersistDto"
-        required: true
-      responses:
-        "202":
-          description: Persisted subset
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/QueryDto"
-        "400":
-          description: Malformed select query
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Not allowed to persist subset
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find database in metadata database or query in query
-            store of the data database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "417":
-          description: Failed to persist subset
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to communicate with database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/upload:
-    post:
-      tags:
-      - upload-endpoint
-      summary: Uploads a multipart file
-      description: Uploads a multipart file to the Storage Service. Requires role
-        `upload-file`.
-      operationId: create
-      requestBody:
-        content:
-          application/json:
-            schema:
-              type: object
-              properties:
-                file:
-                  type: string
-                  format: binary
-              required:
-              - file
-        required: true
-      responses:
-        "201":
-          description: Uploaded the file
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ViewDto"
-        "503":
-          description: Failed to establish connection with the storage service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - basicAuth: []
-      - bearerAuth: []
-  /api/database/{databaseId}/table/{tableId}/data/import:
-    post:
-      tags:
-      - table-endpoint
-      summary: Import dataset
-      description: Imports a dataset in a table. Then update the table statistics.
-        The user needs to have at least *WRITE_OWN* access to the associated database
-        when importing into a owned table. Otherwise *WRITE_ALL* access in needed.
-        Requires role `insert-table-data`.
-      operationId: importDataset
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: tableId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: Authorization
-        in: header
-        required: true
-        schema:
-          type: string
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/ImportDto"
-        required: true
-      responses:
-        "202":
-          description: Imported dataset successfully
-        "400":
-          description: Dataset and/or query are malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Import table dataset not allowed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find table in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to establish connection with the metadata service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - basicAuth: []
-      - bearerAuth: []
-  /api/database/{databaseId}/subset:
-    get:
-      tags:
-      - subset-endpoint
-      summary: Find subsets
-      description: "Finds subsets in the query store. When the database schema is\
-        \ marked as hidden, the user needs to be authorized, have at least read-access\
-        \ to the database. The result can be optionally filtered by setting `persisted`.\
-        \ When set to *true*, only persisted queries are returned, otherwise only\
-        \ non-persisted queries are returned."
-      operationId: list
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: persisted
-        in: query
-        required: false
-        schema:
-          type: boolean
-      responses:
-        "200":
-          description: Found subsets
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/QueryDto"
-        "403":
-          description: Not allowed to find subsets
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find database in metadata database or query in query
-            store of the data database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to communicate with database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - basicAuth: []
-      - bearerAuth: []
-    post:
-      tags:
-      - subset-endpoint
-      summary: Create subset
-      description: Creates a subset in the query store of the data database. Can also
-        be used without authentication if (and only if) the database is marked as
-        public (i.e. when `is_public` = `is_schema_public` is set to `true`). Otherwise
-        at least read access is required.
-      operationId: create_1
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: timestamp
-        in: query
-        required: false
-        schema:
-          type: string
-          format: date-time
-      - name: page
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      - name: size
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/SubsetDto"
-        required: true
-      responses:
-        "201":
-          description: Created subset
-          content:
-            application/json:
-              schema:
-                type: string
-        "400":
-          description: Malformed select query
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Not allowed to find subset
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find database in metadata database or query in query
-            store of the data database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "406":
-          description: Failed to format data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "417":
-          description: Failed to insert query into query store of data database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "501":
-          description: Failed to execute query as it contains non-supported keywords
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to communicate with database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - basicAuth: []
-      - bearerAuth: []
-  /api/database/{databaseId}/table/{tableId}/history:
-    get:
-      tags:
-      - table-endpoint
-      summary: Get history
-      description: "Gets the insert/delete operations history performed. For tables\
-        \ in private databases, the user needs to have at least *READ* access to the\
-        \ associated database."
-      operationId: getHistory
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: tableId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: size
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int64
-      responses:
-        "200":
-          description: Found table history
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/TableHistoryDto"
-        "400":
-          description: "Invalid pagination size request, must be > 0"
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Find table history not allowed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find table history in data database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to establish connection with the metadata service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - basicAuth: []
-      - bearerAuth: []
-  /api/database/{databaseId}/subset/{subsetId}:
-    get:
-      tags:
-      - subset-endpoint
-      summary: Find subset
-      description: "Finds a subset in the data database.  When the database schema\
-        \ is marked as hidden, the user needs to be authorized, have at least read-access\
-        \ to the database.  Requests with HTTP header `Accept=application/json` return\
-        \ the metadata, requests with HTTP header `Accept=text/csv` return the data\
-        \ as downloadable file."
-      operationId: findById
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: subsetId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: timestamp
-        in: query
-        required: false
-        schema:
-          type: string
-          format: date-time
-      responses:
-        "200":
-          description: Found subset
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/QueryDto"
-            text/csv: {}
-        "400":
-          description: Malformed select query
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Not allowed to find subset
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find database in metadata database or query in query
-            store of the data database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "406":
-          description: Failed to find acceptable representation
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to communicate with database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - basicAuth: []
-      - bearerAuth: []
-components:
-  schemas:
-    ApiErrorDto:
-      type: object
-      properties:
-        status:
-          type: string
-          enum:
-          - 100 CONTINUE
-          - 101 SWITCHING_PROTOCOLS
-          - 102 PROCESSING
-          - 103 EARLY_HINTS
-          - 103 CHECKPOINT
-          - 200 OK
-          - 201 CREATED
-          - 202 ACCEPTED
-          - 203 NON_AUTHORITATIVE_INFORMATION
-          - 204 NO_CONTENT
-          - 205 RESET_CONTENT
-          - 206 PARTIAL_CONTENT
-          - 207 MULTI_STATUS
-          - 208 ALREADY_REPORTED
-          - 226 IM_USED
-          - 300 MULTIPLE_CHOICES
-          - 301 MOVED_PERMANENTLY
-          - 302 FOUND
-          - 302 MOVED_TEMPORARILY
-          - 303 SEE_OTHER
-          - 304 NOT_MODIFIED
-          - 305 USE_PROXY
-          - 307 TEMPORARY_REDIRECT
-          - 308 PERMANENT_REDIRECT
-          - 400 BAD_REQUEST
-          - 401 UNAUTHORIZED
-          - 402 PAYMENT_REQUIRED
-          - 403 FORBIDDEN
-          - 404 NOT_FOUND
-          - 405 METHOD_NOT_ALLOWED
-          - 406 NOT_ACCEPTABLE
-          - 407 PROXY_AUTHENTICATION_REQUIRED
-          - 408 REQUEST_TIMEOUT
-          - 409 CONFLICT
-          - 410 GONE
-          - 411 LENGTH_REQUIRED
-          - 412 PRECONDITION_FAILED
-          - 413 PAYLOAD_TOO_LARGE
-          - 413 REQUEST_ENTITY_TOO_LARGE
-          - 414 URI_TOO_LONG
-          - 414 REQUEST_URI_TOO_LONG
-          - 415 UNSUPPORTED_MEDIA_TYPE
-          - 416 REQUESTED_RANGE_NOT_SATISFIABLE
-          - 417 EXPECTATION_FAILED
-          - 418 I_AM_A_TEAPOT
-          - 419 INSUFFICIENT_SPACE_ON_RESOURCE
-          - 420 METHOD_FAILURE
-          - 421 DESTINATION_LOCKED
-          - 422 UNPROCESSABLE_ENTITY
-          - 423 LOCKED
-          - 424 FAILED_DEPENDENCY
-          - 425 TOO_EARLY
-          - 426 UPGRADE_REQUIRED
-          - 428 PRECONDITION_REQUIRED
-          - 429 TOO_MANY_REQUESTS
-          - 431 REQUEST_HEADER_FIELDS_TOO_LARGE
-          - 451 UNAVAILABLE_FOR_LEGAL_REASONS
-          - 500 INTERNAL_SERVER_ERROR
-          - 501 NOT_IMPLEMENTED
-          - 502 BAD_GATEWAY
-          - 503 SERVICE_UNAVAILABLE
-          - 504 GATEWAY_TIMEOUT
-          - 505 HTTP_VERSION_NOT_SUPPORTED
-          - 506 VARIANT_ALSO_NEGOTIATES
-          - 507 INSUFFICIENT_STORAGE
-          - 508 LOOP_DETECTED
-          - 509 BANDWIDTH_LIMIT_EXCEEDED
-          - 510 NOT_EXTENDED
-          - 511 NETWORK_AUTHENTICATION_REQUIRED
-          example: NOT_FOUND
-        message:
-          type: string
-          example: Error message
-        code:
-          type: string
-          example: error.service.code
-      required:
-      - code
-      - message
-      - status
-    TupleUpdateDto:
-      type: object
-      properties:
-        data:
-          type: object
-          additionalProperties:
-            type: object
-          example:
-            key: value
-        keys:
-          type: object
-          additionalProperties:
-            type: object
-          example:
-            id: 1
-      required:
-      - data
-      - keys
-    QueryPersistDto:
-      type: object
-      properties:
-        persist:
-          type: boolean
-          example: true
-      required:
-      - persist
-    CreatorBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: e41f94a6-2b94-4a12-ac0e-678684e1c070
-        affiliation:
-          type: string
-          example: Brown University
-        creator_name:
-          type: string
-          example: "Carberry, Josiah"
-        name_type:
-          type: string
-          enum:
-          - Personal
-          - Organizational
-          example: Personal
-        name_identifier:
-          type: string
-          example: 0000-0002-1825-0097
-        name_identifier_scheme:
-          type: string
-          enum:
-          - ORCID
-          - ROR
-          - ISNI
-          - GRID
-          example: ORCID
-        affiliation_identifier:
-          type: string
-          example: https://ror.org/05gq02987
-        affiliation_identifier_scheme:
-          type: string
-          enum:
-          - ROR
-          - GRID
-          - ISNI
-          example: ROR
-      required:
-      - creator_name
-      - id
-    IdentifierBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: b97cd56b-66ca-4354-9e6c-f47210cfaaec
-        type:
-          type: string
-          enum:
-          - database
-          - subset
-          - table
-          - view
-          example: database
-        creators:
-          type: array
-          items:
-            $ref: "#/components/schemas/CreatorBriefDto"
-        titles:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierTitleDto"
-        descriptions:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierDescriptionDto"
-        doi:
-          type: string
-          example: 10.1038/nphys1170
-        publisher:
-          type: string
-          example: TU Wien
-        status:
-          type: string
-          enum:
-          - draft
-          - published
-          example: draft
-        database_id:
-          type: string
-          format: uuid
-          example: fc29f89c-86a8-4020-9e36-4d954736c6cc
-        query_id:
-          type: string
-          format: uuid
-          example: 1
-        table_id:
-          type: string
-          format: uuid
-          example: 1
-        view_id:
-          type: string
-          format: uuid
-          example: 1
-        publication_year:
-          type: integer
-          format: int32
-          example: 2022
-        owned_by:
-          type: string
-          format: uuid
-          example: 2f45ef7a-7f9b-4667-9156-152c87fe1ca5
-      required:
-      - creators
-      - database_id
-      - descriptions
-      - id
-      - owned_by
-      - publication_year
-      - publisher
-      - status
-      - titles
-      - type
-    IdentifierDescriptionDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: e0e9692c-910b-4b60-b53a-fc7c358a917d
-        description:
-          type: string
-          example: "Air quality reports at Stephansplatz, Vienna"
-        language:
-          type: string
-          enum:
-          - ab
-          - aa
-          - af
-          - ak
-          - sq
-          - am
-          - ar
-          - an
-          - hy
-          - as
-          - av
-          - ae
-          - ay
-          - az
-          - bm
-          - ba
-          - eu
-          - be
-          - bn
-          - bh
-          - bi
-          - bs
-          - br
-          - bg
-          - my
-          - ca
-          - km
-          - ch
-          - ce
-          - ny
-          - zh
-          - cu
-          - cv
-          - kw
-          - co
-          - cr
-          - hr
-          - cs
-          - da
-          - dv
-          - nl
-          - dz
-          - en
-          - eo
-          - et
-          - ee
-          - fo
-          - fj
-          - fi
-          - fr
-          - ff
-          - gd
-          - gl
-          - lg
-          - ka
-          - de
-          - ki
-          - el
-          - kl
-          - gn
-          - gu
-          - ht
-          - ha
-          - he
-          - hz
-          - hi
-          - ho
-          - hu
-          - is
-          - io
-          - ig
-          - id
-          - ia
-          - ie
-          - iu
-          - ik
-          - ga
-          - it
-          - ja
-          - jv
-          - kn
-          - kr
-          - ks
-          - kk
-          - rw
-          - kv
-          - kg
-          - ko
-          - kj
-          - ku
-          - ky
-          - lo
-          - la
-          - lv
-          - lb
-          - li
-          - ln
-          - lt
-          - lu
-          - mk
-          - mg
-          - ms
-          - ml
-          - mt
-          - gv
-          - mi
-          - mr
-          - mh
-          - ro
-          - mn
-          - na
-          - nv
-          - nd
-          - ng
-          - ne
-          - se
-          - "no"
-          - nb
-          - nn
-          - ii
-          - oc
-          - oj
-          - or
-          - om
-          - os
-          - pi
-          - pa
-          - ps
-          - fa
-          - pl
-          - pt
-          - qu
-          - rm
-          - rn
-          - ru
-          - sm
-          - sg
-          - sa
-          - sc
-          - sr
-          - sn
-          - sd
-          - si
-          - sk
-          - sl
-          - so
-          - st
-          - nr
-          - es
-          - su
-          - sw
-          - ss
-          - sv
-          - tl
-          - ty
-          - tg
-          - ta
-          - tt
-          - te
-          - th
-          - bo
-          - ti
-          - to
-          - ts
-          - tn
-          - tr
-          - tk
-          - tw
-          - ug
-          - uk
-          - ur
-          - uz
-          - ve
-          - vi
-          - vo
-          - wa
-          - cy
-          - fy
-          - wo
-          - xh
-          - yi
-          - yo
-          - za
-          - zu
-          example: en
-        type:
-          type: string
-          enum:
-          - Abstract
-          - Methods
-          - SeriesInformation
-          - TableOfContents
-          - TechnicalInfo
-          - Other
-          example: Abstract
-      required:
-      - id
-    IdentifierTitleDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 70ce5164-fd74-413f-8712-f996b91defbf
-        title:
-          type: string
-          example: Airquality Demonstrator
-        language:
-          type: string
-          enum:
-          - ab
-          - aa
-          - af
-          - ak
-          - sq
-          - am
-          - ar
-          - an
-          - hy
-          - as
-          - av
-          - ae
-          - ay
-          - az
-          - bm
-          - ba
-          - eu
-          - be
-          - bn
-          - bh
-          - bi
-          - bs
-          - br
-          - bg
-          - my
-          - ca
-          - km
-          - ch
-          - ce
-          - ny
-          - zh
-          - cu
-          - cv
-          - kw
-          - co
-          - cr
-          - hr
-          - cs
-          - da
-          - dv
-          - nl
-          - dz
-          - en
-          - eo
-          - et
-          - ee
-          - fo
-          - fj
-          - fi
-          - fr
-          - ff
-          - gd
-          - gl
-          - lg
-          - ka
-          - de
-          - ki
-          - el
-          - kl
-          - gn
-          - gu
-          - ht
-          - ha
-          - he
-          - hz
-          - hi
-          - ho
-          - hu
-          - is
-          - io
-          - ig
-          - id
-          - ia
-          - ie
-          - iu
-          - ik
-          - ga
-          - it
-          - ja
-          - jv
-          - kn
-          - kr
-          - ks
-          - kk
-          - rw
-          - kv
-          - kg
-          - ko
-          - kj
-          - ku
-          - ky
-          - lo
-          - la
-          - lv
-          - lb
-          - li
-          - ln
-          - lt
-          - lu
-          - mk
-          - mg
-          - ms
-          - ml
-          - mt
-          - gv
-          - mi
-          - mr
-          - mh
-          - ro
-          - mn
-          - na
-          - nv
-          - nd
-          - ng
-          - ne
-          - se
-          - "no"
-          - nb
-          - nn
-          - ii
-          - oc
-          - oj
-          - or
-          - om
-          - os
-          - pi
-          - pa
-          - ps
-          - fa
-          - pl
-          - pt
-          - qu
-          - rm
-          - rn
-          - ru
-          - sm
-          - sg
-          - sa
-          - sc
-          - sr
-          - sn
-          - sd
-          - si
-          - sk
-          - sl
-          - so
-          - st
-          - nr
-          - es
-          - su
-          - sw
-          - ss
-          - sv
-          - tl
-          - ty
-          - tg
-          - ta
-          - tt
-          - te
-          - th
-          - bo
-          - ti
-          - to
-          - ts
-          - tn
-          - tr
-          - tk
-          - tw
-          - ug
-          - uk
-          - ur
-          - uz
-          - ve
-          - vi
-          - vo
-          - wa
-          - cy
-          - fy
-          - wo
-          - xh
-          - yi
-          - yo
-          - za
-          - zu
-          example: en
-        type:
-          type: string
-          enum:
-          - AlternativeTitle
-          - Subtitle
-          - TranslatedTitle
-          - Other
-      required:
-      - id
-    QueryDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 83ea2326-f8f6-4263-baf8-cdf88a54efc7
-        owner:
-          $ref: "#/components/schemas/UserBriefDto"
-        execution:
-          type: string
-          format: date-time
-          example: 2021-03-12T15:26:21Z
-        query:
-          type: string
-          example: SELECT `id` FROM `air_quality`
-        type:
-          type: string
-          enum:
-          - query
-          - view
-          example: query
-        identifiers:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierBriefDto"
-        database_id:
-          type: string
-          format: uuid
-          example: fc29f89c-86a8-4020-9e36-4d954736c6cc
-        query_normalized:
-          type: string
-          example: SELECT `id` FROM `air_quality`
-        query_hash:
-          type: string
-          example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76
-        is_persisted:
-          type: boolean
-          example: true
-        result_hash:
-          type: string
-          example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76
-        result_number:
-          type: integer
-          format: int64
-          example: 1
-      required:
-      - database_id
-      - execution
-      - id
-      - identifiers
-      - is_persisted
-      - owner
-      - query
-      - query_hash
-      - query_normalized
-    UserBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
-        username:
-          type: string
-          description: Only contains lowercase characters
-          example: jcarberry
-        name:
-          type: string
-          example: Josiah Carberry
-        orcid:
-          type: string
-          example: 0000-0002-1825-0097
-        qualified_name:
-          type: string
-          example: Josiah Carberry — @jcarberry
-        given_name:
-          type: string
-          example: Josiah
-        family_name:
-          type: string
-          example: Carberry
-      required:
-      - id
-      - username
-    CreatorDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: e41f94a6-2b94-4a12-ac0e-678684e1c070
-        firstname:
-          type: string
-          example: Josiah
-        lastname:
-          type: string
-          example: Carberry
-        affiliation:
-          type: string
-          example: Brown University
-        creator_name:
-          type: string
-          example: "Carberry, Josiah"
-        name_type:
-          type: string
-          enum:
-          - Personal
-          - Organizational
-          example: Personal
-        name_identifier:
-          type: string
-          example: 0000-0002-1825-0097
-        name_identifier_scheme:
-          type: string
-          enum:
-          - ORCID
-          - ROR
-          - ISNI
-          - GRID
-          example: ORCID
-        name_identifier_scheme_uri:
-          type: string
-          example: https://orcid.org/
-        affiliation_identifier:
-          type: string
-          example: https://ror.org/05gq02987
-        affiliation_identifier_scheme:
-          type: string
-          enum:
-          - ROR
-          - GRID
-          - ISNI
-          example: ROR
-        affiliation_identifier_scheme_uri:
-          type: string
-          example: https://ror.org/
-      required:
-      - creator_name
-      - id
-    EnumDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 5343bb3d-14d3-4eb7-a86f-b8fc553cb315
-        value:
-          type: string
-          example: 3
-      required:
-      - id
-      - value
-    IdentifierDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: b97cd56b-66ca-4354-9e6c-f47210cfaaec
-        links:
-          $ref: "#/components/schemas/LinksDto"
-        type:
-          type: string
-          enum:
-          - database
-          - subset
-          - table
-          - view
-          example: database
-        titles:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierTitleDto"
-        descriptions:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierDescriptionDto"
-        funders:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierFunderDto"
-        query:
-          type: string
-          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
-            \ = \"09:STEF\""
-        execution:
-          type: string
-          format: date-time
-          example: 2021-03-12T15:26:21Z
-        doi:
-          type: string
-          example: 10.1038/nphys1170
-        publisher:
-          type: string
-          example: TU Wien
-        owner:
-          $ref: "#/components/schemas/UserBriefDto"
-        language:
-          type: string
-          enum:
-          - ab
-          - aa
-          - af
-          - ak
-          - sq
-          - am
-          - ar
-          - an
-          - hy
-          - as
-          - av
-          - ae
-          - ay
-          - az
-          - bm
-          - ba
-          - eu
-          - be
-          - bn
-          - bh
-          - bi
-          - bs
-          - br
-          - bg
-          - my
-          - ca
-          - km
-          - ch
-          - ce
-          - ny
-          - zh
-          - cu
-          - cv
-          - kw
-          - co
-          - cr
-          - hr
-          - cs
-          - da
-          - dv
-          - nl
-          - dz
-          - en
-          - eo
-          - et
-          - ee
-          - fo
-          - fj
-          - fi
-          - fr
-          - ff
-          - gd
-          - gl
-          - lg
-          - ka
-          - de
-          - ki
-          - el
-          - kl
-          - gn
-          - gu
-          - ht
-          - ha
-          - he
-          - hz
-          - hi
-          - ho
-          - hu
-          - is
-          - io
-          - ig
-          - id
-          - ia
-          - ie
-          - iu
-          - ik
-          - ga
-          - it
-          - ja
-          - jv
-          - kn
-          - kr
-          - ks
-          - kk
-          - rw
-          - kv
-          - kg
-          - ko
-          - kj
-          - ku
-          - ky
-          - lo
-          - la
-          - lv
-          - lb
-          - li
-          - ln
-          - lt
-          - lu
-          - mk
-          - mg
-          - ms
-          - ml
-          - mt
-          - gv
-          - mi
-          - mr
-          - mh
-          - ro
-          - mn
-          - na
-          - nv
-          - nd
-          - ng
-          - ne
-          - se
-          - "no"
-          - nb
-          - nn
-          - ii
-          - oc
-          - oj
-          - or
-          - om
-          - os
-          - pi
-          - pa
-          - ps
-          - fa
-          - pl
-          - pt
-          - qu
-          - rm
-          - rn
-          - ru
-          - sm
-          - sg
-          - sa
-          - sc
-          - sr
-          - sn
-          - sd
-          - si
-          - sk
-          - sl
-          - so
-          - st
-          - nr
-          - es
-          - su
-          - sw
-          - ss
-          - sv
-          - tl
-          - ty
-          - tg
-          - ta
-          - tt
-          - te
-          - th
-          - bo
-          - ti
-          - to
-          - ts
-          - tn
-          - tr
-          - tk
-          - tw
-          - ug
-          - uk
-          - ur
-          - uz
-          - ve
-          - vi
-          - vo
-          - wa
-          - cy
-          - fy
-          - wo
-          - xh
-          - yi
-          - yo
-          - za
-          - zu
-        licenses:
-          type: array
-          items:
-            $ref: "#/components/schemas/LicenseDto"
-        creators:
-          type: array
-          items:
-            $ref: "#/components/schemas/CreatorDto"
-        status:
-          type: string
-          enum:
-          - draft
-          - published
-          example: draft
-        database_id:
-          type: string
-          format: uuid
-          example: null
-        query_id:
-          type: string
-          format: uuid
-          example: null
-        table_id:
-          type: string
-          format: uuid
-          example: null
-        view_id:
-          type: string
-          format: uuid
-          example: null
-        query_normalized:
-          type: string
-          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
-            \ = \"09:STEF\""
-        related_identifiers:
-          type: array
-          items:
-            $ref: "#/components/schemas/RelatedIdentifierDto"
-        query_hash:
-          type: string
-          description: query hash in sha512
-        result_hash:
-          type: string
-          example: 34fe82cda2c53f13f8d90cfd7a3469e3a939ff311add50dce30d9136397bf8e5
-        result_number:
-          type: integer
-          format: int64
-          example: 1
-        publication_day:
-          type: integer
-          format: int32
-          example: 15
-        publication_month:
-          type: integer
-          format: int32
-          example: 12
-        publication_year:
-          type: integer
-          format: int32
-          example: 2022
-      required:
-      - creators
-      - database_id
-      - descriptions
-      - funders
-      - id
-      - language
-      - licenses
-      - links
-      - owner
-      - publication_year
-      - publisher
-      - query
-      - query_hash
-      - query_normalized
-      - status
-      - titles
-      - type
-    IdentifierFunderDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 39693413-e0ce-46da-ad5e-029c0556d439
-        funder_name:
-          type: string
-          example: European Commission
-        funder_identifier:
-          type: string
-          example: http://doi.org/10.13039/501100000780
-        funder_identifier_type:
-          type: string
-          enum:
-          - Crossref Funder ID
-          - ROR
-          - GND
-          - ISNI
-          - Other
-          example: Crossref Funder ID
-        scheme_uri:
-          type: string
-          example: http://doi.org/
-        award_number:
-          type: string
-          example: 824087
-        award_title:
-          type: string
-          example: EOSC-Life
-      required:
-      - funder_name
-      - id
-    LicenseDto:
-      type: object
-      properties:
-        identifier:
-          type: string
-          example: MIT
-        uri:
-          type: string
-          example: https://opensource.org/licenses/MIT
-        description:
-          type: string
-          example: "A short and simple permissive license with conditions only requiring\
-            \ preservation of copyright and license notices. Licensed works, modifications,\
-            \ and larger works may be distributed under different terms and without\
-            \ source code."
-      required:
-      - identifier
-      - uri
-    LinksDto:
-      type: object
-      properties:
-        self:
-          type: string
-          example: http://example.com/api/
-        data:
-          type: string
-          example: http://example.com
-        self_html:
-          type: string
-          example: http://example.com
-        dashboard_html:
-          type: string
-          example: http://example.com/d/defi2baxqawaod
-      required:
-      - self
-      - self_html
-    RelatedIdentifierDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: ce9d11f0-60a2-448d-a3e4-44719a443e8a
-        value:
-          type: string
-          example: 10.70124/dc4zh-9ce78
-        type:
-          type: string
-          enum:
-          - DOI
-          - URL
-          - URN
-          - ARK
-          - arXiv
-          - bibcode
-          - EAN13
-          - EISSN
-          - Handle
-          - IGSN
-          - ISBN
-          - ISTC
-          - LISSN
-          - LSID
-          - PMID
-          - PURL
-          - UPC
-          - w3id
-          example: DOI
-        relation:
-          type: string
-          enum:
-          - IsCitedBy
-          - Cites
-          - IsSupplementTo
-          - IsSupplementedBy
-          - IsContinuedBy
-          - Continues
-          - IsDescribedBy
-          - Describes
-          - HasMetadata
-          - IsMetadataFor
-          - HasVersion
-          - IsVersionOf
-          - IsNewVersionOf
-          - IsPreviousVersionOf
-          - IsPartOf
-          - HasPart
-          - IsPublishedIn
-          - IsReferencedBy
-          - References
-          - IsDocumentedBy
-          - Documents
-          - IsCompiledBy
-          - Compiles
-          - IsVariantFormOf
-          - IsOriginalFormOf
-          - IsIdenticalTo
-          - IsReviewedBy
-          - Reviews
-          - IsDerivedFrom
-          - IsSourceOf
-          - IsRequiredBy
-          - Requires
-          - IsObsoletedBy
-          - Obsoletes
-          example: Cites
-      required:
-      - id
-      - relation
-      - type
-      - value
-    SetDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 7eb4eded-bacc-4a91-84db-a9ae6ddafda7
-        value:
-          type: string
-          example: 3
-      required:
-      - id
-      - value
-    ViewColumnDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 6aec3a91-2e0b-4e92-a16a-9c3c5e892da1
-        name:
-          type: string
-          example: Given Name
-          maxLength: 64
-          minLength: 0
-        size:
-          type: integer
-          format: int64
-          example: 255
-        d:
-          type: integer
-          format: int64
-          example: 0
-        description:
-          type: string
-          example: Column comment
-          maxLength: 2048
-          minLength: 0
-        enums:
-          type: array
-          description: "enum values, only considered when type = ENUM"
-          items:
-            $ref: "#/components/schemas/EnumDto"
-        sets:
-          type: array
-          description: "enum values, only considered when type = ENUM"
-          items:
-            $ref: "#/components/schemas/SetDto"
-        database_id:
-          type: string
-          format: uuid
-          example: 2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4
-        ord:
-          type: integer
-          format: int32
-          example: 0
-        internal_name:
-          type: string
-          example: given_name
-          maxLength: 64
-          minLength: 0
-        index_length:
-          type: integer
-          format: int64
-          example: 255
-        length:
-          type: integer
-          format: int64
-          example: 255
-        type:
-          type: string
-          enum:
-          - char
-          - varchar
-          - binary
-          - varbinary
-          - tinyblob
-          - tinytext
-          - text
-          - blob
-          - mediumtext
-          - mediumblob
-          - longtext
-          - longblob
-          - enum
-          - set
-          - serial
-          - bit
-          - tinyint
-          - bool
-          - smallint
-          - mediumint
-          - int
-          - bigint
-          - float
-          - double
-          - decimal
-          - date
-          - datetime
-          - timestamp
-          - time
-          - year
-          example: varchar
-        is_null_allowed:
-          type: boolean
-          example: false
-      required:
-      - database_id
-      - id
-      - internal_name
-      - is_null_allowed
-      - name
-      - ord
-      - type
-    ViewDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 787439d0-e85e-400c-a7e6-996a023bfad9
-        name:
-          type: string
-          example: Air Quality
-        identifiers:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierDto"
-        query:
-          type: string
-          example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC
-        owner:
-          $ref: "#/components/schemas/UserBriefDto"
-        columns:
-          type: array
-          items:
-            $ref: "#/components/schemas/ViewColumnDto"
-        created:
-          type: string
-          format: date-time
-          example: 2022-01-01 08:00:00.000
-        last_retrieved:
-          type: string
-          format: date-time
-          example: 2025-01-23T12:09:01
-        database_id:
-          type: string
-          format: uuid
-          example: fc29f89c-86a8-4020-9e36-4d954736c6cc
-        internal_name:
-          type: string
-          example: air_quality
-        is_public:
-          type: boolean
-          example: true
-        is_schema_public:
-          type: boolean
-          example: true
-        initial_view:
-          type: boolean
-          description: True if it is the default view for the database
-          example: true
-        query_hash:
-          type: string
-          example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916
-      required:
-      - columns
-      - created
-      - database_id
-      - id
-      - identifiers
-      - internal_name
-      - name
-      - owner
-      - query
-      - query_hash
-    TupleDto:
-      type: object
-      properties:
-        data:
-          type: object
-          additionalProperties:
-            type: object
-          example:
-            key: value
-      required:
-      - data
-    ImportDto:
-      type: object
-      properties:
-        location:
-          type: string
-          example: file.csv
-        header:
-          type: boolean
-          description: "If true, the first line contains the column names, otherwise\
-            \ it contains only data"
-          example: true
-        separator:
-          type: string
-          example: ","
-        quote:
-          type: string
-          example: '"'
-        line_termination:
-          type: string
-          example: \r\n
-      required:
-      - header
-      - location
-      - separator
-    FilterDto:
-      type: object
-      properties:
-        type:
-          type: string
-          enum:
-          - where
-          - or
-          - and
-          example: where
-        value:
-          type: string
-          example: 1
-        column_id:
-          type: string
-          format: uuid
-          example: 14128033-54b5-4818-a489-21b0dded86e2
-        operator_id:
-          type: string
-          format: uuid
-          example: 67c5b54d-2eb0-4f42-8dc1-a504562e9f32
-      required:
-      - column_id
-      - operator_id
-      - type
-      - value
-    OrderDto:
-      type: object
-      properties:
-        direction:
-          type: string
-          enum:
-          - asc
-          - desc
-          example: asc
-        column_id:
-          type: string
-          format: uuid
-          example: e891ba86-0258-41a6-a8d9-ff58bc10b618
-      required:
-      - column_id
-    SubsetDto:
-      type: object
-      properties:
-        columns:
-          type: array
-          example:
-          - e891ba86-0258-41a6-a8d9-ff58bc10b618
-          items:
-            type: string
-            format: uuid
-        filter:
-          type: array
-          items:
-            $ref: "#/components/schemas/FilterDto"
-        order:
-          type: array
-          items:
-            $ref: "#/components/schemas/OrderDto"
-        datasource_id:
-          type: string
-          format: uuid
-          example: f7df2a7d-4ade-4c78-97b0-7c744d0893c7
-        datasource_type:
-          type: string
-          enum:
-          - table
-          - view
-      required:
-      - columns
-      - datasource_id
-      - datasource_type
-    TableHistoryDto:
-      type: object
-      properties:
-        timestamp:
-          type: string
-          format: date-time
-          example: 2021-03-12T15:26:21Z
-        event:
-          type: string
-          enum:
-          - insert
-          - delete
-          example: INSERT
-        total:
-          type: integer
-          format: int64
-          example: 1
-      required:
-      - event
-      - timestamp
-      - total
-    TupleDeleteDto:
-      type: object
-      properties:
-        keys:
-          type: object
-          additionalProperties:
-            type: object
-          example:
-            id: 1
-      required:
-      - keys
-  securitySchemes:
-    basicAuth:
-      type: http
-      scheme: basic
-    bearerAuth:
-      type: http
-      scheme: bearer
-      bearerFormat: JWT
diff --git a/.docs/.openapi/api-metadata-service.yaml b/.docs/.openapi/api-metadata-service.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..8367c4c7b6aae081447758a673f72f7b1233989f
--- /dev/null
+++ b/.docs/.openapi/api-metadata-service.yaml
@@ -0,0 +1,9754 @@
+{
+  "openapi": "3.1.0",
+  "info": {
+    "title": "Database Repository Metadata Service API",
+    "description": "Service that manages the metadata",
+    "contact": {
+      "name": "Prof. Andreas Rauber",
+      "email": "andreas.rauber@tuwien.ac.at"
+    },
+    "license": {
+      "name": "Apache 2.0",
+      "url": "https://www.apache.org/licenses/LICENSE-2.0"
+    },
+    "version": "1.8.2"
+  },
+  "externalDocs": {
+    "description": "Sourcecode Documentation",
+    "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8.2/system-services-metadata/"
+  },
+  "servers": [
+    {
+      "url": "http://localhost",
+      "description": "Development instance"
+    },
+    {
+      "url": "https://test.dbrepo.tuwien.ac.at",
+      "description": "Staging instance"
+    }
+  ],
+  "paths": {
+    "/api/user/{userId}": {
+      "get": {
+        "tags": [
+          "user-endpoint"
+        ],
+        "summary": "Get user",
+        "description": "Gets own user information from the metadata database. Requires authentication. Foreign user information can only be obtained if additional role `find-foreign-user` is present. Finding information about internal users results in a 404 error.",
+        "operationId": "find",
+        "parameters": [
+          {
+            "name": "userId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Found user",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/UserDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Find user is not permitted",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "User was not found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "put": {
+        "tags": [
+          "user-endpoint"
+        ],
+        "summary": "Update user",
+        "description": "Updates user with id. Requires role `modify-user-information`.",
+        "operationId": "modify",
+        "parameters": [
+          {
+            "name": "userId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/UserUpdateDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Modified user information",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/UserDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Modify user query is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not allowed to modify user metadata",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database/user in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to modify user at auth service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "head": {
+        "tags": [
+          "user-endpoint"
+        ],
+        "summary": "Get user",
+        "description": "Gets own user information from the metadata database. Requires authentication. Foreign user information can only be obtained if additional role `find-foreign-user` is present. Finding information about internal users results in a 404 error.",
+        "operationId": "find_1",
+        "parameters": [
+          {
+            "name": "userId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Found user",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/UserDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Find user is not permitted",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "User was not found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database": {
+      "get": {
+        "tags": [
+          "database-endpoint"
+        ],
+        "summary": "List databases",
+        "description": "Lists all databases in the metadata database. Requests with HTTP method **GET** return the list of databases, requests with HTTP method **HEAD** only the number in the `X-Count` header.",
+        "operationId": "list",
+        "parameters": [
+          {
+            "name": "internal_name",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "List of databases",
+            "headers": {
+              "Access-Control-Expose-Headers": {
+                "description": "Expose `X-Count` custom header",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "X-Count": {
+                "description": "Number of databases",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "integer",
+                  "format": "int64"
+                }
+              }
+            },
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/DatabaseBriefDto"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": [
+          "database-endpoint"
+        ],
+        "summary": "Create database",
+        "description": "Creates a database in the container with id. Requires roles `create-database`.",
+        "operationId": "create",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/CreateDatabaseDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "description": "Created a new database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseBriefDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Database create query is malformed or image is not supported",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Database create permission is missing or grant permissions at broker service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to fin container/user/database in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "409": {
+            "description": "Query store could not be created",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "423": {
+            "description": "Database quota exceeded",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "head": {
+        "tags": [
+          "database-endpoint"
+        ],
+        "summary": "List databases",
+        "description": "Lists all databases in the metadata database. Requests with HTTP method **GET** return the list of databases, requests with HTTP method **HEAD** only the number in the `X-Count` header.",
+        "operationId": "list_1",
+        "parameters": [
+          {
+            "name": "internal_name",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "List of databases",
+            "headers": {
+              "Access-Control-Expose-Headers": {
+                "description": "Expose `X-Count` custom header",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "X-Count": {
+                "description": "Number of databases",
+                "required": true,
+                "style": "simple",
+                "schema": {
+                  "type": "integer",
+                  "format": "int64"
+                }
+              }
+            },
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/DatabaseBriefDto"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/api/database/{databaseId}/access/{userId}": {
+      "get": {
+        "tags": [
+          "access-endpoint"
+        ],
+        "summary": "Find/Check access",
+        "description": "Finds or checks access of a user with given id to a database with given id. Requests with HTTP method **GET** return the access object, requests with HTTP method **HEAD** only the status. When the user has at least *READ* access, the status 200 is returned, 403 otherwise. Requires role `check-database-access` or `check-foreign-database-access`.",
+        "operationId": "find_2",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "userId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Found database access",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseAccessDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "No access to this database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database not found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "put": {
+        "tags": [
+          "access-endpoint"
+        ],
+        "summary": "Modify access",
+        "description": "Modifies access of a user with given id to database with given id. Requires role `update-database-access`.",
+        "operationId": "update",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "userId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/CreateAccessDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Modified access"
+          },
+          "400": {
+            "description": "Modify access query or database connection is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Modify access not permitted when no access is granted in the first place",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database or user not found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Access could not be updated due to connection error in the data service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Access could not be updated in the data service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "post": {
+        "tags": [
+          "access-endpoint"
+        ],
+        "summary": "Give access",
+        "description": "Give a user with given id access to some database with given id. Requires role `create-database-access`.",
+        "operationId": "create_1",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "userId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/CreateAccessDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Granting access succeeded",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseAccessDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Granting access query or database connection is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Failed giving access",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database or user not found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Access could not be created due to connection error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Access could not be created in the data service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "delete": {
+        "tags": [
+          "access-endpoint"
+        ],
+        "summary": "Delete access",
+        "description": "Delete access of a user with id to a database with id. Requires role `delete-database-access`.",
+        "operationId": "revoke",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "userId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "Deleted access"
+          },
+          "400": {
+            "description": "Modify access query or database connection is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Revoke of access not permitted as no access was found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "User, database with access was not found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Access could not be created due to connection error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Access could not be revoked in the data service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "head": {
+        "tags": [
+          "access-endpoint"
+        ],
+        "summary": "Find/Check access",
+        "description": "Finds or checks access of a user with given id to a database with given id. Requests with HTTP method **GET** return the access object, requests with HTTP method **HEAD** only the status. When the user has at least *READ* access, the status 200 is returned, 403 otherwise. Requires role `check-database-access` or `check-foreign-database-access`.",
+        "operationId": "find_3",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "userId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Found database access",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseAccessDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "No access to this database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database not found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/ontology/{ontologyId}": {
+      "get": {
+        "tags": [
+          "ontology-endpoint"
+        ],
+        "summary": "Find ontology",
+        "description": "Finds an ontology with id in the metadata database.",
+        "operationId": "find_4",
+        "parameters": [
+          {
+            "name": "ontologyId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Find one ontology",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OntologyDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Could not find ontology",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "ontology-endpoint"
+        ],
+        "summary": "Update ontology",
+        "description": "Updates an ontology with id. Requires role `update-ontology`.",
+        "operationId": "update_1",
+        "parameters": [
+          {
+            "name": "ontologyId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/OntologyModifyDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Updated ontology successfully",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OntologyDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Could not find ontology",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "delete": {
+        "tags": [
+          "ontology-endpoint"
+        ],
+        "summary": "Delete ontology",
+        "description": "Deletes an ontology with given id. Requires role `delete-ontology`.",
+        "operationId": "delete",
+        "parameters": [
+          {
+            "name": "ontologyId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "Deleted ontology successfully",
+            "content": {
+              "application/json": {}
+            }
+          },
+          "404": {
+            "description": "Could not find ontology",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/message/{messageId}": {
+      "put": {
+        "tags": [
+          "message-endpoint"
+        ],
+        "summary": "Update message",
+        "description": "Updates a message with id. Requires role `update-maintenance-message`.",
+        "operationId": "update_2",
+        "parameters": [
+          {
+            "name": "messageId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/BannerMessageUpdateDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Updated message",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/BannerMessageBriefDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Could not find message",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "delete": {
+        "tags": [
+          "message-endpoint"
+        ],
+        "summary": "Delete message",
+        "description": "Deletes a message with id. Requires role `delete-maintenance-message`.",
+        "operationId": "delete_1",
+        "parameters": [
+          {
+            "name": "messageId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "Deleted message",
+            "content": {
+              "application/json": {}
+            }
+          },
+          "404": {
+            "description": "Could not find message",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/image/{imageId}": {
+      "get": {
+        "tags": [
+          "image-endpoint"
+        ],
+        "summary": "Find image",
+        "description": "Finds a container image in the metadata database.",
+        "operationId": "findById",
+        "parameters": [
+          {
+            "name": "imageId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Found image",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ImageDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Image could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "image-endpoint"
+        ],
+        "summary": "Update image",
+        "description": "Updates container image in the metadata database. Requires role `modify-image`.",
+        "operationId": "update_3",
+        "parameters": [
+          {
+            "name": "imageId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ImageChangeDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Updated image successfully",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ImageDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Image could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "delete": {
+        "tags": [
+          "image-endpoint"
+        ],
+        "summary": "Delete image",
+        "description": "Deletes a container image in the metadata database. Requires role `delete-image`.",
+        "operationId": "delete_2",
+        "parameters": [
+          {
+            "name": "imageId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "Deleted image successfully"
+          },
+          "404": {
+            "description": "Image could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/identifier/{identifierId}": {
+      "get": {
+        "tags": [
+          "identifier-endpoint"
+        ],
+        "summary": "Find identifier",
+        "description": "Finds an identifier with id. The response format depends on the HTTP `Accept` header set on the request.",
+        "operationId": "find_5",
+        "parameters": [
+          {
+            "name": "identifierId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "Accept",
+            "in": "header",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Found identifier successfully",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/IdentifierDto"
+                }
+              },
+              "application/ld+json": {
+                "schema": {
+                  "$ref": "#/components/schemas/LdDatasetDto"
+                }
+              },
+              "text/xml": {},
+              "text/bibliography": {},
+              "text/bibliography; style=apa": {},
+              "text/bibliography; style=ieee": {},
+              "text/bibliography; style=bibtex": {}
+            }
+          },
+          "400": {
+            "description": "Identifier could not be exported, the requested style is not known",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not allowed to view identifier",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Identifier could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "406": {
+            "description": "Failed to find acceptable representation",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "409": {
+            "description": "Exported resource was not found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "410": {
+            "description": "Failed to retrieve from S3 endpoint",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to data service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to find in data service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "identifier-endpoint"
+        ],
+        "summary": "Save identifier",
+        "description": "Saves an identifier with id as a draft identifier. Identifiers can only be created for objects the user has at least *READ* access in the associated database (requires role `create-identifier`) or for any object in any database (requires role `create-foreign-identifier`).",
+        "operationId": "save",
+        "parameters": [
+          {
+            "name": "identifierId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/IdentifierSaveDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Saved identifier",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/IdentifierDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Identifier form contains invalid request data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Insufficient access rights or authorities",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database, table or view",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "delete": {
+        "tags": [
+          "identifier-endpoint"
+        ],
+        "summary": "Delete identifier",
+        "description": "Deletes an identifier with id. Requires role `delete-identifier`.",
+        "operationId": "delete_3",
+        "parameters": [
+          {
+            "name": "identifierId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "Deleted identifier"
+          },
+          "403": {
+            "description": "Deleting identifier not permitted",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Identifier or database could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to delete in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/identifier/{identifierId}/publish": {
+      "put": {
+        "tags": [
+          "identifier-endpoint"
+        ],
+        "summary": "Publish identifier",
+        "description": "Publishes an identifier with id. A published identifier cannot be changed anymore. Requires role `publish-identifier`.",
+        "operationId": "publish",
+        "parameters": [
+          {
+            "name": "identifierId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "Published identifier",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/IdentifierDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Identifier form contains invalid request data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Insufficient access rights or authorities",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database, table or view",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/visibility": {
+      "put": {
+        "tags": [
+          "database-endpoint"
+        ],
+        "summary": "Update database visibility",
+        "description": "Updates the database with id on the visibility. Only the database owner can perform this operation. Requires role `modify-database-visibility`.",
+        "operationId": "visibility",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DatabaseModifyVisibilityDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Visibility modified successfully",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseBriefDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "The visibility payload is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Visibility modification is not permitted",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/view/{viewId}": {
+      "get": {
+        "tags": [
+          "view-endpoint"
+        ],
+        "summary": "Get view",
+        "description": "Gets a view with id in the metadata database.",
+        "operationId": "find_6",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "viewId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Find view successfully",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ViewDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Find view is not permitted",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database, view or user could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "put": {
+        "tags": [
+          "view-endpoint"
+        ],
+        "summary": "Update view",
+        "description": "Updates a view with id. This can only be performed by the view owner or database owner. Requires role `create-database-view`.",
+        "operationId": "update_4",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "viewId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ViewUpdateDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Update view successfully",
+            "content": {
+              "*/*": {
+                "schema": {
+                  "$ref": "#/components/schemas/ViewBriefDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Update view query is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Update not allowed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database or View could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "delete": {
+        "tags": [
+          "view-endpoint"
+        ],
+        "summary": "Delete view",
+        "description": "Deletes a view with id. Requires role `delete-database-view`.",
+        "operationId": "delete_4",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "viewId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "Delete view successfully"
+          },
+          "400": {
+            "description": "Delete view query is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Deletion not allowed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database, view or user could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "423": {
+            "description": "Delete view resulted in an invalid query statement",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/table/{tableId}": {
+      "get": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Find table",
+        "description": "Finds a table with id. When a table is hidden (i.e. when `is_public` is `false`), then the user needs to have at least read access and the role `find-table`. When the `system` role is present, the endpoint responds with additional connection metadata in the header.",
+        "operationId": "findById_1",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tableId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Find table successfully",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/TableDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Access to the database is forbidden",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Table, database or container could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "put": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Update table",
+        "description": "Updates a table in the database with id. Requires role `update-table`.",
+        "operationId": "update_5",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tableId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/TableUpdateDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Updated the table",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/TableBriefDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Update table visibility payload is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Update table visibility not permitted",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Table could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "delete": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Delete table",
+        "description": "Deletes a table with id. Only the owner of a table can perform this action (requires role `delete-table`) or anyone can delete a table (requires role `delete-foreign-table`).",
+        "operationId": "delete_5",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tableId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "Delete table successfully"
+          },
+          "400": {
+            "description": "Delete table query resulted in an invalid query statement",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Access to the database is forbidden",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Table, database or container could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/table/{tableId}/statistic": {
+      "put": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Update statistics",
+        "description": "Updates basic statistical properties (min, max, mean, median, std.dev) for numerical columns in a table with id. This action can only be performed by the table owner. Requires role `update-table-statistic`.",
+        "operationId": "updateStatistic",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tableId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "Updated table statistics successfully"
+          },
+          "400": {
+            "description": "Failed to map column statistic to known columns",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not the owner",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database/table in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/table/{tableId}/column/{columnId}": {
+      "put": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Update semantics",
+        "description": "Updates column semantics of a table column with id. Only the table owner with at least *READ* access to the associated database can update the column semantics (requires role `modify-table-column-semantics`) or foreign table columns if role `modify-foreign-table-column-semantics`.",
+        "operationId": "updateColumn",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tableId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "columnId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ColumnSemanticsUpdateDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Updated column semantics successfully",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ColumnDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Update semantic concept query is malformed or update unit of measurement query is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Access to the database is forbidden",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find user/table/database/ontology in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/owner": {
+      "put": {
+        "tags": [
+          "database-endpoint"
+        ],
+        "summary": "Update database owner",
+        "description": "Updates the database with id on the owner. Only the database owner can perform this operation. Requires role `modify-database-owner`.",
+        "operationId": "transfer",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DatabaseTransferDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Transfer of ownership was successful",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseBriefDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Owner payload is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database or user could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Transfer of ownership is not permitted",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/metadata/view": {
+      "put": {
+        "tags": [
+          "database-endpoint"
+        ],
+        "summary": "Update database view schemas",
+        "description": "Updates the database with id with generated metadata from view that are not yet known to the database. Only the database owner can perform this operation. Requires role `find-database`.",
+        "operationId": "refreshViewMetadata",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Refreshed database views metadata",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseBriefDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Refresh view metadata is not permitted",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/metadata/table": {
+      "put": {
+        "tags": [
+          "database-endpoint"
+        ],
+        "summary": "Update database table schemas",
+        "description": "Updates the database with id with generated metadata from tables that are not yet known to the database. Only the database owner can perform this operation. Requires role `find-database`.",
+        "operationId": "refreshTableMetadata",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Refreshed database tables metadata",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseBriefDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Failed to parse payload at search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not allowed to refresh table metadata",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/image": {
+      "get": {
+        "tags": [
+          "database-endpoint"
+        ],
+        "summary": "Get database preview image",
+        "description": "Gets the database with id on the preview image.",
+        "operationId": "findPreviewImage",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "View of image was successful",
+            "content": {
+              "*/*": {
+                "schema": {
+                  "type": "string",
+                  "format": "byte"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database or user could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "put": {
+        "tags": [
+          "database-endpoint"
+        ],
+        "summary": "Update database preview image",
+        "description": "Updates the database with id on the preview image. Only the database owner can perform this operation. Requires role `modify-database-image`.",
+        "operationId": "modifyImage",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DatabaseModifyImageDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Modify of image was successful",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseBriefDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Modify of image is not permitted",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "410": {
+            "description": "File was not found in the Storage Service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/dashboard": {
+      "put": {
+        "tags": [
+          "database-endpoint"
+        ],
+        "summary": "Update database dashboard uid",
+        "description": "Updates the dashboard uid for a database with given id. Only the database owner can perform this operation. Requires role `system`.",
+        "operationId": "modifyDashboard",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DatabaseModifyDashboardDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "202": {
+            "description": "Modify of dashboard uid was successful",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseBriefDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Malformed payload",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/ontology": {
+      "get": {
+        "tags": [
+          "ontology-endpoint"
+        ],
+        "summary": "List ontologies",
+        "description": "Lists all ontologies known to the metadata database.",
+        "operationId": "findAll",
+        "responses": {
+          "200": {
+            "description": "List ontologies",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/OntologyBriefDto"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": [
+          "ontology-endpoint"
+        ],
+        "summary": "Create ontology",
+        "description": "Creates an ontology in the metadata database. Requires role `create-ontology`.",
+        "operationId": "create_2",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/OntologyCreateDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "description": "Registered ontology successfully",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OntologyDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/message": {
+      "get": {
+        "tags": [
+          "message-endpoint"
+        ],
+        "summary": "List messages",
+        "description": "Lists messages known to the metadata database. Messages can be filtered be filtered with the optional `active` parameter. If set to *true*, only active messages (that is, messages whose end time has not been reached) will be returned. Otherwise only inactive messages are returned. If not set, active and inactive messages are returned.",
+        "operationId": "list_2",
+        "parameters": [
+          {
+            "name": "active",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "boolean"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "List messages",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/BannerMessageDto"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": [
+          "message-endpoint"
+        ],
+        "summary": "Create message",
+        "description": "Creates a message in the metadata database. Requires role `create-maintenance-message`.",
+        "operationId": "create_3",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/BannerMessageCreateDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "description": "Created message",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/BannerMessageBriefDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/image": {
+      "get": {
+        "tags": [
+          "image-endpoint"
+        ],
+        "summary": "List images",
+        "description": "Lists all container images known to the metadata database.",
+        "operationId": "findAll_1",
+        "responses": {
+          "200": {
+            "description": "List images",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/ImageBriefDto"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": [
+          "image-endpoint"
+        ],
+        "summary": "Create image",
+        "description": "Creates a container image in the metadata database. Requires role `create-image`.",
+        "operationId": "create_4",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ImageCreateDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "description": "Created image",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ImageDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Image specification is invalid",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "409": {
+            "description": "Image already exists",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/identifier": {
+      "get": {
+        "tags": [
+          "identifier-endpoint"
+        ],
+        "summary": "List identifiers",
+        "description": "Lists all identifiers known to the metadata database",
+        "operationId": "findAll_2",
+        "parameters": [
+          {
+            "name": "type",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "enum": [
+                "database",
+                "subset",
+                "table",
+                "view"
+              ]
+            }
+          },
+          {
+            "name": "status",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "enum": [
+                "draft",
+                "published"
+              ]
+            }
+          },
+          {
+            "name": "dbid",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "qid",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "vid",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tid",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "Accept",
+            "in": "header",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Found identifiers successfully",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "type": "array",
+                    "items": {
+                      "$ref": "#/components/schemas/IdentifierBriefDto"
+                    }
+                  }
+                }
+              },
+              "application/ld+json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/LdDatasetDto"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": [
+          "identifier-endpoint"
+        ],
+        "summary": "Create identifier",
+        "description": "Create an identifier with id to create a draft identifier. Identifiers can only be created for objects the user has at least *READ* access in the associated database (requires role `create-identifier`) or for any object in any database (requires role `create-foreign-identifier`).",
+        "operationId": "create_5",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/CreateIdentifierDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "description": "Drafted identifier",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/IdentifierDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Identifier form contains invalid request data",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Insufficient access rights or authorities",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database, table or view",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/view": {
+      "get": {
+        "tags": [
+          "view-endpoint"
+        ],
+        "summary": "List views",
+        "description": "Lists views known to the metadata database.",
+        "operationId": "findAll_3",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Find views successfully",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/ViewBriefDto"
+                  }
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database or user could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "post": {
+        "tags": [
+          "view-endpoint"
+        ],
+        "summary": "Create view",
+        "description": "Creates a view. This can only be performed by the database owner. Requires role `create-database-view`.",
+        "operationId": "create_6",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/CreateViewDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "description": "Create view successfully",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ViewBriefDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Create view query is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Credentials missing",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database/user in metadata database.",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "409": {
+            "description": "View exists with name",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "423": {
+            "description": "Create view resulted in an invalid query statement",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/table": {
+      "get": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "List tables",
+        "description": "Lists all tables known to the metadata database. When a database has a hidden schema (i.e. when `is_schema_public` is `false`), then the user needs to have at least read access and the role `list-tables`.",
+        "operationId": "list_3",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "List tables",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/TableBriefDto"
+                  }
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "List tables not permitted",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      },
+      "post": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Create table",
+        "description": "Creates a table in the database with id. Requires role `create-table`.",
+        "operationId": "create_7",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/CreateTableDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "description": "Created a new table",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/TableBriefDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Create table query is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Create table not permitted",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database, container or user could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "409": {
+            "description": "Create table conflicts with existing table name",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "502": {
+            "description": "Connection to search service failed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "503": {
+            "description": "Failed to save in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/container": {
+      "get": {
+        "tags": [
+          "container-endpoint"
+        ],
+        "summary": "List containers",
+        "description": "List all containers in the metadata database.",
+        "operationId": "findAll_4",
+        "parameters": [
+          {
+            "name": "limit",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int32"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "List containers",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/ContainerBriefDto"
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": [
+          "container-endpoint"
+        ],
+        "summary": "Create container",
+        "description": "Creates a container in the metadata database. Requires role `create-container`.",
+        "operationId": "create_8",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/CreateContainerDto"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "description": "Created a new container",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ContainerDto"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Container payload malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Create container not permitted, need authority `create-container`",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Container image or user could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "409": {
+            "description": "Container name already exists",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/user": {
+      "get": {
+        "tags": [
+          "user-endpoint"
+        ],
+        "summary": "List users",
+        "description": "Lists users known to the metadata database. Internal users are omitted from the result list. If the optional query parameter `username` is present, the result list can be filtered by matching this exact username.",
+        "operationId": "findAll_5",
+        "parameters": [
+          {
+            "name": "username",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "List users",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/UserBriefDto"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/api/unit": {
+      "get": {
+        "tags": [
+          "unit-endpoint"
+        ],
+        "summary": "List units",
+        "description": "Lists units known to the metadata database.",
+        "operationId": "findAll_6",
+        "responses": {
+          "200": {
+            "description": "Find all semantic units",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/UnitDto"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/api/ontology/{ontologyId}/entity": {
+      "get": {
+        "tags": [
+          "ontology-endpoint"
+        ],
+        "summary": "Find entities",
+        "description": "Finds semantic entities by label or uri in an ontology with id. Requires role `execute-semantic-query`.",
+        "operationId": "find_7",
+        "parameters": [
+          {
+            "name": "ontologyId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "label",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "name": "uri",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Found entities",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/EntityDto"
+                  }
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Filter params are invalid",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Could not find ontology",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "417": {
+            "description": "Generated query or uri is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Ontology does not have rdf or sparql endpoint",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/oai": {
+      "get": {
+        "tags": [
+          "metadata-endpoint"
+        ],
+        "summary": "Get record",
+        "operationId": "identify",
+        "parameters": [
+          {
+            "name": "verb",
+            "in": "query"
+          },
+          {
+            "name": "parameters",
+            "in": "query",
+            "required": true,
+            "schema": {
+              "$ref": "#/components/schemas/OaiListIdentifiersParameters"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "List containers",
+            "content": {
+              "text/xml": {
+                "schema": {
+                  "type": "string"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/api/message/message/{messageId}": {
+      "get": {
+        "tags": [
+          "message-endpoint"
+        ],
+        "summary": "Find message",
+        "description": "Finds a message with id in the metadata database.",
+        "operationId": "find_8",
+        "parameters": [
+          {
+            "name": "messageId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Get messages",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/BannerMessageDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Could not find message",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/api/license": {
+      "get": {
+        "tags": [
+          "license-endpoint"
+        ],
+        "summary": "List licenses",
+        "description": "Lists licenses known to the metadata database.",
+        "operationId": "list_4",
+        "responses": {
+          "200": {
+            "description": "List of licenses",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/LicenseDto"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/api/identifier/retrieve": {
+      "get": {
+        "tags": [
+          "identifier-endpoint"
+        ],
+        "summary": "Retrieve PID metadata",
+        "description": "Retrieves Persistent Identifier (PID) metadata from external endpoints. Supported PIDs are: ORCID, ROR, DOI.",
+        "operationId": "retrieve",
+        "parameters": [
+          {
+            "name": "url",
+            "in": "query",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Retrieved metadata from identifier",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/IdentifierDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find metadata for identifier",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/api/database/{databaseId}": {
+      "get": {
+        "tags": [
+          "database-endpoint"
+        ],
+        "summary": "Find database",
+        "description": "Finds a database with id.",
+        "operationId": "findById_2",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Database found successfully",
+            "headers": {
+              "X-Username": {
+                "description": "The authentication username",
+                "style": "simple",
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "Access-Control-Expose-Headers": {
+                "description": "Expose custom headers",
+                "style": "simple",
+                "schema": {
+                  "type": "string"
+                }
+              },
+              "X-Password": {
+                "description": "The authentication password",
+                "style": "simple",
+                "schema": {
+                  "type": "string"
+                }
+              }
+            },
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/DatabaseBriefDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not allowed to view database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Database could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/table/{tableId}/suggest": {
+      "get": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Suggest semantics",
+        "description": "Suggests semantic concepts for a table. This action can only be performed by the table owner. Requires role `table-semantic-analyse`.",
+        "operationId": "analyseTable",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tableId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Suggested table semantics successfully",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/EntityDto"
+                  }
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Failed to parse statistic in search service",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Not the table owner.",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database/table in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "417": {
+            "description": "Generated query is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Ontology does not have rdf or sparql endpoint",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/database/{databaseId}/table/{tableId}/column/{columnId}/suggest": {
+      "get": {
+        "tags": [
+          "table-endpoint"
+        ],
+        "summary": "Suggest semantics",
+        "description": "Suggests column semantics. Requires role `table-semantic-analyse`.",
+        "operationId": "analyseTableColumn",
+        "parameters": [
+          {
+            "name": "databaseId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "tableId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          {
+            "name": "columnId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Suggested table column semantics successfully",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/TableColumnEntityDto"
+                  }
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Generated query is malformed",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Failed to find database/table in metadata database",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Ontology does not have rdf or sparql endpoint",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/container/{containerId}": {
+      "get": {
+        "tags": [
+          "container-endpoint"
+        ],
+        "summary": "Find container",
+        "description": "Finds a container in the metadata database.",
+        "operationId": "findById_3",
+        "parameters": [
+          {
+            "name": "containerId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Found container",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ContainerDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Container image could not be found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "container-endpoint"
+        ],
+        "summary": "Delete container",
+        "description": "Deletes a container in the metadata database. Requires role `delete-container`.",
+        "operationId": "delete_6",
+        "parameters": [
+          {
+            "name": "containerId",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid"
+            }
+          }
+        ],
+        "responses": {
+          "202": {
+            "description": "Deleted container"
+          },
+          "403": {
+            "description": "Create container not permitted, need authority `delete-container`",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          },
+          "404": {
+            "description": "Container not found",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ApiErrorDto"
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ]
+      }
+    },
+    "/api/concept": {
+      "get": {
+        "tags": [
+          "concept-endpoint"
+        ],
+        "summary": "List concepts",
+        "description": "List all semantic concepts known to the metadata database",
+        "operationId": "findAll_7",
+        "responses": {
+          "200": {
+            "description": "List concepts",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/ConceptDto"
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  },
+  "components": {
+    "schemas": {
+      "UserAttributesDto": {
+        "type": "object",
+        "properties": {
+          "theme": {
+            "type": "string",
+            "example": "light"
+          },
+          "orcid": {
+            "type": "string",
+            "example": "https://orcid.org/0000-0002-1825-0097"
+          },
+          "affiliation": {
+            "type": "string",
+            "example": "Brown University"
+          },
+          "language": {
+            "type": "string",
+            "example": "en"
+          }
+        },
+        "required": [
+          "language",
+          "theme"
+        ]
+      },
+      "UserDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4"
+          },
+          "name": {
+            "type": "string",
+            "example": "Josiah Carberry"
+          },
+          "username": {
+            "type": "string",
+            "example": "username"
+          },
+          "password": {
+            "type": "string",
+            "example": "p4ssw0rd"
+          },
+          "attributes": {
+            "$ref": "#/components/schemas/UserAttributesDto"
+          },
+          "last_retrieved": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2025-01-23T12:09:01"
+          },
+          "qualified_name": {
+            "type": "string",
+            "example": "Josiah Carberry — @jcarberry"
+          },
+          "given_name": {
+            "type": "string",
+            "example": "Josiah"
+          },
+          "family_name": {
+            "type": "string",
+            "example": "Carberry"
+          }
+        },
+        "required": [
+          "attributes",
+          "id",
+          "password",
+          "username"
+        ]
+      },
+      "ApiErrorDto": {
+        "type": "object",
+        "properties": {
+          "status": {
+            "type": "string",
+            "enum": [
+              "100 CONTINUE",
+              "101 SWITCHING_PROTOCOLS",
+              "102 PROCESSING",
+              "103 EARLY_HINTS",
+              "103 CHECKPOINT",
+              "200 OK",
+              "201 CREATED",
+              "202 ACCEPTED",
+              "203 NON_AUTHORITATIVE_INFORMATION",
+              "204 NO_CONTENT",
+              "205 RESET_CONTENT",
+              "206 PARTIAL_CONTENT",
+              "207 MULTI_STATUS",
+              "208 ALREADY_REPORTED",
+              "226 IM_USED",
+              "300 MULTIPLE_CHOICES",
+              "301 MOVED_PERMANENTLY",
+              "302 FOUND",
+              "302 MOVED_TEMPORARILY",
+              "303 SEE_OTHER",
+              "304 NOT_MODIFIED",
+              "305 USE_PROXY",
+              "307 TEMPORARY_REDIRECT",
+              "308 PERMANENT_REDIRECT",
+              "400 BAD_REQUEST",
+              "401 UNAUTHORIZED",
+              "402 PAYMENT_REQUIRED",
+              "403 FORBIDDEN",
+              "404 NOT_FOUND",
+              "405 METHOD_NOT_ALLOWED",
+              "406 NOT_ACCEPTABLE",
+              "407 PROXY_AUTHENTICATION_REQUIRED",
+              "408 REQUEST_TIMEOUT",
+              "409 CONFLICT",
+              "410 GONE",
+              "411 LENGTH_REQUIRED",
+              "412 PRECONDITION_FAILED",
+              "413 PAYLOAD_TOO_LARGE",
+              "413 REQUEST_ENTITY_TOO_LARGE",
+              "414 URI_TOO_LONG",
+              "414 REQUEST_URI_TOO_LONG",
+              "415 UNSUPPORTED_MEDIA_TYPE",
+              "416 REQUESTED_RANGE_NOT_SATISFIABLE",
+              "417 EXPECTATION_FAILED",
+              "418 I_AM_A_TEAPOT",
+              "419 INSUFFICIENT_SPACE_ON_RESOURCE",
+              "420 METHOD_FAILURE",
+              "421 DESTINATION_LOCKED",
+              "422 UNPROCESSABLE_ENTITY",
+              "423 LOCKED",
+              "424 FAILED_DEPENDENCY",
+              "425 TOO_EARLY",
+              "426 UPGRADE_REQUIRED",
+              "428 PRECONDITION_REQUIRED",
+              "429 TOO_MANY_REQUESTS",
+              "431 REQUEST_HEADER_FIELDS_TOO_LARGE",
+              "451 UNAVAILABLE_FOR_LEGAL_REASONS",
+              "500 INTERNAL_SERVER_ERROR",
+              "501 NOT_IMPLEMENTED",
+              "502 BAD_GATEWAY",
+              "503 SERVICE_UNAVAILABLE",
+              "504 GATEWAY_TIMEOUT",
+              "505 HTTP_VERSION_NOT_SUPPORTED",
+              "506 VARIANT_ALSO_NEGOTIATES",
+              "507 INSUFFICIENT_STORAGE",
+              "508 LOOP_DETECTED",
+              "509 BANDWIDTH_LIMIT_EXCEEDED",
+              "510 NOT_EXTENDED",
+              "511 NETWORK_AUTHENTICATION_REQUIRED"
+            ],
+            "example": "NOT_FOUND"
+          },
+          "message": {
+            "type": "string",
+            "example": "Error message"
+          },
+          "code": {
+            "type": "string",
+            "example": "error.service.code"
+          }
+        },
+        "required": [
+          "code",
+          "message",
+          "status"
+        ]
+      },
+      "CreatorBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "e41f94a6-2b94-4a12-ac0e-678684e1c070"
+          },
+          "affiliation": {
+            "type": "string",
+            "example": "Brown University"
+          },
+          "creator_name": {
+            "type": "string",
+            "example": "Carberry, Josiah"
+          },
+          "name_type": {
+            "type": "string",
+            "enum": [
+              "Personal",
+              "Organizational"
+            ],
+            "example": "Personal"
+          },
+          "name_identifier": {
+            "type": "string",
+            "example": "0000-0002-1825-0097"
+          },
+          "name_identifier_scheme": {
+            "type": "string",
+            "enum": [
+              "ORCID",
+              "ROR",
+              "ISNI",
+              "GRID"
+            ],
+            "example": "ORCID"
+          },
+          "affiliation_identifier": {
+            "type": "string",
+            "example": "https://ror.org/05gq02987"
+          },
+          "affiliation_identifier_scheme": {
+            "type": "string",
+            "enum": [
+              "ROR",
+              "GRID",
+              "ISNI"
+            ],
+            "example": "ROR"
+          }
+        },
+        "required": [
+          "creator_name",
+          "id"
+        ]
+      },
+      "DatabaseBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc"
+          },
+          "name": {
+            "type": "string",
+            "example": "Air Quality"
+          },
+          "description": {
+            "type": "string",
+            "example": "Air Quality"
+          },
+          "identifiers": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierBriefDto"
+            }
+          },
+          "contact": {
+            "$ref": "#/components/schemas/UserBriefDto"
+          },
+          "internal_name": {
+            "type": "string",
+            "example": "air_quality"
+          },
+          "is_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "is_schema_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "owner_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "2f45ef7a-7f9b-4667-9156-152c87fe1ca5"
+          },
+          "preview_image": {
+            "type": "string"
+          }
+        },
+        "required": [
+          "contact",
+          "id",
+          "identifiers",
+          "internal_name",
+          "is_public",
+          "is_schema_public",
+          "name",
+          "owner_id"
+        ]
+      },
+      "IdentifierBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "b97cd56b-66ca-4354-9e6c-f47210cfaaec"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "database",
+              "subset",
+              "table",
+              "view"
+            ],
+            "example": "database"
+          },
+          "creators": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/CreatorBriefDto"
+            }
+          },
+          "titles": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierTitleDto"
+            }
+          },
+          "descriptions": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierDescriptionDto"
+            }
+          },
+          "doi": {
+            "type": "string",
+            "example": "10.1038/nphys1170"
+          },
+          "publisher": {
+            "type": "string",
+            "example": "TU Wien"
+          },
+          "status": {
+            "type": "string",
+            "enum": [
+              "draft",
+              "published"
+            ],
+            "example": "draft"
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc"
+          },
+          "query_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": 1
+          },
+          "table_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": 1
+          },
+          "view_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": 1
+          },
+          "publication_year": {
+            "type": "integer",
+            "format": "int32",
+            "example": 2022
+          },
+          "owned_by": {
+            "type": "string",
+            "format": "uuid",
+            "example": "2f45ef7a-7f9b-4667-9156-152c87fe1ca5"
+          }
+        },
+        "required": [
+          "creators",
+          "database_id",
+          "descriptions",
+          "id",
+          "owned_by",
+          "publication_year",
+          "publisher",
+          "status",
+          "titles",
+          "type"
+        ]
+      },
+      "IdentifierDescriptionDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "e0e9692c-910b-4b60-b53a-fc7c358a917d"
+          },
+          "description": {
+            "type": "string",
+            "example": "Air quality reports at Stephansplatz, Vienna"
+          },
+          "language": {
+            "type": "string",
+            "enum": [
+              "ab",
+              "aa",
+              "af",
+              "ak",
+              "sq",
+              "am",
+              "ar",
+              "an",
+              "hy",
+              "as",
+              "av",
+              "ae",
+              "ay",
+              "az",
+              "bm",
+              "ba",
+              "eu",
+              "be",
+              "bn",
+              "bh",
+              "bi",
+              "bs",
+              "br",
+              "bg",
+              "my",
+              "ca",
+              "km",
+              "ch",
+              "ce",
+              "ny",
+              "zh",
+              "cu",
+              "cv",
+              "kw",
+              "co",
+              "cr",
+              "hr",
+              "cs",
+              "da",
+              "dv",
+              "nl",
+              "dz",
+              "en",
+              "eo",
+              "et",
+              "ee",
+              "fo",
+              "fj",
+              "fi",
+              "fr",
+              "ff",
+              "gd",
+              "gl",
+              "lg",
+              "ka",
+              "de",
+              "ki",
+              "el",
+              "kl",
+              "gn",
+              "gu",
+              "ht",
+              "ha",
+              "he",
+              "hz",
+              "hi",
+              "ho",
+              "hu",
+              "is",
+              "io",
+              "ig",
+              "id",
+              "ia",
+              "ie",
+              "iu",
+              "ik",
+              "ga",
+              "it",
+              "ja",
+              "jv",
+              "kn",
+              "kr",
+              "ks",
+              "kk",
+              "rw",
+              "kv",
+              "kg",
+              "ko",
+              "kj",
+              "ku",
+              "ky",
+              "lo",
+              "la",
+              "lv",
+              "lb",
+              "li",
+              "ln",
+              "lt",
+              "lu",
+              "mk",
+              "mg",
+              "ms",
+              "ml",
+              "mt",
+              "gv",
+              "mi",
+              "mr",
+              "mh",
+              "ro",
+              "mn",
+              "na",
+              "nv",
+              "nd",
+              "ng",
+              "ne",
+              "se",
+              "no",
+              "nb",
+              "nn",
+              "ii",
+              "oc",
+              "oj",
+              "or",
+              "om",
+              "os",
+              "pi",
+              "pa",
+              "ps",
+              "fa",
+              "pl",
+              "pt",
+              "qu",
+              "rm",
+              "rn",
+              "ru",
+              "sm",
+              "sg",
+              "sa",
+              "sc",
+              "sr",
+              "sn",
+              "sd",
+              "si",
+              "sk",
+              "sl",
+              "so",
+              "st",
+              "nr",
+              "es",
+              "su",
+              "sw",
+              "ss",
+              "sv",
+              "tl",
+              "ty",
+              "tg",
+              "ta",
+              "tt",
+              "te",
+              "th",
+              "bo",
+              "ti",
+              "to",
+              "ts",
+              "tn",
+              "tr",
+              "tk",
+              "tw",
+              "ug",
+              "uk",
+              "ur",
+              "uz",
+              "ve",
+              "vi",
+              "vo",
+              "wa",
+              "cy",
+              "fy",
+              "wo",
+              "xh",
+              "yi",
+              "yo",
+              "za",
+              "zu"
+            ],
+            "example": "en"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "Abstract",
+              "Methods",
+              "SeriesInformation",
+              "TableOfContents",
+              "TechnicalInfo",
+              "Other"
+            ],
+            "example": "Abstract"
+          }
+        },
+        "required": [
+          "id"
+        ]
+      },
+      "IdentifierTitleDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "70ce5164-fd74-413f-8712-f996b91defbf"
+          },
+          "title": {
+            "type": "string",
+            "example": "Airquality Demonstrator"
+          },
+          "language": {
+            "type": "string",
+            "enum": [
+              "ab",
+              "aa",
+              "af",
+              "ak",
+              "sq",
+              "am",
+              "ar",
+              "an",
+              "hy",
+              "as",
+              "av",
+              "ae",
+              "ay",
+              "az",
+              "bm",
+              "ba",
+              "eu",
+              "be",
+              "bn",
+              "bh",
+              "bi",
+              "bs",
+              "br",
+              "bg",
+              "my",
+              "ca",
+              "km",
+              "ch",
+              "ce",
+              "ny",
+              "zh",
+              "cu",
+              "cv",
+              "kw",
+              "co",
+              "cr",
+              "hr",
+              "cs",
+              "da",
+              "dv",
+              "nl",
+              "dz",
+              "en",
+              "eo",
+              "et",
+              "ee",
+              "fo",
+              "fj",
+              "fi",
+              "fr",
+              "ff",
+              "gd",
+              "gl",
+              "lg",
+              "ka",
+              "de",
+              "ki",
+              "el",
+              "kl",
+              "gn",
+              "gu",
+              "ht",
+              "ha",
+              "he",
+              "hz",
+              "hi",
+              "ho",
+              "hu",
+              "is",
+              "io",
+              "ig",
+              "id",
+              "ia",
+              "ie",
+              "iu",
+              "ik",
+              "ga",
+              "it",
+              "ja",
+              "jv",
+              "kn",
+              "kr",
+              "ks",
+              "kk",
+              "rw",
+              "kv",
+              "kg",
+              "ko",
+              "kj",
+              "ku",
+              "ky",
+              "lo",
+              "la",
+              "lv",
+              "lb",
+              "li",
+              "ln",
+              "lt",
+              "lu",
+              "mk",
+              "mg",
+              "ms",
+              "ml",
+              "mt",
+              "gv",
+              "mi",
+              "mr",
+              "mh",
+              "ro",
+              "mn",
+              "na",
+              "nv",
+              "nd",
+              "ng",
+              "ne",
+              "se",
+              "no",
+              "nb",
+              "nn",
+              "ii",
+              "oc",
+              "oj",
+              "or",
+              "om",
+              "os",
+              "pi",
+              "pa",
+              "ps",
+              "fa",
+              "pl",
+              "pt",
+              "qu",
+              "rm",
+              "rn",
+              "ru",
+              "sm",
+              "sg",
+              "sa",
+              "sc",
+              "sr",
+              "sn",
+              "sd",
+              "si",
+              "sk",
+              "sl",
+              "so",
+              "st",
+              "nr",
+              "es",
+              "su",
+              "sw",
+              "ss",
+              "sv",
+              "tl",
+              "ty",
+              "tg",
+              "ta",
+              "tt",
+              "te",
+              "th",
+              "bo",
+              "ti",
+              "to",
+              "ts",
+              "tn",
+              "tr",
+              "tk",
+              "tw",
+              "ug",
+              "uk",
+              "ur",
+              "uz",
+              "ve",
+              "vi",
+              "vo",
+              "wa",
+              "cy",
+              "fy",
+              "wo",
+              "xh",
+              "yi",
+              "yo",
+              "za",
+              "zu"
+            ],
+            "example": "en"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "AlternativeTitle",
+              "Subtitle",
+              "TranslatedTitle",
+              "Other"
+            ]
+          }
+        },
+        "required": [
+          "id"
+        ]
+      },
+      "UserBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4"
+          },
+          "username": {
+            "type": "string",
+            "description": "Only contains lowercase characters",
+            "example": "jcarberry"
+          },
+          "name": {
+            "type": "string",
+            "example": "Josiah Carberry"
+          },
+          "orcid": {
+            "type": "string",
+            "example": "0000-0002-1825-0097"
+          },
+          "qualified_name": {
+            "type": "string",
+            "example": "Josiah Carberry — @jcarberry"
+          },
+          "given_name": {
+            "type": "string",
+            "example": "Josiah"
+          },
+          "family_name": {
+            "type": "string",
+            "example": "Carberry"
+          }
+        },
+        "required": [
+          "id",
+          "username"
+        ]
+      },
+      "DatabaseAccessDto": {
+        "type": "object",
+        "properties": {
+          "user": {
+            "$ref": "#/components/schemas/UserBriefDto"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "read",
+              "write_own",
+              "write_all"
+            ],
+            "example": "read"
+          }
+        },
+        "required": [
+          "type",
+          "user"
+        ]
+      },
+      "UserUpdateDto": {
+        "type": "object",
+        "properties": {
+          "firstname": {
+            "type": "string",
+            "example": "Josiah"
+          },
+          "lastname": {
+            "type": "string",
+            "example": "Carberry"
+          },
+          "affiliation": {
+            "type": "string",
+            "example": "Brown University"
+          },
+          "orcid": {
+            "type": "string",
+            "example": "0000-0002-1825-0097"
+          },
+          "theme": {
+            "type": "string",
+            "example": "dark"
+          },
+          "language": {
+            "type": "string",
+            "example": "en"
+          }
+        },
+        "required": [
+          "language",
+          "theme"
+        ]
+      },
+      "OntologyModifyDto": {
+        "type": "object",
+        "properties": {
+          "uri": {
+            "type": "string",
+            "example": "Ontology URI"
+          },
+          "prefix": {
+            "type": "string",
+            "example": "Ontology prefix"
+          },
+          "sparql_endpoint": {
+            "type": "string",
+            "example": "Ontology SPARQL endpoint"
+          },
+          "rdf_path": {
+            "type": "string",
+            "example": "rdf/om-2.0.rdf"
+          }
+        },
+        "required": [
+          "prefix",
+          "uri"
+        ]
+      },
+      "OntologyDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "7c491e40-082a-47b8-b82c-51d03c520466"
+          },
+          "uri": {
+            "type": "string",
+            "example": "http://www.wikidata.org/"
+          },
+          "prefix": {
+            "type": "string",
+            "example": "wd"
+          },
+          "sparql": {
+            "type": "boolean",
+            "example": true
+          },
+          "rdf": {
+            "type": "boolean",
+            "example": false
+          },
+          "uri_pattern": {
+            "type": "string",
+            "example": "http://www.wikidata.org/entity/.*"
+          },
+          "sparql_endpoint": {
+            "type": "string",
+            "example": "https://query.wikidata.org/sparql"
+          },
+          "rdf_path": {
+            "type": "string",
+            "example": "rdf/om-2.0.rdf"
+          }
+        },
+        "required": [
+          "id",
+          "prefix",
+          "rdf",
+          "sparql",
+          "uri"
+        ]
+      },
+      "BannerMessageUpdateDto": {
+        "type": "object",
+        "properties": {
+          "type": {
+            "type": "string",
+            "enum": [
+              "error",
+              "warning",
+              "info"
+            ]
+          },
+          "message": {
+            "type": "string",
+            "example": "Maintenance starts on 8am on Monday"
+          },
+          "link": {
+            "type": "string",
+            "example": "https://example.com"
+          },
+          "link_text": {
+            "type": "string",
+            "example": "More"
+          },
+          "display_start": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2021-03-12T15:26:21Z"
+          },
+          "display_end": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2021-03-12T15:26:21Z"
+          }
+        },
+        "required": [
+          "message",
+          "type"
+        ]
+      },
+      "BannerMessageBriefDto": {
+        "type": "object",
+        "properties": {
+          "type": {
+            "type": "string",
+            "enum": [
+              "error",
+              "warning",
+              "info"
+            ]
+          },
+          "message": {
+            "type": "string",
+            "example": "Maintenance starts on 8am on Monday"
+          },
+          "link": {
+            "type": "string",
+            "example": "https://example.com"
+          },
+          "link_text": {
+            "type": "string",
+            "example": "More"
+          }
+        },
+        "required": [
+          "message",
+          "type"
+        ]
+      },
+      "ImageChangeDto": {
+        "type": "object",
+        "properties": {
+          "registry": {
+            "type": "string",
+            "example": "docker.io/library"
+          },
+          "defaultPort": {
+            "type": "integer",
+            "format": "int32",
+            "example": 5432,
+            "maximum": 65535,
+            "minimum": 1024
+          },
+          "dialect": {
+            "type": "string",
+            "example": "Postgres"
+          },
+          "driver_class": {
+            "type": "string",
+            "example": "org.postgresql.Driver"
+          },
+          "jdbc_method": {
+            "type": "string",
+            "example": "postgresql"
+          }
+        },
+        "required": [
+          "dialect",
+          "driver_class",
+          "jdbc_method",
+          "registry"
+        ]
+      },
+      "DataTypeDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "816f55d5-1098-4f60-a4af-c8121c04dcca"
+          },
+          "value": {
+            "type": "string",
+            "example": "time"
+          },
+          "documentation": {
+            "type": "string",
+            "example": "https://mariadb.com/kb/en/time/"
+          },
+          "display_name": {
+            "type": "string",
+            "example": "TIME(fsp)"
+          },
+          "size_min": {
+            "type": "integer",
+            "format": "int32",
+            "example": 0
+          },
+          "size_max": {
+            "type": "integer",
+            "format": "int32",
+            "example": 6
+          },
+          "size_default": {
+            "type": "integer",
+            "format": "int32",
+            "example": 0
+          },
+          "size_required": {
+            "type": "boolean",
+            "example": false
+          },
+          "d_min": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "d_max": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "d_default": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "d_required": {
+            "type": "boolean"
+          },
+          "data_hint": {
+            "type": "string",
+            "example": "e.g. HH:MM:SS, HH:MM, HHMMSS, H:M:S"
+          },
+          "type_hint": {
+            "type": "string",
+            "example": "fsp=microsecond precision, min. 0, max. 6"
+          },
+          "is_quoted": {
+            "type": "boolean",
+            "description": "frontend needs to quote this data type",
+            "example": false
+          },
+          "is_buildable": {
+            "type": "boolean",
+            "description": "frontend can build this data type",
+            "example": true
+          }
+        },
+        "required": [
+          "display_name",
+          "documentation",
+          "id",
+          "is_buildable",
+          "is_quoted",
+          "value"
+        ]
+      },
+      "ImageDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "816f55d5-1098-4f60-a4af-c8121c04dcce"
+          },
+          "name": {
+            "type": "string",
+            "example": "mariadb"
+          },
+          "version": {
+            "type": "string",
+            "example": 10.5
+          },
+          "operators": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/OperatorDto"
+            }
+          },
+          "default": {
+            "type": "boolean",
+            "example": false
+          },
+          "data_types": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/DataTypeDto"
+            }
+          }
+        },
+        "required": [
+          "data_types",
+          "default",
+          "id",
+          "name",
+          "operators",
+          "version"
+        ]
+      },
+      "OperatorDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "816f55d5-1098-4f60-a4af-c8121c04dccf"
+          },
+          "value": {
+            "type": "string",
+            "example": "XOR"
+          },
+          "documentation": {
+            "type": "string",
+            "example": "https://mariadb.com/kb/en/xor/"
+          },
+          "display_name": {
+            "type": "string",
+            "example": "XOR"
+          }
+        },
+        "required": [
+          "display_name",
+          "documentation",
+          "id",
+          "value"
+        ]
+      },
+      "IdentifierSaveDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "68e11675-1e0f-4d24-a6d9-887ad1c4445d"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "database",
+              "subset",
+              "table",
+              "view"
+            ],
+            "example": "database"
+          },
+          "doi": {
+            "type": "string",
+            "example": "10.1111/11111111"
+          },
+          "titles": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SaveIdentifierTitleDto"
+            }
+          },
+          "descriptions": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SaveIdentifierDescriptionDto"
+            }
+          },
+          "funders": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SaveIdentifierFunderDto"
+            }
+          },
+          "licenses": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/LicenseDto"
+            }
+          },
+          "publisher": {
+            "type": "string",
+            "example": "TU Wien"
+          },
+          "language": {
+            "type": "string",
+            "enum": [
+              "ab",
+              "aa",
+              "af",
+              "ak",
+              "sq",
+              "am",
+              "ar",
+              "an",
+              "hy",
+              "as",
+              "av",
+              "ae",
+              "ay",
+              "az",
+              "bm",
+              "ba",
+              "eu",
+              "be",
+              "bn",
+              "bh",
+              "bi",
+              "bs",
+              "br",
+              "bg",
+              "my",
+              "ca",
+              "km",
+              "ch",
+              "ce",
+              "ny",
+              "zh",
+              "cu",
+              "cv",
+              "kw",
+              "co",
+              "cr",
+              "hr",
+              "cs",
+              "da",
+              "dv",
+              "nl",
+              "dz",
+              "en",
+              "eo",
+              "et",
+              "ee",
+              "fo",
+              "fj",
+              "fi",
+              "fr",
+              "ff",
+              "gd",
+              "gl",
+              "lg",
+              "ka",
+              "de",
+              "ki",
+              "el",
+              "kl",
+              "gn",
+              "gu",
+              "ht",
+              "ha",
+              "he",
+              "hz",
+              "hi",
+              "ho",
+              "hu",
+              "is",
+              "io",
+              "ig",
+              "id",
+              "ia",
+              "ie",
+              "iu",
+              "ik",
+              "ga",
+              "it",
+              "ja",
+              "jv",
+              "kn",
+              "kr",
+              "ks",
+              "kk",
+              "rw",
+              "kv",
+              "kg",
+              "ko",
+              "kj",
+              "ku",
+              "ky",
+              "lo",
+              "la",
+              "lv",
+              "lb",
+              "li",
+              "ln",
+              "lt",
+              "lu",
+              "mk",
+              "mg",
+              "ms",
+              "ml",
+              "mt",
+              "gv",
+              "mi",
+              "mr",
+              "mh",
+              "ro",
+              "mn",
+              "na",
+              "nv",
+              "nd",
+              "ng",
+              "ne",
+              "se",
+              "no",
+              "nb",
+              "nn",
+              "ii",
+              "oc",
+              "oj",
+              "or",
+              "om",
+              "os",
+              "pi",
+              "pa",
+              "ps",
+              "fa",
+              "pl",
+              "pt",
+              "qu",
+              "rm",
+              "rn",
+              "ru",
+              "sm",
+              "sg",
+              "sa",
+              "sc",
+              "sr",
+              "sn",
+              "sd",
+              "si",
+              "sk",
+              "sl",
+              "so",
+              "st",
+              "nr",
+              "es",
+              "su",
+              "sw",
+              "ss",
+              "sv",
+              "tl",
+              "ty",
+              "tg",
+              "ta",
+              "tt",
+              "te",
+              "th",
+              "bo",
+              "ti",
+              "to",
+              "ts",
+              "tn",
+              "tr",
+              "tk",
+              "tw",
+              "ug",
+              "uk",
+              "ur",
+              "uz",
+              "ve",
+              "vi",
+              "vo",
+              "wa",
+              "cy",
+              "fy",
+              "wo",
+              "xh",
+              "yi",
+              "yo",
+              "za",
+              "zu"
+            ]
+          },
+          "creators": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SaveIdentifierCreatorDto"
+            }
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "query_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "view_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "table_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "publication_day": {
+            "type": "integer",
+            "format": "int32",
+            "example": 15
+          },
+          "publication_month": {
+            "type": "integer",
+            "format": "int32",
+            "example": 12
+          },
+          "publication_year": {
+            "type": "integer",
+            "format": "int32",
+            "example": 2022
+          },
+          "related_identifiers": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SaveRelatedIdentifierDto"
+            }
+          }
+        },
+        "required": [
+          "creators",
+          "database_id",
+          "id",
+          "publication_year",
+          "publisher",
+          "titles",
+          "type"
+        ]
+      },
+      "LicenseDto": {
+        "type": "object",
+        "properties": {
+          "identifier": {
+            "type": "string",
+            "example": "MIT"
+          },
+          "uri": {
+            "type": "string",
+            "example": "https://opensource.org/licenses/MIT"
+          },
+          "description": {
+            "type": "string",
+            "example": "A short and simple permissive license with conditions only requiring preservation of copyright and license notices. Licensed works, modifications, and larger works may be distributed under different terms and without source code."
+          }
+        },
+        "required": [
+          "identifier",
+          "uri"
+        ]
+      },
+      "SaveIdentifierCreatorDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "da9dd034-00a8-4517-b93d-d1b2adfee418"
+          },
+          "firstname": {
+            "type": "string",
+            "example": "Josiah"
+          },
+          "lastname": {
+            "type": "string",
+            "example": "Carberry"
+          },
+          "affiliation": {
+            "type": "string",
+            "example": "Wesleyan University"
+          },
+          "creator_name": {
+            "type": "string",
+            "example": "Carberry, Josiah"
+          },
+          "name_type": {
+            "type": "string",
+            "enum": [
+              "Personal",
+              "Organizational"
+            ],
+            "example": "Personal"
+          },
+          "name_identifier": {
+            "type": "string",
+            "example": "0000-0002-1825-0097"
+          },
+          "name_identifier_scheme": {
+            "type": "string",
+            "enum": [
+              "ORCID",
+              "ROR",
+              "ISNI",
+              "GRID"
+            ],
+            "example": "ORCID"
+          },
+          "affiliation_identifier": {
+            "type": "string",
+            "example": "https://ror.org/04d836q62"
+          },
+          "affiliation_identifier_scheme": {
+            "type": "string",
+            "enum": [
+              "ROR",
+              "GRID",
+              "ISNI"
+            ],
+            "example": "ROR"
+          }
+        },
+        "required": [
+          "creator_name",
+          "id"
+        ]
+      },
+      "SaveIdentifierDescriptionDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "35bd84d8-b181-43c8-b786-4d024e4f843c"
+          },
+          "description": {
+            "type": "string",
+            "example": "Air quality reports at Stephansplatz, Vienna"
+          },
+          "language": {
+            "type": "string",
+            "enum": [
+              "ab",
+              "aa",
+              "af",
+              "ak",
+              "sq",
+              "am",
+              "ar",
+              "an",
+              "hy",
+              "as",
+              "av",
+              "ae",
+              "ay",
+              "az",
+              "bm",
+              "ba",
+              "eu",
+              "be",
+              "bn",
+              "bh",
+              "bi",
+              "bs",
+              "br",
+              "bg",
+              "my",
+              "ca",
+              "km",
+              "ch",
+              "ce",
+              "ny",
+              "zh",
+              "cu",
+              "cv",
+              "kw",
+              "co",
+              "cr",
+              "hr",
+              "cs",
+              "da",
+              "dv",
+              "nl",
+              "dz",
+              "en",
+              "eo",
+              "et",
+              "ee",
+              "fo",
+              "fj",
+              "fi",
+              "fr",
+              "ff",
+              "gd",
+              "gl",
+              "lg",
+              "ka",
+              "de",
+              "ki",
+              "el",
+              "kl",
+              "gn",
+              "gu",
+              "ht",
+              "ha",
+              "he",
+              "hz",
+              "hi",
+              "ho",
+              "hu",
+              "is",
+              "io",
+              "ig",
+              "id",
+              "ia",
+              "ie",
+              "iu",
+              "ik",
+              "ga",
+              "it",
+              "ja",
+              "jv",
+              "kn",
+              "kr",
+              "ks",
+              "kk",
+              "rw",
+              "kv",
+              "kg",
+              "ko",
+              "kj",
+              "ku",
+              "ky",
+              "lo",
+              "la",
+              "lv",
+              "lb",
+              "li",
+              "ln",
+              "lt",
+              "lu",
+              "mk",
+              "mg",
+              "ms",
+              "ml",
+              "mt",
+              "gv",
+              "mi",
+              "mr",
+              "mh",
+              "ro",
+              "mn",
+              "na",
+              "nv",
+              "nd",
+              "ng",
+              "ne",
+              "se",
+              "no",
+              "nb",
+              "nn",
+              "ii",
+              "oc",
+              "oj",
+              "or",
+              "om",
+              "os",
+              "pi",
+              "pa",
+              "ps",
+              "fa",
+              "pl",
+              "pt",
+              "qu",
+              "rm",
+              "rn",
+              "ru",
+              "sm",
+              "sg",
+              "sa",
+              "sc",
+              "sr",
+              "sn",
+              "sd",
+              "si",
+              "sk",
+              "sl",
+              "so",
+              "st",
+              "nr",
+              "es",
+              "su",
+              "sw",
+              "ss",
+              "sv",
+              "tl",
+              "ty",
+              "tg",
+              "ta",
+              "tt",
+              "te",
+              "th",
+              "bo",
+              "ti",
+              "to",
+              "ts",
+              "tn",
+              "tr",
+              "tk",
+              "tw",
+              "ug",
+              "uk",
+              "ur",
+              "uz",
+              "ve",
+              "vi",
+              "vo",
+              "wa",
+              "cy",
+              "fy",
+              "wo",
+              "xh",
+              "yi",
+              "yo",
+              "za",
+              "zu"
+            ],
+            "example": "en"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "Abstract",
+              "Methods",
+              "SeriesInformation",
+              "TableOfContents",
+              "TechnicalInfo",
+              "Other"
+            ],
+            "example": "Abstract"
+          }
+        },
+        "required": [
+          "description",
+          "id"
+        ]
+      },
+      "SaveIdentifierFunderDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "1c6b9212-a315-44b9-946c-3682a7a0e517"
+          },
+          "funder_name": {
+            "type": "string",
+            "example": "European Commission"
+          },
+          "funder_identifier": {
+            "type": "string",
+            "example": "http://doi.org/10.13039/501100000780"
+          },
+          "funder_identifier_type": {
+            "type": "string",
+            "enum": [
+              "Crossref Funder ID",
+              "ROR",
+              "GND",
+              "ISNI",
+              "Other"
+            ],
+            "example": "Crossref Funder ID"
+          },
+          "scheme_uri": {
+            "type": "string",
+            "example": "http://doi.org/"
+          },
+          "award_number": {
+            "type": "string",
+            "example": 824087
+          },
+          "award_title": {
+            "type": "string",
+            "example": "EOSC-Life"
+          }
+        },
+        "required": [
+          "funder_name",
+          "id"
+        ]
+      },
+      "SaveIdentifierTitleDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "2af9f40e-eaf5-4ea1-861a-1a696587bf29"
+          },
+          "title": {
+            "type": "string",
+            "example": "Airquality Demonstrator"
+          },
+          "language": {
+            "type": "string",
+            "enum": [
+              "ab",
+              "aa",
+              "af",
+              "ak",
+              "sq",
+              "am",
+              "ar",
+              "an",
+              "hy",
+              "as",
+              "av",
+              "ae",
+              "ay",
+              "az",
+              "bm",
+              "ba",
+              "eu",
+              "be",
+              "bn",
+              "bh",
+              "bi",
+              "bs",
+              "br",
+              "bg",
+              "my",
+              "ca",
+              "km",
+              "ch",
+              "ce",
+              "ny",
+              "zh",
+              "cu",
+              "cv",
+              "kw",
+              "co",
+              "cr",
+              "hr",
+              "cs",
+              "da",
+              "dv",
+              "nl",
+              "dz",
+              "en",
+              "eo",
+              "et",
+              "ee",
+              "fo",
+              "fj",
+              "fi",
+              "fr",
+              "ff",
+              "gd",
+              "gl",
+              "lg",
+              "ka",
+              "de",
+              "ki",
+              "el",
+              "kl",
+              "gn",
+              "gu",
+              "ht",
+              "ha",
+              "he",
+              "hz",
+              "hi",
+              "ho",
+              "hu",
+              "is",
+              "io",
+              "ig",
+              "id",
+              "ia",
+              "ie",
+              "iu",
+              "ik",
+              "ga",
+              "it",
+              "ja",
+              "jv",
+              "kn",
+              "kr",
+              "ks",
+              "kk",
+              "rw",
+              "kv",
+              "kg",
+              "ko",
+              "kj",
+              "ku",
+              "ky",
+              "lo",
+              "la",
+              "lv",
+              "lb",
+              "li",
+              "ln",
+              "lt",
+              "lu",
+              "mk",
+              "mg",
+              "ms",
+              "ml",
+              "mt",
+              "gv",
+              "mi",
+              "mr",
+              "mh",
+              "ro",
+              "mn",
+              "na",
+              "nv",
+              "nd",
+              "ng",
+              "ne",
+              "se",
+              "no",
+              "nb",
+              "nn",
+              "ii",
+              "oc",
+              "oj",
+              "or",
+              "om",
+              "os",
+              "pi",
+              "pa",
+              "ps",
+              "fa",
+              "pl",
+              "pt",
+              "qu",
+              "rm",
+              "rn",
+              "ru",
+              "sm",
+              "sg",
+              "sa",
+              "sc",
+              "sr",
+              "sn",
+              "sd",
+              "si",
+              "sk",
+              "sl",
+              "so",
+              "st",
+              "nr",
+              "es",
+              "su",
+              "sw",
+              "ss",
+              "sv",
+              "tl",
+              "ty",
+              "tg",
+              "ta",
+              "tt",
+              "te",
+              "th",
+              "bo",
+              "ti",
+              "to",
+              "ts",
+              "tn",
+              "tr",
+              "tk",
+              "tw",
+              "ug",
+              "uk",
+              "ur",
+              "uz",
+              "ve",
+              "vi",
+              "vo",
+              "wa",
+              "cy",
+              "fy",
+              "wo",
+              "xh",
+              "yi",
+              "yo",
+              "za",
+              "zu"
+            ],
+            "example": "en"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "AlternativeTitle",
+              "Subtitle",
+              "TranslatedTitle",
+              "Other"
+            ],
+            "example": "Subtitle"
+          }
+        },
+        "required": [
+          "id",
+          "title"
+        ]
+      },
+      "SaveRelatedIdentifierDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "5bb272c7-7421-4f74-83ac-0486812d0f44"
+          },
+          "value": {
+            "type": "string",
+            "example": "10.70124/dc4zh-9ce78"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "DOI",
+              "URL",
+              "URN",
+              "ARK",
+              "arXiv",
+              "bibcode",
+              "EAN13",
+              "EISSN",
+              "Handle",
+              "IGSN",
+              "ISBN",
+              "ISTC",
+              "LISSN",
+              "LSID",
+              "PMID",
+              "PURL",
+              "UPC",
+              "w3id"
+            ],
+            "example": "DOI"
+          },
+          "relation": {
+            "type": "string",
+            "enum": [
+              "IsCitedBy",
+              "Cites",
+              "IsSupplementTo",
+              "IsSupplementedBy",
+              "IsContinuedBy",
+              "Continues",
+              "IsDescribedBy",
+              "Describes",
+              "HasMetadata",
+              "IsMetadataFor",
+              "HasVersion",
+              "IsVersionOf",
+              "IsNewVersionOf",
+              "IsPreviousVersionOf",
+              "IsPartOf",
+              "HasPart",
+              "IsPublishedIn",
+              "IsReferencedBy",
+              "References",
+              "IsDocumentedBy",
+              "Documents",
+              "IsCompiledBy",
+              "Compiles",
+              "IsVariantFormOf",
+              "IsOriginalFormOf",
+              "IsIdenticalTo",
+              "IsReviewedBy",
+              "Reviews",
+              "IsDerivedFrom",
+              "IsSourceOf",
+              "IsRequiredBy",
+              "Requires",
+              "IsObsoletedBy",
+              "Obsoletes"
+            ],
+            "example": "Cites"
+          }
+        },
+        "required": [
+          "id",
+          "relation",
+          "type",
+          "value"
+        ]
+      },
+      "CreatorDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "e41f94a6-2b94-4a12-ac0e-678684e1c070"
+          },
+          "firstname": {
+            "type": "string",
+            "example": "Josiah"
+          },
+          "lastname": {
+            "type": "string",
+            "example": "Carberry"
+          },
+          "affiliation": {
+            "type": "string",
+            "example": "Brown University"
+          },
+          "creator_name": {
+            "type": "string",
+            "example": "Carberry, Josiah"
+          },
+          "name_type": {
+            "type": "string",
+            "enum": [
+              "Personal",
+              "Organizational"
+            ],
+            "example": "Personal"
+          },
+          "name_identifier": {
+            "type": "string",
+            "example": "0000-0002-1825-0097"
+          },
+          "name_identifier_scheme": {
+            "type": "string",
+            "enum": [
+              "ORCID",
+              "ROR",
+              "ISNI",
+              "GRID"
+            ],
+            "example": "ORCID"
+          },
+          "name_identifier_scheme_uri": {
+            "type": "string",
+            "example": "https://orcid.org/"
+          },
+          "affiliation_identifier": {
+            "type": "string",
+            "example": "https://ror.org/05gq02987"
+          },
+          "affiliation_identifier_scheme": {
+            "type": "string",
+            "enum": [
+              "ROR",
+              "GRID",
+              "ISNI"
+            ],
+            "example": "ROR"
+          },
+          "affiliation_identifier_scheme_uri": {
+            "type": "string",
+            "example": "https://ror.org/"
+          }
+        },
+        "required": [
+          "creator_name",
+          "id"
+        ]
+      },
+      "IdentifierDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "b97cd56b-66ca-4354-9e6c-f47210cfaaec"
+          },
+          "links": {
+            "$ref": "#/components/schemas/LinksDto"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "database",
+              "subset",
+              "table",
+              "view"
+            ],
+            "example": "database"
+          },
+          "titles": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierTitleDto"
+            }
+          },
+          "descriptions": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierDescriptionDto"
+            }
+          },
+          "funders": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierFunderDto"
+            }
+          },
+          "query": {
+            "type": "string",
+            "example": "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location` = \"09:STEF\""
+          },
+          "execution": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2021-03-12T15:26:21Z"
+          },
+          "doi": {
+            "type": "string",
+            "example": "10.1038/nphys1170"
+          },
+          "publisher": {
+            "type": "string",
+            "example": "TU Wien"
+          },
+          "owner": {
+            "$ref": "#/components/schemas/UserBriefDto"
+          },
+          "language": {
+            "type": "string",
+            "enum": [
+              "ab",
+              "aa",
+              "af",
+              "ak",
+              "sq",
+              "am",
+              "ar",
+              "an",
+              "hy",
+              "as",
+              "av",
+              "ae",
+              "ay",
+              "az",
+              "bm",
+              "ba",
+              "eu",
+              "be",
+              "bn",
+              "bh",
+              "bi",
+              "bs",
+              "br",
+              "bg",
+              "my",
+              "ca",
+              "km",
+              "ch",
+              "ce",
+              "ny",
+              "zh",
+              "cu",
+              "cv",
+              "kw",
+              "co",
+              "cr",
+              "hr",
+              "cs",
+              "da",
+              "dv",
+              "nl",
+              "dz",
+              "en",
+              "eo",
+              "et",
+              "ee",
+              "fo",
+              "fj",
+              "fi",
+              "fr",
+              "ff",
+              "gd",
+              "gl",
+              "lg",
+              "ka",
+              "de",
+              "ki",
+              "el",
+              "kl",
+              "gn",
+              "gu",
+              "ht",
+              "ha",
+              "he",
+              "hz",
+              "hi",
+              "ho",
+              "hu",
+              "is",
+              "io",
+              "ig",
+              "id",
+              "ia",
+              "ie",
+              "iu",
+              "ik",
+              "ga",
+              "it",
+              "ja",
+              "jv",
+              "kn",
+              "kr",
+              "ks",
+              "kk",
+              "rw",
+              "kv",
+              "kg",
+              "ko",
+              "kj",
+              "ku",
+              "ky",
+              "lo",
+              "la",
+              "lv",
+              "lb",
+              "li",
+              "ln",
+              "lt",
+              "lu",
+              "mk",
+              "mg",
+              "ms",
+              "ml",
+              "mt",
+              "gv",
+              "mi",
+              "mr",
+              "mh",
+              "ro",
+              "mn",
+              "na",
+              "nv",
+              "nd",
+              "ng",
+              "ne",
+              "se",
+              "no",
+              "nb",
+              "nn",
+              "ii",
+              "oc",
+              "oj",
+              "or",
+              "om",
+              "os",
+              "pi",
+              "pa",
+              "ps",
+              "fa",
+              "pl",
+              "pt",
+              "qu",
+              "rm",
+              "rn",
+              "ru",
+              "sm",
+              "sg",
+              "sa",
+              "sc",
+              "sr",
+              "sn",
+              "sd",
+              "si",
+              "sk",
+              "sl",
+              "so",
+              "st",
+              "nr",
+              "es",
+              "su",
+              "sw",
+              "ss",
+              "sv",
+              "tl",
+              "ty",
+              "tg",
+              "ta",
+              "tt",
+              "te",
+              "th",
+              "bo",
+              "ti",
+              "to",
+              "ts",
+              "tn",
+              "tr",
+              "tk",
+              "tw",
+              "ug",
+              "uk",
+              "ur",
+              "uz",
+              "ve",
+              "vi",
+              "vo",
+              "wa",
+              "cy",
+              "fy",
+              "wo",
+              "xh",
+              "yi",
+              "yo",
+              "za",
+              "zu"
+            ]
+          },
+          "licenses": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/LicenseDto"
+            }
+          },
+          "creators": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/CreatorDto"
+            }
+          },
+          "status": {
+            "type": "string",
+            "enum": [
+              "draft",
+              "published"
+            ],
+            "example": "draft"
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "query_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "table_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "view_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "query_normalized": {
+            "type": "string",
+            "example": "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location` = \"09:STEF\""
+          },
+          "related_identifiers": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/RelatedIdentifierDto"
+            }
+          },
+          "query_hash": {
+            "type": "string",
+            "description": "query hash in sha512"
+          },
+          "result_hash": {
+            "type": "string",
+            "example": "34fe82cda2c53f13f8d90cfd7a3469e3a939ff311add50dce30d9136397bf8e5"
+          },
+          "result_number": {
+            "type": "integer",
+            "format": "int64",
+            "example": 1
+          },
+          "publication_day": {
+            "type": "integer",
+            "format": "int32",
+            "example": 15
+          },
+          "publication_month": {
+            "type": "integer",
+            "format": "int32",
+            "example": 12
+          },
+          "publication_year": {
+            "type": "integer",
+            "format": "int32",
+            "example": 2022
+          }
+        },
+        "required": [
+          "creators",
+          "database_id",
+          "descriptions",
+          "funders",
+          "id",
+          "language",
+          "licenses",
+          "links",
+          "owner",
+          "publication_year",
+          "publisher",
+          "query",
+          "query_hash",
+          "query_normalized",
+          "status",
+          "titles",
+          "type"
+        ]
+      },
+      "IdentifierFunderDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "39693413-e0ce-46da-ad5e-029c0556d439"
+          },
+          "funder_name": {
+            "type": "string",
+            "example": "European Commission"
+          },
+          "funder_identifier": {
+            "type": "string",
+            "example": "http://doi.org/10.13039/501100000780"
+          },
+          "funder_identifier_type": {
+            "type": "string",
+            "enum": [
+              "Crossref Funder ID",
+              "ROR",
+              "GND",
+              "ISNI",
+              "Other"
+            ],
+            "example": "Crossref Funder ID"
+          },
+          "scheme_uri": {
+            "type": "string",
+            "example": "http://doi.org/"
+          },
+          "award_number": {
+            "type": "string",
+            "example": 824087
+          },
+          "award_title": {
+            "type": "string",
+            "example": "EOSC-Life"
+          }
+        },
+        "required": [
+          "funder_name",
+          "id"
+        ]
+      },
+      "LinksDto": {
+        "type": "object",
+        "properties": {
+          "self": {
+            "type": "string",
+            "example": "http://example.com/api/"
+          },
+          "data": {
+            "type": "string",
+            "example": "http://example.com"
+          },
+          "self_html": {
+            "type": "string",
+            "example": "http://example.com"
+          },
+          "dashboard_html": {
+            "type": "string",
+            "example": "http://example.com/d/defi2baxqawaod"
+          }
+        },
+        "required": [
+          "self",
+          "self_html"
+        ]
+      },
+      "RelatedIdentifierDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "ce9d11f0-60a2-448d-a3e4-44719a443e8a"
+          },
+          "value": {
+            "type": "string",
+            "example": "10.70124/dc4zh-9ce78"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "DOI",
+              "URL",
+              "URN",
+              "ARK",
+              "arXiv",
+              "bibcode",
+              "EAN13",
+              "EISSN",
+              "Handle",
+              "IGSN",
+              "ISBN",
+              "ISTC",
+              "LISSN",
+              "LSID",
+              "PMID",
+              "PURL",
+              "UPC",
+              "w3id"
+            ],
+            "example": "DOI"
+          },
+          "relation": {
+            "type": "string",
+            "enum": [
+              "IsCitedBy",
+              "Cites",
+              "IsSupplementTo",
+              "IsSupplementedBy",
+              "IsContinuedBy",
+              "Continues",
+              "IsDescribedBy",
+              "Describes",
+              "HasMetadata",
+              "IsMetadataFor",
+              "HasVersion",
+              "IsVersionOf",
+              "IsNewVersionOf",
+              "IsPreviousVersionOf",
+              "IsPartOf",
+              "HasPart",
+              "IsPublishedIn",
+              "IsReferencedBy",
+              "References",
+              "IsDocumentedBy",
+              "Documents",
+              "IsCompiledBy",
+              "Compiles",
+              "IsVariantFormOf",
+              "IsOriginalFormOf",
+              "IsIdenticalTo",
+              "IsReviewedBy",
+              "Reviews",
+              "IsDerivedFrom",
+              "IsSourceOf",
+              "IsRequiredBy",
+              "Requires",
+              "IsObsoletedBy",
+              "Obsoletes"
+            ],
+            "example": "Cites"
+          }
+        },
+        "required": [
+          "id",
+          "relation",
+          "type",
+          "value"
+        ]
+      },
+      "DatabaseModifyVisibilityDto": {
+        "type": "object",
+        "properties": {
+          "is_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "is_schema_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "is_dashboard_enabled": {
+            "type": "boolean",
+            "example": true
+          }
+        },
+        "required": [
+          "is_dashboard_enabled",
+          "is_public",
+          "is_schema_public"
+        ]
+      },
+      "ViewUpdateDto": {
+        "type": "object",
+        "properties": {
+          "is_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "is_schema_public": {
+            "type": "boolean",
+            "example": true
+          }
+        },
+        "required": [
+          "is_public",
+          "is_schema_public"
+        ]
+      },
+      "ViewBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "787439d0-e85e-400c-a7e6-996a023bfad9"
+          },
+          "name": {
+            "type": "string",
+            "example": "Air Quality"
+          },
+          "query": {
+            "type": "string",
+            "example": "SELECT `id` FROM `air_quality` ORDER BY `value` DESC"
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4"
+          },
+          "internal_name": {
+            "type": "string",
+            "example": "air_quality"
+          },
+          "is_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "is_schema_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "initial_view": {
+            "type": "boolean",
+            "description": "True if it is the default view for the database",
+            "example": true
+          },
+          "query_hash": {
+            "type": "string",
+            "example": "7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916"
+          },
+          "owned_by": {
+            "type": "string",
+            "format": "uuid",
+            "example": "ac750fcf-ea02-4fce-85ac-d73857e18b35"
+          }
+        },
+        "required": [
+          "database_id",
+          "id",
+          "internal_name",
+          "name",
+          "query",
+          "query_hash"
+        ]
+      },
+      "TableUpdateDto": {
+        "type": "object",
+        "properties": {
+          "description": {
+            "type": "string",
+            "example": "Air Quality in Austria",
+            "maxLength": 180,
+            "minLength": 0
+          },
+          "is_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "is_schema_public": {
+            "type": "boolean",
+            "example": true
+          }
+        },
+        "required": [
+          "is_public",
+          "is_schema_public"
+        ]
+      },
+      "TableBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "41ed10e0-687b-4e18-8521-810f5cffbce1"
+          },
+          "name": {
+            "type": "string",
+            "example": "Air Quality"
+          },
+          "description": {
+            "type": "string",
+            "example": "Air Quality in Austria"
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "a8fec026-dfaf-4b1d-8f6c-f01720d91705"
+          },
+          "internal_name": {
+            "type": "string",
+            "example": "air_quality"
+          },
+          "is_versioned": {
+            "type": "boolean",
+            "example": true
+          },
+          "is_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "is_schema_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "owned_by": {
+            "type": "string",
+            "format": "uuid",
+            "example": "78337b80-5699-45db-8111-cec86439ab6b"
+          }
+        },
+        "required": [
+          "database_id",
+          "id",
+          "internal_name",
+          "is_public",
+          "is_schema_public",
+          "is_versioned",
+          "name",
+          "owned_by"
+        ]
+      },
+      "ColumnSemanticsUpdateDto": {
+        "type": "object",
+        "properties": {
+          "concept_uri": {
+            "type": "string"
+          },
+          "unit_uri": {
+            "type": "string"
+          }
+        }
+      },
+      "ColumnDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "a453e444-e00d-41ca-902c-11e9c54b39f1"
+          },
+          "name": {
+            "type": "string",
+            "example": "Given Name",
+            "maxLength": 64,
+            "minLength": 0
+          },
+          "alias": {
+            "type": "string",
+            "example": "firstname"
+          },
+          "size": {
+            "type": "integer",
+            "format": "int64",
+            "example": 255
+          },
+          "d": {
+            "type": "integer",
+            "format": "int64",
+            "example": 0
+          },
+          "mean": {
+            "type": "number",
+            "example": 45.4
+          },
+          "median": {
+            "type": "number",
+            "example": 51
+          },
+          "concept": {
+            "$ref": "#/components/schemas/ConceptBriefDto"
+          },
+          "unit": {
+            "$ref": "#/components/schemas/UnitBriefDto"
+          },
+          "description": {
+            "type": "string",
+            "example": "Column comment",
+            "maxLength": 2048,
+            "minLength": 0
+          },
+          "enums": {
+            "type": "array",
+            "description": "enum values, only considered when type = ENUM",
+            "items": {
+              "$ref": "#/components/schemas/EnumDto"
+            }
+          },
+          "sets": {
+            "type": "array",
+            "description": "enum values, only considered when type = ENUM",
+            "items": {
+              "$ref": "#/components/schemas/SetDto"
+            }
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "911f9052-c58c-4e1c-b3f2-66af2107be16"
+          },
+          "table_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "bfffa915-a547-4466-9c65-ddc0d38fdb08"
+          },
+          "ord": {
+            "type": "integer",
+            "format": "int32",
+            "example": 0
+          },
+          "internal_name": {
+            "type": "string",
+            "example": "given_name",
+            "maxLength": 64,
+            "minLength": 0
+          },
+          "index_length": {
+            "type": "integer",
+            "format": "int64",
+            "example": 255
+          },
+          "length": {
+            "type": "integer",
+            "format": "int64",
+            "example": 255
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "char",
+              "varchar",
+              "binary",
+              "varbinary",
+              "tinyblob",
+              "tinytext",
+              "text",
+              "blob",
+              "mediumtext",
+              "mediumblob",
+              "longtext",
+              "longblob",
+              "enum",
+              "set",
+              "serial",
+              "bit",
+              "tinyint",
+              "bool",
+              "smallint",
+              "mediumint",
+              "int",
+              "bigint",
+              "float",
+              "double",
+              "decimal",
+              "date",
+              "datetime",
+              "timestamp",
+              "time",
+              "year"
+            ],
+            "example": "varchar"
+          },
+          "data_length": {
+            "type": "integer",
+            "format": "int64",
+            "example": 34300
+          },
+          "max_data_length": {
+            "type": "integer",
+            "format": "int64",
+            "example": 34300
+          },
+          "num_rows": {
+            "type": "integer",
+            "format": "int64",
+            "example": 32
+          },
+          "val_min": {
+            "type": "number",
+            "example": 0
+          },
+          "val_max": {
+            "type": "number",
+            "example": 100
+          },
+          "std_dev": {
+            "type": "number",
+            "example": 5.32
+          },
+          "is_null_allowed": {
+            "type": "boolean",
+            "example": false
+          }
+        },
+        "required": [
+          "database_id",
+          "id",
+          "internal_name",
+          "is_null_allowed",
+          "name",
+          "ord",
+          "table_id",
+          "type"
+        ]
+      },
+      "ConceptBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "8cabc011-4bdf-44d4-9d33-b2648e2ddbf1"
+          },
+          "uri": {
+            "type": "string",
+            "example": "http://www.wikidata.org/entity/Q202444"
+          },
+          "name": {
+            "type": "string",
+            "example": "given name"
+          },
+          "description": {
+            "type": "string",
+            "example": "name typically used to differentiate people from the same family, clan, or other social group who have a common last name"
+          }
+        },
+        "required": [
+          "id",
+          "uri"
+        ]
+      },
+      "EnumDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "5343bb3d-14d3-4eb7-a86f-b8fc553cb315"
+          },
+          "value": {
+            "type": "string",
+            "example": 3
+          }
+        },
+        "required": [
+          "id",
+          "value"
+        ]
+      },
+      "SetDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "7eb4eded-bacc-4a91-84db-a9ae6ddafda7"
+          },
+          "value": {
+            "type": "string",
+            "example": 3
+          }
+        },
+        "required": [
+          "id",
+          "value"
+        ]
+      },
+      "UnitBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "ba1935e8-6817-488f-af0a-f54389af9000"
+          },
+          "uri": {
+            "type": "string",
+            "example": "http://www.wikidata.org/entity/Q1422583"
+          },
+          "name": {
+            "type": "string",
+            "example": "importance"
+          },
+          "description": {
+            "type": "string",
+            "example": "subjective magnitude of value, meaning, or purpose"
+          }
+        },
+        "required": [
+          "id",
+          "uri"
+        ]
+      },
+      "DatabaseTransferDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid"
+          }
+        },
+        "required": [
+          "id"
+        ]
+      },
+      "DatabaseModifyImageDto": {
+        "type": "object",
+        "properties": {
+          "key": {
+            "type": "string"
+          }
+        }
+      },
+      "DatabaseModifyDashboardDto": {
+        "type": "object",
+        "properties": {
+          "uid": {
+            "type": "string"
+          }
+        },
+        "required": [
+          "uid"
+        ]
+      },
+      "CreateAccessDto": {
+        "type": "object",
+        "properties": {
+          "type": {
+            "type": "string",
+            "enum": [
+              "read",
+              "write_own",
+              "write_all"
+            ],
+            "example": "read"
+          }
+        },
+        "required": [
+          "type"
+        ]
+      },
+      "OntologyCreateDto": {
+        "type": "object",
+        "properties": {
+          "uri": {
+            "type": "string",
+            "example": "Ontology URI"
+          },
+          "prefix": {
+            "type": "string",
+            "example": "Ontology prefix"
+          },
+          "sparql_endpoint": {
+            "type": "string",
+            "example": "Ontology SPARQL endpoint"
+          }
+        },
+        "required": [
+          "prefix",
+          "uri"
+        ]
+      },
+      "BannerMessageCreateDto": {
+        "type": "object",
+        "properties": {
+          "type": {
+            "type": "string",
+            "enum": [
+              "error",
+              "warning",
+              "info"
+            ]
+          },
+          "message": {
+            "type": "string",
+            "example": "Maintenance starts on 8am on Monday"
+          },
+          "link": {
+            "type": "string",
+            "example": "https://example.com"
+          },
+          "link_text": {
+            "type": "string",
+            "example": "More"
+          },
+          "display_start": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2021-03-12T15:26:21Z"
+          },
+          "display_end": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2021-03-12T15:26:21Z"
+          }
+        },
+        "required": [
+          "message",
+          "type"
+        ]
+      },
+      "ImageCreateDto": {
+        "type": "object",
+        "properties": {
+          "registry": {
+            "type": "string",
+            "example": "docker.io/library"
+          },
+          "name": {
+            "type": "string",
+            "example": "mariadb"
+          },
+          "version": {
+            "type": "string"
+          },
+          "dialect": {
+            "type": "string"
+          },
+          "is_default": {
+            "type": "boolean",
+            "example": false
+          },
+          "driver_class": {
+            "type": "string"
+          },
+          "jdbc_method": {
+            "type": "string"
+          },
+          "default_port": {
+            "type": "integer",
+            "format": "int32",
+            "maximum": 65535,
+            "minimum": 1024
+          }
+        },
+        "required": [
+          "default_port",
+          "dialect",
+          "driver_class",
+          "is_default",
+          "jdbc_method",
+          "name",
+          "registry",
+          "version"
+        ]
+      },
+      "CreateIdentifierDto": {
+        "type": "object",
+        "properties": {
+          "type": {
+            "type": "string",
+            "enum": [
+              "database",
+              "subset",
+              "table",
+              "view"
+            ],
+            "example": "database"
+          },
+          "doi": {
+            "type": "string",
+            "example": "10.1111/11111111"
+          },
+          "titles": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SaveIdentifierTitleDto"
+            }
+          },
+          "descriptions": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SaveIdentifierDescriptionDto"
+            }
+          },
+          "funders": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SaveIdentifierFunderDto"
+            }
+          },
+          "licenses": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/LicenseDto"
+            }
+          },
+          "publisher": {
+            "type": "string",
+            "example": "TU Wien"
+          },
+          "language": {
+            "type": "string",
+            "enum": [
+              "ab",
+              "aa",
+              "af",
+              "ak",
+              "sq",
+              "am",
+              "ar",
+              "an",
+              "hy",
+              "as",
+              "av",
+              "ae",
+              "ay",
+              "az",
+              "bm",
+              "ba",
+              "eu",
+              "be",
+              "bn",
+              "bh",
+              "bi",
+              "bs",
+              "br",
+              "bg",
+              "my",
+              "ca",
+              "km",
+              "ch",
+              "ce",
+              "ny",
+              "zh",
+              "cu",
+              "cv",
+              "kw",
+              "co",
+              "cr",
+              "hr",
+              "cs",
+              "da",
+              "dv",
+              "nl",
+              "dz",
+              "en",
+              "eo",
+              "et",
+              "ee",
+              "fo",
+              "fj",
+              "fi",
+              "fr",
+              "ff",
+              "gd",
+              "gl",
+              "lg",
+              "ka",
+              "de",
+              "ki",
+              "el",
+              "kl",
+              "gn",
+              "gu",
+              "ht",
+              "ha",
+              "he",
+              "hz",
+              "hi",
+              "ho",
+              "hu",
+              "is",
+              "io",
+              "ig",
+              "id",
+              "ia",
+              "ie",
+              "iu",
+              "ik",
+              "ga",
+              "it",
+              "ja",
+              "jv",
+              "kn",
+              "kr",
+              "ks",
+              "kk",
+              "rw",
+              "kv",
+              "kg",
+              "ko",
+              "kj",
+              "ku",
+              "ky",
+              "lo",
+              "la",
+              "lv",
+              "lb",
+              "li",
+              "ln",
+              "lt",
+              "lu",
+              "mk",
+              "mg",
+              "ms",
+              "ml",
+              "mt",
+              "gv",
+              "mi",
+              "mr",
+              "mh",
+              "ro",
+              "mn",
+              "na",
+              "nv",
+              "nd",
+              "ng",
+              "ne",
+              "se",
+              "no",
+              "nb",
+              "nn",
+              "ii",
+              "oc",
+              "oj",
+              "or",
+              "om",
+              "os",
+              "pi",
+              "pa",
+              "ps",
+              "fa",
+              "pl",
+              "pt",
+              "qu",
+              "rm",
+              "rn",
+              "ru",
+              "sm",
+              "sg",
+              "sa",
+              "sc",
+              "sr",
+              "sn",
+              "sd",
+              "si",
+              "sk",
+              "sl",
+              "so",
+              "st",
+              "nr",
+              "es",
+              "su",
+              "sw",
+              "ss",
+              "sv",
+              "tl",
+              "ty",
+              "tg",
+              "ta",
+              "tt",
+              "te",
+              "th",
+              "bo",
+              "ti",
+              "to",
+              "ts",
+              "tn",
+              "tr",
+              "tk",
+              "tw",
+              "ug",
+              "uk",
+              "ur",
+              "uz",
+              "ve",
+              "vi",
+              "vo",
+              "wa",
+              "cy",
+              "fy",
+              "wo",
+              "xh",
+              "yi",
+              "yo",
+              "za",
+              "zu"
+            ]
+          },
+          "creators": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SaveIdentifierCreatorDto"
+            }
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "d002e8d5-8db4-4ff7-ab3a-bc3f52d9ec44"
+          },
+          "query_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "view_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "table_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": null
+          },
+          "publication_day": {
+            "type": "integer",
+            "format": "int32",
+            "example": 15
+          },
+          "publication_month": {
+            "type": "integer",
+            "format": "int32",
+            "example": 12
+          },
+          "publication_year": {
+            "type": "integer",
+            "format": "int32",
+            "example": 2022
+          },
+          "related_identifiers": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/SaveRelatedIdentifierDto"
+            }
+          }
+        },
+        "required": [
+          "creators",
+          "database_id",
+          "publication_year",
+          "publisher",
+          "titles",
+          "type"
+        ]
+      },
+      "CreateDatabaseDto": {
+        "type": "object",
+        "properties": {
+          "name": {
+            "type": "string",
+            "example": "Air Quality"
+          },
+          "container_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "0888e108-d521-46e2-9d3e-82099185305b"
+          },
+          "is_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "is_schema_public": {
+            "type": "boolean",
+            "example": true
+          }
+        },
+        "required": [
+          "container_id",
+          "is_public",
+          "is_schema_public",
+          "name"
+        ]
+      },
+      "CreateViewDto": {
+        "type": "object",
+        "properties": {
+          "name": {
+            "type": "string",
+            "example": "Air Quality",
+            "maxLength": 63,
+            "minLength": 1
+          },
+          "query": {
+            "$ref": "#/components/schemas/SubsetDto"
+          },
+          "is_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "is_schema_public": {
+            "type": "boolean",
+            "example": true
+          }
+        },
+        "required": [
+          "is_public",
+          "is_schema_public",
+          "name",
+          "query"
+        ]
+      },
+      "FilterDto": {
+        "type": "object",
+        "properties": {
+          "type": {
+            "type": "string",
+            "enum": [
+              "where",
+              "or",
+              "and"
+            ],
+            "example": "where"
+          },
+          "value": {
+            "type": "string",
+            "example": 1
+          },
+          "column_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "14128033-54b5-4818-a489-21b0dded86e2"
+          },
+          "operator_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "67c5b54d-2eb0-4f42-8dc1-a504562e9f32"
+          }
+        },
+        "required": [
+          "column_id",
+          "operator_id",
+          "type"
+        ]
+      },
+      "OrderDto": {
+        "type": "object",
+        "properties": {
+          "direction": {
+            "type": "string",
+            "enum": [
+              "asc",
+              "desc"
+            ],
+            "example": "asc"
+          },
+          "column_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "e891ba86-0258-41a6-a8d9-ff58bc10b618"
+          }
+        },
+        "required": [
+          "column_id"
+        ]
+      },
+      "SubsetDto": {
+        "type": "object",
+        "properties": {
+          "columns": {
+            "type": "array",
+            "example": [
+              "e891ba86-0258-41a6-a8d9-ff58bc10b618"
+            ],
+            "items": {
+              "type": "string",
+              "format": "uuid"
+            }
+          },
+          "filter": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/FilterDto"
+            }
+          },
+          "order": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/OrderDto"
+            }
+          },
+          "datasource_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "f7df2a7d-4ade-4c78-97b0-7c744d0893c7"
+          },
+          "datasource_type": {
+            "type": "string",
+            "enum": [
+              "table",
+              "view"
+            ]
+          }
+        },
+        "required": [
+          "columns",
+          "datasource_id",
+          "datasource_type"
+        ]
+      },
+      "CreateForeignKeyDto": {
+        "type": "object",
+        "properties": {
+          "columns": {
+            "type": "array",
+            "example": [
+              "id"
+            ],
+            "items": {
+              "type": "string"
+            }
+          },
+          "referenced_table": {
+            "type": "string",
+            "example": "sensor"
+          },
+          "referenced_columns": {
+            "type": "array",
+            "example": [
+              "other_id"
+            ],
+            "items": {
+              "type": "string"
+            }
+          },
+          "on_update": {
+            "type": "string",
+            "enum": [
+              "restrict",
+              "cascade",
+              "set_null",
+              "no_action",
+              "set_default"
+            ],
+            "example": "cascade"
+          },
+          "on_delete": {
+            "type": "string",
+            "enum": [
+              "restrict",
+              "cascade",
+              "set_null",
+              "no_action",
+              "set_default"
+            ],
+            "example": "cascade"
+          }
+        },
+        "required": [
+          "columns",
+          "referenced_columns",
+          "referenced_table"
+        ]
+      },
+      "CreateTableColumnDto": {
+        "type": "object",
+        "properties": {
+          "name": {
+            "type": "string",
+            "example": "Date"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "char",
+              "varchar",
+              "binary",
+              "varbinary",
+              "tinyblob",
+              "tinytext",
+              "text",
+              "blob",
+              "mediumtext",
+              "mediumblob",
+              "longtext",
+              "longblob",
+              "enum",
+              "set",
+              "serial",
+              "bit",
+              "tinyint",
+              "bool",
+              "smallint",
+              "mediumint",
+              "int",
+              "bigint",
+              "float",
+              "double",
+              "decimal",
+              "date",
+              "datetime",
+              "timestamp",
+              "time",
+              "year"
+            ],
+            "example": "varchar"
+          },
+          "size": {
+            "type": "integer",
+            "format": "int64",
+            "example": 255
+          },
+          "d": {
+            "type": "integer",
+            "format": "int64",
+            "example": 0
+          },
+          "description": {
+            "type": "string",
+            "example": "Formatted as YYYY-MM-dd",
+            "maxLength": 2048,
+            "minLength": 0
+          },
+          "enums": {
+            "type": "array",
+            "description": "enum values, only considered when type = ENUM",
+            "items": {
+              "type": "string"
+            }
+          },
+          "sets": {
+            "type": "array",
+            "description": "set values, only considered when type = SET",
+            "items": {
+              "type": "string"
+            }
+          },
+          "index_length": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "null_allowed": {
+            "type": "boolean",
+            "example": true
+          },
+          "concept_uri": {
+            "type": "string"
+          },
+          "unit_uri": {
+            "type": "string"
+          }
+        },
+        "required": [
+          "name",
+          "null_allowed",
+          "type"
+        ]
+      },
+      "CreateTableConstraintsDto": {
+        "type": "object",
+        "properties": {
+          "uniques": {
+            "type": "array",
+            "items": {
+              "type": "array",
+              "items": {
+                "type": "string"
+              }
+            }
+          },
+          "checks": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "uniqueItems": true
+          },
+          "foreign_keys": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/CreateForeignKeyDto"
+            }
+          },
+          "primary_key": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            },
+            "uniqueItems": true
+          }
+        },
+        "required": [
+          "checks",
+          "foreign_keys",
+          "primary_key",
+          "uniques"
+        ]
+      },
+      "CreateTableDto": {
+        "type": "object",
+        "properties": {
+          "name": {
+            "type": "string",
+            "example": "Air Quality",
+            "maxLength": 64,
+            "minLength": 1
+          },
+          "description": {
+            "type": "string",
+            "example": "Air Quality in Austria",
+            "maxLength": 180,
+            "minLength": 0
+          },
+          "columns": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/CreateTableColumnDto"
+            }
+          },
+          "constraints": {
+            "$ref": "#/components/schemas/CreateTableConstraintsDto"
+          },
+          "is_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "is_schema_public": {
+            "type": "boolean",
+            "example": true
+          }
+        },
+        "required": [
+          "columns",
+          "constraints",
+          "is_public",
+          "is_schema_public",
+          "name"
+        ]
+      },
+      "CreateContainerDto": {
+        "type": "object",
+        "properties": {
+          "name": {
+            "type": "string",
+            "example": "Air Quality"
+          },
+          "host": {
+            "type": "string",
+            "description": "Hostname of container",
+            "example": "data-db2"
+          },
+          "port": {
+            "type": "integer",
+            "format": "int32",
+            "description": "Port of container",
+            "example": 3306
+          },
+          "quota": {
+            "type": "integer",
+            "format": "int64",
+            "example": 50
+          },
+          "image_id": {
+            "type": "string",
+            "format": "uuid",
+            "description": "Image ID",
+            "example": "2360f3c4-85e0-4fac-a7c6-73b296b9dde2"
+          },
+          "ui_host": {
+            "type": "string",
+            "example": "example.com"
+          },
+          "ui_port": {
+            "type": "integer",
+            "format": "int32",
+            "example": 3306
+          },
+          "privileged_username": {
+            "type": "string",
+            "description": "Username of privileged user",
+            "example": "root"
+          },
+          "privileged_password": {
+            "type": "string",
+            "description": "Password of privileged user",
+            "example": "dbrepo"
+          }
+        },
+        "required": [
+          "host",
+          "image_id",
+          "name",
+          "privileged_password",
+          "privileged_username",
+          "quota"
+        ]
+      },
+      "ContainerDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "7ddb7e87-b965-43a2-9a24-4fa406d998f4"
+          },
+          "name": {
+            "type": "string",
+            "example": "Air Quality"
+          },
+          "image": {
+            "$ref": "#/components/schemas/ImageDto"
+          },
+          "quota": {
+            "type": "integer",
+            "format": "int64",
+            "example": 50
+          },
+          "count": {
+            "type": "integer",
+            "format": "int64",
+            "example": 10
+          },
+          "username": {
+            "type": "string",
+            "example": "username"
+          },
+          "password": {
+            "type": "string",
+            "example": "p4ssw0rd"
+          },
+          "last_retrieved": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2025-01-23T12:09:01"
+          },
+          "internal_name": {
+            "type": "string",
+            "example": "air_quality"
+          }
+        },
+        "required": [
+          "count",
+          "id",
+          "image",
+          "internal_name",
+          "name"
+        ]
+      },
+      "ColumnBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "a453e444-e00d-41ca-902c-11e9c54b39f1"
+          },
+          "name": {
+            "type": "string",
+            "example": "Given Name",
+            "maxLength": 64,
+            "minLength": 0
+          },
+          "alias": {
+            "type": "string",
+            "example": "firstname"
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "911f9052-c58c-4e1c-b3f2-66af2107be16"
+          },
+          "table_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "bfffa915-a547-4466-9c65-ddc0d38fdb08"
+          },
+          "internal_name": {
+            "type": "string",
+            "example": "given_name",
+            "maxLength": 64,
+            "minLength": 0
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "char",
+              "varchar",
+              "binary",
+              "varbinary",
+              "tinyblob",
+              "tinytext",
+              "text",
+              "blob",
+              "mediumtext",
+              "mediumblob",
+              "longtext",
+              "longblob",
+              "enum",
+              "set",
+              "serial",
+              "bit",
+              "tinyint",
+              "bool",
+              "smallint",
+              "mediumint",
+              "int",
+              "bigint",
+              "float",
+              "double",
+              "decimal",
+              "date",
+              "datetime",
+              "timestamp",
+              "time",
+              "year"
+            ],
+            "example": "varchar"
+          }
+        },
+        "required": [
+          "database_id",
+          "id",
+          "internal_name",
+          "name",
+          "table_id",
+          "type"
+        ]
+      },
+      "UnitDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "ba1935e8-6817-488f-af0a-f54389af9000"
+          },
+          "uri": {
+            "type": "string"
+          },
+          "name": {
+            "type": "string"
+          },
+          "description": {
+            "type": "string"
+          },
+          "columns": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/ColumnBriefDto"
+            }
+          }
+        },
+        "required": [
+          "columns",
+          "id",
+          "uri"
+        ]
+      },
+      "OntologyBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "7c491e40-082a-47b8-b82c-51d03c520466"
+          },
+          "uri": {
+            "type": "string",
+            "example": "http://www.wikidata.org/"
+          },
+          "prefix": {
+            "type": "string",
+            "example": "wd"
+          },
+          "sparql": {
+            "type": "boolean",
+            "example": true
+          },
+          "rdf": {
+            "type": "boolean",
+            "example": false
+          },
+          "uri_pattern": {
+            "type": "string",
+            "example": "http://www.wikidata.org/entity/.*"
+          }
+        },
+        "required": [
+          "id",
+          "prefix",
+          "rdf",
+          "sparql",
+          "uri"
+        ]
+      },
+      "EntityDto": {
+        "type": "object",
+        "properties": {
+          "uri": {
+            "type": "string",
+            "example": "https://www.wikidata.org/entity/Q1686799"
+          },
+          "label": {
+            "type": "string",
+            "example": "Apache Jena"
+          },
+          "description": {
+            "type": "string",
+            "example": "open source semantic web framework for Java"
+          }
+        },
+        "required": [
+          "label",
+          "uri"
+        ]
+      },
+      "OaiListIdentifiersParameters": {
+        "type": "object",
+        "properties": {
+          "metadataPrefix": {
+            "type": "string"
+          },
+          "from": {
+            "type": "string"
+          },
+          "until": {
+            "type": "string"
+          },
+          "set": {
+            "type": "string"
+          },
+          "resumptionToken": {
+            "type": "string"
+          },
+          "parametersString": {
+            "type": "string"
+          },
+          "fromDate": {
+            "type": "string",
+            "format": "date-time"
+          },
+          "untilDate": {
+            "type": "string",
+            "format": "date-time"
+          }
+        }
+      },
+      "BannerMessageDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "ae3f795b-a3da-4ebe-bdc4-21a8ce631e6f"
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "error",
+              "warning",
+              "info"
+            ],
+            "example": "WARNING"
+          },
+          "message": {
+            "type": "string",
+            "example": "Maintenance starts on 8am on Monday"
+          },
+          "link": {
+            "type": "string",
+            "example": "https://example.com"
+          },
+          "link_text": {
+            "type": "string",
+            "example": "More"
+          },
+          "display_start": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2021-03-12T15:26:21Z"
+          },
+          "display_end": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2021-03-12T15:26:21Z"
+          }
+        },
+        "required": [
+          "id",
+          "message",
+          "type"
+        ]
+      },
+      "ImageBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "816f55d5-1098-4f60-a4af-c8121c04dcce"
+          },
+          "name": {
+            "type": "string",
+            "example": "mariadb"
+          },
+          "version": {
+            "type": "string",
+            "example": 10.5
+          },
+          "default": {
+            "type": "boolean",
+            "example": false
+          }
+        },
+        "required": [
+          "default",
+          "id",
+          "name",
+          "version"
+        ]
+      },
+      "LdCreatorDto": {
+        "type": "object",
+        "properties": {
+          "name": {
+            "type": "string"
+          },
+          "sameAs": {
+            "type": "string"
+          },
+          "givenName": {
+            "type": "string"
+          },
+          "familyName": {
+            "type": "string"
+          },
+          "@type": {
+            "type": "string"
+          }
+        },
+        "required": [
+          "@type",
+          "name"
+        ]
+      },
+      "LdDatasetDto": {
+        "type": "object",
+        "properties": {
+          "name": {
+            "type": "string"
+          },
+          "description": {
+            "type": "string"
+          },
+          "url": {
+            "type": "string"
+          },
+          "identifier": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "license": {
+            "type": "string"
+          },
+          "creator": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/LdCreatorDto"
+            }
+          },
+          "citation": {
+            "type": "string"
+          },
+          "hasPart": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/LdDatasetDto"
+            }
+          },
+          "temporalCoverage": {
+            "type": "string"
+          },
+          "version": {
+            "type": "string",
+            "format": "date-time"
+          },
+          "@context": {
+            "type": "string"
+          },
+          "@type": {
+            "type": "string"
+          }
+        },
+        "required": [
+          "@context",
+          "@type",
+          "citation",
+          "creator",
+          "description",
+          "hasPart",
+          "identifier",
+          "name",
+          "temporalCoverage",
+          "url",
+          "version"
+        ]
+      },
+      "ViewColumnDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "6aec3a91-2e0b-4e92-a16a-9c3c5e892da1"
+          },
+          "name": {
+            "type": "string",
+            "example": "Given Name",
+            "maxLength": 64,
+            "minLength": 0
+          },
+          "size": {
+            "type": "integer",
+            "format": "int64",
+            "example": 255
+          },
+          "d": {
+            "type": "integer",
+            "format": "int64",
+            "example": 0
+          },
+          "description": {
+            "type": "string",
+            "example": "Column comment",
+            "maxLength": 2048,
+            "minLength": 0
+          },
+          "enums": {
+            "type": "array",
+            "description": "enum values, only considered when type = ENUM",
+            "items": {
+              "$ref": "#/components/schemas/EnumDto"
+            }
+          },
+          "sets": {
+            "type": "array",
+            "description": "enum values, only considered when type = ENUM",
+            "items": {
+              "$ref": "#/components/schemas/SetDto"
+            }
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4"
+          },
+          "ord": {
+            "type": "integer",
+            "format": "int32",
+            "example": 0
+          },
+          "internal_name": {
+            "type": "string",
+            "example": "given_name",
+            "maxLength": 64,
+            "minLength": 0
+          },
+          "index_length": {
+            "type": "integer",
+            "format": "int64",
+            "example": 255
+          },
+          "length": {
+            "type": "integer",
+            "format": "int64",
+            "example": 255
+          },
+          "type": {
+            "type": "string",
+            "enum": [
+              "char",
+              "varchar",
+              "binary",
+              "varbinary",
+              "tinyblob",
+              "tinytext",
+              "text",
+              "blob",
+              "mediumtext",
+              "mediumblob",
+              "longtext",
+              "longblob",
+              "enum",
+              "set",
+              "serial",
+              "bit",
+              "tinyint",
+              "bool",
+              "smallint",
+              "mediumint",
+              "int",
+              "bigint",
+              "float",
+              "double",
+              "decimal",
+              "date",
+              "datetime",
+              "timestamp",
+              "time",
+              "year"
+            ],
+            "example": "varchar"
+          },
+          "is_null_allowed": {
+            "type": "boolean",
+            "example": false
+          }
+        },
+        "required": [
+          "database_id",
+          "id",
+          "internal_name",
+          "is_null_allowed",
+          "name",
+          "ord",
+          "type"
+        ]
+      },
+      "ViewDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "787439d0-e85e-400c-a7e6-996a023bfad9"
+          },
+          "name": {
+            "type": "string",
+            "example": "Air Quality"
+          },
+          "identifiers": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierDto"
+            }
+          },
+          "query": {
+            "type": "string",
+            "example": "SELECT `id` FROM `air_quality` ORDER BY `value` DESC"
+          },
+          "owner": {
+            "$ref": "#/components/schemas/UserBriefDto"
+          },
+          "columns": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/ViewColumnDto"
+            }
+          },
+          "created": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2022-01-01 08:00:00.000"
+          },
+          "last_retrieved": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2025-01-23T12:09:01"
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc"
+          },
+          "internal_name": {
+            "type": "string",
+            "example": "air_quality"
+          },
+          "is_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "is_schema_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "initial_view": {
+            "type": "boolean",
+            "description": "True if it is the default view for the database",
+            "example": true
+          },
+          "query_hash": {
+            "type": "string",
+            "example": "7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916"
+          }
+        },
+        "required": [
+          "columns",
+          "created",
+          "database_id",
+          "id",
+          "identifiers",
+          "internal_name",
+          "name",
+          "owner",
+          "query",
+          "query_hash"
+        ]
+      },
+      "ConstraintsDto": {
+        "type": "object",
+        "properties": {
+          "uniques": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/UniqueDto"
+            }
+          },
+          "checks": {
+            "type": "array",
+            "example": [
+              "value > 1"
+            ],
+            "items": {
+              "type": "string"
+            },
+            "uniqueItems": true
+          },
+          "foreign_keys": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/ForeignKeyDto"
+            }
+          },
+          "primary_key": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/PrimaryKeyDto"
+            },
+            "uniqueItems": true
+          }
+        }
+      },
+      "ForeignKeyBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "f2b740ec-0b13-4d07-88a9-529d354bba6a"
+          }
+        }
+      },
+      "ForeignKeyDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "f2b740ec-0b13-4d07-88a9-529d354bba6a"
+          },
+          "name": {
+            "type": "string",
+            "example": "fk_name"
+          },
+          "references": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/ForeignKeyReferenceDto"
+            }
+          },
+          "table": {
+            "$ref": "#/components/schemas/TableBriefDto"
+          },
+          "referenced_table": {
+            "$ref": "#/components/schemas/TableBriefDto"
+          },
+          "on_update": {
+            "type": "string",
+            "enum": [
+              "restrict",
+              "cascade",
+              "set_null",
+              "no_action",
+              "set_default"
+            ],
+            "example": "restrict"
+          },
+          "on_delete": {
+            "type": "string",
+            "enum": [
+              "restrict",
+              "cascade",
+              "set_null",
+              "no_action",
+              "set_default"
+            ],
+            "example": "restrict"
+          }
+        },
+        "required": [
+          "name",
+          "referenced_table",
+          "references",
+          "table"
+        ]
+      },
+      "ForeignKeyReferenceDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "f2b740ec-0b13-4d07-88a9-529d354bba6a"
+          },
+          "column": {
+            "$ref": "#/components/schemas/ColumnBriefDto"
+          },
+          "foreign_key": {
+            "$ref": "#/components/schemas/ForeignKeyBriefDto"
+          },
+          "referenced_column": {
+            "$ref": "#/components/schemas/ColumnBriefDto"
+          }
+        },
+        "required": [
+          "column",
+          "foreign_key",
+          "referenced_column"
+        ]
+      },
+      "PrimaryKeyDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "d984f9d7-e8a7-4b81-b59a-862db1871f18"
+          },
+          "table": {
+            "$ref": "#/components/schemas/TableBriefDto"
+          },
+          "column": {
+            "$ref": "#/components/schemas/ColumnBriefDto"
+          }
+        },
+        "required": [
+          "column",
+          "table"
+        ]
+      },
+      "TableDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "d346f844-b84c-490f-9aec-725a2dc8f820"
+          },
+          "name": {
+            "type": "string",
+            "example": "Air Quality"
+          },
+          "alias": {
+            "type": "string",
+            "example": "a"
+          },
+          "identifiers": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/IdentifierDto"
+            }
+          },
+          "owner": {
+            "$ref": "#/components/schemas/UserBriefDto"
+          },
+          "description": {
+            "type": "string",
+            "example": "Air Quality in Austria",
+            "maxLength": 2048,
+            "minLength": 0
+          },
+          "columns": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/ColumnDto"
+            }
+          },
+          "constraints": {
+            "$ref": "#/components/schemas/ConstraintsDto"
+          },
+          "created": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2022-01-01 08:00:00.000"
+          },
+          "last_retrieved": {
+            "type": "string",
+            "format": "date-time",
+            "example": "2025-01-23T12:09:01"
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc"
+          },
+          "internal_name": {
+            "type": "string",
+            "example": "air_quality"
+          },
+          "is_versioned": {
+            "type": "boolean",
+            "example": true
+          },
+          "is_schema_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "queue_name": {
+            "type": "string",
+            "example": "air_quality"
+          },
+          "queue_type": {
+            "type": "string",
+            "example": "quorum"
+          },
+          "routing_key": {
+            "type": "string",
+            "example": "dbrepo.1.2"
+          },
+          "is_public": {
+            "type": "boolean",
+            "example": true
+          },
+          "num_rows": {
+            "type": "integer",
+            "format": "int64",
+            "example": 5
+          },
+          "data_length": {
+            "type": "integer",
+            "format": "int64",
+            "description": "in bytes",
+            "example": 16384
+          },
+          "max_data_length": {
+            "type": "integer",
+            "format": "int64",
+            "description": "in bytes",
+            "example": 0
+          },
+          "avg_row_length": {
+            "type": "integer",
+            "format": "int64",
+            "description": "in bytes",
+            "example": 3276
+          }
+        },
+        "required": [
+          "columns",
+          "constraints",
+          "created",
+          "database_id",
+          "id",
+          "internal_name",
+          "is_public",
+          "is_schema_public",
+          "is_versioned",
+          "name",
+          "owner",
+          "queue_name",
+          "routing_key"
+        ]
+      },
+      "UniqueDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "d984f9d7-e8a7-4b81-b59a-862db1871f13"
+          },
+          "name": {
+            "type": "string",
+            "example": "uk_name"
+          },
+          "table": {
+            "$ref": "#/components/schemas/TableBriefDto"
+          },
+          "columns": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/ColumnBriefDto"
+            }
+          }
+        },
+        "required": [
+          "columns",
+          "id",
+          "name",
+          "table"
+        ]
+      },
+      "TableColumnEntityDto": {
+        "type": "object",
+        "properties": {
+          "uri": {
+            "type": "string",
+            "example": "https://www.wikidata.org/entity/Q1686799"
+          },
+          "label": {
+            "type": "string",
+            "example": "Apache Jena"
+          },
+          "description": {
+            "type": "string",
+            "example": "open source semantic web framework for Java"
+          },
+          "database_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "475b4107-a64d-4495-a7ef-3cb0dadd4804"
+          },
+          "table_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "9a9208af-90ea-4382-9a11-0c8f6d89bd1f"
+          },
+          "column_id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "297860e3-3b29-451c-ae8a-a85ed5941018"
+          }
+        },
+        "required": [
+          "column_id",
+          "database_id",
+          "table_id",
+          "uri"
+        ]
+      },
+      "ContainerBriefDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "7ddb7e87-b965-43a2-9a24-4fa406d998f4"
+          },
+          "hash": {
+            "type": "string",
+            "example": "f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50"
+          },
+          "name": {
+            "type": "string",
+            "example": "Air Quality"
+          },
+          "image": {
+            "$ref": "#/components/schemas/ImageBriefDto"
+          },
+          "quota": {
+            "type": "integer",
+            "format": "int32",
+            "example": 50
+          },
+          "count": {
+            "type": "integer",
+            "format": "int32",
+            "example": 10
+          },
+          "internal_name": {
+            "type": "string",
+            "example": "air-quality"
+          }
+        },
+        "required": [
+          "count",
+          "hash",
+          "id",
+          "image",
+          "internal_name",
+          "name",
+          "quota"
+        ]
+      },
+      "ConceptDto": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string",
+            "format": "uuid",
+            "example": "8cabc011-4bdf-44d4-9d33-b2648e2ddbf1"
+          },
+          "uri": {
+            "type": "string"
+          },
+          "name": {
+            "type": "string"
+          },
+          "description": {
+            "type": "string"
+          },
+          "columns": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/ColumnBriefDto"
+            }
+          }
+        },
+        "required": [
+          "columns",
+          "id",
+          "uri"
+        ]
+      }
+    },
+    "securitySchemes": {
+      "basicAuth": {
+        "type": "http",
+        "scheme": "basic"
+      },
+      "bearerAuth": {
+        "type": "http",
+        "scheme": "bearer",
+        "bearerFormat": "JWT"
+      }
+    }
+  }
+}
diff --git a/.docs/.openapi/api-metadata.yaml b/.docs/.openapi/api-metadata.yaml
deleted file mode 100644
index 31ac0b72dd2e1280b3447907e4dc8c2579c69133..0000000000000000000000000000000000000000
--- a/.docs/.openapi/api-metadata.yaml
+++ /dev/null
@@ -1,7097 +0,0 @@
-openapi: 3.1.0
-info:
-  title: Database Repository Metadata Service API
-  description: Service that manages the metadata
-  contact:
-    name: Prof. Andreas Rauber
-    email: andreas.rauber@tuwien.ac.at
-  license:
-    name: Apache 2.0
-    url: https://www.apache.org/licenses/LICENSE-2.0
-  version: 1.8.2
-externalDocs:
-  description: Sourcecode Documentation
-  url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8.1/system-services-metadata/
-servers:
-- url: http://localhost
-  description: Development instance
-- url: https://test.dbrepo.tuwien.ac.at
-  description: Staging instance
-paths:
-  /api/user/{userId}:
-    get:
-      tags:
-      - user-endpoint
-      summary: Get user
-      description: Gets own user information from the metadata database. Requires
-        authentication. Foreign user information can only be obtained if additional
-        role `find-foreign-user` is present. Finding information about internal users
-        results in a 404 error.
-      operationId: find
-      parameters:
-      - name: userId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Found user
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/UserDto"
-        "403":
-          description: Find user is not permitted
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: User was not found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    put:
-      tags:
-      - user-endpoint
-      summary: Update user
-      description: Updates user with id. Requires role `modify-user-information`.
-      operationId: modify
-      parameters:
-      - name: userId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/UserUpdateDto"
-        required: true
-      responses:
-        "202":
-          description: Modified user information
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/UserDto"
-        "400":
-          description: Modify user query is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Not allowed to modify user metadata
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find database/user in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to modify user at auth service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    head:
-      tags:
-      - user-endpoint
-      summary: Get user
-      description: Gets own user information from the metadata database. Requires
-        authentication. Foreign user information can only be obtained if additional
-        role `find-foreign-user` is present. Finding information about internal users
-        results in a 404 error.
-      operationId: find_1
-      parameters:
-      - name: userId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Found user
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/UserDto"
-        "403":
-          description: Find user is not permitted
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: User was not found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database:
-    get:
-      tags:
-      - database-endpoint
-      summary: List databases
-      description: "Lists all databases in the metadata database. Requests with HTTP\
-        \ method **GET** return the list of databases, requests with HTTP method **HEAD**\
-        \ only the number in the `X-Count` header."
-      operationId: list
-      parameters:
-      - name: internal_name
-        in: query
-        required: false
-        schema:
-          type: string
-      responses:
-        "200":
-          description: List of databases
-          headers:
-            Access-Control-Expose-Headers:
-              description: Expose `X-Count` custom header
-              required: true
-              style: simple
-              schema:
-                type: string
-            X-Count:
-              description: Number of databases
-              required: true
-              style: simple
-              schema:
-                type: integer
-                format: int64
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/DatabaseBriefDto"
-    post:
-      tags:
-      - database-endpoint
-      summary: Create database
-      description: Creates a database in the container with id. Requires roles `create-database`.
-      operationId: create
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/CreateDatabaseDto"
-        required: true
-      responses:
-        "201":
-          description: Created a new database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/DatabaseBriefDto"
-        "400":
-          description: Database create query is malformed or image is not supported
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Database create permission is missing or grant permissions
-            at broker service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to fin container/user/database in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "409":
-          description: Query store could not be created
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "423":
-          description: Database quota exceeded
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    head:
-      tags:
-      - database-endpoint
-      summary: List databases
-      description: "Lists all databases in the metadata database. Requests with HTTP\
-        \ method **GET** return the list of databases, requests with HTTP method **HEAD**\
-        \ only the number in the `X-Count` header."
-      operationId: list_1
-      parameters:
-      - name: internal_name
-        in: query
-        required: false
-        schema:
-          type: string
-      responses:
-        "200":
-          description: List of databases
-          headers:
-            Access-Control-Expose-Headers:
-              description: Expose `X-Count` custom header
-              required: true
-              style: simple
-              schema:
-                type: string
-            X-Count:
-              description: Number of databases
-              required: true
-              style: simple
-              schema:
-                type: integer
-                format: int64
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/DatabaseBriefDto"
-  /api/database/{databaseId}/access/{userId}:
-    get:
-      tags:
-      - access-endpoint
-      summary: Find/Check access
-      description: "Finds or checks access of a user with given id to a database with\
-        \ given id. Requests with HTTP method **GET** return the access object, requests\
-        \ with HTTP method **HEAD** only the status. When the user has at least *READ*\
-        \ access, the status 200 is returned, 403 otherwise. Requires role `check-database-access`\
-        \ or `check-foreign-database-access`."
-      operationId: find_2
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: userId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Found database access
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/DatabaseAccessDto"
-        "403":
-          description: No access to this database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Database not found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    put:
-      tags:
-      - access-endpoint
-      summary: Modify access
-      description: Modifies access of a user with given id to database with given
-        id. Requires role `update-database-access`.
-      operationId: update
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: userId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/CreateAccessDto"
-        required: true
-      responses:
-        "202":
-          description: Modified access
-        "400":
-          description: Modify access query or database connection is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Modify access not permitted when no access is granted in the
-            first place
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Database or user not found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Access could not be updated due to connection error in the
-            data service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Access could not be updated in the data service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    post:
-      tags:
-      - access-endpoint
-      summary: Give access
-      description: Give a user with given id access to some database with given id.
-        Requires role `create-database-access`.
-      operationId: create_1
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: userId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/CreateAccessDto"
-        required: true
-      responses:
-        "202":
-          description: Granting access succeeded
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/DatabaseAccessDto"
-        "400":
-          description: Granting access query or database connection is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Failed giving access
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Database or user not found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Access could not be created due to connection error
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Access could not be created in the data service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    delete:
-      tags:
-      - access-endpoint
-      summary: Delete access
-      description: Delete access of a user with id to a database with id. Requires
-        role `delete-database-access`.
-      operationId: revoke
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: userId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "202":
-          description: Deleted access
-        "400":
-          description: Modify access query or database connection is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Revoke of access not permitted as no access was found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: "User, database with access was not found"
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Access could not be created due to connection error
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Access could not be revoked in the data service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    head:
-      tags:
-      - access-endpoint
-      summary: Find/Check access
-      description: "Finds or checks access of a user with given id to a database with\
-        \ given id. Requests with HTTP method **GET** return the access object, requests\
-        \ with HTTP method **HEAD** only the status. When the user has at least *READ*\
-        \ access, the status 200 is returned, 403 otherwise. Requires role `check-database-access`\
-        \ or `check-foreign-database-access`."
-      operationId: find_3
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: userId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Found database access
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/DatabaseAccessDto"
-        "403":
-          description: No access to this database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Database not found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/ontology/{ontologyId}:
-    get:
-      tags:
-      - ontology-endpoint
-      summary: Find ontology
-      description: Finds an ontology with id in the metadata database.
-      operationId: find_4
-      parameters:
-      - name: ontologyId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Find one ontology
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/OntologyDto"
-        "404":
-          description: Could not find ontology
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-    put:
-      tags:
-      - ontology-endpoint
-      summary: Update ontology
-      description: Updates an ontology with id. Requires role `update-ontology`.
-      operationId: update_1
-      parameters:
-      - name: ontologyId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/OntologyModifyDto"
-        required: true
-      responses:
-        "202":
-          description: Updated ontology successfully
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/OntologyDto"
-        "404":
-          description: Could not find ontology
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    delete:
-      tags:
-      - ontology-endpoint
-      summary: Delete ontology
-      description: Deletes an ontology with given id. Requires role `delete-ontology`.
-      operationId: delete
-      parameters:
-      - name: ontologyId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "202":
-          description: Deleted ontology successfully
-          content:
-            application/json: {}
-        "404":
-          description: Could not find ontology
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/message/{messageId}:
-    put:
-      tags:
-      - message-endpoint
-      summary: Update message
-      description: Updates a message with id. Requires role `update-maintenance-message`.
-      operationId: update_2
-      parameters:
-      - name: messageId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/BannerMessageUpdateDto"
-        required: true
-      responses:
-        "202":
-          description: Updated message
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/BannerMessageBriefDto"
-        "404":
-          description: Could not find message
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    delete:
-      tags:
-      - message-endpoint
-      summary: Delete message
-      description: Deletes a message with id. Requires role `delete-maintenance-message`.
-      operationId: delete_1
-      parameters:
-      - name: messageId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "202":
-          description: Deleted message
-          content:
-            application/json: {}
-        "404":
-          description: Could not find message
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/image/{imageId}:
-    get:
-      tags:
-      - image-endpoint
-      summary: Find image
-      description: Finds a container image in the metadata database.
-      operationId: findById
-      parameters:
-      - name: imageId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Found image
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ImageDto"
-        "404":
-          description: Image could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-    put:
-      tags:
-      - image-endpoint
-      summary: Update image
-      description: Updates container image in the metadata database. Requires role
-        `modify-image`.
-      operationId: update_3
-      parameters:
-      - name: imageId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/ImageChangeDto"
-        required: true
-      responses:
-        "202":
-          description: Updated image successfully
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ImageDto"
-        "404":
-          description: Image could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    delete:
-      tags:
-      - image-endpoint
-      summary: Delete image
-      description: Deletes a container image in the metadata database. Requires role
-        `delete-image`.
-      operationId: delete_2
-      parameters:
-      - name: imageId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "202":
-          description: Deleted image successfully
-        "404":
-          description: Image could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/identifier/{identifierId}:
-    get:
-      tags:
-      - identifier-endpoint
-      summary: Find identifier
-      description: Finds an identifier with id. The response format depends on the
-        HTTP `Accept` header set on the request.
-      operationId: find_5
-      parameters:
-      - name: identifierId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: Accept
-        in: header
-        required: true
-        schema:
-          type: string
-      responses:
-        "200":
-          description: Found identifier successfully
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/IdentifierDto"
-            application/ld+json:
-              schema:
-                $ref: "#/components/schemas/LdDatasetDto"
-            text/xml: {}
-            text/bibliography: {}
-            text/bibliography; style=apa: {}
-            text/bibliography; style=ieee: {}
-            text/bibliography; style=bibtex: {}
-        "400":
-          description: "Identifier could not be exported, the requested style is not\
-            \ known"
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Not allowed to view identifier
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Identifier could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "406":
-          description: Failed to find acceptable representation
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "409":
-          description: Exported resource was not found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "410":
-          description: Failed to retrieve from S3 endpoint
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to data service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to find in data service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-    put:
-      tags:
-      - identifier-endpoint
-      summary: Save identifier
-      description: Saves an identifier with id as a draft identifier. Identifiers
-        can only be created for objects the user has at least *READ* access in the
-        associated database (requires role `create-identifier`) or for any object
-        in any database (requires role `create-foreign-identifier`).
-      operationId: save
-      parameters:
-      - name: identifierId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/IdentifierSaveDto"
-        required: true
-      responses:
-        "202":
-          description: Saved identifier
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/IdentifierDto"
-        "400":
-          description: Identifier form contains invalid request data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Insufficient access rights or authorities
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: "Failed to find database, table or view"
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    delete:
-      tags:
-      - identifier-endpoint
-      summary: Delete identifier
-      description: Deletes an identifier with id. Requires role `delete-identifier`.
-      operationId: delete_3
-      parameters:
-      - name: identifierId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "202":
-          description: Deleted identifier
-        "403":
-          description: Deleting identifier not permitted
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Identifier or database could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to delete in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/identifier/{identifierId}/publish:
-    put:
-      tags:
-      - identifier-endpoint
-      summary: Publish identifier
-      description: Publishes an identifier with id. A published identifier cannot
-        be changed anymore. Requires role `publish-identifier`.
-      operationId: publish
-      parameters:
-      - name: identifierId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "202":
-          description: Published identifier
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/IdentifierDto"
-        "400":
-          description: Identifier form contains invalid request data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Insufficient access rights or authorities
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: "Failed to find database, table or view"
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/visibility:
-    put:
-      tags:
-      - database-endpoint
-      summary: Update database visibility
-      description: Updates the database with id on the visibility. Only the database
-        owner can perform this operation. Requires role `modify-database-visibility`.
-      operationId: visibility
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/DatabaseModifyVisibilityDto"
-        required: true
-      responses:
-        "202":
-          description: Visibility modified successfully
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/DatabaseBriefDto"
-        "400":
-          description: The visibility payload is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Visibility modification is not permitted
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find database in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/view/{viewId}:
-    get:
-      tags:
-      - view-endpoint
-      summary: Get view
-      description: Gets a view with id in the metadata database.
-      operationId: find_6
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: viewId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Find view successfully
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ViewDto"
-        "403":
-          description: Find view is not permitted
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: "Database, view or user could not be found"
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    put:
-      tags:
-      - view-endpoint
-      summary: Update view
-      description: Updates a view with id. This can only be performed by the view
-        owner or database owner. Requires role `create-database-view`.
-      operationId: update_4
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: viewId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/ViewUpdateDto"
-        required: true
-      responses:
-        "202":
-          description: Update view successfully
-          content:
-            '*/*':
-              schema:
-                $ref: "#/components/schemas/ViewBriefDto"
-        "400":
-          description: Update view query is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Update not allowed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Database or View could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    delete:
-      tags:
-      - view-endpoint
-      summary: Delete view
-      description: Deletes a view with id. Requires role `delete-database-view`.
-      operationId: delete_4
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: viewId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "202":
-          description: Delete view successfully
-        "400":
-          description: Delete view query is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Deletion not allowed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: "Database, view or user could not be found"
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "423":
-          description: Delete view resulted in an invalid query statement
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/table/{tableId}:
-    get:
-      tags:
-      - table-endpoint
-      summary: Find table
-      description: "Finds a table with id. When a table is hidden (i.e. when `is_public`\
-        \ is `false`), then the user needs to have at least read access and the role\
-        \ `find-table`. When the `system` role is present, the endpoint responds with\
-        \ additional connection metadata in the header."
-      operationId: findById_1
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: tableId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Find table successfully
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/TableDto"
-        "403":
-          description: Access to the database is forbidden
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: "Table, database or container could not be found"
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    put:
-      tags:
-      - table-endpoint
-      summary: Update table
-      description: Updates a table in the database with id. Requires role `update-table`.
-      operationId: update_5
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: tableId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/TableUpdateDto"
-        required: true
-      responses:
-        "202":
-          description: Updated the table
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/TableBriefDto"
-        "400":
-          description: Update table visibility payload is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Update table visibility not permitted
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Table could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    delete:
-      tags:
-      - table-endpoint
-      summary: Delete table
-      description: Deletes a table with id. Only the owner of a table can perform
-        this action (requires role `delete-table`) or anyone can delete a table (requires
-        role `delete-foreign-table`).
-      operationId: delete_5
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: tableId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "202":
-          description: Delete table successfully
-        "400":
-          description: Delete table query resulted in an invalid query statement
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Access to the database is forbidden
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: "Table, database or container could not be found"
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/table/{tableId}/statistic:
-    put:
-      tags:
-      - table-endpoint
-      summary: Update statistics
-      description: "Updates basic statistical properties (min, max, mean, median,\
-        \ std.dev) for numerical columns in a table with id. This action can only\
-        \ be performed by the table owner. Requires role `update-table-statistic`."
-      operationId: updateStatistic
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: tableId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "202":
-          description: Updated table statistics successfully
-        "400":
-          description: Failed to map column statistic to known columns
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Not the owner
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find database/table in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/table/{tableId}/column/{columnId}:
-    put:
-      tags:
-      - table-endpoint
-      summary: Update semantics
-      description: Updates column semantics of a table column with id. Only the table
-        owner with at least *READ* access to the associated database can update the
-        column semantics (requires role `modify-table-column-semantics`) or foreign
-        table columns if role `modify-foreign-table-column-semantics`.
-      operationId: updateColumn
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: tableId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: columnId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/ColumnSemanticsUpdateDto"
-        required: true
-      responses:
-        "202":
-          description: Updated column semantics successfully
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ColumnDto"
-        "400":
-          description: Update semantic concept query is malformed or update unit of
-            measurement query is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Access to the database is forbidden
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find user/table/database/ontology in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/owner:
-    put:
-      tags:
-      - database-endpoint
-      summary: Update database owner
-      description: Updates the database with id on the owner. Only the database owner
-        can perform this operation. Requires role `modify-database-owner`.
-      operationId: transfer
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/DatabaseTransferDto"
-        required: true
-      responses:
-        "202":
-          description: Transfer of ownership was successful
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/DatabaseBriefDto"
-        "400":
-          description: Owner payload is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Database or user could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Transfer of ownership is not permitted
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/metadata/view:
-    put:
-      tags:
-      - database-endpoint
-      summary: Update database view schemas
-      description: Updates the database with id with generated metadata from view
-        that are not yet known to the database. Only the database owner can perform
-        this operation. Requires role `find-database`.
-      operationId: refreshViewMetadata
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Refreshed database views metadata
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/DatabaseBriefDto"
-        "403":
-          description: Refresh view metadata is not permitted
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find database in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/metadata/table:
-    put:
-      tags:
-      - database-endpoint
-      summary: Update database table schemas
-      description: Updates the database with id with generated metadata from tables
-        that are not yet known to the database. Only the database owner can perform
-        this operation. Requires role `find-database`.
-      operationId: refreshTableMetadata
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Refreshed database tables metadata
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/DatabaseBriefDto"
-        "400":
-          description: Failed to parse payload at search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Not allowed to refresh table metadata
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find database in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/image:
-    get:
-      tags:
-      - database-endpoint
-      summary: Get database preview image
-      description: Gets the database with id on the preview image.
-      operationId: findPreviewImage
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: View of image was successful
-          content:
-            '*/*':
-              schema:
-                type: string
-                format: byte
-        "404":
-          description: Database or user could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    put:
-      tags:
-      - database-endpoint
-      summary: Update database preview image
-      description: Updates the database with id on the preview image. Only the database
-        owner can perform this operation. Requires role `modify-database-image`.
-      operationId: modifyImage
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/DatabaseModifyImageDto"
-        required: true
-      responses:
-        "202":
-          description: Modify of image was successful
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/DatabaseBriefDto"
-        "403":
-          description: Modify of image is not permitted
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Database could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "410":
-          description: File was not found in the Storage Service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/dashboard:
-    put:
-      tags:
-      - database-endpoint
-      summary: Update database dashboard uid
-      description: Updates the dashboard uid for a database with given id. Only the
-        database owner can perform this operation. Requires role `system`.
-      operationId: modifyDashboard
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/DatabaseModifyDashboardDto"
-        required: true
-      responses:
-        "202":
-          description: Modify of dashboard uid was successful
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/DatabaseBriefDto"
-        "400":
-          description: Malformed payload
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Database could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/ontology:
-    get:
-      tags:
-      - ontology-endpoint
-      summary: List ontologies
-      description: Lists all ontologies known to the metadata database.
-      operationId: findAll
-      responses:
-        "200":
-          description: List ontologies
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/OntologyBriefDto"
-    post:
-      tags:
-      - ontology-endpoint
-      summary: Create ontology
-      description: Creates an ontology in the metadata database. Requires role `create-ontology`.
-      operationId: create_2
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/OntologyCreateDto"
-        required: true
-      responses:
-        "201":
-          description: Registered ontology successfully
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/OntologyDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/message:
-    get:
-      tags:
-      - message-endpoint
-      summary: List messages
-      description: "Lists messages known to the metadata database. Messages can be\
-        \ filtered be filtered with the optional `active` parameter. If set to *true*,\
-        \ only active messages (that is, messages whose end time has not been reached)\
-        \ will be returned. Otherwise only inactive messages are returned. If not\
-        \ set, active and inactive messages are returned."
-      operationId: list_2
-      parameters:
-      - name: active
-        in: query
-        required: false
-        schema:
-          type: boolean
-      responses:
-        "200":
-          description: List messages
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/BannerMessageDto"
-    post:
-      tags:
-      - message-endpoint
-      summary: Create message
-      description: Creates a message in the metadata database. Requires role `create-maintenance-message`.
-      operationId: create_3
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/BannerMessageCreateDto"
-        required: true
-      responses:
-        "201":
-          description: Created message
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/BannerMessageBriefDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/image:
-    get:
-      tags:
-      - image-endpoint
-      summary: List images
-      description: Lists all container images known to the metadata database.
-      operationId: findAll_1
-      responses:
-        "200":
-          description: List images
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/ImageBriefDto"
-    post:
-      tags:
-      - image-endpoint
-      summary: Create image
-      description: Creates a container image in the metadata database. Requires role
-        `create-image`.
-      operationId: create_4
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/ImageCreateDto"
-        required: true
-      responses:
-        "201":
-          description: Created image
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ImageDto"
-        "400":
-          description: Image specification is invalid
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "409":
-          description: Image already exists
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/identifier:
-    get:
-      tags:
-      - identifier-endpoint
-      summary: List identifiers
-      description: Lists all identifiers known to the metadata database
-      operationId: findAll_2
-      parameters:
-      - name: type
-        in: query
-        required: false
-        schema:
-          type: string
-          enum:
-          - database
-          - subset
-          - table
-          - view
-      - name: status
-        in: query
-        required: false
-        schema:
-          type: string
-          enum:
-          - draft
-          - published
-      - name: dbid
-        in: query
-        required: false
-        schema:
-          type: string
-          format: uuid
-      - name: qid
-        in: query
-        required: false
-        schema:
-          type: string
-          format: uuid
-      - name: vid
-        in: query
-        required: false
-        schema:
-          type: string
-          format: uuid
-      - name: tid
-        in: query
-        required: false
-        schema:
-          type: string
-          format: uuid
-      - name: Accept
-        in: header
-        required: true
-        schema:
-          type: string
-      responses:
-        "200":
-          description: Found identifiers successfully
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  type: array
-                  items:
-                    $ref: "#/components/schemas/IdentifierBriefDto"
-            application/ld+json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/LdDatasetDto"
-    post:
-      tags:
-      - identifier-endpoint
-      summary: Create identifier
-      description: Create an identifier with id to create a draft identifier. Identifiers
-        can only be created for objects the user has at least *READ* access in the
-        associated database (requires role `create-identifier`) or for any object
-        in any database (requires role `create-foreign-identifier`).
-      operationId: create_5
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/CreateIdentifierDto"
-        required: true
-      responses:
-        "201":
-          description: Drafted identifier
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/IdentifierDto"
-        "400":
-          description: Identifier form contains invalid request data
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Insufficient access rights or authorities
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: "Failed to find database, table or view"
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/view:
-    get:
-      tags:
-      - view-endpoint
-      summary: List views
-      description: Lists views known to the metadata database.
-      operationId: findAll_3
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Find views successfully
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/ViewBriefDto"
-        "404":
-          description: Database or user could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    post:
-      tags:
-      - view-endpoint
-      summary: Create view
-      description: Creates a view. This can only be performed by the database owner.
-        Requires role `create-database-view`.
-      operationId: create_6
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/CreateViewDto"
-        required: true
-      responses:
-        "201":
-          description: Create view successfully
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ViewBriefDto"
-        "400":
-          description: Create view query is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Credentials missing
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find database/user in metadata database.
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "409":
-          description: View exists with name
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "423":
-          description: Create view resulted in an invalid query statement
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/table:
-    get:
-      tags:
-      - table-endpoint
-      summary: List tables
-      description: "Lists all tables known to the metadata database. When a database\
-        \ has a hidden schema (i.e. when `is_schema_public` is `false`), then the\
-        \ user needs to have at least read access and the role `list-tables`."
-      operationId: list_3
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: List tables
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/TableBriefDto"
-        "403":
-          description: List tables not permitted
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Database could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-    post:
-      tags:
-      - table-endpoint
-      summary: Create table
-      description: Creates a table in the database with id. Requires role `create-table`.
-      operationId: create_7
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/CreateTableDto"
-        required: true
-      responses:
-        "201":
-          description: Created a new table
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/TableBriefDto"
-        "400":
-          description: Create table query is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Create table not permitted
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: "Database, container or user could not be found"
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "409":
-          description: Create table conflicts with existing table name
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "502":
-          description: Connection to search service failed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "503":
-          description: Failed to save in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/container:
-    get:
-      tags:
-      - container-endpoint
-      summary: List containers
-      description: List all containers in the metadata database.
-      operationId: findAll_4
-      parameters:
-      - name: limit
-        in: query
-        required: false
-        schema:
-          type: integer
-          format: int32
-      responses:
-        "200":
-          description: List containers
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/ContainerBriefDto"
-    post:
-      tags:
-      - container-endpoint
-      summary: Create container
-      description: Creates a container in the metadata database. Requires role `create-container`.
-      operationId: create_8
-      requestBody:
-        content:
-          application/json:
-            schema:
-              $ref: "#/components/schemas/CreateContainerDto"
-        required: true
-      responses:
-        "201":
-          description: Created a new container
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ContainerDto"
-        "400":
-          description: Container payload malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: "Create container not permitted, need authority `create-container`"
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Container image or user could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "409":
-          description: Container name already exists
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/user:
-    get:
-      tags:
-      - user-endpoint
-      summary: List users
-      description: "Lists users known to the metadata database. Internal users are\
-        \ omitted from the result list. If the optional query parameter `username`\
-        \ is present, the result list can be filtered by matching this exact username."
-      operationId: findAll_5
-      parameters:
-      - name: username
-        in: query
-        required: false
-        schema:
-          type: string
-      responses:
-        "200":
-          description: List users
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/UserBriefDto"
-  /api/unit:
-    get:
-      tags:
-      - unit-endpoint
-      summary: List units
-      description: Lists units known to the metadata database.
-      operationId: findAll_6
-      responses:
-        "200":
-          description: Find all semantic units
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/UnitDto"
-  /api/ontology/{ontologyId}/entity:
-    get:
-      tags:
-      - ontology-endpoint
-      summary: Find entities
-      description: Finds semantic entities by label or uri in an ontology with id.
-        Requires role `execute-semantic-query`.
-      operationId: find_7
-      parameters:
-      - name: ontologyId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: label
-        in: query
-        required: false
-        schema:
-          type: string
-      - name: uri
-        in: query
-        required: false
-        schema:
-          type: string
-      responses:
-        "200":
-          description: Found entities
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/EntityDto"
-        "400":
-          description: Filter params are invalid
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Could not find ontology
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "417":
-          description: Generated query or uri is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "422":
-          description: Ontology does not have rdf or sparql endpoint
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/oai:
-    get:
-      tags:
-      - metadata-endpoint
-      summary: Get record
-      operationId: identify
-      parameters:
-      - name: verb
-        in: query
-      - name: parameters
-        in: query
-        required: true
-        schema:
-          $ref: "#/components/schemas/OaiListIdentifiersParameters"
-      responses:
-        "200":
-          description: List containers
-          content:
-            text/xml:
-              schema:
-                type: string
-  /api/message/message/{messageId}:
-    get:
-      tags:
-      - message-endpoint
-      summary: Find message
-      description: Finds a message with id in the metadata database.
-      operationId: find_8
-      parameters:
-      - name: messageId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Get messages
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/BannerMessageDto"
-        "404":
-          description: Could not find message
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-  /api/license:
-    get:
-      tags:
-      - license-endpoint
-      summary: List licenses
-      description: Lists licenses known to the metadata database.
-      operationId: list_4
-      responses:
-        "200":
-          description: List of licenses
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/LicenseDto"
-  /api/identifier/retrieve:
-    get:
-      tags:
-      - identifier-endpoint
-      summary: Retrieve PID metadata
-      description: "Retrieves Persistent Identifier (PID) metadata from external endpoints.\
-        \ Supported PIDs are: ORCID, ROR, DOI."
-      operationId: retrieve
-      parameters:
-      - name: url
-        in: query
-        required: true
-        schema:
-          type: string
-      responses:
-        "200":
-          description: Retrieved metadata from identifier
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/IdentifierDto"
-        "404":
-          description: Failed to find metadata for identifier
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-  /api/database/{databaseId}:
-    get:
-      tags:
-      - database-endpoint
-      summary: Find database
-      description: Finds a database with id.
-      operationId: findById_2
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Database found successfully
-          headers:
-            X-Username:
-              description: The authentication username
-              style: simple
-              schema:
-                type: string
-            Access-Control-Expose-Headers:
-              description: Expose custom headers
-              style: simple
-              schema:
-                type: string
-            X-Password:
-              description: The authentication password
-              style: simple
-              schema:
-                type: string
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/DatabaseBriefDto"
-        "403":
-          description: Not allowed to view database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Database could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/table/{tableId}/suggest:
-    get:
-      tags:
-      - table-endpoint
-      summary: Suggest semantics
-      description: Suggests semantic concepts for a table. This action can only be
-        performed by the table owner. Requires role `table-semantic-analyse`.
-      operationId: analyseTable
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: tableId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Suggested table semantics successfully
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/EntityDto"
-        "400":
-          description: Failed to parse statistic in search service
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "403":
-          description: Not the table owner.
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find database/table in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "417":
-          description: Generated query is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "422":
-          description: Ontology does not have rdf or sparql endpoint
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/database/{databaseId}/table/{tableId}/column/{columnId}/suggest:
-    get:
-      tags:
-      - table-endpoint
-      summary: Suggest semantics
-      description: Suggests column semantics. Requires role `table-semantic-analyse`.
-      operationId: analyseTableColumn
-      parameters:
-      - name: databaseId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: tableId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      - name: columnId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Suggested table column semantics successfully
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/TableColumnEntityDto"
-        "400":
-          description: Generated query is malformed
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Failed to find database/table in metadata database
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "422":
-          description: Ontology does not have rdf or sparql endpoint
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/container/{containerId}:
-    get:
-      tags:
-      - container-endpoint
-      summary: Find container
-      description: Finds a container in the metadata database.
-      operationId: findById_3
-      parameters:
-      - name: containerId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "200":
-          description: Found container
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ContainerDto"
-        "404":
-          description: Container image could not be found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-    delete:
-      tags:
-      - container-endpoint
-      summary: Delete container
-      description: Deletes a container in the metadata database. Requires role `delete-container`.
-      operationId: delete_6
-      parameters:
-      - name: containerId
-        in: path
-        required: true
-        schema:
-          type: string
-          format: uuid
-      responses:
-        "202":
-          description: Deleted container
-        "403":
-          description: "Create container not permitted, need authority `delete-container`"
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-        "404":
-          description: Container not found
-          content:
-            application/json:
-              schema:
-                $ref: "#/components/schemas/ApiErrorDto"
-      security:
-      - bearerAuth: []
-      - basicAuth: []
-  /api/concept:
-    get:
-      tags:
-      - concept-endpoint
-      summary: List concepts
-      description: List all semantic concepts known to the metadata database
-      operationId: findAll_7
-      responses:
-        "200":
-          description: List concepts
-          content:
-            application/json:
-              schema:
-                type: array
-                items:
-                  $ref: "#/components/schemas/ConceptDto"
-components:
-  schemas:
-    UserAttributesDto:
-      type: object
-      properties:
-        theme:
-          type: string
-          example: light
-        orcid:
-          type: string
-          example: https://orcid.org/0000-0002-1825-0097
-        affiliation:
-          type: string
-          example: Brown University
-        language:
-          type: string
-          example: en
-      required:
-      - language
-      - theme
-    UserDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
-        name:
-          type: string
-          example: Josiah Carberry
-        username:
-          type: string
-          example: username
-        password:
-          type: string
-          example: p4ssw0rd
-        attributes:
-          $ref: "#/components/schemas/UserAttributesDto"
-        last_retrieved:
-          type: string
-          format: date-time
-          example: 2025-01-23T12:09:01
-        qualified_name:
-          type: string
-          example: Josiah Carberry — @jcarberry
-        given_name:
-          type: string
-          example: Josiah
-        family_name:
-          type: string
-          example: Carberry
-      required:
-      - attributes
-      - id
-      - password
-      - username
-    ApiErrorDto:
-      type: object
-      properties:
-        status:
-          type: string
-          enum:
-          - 100 CONTINUE
-          - 101 SWITCHING_PROTOCOLS
-          - 102 PROCESSING
-          - 103 EARLY_HINTS
-          - 103 CHECKPOINT
-          - 200 OK
-          - 201 CREATED
-          - 202 ACCEPTED
-          - 203 NON_AUTHORITATIVE_INFORMATION
-          - 204 NO_CONTENT
-          - 205 RESET_CONTENT
-          - 206 PARTIAL_CONTENT
-          - 207 MULTI_STATUS
-          - 208 ALREADY_REPORTED
-          - 226 IM_USED
-          - 300 MULTIPLE_CHOICES
-          - 301 MOVED_PERMANENTLY
-          - 302 FOUND
-          - 302 MOVED_TEMPORARILY
-          - 303 SEE_OTHER
-          - 304 NOT_MODIFIED
-          - 305 USE_PROXY
-          - 307 TEMPORARY_REDIRECT
-          - 308 PERMANENT_REDIRECT
-          - 400 BAD_REQUEST
-          - 401 UNAUTHORIZED
-          - 402 PAYMENT_REQUIRED
-          - 403 FORBIDDEN
-          - 404 NOT_FOUND
-          - 405 METHOD_NOT_ALLOWED
-          - 406 NOT_ACCEPTABLE
-          - 407 PROXY_AUTHENTICATION_REQUIRED
-          - 408 REQUEST_TIMEOUT
-          - 409 CONFLICT
-          - 410 GONE
-          - 411 LENGTH_REQUIRED
-          - 412 PRECONDITION_FAILED
-          - 413 PAYLOAD_TOO_LARGE
-          - 413 REQUEST_ENTITY_TOO_LARGE
-          - 414 URI_TOO_LONG
-          - 414 REQUEST_URI_TOO_LONG
-          - 415 UNSUPPORTED_MEDIA_TYPE
-          - 416 REQUESTED_RANGE_NOT_SATISFIABLE
-          - 417 EXPECTATION_FAILED
-          - 418 I_AM_A_TEAPOT
-          - 419 INSUFFICIENT_SPACE_ON_RESOURCE
-          - 420 METHOD_FAILURE
-          - 421 DESTINATION_LOCKED
-          - 422 UNPROCESSABLE_ENTITY
-          - 423 LOCKED
-          - 424 FAILED_DEPENDENCY
-          - 425 TOO_EARLY
-          - 426 UPGRADE_REQUIRED
-          - 428 PRECONDITION_REQUIRED
-          - 429 TOO_MANY_REQUESTS
-          - 431 REQUEST_HEADER_FIELDS_TOO_LARGE
-          - 451 UNAVAILABLE_FOR_LEGAL_REASONS
-          - 500 INTERNAL_SERVER_ERROR
-          - 501 NOT_IMPLEMENTED
-          - 502 BAD_GATEWAY
-          - 503 SERVICE_UNAVAILABLE
-          - 504 GATEWAY_TIMEOUT
-          - 505 HTTP_VERSION_NOT_SUPPORTED
-          - 506 VARIANT_ALSO_NEGOTIATES
-          - 507 INSUFFICIENT_STORAGE
-          - 508 LOOP_DETECTED
-          - 509 BANDWIDTH_LIMIT_EXCEEDED
-          - 510 NOT_EXTENDED
-          - 511 NETWORK_AUTHENTICATION_REQUIRED
-          example: NOT_FOUND
-        message:
-          type: string
-          example: Error message
-        code:
-          type: string
-          example: error.service.code
-      required:
-      - code
-      - message
-      - status
-    CreatorBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: e41f94a6-2b94-4a12-ac0e-678684e1c070
-        affiliation:
-          type: string
-          example: Brown University
-        creator_name:
-          type: string
-          example: "Carberry, Josiah"
-        name_type:
-          type: string
-          enum:
-          - Personal
-          - Organizational
-          example: Personal
-        name_identifier:
-          type: string
-          example: 0000-0002-1825-0097
-        name_identifier_scheme:
-          type: string
-          enum:
-          - ORCID
-          - ROR
-          - ISNI
-          - GRID
-          example: ORCID
-        affiliation_identifier:
-          type: string
-          example: https://ror.org/05gq02987
-        affiliation_identifier_scheme:
-          type: string
-          enum:
-          - ROR
-          - GRID
-          - ISNI
-          example: ROR
-      required:
-      - creator_name
-      - id
-    DatabaseBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: fc29f89c-86a8-4020-9e36-4d954736c6cc
-        name:
-          type: string
-          example: Air Quality
-        description:
-          type: string
-          example: Air Quality
-        identifiers:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierBriefDto"
-        contact:
-          $ref: "#/components/schemas/UserBriefDto"
-        internal_name:
-          type: string
-          example: air_quality
-        is_public:
-          type: boolean
-          example: true
-        is_schema_public:
-          type: boolean
-          example: true
-        owner_id:
-          type: string
-          format: uuid
-          example: 2f45ef7a-7f9b-4667-9156-152c87fe1ca5
-        preview_image:
-          type: string
-      required:
-      - contact
-      - id
-      - identifiers
-      - internal_name
-      - is_public
-      - is_schema_public
-      - name
-      - owner_id
-    IdentifierBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: b97cd56b-66ca-4354-9e6c-f47210cfaaec
-        type:
-          type: string
-          enum:
-          - database
-          - subset
-          - table
-          - view
-          example: database
-        creators:
-          type: array
-          items:
-            $ref: "#/components/schemas/CreatorBriefDto"
-        titles:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierTitleDto"
-        descriptions:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierDescriptionDto"
-        doi:
-          type: string
-          example: 10.1038/nphys1170
-        publisher:
-          type: string
-          example: TU Wien
-        status:
-          type: string
-          enum:
-          - draft
-          - published
-          example: draft
-        database_id:
-          type: string
-          format: uuid
-          example: fc29f89c-86a8-4020-9e36-4d954736c6cc
-        query_id:
-          type: string
-          format: uuid
-          example: 1
-        table_id:
-          type: string
-          format: uuid
-          example: 1
-        view_id:
-          type: string
-          format: uuid
-          example: 1
-        publication_year:
-          type: integer
-          format: int32
-          example: 2022
-        owned_by:
-          type: string
-          format: uuid
-          example: 2f45ef7a-7f9b-4667-9156-152c87fe1ca5
-      required:
-      - creators
-      - database_id
-      - descriptions
-      - id
-      - owned_by
-      - publication_year
-      - publisher
-      - status
-      - titles
-      - type
-    IdentifierDescriptionDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: e0e9692c-910b-4b60-b53a-fc7c358a917d
-        description:
-          type: string
-          example: "Air quality reports at Stephansplatz, Vienna"
-        language:
-          type: string
-          enum:
-          - ab
-          - aa
-          - af
-          - ak
-          - sq
-          - am
-          - ar
-          - an
-          - hy
-          - as
-          - av
-          - ae
-          - ay
-          - az
-          - bm
-          - ba
-          - eu
-          - be
-          - bn
-          - bh
-          - bi
-          - bs
-          - br
-          - bg
-          - my
-          - ca
-          - km
-          - ch
-          - ce
-          - ny
-          - zh
-          - cu
-          - cv
-          - kw
-          - co
-          - cr
-          - hr
-          - cs
-          - da
-          - dv
-          - nl
-          - dz
-          - en
-          - eo
-          - et
-          - ee
-          - fo
-          - fj
-          - fi
-          - fr
-          - ff
-          - gd
-          - gl
-          - lg
-          - ka
-          - de
-          - ki
-          - el
-          - kl
-          - gn
-          - gu
-          - ht
-          - ha
-          - he
-          - hz
-          - hi
-          - ho
-          - hu
-          - is
-          - io
-          - ig
-          - id
-          - ia
-          - ie
-          - iu
-          - ik
-          - ga
-          - it
-          - ja
-          - jv
-          - kn
-          - kr
-          - ks
-          - kk
-          - rw
-          - kv
-          - kg
-          - ko
-          - kj
-          - ku
-          - ky
-          - lo
-          - la
-          - lv
-          - lb
-          - li
-          - ln
-          - lt
-          - lu
-          - mk
-          - mg
-          - ms
-          - ml
-          - mt
-          - gv
-          - mi
-          - mr
-          - mh
-          - ro
-          - mn
-          - na
-          - nv
-          - nd
-          - ng
-          - ne
-          - se
-          - "no"
-          - nb
-          - nn
-          - ii
-          - oc
-          - oj
-          - or
-          - om
-          - os
-          - pi
-          - pa
-          - ps
-          - fa
-          - pl
-          - pt
-          - qu
-          - rm
-          - rn
-          - ru
-          - sm
-          - sg
-          - sa
-          - sc
-          - sr
-          - sn
-          - sd
-          - si
-          - sk
-          - sl
-          - so
-          - st
-          - nr
-          - es
-          - su
-          - sw
-          - ss
-          - sv
-          - tl
-          - ty
-          - tg
-          - ta
-          - tt
-          - te
-          - th
-          - bo
-          - ti
-          - to
-          - ts
-          - tn
-          - tr
-          - tk
-          - tw
-          - ug
-          - uk
-          - ur
-          - uz
-          - ve
-          - vi
-          - vo
-          - wa
-          - cy
-          - fy
-          - wo
-          - xh
-          - yi
-          - yo
-          - za
-          - zu
-          example: en
-        type:
-          type: string
-          enum:
-          - Abstract
-          - Methods
-          - SeriesInformation
-          - TableOfContents
-          - TechnicalInfo
-          - Other
-          example: Abstract
-      required:
-      - id
-    IdentifierTitleDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 70ce5164-fd74-413f-8712-f996b91defbf
-        title:
-          type: string
-          example: Airquality Demonstrator
-        language:
-          type: string
-          enum:
-          - ab
-          - aa
-          - af
-          - ak
-          - sq
-          - am
-          - ar
-          - an
-          - hy
-          - as
-          - av
-          - ae
-          - ay
-          - az
-          - bm
-          - ba
-          - eu
-          - be
-          - bn
-          - bh
-          - bi
-          - bs
-          - br
-          - bg
-          - my
-          - ca
-          - km
-          - ch
-          - ce
-          - ny
-          - zh
-          - cu
-          - cv
-          - kw
-          - co
-          - cr
-          - hr
-          - cs
-          - da
-          - dv
-          - nl
-          - dz
-          - en
-          - eo
-          - et
-          - ee
-          - fo
-          - fj
-          - fi
-          - fr
-          - ff
-          - gd
-          - gl
-          - lg
-          - ka
-          - de
-          - ki
-          - el
-          - kl
-          - gn
-          - gu
-          - ht
-          - ha
-          - he
-          - hz
-          - hi
-          - ho
-          - hu
-          - is
-          - io
-          - ig
-          - id
-          - ia
-          - ie
-          - iu
-          - ik
-          - ga
-          - it
-          - ja
-          - jv
-          - kn
-          - kr
-          - ks
-          - kk
-          - rw
-          - kv
-          - kg
-          - ko
-          - kj
-          - ku
-          - ky
-          - lo
-          - la
-          - lv
-          - lb
-          - li
-          - ln
-          - lt
-          - lu
-          - mk
-          - mg
-          - ms
-          - ml
-          - mt
-          - gv
-          - mi
-          - mr
-          - mh
-          - ro
-          - mn
-          - na
-          - nv
-          - nd
-          - ng
-          - ne
-          - se
-          - "no"
-          - nb
-          - nn
-          - ii
-          - oc
-          - oj
-          - or
-          - om
-          - os
-          - pi
-          - pa
-          - ps
-          - fa
-          - pl
-          - pt
-          - qu
-          - rm
-          - rn
-          - ru
-          - sm
-          - sg
-          - sa
-          - sc
-          - sr
-          - sn
-          - sd
-          - si
-          - sk
-          - sl
-          - so
-          - st
-          - nr
-          - es
-          - su
-          - sw
-          - ss
-          - sv
-          - tl
-          - ty
-          - tg
-          - ta
-          - tt
-          - te
-          - th
-          - bo
-          - ti
-          - to
-          - ts
-          - tn
-          - tr
-          - tk
-          - tw
-          - ug
-          - uk
-          - ur
-          - uz
-          - ve
-          - vi
-          - vo
-          - wa
-          - cy
-          - fy
-          - wo
-          - xh
-          - yi
-          - yo
-          - za
-          - zu
-          example: en
-        type:
-          type: string
-          enum:
-          - AlternativeTitle
-          - Subtitle
-          - TranslatedTitle
-          - Other
-      required:
-      - id
-    UserBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
-        username:
-          type: string
-          description: Only contains lowercase characters
-          example: jcarberry
-        name:
-          type: string
-          example: Josiah Carberry
-        orcid:
-          type: string
-          example: 0000-0002-1825-0097
-        qualified_name:
-          type: string
-          example: Josiah Carberry — @jcarberry
-        given_name:
-          type: string
-          example: Josiah
-        family_name:
-          type: string
-          example: Carberry
-      required:
-      - id
-      - username
-    DatabaseAccessDto:
-      type: object
-      properties:
-        user:
-          $ref: "#/components/schemas/UserBriefDto"
-        type:
-          type: string
-          enum:
-          - read
-          - write_own
-          - write_all
-          example: read
-      required:
-      - type
-      - user
-    UserUpdateDto:
-      type: object
-      properties:
-        firstname:
-          type: string
-          example: Josiah
-        lastname:
-          type: string
-          example: Carberry
-        affiliation:
-          type: string
-          example: Brown University
-        orcid:
-          type: string
-          example: 0000-0002-1825-0097
-        theme:
-          type: string
-          example: dark
-        language:
-          type: string
-          example: en
-      required:
-      - language
-      - theme
-    OntologyModifyDto:
-      type: object
-      properties:
-        uri:
-          type: string
-          example: Ontology URI
-        prefix:
-          type: string
-          example: Ontology prefix
-        sparql_endpoint:
-          type: string
-          example: Ontology SPARQL endpoint
-        rdf_path:
-          type: string
-          example: rdf/om-2.0.rdf
-      required:
-      - prefix
-      - uri
-    OntologyDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 7c491e40-082a-47b8-b82c-51d03c520466
-        uri:
-          type: string
-          example: http://www.wikidata.org/
-        prefix:
-          type: string
-          example: wd
-        sparql:
-          type: boolean
-          example: true
-        rdf:
-          type: boolean
-          example: false
-        uri_pattern:
-          type: string
-          example: http://www.wikidata.org/entity/.*
-        sparql_endpoint:
-          type: string
-          example: https://query.wikidata.org/sparql
-        rdf_path:
-          type: string
-          example: rdf/om-2.0.rdf
-      required:
-      - id
-      - prefix
-      - rdf
-      - sparql
-      - uri
-    BannerMessageUpdateDto:
-      type: object
-      properties:
-        type:
-          type: string
-          enum:
-          - error
-          - warning
-          - info
-        message:
-          type: string
-          example: Maintenance starts on 8am on Monday
-        link:
-          type: string
-          example: https://example.com
-        link_text:
-          type: string
-          example: More
-        display_start:
-          type: string
-          format: date-time
-          example: 2021-03-12T15:26:21Z
-        display_end:
-          type: string
-          format: date-time
-          example: 2021-03-12T15:26:21Z
-      required:
-      - message
-      - type
-    BannerMessageBriefDto:
-      type: object
-      properties:
-        type:
-          type: string
-          enum:
-          - error
-          - warning
-          - info
-        message:
-          type: string
-          example: Maintenance starts on 8am on Monday
-        link:
-          type: string
-          example: https://example.com
-        link_text:
-          type: string
-          example: More
-      required:
-      - message
-      - type
-    ImageChangeDto:
-      type: object
-      properties:
-        registry:
-          type: string
-          example: docker.io/library
-        defaultPort:
-          type: integer
-          format: int32
-          example: 5432
-          maximum: 65535
-          minimum: 1024
-        dialect:
-          type: string
-          example: Postgres
-        driver_class:
-          type: string
-          example: org.postgresql.Driver
-        jdbc_method:
-          type: string
-          example: postgresql
-      required:
-      - dialect
-      - driver_class
-      - jdbc_method
-      - registry
-    DataTypeDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 816f55d5-1098-4f60-a4af-c8121c04dcca
-        value:
-          type: string
-          example: time
-        documentation:
-          type: string
-          example: https://mariadb.com/kb/en/time/
-        display_name:
-          type: string
-          example: TIME(fsp)
-        size_min:
-          type: integer
-          format: int32
-          example: 0
-        size_max:
-          type: integer
-          format: int32
-          example: 6
-        size_default:
-          type: integer
-          format: int32
-          example: 0
-        size_required:
-          type: boolean
-          example: false
-        d_min:
-          type: integer
-          format: int32
-        d_max:
-          type: integer
-          format: int32
-        d_default:
-          type: integer
-          format: int32
-        d_required:
-          type: boolean
-        data_hint:
-          type: string
-          example: "e.g. HH:MM:SS, HH:MM, HHMMSS, H:M:S"
-        type_hint:
-          type: string
-          example: "fsp=microsecond precision, min. 0, max. 6"
-        is_quoted:
-          type: boolean
-          description: frontend needs to quote this data type
-          example: false
-        is_buildable:
-          type: boolean
-          description: frontend can build this data type
-          example: true
-      required:
-      - display_name
-      - documentation
-      - id
-      - is_buildable
-      - is_quoted
-      - value
-    ImageDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 816f55d5-1098-4f60-a4af-c8121c04dcce
-        name:
-          type: string
-          example: mariadb
-        version:
-          type: string
-          example: 10.5
-        operators:
-          type: array
-          items:
-            $ref: "#/components/schemas/OperatorDto"
-        default:
-          type: boolean
-          example: false
-        data_types:
-          type: array
-          items:
-            $ref: "#/components/schemas/DataTypeDto"
-      required:
-      - data_types
-      - default
-      - id
-      - name
-      - operators
-      - version
-    OperatorDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 816f55d5-1098-4f60-a4af-c8121c04dccf
-        value:
-          type: string
-          example: XOR
-        documentation:
-          type: string
-          example: https://mariadb.com/kb/en/xor/
-        display_name:
-          type: string
-          example: XOR
-      required:
-      - display_name
-      - documentation
-      - id
-      - value
-    IdentifierSaveDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 68e11675-1e0f-4d24-a6d9-887ad1c4445d
-        type:
-          type: string
-          enum:
-          - database
-          - subset
-          - table
-          - view
-          example: database
-        doi:
-          type: string
-          example: 10.1111/11111111
-        titles:
-          type: array
-          items:
-            $ref: "#/components/schemas/SaveIdentifierTitleDto"
-        descriptions:
-          type: array
-          items:
-            $ref: "#/components/schemas/SaveIdentifierDescriptionDto"
-        funders:
-          type: array
-          items:
-            $ref: "#/components/schemas/SaveIdentifierFunderDto"
-        licenses:
-          type: array
-          items:
-            $ref: "#/components/schemas/LicenseDto"
-        publisher:
-          type: string
-          example: TU Wien
-        language:
-          type: string
-          enum:
-          - ab
-          - aa
-          - af
-          - ak
-          - sq
-          - am
-          - ar
-          - an
-          - hy
-          - as
-          - av
-          - ae
-          - ay
-          - az
-          - bm
-          - ba
-          - eu
-          - be
-          - bn
-          - bh
-          - bi
-          - bs
-          - br
-          - bg
-          - my
-          - ca
-          - km
-          - ch
-          - ce
-          - ny
-          - zh
-          - cu
-          - cv
-          - kw
-          - co
-          - cr
-          - hr
-          - cs
-          - da
-          - dv
-          - nl
-          - dz
-          - en
-          - eo
-          - et
-          - ee
-          - fo
-          - fj
-          - fi
-          - fr
-          - ff
-          - gd
-          - gl
-          - lg
-          - ka
-          - de
-          - ki
-          - el
-          - kl
-          - gn
-          - gu
-          - ht
-          - ha
-          - he
-          - hz
-          - hi
-          - ho
-          - hu
-          - is
-          - io
-          - ig
-          - id
-          - ia
-          - ie
-          - iu
-          - ik
-          - ga
-          - it
-          - ja
-          - jv
-          - kn
-          - kr
-          - ks
-          - kk
-          - rw
-          - kv
-          - kg
-          - ko
-          - kj
-          - ku
-          - ky
-          - lo
-          - la
-          - lv
-          - lb
-          - li
-          - ln
-          - lt
-          - lu
-          - mk
-          - mg
-          - ms
-          - ml
-          - mt
-          - gv
-          - mi
-          - mr
-          - mh
-          - ro
-          - mn
-          - na
-          - nv
-          - nd
-          - ng
-          - ne
-          - se
-          - "no"
-          - nb
-          - nn
-          - ii
-          - oc
-          - oj
-          - or
-          - om
-          - os
-          - pi
-          - pa
-          - ps
-          - fa
-          - pl
-          - pt
-          - qu
-          - rm
-          - rn
-          - ru
-          - sm
-          - sg
-          - sa
-          - sc
-          - sr
-          - sn
-          - sd
-          - si
-          - sk
-          - sl
-          - so
-          - st
-          - nr
-          - es
-          - su
-          - sw
-          - ss
-          - sv
-          - tl
-          - ty
-          - tg
-          - ta
-          - tt
-          - te
-          - th
-          - bo
-          - ti
-          - to
-          - ts
-          - tn
-          - tr
-          - tk
-          - tw
-          - ug
-          - uk
-          - ur
-          - uz
-          - ve
-          - vi
-          - vo
-          - wa
-          - cy
-          - fy
-          - wo
-          - xh
-          - yi
-          - yo
-          - za
-          - zu
-        creators:
-          type: array
-          items:
-            $ref: "#/components/schemas/SaveIdentifierCreatorDto"
-        database_id:
-          type: string
-          format: uuid
-          example: null
-        query_id:
-          type: string
-          format: uuid
-          example: null
-        view_id:
-          type: string
-          format: uuid
-          example: null
-        table_id:
-          type: string
-          format: uuid
-          example: null
-        publication_day:
-          type: integer
-          format: int32
-          example: 15
-        publication_month:
-          type: integer
-          format: int32
-          example: 12
-        publication_year:
-          type: integer
-          format: int32
-          example: 2022
-        related_identifiers:
-          type: array
-          items:
-            $ref: "#/components/schemas/SaveRelatedIdentifierDto"
-      required:
-      - creators
-      - database_id
-      - id
-      - publication_year
-      - publisher
-      - titles
-      - type
-    LicenseDto:
-      type: object
-      properties:
-        identifier:
-          type: string
-          example: MIT
-        uri:
-          type: string
-          example: https://opensource.org/licenses/MIT
-        description:
-          type: string
-          example: "A short and simple permissive license with conditions only requiring\
-            \ preservation of copyright and license notices. Licensed works, modifications,\
-            \ and larger works may be distributed under different terms and without\
-            \ source code."
-      required:
-      - identifier
-      - uri
-    SaveIdentifierCreatorDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: da9dd034-00a8-4517-b93d-d1b2adfee418
-        firstname:
-          type: string
-          example: Josiah
-        lastname:
-          type: string
-          example: Carberry
-        affiliation:
-          type: string
-          example: Wesleyan University
-        creator_name:
-          type: string
-          example: "Carberry, Josiah"
-        name_type:
-          type: string
-          enum:
-          - Personal
-          - Organizational
-          example: Personal
-        name_identifier:
-          type: string
-          example: 0000-0002-1825-0097
-        name_identifier_scheme:
-          type: string
-          enum:
-          - ORCID
-          - ROR
-          - ISNI
-          - GRID
-          example: ORCID
-        affiliation_identifier:
-          type: string
-          example: https://ror.org/04d836q62
-        affiliation_identifier_scheme:
-          type: string
-          enum:
-          - ROR
-          - GRID
-          - ISNI
-          example: ROR
-      required:
-      - creator_name
-      - id
-    SaveIdentifierDescriptionDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 35bd84d8-b181-43c8-b786-4d024e4f843c
-        description:
-          type: string
-          example: "Air quality reports at Stephansplatz, Vienna"
-        language:
-          type: string
-          enum:
-          - ab
-          - aa
-          - af
-          - ak
-          - sq
-          - am
-          - ar
-          - an
-          - hy
-          - as
-          - av
-          - ae
-          - ay
-          - az
-          - bm
-          - ba
-          - eu
-          - be
-          - bn
-          - bh
-          - bi
-          - bs
-          - br
-          - bg
-          - my
-          - ca
-          - km
-          - ch
-          - ce
-          - ny
-          - zh
-          - cu
-          - cv
-          - kw
-          - co
-          - cr
-          - hr
-          - cs
-          - da
-          - dv
-          - nl
-          - dz
-          - en
-          - eo
-          - et
-          - ee
-          - fo
-          - fj
-          - fi
-          - fr
-          - ff
-          - gd
-          - gl
-          - lg
-          - ka
-          - de
-          - ki
-          - el
-          - kl
-          - gn
-          - gu
-          - ht
-          - ha
-          - he
-          - hz
-          - hi
-          - ho
-          - hu
-          - is
-          - io
-          - ig
-          - id
-          - ia
-          - ie
-          - iu
-          - ik
-          - ga
-          - it
-          - ja
-          - jv
-          - kn
-          - kr
-          - ks
-          - kk
-          - rw
-          - kv
-          - kg
-          - ko
-          - kj
-          - ku
-          - ky
-          - lo
-          - la
-          - lv
-          - lb
-          - li
-          - ln
-          - lt
-          - lu
-          - mk
-          - mg
-          - ms
-          - ml
-          - mt
-          - gv
-          - mi
-          - mr
-          - mh
-          - ro
-          - mn
-          - na
-          - nv
-          - nd
-          - ng
-          - ne
-          - se
-          - "no"
-          - nb
-          - nn
-          - ii
-          - oc
-          - oj
-          - or
-          - om
-          - os
-          - pi
-          - pa
-          - ps
-          - fa
-          - pl
-          - pt
-          - qu
-          - rm
-          - rn
-          - ru
-          - sm
-          - sg
-          - sa
-          - sc
-          - sr
-          - sn
-          - sd
-          - si
-          - sk
-          - sl
-          - so
-          - st
-          - nr
-          - es
-          - su
-          - sw
-          - ss
-          - sv
-          - tl
-          - ty
-          - tg
-          - ta
-          - tt
-          - te
-          - th
-          - bo
-          - ti
-          - to
-          - ts
-          - tn
-          - tr
-          - tk
-          - tw
-          - ug
-          - uk
-          - ur
-          - uz
-          - ve
-          - vi
-          - vo
-          - wa
-          - cy
-          - fy
-          - wo
-          - xh
-          - yi
-          - yo
-          - za
-          - zu
-          example: en
-        type:
-          type: string
-          enum:
-          - Abstract
-          - Methods
-          - SeriesInformation
-          - TableOfContents
-          - TechnicalInfo
-          - Other
-          example: Abstract
-      required:
-      - description
-      - id
-    SaveIdentifierFunderDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 1c6b9212-a315-44b9-946c-3682a7a0e517
-        funder_name:
-          type: string
-          example: European Commission
-        funder_identifier:
-          type: string
-          example: http://doi.org/10.13039/501100000780
-        funder_identifier_type:
-          type: string
-          enum:
-          - Crossref Funder ID
-          - ROR
-          - GND
-          - ISNI
-          - Other
-          example: Crossref Funder ID
-        scheme_uri:
-          type: string
-          example: http://doi.org/
-        award_number:
-          type: string
-          example: 824087
-        award_title:
-          type: string
-          example: EOSC-Life
-      required:
-      - funder_name
-      - id
-    SaveIdentifierTitleDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 2af9f40e-eaf5-4ea1-861a-1a696587bf29
-        title:
-          type: string
-          example: Airquality Demonstrator
-        language:
-          type: string
-          enum:
-          - ab
-          - aa
-          - af
-          - ak
-          - sq
-          - am
-          - ar
-          - an
-          - hy
-          - as
-          - av
-          - ae
-          - ay
-          - az
-          - bm
-          - ba
-          - eu
-          - be
-          - bn
-          - bh
-          - bi
-          - bs
-          - br
-          - bg
-          - my
-          - ca
-          - km
-          - ch
-          - ce
-          - ny
-          - zh
-          - cu
-          - cv
-          - kw
-          - co
-          - cr
-          - hr
-          - cs
-          - da
-          - dv
-          - nl
-          - dz
-          - en
-          - eo
-          - et
-          - ee
-          - fo
-          - fj
-          - fi
-          - fr
-          - ff
-          - gd
-          - gl
-          - lg
-          - ka
-          - de
-          - ki
-          - el
-          - kl
-          - gn
-          - gu
-          - ht
-          - ha
-          - he
-          - hz
-          - hi
-          - ho
-          - hu
-          - is
-          - io
-          - ig
-          - id
-          - ia
-          - ie
-          - iu
-          - ik
-          - ga
-          - it
-          - ja
-          - jv
-          - kn
-          - kr
-          - ks
-          - kk
-          - rw
-          - kv
-          - kg
-          - ko
-          - kj
-          - ku
-          - ky
-          - lo
-          - la
-          - lv
-          - lb
-          - li
-          - ln
-          - lt
-          - lu
-          - mk
-          - mg
-          - ms
-          - ml
-          - mt
-          - gv
-          - mi
-          - mr
-          - mh
-          - ro
-          - mn
-          - na
-          - nv
-          - nd
-          - ng
-          - ne
-          - se
-          - "no"
-          - nb
-          - nn
-          - ii
-          - oc
-          - oj
-          - or
-          - om
-          - os
-          - pi
-          - pa
-          - ps
-          - fa
-          - pl
-          - pt
-          - qu
-          - rm
-          - rn
-          - ru
-          - sm
-          - sg
-          - sa
-          - sc
-          - sr
-          - sn
-          - sd
-          - si
-          - sk
-          - sl
-          - so
-          - st
-          - nr
-          - es
-          - su
-          - sw
-          - ss
-          - sv
-          - tl
-          - ty
-          - tg
-          - ta
-          - tt
-          - te
-          - th
-          - bo
-          - ti
-          - to
-          - ts
-          - tn
-          - tr
-          - tk
-          - tw
-          - ug
-          - uk
-          - ur
-          - uz
-          - ve
-          - vi
-          - vo
-          - wa
-          - cy
-          - fy
-          - wo
-          - xh
-          - yi
-          - yo
-          - za
-          - zu
-          example: en
-        type:
-          type: string
-          enum:
-          - AlternativeTitle
-          - Subtitle
-          - TranslatedTitle
-          - Other
-          example: Subtitle
-      required:
-      - id
-      - title
-    SaveRelatedIdentifierDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 5bb272c7-7421-4f74-83ac-0486812d0f44
-        value:
-          type: string
-          example: 10.70124/dc4zh-9ce78
-        type:
-          type: string
-          enum:
-          - DOI
-          - URL
-          - URN
-          - ARK
-          - arXiv
-          - bibcode
-          - EAN13
-          - EISSN
-          - Handle
-          - IGSN
-          - ISBN
-          - ISTC
-          - LISSN
-          - LSID
-          - PMID
-          - PURL
-          - UPC
-          - w3id
-          example: DOI
-        relation:
-          type: string
-          enum:
-          - IsCitedBy
-          - Cites
-          - IsSupplementTo
-          - IsSupplementedBy
-          - IsContinuedBy
-          - Continues
-          - IsDescribedBy
-          - Describes
-          - HasMetadata
-          - IsMetadataFor
-          - HasVersion
-          - IsVersionOf
-          - IsNewVersionOf
-          - IsPreviousVersionOf
-          - IsPartOf
-          - HasPart
-          - IsPublishedIn
-          - IsReferencedBy
-          - References
-          - IsDocumentedBy
-          - Documents
-          - IsCompiledBy
-          - Compiles
-          - IsVariantFormOf
-          - IsOriginalFormOf
-          - IsIdenticalTo
-          - IsReviewedBy
-          - Reviews
-          - IsDerivedFrom
-          - IsSourceOf
-          - IsRequiredBy
-          - Requires
-          - IsObsoletedBy
-          - Obsoletes
-          example: Cites
-      required:
-      - id
-      - relation
-      - type
-      - value
-    CreatorDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: e41f94a6-2b94-4a12-ac0e-678684e1c070
-        firstname:
-          type: string
-          example: Josiah
-        lastname:
-          type: string
-          example: Carberry
-        affiliation:
-          type: string
-          example: Brown University
-        creator_name:
-          type: string
-          example: "Carberry, Josiah"
-        name_type:
-          type: string
-          enum:
-          - Personal
-          - Organizational
-          example: Personal
-        name_identifier:
-          type: string
-          example: 0000-0002-1825-0097
-        name_identifier_scheme:
-          type: string
-          enum:
-          - ORCID
-          - ROR
-          - ISNI
-          - GRID
-          example: ORCID
-        name_identifier_scheme_uri:
-          type: string
-          example: https://orcid.org/
-        affiliation_identifier:
-          type: string
-          example: https://ror.org/05gq02987
-        affiliation_identifier_scheme:
-          type: string
-          enum:
-          - ROR
-          - GRID
-          - ISNI
-          example: ROR
-        affiliation_identifier_scheme_uri:
-          type: string
-          example: https://ror.org/
-      required:
-      - creator_name
-      - id
-    IdentifierDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: b97cd56b-66ca-4354-9e6c-f47210cfaaec
-        links:
-          $ref: "#/components/schemas/LinksDto"
-        type:
-          type: string
-          enum:
-          - database
-          - subset
-          - table
-          - view
-          example: database
-        titles:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierTitleDto"
-        descriptions:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierDescriptionDto"
-        funders:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierFunderDto"
-        query:
-          type: string
-          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
-            \ = \"09:STEF\""
-        execution:
-          type: string
-          format: date-time
-          example: 2021-03-12T15:26:21Z
-        doi:
-          type: string
-          example: 10.1038/nphys1170
-        publisher:
-          type: string
-          example: TU Wien
-        owner:
-          $ref: "#/components/schemas/UserBriefDto"
-        language:
-          type: string
-          enum:
-          - ab
-          - aa
-          - af
-          - ak
-          - sq
-          - am
-          - ar
-          - an
-          - hy
-          - as
-          - av
-          - ae
-          - ay
-          - az
-          - bm
-          - ba
-          - eu
-          - be
-          - bn
-          - bh
-          - bi
-          - bs
-          - br
-          - bg
-          - my
-          - ca
-          - km
-          - ch
-          - ce
-          - ny
-          - zh
-          - cu
-          - cv
-          - kw
-          - co
-          - cr
-          - hr
-          - cs
-          - da
-          - dv
-          - nl
-          - dz
-          - en
-          - eo
-          - et
-          - ee
-          - fo
-          - fj
-          - fi
-          - fr
-          - ff
-          - gd
-          - gl
-          - lg
-          - ka
-          - de
-          - ki
-          - el
-          - kl
-          - gn
-          - gu
-          - ht
-          - ha
-          - he
-          - hz
-          - hi
-          - ho
-          - hu
-          - is
-          - io
-          - ig
-          - id
-          - ia
-          - ie
-          - iu
-          - ik
-          - ga
-          - it
-          - ja
-          - jv
-          - kn
-          - kr
-          - ks
-          - kk
-          - rw
-          - kv
-          - kg
-          - ko
-          - kj
-          - ku
-          - ky
-          - lo
-          - la
-          - lv
-          - lb
-          - li
-          - ln
-          - lt
-          - lu
-          - mk
-          - mg
-          - ms
-          - ml
-          - mt
-          - gv
-          - mi
-          - mr
-          - mh
-          - ro
-          - mn
-          - na
-          - nv
-          - nd
-          - ng
-          - ne
-          - se
-          - "no"
-          - nb
-          - nn
-          - ii
-          - oc
-          - oj
-          - or
-          - om
-          - os
-          - pi
-          - pa
-          - ps
-          - fa
-          - pl
-          - pt
-          - qu
-          - rm
-          - rn
-          - ru
-          - sm
-          - sg
-          - sa
-          - sc
-          - sr
-          - sn
-          - sd
-          - si
-          - sk
-          - sl
-          - so
-          - st
-          - nr
-          - es
-          - su
-          - sw
-          - ss
-          - sv
-          - tl
-          - ty
-          - tg
-          - ta
-          - tt
-          - te
-          - th
-          - bo
-          - ti
-          - to
-          - ts
-          - tn
-          - tr
-          - tk
-          - tw
-          - ug
-          - uk
-          - ur
-          - uz
-          - ve
-          - vi
-          - vo
-          - wa
-          - cy
-          - fy
-          - wo
-          - xh
-          - yi
-          - yo
-          - za
-          - zu
-        licenses:
-          type: array
-          items:
-            $ref: "#/components/schemas/LicenseDto"
-        creators:
-          type: array
-          items:
-            $ref: "#/components/schemas/CreatorDto"
-        status:
-          type: string
-          enum:
-          - draft
-          - published
-          example: draft
-        database_id:
-          type: string
-          format: uuid
-          example: null
-        query_id:
-          type: string
-          format: uuid
-          example: null
-        table_id:
-          type: string
-          format: uuid
-          example: null
-        view_id:
-          type: string
-          format: uuid
-          example: null
-        query_normalized:
-          type: string
-          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
-            \ = \"09:STEF\""
-        related_identifiers:
-          type: array
-          items:
-            $ref: "#/components/schemas/RelatedIdentifierDto"
-        query_hash:
-          type: string
-          description: query hash in sha512
-        result_hash:
-          type: string
-          example: 34fe82cda2c53f13f8d90cfd7a3469e3a939ff311add50dce30d9136397bf8e5
-        result_number:
-          type: integer
-          format: int64
-          example: 1
-        publication_day:
-          type: integer
-          format: int32
-          example: 15
-        publication_month:
-          type: integer
-          format: int32
-          example: 12
-        publication_year:
-          type: integer
-          format: int32
-          example: 2022
-      required:
-      - creators
-      - database_id
-      - descriptions
-      - funders
-      - id
-      - language
-      - licenses
-      - links
-      - owner
-      - publication_year
-      - publisher
-      - query
-      - query_hash
-      - query_normalized
-      - status
-      - titles
-      - type
-    IdentifierFunderDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 39693413-e0ce-46da-ad5e-029c0556d439
-        funder_name:
-          type: string
-          example: European Commission
-        funder_identifier:
-          type: string
-          example: http://doi.org/10.13039/501100000780
-        funder_identifier_type:
-          type: string
-          enum:
-          - Crossref Funder ID
-          - ROR
-          - GND
-          - ISNI
-          - Other
-          example: Crossref Funder ID
-        scheme_uri:
-          type: string
-          example: http://doi.org/
-        award_number:
-          type: string
-          example: 824087
-        award_title:
-          type: string
-          example: EOSC-Life
-      required:
-      - funder_name
-      - id
-    LinksDto:
-      type: object
-      properties:
-        self:
-          type: string
-          example: http://example.com/api/
-        data:
-          type: string
-          example: http://example.com
-        self_html:
-          type: string
-          example: http://example.com
-        dashboard_html:
-          type: string
-          example: http://example.com/d/defi2baxqawaod
-      required:
-      - self
-      - self_html
-    RelatedIdentifierDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: ce9d11f0-60a2-448d-a3e4-44719a443e8a
-        value:
-          type: string
-          example: 10.70124/dc4zh-9ce78
-        type:
-          type: string
-          enum:
-          - DOI
-          - URL
-          - URN
-          - ARK
-          - arXiv
-          - bibcode
-          - EAN13
-          - EISSN
-          - Handle
-          - IGSN
-          - ISBN
-          - ISTC
-          - LISSN
-          - LSID
-          - PMID
-          - PURL
-          - UPC
-          - w3id
-          example: DOI
-        relation:
-          type: string
-          enum:
-          - IsCitedBy
-          - Cites
-          - IsSupplementTo
-          - IsSupplementedBy
-          - IsContinuedBy
-          - Continues
-          - IsDescribedBy
-          - Describes
-          - HasMetadata
-          - IsMetadataFor
-          - HasVersion
-          - IsVersionOf
-          - IsNewVersionOf
-          - IsPreviousVersionOf
-          - IsPartOf
-          - HasPart
-          - IsPublishedIn
-          - IsReferencedBy
-          - References
-          - IsDocumentedBy
-          - Documents
-          - IsCompiledBy
-          - Compiles
-          - IsVariantFormOf
-          - IsOriginalFormOf
-          - IsIdenticalTo
-          - IsReviewedBy
-          - Reviews
-          - IsDerivedFrom
-          - IsSourceOf
-          - IsRequiredBy
-          - Requires
-          - IsObsoletedBy
-          - Obsoletes
-          example: Cites
-      required:
-      - id
-      - relation
-      - type
-      - value
-    DatabaseModifyVisibilityDto:
-      type: object
-      properties:
-        is_public:
-          type: boolean
-          example: true
-        is_schema_public:
-          type: boolean
-          example: true
-        is_dashboard_enabled:
-          type: boolean
-          example: true
-      required:
-      - is_dashboard_enabled
-      - is_public
-      - is_schema_public
-    ViewUpdateDto:
-      type: object
-      properties:
-        is_public:
-          type: boolean
-          example: true
-        is_schema_public:
-          type: boolean
-          example: true
-      required:
-      - is_public
-      - is_schema_public
-    ViewBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 787439d0-e85e-400c-a7e6-996a023bfad9
-        name:
-          type: string
-          example: Air Quality
-        query:
-          type: string
-          example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC
-        database_id:
-          type: string
-          format: uuid
-          example: 2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4
-        internal_name:
-          type: string
-          example: air_quality
-        is_public:
-          type: boolean
-          example: true
-        is_schema_public:
-          type: boolean
-          example: true
-        initial_view:
-          type: boolean
-          description: True if it is the default view for the database
-          example: true
-        query_hash:
-          type: string
-          example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916
-        owned_by:
-          type: string
-          format: uuid
-          example: ac750fcf-ea02-4fce-85ac-d73857e18b35
-      required:
-      - database_id
-      - id
-      - internal_name
-      - name
-      - query
-      - query_hash
-    TableUpdateDto:
-      type: object
-      properties:
-        description:
-          type: string
-          example: Air Quality in Austria
-          maxLength: 180
-          minLength: 0
-        is_public:
-          type: boolean
-          example: true
-        is_schema_public:
-          type: boolean
-          example: true
-      required:
-      - is_public
-      - is_schema_public
-    TableBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 41ed10e0-687b-4e18-8521-810f5cffbce1
-        name:
-          type: string
-          example: Air Quality
-        description:
-          type: string
-          example: Air Quality in Austria
-        database_id:
-          type: string
-          format: uuid
-          example: a8fec026-dfaf-4b1d-8f6c-f01720d91705
-        internal_name:
-          type: string
-          example: air_quality
-        is_versioned:
-          type: boolean
-          example: true
-        is_public:
-          type: boolean
-          example: true
-        is_schema_public:
-          type: boolean
-          example: true
-        owned_by:
-          type: string
-          format: uuid
-          example: 78337b80-5699-45db-8111-cec86439ab6b
-      required:
-      - database_id
-      - id
-      - internal_name
-      - is_public
-      - is_schema_public
-      - is_versioned
-      - name
-      - owned_by
-    ColumnSemanticsUpdateDto:
-      type: object
-      properties:
-        concept_uri:
-          type: string
-        unit_uri:
-          type: string
-    ColumnDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: a453e444-e00d-41ca-902c-11e9c54b39f1
-        name:
-          type: string
-          example: Given Name
-          maxLength: 64
-          minLength: 0
-        alias:
-          type: string
-          example: firstname
-        size:
-          type: integer
-          format: int64
-          example: 255
-        d:
-          type: integer
-          format: int64
-          example: 0
-        mean:
-          type: number
-          example: 45.4
-        median:
-          type: number
-          example: 51
-        concept:
-          $ref: "#/components/schemas/ConceptBriefDto"
-        unit:
-          $ref: "#/components/schemas/UnitBriefDto"
-        description:
-          type: string
-          example: Column comment
-          maxLength: 2048
-          minLength: 0
-        enums:
-          type: array
-          description: "enum values, only considered when type = ENUM"
-          items:
-            $ref: "#/components/schemas/EnumDto"
-        sets:
-          type: array
-          description: "enum values, only considered when type = ENUM"
-          items:
-            $ref: "#/components/schemas/SetDto"
-        database_id:
-          type: string
-          format: uuid
-          example: 911f9052-c58c-4e1c-b3f2-66af2107be16
-        table_id:
-          type: string
-          format: uuid
-          example: bfffa915-a547-4466-9c65-ddc0d38fdb08
-        ord:
-          type: integer
-          format: int32
-          example: 0
-        internal_name:
-          type: string
-          example: given_name
-          maxLength: 64
-          minLength: 0
-        index_length:
-          type: integer
-          format: int64
-          example: 255
-        length:
-          type: integer
-          format: int64
-          example: 255
-        type:
-          type: string
-          enum:
-          - char
-          - varchar
-          - binary
-          - varbinary
-          - tinyblob
-          - tinytext
-          - text
-          - blob
-          - mediumtext
-          - mediumblob
-          - longtext
-          - longblob
-          - enum
-          - set
-          - serial
-          - bit
-          - tinyint
-          - bool
-          - smallint
-          - mediumint
-          - int
-          - bigint
-          - float
-          - double
-          - decimal
-          - date
-          - datetime
-          - timestamp
-          - time
-          - year
-          example: varchar
-        data_length:
-          type: integer
-          format: int64
-          example: 34300
-        max_data_length:
-          type: integer
-          format: int64
-          example: 34300
-        num_rows:
-          type: integer
-          format: int64
-          example: 32
-        val_min:
-          type: number
-          example: 0
-        val_max:
-          type: number
-          example: 100
-        std_dev:
-          type: number
-          example: 5.32
-        is_null_allowed:
-          type: boolean
-          example: false
-      required:
-      - database_id
-      - id
-      - internal_name
-      - is_null_allowed
-      - name
-      - ord
-      - table_id
-      - type
-    ConceptBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 8cabc011-4bdf-44d4-9d33-b2648e2ddbf1
-        uri:
-          type: string
-          example: http://www.wikidata.org/entity/Q202444
-        name:
-          type: string
-          example: given name
-        description:
-          type: string
-          example: "name typically used to differentiate people from the same family,\
-            \ clan, or other social group who have a common last name"
-      required:
-      - id
-      - uri
-    EnumDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 5343bb3d-14d3-4eb7-a86f-b8fc553cb315
-        value:
-          type: string
-          example: 3
-      required:
-      - id
-      - value
-    SetDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 7eb4eded-bacc-4a91-84db-a9ae6ddafda7
-        value:
-          type: string
-          example: 3
-      required:
-      - id
-      - value
-    UnitBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: ba1935e8-6817-488f-af0a-f54389af9000
-        uri:
-          type: string
-          example: http://www.wikidata.org/entity/Q1422583
-        name:
-          type: string
-          example: importance
-        description:
-          type: string
-          example: "subjective magnitude of value, meaning, or purpose"
-      required:
-      - id
-      - uri
-    DatabaseTransferDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-      required:
-      - id
-    DatabaseModifyImageDto:
-      type: object
-      properties:
-        key:
-          type: string
-    DatabaseModifyDashboardDto:
-      type: object
-      properties:
-        uid:
-          type: string
-      required:
-      - uid
-    CreateAccessDto:
-      type: object
-      properties:
-        type:
-          type: string
-          enum:
-          - read
-          - write_own
-          - write_all
-          example: read
-      required:
-      - type
-    OntologyCreateDto:
-      type: object
-      properties:
-        uri:
-          type: string
-          example: Ontology URI
-        prefix:
-          type: string
-          example: Ontology prefix
-        sparql_endpoint:
-          type: string
-          example: Ontology SPARQL endpoint
-      required:
-      - prefix
-      - uri
-    BannerMessageCreateDto:
-      type: object
-      properties:
-        type:
-          type: string
-          enum:
-          - error
-          - warning
-          - info
-        message:
-          type: string
-          example: Maintenance starts on 8am on Monday
-        link:
-          type: string
-          example: https://example.com
-        link_text:
-          type: string
-          example: More
-        display_start:
-          type: string
-          format: date-time
-          example: 2021-03-12T15:26:21Z
-        display_end:
-          type: string
-          format: date-time
-          example: 2021-03-12T15:26:21Z
-      required:
-      - message
-      - type
-    ImageCreateDto:
-      type: object
-      properties:
-        registry:
-          type: string
-          example: docker.io/library
-        name:
-          type: string
-          example: mariadb
-        version:
-          type: string
-        dialect:
-          type: string
-        is_default:
-          type: boolean
-          example: false
-        driver_class:
-          type: string
-        jdbc_method:
-          type: string
-        default_port:
-          type: integer
-          format: int32
-          maximum: 65535
-          minimum: 1024
-      required:
-      - default_port
-      - dialect
-      - driver_class
-      - is_default
-      - jdbc_method
-      - name
-      - registry
-      - version
-    CreateIdentifierDto:
-      type: object
-      properties:
-        type:
-          type: string
-          enum:
-          - database
-          - subset
-          - table
-          - view
-          example: database
-        doi:
-          type: string
-          example: 10.1111/11111111
-        titles:
-          type: array
-          items:
-            $ref: "#/components/schemas/SaveIdentifierTitleDto"
-        descriptions:
-          type: array
-          items:
-            $ref: "#/components/schemas/SaveIdentifierDescriptionDto"
-        funders:
-          type: array
-          items:
-            $ref: "#/components/schemas/SaveIdentifierFunderDto"
-        licenses:
-          type: array
-          items:
-            $ref: "#/components/schemas/LicenseDto"
-        publisher:
-          type: string
-          example: TU Wien
-        language:
-          type: string
-          enum:
-          - ab
-          - aa
-          - af
-          - ak
-          - sq
-          - am
-          - ar
-          - an
-          - hy
-          - as
-          - av
-          - ae
-          - ay
-          - az
-          - bm
-          - ba
-          - eu
-          - be
-          - bn
-          - bh
-          - bi
-          - bs
-          - br
-          - bg
-          - my
-          - ca
-          - km
-          - ch
-          - ce
-          - ny
-          - zh
-          - cu
-          - cv
-          - kw
-          - co
-          - cr
-          - hr
-          - cs
-          - da
-          - dv
-          - nl
-          - dz
-          - en
-          - eo
-          - et
-          - ee
-          - fo
-          - fj
-          - fi
-          - fr
-          - ff
-          - gd
-          - gl
-          - lg
-          - ka
-          - de
-          - ki
-          - el
-          - kl
-          - gn
-          - gu
-          - ht
-          - ha
-          - he
-          - hz
-          - hi
-          - ho
-          - hu
-          - is
-          - io
-          - ig
-          - id
-          - ia
-          - ie
-          - iu
-          - ik
-          - ga
-          - it
-          - ja
-          - jv
-          - kn
-          - kr
-          - ks
-          - kk
-          - rw
-          - kv
-          - kg
-          - ko
-          - kj
-          - ku
-          - ky
-          - lo
-          - la
-          - lv
-          - lb
-          - li
-          - ln
-          - lt
-          - lu
-          - mk
-          - mg
-          - ms
-          - ml
-          - mt
-          - gv
-          - mi
-          - mr
-          - mh
-          - ro
-          - mn
-          - na
-          - nv
-          - nd
-          - ng
-          - ne
-          - se
-          - "no"
-          - nb
-          - nn
-          - ii
-          - oc
-          - oj
-          - or
-          - om
-          - os
-          - pi
-          - pa
-          - ps
-          - fa
-          - pl
-          - pt
-          - qu
-          - rm
-          - rn
-          - ru
-          - sm
-          - sg
-          - sa
-          - sc
-          - sr
-          - sn
-          - sd
-          - si
-          - sk
-          - sl
-          - so
-          - st
-          - nr
-          - es
-          - su
-          - sw
-          - ss
-          - sv
-          - tl
-          - ty
-          - tg
-          - ta
-          - tt
-          - te
-          - th
-          - bo
-          - ti
-          - to
-          - ts
-          - tn
-          - tr
-          - tk
-          - tw
-          - ug
-          - uk
-          - ur
-          - uz
-          - ve
-          - vi
-          - vo
-          - wa
-          - cy
-          - fy
-          - wo
-          - xh
-          - yi
-          - yo
-          - za
-          - zu
-        creators:
-          type: array
-          items:
-            $ref: "#/components/schemas/SaveIdentifierCreatorDto"
-        database_id:
-          type: string
-          format: uuid
-          example: d002e8d5-8db4-4ff7-ab3a-bc3f52d9ec44
-        query_id:
-          type: string
-          format: uuid
-          example: null
-        view_id:
-          type: string
-          format: uuid
-          example: null
-        table_id:
-          type: string
-          format: uuid
-          example: null
-        publication_day:
-          type: integer
-          format: int32
-          example: 15
-        publication_month:
-          type: integer
-          format: int32
-          example: 12
-        publication_year:
-          type: integer
-          format: int32
-          example: 2022
-        related_identifiers:
-          type: array
-          items:
-            $ref: "#/components/schemas/SaveRelatedIdentifierDto"
-      required:
-      - creators
-      - database_id
-      - publication_year
-      - publisher
-      - titles
-      - type
-    CreateDatabaseDto:
-      type: object
-      properties:
-        name:
-          type: string
-          example: Air Quality
-        container_id:
-          type: string
-          format: uuid
-          example: 0888e108-d521-46e2-9d3e-82099185305b
-        is_public:
-          type: boolean
-          example: true
-        is_schema_public:
-          type: boolean
-          example: true
-      required:
-      - container_id
-      - is_public
-      - is_schema_public
-      - name
-    CreateViewDto:
-      type: object
-      properties:
-        name:
-          type: string
-          example: Air Quality
-          maxLength: 63
-          minLength: 1
-        query:
-          $ref: "#/components/schemas/SubsetDto"
-        is_public:
-          type: boolean
-          example: true
-        is_schema_public:
-          type: boolean
-          example: true
-      required:
-      - is_public
-      - is_schema_public
-      - name
-      - query
-    FilterDto:
-      type: object
-      properties:
-        type:
-          type: string
-          enum:
-          - where
-          - or
-          - and
-          example: where
-        value:
-          type: string
-          example: 1
-        column_id:
-          type: string
-          format: uuid
-          example: 14128033-54b5-4818-a489-21b0dded86e2
-        operator_id:
-          type: string
-          format: uuid
-          example: 67c5b54d-2eb0-4f42-8dc1-a504562e9f32
-      required:
-      - column_id
-      - operator_id
-      - type
-      - value
-    OrderDto:
-      type: object
-      properties:
-        direction:
-          type: string
-          enum:
-          - asc
-          - desc
-          example: asc
-        column_id:
-          type: string
-          format: uuid
-          example: e891ba86-0258-41a6-a8d9-ff58bc10b618
-      required:
-      - column_id
-    SubsetDto:
-      type: object
-      properties:
-        columns:
-          type: array
-          example:
-          - e891ba86-0258-41a6-a8d9-ff58bc10b618
-          items:
-            type: string
-            format: uuid
-        filter:
-          type: array
-          items:
-            $ref: "#/components/schemas/FilterDto"
-        order:
-          type: array
-          items:
-            $ref: "#/components/schemas/OrderDto"
-        datasource_id:
-          type: string
-          format: uuid
-          example: f7df2a7d-4ade-4c78-97b0-7c744d0893c7
-        datasource_type:
-          type: string
-          enum:
-          - table
-          - view
-      required:
-      - columns
-      - datasource_id
-      - datasource_type
-    CreateForeignKeyDto:
-      type: object
-      properties:
-        columns:
-          type: array
-          example:
-          - id
-          items:
-            type: string
-        referenced_table:
-          type: string
-          example: sensor
-        referenced_columns:
-          type: array
-          example:
-          - other_id
-          items:
-            type: string
-        on_update:
-          type: string
-          enum:
-          - restrict
-          - cascade
-          - set_null
-          - no_action
-          - set_default
-          example: cascade
-        on_delete:
-          type: string
-          enum:
-          - restrict
-          - cascade
-          - set_null
-          - no_action
-          - set_default
-          example: cascade
-      required:
-      - columns
-      - referenced_columns
-      - referenced_table
-    CreateTableColumnDto:
-      type: object
-      properties:
-        name:
-          type: string
-          example: Date
-        type:
-          type: string
-          enum:
-          - char
-          - varchar
-          - binary
-          - varbinary
-          - tinyblob
-          - tinytext
-          - text
-          - blob
-          - mediumtext
-          - mediumblob
-          - longtext
-          - longblob
-          - enum
-          - set
-          - serial
-          - bit
-          - tinyint
-          - bool
-          - smallint
-          - mediumint
-          - int
-          - bigint
-          - float
-          - double
-          - decimal
-          - date
-          - datetime
-          - timestamp
-          - time
-          - year
-          example: varchar
-        size:
-          type: integer
-          format: int64
-          example: 255
-        d:
-          type: integer
-          format: int64
-          example: 0
-        description:
-          type: string
-          example: Formatted as YYYY-MM-dd
-          maxLength: 2048
-          minLength: 0
-        enums:
-          type: array
-          description: "enum values, only considered when type = ENUM"
-          items:
-            type: string
-        sets:
-          type: array
-          description: "set values, only considered when type = SET"
-          items:
-            type: string
-        index_length:
-          type: integer
-          format: int64
-        null_allowed:
-          type: boolean
-          example: true
-        concept_uri:
-          type: string
-        unit_uri:
-          type: string
-      required:
-      - name
-      - null_allowed
-      - type
-    CreateTableConstraintsDto:
-      type: object
-      properties:
-        uniques:
-          type: array
-          items:
-            type: array
-            items:
-              type: string
-        checks:
-          type: array
-          items:
-            type: string
-          uniqueItems: true
-        foreign_keys:
-          type: array
-          items:
-            $ref: "#/components/schemas/CreateForeignKeyDto"
-        primary_key:
-          type: array
-          items:
-            type: string
-          uniqueItems: true
-      required:
-      - checks
-      - foreign_keys
-      - primary_key
-      - uniques
-    CreateTableDto:
-      type: object
-      properties:
-        name:
-          type: string
-          example: Air Quality
-          maxLength: 64
-          minLength: 1
-        description:
-          type: string
-          example: Air Quality in Austria
-          maxLength: 180
-          minLength: 0
-        columns:
-          type: array
-          items:
-            $ref: "#/components/schemas/CreateTableColumnDto"
-        constraints:
-          $ref: "#/components/schemas/CreateTableConstraintsDto"
-        is_public:
-          type: boolean
-          example: true
-        is_schema_public:
-          type: boolean
-          example: true
-      required:
-      - columns
-      - constraints
-      - is_public
-      - is_schema_public
-      - name
-    CreateContainerDto:
-      type: object
-      properties:
-        name:
-          type: string
-          example: Air Quality
-        host:
-          type: string
-          description: Hostname of container
-          example: data-db2
-        port:
-          type: integer
-          format: int32
-          description: Port of container
-          example: 3306
-        quota:
-          type: integer
-          format: int64
-          example: 50
-        image_id:
-          type: string
-          format: uuid
-          description: Image ID
-          example: 2360f3c4-85e0-4fac-a7c6-73b296b9dde2
-        ui_host:
-          type: string
-          example: example.com
-        ui_port:
-          type: integer
-          format: int32
-          example: 3306
-        privileged_username:
-          type: string
-          description: Username of privileged user
-          example: root
-        privileged_password:
-          type: string
-          description: Password of privileged user
-          example: dbrepo
-      required:
-      - host
-      - image_id
-      - name
-      - privileged_password
-      - privileged_username
-      - quota
-    ContainerDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 7ddb7e87-b965-43a2-9a24-4fa406d998f4
-        name:
-          type: string
-          example: Air Quality
-        image:
-          $ref: "#/components/schemas/ImageDto"
-        quota:
-          type: integer
-          format: int64
-          example: 50
-        count:
-          type: integer
-          format: int64
-          example: 10
-        username:
-          type: string
-          example: username
-        password:
-          type: string
-          example: p4ssw0rd
-        last_retrieved:
-          type: string
-          format: date-time
-          example: 2025-01-23T12:09:01
-        internal_name:
-          type: string
-          example: air_quality
-      required:
-      - count
-      - id
-      - image
-      - internal_name
-      - name
-    ColumnBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: a453e444-e00d-41ca-902c-11e9c54b39f1
-        name:
-          type: string
-          example: Given Name
-          maxLength: 64
-          minLength: 0
-        alias:
-          type: string
-          example: firstname
-        database_id:
-          type: string
-          format: uuid
-          example: 911f9052-c58c-4e1c-b3f2-66af2107be16
-        table_id:
-          type: string
-          format: uuid
-          example: bfffa915-a547-4466-9c65-ddc0d38fdb08
-        internal_name:
-          type: string
-          example: given_name
-          maxLength: 64
-          minLength: 0
-        type:
-          type: string
-          enum:
-          - char
-          - varchar
-          - binary
-          - varbinary
-          - tinyblob
-          - tinytext
-          - text
-          - blob
-          - mediumtext
-          - mediumblob
-          - longtext
-          - longblob
-          - enum
-          - set
-          - serial
-          - bit
-          - tinyint
-          - bool
-          - smallint
-          - mediumint
-          - int
-          - bigint
-          - float
-          - double
-          - decimal
-          - date
-          - datetime
-          - timestamp
-          - time
-          - year
-          example: varchar
-      required:
-      - database_id
-      - id
-      - internal_name
-      - name
-      - table_id
-      - type
-    UnitDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: ba1935e8-6817-488f-af0a-f54389af9000
-        uri:
-          type: string
-        name:
-          type: string
-        description:
-          type: string
-        columns:
-          type: array
-          items:
-            $ref: "#/components/schemas/ColumnBriefDto"
-      required:
-      - columns
-      - id
-      - uri
-    OntologyBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 7c491e40-082a-47b8-b82c-51d03c520466
-        uri:
-          type: string
-          example: http://www.wikidata.org/
-        prefix:
-          type: string
-          example: wd
-        sparql:
-          type: boolean
-          example: true
-        rdf:
-          type: boolean
-          example: false
-        uri_pattern:
-          type: string
-          example: http://www.wikidata.org/entity/.*
-      required:
-      - id
-      - prefix
-      - rdf
-      - sparql
-      - uri
-    EntityDto:
-      type: object
-      properties:
-        uri:
-          type: string
-          example: https://www.wikidata.org/entity/Q1686799
-        label:
-          type: string
-          example: Apache Jena
-        description:
-          type: string
-          example: open source semantic web framework for Java
-      required:
-      - label
-      - uri
-    OaiListIdentifiersParameters:
-      type: object
-      properties:
-        metadataPrefix:
-          type: string
-        from:
-          type: string
-        until:
-          type: string
-        set:
-          type: string
-        resumptionToken:
-          type: string
-        fromDate:
-          type: string
-          format: date-time
-        untilDate:
-          type: string
-          format: date-time
-        parametersString:
-          type: string
-    BannerMessageDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: ae3f795b-a3da-4ebe-bdc4-21a8ce631e6f
-        type:
-          type: string
-          enum:
-          - error
-          - warning
-          - info
-          example: WARNING
-        message:
-          type: string
-          example: Maintenance starts on 8am on Monday
-        link:
-          type: string
-          example: https://example.com
-        link_text:
-          type: string
-          example: More
-        display_start:
-          type: string
-          format: date-time
-          example: 2021-03-12T15:26:21Z
-        display_end:
-          type: string
-          format: date-time
-          example: 2021-03-12T15:26:21Z
-      required:
-      - id
-      - message
-      - type
-    ImageBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 816f55d5-1098-4f60-a4af-c8121c04dcce
-        name:
-          type: string
-          example: mariadb
-        version:
-          type: string
-          example: 10.5
-        default:
-          type: boolean
-          example: false
-      required:
-      - default
-      - id
-      - name
-      - version
-    LdCreatorDto:
-      type: object
-      properties:
-        name:
-          type: string
-        sameAs:
-          type: string
-        givenName:
-          type: string
-        familyName:
-          type: string
-        '@type':
-          type: string
-      required:
-      - '@type'
-      - name
-    LdDatasetDto:
-      type: object
-      properties:
-        name:
-          type: string
-        description:
-          type: string
-        url:
-          type: string
-        identifier:
-          type: array
-          items:
-            type: string
-        license:
-          type: string
-        creator:
-          type: array
-          items:
-            $ref: "#/components/schemas/LdCreatorDto"
-        citation:
-          type: string
-        hasPart:
-          type: array
-          items:
-            $ref: "#/components/schemas/LdDatasetDto"
-        temporalCoverage:
-          type: string
-        version:
-          type: string
-          format: date-time
-        '@context':
-          type: string
-        '@type':
-          type: string
-      required:
-      - '@context'
-      - '@type'
-      - citation
-      - creator
-      - description
-      - hasPart
-      - identifier
-      - name
-      - temporalCoverage
-      - url
-      - version
-    ViewColumnDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 6aec3a91-2e0b-4e92-a16a-9c3c5e892da1
-        name:
-          type: string
-          example: Given Name
-          maxLength: 64
-          minLength: 0
-        size:
-          type: integer
-          format: int64
-          example: 255
-        d:
-          type: integer
-          format: int64
-          example: 0
-        description:
-          type: string
-          example: Column comment
-          maxLength: 2048
-          minLength: 0
-        enums:
-          type: array
-          description: "enum values, only considered when type = ENUM"
-          items:
-            $ref: "#/components/schemas/EnumDto"
-        sets:
-          type: array
-          description: "enum values, only considered when type = ENUM"
-          items:
-            $ref: "#/components/schemas/SetDto"
-        database_id:
-          type: string
-          format: uuid
-          example: 2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4
-        ord:
-          type: integer
-          format: int32
-          example: 0
-        internal_name:
-          type: string
-          example: given_name
-          maxLength: 64
-          minLength: 0
-        index_length:
-          type: integer
-          format: int64
-          example: 255
-        length:
-          type: integer
-          format: int64
-          example: 255
-        type:
-          type: string
-          enum:
-          - char
-          - varchar
-          - binary
-          - varbinary
-          - tinyblob
-          - tinytext
-          - text
-          - blob
-          - mediumtext
-          - mediumblob
-          - longtext
-          - longblob
-          - enum
-          - set
-          - serial
-          - bit
-          - tinyint
-          - bool
-          - smallint
-          - mediumint
-          - int
-          - bigint
-          - float
-          - double
-          - decimal
-          - date
-          - datetime
-          - timestamp
-          - time
-          - year
-          example: varchar
-        is_null_allowed:
-          type: boolean
-          example: false
-      required:
-      - database_id
-      - id
-      - internal_name
-      - is_null_allowed
-      - name
-      - ord
-      - type
-    ViewDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 787439d0-e85e-400c-a7e6-996a023bfad9
-        name:
-          type: string
-          example: Air Quality
-        identifiers:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierDto"
-        query:
-          type: string
-          example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC
-        owner:
-          $ref: "#/components/schemas/UserBriefDto"
-        columns:
-          type: array
-          items:
-            $ref: "#/components/schemas/ViewColumnDto"
-        created:
-          type: string
-          format: date-time
-          example: 2022-01-01 08:00:00.000
-        last_retrieved:
-          type: string
-          format: date-time
-          example: 2025-01-23T12:09:01
-        database_id:
-          type: string
-          format: uuid
-          example: fc29f89c-86a8-4020-9e36-4d954736c6cc
-        internal_name:
-          type: string
-          example: air_quality
-        is_public:
-          type: boolean
-          example: true
-        is_schema_public:
-          type: boolean
-          example: true
-        initial_view:
-          type: boolean
-          description: True if it is the default view for the database
-          example: true
-        query_hash:
-          type: string
-          example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916
-      required:
-      - columns
-      - created
-      - database_id
-      - id
-      - identifiers
-      - internal_name
-      - name
-      - owner
-      - query
-      - query_hash
-    ConstraintsDto:
-      type: object
-      properties:
-        uniques:
-          type: array
-          items:
-            $ref: "#/components/schemas/UniqueDto"
-        checks:
-          type: array
-          example:
-          - value > 1
-          items:
-            type: string
-          uniqueItems: true
-        foreign_keys:
-          type: array
-          items:
-            $ref: "#/components/schemas/ForeignKeyDto"
-        primary_key:
-          type: array
-          items:
-            $ref: "#/components/schemas/PrimaryKeyDto"
-          uniqueItems: true
-    ForeignKeyBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: f2b740ec-0b13-4d07-88a9-529d354bba6a
-    ForeignKeyDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: f2b740ec-0b13-4d07-88a9-529d354bba6a
-        name:
-          type: string
-          example: fk_name
-        references:
-          type: array
-          items:
-            $ref: "#/components/schemas/ForeignKeyReferenceDto"
-        table:
-          $ref: "#/components/schemas/TableBriefDto"
-        referenced_table:
-          $ref: "#/components/schemas/TableBriefDto"
-        on_update:
-          type: string
-          enum:
-          - restrict
-          - cascade
-          - set_null
-          - no_action
-          - set_default
-          example: restrict
-        on_delete:
-          type: string
-          enum:
-          - restrict
-          - cascade
-          - set_null
-          - no_action
-          - set_default
-          example: restrict
-      required:
-      - name
-      - referenced_table
-      - references
-      - table
-    ForeignKeyReferenceDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: f2b740ec-0b13-4d07-88a9-529d354bba6a
-        column:
-          $ref: "#/components/schemas/ColumnBriefDto"
-        foreign_key:
-          $ref: "#/components/schemas/ForeignKeyBriefDto"
-        referenced_column:
-          $ref: "#/components/schemas/ColumnBriefDto"
-      required:
-      - column
-      - foreign_key
-      - referenced_column
-    PrimaryKeyDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: d984f9d7-e8a7-4b81-b59a-862db1871f18
-        table:
-          $ref: "#/components/schemas/TableBriefDto"
-        column:
-          $ref: "#/components/schemas/ColumnBriefDto"
-      required:
-      - column
-      - table
-    TableDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: d346f844-b84c-490f-9aec-725a2dc8f820
-        name:
-          type: string
-          example: Air Quality
-        alias:
-          type: string
-          example: a
-        identifiers:
-          type: array
-          items:
-            $ref: "#/components/schemas/IdentifierDto"
-        owner:
-          $ref: "#/components/schemas/UserBriefDto"
-        description:
-          type: string
-          example: Air Quality in Austria
-          maxLength: 2048
-          minLength: 0
-        columns:
-          type: array
-          items:
-            $ref: "#/components/schemas/ColumnDto"
-        constraints:
-          $ref: "#/components/schemas/ConstraintsDto"
-        created:
-          type: string
-          format: date-time
-          example: 2022-01-01 08:00:00.000
-        last_retrieved:
-          type: string
-          format: date-time
-          example: 2025-01-23T12:09:01
-        database_id:
-          type: string
-          format: uuid
-          example: fc29f89c-86a8-4020-9e36-4d954736c6cc
-        internal_name:
-          type: string
-          example: air_quality
-        is_versioned:
-          type: boolean
-          example: true
-        is_schema_public:
-          type: boolean
-          example: true
-        queue_name:
-          type: string
-          example: air_quality
-        queue_type:
-          type: string
-          example: quorum
-        routing_key:
-          type: string
-          example: dbrepo.1.2
-        is_public:
-          type: boolean
-          example: true
-        num_rows:
-          type: integer
-          format: int64
-          example: 5
-        data_length:
-          type: integer
-          format: int64
-          description: in bytes
-          example: 16384
-        max_data_length:
-          type: integer
-          format: int64
-          description: in bytes
-          example: 0
-        avg_row_length:
-          type: integer
-          format: int64
-          description: in bytes
-          example: 3276
-      required:
-      - columns
-      - constraints
-      - created
-      - database_id
-      - id
-      - internal_name
-      - is_public
-      - is_schema_public
-      - is_versioned
-      - name
-      - owner
-      - queue_name
-      - routing_key
-    UniqueDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: d984f9d7-e8a7-4b81-b59a-862db1871f13
-        name:
-          type: string
-          example: uk_name
-        table:
-          $ref: "#/components/schemas/TableBriefDto"
-        columns:
-          type: array
-          items:
-            $ref: "#/components/schemas/ColumnBriefDto"
-      required:
-      - columns
-      - id
-      - name
-      - table
-    TableColumnEntityDto:
-      type: object
-      properties:
-        uri:
-          type: string
-          example: https://www.wikidata.org/entity/Q1686799
-        label:
-          type: string
-          example: Apache Jena
-        description:
-          type: string
-          example: open source semantic web framework for Java
-        database_id:
-          type: string
-          format: uuid
-          example: 475b4107-a64d-4495-a7ef-3cb0dadd4804
-        table_id:
-          type: string
-          format: uuid
-          example: 9a9208af-90ea-4382-9a11-0c8f6d89bd1f
-        column_id:
-          type: string
-          format: uuid
-          example: 297860e3-3b29-451c-ae8a-a85ed5941018
-      required:
-      - column_id
-      - database_id
-      - table_id
-      - uri
-    ContainerBriefDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 7ddb7e87-b965-43a2-9a24-4fa406d998f4
-        hash:
-          type: string
-          example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50
-        name:
-          type: string
-          example: Air Quality
-        image:
-          $ref: "#/components/schemas/ImageBriefDto"
-        quota:
-          type: integer
-          format: int32
-          example: 50
-        count:
-          type: integer
-          format: int32
-          example: 10
-        internal_name:
-          type: string
-          example: air-quality
-      required:
-      - count
-      - hash
-      - id
-      - image
-      - internal_name
-      - name
-      - quota
-    ConceptDto:
-      type: object
-      properties:
-        id:
-          type: string
-          format: uuid
-          example: 8cabc011-4bdf-44d4-9d33-b2648e2ddbf1
-        uri:
-          type: string
-        name:
-          type: string
-        description:
-          type: string
-        columns:
-          type: array
-          items:
-            $ref: "#/components/schemas/ColumnBriefDto"
-      required:
-      - columns
-      - id
-      - uri
-  securitySchemes:
-    basicAuth:
-      type: http
-      scheme: basic
-    bearerAuth:
-      type: http
-      scheme: bearer
-      bearerFormat: JWT
diff --git a/.docs/.openapi/api-search.yaml b/.docs/.openapi/api-search-service.yaml
similarity index 100%
rename from .docs/.openapi/api-search.yaml
rename to .docs/.openapi/api-search-service.yaml
diff --git a/.docs/.openapi/api.yaml b/.docs/.openapi/api.yaml
index d5b14455ae8692a19d0f4355a014546eac11ce0b..e93b918845001cec1c4d769e76ad50235544d8a4 100644
--- a/.docs/.openapi/api.yaml
+++ b/.docs/.openapi/api.yaml
@@ -1193,8 +1193,8 @@ paths:
                 $ref: '#/components/schemas/ApiErrorDto'
         '404':
           description: >-
-            Failed to find database in metadata database or query in query store
-            of the data database
+            Failed to find database or user in metadata database or query in
+            query store of the data database
           content:
             application/json:
               schema:
@@ -5252,7 +5252,7 @@ components:
         execution:
           type: string
           format: date-time
-          example: '2021-03-12T15:26:21.000Z'
+          example: '2021-03-12T15:26:21Z'
         query:
           type: string
           example: SELECT `id` FROM `air_quality`
@@ -5430,7 +5430,7 @@ components:
         execution:
           type: string
           format: date-time
-          example: '2021-03-12T15:26:21.000Z'
+          example: '2021-03-12T15:26:21Z'
         doi:
           type: string
           example: 10.1038/nphys1170
@@ -5991,11 +5991,11 @@ components:
         created:
           type: string
           format: date-time
-          example: '2022-01-01T08:00:00.000Z'
+          example: '2022-01-01 08:00:00.000'
         last_retrieved:
           type: string
           format: date-time
-          example: '2025-01-23T12:09:01.000Z'
+          example: '2025-01-23T12:09:01'
         database_id:
           type: string
           format: uuid
@@ -6088,7 +6088,6 @@ components:
         - column_id
         - operator_id
         - type
-        - value
     OrderDto:
       type: object
       properties:
@@ -6141,7 +6140,7 @@ components:
         timestamp:
           type: string
           format: date-time
-          example: '2021-03-12T15:26:21.000Z'
+          example: '2021-03-12T15:26:21Z'
         event:
           type: string
           enum:
@@ -6206,7 +6205,7 @@ components:
         last_retrieved:
           type: string
           format: date-time
-          example: '2025-01-23T12:09:01.000Z'
+          example: '2025-01-23T12:09:01'
         qualified_name:
           type: string
           example: Josiah Carberry — @jcarberry
@@ -6376,11 +6375,11 @@ components:
         display_start:
           type: string
           format: date-time
-          example: '2021-03-12T15:26:21.000Z'
+          example: '2021-03-12T15:26:21Z'
         display_end:
           type: string
           format: date-time
-          example: '2021-03-12T15:26:21.000Z'
+          example: '2021-03-12T15:26:21Z'
       required:
         - message
         - type
@@ -7778,11 +7777,11 @@ components:
         display_start:
           type: string
           format: date-time
-          example: '2021-03-12T15:26:21.000Z'
+          example: '2021-03-12T15:26:21Z'
         display_end:
           type: string
           format: date-time
-          example: '2021-03-12T15:26:21.000Z'
+          example: '2021-03-12T15:26:21Z'
       required:
         - message
         - type
@@ -8376,7 +8375,7 @@ components:
         last_retrieved:
           type: string
           format: date-time
-          example: '2025-01-23T12:09:01.000Z'
+          example: '2025-01-23T12:09:01'
         internal_name:
           type: string
           example: air_quality
@@ -8532,14 +8531,14 @@ components:
           type: string
         resumptionToken:
           type: string
+        parametersString:
+          type: string
         fromDate:
           type: string
           format: date-time
         untilDate:
           type: string
           format: date-time
-        parametersString:
-          type: string
     BannerMessageDto:
       type: object
       properties:
@@ -8566,11 +8565,11 @@ components:
         display_start:
           type: string
           format: date-time
-          example: '2021-03-12T15:26:21.000Z'
+          example: '2021-03-12T15:26:21Z'
         display_end:
           type: string
           format: date-time
-          example: '2021-03-12T15:26:21.000Z'
+          example: '2021-03-12T15:26:21Z'
       required:
         - id
         - message
@@ -8793,11 +8792,11 @@ components:
         created:
           type: string
           format: date-time
-          example: '2022-01-01T08:00:00.000Z'
+          example: '2022-01-01 08:00:00.000'
         last_retrieved:
           type: string
           format: date-time
-          example: '2025-01-23T12:09:01.000Z'
+          example: '2025-01-23T12:09:01'
         database_id:
           type: string
           format: uuid
diff --git a/.docs/.openapi/openapi-generate.sh b/.docs/.openapi/openapi-generate.sh
index aeab907799cf93e130b1a0596cdca7e68c34116d..4ed8d11c8fbd8c2049e377b5c27b4010fba3d00f 100644
--- a/.docs/.openapi/openapi-generate.sh
+++ b/.docs/.openapi/openapi-generate.sh
@@ -1,24 +1,51 @@
 #!/bin/bash
-declare -A services
-services[4050]=analyse
-services[4060]=search
-services[4070]=dashboard
-services[9093]=data
-services[9099]=metadata
+ENDPOINTS="analyse-service:8080,search-service:8080,dashboard-service:8080,data-service:8080,metadata-service:8080"
 
 # requires https://github.com/mikefarah/yq/ -> v4.44.3
 
+function ip () {
+  HOSTNAME=$(hostname $1)
+  IP=$(docker inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" "dbrepo-$HOSTNAME")
+  echo $IP
+}
+
 function retrieve () {
-  if [[ "$2" == analyse ]] || [[ "$2" == search ]] || [[ "$2" == dashboard ]]; then
-    echo "... retrieve json api from localhost:$1"
-    curl -sSL "http://localhost:$1/api-$2.json" | yq -o=json - > "./.docs/.openapi/api-$2.yaml"
+  IP=$(ip $1)
+  if [[ $IP == "" ]]; then
+    echo "FATAL: failed to find ip for endpoint: $1"
+    exit 1
+  fi
+  URL=$(url $1)
+  HOSTNAME=$(hostname $1)
+  echo "... retrieve json api from URL: $URL"
+  touch "./.docs/.openapi/api-$HOSTNAME.yaml"
+  curl -sSL $URL | yq -o=json - > "./.docs/.openapi/api-$HOSTNAME.yaml"
+}
+
+function url () {
+  HOSTNAME=$(hostname $1)
+  PORT=$(port $1)
+  if [[ "$HOSTNAME" == "analyse-service" ]] || [[ "$HOSTNAME" == "search-service" ]] || [[ "$HOSTNAME" == "dashboard-service" ]]; then
+    echo "http://$IP:$PORT/api-docs.json"
   else
-    echo "... retrieve yaml api from localhost:$1"
-    curl -sSL "http://localhost:$1/v3/api-docs.yaml" > "./.docs/.openapi/api-$2.yaml"
+    echo "http://$IP:$PORT/v3/api-docs.yaml"
   fi
 }
 
-for key in "${!services[@]}"; do
-  echo "Generating ${services[$key]} API"
-  retrieve "$key" "${services[$key]}"
-done
+function hostname () {
+  IN="$1"
+  arrIN=(${IN//:/ })
+  echo ${arrIN[0]}
+}
+
+function port () {
+  IN="$1"
+  arrIN=(${IN//:/ })
+  echo ${arrIN[1]}
+}
+
+IFS=',' read -ra ARR <<< "$ENDPOINTS"
+for ENDPOINT in "${ARR[@]}"; do
+  echo "Request OpenAPI definition for endpoint: $ENDPOINT"
+  retrieve $ENDPOINT
+done
\ No newline at end of file
diff --git a/.docs/.openapi/openapi-merge.json b/.docs/.openapi/openapi-merge.json
index 6e41b75f580bb4e49a068f30665436632fca5acb..32dd1991c6dcf0d6229b6659028ef32f37154cb3 100644
--- a/.docs/.openapi/openapi-merge.json
+++ b/.docs/.openapi/openapi-merge.json
@@ -4,16 +4,16 @@
       "inputFile": "./api.base.yaml"
     },
     {
-      "inputFile": "./api-analyse.yaml"
+      "inputFile": "./api-analyse-service.yaml"
     },
     {
-      "inputFile": "./api-data.yaml"
+      "inputFile": "./api-data-service.yaml"
     },
     {
-      "inputFile": "./api-metadata.yaml"
+      "inputFile": "./api-metadata-service.yaml"
     },
     {
-      "inputFile": "./api-search.yaml"
+      "inputFile": "./api-search-service.yaml"
     }
   ],
   "output": "./api.yaml"
diff --git a/.docs/api/analyse-service.md b/.docs/api/analyse-service.md
index 0b8bf886f35dc19f3d3d1e1c7ada59e30a929975..ebb7ee3ed9b6a40ac6a629d9c40f99b5393f939a 100644
--- a/.docs/api/analyse-service.md
+++ b/.docs/api/analyse-service.md
@@ -6,7 +6,7 @@ author: Martin Weise
 
 !!! debug "Debug Information"
 
-    Image: [`registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.8.1`](https://hub.docker.com/r/dbrepo/analyse-service)
+    Image: [`registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.8.2`](https://hub.docker.com/r/dbrepo/analyse-service)
 
     * Ports: 5000/tcp
     * Prometheus: `http://<hostname>:5000/metrics`
diff --git a/.docs/api/data-service.md b/.docs/api/data-service.md
index 50193a54e6b35a2034b8367d4be7d89150f49161..0a09406d806b1540408944c9d3d087fb9a59ba5a 100644
--- a/.docs/api/data-service.md
+++ b/.docs/api/data-service.md
@@ -6,7 +6,7 @@ author: Martin Weise
 
 !!! debug "Debug Information"
 
-    Image: [`registry.datalab.tuwien.ac.at/dbrepo/data-service:1.8.1`](https://hub.docker.com/r/dbrepo/data-service)
+    Image: [`registry.datalab.tuwien.ac.at/dbrepo/data-service:1.8.2`](https://hub.docker.com/r/dbrepo/data-service)
 
     * Ports: 9093/tcp
     * Info: `http://<hostname>:9093/actuator/info`
diff --git a/.docs/api/metadata-service.md b/.docs/api/metadata-service.md
index 435ef9cdd1dba538e8e3593224a620d22ae17c89..c040eeb3b24b07c5a3351d26aedd75d1dbbcd507 100644
--- a/.docs/api/metadata-service.md
+++ b/.docs/api/metadata-service.md
@@ -6,7 +6,7 @@ author: Martin Weise
 
 !!! debug "Debug Information"
 
-    Image: [`registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.8.1`](https://hub.docker.com/r/dbrepo/metadata-service)
+    Image: [`registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.8.2`](https://hub.docker.com/r/dbrepo/metadata-service)
 
     * Ports: 9099/tcp
     * Info: `http://<hostname>:9099/actuator/info`
diff --git a/.docs/api/search-service.md b/.docs/api/search-service.md
index 22cf6e71b520c02cedb4051d959c9c972a396854..1745cf55182aa598b4c262b3f2e73deb392baf24 100644
--- a/.docs/api/search-service.md
+++ b/.docs/api/search-service.md
@@ -6,7 +6,7 @@ author: Martin Weise
 
 !!! debug "Debug Information"
 
-    Image: [`registry.datalab.tuwien.ac.at/dbrepo/search-service:1.8.1`](https://hub.docker.com/r/dbrepo/search-service)
+    Image: [`registry.datalab.tuwien.ac.at/dbrepo/search-service:1.8.2`](https://hub.docker.com/r/dbrepo/search-service)
 
     * Ports: 4000/tcp
     * Health: `http://<hostname>:4000/api/search/health`
diff --git a/.docs/api/ui.md b/.docs/api/ui.md
index ddc8b9d88331c4d41be690651a079bbff105d672..fab9e54324b5ee5ac72c07c4a3b30f2f14e6093a 100644
--- a/.docs/api/ui.md
+++ b/.docs/api/ui.md
@@ -6,7 +6,7 @@ author: Martin Weise
 
 !!! debug "Debug Information"
 
-    Image: [`registry.datalab.tuwien.ac.at/dbrepo/ui:1.8.1`](https://hub.docker.com/r/dbrepo/ui)
+    Image: [`registry.datalab.tuwien.ac.at/dbrepo/ui:1.8.2`](https://hub.docker.com/r/dbrepo/ui)
 
     * Ports: 3000/tcp
 
diff --git a/.docs/changelog.md b/.docs/changelog.md
index ae8129067fa5843e7fc5536b03291f503cce6d1d..f8f8a0038f0e6f48e742c473db894d68bf34d03c 100644
--- a/.docs/changelog.md
+++ b/.docs/changelog.md
@@ -2,7 +2,11 @@
 author: Martin Weise
 ---
 
-## v1.8.2 (2025-04-??)
+## v1.8.2 (2025-04-23)
+
+#### Fixes
+
+* Fixed a bug in the UI where the resource status was displayed as identifier when a draft identifier has been created.
 
 #### Features
 
diff --git a/.docs/concepts/logging.md b/.docs/concepts/logging.md
new file mode 100644
index 0000000000000000000000000000000000000000..b13328c18a36aa549d3c6afc6a235cbc267b28dc
--- /dev/null
+++ b/.docs/concepts/logging.md
@@ -0,0 +1,37 @@
+---
+author: Martin Weise
+---
+
+:octicons-tag-16:{ title="Minimum version" } 1.8.2
+
+DBRepo uses the lightweight open-source logging framework [fluentbit](https://fluentbit.io) to collect, parse and
+forward logs to the [Search Database](../../api/search-db).
+
+!!! info "Only available in the Kubernetes deployment"
+
+## Collection
+
+Logs are collected with a sidecar in each pod. They are collected with the `tail` plugin from the log files. 
+For the Data-, Metadata-, Analyse-, Dashboard- and Search Services, the application log is located in
+`/var/log/app/service/<name>/app.log` (e.g. `/var/log/app/service/search/app.log` for the Search Service).
+
+## Parse
+
+The logs are parsed directly in the config file of the sidecar. The config file is always located in 
+`/opt/bitnami/fluent-bit/conf/parsers.conf` and contains the parsing regex. By default, the pre-defined `docker`
+parser is used that performs lightweight parsing by just parsing the logs as JSON.
+
+## Storage
+
+After parsing, the logs are sent to the [Search Database](../../api/search-db) where they are stored as documents in
+the index `logging`.
+
+## Insights
+
+The logs can be inspected in the operational dashboard in `https://<hostname>/dashboard/d/aejhojr0mrpj4c` to gain
+insight on potential errors.
+
+<figure markdown>
+![Grafana dashboard showing log frequency and detail](../images/screenshots/dashboard_ops-logs.png)
+<figcaption>Figure 1: Operational Dashboard for Logging</figcaption>
+</figure>
diff --git a/.docs/images/screenshots/dashboard_ops-logs.png b/.docs/images/screenshots/dashboard_ops-logs.png
new file mode 100644
index 0000000000000000000000000000000000000000..806aba0b56db410f1691b69039f4328b155868c7
Binary files /dev/null and b/.docs/images/screenshots/dashboard_ops-logs.png differ
diff --git a/.env b/.env
index 7c9b6e1b99cba36d3523561ec5c9fe567935d80c..821b16a5c08b6577f7aa1728baded9960c24b311 100644
--- a/.env
+++ b/.env
@@ -1,11 +1,13 @@
 APP_VERSION=1.8
+FLUENTBIT_VERSION=4.0.0
+GRAFANA_VERSION=11.4.0
 MARIADB_VERSION=11.3.2
-POSTGRES_VERSION=17.0.0
-KEYCLOAK_VERSION=26.2.2
-RABBITMQ_VERSION=3.13.7
-OPENSEARCH_VERSION=2.10.0
-NGINX_VERSION=1.27.3-alpine3.20-slim
+KEYCLOAK_VERSION=26.2.4
+MYSQLD_EXPORTER_VERSION=0.15.1
+NGINX_VERSION=1.28.0
 OPENLDAP_VERSION=2.6.8
-SEAWEEDFS_VERSION=3.71.0
+OPENSEARCH_VERSION=2.18.0
+POSTGRES_VERSION=17.0.0
 PROMETHEUS_VERSION=2.54.1
-MYSQLD_EXPORTER_VERSION=0.15.1
+RABBITMQ_VERSION=3.13.1
+SEAWEEDFS_VERSION=3.87.0
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6e793575f48d5bfce78962438b5fa822bdeea0fc..dd4b98d03a435025f3df88b1c58f002b884704c7 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -70,10 +70,12 @@ lint-docker-compose:
     - "IGNORE_IMAGE=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-broker-service'"
     - "IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-dashboard-service'"
     - "bash .scripts/check-service.sh 'dbrepo-data-db'"
+    - "IGNORE_VOLUMES=1 bash .scripts/check-service.sh 'dbrepo-data-db-metrics'"
     - "IGNORE_IMAGE=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-data-service'"
     - "IGNORE_VOLUMES=1 bash .scripts/check-service.sh 'dbrepo-gateway-service'"
     - "IGNORE_VOLUMES=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-identity-service'"
     - "IGNORE_VOLUMES=1 bash .scripts/check-service.sh 'dbrepo-metadata-db'"
+    - "IGNORE_VOLUMES=1 bash .scripts/check-service.sh 'dbrepo-metadata-db-metrics'"
     - "IGNORE_IMAGE=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-metadata-service'"
     - "IGNORE_VOLUMES=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-metric-db'"
     - "bash .scripts/check-service.sh 'dbrepo-search-db'"
@@ -351,14 +353,17 @@ test-analyse-service:
     - build-analyse-service
   dependencies:
     - build-analyse-service
-  script:
+  before_script:
     - "pip install pipenv"
     - "pipenv install gunicorn && pipenv install --dev --system --deploy"
+    - "mkdir -p /var/log/app/service/analyse"
+  script:
     - cd ./dbrepo-analyse-service/ && coverage run --rcfile=.coveragerc -m pytest tests/test_determine_dt.py tests/test_determine_pk.py && coverage html && coverage xml && coverage report > ./coverage.txt
     - "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'"
   artifacts:
     when: always
     paths:
+      - /var/log/app/service/analyse/app.log
       - ./dbrepo-analyse-service/coverage.xml
       - ./dbrepo-analyse-service/coverage.txt
     expire_in: 1 days
@@ -403,14 +408,17 @@ test-search-service:
     - build-search-service
   dependencies:
     - build-search-service
-  script:
+  before_script:
     - "pip install pipenv"
     - "pipenv install gunicorn && pipenv install --dev --system --deploy"
+    - "mkdir -p /var/log/app/service/search"
+  script:
     - cd ./dbrepo-search-service/ && coverage run --rcfile=.coveragerc -m pytest tests/test_app.py && coverage html && coverage xml && coverage report > ./coverage.txt
     - "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'"
   artifacts:
     when: always
     paths:
+      - /var/log/app/service/search/app.log
       - ./dbrepo-search-service/coverage.xml
       - ./dbrepo-search-service/coverage.txt
     expire_in: 1 days
@@ -430,14 +438,17 @@ test-dashboard-service:
     - build-dashboard-service
   dependencies:
     - build-dashboard-service
-  script:
+  before_script:
     - "pip install pipenv"
     - "pipenv install gunicorn && pipenv install --dev --system --deploy"
+    - "mkdir -p /var/log/app/service/dashboard"
+  script:
     - cd ./dbrepo-dashboard-service/ && coverage run --rcfile=.coveragerc -m pytest tests/test_integration_app.py && coverage html && coverage xml && coverage report > ./coverage.txt
     - "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'"
   artifacts:
     when: always
     paths:
+      - /var/log/app/service/dashboard/app.log
       - ./dbrepo-dashboard-service/coverage.xml
       - ./dbrepo-dashboard-service/coverage.txt
     expire_in: 1 days
diff --git a/dbrepo-analyse-service/Dockerfile b/dbrepo-analyse-service/Dockerfile
index df313ec934c825ab20b71da9a29f6e3f272a3462..7799c7ddb68ea17a5d2cae3d5237c54941937cd5 100644
--- a/dbrepo-analyse-service/Dockerfile
+++ b/dbrepo-analyse-service/Dockerfile
@@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001
 
 WORKDIR /app
 
+RUN mkdir -p /var/log/app/service/analyse && \
+    chown -R 1001:1001 /var/log/app
+
 USER 1001
 
 COPY --chown=1001 ./api ./api
diff --git a/dbrepo-analyse-service/Pipfile b/dbrepo-analyse-service/Pipfile
index 509b932e0a94a074b1d812f92bc0e9ddd4385e06..21f4b613607a25406e35374ec926623732a6d598 100644
--- a/dbrepo-analyse-service/Pipfile
+++ b/dbrepo-analyse-service/Pipfile
@@ -21,7 +21,7 @@ numpy = "*"
 pandas = "*"
 minio = "*"
 pydantic = "*"
-dbrepo = {path = "./lib/dbrepo-1.8.2rc6.tar.gz"}
+dbrepo = {path = "./lib/dbrepo-1.8.2.tar.gz"}
 opensearch-py = "*"
 
 [dev-packages]
diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock
index 293162dbd409b9e9d64b5a501e09c6b61a802c94..f4ad8a2bbe8c2a7036f6d394b9dbb5d806d927e7 100644
--- a/dbrepo-analyse-service/Pipfile.lock
+++ b/dbrepo-analyse-service/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "af3486e267dc0276768390a0ffde39ae9f3e43af09218a6a7981fbf9a9e63b7c"
+            "sha256": "348b4dab04b3c38faa04d0f821ac6e3fb0005b7a042a8475ec39f673027c48ce"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -16,109 +16,6 @@
         ]
     },
     "default": {
-        "aiohappyeyeballs": {
-            "hashes": [
-                "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558",
-                "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==2.6.1"
-        },
-        "aiohttp": {
-            "hashes": [
-                "sha256:0700055a6e05c2f4711011a44364020d7a10fbbcd02fbf3e30e8f7e7fddc8717",
-                "sha256:0a8d8f20c39d3fa84d1c28cdb97f3111387e48209e224408e75f29c6f8e0861d",
-                "sha256:0e2a92101efb9f4c2942252c69c63ddb26d20f46f540c239ccfa5af865197bb8",
-                "sha256:0f421843b0f70740772228b9e8093289924359d306530bcd3926f39acbe1adda",
-                "sha256:106032eaf9e62fd6bc6578c8b9e6dc4f5ed9a5c1c7fb2231010a1b4304393421",
-                "sha256:11d5391946605f445ddafda5eab11caf310f90cdda1fd99865564e3164f5cff9",
-                "sha256:122f3e739f6607e5e4c6a2f8562a6f476192a682a52bda8b4c6d4254e1138f4d",
-                "sha256:12a62691eb5aac58d65200c7ae94d73e8a65c331c3a86a2e9670927e94339ee8",
-                "sha256:13cd38515568ae230e1ef6919e2e33da5d0f46862943fcda74e7e915096815f3",
-                "sha256:1596ebf17e42e293cbacc7a24c3e0dc0f8f755b40aff0402cb74c1ff6baec1d3",
-                "sha256:25557982dd36b9e32c0a3357f30804e80790ec2c4d20ac6bcc598533e04c6361",
-                "sha256:28c3f975e5ae3dbcbe95b7e3dcd30e51da561a0a0f2cfbcdea30fc1308d72137",
-                "sha256:2c828b6d23b984255b85b9b04a5b963a74278b7356a7de84fda5e3b76866597b",
-                "sha256:2d9f6c0152f8d71361905aaf9ed979259537981f47ad099c8b3d81e0319814bd",
-                "sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8",
-                "sha256:3849ead845e8444f7331c284132ab314b4dac43bfae1e3cf350906d4fff4620f",
-                "sha256:3a621d85e85dccabd700294494d7179ed1590b6d07a35709bb9bd608c7f5dd1d",
-                "sha256:3b8d2b42073611c860a37f718b3d61ae8b4c2b124b2e776e2c10619d920350ec",
-                "sha256:3cc314245deb311364884e44242e00c18b5896e4fe6d5f942e7ad7e4cb640adb",
-                "sha256:3cec21dd68924179258ae14af9f5418c1ebdbba60b98c667815891293902e5e0",
-                "sha256:3d518ce32179f7e2096bf4e3e8438cf445f05fedd597f252de9f54c728574756",
-                "sha256:40fbf91f6a0ac317c0a07eb328a1384941872f6761f2e6f7208b63c4cc0a7ff6",
-                "sha256:427fdc56ccb6901ff8088544bde47084845ea81591deb16f957897f0f0ba1be9",
-                "sha256:44ff5625413fec55216da5eaa011cf6b0a2ed67a565914a212a51aa3755b0009",
-                "sha256:46533e6792e1410f9801d09fd40cbbff3f3518d1b501d6c3c5b218f427f6ff08",
-                "sha256:469ac32375d9a716da49817cd26f1916ec787fc82b151c1c832f58420e6d3533",
-                "sha256:474215ec618974054cf5dc465497ae9708543cbfc312c65212325d4212525811",
-                "sha256:5199be2a2f01ffdfa8c3a6f5981205242986b9e63eb8ae03fd18f736e4840721",
-                "sha256:540b8a1f3a424f1af63e0af2d2853a759242a1769f9f1ab053996a392bd70118",
-                "sha256:554c918ec43f8480b47a5ca758e10e793bd7410b83701676a4782672d670da55",
-                "sha256:5691dc38750fcb96a33ceef89642f139aa315c8a193bbd42a0c33476fd4a1609",
-                "sha256:5bc0ae0a5e9939e423e065a3e5b00b24b8379f1db46046d7ab71753dfc7dd0e1",
-                "sha256:5c2eaa145bb36b33af1ff2860820ba0589e165be4ab63a49aebfd0981c173b66",
-                "sha256:5d61df4a05476ff891cff0030329fee4088d40e4dc9b013fac01bc3c745542c2",
-                "sha256:5e7007b8d1d09bce37b54111f593d173691c530b80f27c6493b928dabed9e6ef",
-                "sha256:5e8452ad6b2863709f8b3d615955aa0807bc093c34b8e25b3b52097fe421cb7f",
-                "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2",
-                "sha256:6ced70adf03920d4e67c373fd692123e34d3ac81dfa1c27e45904a628567d804",
-                "sha256:73b8870fe1c9a201b8c0d12c94fe781b918664766728783241a79e0468427e4f",
-                "sha256:767a97e6900edd11c762be96d82d13a1d7c4fc4b329f054e88b57cdc21fded94",
-                "sha256:7ccec9e72660b10f8e283e91aa0295975c7bd85c204011d9f5eb69310555cf30",
-                "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e",
-                "sha256:7e889c9df381a2433802991288a61e5a19ceb4f61bd14f5c9fa165655dcb1fd1",
-                "sha256:7f33a92a2fde08e8c6b0c61815521324fc1612f397abf96eed86b8e31618fdb4",
-                "sha256:8a4076a2b3ba5b004b8cffca6afe18a3b2c5c9ef679b4d1e9859cf76295f8d4f",
-                "sha256:8bd1cde83e4684324e6ee19adfc25fd649d04078179890be7b29f76b501de8e4",
-                "sha256:8e57da93e24303a883146510a434f0faf2f1e7e659f3041abc4e3fb3f6702a9f",
-                "sha256:9602044ff047043430452bc3a2089743fa85da829e6fc9ee0025351d66c332b6",
-                "sha256:96264854fedbea933a9ca4b7e0c745728f01380691687b7365d18d9e977179c4",
-                "sha256:9c23fd8d08eb9c2af3faeedc8c56e134acdaf36e2117ee059d7defa655130e5f",
-                "sha256:9d4df95ad522c53f2b9ebc07f12ccd2cb15550941e11a5bbc5ddca2ca56316d7",
-                "sha256:9ea345fda05bae217b6cce2acf3682ce3b13d0d16dd47d0de7080e5e21362421",
-                "sha256:9f26545b9940c4b46f0a9388fd04ee3ad7064c4017b5a334dd450f616396590e",
-                "sha256:a2fd04ae4971b914e54fe459dd7edbbd3f2ba875d69e057d5e3c8e8cac094935",
-                "sha256:a35197013ed929c0aed5c9096de1fc5a9d336914d73ab3f9df14741668c0616c",
-                "sha256:ab2ef72f8605046115bc9aa8e9d14fd49086d405855f40b79ed9e5c1f9f4faea",
-                "sha256:ad2f41203e2808616292db5d7170cccf0c9f9c982d02544443c7eb0296e8b0c7",
-                "sha256:ad8c745ff9460a16b710e58e06a9dec11ebc0d8f4dd82091cefb579844d69868",
-                "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a",
-                "sha256:b2f317d1678002eee6fe85670039fb34a757972284614638f82b903a03feacdc",
-                "sha256:b426495fb9140e75719b3ae70a5e8dd3a79def0ae3c6c27e012fc59f16544a4a",
-                "sha256:b491e42183e8fcc9901d8dcd8ae644ff785590f1727f76ca86e731c61bfe6643",
-                "sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01",
-                "sha256:c1b90407ced992331dd6d4f1355819ea1c274cc1ee4d5b7046c6761f9ec11829",
-                "sha256:c28875e316c7b4c3e745172d882d8a5c835b11018e33432d281211af35794a93",
-                "sha256:cc93a4121d87d9f12739fc8fab0a95f78444e571ed63e40bfc78cd5abe700ac9",
-                "sha256:cdd1bbaf1e61f0d94aced116d6e95fe25942f7a5f42382195fd9501089db5d78",
-                "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508",
-                "sha256:d9e6b0e519067caa4fd7fb72e3e8002d16a68e84e62e7291092a5433763dc0dd",
-                "sha256:e220e7562467dc8d589e31c1acd13438d82c03d7f385c9cd41a3f6d1d15807c1",
-                "sha256:e6d3e32b8753c8d45ac550b11a1090dd66d110d4ef805ffe60fa61495360b3b2",
-                "sha256:e6f3c0a3a1e73e88af384b2e8a0b9f4fb73245afd47589df2afcab6b638fa0e6",
-                "sha256:ea4cf2488156e0f281f93cc2fd365025efcba3e2d217cbe3df2840f8c73db261",
-                "sha256:eab7b040a8a873020113ba814b7db7fa935235e4cbaf8f3da17671baa1024863",
-                "sha256:f0ddc9337a0fb0e727785ad4f41163cc314376e82b31846d3835673786420ef1",
-                "sha256:f2c50bad73ed629cc326cc0f75aed8ecfb013f88c5af116f33df556ed47143eb",
-                "sha256:f414f37b244f2a97e79b98d48c5ff0789a0b4b4609b17d64fa81771ad780e415",
-                "sha256:f8af2ef3b4b652ff109f98087242e2ab974b2b2b496304063585e3d78de0b000",
-                "sha256:f9e6710ebebfce2ba21cee6d91e7452d1125100f41b906fb5af3da8c78b764c1",
-                "sha256:fdb239f47328581e2ec7744ab5911f97afb10752332a6dd3d98e14e429e1a9e7",
-                "sha256:fe7cdd3f7d1df43200e1c80f1aed86bb36033bf65e3c7cf46a2b97a253ef8798"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==3.11.18"
-        },
-        "aiosignal": {
-            "hashes": [
-                "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5",
-                "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==1.3.2"
-        },
         "annotated-types": {
             "hashes": [
                 "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53",
@@ -184,6 +81,7 @@
                 "sha256:f3a4d79f499f567d327d2d8846d02ad18244d2927f88858a42a2438f52d9a0ef"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==1.38.8"
         },
         "botocore": {
@@ -272,7 +170,7 @@
                 "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87",
                 "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"
             ],
-            "markers": "platform_python_implementation != 'PyPy'",
+            "markers": "python_version >= '3.8'",
             "version": "==1.17.1"
         },
         "charset-normalizer": {
@@ -426,10 +324,9 @@
         },
         "dbrepo": {
             "hashes": [
-                "sha256:5dbd2230489d0af8eb4509b7231764289972e6282037b27e97a3824a5d234090"
+                "sha256:76f0ab97d1e914a779aa51b5e5a17591b2f1c88f15dc9df27273deb4dc7ed125"
             ],
-            "path": "./lib/dbrepo-1.8.2rc6.tar.gz",
-            "version": "==1.8.2rc6"
+            "path": "./lib/dbrepo-1.8.2.tar.gz"
         },
         "events": {
             "hashes": [
@@ -443,6 +340,7 @@
                 "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==1.2.2"
         },
         "flasgger": {
@@ -458,6 +356,7 @@
                 "sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==3.1.0"
         },
         "flask-cors": {
@@ -466,6 +365,7 @@
                 "sha256:fa5cb364ead54bbf401a26dbf03030c6b18fb2fcaf70408096a572b409586b0c"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9' and python_version < '4.0'",
             "version": "==5.0.1"
         },
         "flask-httpauth": {
@@ -482,118 +382,9 @@
                 "sha256:8085d6757505b6f3291a2638c84d207e8f0ad0de662d1f46aa2f77e658a0c976"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9' and python_version < '4'",
             "version": "==4.7.1"
         },
-        "frozenlist": {
-            "hashes": [
-                "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117",
-                "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2",
-                "sha256:0dbae96c225d584f834b8d3cc688825911960f003a85cb0fd20b6e5512468c42",
-                "sha256:0e6f8653acb82e15e5443dba415fb62a8732b68fe09936bb6d388c725b57f812",
-                "sha256:0f2ca7810b809ed0f1917293050163c7654cefc57a49f337d5cd9de717b8fad3",
-                "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a",
-                "sha256:1255d5d64328c5a0d066ecb0f02034d086537925f1f04b50b1ae60d37afbf572",
-                "sha256:1330f0a4376587face7637dfd245380a57fe21ae8f9d360c1c2ef8746c4195fa",
-                "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b",
-                "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626",
-                "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e",
-                "sha256:1db8b2fc7ee8a940b547a14c10e56560ad3ea6499dc6875c354e2335812f739d",
-                "sha256:2187248203b59625566cac53572ec8c2647a140ee2738b4e36772930377a533c",
-                "sha256:2b8cf4cfea847d6c12af06091561a89740f1f67f331c3fa8623391905e878530",
-                "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878",
-                "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e",
-                "sha256:36d2fc099229f1e4237f563b2a3e0ff7ccebc3999f729067ce4e64a97a7f2869",
-                "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd",
-                "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603",
-                "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606",
-                "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85",
-                "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64",
-                "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f",
-                "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0",
-                "sha256:4da6fc43048b648275a220e3a61c33b7fff65d11bdd6dcb9d9c145ff708b804c",
-                "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4",
-                "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103",
-                "sha256:52021b528f1571f98a7d4258c58aa8d4b1a96d4f01d00d51f1089f2e0323cb02",
-                "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191",
-                "sha256:536a1236065c29980c15c7229fbb830dedf809708c10e159b8136534233545f0",
-                "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e",
-                "sha256:56a0b8dd6d0d3d971c91f1df75e824986667ccce91e20dca2023683814344791",
-                "sha256:5c9e89bf19ca148efcc9e3c44fd4c09d5af85c8a7dd3dbd0da1cb83425ef4983",
-                "sha256:625170a91dd7261a1d1c2a0c1a353c9e55d21cd67d0852185a5fef86587e6f5f",
-                "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff",
-                "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8",
-                "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860",
-                "sha256:69bbd454f0fb23b51cadc9bdba616c9678e4114b6f9fa372d462ff2ed9323ec8",
-                "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25",
-                "sha256:6ef8e7e8f2f3820c5f175d70fdd199b79e417acf6c72c5d0aa8f63c9f721646f",
-                "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba",
-                "sha256:75ecee69073312951244f11b8627e3700ec2bfe07ed24e3a685a5979f0412d24",
-                "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e",
-                "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd",
-                "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911",
-                "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c",
-                "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595",
-                "sha256:7daa508e75613809c7a57136dec4871a21bca3080b3a8fc347c50b187df4f00c",
-                "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc",
-                "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2",
-                "sha256:89ffdb799154fd4d7b85c56d5fa9d9ad48946619e0eb95755723fffa11022d75",
-                "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4",
-                "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0",
-                "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe",
-                "sha256:920b6bd77d209931e4c263223381d63f76828bec574440f29eb497cf3394c249",
-                "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c",
-                "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576",
-                "sha256:9799257237d0479736e2b4c01ff26b5c7f7694ac9692a426cb717f3dc02fff9b",
-                "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770",
-                "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046",
-                "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584",
-                "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497",
-                "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f",
-                "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f",
-                "sha256:aa733d123cc78245e9bb15f29b44ed9e5780dc6867cfc4e544717b91f980af3b",
-                "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f",
-                "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d",
-                "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a",
-                "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e",
-                "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68",
-                "sha256:ba7f8d97152b61f22d7f59491a781ba9b177dd9f318486c5fbc52cde2db12189",
-                "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9",
-                "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8",
-                "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1",
-                "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0",
-                "sha256:c7c608f833897501dac548585312d73a7dca028bf3b8688f0d712b7acfaf7fb3",
-                "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29",
-                "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0",
-                "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215",
-                "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590",
-                "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c",
-                "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821",
-                "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1",
-                "sha256:d3ceb265249fb401702fce3792e6b44c1166b9319737d21495d3611028d95769",
-                "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506",
-                "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3",
-                "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348",
-                "sha256:e19c0fc9f4f030fcae43b4cdec9e8ab83ffe30ec10c79a4a43a04d1af6c5e1ad",
-                "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a",
-                "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad",
-                "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6",
-                "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45",
-                "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188",
-                "sha256:e6e558ea1e47fd6fa8ac9ccdad403e5dd5ecc6ed8dda94343056fa4277d5c65e",
-                "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70",
-                "sha256:ed5e3a4462ff25ca84fb09e0fada8ea267df98a450340ead4c91b44857267d70",
-                "sha256:f1a39819a5a3e84304cd286e3dc62a549fe60985415851b3337b6f5cc91907f1",
-                "sha256:f27a9f9a86dcf00708be82359db8de86b80d029814e6693259befe82bb58a106",
-                "sha256:f2c7d5aa19714b1b01a0f515d078a629e445e667b9da869a3cd0e6fe7dec78bd",
-                "sha256:f3a7bb0fe1f7a70fb5c6f497dc32619db7d2cdd53164af30ade2f34673f8b1fc",
-                "sha256:f4b3cd7334a4bbc0c472164f3744562cb72d05002cc6fcf58adb104630bbc352",
-                "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91",
-                "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1",
-                "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==1.6.0"
-        },
         "gevent": {
             "hashes": [
                 "sha256:03587078c402aee27231ecaabd81aec1e8b3de2629830fbd4486e2d09e638ddc",
@@ -637,6 +428,7 @@
                 "sha256:ff92408011d78e4ffe297331ff30cded39a3e22845ba237516c646f6a485a241"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==25.4.2"
         },
         "greenlet": {
@@ -698,6 +490,7 @@
                 "sha256:ff38c869ed30fff07f1452d9a204ece1ec6d3c0870e0ba6e478ce7c1515acf22"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==3.2.1"
         },
         "gunicorn": {
@@ -706,6 +499,7 @@
                 "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==23.0.0"
         },
         "idna": {
@@ -761,6 +555,7 @@
                 "sha256:61c9170f92e736b530655e75374681d4fcca9cfa8763ab42be57353b2b203494"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.6'",
             "version": "==1.3.1"
         },
         "markupsafe": {
@@ -836,6 +631,7 @@
                 "sha256:c06ef7a43e5d67107067f77b6c07ebdd68733e5aa7eed03076472410ca19d876"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==7.2.15"
         },
         "mistune": {
@@ -846,116 +642,6 @@
             "markers": "python_version >= '3.8'",
             "version": "==3.1.3"
         },
-        "multidict": {
-            "hashes": [
-                "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756",
-                "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8",
-                "sha256:0bb8f8302fbc7122033df959e25777b0b7659b1fd6bcb9cb6bed76b5de67afef",
-                "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c",
-                "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5",
-                "sha256:0ee1bf613c448997f73fc4efb4ecebebb1c02268028dd4f11f011f02300cf1e8",
-                "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db",
-                "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713",
-                "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44",
-                "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378",
-                "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5",
-                "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676",
-                "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08",
-                "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea",
-                "sha256:224b79471b4f21169ea25ebc37ed6f058040c578e50ade532e2066562597b8a9",
-                "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9",
-                "sha256:2427370f4a255262928cd14533a70d9738dfacadb7563bc3b7f704cc2360fc4e",
-                "sha256:24a8caa26521b9ad09732972927d7b45b66453e6ebd91a3c6a46d811eeb7349b",
-                "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508",
-                "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1",
-                "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852",
-                "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac",
-                "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde",
-                "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8",
-                "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504",
-                "sha256:32a998bd8a64ca48616eac5a8c1cc4fa38fb244a3facf2eeb14abe186e0f6cc5",
-                "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02",
-                "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4",
-                "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec",
-                "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a",
-                "sha256:3ccdde001578347e877ca4f629450973c510e88e8865d5aefbcb89b852ccc666",
-                "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc",
-                "sha256:3cf62f8e447ea2c1395afa289b332e49e13d07435369b6f4e41f887db65b40bf",
-                "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790",
-                "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8",
-                "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589",
-                "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d",
-                "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07",
-                "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56",
-                "sha256:5427a2679e95a642b7f8b0f761e660c845c8e6fe3141cddd6b62005bd133fc21",
-                "sha256:578568c4ba5f2b8abd956baf8b23790dbfdc953e87d5b110bce343b4a54fc9e7",
-                "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9",
-                "sha256:5e3929269e9d7eff905d6971d8b8c85e7dbc72c18fb99c8eae6fe0a152f2e343",
-                "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9",
-                "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4",
-                "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a",
-                "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427",
-                "sha256:6b5a272bc7c36a2cd1b56ddc6bff02e9ce499f9f14ee4a45c45434ef083f2459",
-                "sha256:6d79cf5c0c6284e90f72123f4a3e4add52d6c6ebb4a9054e88df15b8d08444c6",
-                "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208",
-                "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229",
-                "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0",
-                "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474",
-                "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817",
-                "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd",
-                "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618",
-                "sha256:8b6fcf6054fc4114a27aa865f8840ef3d675f9316e81868e0ad5866184a6cba5",
-                "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3",
-                "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124",
-                "sha256:909f7d43ff8f13d1adccb6a397094adc369d4da794407f8dd592c51cf0eae4b1",
-                "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb",
-                "sha256:99592bd3162e9c664671fd14e578a33bfdba487ea64bcb41d281286d3c870ad7",
-                "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3",
-                "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375",
-                "sha256:9f35de41aec4b323c71f54b0ca461ebf694fb48bec62f65221f52e0017955b39",
-                "sha256:a059ad6b80de5b84b9fa02a39400319e62edd39d210b4e4f8c4f1243bdac4752",
-                "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0",
-                "sha256:a54ec568f1fc7f3c313c2f3b16e5db346bf3660e1309746e7fccbbfded856188",
-                "sha256:a62d78a1c9072949018cdb05d3c533924ef8ac9bcb06cbf96f6d14772c5cd451",
-                "sha256:a7bd27f7ab3204f16967a6f899b3e8e9eb3362c0ab91f2ee659e0345445e0078",
-                "sha256:a7be07e5df178430621c716a63151165684d3e9958f2bbfcb644246162007ab7",
-                "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7",
-                "sha256:abcfed2c4c139f25c2355e180bcc077a7cae91eefbb8b3927bb3f836c9586f1f",
-                "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b",
-                "sha256:ae93e0ff43b6f6892999af64097b18561691ffd835e21a8348a441e256592e1f",
-                "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c",
-                "sha256:b128dbf1c939674a50dd0b28f12c244d90e5015e751a4f339a96c54f7275e291",
-                "sha256:b1b389ae17296dd739015d5ddb222ee99fd66adeae910de21ac950e00979d897",
-                "sha256:b57e28dbc031d13916b946719f213c494a517b442d7b48b29443e79610acd887",
-                "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1",
-                "sha256:b9cb19dfd83d35b6ff24a4022376ea6e45a2beba8ef3f0836b8a4b288b6ad685",
-                "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf",
-                "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6",
-                "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731",
-                "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507",
-                "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b",
-                "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae",
-                "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777",
-                "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7",
-                "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be",
-                "sha256:dd53893675b729a965088aaadd6a1f326a72b83742b056c1065bdd2e2a42b4df",
-                "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054",
-                "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2",
-                "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124",
-                "sha256:eccb67b0e78aa2e38a04c5ecc13bab325a43e5159a181a9d1a6723db913cbb3c",
-                "sha256:edf74dc5e212b8c75165b435c43eb0d5e81b6b300a938a4eb82827119115e840",
-                "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8",
-                "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd",
-                "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8",
-                "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3",
-                "sha256:f92c7f62d59373cd93bc9969d2da9b4b21f78283b1379ba012f7ee8127b3152e",
-                "sha256:fb6214fe1750adc2a1b801a199d64b5a67671bf76ebf24c730b157846d0e90d2",
-                "sha256:fbd8d737867912b6c5f99f56782b8cb81f978a97b4437a1c476de90a3e41c9a1",
-                "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==6.4.3"
-        },
         "numpy": {
             "hashes": [
                 "sha256:0255732338c4fdd00996c0421884ea8a3651eea555c3a56b84892b66f696eb70",
@@ -1015,6 +701,7 @@
                 "sha256:f5045039100ed58fa817a6227a356240ea1b9a1bc141018864c306c1a16d4175"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.10'",
             "version": "==2.2.5"
         },
         "opensearch-py": {
@@ -1023,6 +710,7 @@
                 "sha256:6598df0bc7a003294edd0ba88a331e0793acbb8c910c43edf398791e3b2eccda"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8' and python_version < '4'",
             "version": "==2.8.0"
         },
         "packaging": {
@@ -1079,6 +767,7 @@
                 "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==2.2.3"
         },
         "pika": {
@@ -1105,110 +794,6 @@
             "index": "pypi",
             "version": "==0.23.2"
         },
-        "propcache": {
-            "hashes": [
-                "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e",
-                "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b",
-                "sha256:069e7212890b0bcf9b2be0a03afb0c2d5161d91e1bf51569a64f629acc7defbf",
-                "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b",
-                "sha256:0c3c3a203c375b08fd06a20da3cf7aac293b834b6f4f4db71190e8422750cca5",
-                "sha256:0c86e7ceea56376216eba345aa1fc6a8a6b27ac236181f840d1d7e6a1ea9ba5c",
-                "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c",
-                "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a",
-                "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf",
-                "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8",
-                "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5",
-                "sha256:1f6cc0ad7b4560e5637eb2c994e97b4fa41ba8226069c9277eb5ea7101845b42",
-                "sha256:27c6ac6aa9fc7bc662f594ef380707494cb42c22786a558d95fcdedb9aa5d035",
-                "sha256:2d219b0dbabe75e15e581fc1ae796109b07c8ba7d25b9ae8d650da582bed01b0",
-                "sha256:2fce1df66915909ff6c824bbb5eb403d2d15f98f1518e583074671a30fe0c21e",
-                "sha256:319fa8765bfd6a265e5fa661547556da381e53274bc05094fc9ea50da51bfd46",
-                "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d",
-                "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24",
-                "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d",
-                "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de",
-                "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf",
-                "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7",
-                "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371",
-                "sha256:47ef24aa6511e388e9894ec16f0fbf3313a53ee68402bc428744a367ec55b833",
-                "sha256:4cf9e93a81979f1424f1a3d155213dc928f1069d697e4353edb8a5eba67c6259",
-                "sha256:4d0dfdd9a2ebc77b869a0b04423591ea8823f791293b527dc1bb896c1d6f1136",
-                "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25",
-                "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005",
-                "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef",
-                "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7",
-                "sha256:5b9145c35cc87313b5fd480144f8078716007656093d23059e8993d3a8fa730f",
-                "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53",
-                "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0",
-                "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb",
-                "sha256:603f1fe4144420374f1a69b907494c3acbc867a581c2d49d4175b0de7cc64566",
-                "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a",
-                "sha256:64a956dff37080b352c1c40b2966b09defb014347043e740d420ca1eb7c9b908",
-                "sha256:668ddddc9f3075af019f784456267eb504cb77c2c4bd46cc8402d723b4d200bf",
-                "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458",
-                "sha256:6f173bbfe976105aaa890b712d1759de339d8a7cef2fc0a1714cc1a1e1c47f64",
-                "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9",
-                "sha256:730178f476ef03d3d4d255f0c9fa186cb1d13fd33ffe89d39f2cda4da90ceb71",
-                "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b",
-                "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5",
-                "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037",
-                "sha256:82de5da8c8893056603ac2d6a89eb8b4df49abf1a7c19d536984c8dd63f481d5",
-                "sha256:83be47aa4e35b87c106fc0c84c0fc069d3f9b9b06d3c494cd404ec6747544894",
-                "sha256:8638f99dca15b9dff328fb6273e09f03d1c50d9b6512f3b65a4154588a7595fe",
-                "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757",
-                "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3",
-                "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976",
-                "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6",
-                "sha256:916cd229b0150129d645ec51614d38129ee74c03293a9f3f17537be0029a9641",
-                "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7",
-                "sha256:967a8eec513dbe08330f10137eacb427b2ca52118769e82ebcfcab0fba92a649",
-                "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120",
-                "sha256:9979643ffc69b799d50d3a7b72b5164a2e97e117009d7af6dfdd2ab906cb72cd",
-                "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40",
-                "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e",
-                "sha256:9e64e948ab41411958670f1093c0a57acfdc3bee5cf5b935671bbd5313bcf229",
-                "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c",
-                "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7",
-                "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111",
-                "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654",
-                "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f",
-                "sha256:a461959ead5b38e2581998700b26346b78cd98540b5524796c175722f18b0294",
-                "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da",
-                "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f",
-                "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7",
-                "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0",
-                "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073",
-                "sha256:b303b194c2e6f171cfddf8b8ba30baefccf03d36a4d9cab7fd0bb68ba476a3d7",
-                "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11",
-                "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f",
-                "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27",
-                "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70",
-                "sha256:c66d8ccbc902ad548312b96ed8d5d266d0d2c6d006fd0f66323e9d8f2dd49be7",
-                "sha256:cd6a55f65241c551eb53f8cf4d2f4af33512c39da5d9777694e9d9c60872f519",
-                "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5",
-                "sha256:d4e89cde74154c7b5957f87a355bb9c8ec929c167b59c83d90654ea36aeb6180",
-                "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f",
-                "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee",
-                "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18",
-                "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815",
-                "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e",
-                "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a",
-                "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7",
-                "sha256:ed5f6d2edbf349bd8d630e81f474d33d6ae5d07760c44d33cd808e2f5c8f4ae6",
-                "sha256:ef2e4e91fb3945769e14ce82ed53007195e616a63aa43b40fb7ebaaf907c8d4c",
-                "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc",
-                "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8",
-                "sha256:f27785888d2fdd918bc36de8b8739f2d6c791399552333721b58193f68ea3e98",
-                "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256",
-                "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5",
-                "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744",
-                "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723",
-                "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277",
-                "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==0.3.1"
-        },
         "pycparser": {
             "hashes": [
                 "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6",
@@ -1258,6 +843,7 @@
                 "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==2.11.4"
         },
         "pydantic-core": {
@@ -1461,6 +1047,7 @@
                 "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8'",
             "version": "==2.32.3"
         },
         "rpds-py": {
@@ -1593,11 +1180,11 @@
         },
         "setuptools": {
             "hashes": [
-                "sha256:a65cffc4fb86167e3020b3ef58e08226baad8b29a3b34ce2c9d07e901bac481d",
-                "sha256:ec8308eb180b2312062b1c5523204acf872cd8b0a9e6c2ae76431b22bc4065d7"
+                "sha256:31e2c58dbb67c99c289f51c16d899afedae292b978f8051efaf6262d8212f927",
+                "sha256:ea8e00d7992054c4c592aeb892f6ad51fe1b4d90cc6947cc45c45717c40ec537"
             ],
             "markers": "python_version >= '3.9'",
-            "version": "==80.3.0"
+            "version": "==80.3.1"
         },
         "six": {
             "hashes": [
@@ -1607,22 +1194,6 @@
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==1.17.0"
         },
-        "tinydb": {
-            "hashes": [
-                "sha256:f7dfc39b8d7fda7a1ca62a8dbb449ffd340a117c1206b68c50b1a481fb95181d",
-                "sha256:f97030ee5cbc91eeadd1d7af07ab0e48ceb04aa63d4a983adbaca4cba16e86c3"
-            ],
-            "markers": "python_version >= '3.8' and python_version < '4.0'",
-            "version": "==4.8.2"
-        },
-        "tuspy": {
-            "hashes": [
-                "sha256:156734eac5c61a046cfecd70f14119f05be92cce198eb5a1a99a664482bedb89",
-                "sha256:7fc5ac8fb25de37c96c90213f83a1ffdede7f48a471cb5a15a2f57846828a79a"
-            ],
-            "markers": "python_full_version >= '3.5.3'",
-            "version": "==1.1.0"
-        },
         "typing-extensions": {
             "hashes": [
                 "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c",
@@ -1663,116 +1234,6 @@
             "markers": "python_version >= '3.9'",
             "version": "==3.1.3"
         },
-        "yarl": {
-            "hashes": [
-                "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9",
-                "sha256:04d9c7a1dc0a26efb33e1acb56c8849bd57a693b85f44774356c92d610369efa",
-                "sha256:06d06c9d5b5bc3eb56542ceeba6658d31f54cf401e8468512447834856fb0e61",
-                "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2",
-                "sha256:083ce0393ea173cd37834eb84df15b6853b555d20c52703e21fbababa8c129d2",
-                "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33",
-                "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902",
-                "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2",
-                "sha256:119bca25e63a7725b0c9d20ac67ca6d98fa40e5a894bd5d4686010ff73397914",
-                "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0",
-                "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0",
-                "sha256:1a06701b647c9939d7019acdfa7ebbfbb78ba6aa05985bb195ad716ea759a569",
-                "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f",
-                "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7",
-                "sha256:27359776bc359ee6eaefe40cb19060238f31228799e43ebd3884e9c589e63b20",
-                "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00",
-                "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1",
-                "sha256:35d20fb919546995f1d8c9e41f485febd266f60e55383090010f272aca93edcc",
-                "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f",
-                "sha256:3b4e88d6c3c8672f45a30867817e4537df1bbc6f882a91581faf1f6d9f0f1b5a",
-                "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd",
-                "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c",
-                "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f",
-                "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5",
-                "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d",
-                "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501",
-                "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3",
-                "sha256:44869ee8538208fe5d9342ed62c11cc6a7a1af1b3d0bb79bb795101b6e77f6e0",
-                "sha256:484e7a08f72683c0f160270566b4395ea5412b4359772b98659921411d32ad26",
-                "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2",
-                "sha256:4ba5e59f14bfe8d261a654278a0f6364feef64a794bd456a8c9e823071e5061c",
-                "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c",
-                "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae",
-                "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de",
-                "sha256:4f1a350a652bbbe12f666109fbddfdf049b3ff43696d18c9ab1531fbba1c977a",
-                "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe",
-                "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8",
-                "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124",
-                "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb",
-                "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc",
-                "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2",
-                "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac",
-                "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307",
-                "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58",
-                "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e",
-                "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e",
-                "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62",
-                "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b",
-                "sha256:7595498d085becc8fb9203aa314b136ab0516c7abd97e7d74f7bb4eb95042abe",
-                "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda",
-                "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5",
-                "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64",
-                "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229",
-                "sha256:85a231fa250dfa3308f3c7896cc007a47bc76e9e8e8595c20b7426cac4884c62",
-                "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6",
-                "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d",
-                "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791",
-                "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672",
-                "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb",
-                "sha256:8d8a3d54a090e0fff5837cd3cc305dd8a07d3435a088ddb1f65e33b322f66a94",
-                "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a",
-                "sha256:95b50910e496567434cb77a577493c26bce0f31c8a305135f3bda6a2483b8e10",
-                "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e",
-                "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9",
-                "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5",
-                "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da",
-                "sha256:a884b8974729e3899d9287df46f015ce53f7282d8d3340fa0ed57536b440621c",
-                "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a",
-                "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d",
-                "sha256:af5607159085dcdb055d5678fc2d34949bd75ae6ea6b4381e784bbab1c3aa195",
-                "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594",
-                "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8",
-                "sha256:b594113a301ad537766b4e16a5a6750fcbb1497dcc1bc8a4daae889e6402a634",
-                "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051",
-                "sha256:b7fa0cb9fd27ffb1211cde944b41f5c67ab1c13a13ebafe470b1e206b8459da8",
-                "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e",
-                "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384",
-                "sha256:bc906b636239631d42eb8a07df8359905da02704a868983265603887ed68c076",
-                "sha256:bdb77efde644d6f1ad27be8a5d67c10b7f769804fff7a966ccb1da5a4de4b656",
-                "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018",
-                "sha256:c27d98f4e5c4060582f44e58309c1e55134880558f1add7a87c1bc36ecfade19",
-                "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a",
-                "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4",
-                "sha256:ce360ae48a5e9961d0c730cf891d40698a82804e85f6e74658fb175207a77cb2",
-                "sha256:d0bf955b96ea44ad914bc792c26a0edcd71b4668b93cbcd60f5b0aeaaed06c64",
-                "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145",
-                "sha256:d4fad6e5189c847820288286732075f213eabf81be4d08d6cc309912e62be5b7",
-                "sha256:d88cc43e923f324203f6ec14434fa33b85c06d18d59c167a0637164863b8e995",
-                "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6",
-                "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f",
-                "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f",
-                "sha256:e52d6ed9ea8fd3abf4031325dc714aed5afcbfa19ee4a89898d663c9976eb487",
-                "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9",
-                "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a",
-                "sha256:f0cf05ae2d3d87a8c9022f3885ac6dea2b751aefd66a4f200e408a61ae9b7f0d",
-                "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f",
-                "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1",
-                "sha256:f1f6670b9ae3daedb325fa55fbe31c22c8228f6e0b513772c2e1c623caa6ab22",
-                "sha256:f4d3fa9b9f013f7050326e165c3279e22850d02ae544ace285674cb6174b5d6d",
-                "sha256:f8d8aa8dd89ffb9a831fedbcb27d00ffd9f4842107d52dc9d57e64cb34073d5c",
-                "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877",
-                "sha256:faa709b66ae0e24c8e5134033187a972d849d87ed0a12a0366bedcc6b5dc14a5",
-                "sha256:fb0caeac4a164aadce342f1597297ec0ce261ec4532bbc5a9ca8da5622f53867",
-                "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==1.20.0"
-        },
         "zope.event": {
             "hashes": [
                 "sha256:2832e95014f4db26c47a13fdaef84cef2f4df37e66b59d8f1f4a8f319a632c26",
@@ -1939,7 +1400,7 @@
                 "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87",
                 "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"
             ],
-            "markers": "platform_python_implementation != 'PyPy'",
+            "markers": "python_version >= '3.8'",
             "version": "==1.17.1"
         },
         "charset-normalizer": {
@@ -2107,6 +1568,7 @@
                 "sha256:fa260de59dfb143af06dcf30c2be0b200bed2a73737a8a59248fcb9fa601ef0f"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==7.8.0"
         },
         "docker": {
@@ -2145,6 +1607,7 @@
                 "sha256:c06ef7a43e5d67107067f77b6c07ebdd68733e5aa7eed03076472410ca19d876"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==7.2.15"
         },
         "opensearch-py": {
@@ -2153,6 +1616,7 @@
                 "sha256:6598df0bc7a003294edd0ba88a331e0793acbb8c910c43edf398791e3b2eccda"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8' and python_version < '4'",
             "version": "==2.8.0"
         },
         "packaging": {
@@ -2220,6 +1684,7 @@
                 "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8'",
             "version": "==8.3.5"
         },
         "python-dateutil": {
@@ -2236,6 +1701,7 @@
                 "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8'",
             "version": "==2.32.3"
         },
         "requests-mock": {
@@ -2244,6 +1710,7 @@
                 "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.5'",
             "version": "==1.12.1"
         },
         "six": {
@@ -2266,6 +1733,7 @@
                 "sha256:54d330d085c0a11fc5da0b001af87aec4dd3e814104376bf7513e8646c77442a"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==0.0.1rc1"
         },
         "testcontainers-opensearch": {
@@ -2273,6 +1741,7 @@
                 "sha256:0bdf270b5b7f53915832f7c31dd2bd3ffdc20b534ea6b32231cc7003049bd0e1"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==0.0.1rc1"
         },
         "typing-extensions": {
diff --git a/dbrepo-analyse-service/app.py b/dbrepo-analyse-service/app.py
index e567aef7c3153a9e2faa47afdd6453d0caf31759..abf21202c8dbf6de8020a6e12220c7ed4d3a0820 100644
--- a/dbrepo-analyse-service/app.py
+++ b/dbrepo-analyse-service/app.py
@@ -28,17 +28,32 @@ dictConfig({
             'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
         },
         'simple': {
-            'format': '[%(asctime)s] %(levelname)s: %(message)s',
+            'format': '[%(asctime)s] [%(levelname)s] %(message)s',
+        },
+        'ecs': {
+            'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "analyse-service", "service_version": "1.8.2"}',
+            'datefmt': '%Y-%m-%dT%H:%M:%S'
+        },
+    },
+    'handlers': {
+        'wsgi': {
+            'class': 'logging.StreamHandler',
+            'stream': 'ext://flask.logging.wsgi_errors_stream',
+            'formatter': 'simple'
+        },
+        'file': {
+            'class': 'logging.handlers.TimedRotatingFileHandler',
+            'formatter': 'ecs',
+            'filename': '/var/log/app/service/analyse/app.log',
+            'when': 'm',
+            'interval': 1,
+            'backupCount': 5,
+            'encoding': 'utf8'
         },
     },
-    'handlers': {'wsgi': {
-        'class': 'logging.StreamHandler',
-        'stream': 'ext://flask.logging.wsgi_errors_stream',
-        'formatter': 'simple'  # default
-    }},
     'root': {
         'level': 'DEBUG',
-        'handlers': ['wsgi']
+        'handlers': ['wsgi', 'file']
     }
 })
 
@@ -59,8 +74,8 @@ swagger_config = {
     "headers": [],
     "specs": [
         {
-            "endpoint": "api-analyse",
-            "route": "/api-analyse.json",
+            "endpoint": "api-docs",
+            "route": "/api-docs.json",
             "rule_filter": lambda rule: rule.endpoint.startswith('actuator') or rule.endpoint.startswith('analyse'),
             "model_filter": lambda tag: True,  # all in
         }
@@ -263,7 +278,7 @@ def get_health():
 
 @app.route("/api/analyse/datatypes", methods=["GET"], endpoint="analyse_analyse_datatypes")
 @metrics.gauge(name='dbrepo_analyse_datatypes', description='Time needed to analyse datatypes of dataset')
-@swag_from("as-yml/analyse_datatypes.yml")
+@swag_from("/app/as-yml/analyse_datatypes.yml")
 def analyse_datatypes():
     filename: str = request.args.get('filename')
     separator: str = request.args.get('separator')
@@ -280,17 +295,17 @@ def analyse_datatypes():
         logging.debug("determine datatype resulted in datatypes %s", res)
         return Response(res.model_dump_json(), mimetype="application/json"), 202
     except OSError as e:
-        logging.error(f"Failed to determine data types: {e}")
+        logging.error(f"Failed to determine data types: {str(e).strip()}")
         return ApiError(status='BAD_REQUEST', message=str(e), code='error.analyse.invalid').model_dump_json(), 400
     except ClientError as e:
-        logging.error(f"Failed to determine separator: {e}")
+        logging.error(f"Failed to determine separator: {str(e).strip()}")
         return ApiError(status='NOT_FOUND', message='Failed to find csv',
                         code='error.analyse.missing').model_dump_json(), 404
 
 
 @app.route("/api/analyse/keys", methods=["GET"], endpoint="analyse_analyse_keys")
 @metrics.gauge(name='dbrepo_analyse_keys', description='Time needed to analyse keys of dataset')
-@swag_from("as-yml/analyse_keys.yml")
+@swag_from("/app/as-yml/analyse_keys.yml")
 def analyse_keys():
     filename: str = request.args.get("filename")
     separator: str = request.args.get('separator')
@@ -305,5 +320,5 @@ def analyse_keys():
         logging.info(f"Determined list of primary keys: {res}")
         return Response(dumps(res), mimetype="application/json"), 202
     except OSError as e:
-        logging.error(f"Failed to determine primary key: {e}")
+        logging.error(f"Failed to determine primary key: {str(e).strip()}")
         return ApiError(status='BAD_REQUEST', message=str(e), code='analyse.database.invalid').model_dump_json(), 400
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.8.2-py3-none-any.whl
index 6a21f512b36f30367f641061c8efeba90108a6c7..48beeb5ebf61c7cca654e0ee66343fac70bb4d53 100644
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.2-py3-none-any.whl and b/dbrepo-analyse-service/lib/dbrepo-1.8.2-py3-none-any.whl differ
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.8.2.tar.gz
index f98a45d02b802376ff7614c008eec8783f281896..3e3b65b6b93a602ee26c2f4d4c71c2d3cd331211 100644
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.2.tar.gz and b/dbrepo-analyse-service/lib/dbrepo-1.8.2.tar.gz differ
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl
deleted file mode 100644
index 86a1af2af41c44d35a4da7a472c180854f0cd82c..0000000000000000000000000000000000000000
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl and /dev/null differ
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc3.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc3.tar.gz
deleted file mode 100644
index 9c03ed275c6da5b2eef3619c59269f398d59c7de..0000000000000000000000000000000000000000
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc3.tar.gz and /dev/null differ
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl
deleted file mode 100644
index 5a0dbc7c95592f2e70bed13fa33d85cc6cdf7811..0000000000000000000000000000000000000000
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl and /dev/null differ
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc4.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc4.tar.gz
deleted file mode 100644
index 1dbc78c989362d4d0c3750b1ad942abe46f205dd..0000000000000000000000000000000000000000
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc4.tar.gz and /dev/null differ
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl
deleted file mode 100644
index 50bf1b8195987f6f8d23a36f34bc0f912b6fd9b3..0000000000000000000000000000000000000000
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl and /dev/null differ
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc5.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc5.tar.gz
deleted file mode 100644
index be8784437f111e2d4a5cdac36baf77605114dfa5..0000000000000000000000000000000000000000
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc5.tar.gz and /dev/null differ
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl
deleted file mode 100644
index 8e4c745a2ce782c174d5e1db7eef22d51d26624c..0000000000000000000000000000000000000000
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl and /dev/null differ
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc6.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.8.2rc6.tar.gz
deleted file mode 100644
index 279243fd37fe033fe4aa740361b5e9a370516924..0000000000000000000000000000000000000000
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.2rc6.tar.gz and /dev/null differ
diff --git a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/Client.java b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/Client.java
similarity index 81%
rename from dbrepo-auth-service/listeners/src/main/java/at/tuwien/Client.java
rename to dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/Client.java
index c63e88618b792f4d85e52b4aee55c80e1a2f1db8..061c4d78fbb7bbaf2745207f93ad7a1b996c714f 100644
--- a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/Client.java
+++ b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/Client.java
@@ -1,6 +1,7 @@
-package at.tuwien;
+package at.ac.tuwien.ifs.dbrepo;
 
-import org.jboss.logging.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -13,12 +14,13 @@ import java.nio.charset.Charset;
 import java.util.Base64;
 
 public class Client {
-    private static final Logger log = Logger.getLogger(Client.class);
+
+    private static final Logger log = LoggerFactory.getLogger(Client.class);
 
     public static void postService(String data) throws IOException {
         try {
             final String urlString = System.getenv("METADATA_SERVICE_ENDPOINT");
-            log.debugf("METADATA_SERVICE_ENDPOINT: %s", urlString);
+            log.debug("env.METADATA_SERVICE_ENDPOINT: {}", urlString);
             if (urlString == null || urlString.isEmpty()) {
                 throw new IllegalArgumentException("Environment variable METADATA_SERVICE_ENDPOINT is not set or is empty.");
             }
@@ -26,35 +28,31 @@ public class Client {
             if (systemUsername == null || systemUsername.isEmpty()) {
                 throw new IllegalArgumentException("Environment variable SYSTEM_USERNAME is not set or is empty.");
             }
-            log.debugf("SYSTEM_USERNAME: %s", systemUsername);
+            log.debug("env.SYSTEM_USERNAME: {}", systemUsername);
             final String systemPassword = System.getenv("SYSTEM_PASSWORD");
             if (systemPassword == null || systemPassword.isEmpty()) {
                 throw new IllegalArgumentException("Environment variable SYSTEM_PASSWORD is not set or is empty.");
             }
             final URL url = URI.create(urlString + "/api/user").toURL();
-            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
+            log.debug("url: {}", url);
+            final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
             conn.setDoOutput(true);
             conn.setRequestMethod("POST");
             final String token = systemUsername + ":" + systemPassword;
             conn.setRequestProperty("Authorization", "Basic " + Base64.getEncoder().encodeToString(token.getBytes(
                     Charset.defaultCharset())));
             conn.setRequestProperty("Content-Type", "application/json; utf-8");
-
-            OutputStream os = conn.getOutputStream();
+            final OutputStream os = conn.getOutputStream();
             os.write(data.getBytes());
             os.flush();
-
             final int responseCode = conn.getResponseCode();
             if (responseCode != HttpURLConnection.HTTP_CREATED && responseCode != HttpURLConnection.HTTP_OK) {
                 throw new RuntimeException("Failed : HTTP error code : " + responseCode);
             }
-
             final BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
             String output;
-            log.debugf("Output from Server .... \n");
             while ((output = br.readLine()) != null) {
-                System.out.println(output);
-                log.debugf("Input from Server: %s", output);
+                log.debug("input from server: {}", output);
             }
             conn.disconnect();
         } catch (IOException e) {
diff --git a/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProvider.java b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b47c0919cf9ac200ecdb203700f807e05a04901
--- /dev/null
+++ b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProvider.java
@@ -0,0 +1,91 @@
+package at.ac.tuwien.ifs.dbrepo;
+
+import org.keycloak.events.Event;
+import org.keycloak.events.EventListenerProvider;
+import org.keycloak.events.EventType;
+import org.keycloak.events.admin.AdminEvent;
+import org.keycloak.events.admin.OperationType;
+import org.keycloak.events.admin.ResourceType;
+import org.keycloak.models.KeycloakSession;
+import org.keycloak.models.RealmModel;
+import org.keycloak.models.RealmProvider;
+import org.keycloak.models.UserModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CreateEventListenerProvider implements EventListenerProvider {
+
+    private static final Logger log = LoggerFactory.getLogger(CreateEventListenerProvider.class);
+
+    private final KeycloakSession session;
+    private final RealmProvider model;
+
+    public CreateEventListenerProvider(KeycloakSession session) {
+        this.session = session;
+        this.model = session.realms();
+    }
+
+    @Override
+    public void onEvent(Event event) {
+        log.atDebug()
+                .setMessage("received " + event.getType().toString() + " event")
+                .addKeyValue("event.type", event.getType())
+                .addKeyValue("event.realm_id", event.getRealmId())
+                .addKeyValue("event.user_id", event.getUserId())
+                .log();
+        if (EventType.REGISTER.equals(event.getType()) || EventType.IDENTITY_PROVIDER_FIRST_LOGIN.equals(event.getType())) {
+            final RealmModel realm = this.model.getRealm(event.getRealmId());
+            sendUserData(this.session.users().getUserById(realm, event.getUserId()));
+        }
+    }
+
+    @Override
+    public void onEvent(AdminEvent adminEvent, boolean b) {
+        log.atDebug()
+                .setMessage("received admin event")
+                .addKeyValue("event.realm_id", adminEvent.getRealmId())
+                .addKeyValue("event.operation_type", adminEvent.getOperationType())
+                .addKeyValue("event.resource_type", adminEvent.getResourceType())
+                .addKeyValue("event.resource_path", adminEvent.getResourcePath())
+                .log();
+        if (ResourceType.USER.equals(adminEvent.getResourceType())
+                && OperationType.CREATE.equals(adminEvent.getOperationType())) {
+            final RealmModel realm = this.model.getRealm(adminEvent.getRealmId());
+            sendUserData(this.session.users().getUserById(realm, adminEvent.getResourcePath().substring(6)));
+        }
+    }
+
+    private void sendUserData(UserModel user) {
+        final String userData = "{" +
+                quoteAttr("id", user.getId()) + ", " +
+                quoteAttr("username", user.getUsername()) + ", " +
+                quoteAttr("ldap_id", user.getFirstAttribute("LDAP_ID")) + ", " +
+                quoteAttr("given_name", user.getFirstName()) + ", " +
+                quoteAttr("family_name", user.getLastName()) +
+                "}";
+        try {
+            Client.postService(userData);
+            log.atInfo()
+                    .addKeyValue("id", user.getId())
+                    .addKeyValue("username", user.getUsername())
+                    .addKeyValue("ldap_id", user.getFirstAttribute("LDAP_ID"))
+                    .addKeyValue("given_name", user.getFirstName())
+                    .addKeyValue("family_name", user.getLastName())
+                    .setMessage("Created new user in metadata service: " + user.getId())
+                    .log();
+        } catch (Exception e) {
+            log.error("Failed to call metadata service: {}", e.getMessage());
+        }
+    }
+
+    private static String quoteAttr(String key, String value) {
+        if (value == null || value.isBlank() || value.isEmpty() || value.contentEquals(" ")) {
+            return "\"" + key + "\": null";
+        }
+        return "\"" + key + "\": \"" + value + "\"";
+    }
+
+    @Override
+    public void close() {
+    }
+}
diff --git a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProviderFactory.java b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProviderFactory.java
similarity index 95%
rename from dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProviderFactory.java
rename to dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProviderFactory.java
index 61477ffa33169504a3368d11d0750c9c1404e160..5410647bba19c2b1f1ef1f1a62100f9c9ed2b77c 100644
--- a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProviderFactory.java
+++ b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProviderFactory.java
@@ -1,4 +1,4 @@
-package at.tuwien;
+package at.ac.tuwien.ifs.dbrepo;
 
 import org.keycloak.Config;
 import org.keycloak.events.EventListenerProvider;
diff --git a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProvider.java b/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProvider.java
deleted file mode 100644
index ea4aa7794b6f26167da704e4c12057cf9d8c5c42..0000000000000000000000000000000000000000
--- a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProvider.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package at.tuwien;
-
-import org.jboss.logging.Logger;
-import org.keycloak.events.Event;
-import org.keycloak.events.EventListenerProvider;
-import org.keycloak.events.EventType;
-import org.keycloak.events.admin.AdminEvent;
-import org.keycloak.events.admin.OperationType;
-import org.keycloak.events.admin.ResourceType;
-import org.keycloak.models.KeycloakSession;
-import org.keycloak.models.RealmModel;
-import org.keycloak.models.RealmProvider;
-import org.keycloak.models.UserModel;
-
-import java.util.StringJoiner;
-
-public class CreateEventListenerProvider implements EventListenerProvider {
-
-    private static final Logger log = Logger.getLogger(CreateEventListenerProvider.class);
-
-    private final KeycloakSession session;
-    private final RealmProvider model;
-
-    public CreateEventListenerProvider(KeycloakSession session) {
-        this.session = session;
-        this.model = session.realms();
-    }
-
-    @Override
-    public void onEvent(Event event) {
-        if (EventType.REGISTER.equals(event.getType()) || EventType.IDENTITY_PROVIDER_FIRST_LOGIN.equals(event.getType())) {
-            event.getDetails().forEach((key, value) -> log.debugf("%s : %s", key, value));
-            RealmModel realm = this.model.getRealm(event.getRealmId());
-            UserModel user = this.session.users().getUserById(realm, event.getUserId());
-            sendUserData(user);
-        }
-
-    }
-
-    @Override
-    public void onEvent(AdminEvent adminEvent, boolean b) {
-        log.debug("onEvent(AdminEvent)");
-        log.debugf("Resource path: %s", adminEvent.getResourcePath());
-        log.debugf("Resource type: %s", adminEvent.getResourceType());
-        log.debugf("Operation type: %s", adminEvent.getOperationType());
-        log.debugf("AdminEvent.toString(): %s", toString(adminEvent));
-        if (ResourceType.USER.equals(adminEvent.getResourceType())
-                && OperationType.CREATE.equals(adminEvent.getOperationType())) {
-            RealmModel realm = this.model.getRealm(adminEvent.getRealmId());
-            UserModel user = this.session.users().getUserById(realm, adminEvent.getResourcePath().substring(6));
-
-            sendUserData(user);
-        }
-    }
-
-    private void sendUserData(UserModel user) {
-        final String userData = "{" +
-                quoteAttr("id", user.getId()) + ", " +
-                quoteAttr("username", user.getUsername()) + ", " +
-                quoteAttr("ldap_id", user.getFirstAttribute("LDAP_ID")) + ", " +
-                quoteAttr("given_name", user.getFirstName()) + ", " +
-                quoteAttr("family_name", user.getLastName()) +
-                "}";
-        try {
-            log.debugf("create new user in API: %s", userData);
-            Client.postService(userData);
-        } catch (Exception e) {
-            log.errorf("Failed to call API: %s", e);
-        }
-    }
-
-    private static String quoteAttr(String key, String value) {
-        if (value == null || value.isBlank() || value.isEmpty() || value.contentEquals(" ")) {
-            return "\"" + key + "\": null";
-        }
-        return "\"" + key + "\": \"" + value + "\"";
-    }
-
-    @Override
-    public void close() {
-    }
-
-    private String toString(Event event) {
-        final StringJoiner joiner = new StringJoiner(", ");
-        joiner.add("type=" + event.getType())
-                .add("realmId=" + event.getRealmId())
-                .add("clientId=" + event.getClientId())
-                .add("userId=" + event.getUserId())
-                .add("ipAddress=" + event.getIpAddress());
-        if (event.getError() != null) {
-            joiner.add("error=" + event.getError());
-        }
-        if (event.getDetails() != null) {
-            event.getDetails().forEach((key, value) -> {
-                if (value == null || !value.contains(" ")) {
-                    joiner.add(key + "=" + value);
-                } else {
-                    joiner.add(key + "='" + value + "'");
-                }
-            });
-        }
-        return joiner.toString();
-    }
-
-    private String toString(AdminEvent event) {
-        RealmModel realm = this.model.getRealm(event.getRealmId());
-        UserModel newRegisteredUser = this.session.users().getUserById(realm, event.getAuthDetails().getUserId());
-
-        StringJoiner joiner = new StringJoiner(", ");
-
-        joiner.add("operationType=" + event.getOperationType())
-                .add("realmId=" + event.getAuthDetails().getRealmId())
-                .add("clientId=" + event.getAuthDetails().getClientId())
-                .add("userId=" + event.getAuthDetails().getUserId());
-
-        if (newRegisteredUser != null) {
-            joiner.add("email=" + newRegisteredUser.getEmail())
-                    .add("username=" + newRegisteredUser.getUsername())
-                    .add("firstName=" + newRegisteredUser.getFirstName())
-                    .add("lastName=" + newRegisteredUser.getLastName());
-        }
-
-        joiner.add("ipAddress=" + event.getAuthDetails().getIpAddress())
-                .add("resourcePath=" + event.getResourcePath());
-
-        if (event.getError() != null) {
-            joiner.add("error=" + event.getError());
-        }
-
-        return joiner.toString();
-    }
-}
diff --git a/dbrepo-auth-service/listeners/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory b/dbrepo-auth-service/listeners/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory
index df3c5521f0958fed5fadb4f006d8ee6eb50f97c2..da90b255da8add6f57dc05f662b8448353416ffd 100644
--- a/dbrepo-auth-service/listeners/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory
+++ b/dbrepo-auth-service/listeners/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory
@@ -1 +1 @@
-at.tuwien.CreateEventListenerProviderFactory
\ No newline at end of file
+at.ac.tuwien.ifs.dbrepo.CreateEventListenerProviderFactory
\ No newline at end of file
diff --git a/dbrepo-auth-service/listeners/src/test/java/at/tuwien/EventListenerIntegrationTest.java b/dbrepo-auth-service/listeners/src/test/java/at/ac/tuwien/ifs/dbrepo/EventListenerIntegrationTest.java
similarity index 95%
rename from dbrepo-auth-service/listeners/src/test/java/at/tuwien/EventListenerIntegrationTest.java
rename to dbrepo-auth-service/listeners/src/test/java/at/ac/tuwien/ifs/dbrepo/EventListenerIntegrationTest.java
index c3d6ee94ccd764d16d589b33b51d501e2a2a3d82..5374411b132942f277f7f9b4a738404f916c1f36 100644
--- a/dbrepo-auth-service/listeners/src/test/java/at/tuwien/EventListenerIntegrationTest.java
+++ b/dbrepo-auth-service/listeners/src/test/java/at/ac/tuwien/ifs/dbrepo/EventListenerIntegrationTest.java
@@ -1,4 +1,4 @@
-package at.tuwien;
+package at.ac.tuwien.ifs.dbrepo;
 
 import dasniko.testcontainers.keycloak.KeycloakContainer;
 import org.testcontainers.images.PullPolicy;
diff --git a/dbrepo-dashboard-service/Dockerfile b/dbrepo-dashboard-service/Dockerfile
index 62caad802ff5e7a852e9d47bbd8d41c79bb2e261..62589ba867cf6f48a3d62df3c0759c7611f55738 100644
--- a/dbrepo-dashboard-service/Dockerfile
+++ b/dbrepo-dashboard-service/Dockerfile
@@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001
 
 WORKDIR /app
 
+RUN mkdir -p /var/log/app/service/dashboard && \
+    chown -R 1001:1001 /var/log/app
+
 USER 1001
 
 COPY --chown=1001 ./app.py ./app.py
diff --git a/dbrepo-dashboard-service/Pipfile b/dbrepo-dashboard-service/Pipfile
index fe85565b1bbab11ba1cb0d7f35da7cf9239b2b92..52e7bf373129b51535c5fb3205b4f537e1f642de 100644
--- a/dbrepo-dashboard-service/Pipfile
+++ b/dbrepo-dashboard-service/Pipfile
@@ -12,7 +12,7 @@ prometheus-flask-exporter = "*"
 python-dotenv = "~=1.0"
 jwt = "~=1.3"
 pytest = "*"
-dbrepo = {path = "./lib/dbrepo-1.8.2rc6.tar.gz"}
+dbrepo = {path = "./lib/dbrepo-1.8.2.tar.gz"}
 gunicorn = "*"
 pydantic = "*"
 flask_httpauth = "*"
diff --git a/dbrepo-dashboard-service/Pipfile.lock b/dbrepo-dashboard-service/Pipfile.lock
index adb9f9e5c88750e895f209e5a9bf9c9c2c2005d4..9c02ba5f1c284db4332ebc333a0dd50df26210de 100644
--- a/dbrepo-dashboard-service/Pipfile.lock
+++ b/dbrepo-dashboard-service/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "56e335dd8953adb91791097ae278c8a2530963b46507d05894667d1e599027bd"
+            "sha256": "422a07d8107ead238fa1aaf9e6abfabab2d4eed49e272823aa08e6525708c525"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -16,109 +16,6 @@
         ]
     },
     "default": {
-        "aiohappyeyeballs": {
-            "hashes": [
-                "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558",
-                "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==2.6.1"
-        },
-        "aiohttp": {
-            "hashes": [
-                "sha256:0700055a6e05c2f4711011a44364020d7a10fbbcd02fbf3e30e8f7e7fddc8717",
-                "sha256:0a8d8f20c39d3fa84d1c28cdb97f3111387e48209e224408e75f29c6f8e0861d",
-                "sha256:0e2a92101efb9f4c2942252c69c63ddb26d20f46f540c239ccfa5af865197bb8",
-                "sha256:0f421843b0f70740772228b9e8093289924359d306530bcd3926f39acbe1adda",
-                "sha256:106032eaf9e62fd6bc6578c8b9e6dc4f5ed9a5c1c7fb2231010a1b4304393421",
-                "sha256:11d5391946605f445ddafda5eab11caf310f90cdda1fd99865564e3164f5cff9",
-                "sha256:122f3e739f6607e5e4c6a2f8562a6f476192a682a52bda8b4c6d4254e1138f4d",
-                "sha256:12a62691eb5aac58d65200c7ae94d73e8a65c331c3a86a2e9670927e94339ee8",
-                "sha256:13cd38515568ae230e1ef6919e2e33da5d0f46862943fcda74e7e915096815f3",
-                "sha256:1596ebf17e42e293cbacc7a24c3e0dc0f8f755b40aff0402cb74c1ff6baec1d3",
-                "sha256:25557982dd36b9e32c0a3357f30804e80790ec2c4d20ac6bcc598533e04c6361",
-                "sha256:28c3f975e5ae3dbcbe95b7e3dcd30e51da561a0a0f2cfbcdea30fc1308d72137",
-                "sha256:2c828b6d23b984255b85b9b04a5b963a74278b7356a7de84fda5e3b76866597b",
-                "sha256:2d9f6c0152f8d71361905aaf9ed979259537981f47ad099c8b3d81e0319814bd",
-                "sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8",
-                "sha256:3849ead845e8444f7331c284132ab314b4dac43bfae1e3cf350906d4fff4620f",
-                "sha256:3a621d85e85dccabd700294494d7179ed1590b6d07a35709bb9bd608c7f5dd1d",
-                "sha256:3b8d2b42073611c860a37f718b3d61ae8b4c2b124b2e776e2c10619d920350ec",
-                "sha256:3cc314245deb311364884e44242e00c18b5896e4fe6d5f942e7ad7e4cb640adb",
-                "sha256:3cec21dd68924179258ae14af9f5418c1ebdbba60b98c667815891293902e5e0",
-                "sha256:3d518ce32179f7e2096bf4e3e8438cf445f05fedd597f252de9f54c728574756",
-                "sha256:40fbf91f6a0ac317c0a07eb328a1384941872f6761f2e6f7208b63c4cc0a7ff6",
-                "sha256:427fdc56ccb6901ff8088544bde47084845ea81591deb16f957897f0f0ba1be9",
-                "sha256:44ff5625413fec55216da5eaa011cf6b0a2ed67a565914a212a51aa3755b0009",
-                "sha256:46533e6792e1410f9801d09fd40cbbff3f3518d1b501d6c3c5b218f427f6ff08",
-                "sha256:469ac32375d9a716da49817cd26f1916ec787fc82b151c1c832f58420e6d3533",
-                "sha256:474215ec618974054cf5dc465497ae9708543cbfc312c65212325d4212525811",
-                "sha256:5199be2a2f01ffdfa8c3a6f5981205242986b9e63eb8ae03fd18f736e4840721",
-                "sha256:540b8a1f3a424f1af63e0af2d2853a759242a1769f9f1ab053996a392bd70118",
-                "sha256:554c918ec43f8480b47a5ca758e10e793bd7410b83701676a4782672d670da55",
-                "sha256:5691dc38750fcb96a33ceef89642f139aa315c8a193bbd42a0c33476fd4a1609",
-                "sha256:5bc0ae0a5e9939e423e065a3e5b00b24b8379f1db46046d7ab71753dfc7dd0e1",
-                "sha256:5c2eaa145bb36b33af1ff2860820ba0589e165be4ab63a49aebfd0981c173b66",
-                "sha256:5d61df4a05476ff891cff0030329fee4088d40e4dc9b013fac01bc3c745542c2",
-                "sha256:5e7007b8d1d09bce37b54111f593d173691c530b80f27c6493b928dabed9e6ef",
-                "sha256:5e8452ad6b2863709f8b3d615955aa0807bc093c34b8e25b3b52097fe421cb7f",
-                "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2",
-                "sha256:6ced70adf03920d4e67c373fd692123e34d3ac81dfa1c27e45904a628567d804",
-                "sha256:73b8870fe1c9a201b8c0d12c94fe781b918664766728783241a79e0468427e4f",
-                "sha256:767a97e6900edd11c762be96d82d13a1d7c4fc4b329f054e88b57cdc21fded94",
-                "sha256:7ccec9e72660b10f8e283e91aa0295975c7bd85c204011d9f5eb69310555cf30",
-                "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e",
-                "sha256:7e889c9df381a2433802991288a61e5a19ceb4f61bd14f5c9fa165655dcb1fd1",
-                "sha256:7f33a92a2fde08e8c6b0c61815521324fc1612f397abf96eed86b8e31618fdb4",
-                "sha256:8a4076a2b3ba5b004b8cffca6afe18a3b2c5c9ef679b4d1e9859cf76295f8d4f",
-                "sha256:8bd1cde83e4684324e6ee19adfc25fd649d04078179890be7b29f76b501de8e4",
-                "sha256:8e57da93e24303a883146510a434f0faf2f1e7e659f3041abc4e3fb3f6702a9f",
-                "sha256:9602044ff047043430452bc3a2089743fa85da829e6fc9ee0025351d66c332b6",
-                "sha256:96264854fedbea933a9ca4b7e0c745728f01380691687b7365d18d9e977179c4",
-                "sha256:9c23fd8d08eb9c2af3faeedc8c56e134acdaf36e2117ee059d7defa655130e5f",
-                "sha256:9d4df95ad522c53f2b9ebc07f12ccd2cb15550941e11a5bbc5ddca2ca56316d7",
-                "sha256:9ea345fda05bae217b6cce2acf3682ce3b13d0d16dd47d0de7080e5e21362421",
-                "sha256:9f26545b9940c4b46f0a9388fd04ee3ad7064c4017b5a334dd450f616396590e",
-                "sha256:a2fd04ae4971b914e54fe459dd7edbbd3f2ba875d69e057d5e3c8e8cac094935",
-                "sha256:a35197013ed929c0aed5c9096de1fc5a9d336914d73ab3f9df14741668c0616c",
-                "sha256:ab2ef72f8605046115bc9aa8e9d14fd49086d405855f40b79ed9e5c1f9f4faea",
-                "sha256:ad2f41203e2808616292db5d7170cccf0c9f9c982d02544443c7eb0296e8b0c7",
-                "sha256:ad8c745ff9460a16b710e58e06a9dec11ebc0d8f4dd82091cefb579844d69868",
-                "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a",
-                "sha256:b2f317d1678002eee6fe85670039fb34a757972284614638f82b903a03feacdc",
-                "sha256:b426495fb9140e75719b3ae70a5e8dd3a79def0ae3c6c27e012fc59f16544a4a",
-                "sha256:b491e42183e8fcc9901d8dcd8ae644ff785590f1727f76ca86e731c61bfe6643",
-                "sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01",
-                "sha256:c1b90407ced992331dd6d4f1355819ea1c274cc1ee4d5b7046c6761f9ec11829",
-                "sha256:c28875e316c7b4c3e745172d882d8a5c835b11018e33432d281211af35794a93",
-                "sha256:cc93a4121d87d9f12739fc8fab0a95f78444e571ed63e40bfc78cd5abe700ac9",
-                "sha256:cdd1bbaf1e61f0d94aced116d6e95fe25942f7a5f42382195fd9501089db5d78",
-                "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508",
-                "sha256:d9e6b0e519067caa4fd7fb72e3e8002d16a68e84e62e7291092a5433763dc0dd",
-                "sha256:e220e7562467dc8d589e31c1acd13438d82c03d7f385c9cd41a3f6d1d15807c1",
-                "sha256:e6d3e32b8753c8d45ac550b11a1090dd66d110d4ef805ffe60fa61495360b3b2",
-                "sha256:e6f3c0a3a1e73e88af384b2e8a0b9f4fb73245afd47589df2afcab6b638fa0e6",
-                "sha256:ea4cf2488156e0f281f93cc2fd365025efcba3e2d217cbe3df2840f8c73db261",
-                "sha256:eab7b040a8a873020113ba814b7db7fa935235e4cbaf8f3da17671baa1024863",
-                "sha256:f0ddc9337a0fb0e727785ad4f41163cc314376e82b31846d3835673786420ef1",
-                "sha256:f2c50bad73ed629cc326cc0f75aed8ecfb013f88c5af116f33df556ed47143eb",
-                "sha256:f414f37b244f2a97e79b98d48c5ff0789a0b4b4609b17d64fa81771ad780e415",
-                "sha256:f8af2ef3b4b652ff109f98087242e2ab974b2b2b496304063585e3d78de0b000",
-                "sha256:f9e6710ebebfce2ba21cee6d91e7452d1125100f41b906fb5af3da8c78b764c1",
-                "sha256:fdb239f47328581e2ec7744ab5911f97afb10752332a6dd3d98e14e429e1a9e7",
-                "sha256:fe7cdd3f7d1df43200e1c80f1aed86bb36033bf65e3c7cf46a2b97a253ef8798"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==3.11.18"
-        },
-        "aiosignal": {
-            "hashes": [
-                "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5",
-                "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==1.3.2"
-        },
         "annotated-types": {
             "hashes": [
                 "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53",
@@ -221,7 +118,7 @@
                 "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87",
                 "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"
             ],
-            "markers": "platform_python_implementation != 'PyPy'",
+            "markers": "python_version >= '3.8'",
             "version": "==1.17.1"
         },
         "charset-normalizer": {
@@ -375,10 +272,9 @@
         },
         "dbrepo": {
             "hashes": [
-                "sha256:5dbd2230489d0af8eb4509b7231764289972e6282037b27e97a3824a5d234090"
+                "sha256:76f0ab97d1e914a779aa51b5e5a17591b2f1c88f15dc9df27273deb4dc7ed125"
             ],
-            "path": "./lib/dbrepo-1.8.2rc6.tar.gz",
-            "version": "==1.8.2rc6"
+            "path": "./lib/dbrepo-1.8.2.tar.gz"
         },
         "flasgger": {
             "hashes": [
@@ -393,6 +289,7 @@
                 "sha256:f69fcd559dc907ed196ab9df0e48471709175e696d6e698dd4dbe940f96ce66b"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8'",
             "version": "==2.3.3"
         },
         "flask-cors": {
@@ -417,124 +314,16 @@
                 "sha256:8085d6757505b6f3291a2638c84d207e8f0ad0de662d1f46aa2f77e658a0c976"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9' and python_version < '4'",
             "version": "==4.7.1"
         },
-        "frozenlist": {
-            "hashes": [
-                "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117",
-                "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2",
-                "sha256:0dbae96c225d584f834b8d3cc688825911960f003a85cb0fd20b6e5512468c42",
-                "sha256:0e6f8653acb82e15e5443dba415fb62a8732b68fe09936bb6d388c725b57f812",
-                "sha256:0f2ca7810b809ed0f1917293050163c7654cefc57a49f337d5cd9de717b8fad3",
-                "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a",
-                "sha256:1255d5d64328c5a0d066ecb0f02034d086537925f1f04b50b1ae60d37afbf572",
-                "sha256:1330f0a4376587face7637dfd245380a57fe21ae8f9d360c1c2ef8746c4195fa",
-                "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b",
-                "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626",
-                "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e",
-                "sha256:1db8b2fc7ee8a940b547a14c10e56560ad3ea6499dc6875c354e2335812f739d",
-                "sha256:2187248203b59625566cac53572ec8c2647a140ee2738b4e36772930377a533c",
-                "sha256:2b8cf4cfea847d6c12af06091561a89740f1f67f331c3fa8623391905e878530",
-                "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878",
-                "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e",
-                "sha256:36d2fc099229f1e4237f563b2a3e0ff7ccebc3999f729067ce4e64a97a7f2869",
-                "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd",
-                "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603",
-                "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606",
-                "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85",
-                "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64",
-                "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f",
-                "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0",
-                "sha256:4da6fc43048b648275a220e3a61c33b7fff65d11bdd6dcb9d9c145ff708b804c",
-                "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4",
-                "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103",
-                "sha256:52021b528f1571f98a7d4258c58aa8d4b1a96d4f01d00d51f1089f2e0323cb02",
-                "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191",
-                "sha256:536a1236065c29980c15c7229fbb830dedf809708c10e159b8136534233545f0",
-                "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e",
-                "sha256:56a0b8dd6d0d3d971c91f1df75e824986667ccce91e20dca2023683814344791",
-                "sha256:5c9e89bf19ca148efcc9e3c44fd4c09d5af85c8a7dd3dbd0da1cb83425ef4983",
-                "sha256:625170a91dd7261a1d1c2a0c1a353c9e55d21cd67d0852185a5fef86587e6f5f",
-                "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff",
-                "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8",
-                "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860",
-                "sha256:69bbd454f0fb23b51cadc9bdba616c9678e4114b6f9fa372d462ff2ed9323ec8",
-                "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25",
-                "sha256:6ef8e7e8f2f3820c5f175d70fdd199b79e417acf6c72c5d0aa8f63c9f721646f",
-                "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba",
-                "sha256:75ecee69073312951244f11b8627e3700ec2bfe07ed24e3a685a5979f0412d24",
-                "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e",
-                "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd",
-                "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911",
-                "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c",
-                "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595",
-                "sha256:7daa508e75613809c7a57136dec4871a21bca3080b3a8fc347c50b187df4f00c",
-                "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc",
-                "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2",
-                "sha256:89ffdb799154fd4d7b85c56d5fa9d9ad48946619e0eb95755723fffa11022d75",
-                "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4",
-                "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0",
-                "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe",
-                "sha256:920b6bd77d209931e4c263223381d63f76828bec574440f29eb497cf3394c249",
-                "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c",
-                "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576",
-                "sha256:9799257237d0479736e2b4c01ff26b5c7f7694ac9692a426cb717f3dc02fff9b",
-                "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770",
-                "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046",
-                "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584",
-                "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497",
-                "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f",
-                "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f",
-                "sha256:aa733d123cc78245e9bb15f29b44ed9e5780dc6867cfc4e544717b91f980af3b",
-                "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f",
-                "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d",
-                "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a",
-                "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e",
-                "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68",
-                "sha256:ba7f8d97152b61f22d7f59491a781ba9b177dd9f318486c5fbc52cde2db12189",
-                "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9",
-                "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8",
-                "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1",
-                "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0",
-                "sha256:c7c608f833897501dac548585312d73a7dca028bf3b8688f0d712b7acfaf7fb3",
-                "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29",
-                "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0",
-                "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215",
-                "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590",
-                "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c",
-                "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821",
-                "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1",
-                "sha256:d3ceb265249fb401702fce3792e6b44c1166b9319737d21495d3611028d95769",
-                "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506",
-                "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3",
-                "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348",
-                "sha256:e19c0fc9f4f030fcae43b4cdec9e8ab83ffe30ec10c79a4a43a04d1af6c5e1ad",
-                "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a",
-                "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad",
-                "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6",
-                "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45",
-                "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188",
-                "sha256:e6e558ea1e47fd6fa8ac9ccdad403e5dd5ecc6ed8dda94343056fa4277d5c65e",
-                "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70",
-                "sha256:ed5e3a4462ff25ca84fb09e0fada8ea267df98a450340ead4c91b44857267d70",
-                "sha256:f1a39819a5a3e84304cd286e3dc62a549fe60985415851b3337b6f5cc91907f1",
-                "sha256:f27a9f9a86dcf00708be82359db8de86b80d029814e6693259befe82bb58a106",
-                "sha256:f2c7d5aa19714b1b01a0f515d078a629e445e667b9da869a3cd0e6fe7dec78bd",
-                "sha256:f3a7bb0fe1f7a70fb5c6f497dc32619db7d2cdd53164af30ade2f34673f8b1fc",
-                "sha256:f4b3cd7334a4bbc0c472164f3744562cb72d05002cc6fcf58adb104630bbc352",
-                "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91",
-                "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1",
-                "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==1.6.0"
-        },
         "grafana-client": {
             "hashes": [
                 "sha256:2477a47b923fd0637947e620b0b777c641af18a3025464fa4505783dbf05dfcc",
                 "sha256:8cb61bb2a87ec07bca10974df276b9a1a95bfdb63f3a696f065692ffc9b8c389"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==4.3.2"
         },
         "gunicorn": {
@@ -543,6 +332,7 @@
                 "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==23.0.0"
         },
         "h11": {
@@ -709,6 +499,7 @@
                 "sha256:61c9170f92e736b530655e75374681d4fcca9cfa8763ab42be57353b2b203494"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.6'",
             "version": "==1.3.1"
         },
         "markupsafe": {
@@ -786,116 +577,6 @@
             "markers": "python_version >= '3.8'",
             "version": "==3.1.3"
         },
-        "multidict": {
-            "hashes": [
-                "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756",
-                "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8",
-                "sha256:0bb8f8302fbc7122033df959e25777b0b7659b1fd6bcb9cb6bed76b5de67afef",
-                "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c",
-                "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5",
-                "sha256:0ee1bf613c448997f73fc4efb4ecebebb1c02268028dd4f11f011f02300cf1e8",
-                "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db",
-                "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713",
-                "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44",
-                "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378",
-                "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5",
-                "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676",
-                "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08",
-                "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea",
-                "sha256:224b79471b4f21169ea25ebc37ed6f058040c578e50ade532e2066562597b8a9",
-                "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9",
-                "sha256:2427370f4a255262928cd14533a70d9738dfacadb7563bc3b7f704cc2360fc4e",
-                "sha256:24a8caa26521b9ad09732972927d7b45b66453e6ebd91a3c6a46d811eeb7349b",
-                "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508",
-                "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1",
-                "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852",
-                "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac",
-                "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde",
-                "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8",
-                "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504",
-                "sha256:32a998bd8a64ca48616eac5a8c1cc4fa38fb244a3facf2eeb14abe186e0f6cc5",
-                "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02",
-                "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4",
-                "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec",
-                "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a",
-                "sha256:3ccdde001578347e877ca4f629450973c510e88e8865d5aefbcb89b852ccc666",
-                "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc",
-                "sha256:3cf62f8e447ea2c1395afa289b332e49e13d07435369b6f4e41f887db65b40bf",
-                "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790",
-                "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8",
-                "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589",
-                "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d",
-                "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07",
-                "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56",
-                "sha256:5427a2679e95a642b7f8b0f761e660c845c8e6fe3141cddd6b62005bd133fc21",
-                "sha256:578568c4ba5f2b8abd956baf8b23790dbfdc953e87d5b110bce343b4a54fc9e7",
-                "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9",
-                "sha256:5e3929269e9d7eff905d6971d8b8c85e7dbc72c18fb99c8eae6fe0a152f2e343",
-                "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9",
-                "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4",
-                "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a",
-                "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427",
-                "sha256:6b5a272bc7c36a2cd1b56ddc6bff02e9ce499f9f14ee4a45c45434ef083f2459",
-                "sha256:6d79cf5c0c6284e90f72123f4a3e4add52d6c6ebb4a9054e88df15b8d08444c6",
-                "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208",
-                "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229",
-                "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0",
-                "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474",
-                "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817",
-                "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd",
-                "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618",
-                "sha256:8b6fcf6054fc4114a27aa865f8840ef3d675f9316e81868e0ad5866184a6cba5",
-                "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3",
-                "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124",
-                "sha256:909f7d43ff8f13d1adccb6a397094adc369d4da794407f8dd592c51cf0eae4b1",
-                "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb",
-                "sha256:99592bd3162e9c664671fd14e578a33bfdba487ea64bcb41d281286d3c870ad7",
-                "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3",
-                "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375",
-                "sha256:9f35de41aec4b323c71f54b0ca461ebf694fb48bec62f65221f52e0017955b39",
-                "sha256:a059ad6b80de5b84b9fa02a39400319e62edd39d210b4e4f8c4f1243bdac4752",
-                "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0",
-                "sha256:a54ec568f1fc7f3c313c2f3b16e5db346bf3660e1309746e7fccbbfded856188",
-                "sha256:a62d78a1c9072949018cdb05d3c533924ef8ac9bcb06cbf96f6d14772c5cd451",
-                "sha256:a7bd27f7ab3204f16967a6f899b3e8e9eb3362c0ab91f2ee659e0345445e0078",
-                "sha256:a7be07e5df178430621c716a63151165684d3e9958f2bbfcb644246162007ab7",
-                "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7",
-                "sha256:abcfed2c4c139f25c2355e180bcc077a7cae91eefbb8b3927bb3f836c9586f1f",
-                "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b",
-                "sha256:ae93e0ff43b6f6892999af64097b18561691ffd835e21a8348a441e256592e1f",
-                "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c",
-                "sha256:b128dbf1c939674a50dd0b28f12c244d90e5015e751a4f339a96c54f7275e291",
-                "sha256:b1b389ae17296dd739015d5ddb222ee99fd66adeae910de21ac950e00979d897",
-                "sha256:b57e28dbc031d13916b946719f213c494a517b442d7b48b29443e79610acd887",
-                "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1",
-                "sha256:b9cb19dfd83d35b6ff24a4022376ea6e45a2beba8ef3f0836b8a4b288b6ad685",
-                "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf",
-                "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6",
-                "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731",
-                "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507",
-                "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b",
-                "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae",
-                "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777",
-                "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7",
-                "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be",
-                "sha256:dd53893675b729a965088aaadd6a1f326a72b83742b056c1065bdd2e2a42b4df",
-                "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054",
-                "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2",
-                "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124",
-                "sha256:eccb67b0e78aa2e38a04c5ecc13bab325a43e5159a181a9d1a6723db913cbb3c",
-                "sha256:edf74dc5e212b8c75165b435c43eb0d5e81b6b300a938a4eb82827119115e840",
-                "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8",
-                "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd",
-                "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8",
-                "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3",
-                "sha256:f92c7f62d59373cd93bc9969d2da9b4b21f78283b1379ba012f7ee8127b3152e",
-                "sha256:fb6214fe1750adc2a1b801a199d64b5a67671bf76ebf24c730b157846d0e90d2",
-                "sha256:fbd8d737867912b6c5f99f56782b8cb81f978a97b4437a1c476de90a3e41c9a1",
-                "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==6.4.3"
-        },
         "niquests": {
             "hashes": [
                 "sha256:68e0a7e9f338466b3606945fffd11f75e3c90af7498aa9336ef03812323b7e36",
@@ -962,7 +643,7 @@
                 "sha256:ee461a4eaab4f165b68780a6a1af95fb23a29932be7569b9fab666c407969051",
                 "sha256:f5045039100ed58fa817a6227a356240ea1b9a1bc141018864c306c1a16d4175"
             ],
-            "markers": "python_version == '3.11'",
+            "markers": "python_version >= '3.10'",
             "version": "==2.2.5"
         },
         "packaging": {
@@ -1053,110 +734,6 @@
             "index": "pypi",
             "version": "==0.23.2"
         },
-        "propcache": {
-            "hashes": [
-                "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e",
-                "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b",
-                "sha256:069e7212890b0bcf9b2be0a03afb0c2d5161d91e1bf51569a64f629acc7defbf",
-                "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b",
-                "sha256:0c3c3a203c375b08fd06a20da3cf7aac293b834b6f4f4db71190e8422750cca5",
-                "sha256:0c86e7ceea56376216eba345aa1fc6a8a6b27ac236181f840d1d7e6a1ea9ba5c",
-                "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c",
-                "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a",
-                "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf",
-                "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8",
-                "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5",
-                "sha256:1f6cc0ad7b4560e5637eb2c994e97b4fa41ba8226069c9277eb5ea7101845b42",
-                "sha256:27c6ac6aa9fc7bc662f594ef380707494cb42c22786a558d95fcdedb9aa5d035",
-                "sha256:2d219b0dbabe75e15e581fc1ae796109b07c8ba7d25b9ae8d650da582bed01b0",
-                "sha256:2fce1df66915909ff6c824bbb5eb403d2d15f98f1518e583074671a30fe0c21e",
-                "sha256:319fa8765bfd6a265e5fa661547556da381e53274bc05094fc9ea50da51bfd46",
-                "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d",
-                "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24",
-                "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d",
-                "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de",
-                "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf",
-                "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7",
-                "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371",
-                "sha256:47ef24aa6511e388e9894ec16f0fbf3313a53ee68402bc428744a367ec55b833",
-                "sha256:4cf9e93a81979f1424f1a3d155213dc928f1069d697e4353edb8a5eba67c6259",
-                "sha256:4d0dfdd9a2ebc77b869a0b04423591ea8823f791293b527dc1bb896c1d6f1136",
-                "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25",
-                "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005",
-                "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef",
-                "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7",
-                "sha256:5b9145c35cc87313b5fd480144f8078716007656093d23059e8993d3a8fa730f",
-                "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53",
-                "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0",
-                "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb",
-                "sha256:603f1fe4144420374f1a69b907494c3acbc867a581c2d49d4175b0de7cc64566",
-                "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a",
-                "sha256:64a956dff37080b352c1c40b2966b09defb014347043e740d420ca1eb7c9b908",
-                "sha256:668ddddc9f3075af019f784456267eb504cb77c2c4bd46cc8402d723b4d200bf",
-                "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458",
-                "sha256:6f173bbfe976105aaa890b712d1759de339d8a7cef2fc0a1714cc1a1e1c47f64",
-                "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9",
-                "sha256:730178f476ef03d3d4d255f0c9fa186cb1d13fd33ffe89d39f2cda4da90ceb71",
-                "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b",
-                "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5",
-                "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037",
-                "sha256:82de5da8c8893056603ac2d6a89eb8b4df49abf1a7c19d536984c8dd63f481d5",
-                "sha256:83be47aa4e35b87c106fc0c84c0fc069d3f9b9b06d3c494cd404ec6747544894",
-                "sha256:8638f99dca15b9dff328fb6273e09f03d1c50d9b6512f3b65a4154588a7595fe",
-                "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757",
-                "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3",
-                "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976",
-                "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6",
-                "sha256:916cd229b0150129d645ec51614d38129ee74c03293a9f3f17537be0029a9641",
-                "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7",
-                "sha256:967a8eec513dbe08330f10137eacb427b2ca52118769e82ebcfcab0fba92a649",
-                "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120",
-                "sha256:9979643ffc69b799d50d3a7b72b5164a2e97e117009d7af6dfdd2ab906cb72cd",
-                "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40",
-                "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e",
-                "sha256:9e64e948ab41411958670f1093c0a57acfdc3bee5cf5b935671bbd5313bcf229",
-                "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c",
-                "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7",
-                "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111",
-                "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654",
-                "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f",
-                "sha256:a461959ead5b38e2581998700b26346b78cd98540b5524796c175722f18b0294",
-                "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da",
-                "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f",
-                "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7",
-                "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0",
-                "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073",
-                "sha256:b303b194c2e6f171cfddf8b8ba30baefccf03d36a4d9cab7fd0bb68ba476a3d7",
-                "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11",
-                "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f",
-                "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27",
-                "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70",
-                "sha256:c66d8ccbc902ad548312b96ed8d5d266d0d2c6d006fd0f66323e9d8f2dd49be7",
-                "sha256:cd6a55f65241c551eb53f8cf4d2f4af33512c39da5d9777694e9d9c60872f519",
-                "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5",
-                "sha256:d4e89cde74154c7b5957f87a355bb9c8ec929c167b59c83d90654ea36aeb6180",
-                "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f",
-                "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee",
-                "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18",
-                "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815",
-                "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e",
-                "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a",
-                "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7",
-                "sha256:ed5f6d2edbf349bd8d630e81f474d33d6ae5d07760c44d33cd808e2f5c8f4ae6",
-                "sha256:ef2e4e91fb3945769e14ce82ed53007195e616a63aa43b40fb7ebaaf907c8d4c",
-                "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc",
-                "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8",
-                "sha256:f27785888d2fdd918bc36de8b8739f2d6c791399552333721b58193f68ea3e98",
-                "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256",
-                "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5",
-                "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744",
-                "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723",
-                "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277",
-                "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==0.3.1"
-        },
         "pycparser": {
             "hashes": [
                 "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6",
@@ -1171,6 +748,7 @@
                 "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==2.11.4"
         },
         "pydantic-core": {
@@ -1292,6 +870,7 @@
                 "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8'",
             "version": "==8.3.5"
         },
         "python-dateutil": {
@@ -1308,6 +887,7 @@
                 "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==1.1.0"
         },
         "pytz": {
@@ -1474,7 +1054,7 @@
                 "sha256:fa1bf4d9838e4c8cdf309500a908fc412cdc325a63e5c74ad88a794bed16c943",
                 "sha256:fcdd2f6b1b1500bde96b442d777a563eadca1b825db0c42ac6aef45ad9ec3c4d"
             ],
-            "markers": "(platform_python_implementation != 'CPython' or python_full_version > '3.7.10') and (platform_system == 'Darwin' or platform_system == 'Windows' or platform_system == 'Linux') and (platform_machine == 'x86_64' or platform_machine == 's390x' or platform_machine == 'armv7l' or platform_machine == 'ppc64le' or platform_machine == 'ppc64' or platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'arm64' or platform_machine == 'ARM64' or platform_machine == 'x86' or platform_machine == 'i686') and (platform_python_implementation == 'CPython' or (platform_python_implementation == 'PyPy' and python_version < '3.12'))",
+            "markers": "python_version >= '3.7'",
             "version": "==1.5.1"
         },
         "referencing": {
@@ -1621,22 +1201,6 @@
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
             "version": "==1.17.0"
         },
-        "tinydb": {
-            "hashes": [
-                "sha256:f7dfc39b8d7fda7a1ca62a8dbb449ffd340a117c1206b68c50b1a481fb95181d",
-                "sha256:f97030ee5cbc91eeadd1d7af07ab0e48ceb04aa63d4a983adbaca4cba16e86c3"
-            ],
-            "markers": "python_version >= '3.8' and python_version < '4.0'",
-            "version": "==4.8.2"
-        },
-        "tuspy": {
-            "hashes": [
-                "sha256:156734eac5c61a046cfecd70f14119f05be92cce198eb5a1a99a664482bedb89",
-                "sha256:7fc5ac8fb25de37c96c90213f83a1ffdede7f48a471cb5a15a2f57846828a79a"
-            ],
-            "markers": "python_full_version >= '3.5.3'",
-            "version": "==1.1.0"
-        },
         "typing-extensions": {
             "hashes": [
                 "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c",
@@ -1671,11 +1235,11 @@
         },
         "urllib3-future": {
             "hashes": [
-                "sha256:ce90c1ef08b265eccf29676f759a3a30a36b6ccc8a9e97d3473ea4b26f586d52",
-                "sha256:f341b1ff506c0c7f92cf3d98bd6683b398cad24b62e0277ce6f386222b85951a"
+                "sha256:642b235a89cbddb7a3c6703a11fd0255473231be791214fd01abd465371ea8fb",
+                "sha256:a4f2a94da920f62f4c957931d3a1cc364efdd0fbb984624db7ad7347aa27afad"
             ],
             "markers": "python_version >= '3.7'",
-            "version": "==2.12.919"
+            "version": "==2.12.920"
         },
         "verlib2": {
             "hashes": [
@@ -1788,116 +1352,6 @@
             ],
             "markers": "python_version >= '3.9'",
             "version": "==3.1.3"
-        },
-        "yarl": {
-            "hashes": [
-                "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9",
-                "sha256:04d9c7a1dc0a26efb33e1acb56c8849bd57a693b85f44774356c92d610369efa",
-                "sha256:06d06c9d5b5bc3eb56542ceeba6658d31f54cf401e8468512447834856fb0e61",
-                "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2",
-                "sha256:083ce0393ea173cd37834eb84df15b6853b555d20c52703e21fbababa8c129d2",
-                "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33",
-                "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902",
-                "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2",
-                "sha256:119bca25e63a7725b0c9d20ac67ca6d98fa40e5a894bd5d4686010ff73397914",
-                "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0",
-                "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0",
-                "sha256:1a06701b647c9939d7019acdfa7ebbfbb78ba6aa05985bb195ad716ea759a569",
-                "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f",
-                "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7",
-                "sha256:27359776bc359ee6eaefe40cb19060238f31228799e43ebd3884e9c589e63b20",
-                "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00",
-                "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1",
-                "sha256:35d20fb919546995f1d8c9e41f485febd266f60e55383090010f272aca93edcc",
-                "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f",
-                "sha256:3b4e88d6c3c8672f45a30867817e4537df1bbc6f882a91581faf1f6d9f0f1b5a",
-                "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd",
-                "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c",
-                "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f",
-                "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5",
-                "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d",
-                "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501",
-                "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3",
-                "sha256:44869ee8538208fe5d9342ed62c11cc6a7a1af1b3d0bb79bb795101b6e77f6e0",
-                "sha256:484e7a08f72683c0f160270566b4395ea5412b4359772b98659921411d32ad26",
-                "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2",
-                "sha256:4ba5e59f14bfe8d261a654278a0f6364feef64a794bd456a8c9e823071e5061c",
-                "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c",
-                "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae",
-                "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de",
-                "sha256:4f1a350a652bbbe12f666109fbddfdf049b3ff43696d18c9ab1531fbba1c977a",
-                "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe",
-                "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8",
-                "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124",
-                "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb",
-                "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc",
-                "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2",
-                "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac",
-                "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307",
-                "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58",
-                "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e",
-                "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e",
-                "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62",
-                "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b",
-                "sha256:7595498d085becc8fb9203aa314b136ab0516c7abd97e7d74f7bb4eb95042abe",
-                "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda",
-                "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5",
-                "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64",
-                "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229",
-                "sha256:85a231fa250dfa3308f3c7896cc007a47bc76e9e8e8595c20b7426cac4884c62",
-                "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6",
-                "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d",
-                "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791",
-                "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672",
-                "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb",
-                "sha256:8d8a3d54a090e0fff5837cd3cc305dd8a07d3435a088ddb1f65e33b322f66a94",
-                "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a",
-                "sha256:95b50910e496567434cb77a577493c26bce0f31c8a305135f3bda6a2483b8e10",
-                "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e",
-                "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9",
-                "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5",
-                "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da",
-                "sha256:a884b8974729e3899d9287df46f015ce53f7282d8d3340fa0ed57536b440621c",
-                "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a",
-                "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d",
-                "sha256:af5607159085dcdb055d5678fc2d34949bd75ae6ea6b4381e784bbab1c3aa195",
-                "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594",
-                "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8",
-                "sha256:b594113a301ad537766b4e16a5a6750fcbb1497dcc1bc8a4daae889e6402a634",
-                "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051",
-                "sha256:b7fa0cb9fd27ffb1211cde944b41f5c67ab1c13a13ebafe470b1e206b8459da8",
-                "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e",
-                "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384",
-                "sha256:bc906b636239631d42eb8a07df8359905da02704a868983265603887ed68c076",
-                "sha256:bdb77efde644d6f1ad27be8a5d67c10b7f769804fff7a966ccb1da5a4de4b656",
-                "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018",
-                "sha256:c27d98f4e5c4060582f44e58309c1e55134880558f1add7a87c1bc36ecfade19",
-                "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a",
-                "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4",
-                "sha256:ce360ae48a5e9961d0c730cf891d40698a82804e85f6e74658fb175207a77cb2",
-                "sha256:d0bf955b96ea44ad914bc792c26a0edcd71b4668b93cbcd60f5b0aeaaed06c64",
-                "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145",
-                "sha256:d4fad6e5189c847820288286732075f213eabf81be4d08d6cc309912e62be5b7",
-                "sha256:d88cc43e923f324203f6ec14434fa33b85c06d18d59c167a0637164863b8e995",
-                "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6",
-                "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f",
-                "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f",
-                "sha256:e52d6ed9ea8fd3abf4031325dc714aed5afcbfa19ee4a89898d663c9976eb487",
-                "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9",
-                "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a",
-                "sha256:f0cf05ae2d3d87a8c9022f3885ac6dea2b751aefd66a4f200e408a61ae9b7f0d",
-                "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f",
-                "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1",
-                "sha256:f1f6670b9ae3daedb325fa55fbe31c22c8228f6e0b513772c2e1c623caa6ab22",
-                "sha256:f4d3fa9b9f013f7050326e165c3279e22850d02ae544ace285674cb6174b5d6d",
-                "sha256:f8d8aa8dd89ffb9a831fedbcb27d00ffd9f4842107d52dc9d57e64cb34073d5c",
-                "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877",
-                "sha256:faa709b66ae0e24c8e5134033187a972d849d87ed0a12a0366bedcc6b5dc14a5",
-                "sha256:fb0caeac4a164aadce342f1597297ec0ce261ec4532bbc5a9ca8da5622f53867",
-                "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==1.20.0"
         }
     },
     "develop": {
@@ -2074,6 +1528,7 @@
                 "sha256:fa260de59dfb143af06dcf30c2be0b200bed2a73737a8a59248fcb9fa601ef0f"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==7.8.0"
         },
         "docker": {
@@ -2122,6 +1577,7 @@
                 "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8'",
             "version": "==8.3.5"
         },
         "python-dotenv": {
@@ -2130,6 +1586,7 @@
                 "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==1.1.0"
         },
         "requests": {
@@ -2146,6 +1603,7 @@
                 "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.5'",
             "version": "==1.12.1"
         },
         "testcontainers": {
@@ -2154,6 +1612,7 @@
                 "sha256:31ed1a81238c7e131a2a29df6db8f23717d892b592fa5a1977fd0dcd0c23fc23"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9' and python_version < '4.0'",
             "version": "==4.10.0"
         },
         "typing-extensions": {
diff --git a/dbrepo-dashboard-service/app.py b/dbrepo-dashboard-service/app.py
index fafca139f43f7763a3757a4a33c24c31a3456c0c..8e4fb0e8ccd9c8bc01c5c557f616f2b28e7afd55 100644
--- a/dbrepo-dashboard-service/app.py
+++ b/dbrepo-dashboard-service/app.py
@@ -29,17 +29,32 @@ dictConfig({
             'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
         },
         'simple': {
-            'format': '[%(asctime)s] %(levelname)s: %(message)s',
+            'format': '[%(asctime)s] [%(levelname)s] %(message)s',
+        },
+        'ecs': {
+            'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "dashboard-service", "service_version": "1.8.2"}',
+            'datefmt': '%Y-%m-%dT%H:%M:%S'
+        },
+    },
+    'handlers': {
+        'wsgi': {
+            'class': 'logging.StreamHandler',
+            'stream': 'ext://flask.logging.wsgi_errors_stream',
+            'formatter': 'simple'
+        },
+        'file': {
+            'class': 'logging.handlers.TimedRotatingFileHandler',
+            'formatter': 'ecs',
+            'filename': '/var/log/app/service/dashboard/app.log',
+            'when': 'm',
+            'interval': 1,
+            'backupCount': 5,
+            'encoding': 'utf8'
         },
     },
-    'handlers': {'wsgi': {
-        'class': 'logging.StreamHandler',
-        'stream': 'ext://flask.logging.wsgi_errors_stream',
-        'formatter': 'simple'  # default
-    }},
     'root': {
         'level': 'DEBUG',
-        'handlers': ['wsgi']
+        'handlers': ['wsgi', 'file']
     }
 })
 
@@ -60,8 +75,8 @@ swagger_config = {
     "headers": [],
     "specs": [
         {
-            "endpoint": "api-dashboard",
-            "route": "/api-dashboard.json",
+            "endpoint": "api-docs",
+            "route": "/api-docs.json",
             "rule_filter": lambda rule: True,
             "model_filter": lambda tag: True,  # all in
         }
@@ -191,7 +206,7 @@ def health():
 
 @app.route("/api/dashboard", methods=["POST"], endpoint="create_dashboard")
 @metrics.gauge(name='dbrepo_create_dashboard', description='Time needed to create dashboard')
-@swag_from("ds-yml/create_dashboard.yml")
+@swag_from("/app/ds-yml/create_dashboard.yml")
 @auth.login_required(role=['system'])
 def create_dashboard():
     for parameter in [param for param in ['is_public', 'is_schema_public', 'owner_username', 'database_name'] if
@@ -220,14 +235,14 @@ def create_dashboard():
 
 @app.route("/api/dashboard/<string:uid>", methods=["PUT"], endpoint="update_dashboard")
 @metrics.gauge(name='dbrepo_update_dashboard', description='Time needed to update dashboard')
-@swag_from("ds-yml/update_dashboard.yml")
+@swag_from("/app/ds-yml/update_dashboard.yml")
 @auth.login_required(role=['system'])
 def update_dashboard(uid: str):
     logging.debug(f'endpoint update dashboard, uid={uid}')
     try:
         database = Database.model_validate(request.json)
     except ValidationError as e:
-        logging.error(f'Model malformed: {e}')
+        logging.error(f'Model malformed: {str(e).strip()}')
         return Response(ApiError(status='BAD_REQUEST', message='Invalid database format',
                                  code='error.database.malformed').model_dump_json(), 400, headers)
     try:
diff --git a/dbrepo-dashboard-service/init.Dockerfile b/dbrepo-dashboard-service/init.Dockerfile
index 4d00c467cd4621e894c456e4a7325d87108ccfb3..a7f6beecd2cc19ca3ac47f99769f8c48f3be4a33 100644
--- a/dbrepo-dashboard-service/init.Dockerfile
+++ b/dbrepo-dashboard-service/init.Dockerfile
@@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001
 
 WORKDIR /app
 
+RUN mkdir -p /var/log/app/service/dashboard && \
+    chown -R 1001:1001 /var/log/app
+
 USER 1001
 
 COPY --chown=1001 ./init.py ./init.py
diff --git a/dbrepo-dashboard-service/init.py b/dbrepo-dashboard-service/init.py
index 54c01f55ebc063e0b97a4ce799ba4d529e1a5627..7c7a585b0a179a88bcd1a9334f1257ae0a64901b 100644
--- a/dbrepo-dashboard-service/init.py
+++ b/dbrepo-dashboard-service/init.py
@@ -18,17 +18,32 @@ dictConfig({
             'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
         },
         'simple': {
-            'format': '[%(asctime)s] %(levelname)s: %(message)s',
+            'format': '[%(asctime)s] [%(levelname)s] %(message)s',
+        },
+        'ecs': {
+            'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "dashboard-service-init", "service_version": "1.8.2"}',
+            'datefmt': '%Y-%m-%dT%H:%M:%S'
+        },
+    },
+    'handlers': {
+        'wsgi': {
+            'class': 'logging.StreamHandler',
+            'stream': 'ext://flask.logging.wsgi_errors_stream',
+            'formatter': 'simple'
+        },
+        'file': {
+            'class': 'logging.handlers.TimedRotatingFileHandler',
+            'formatter': 'ecs',
+            'filename': '/var/log/app/service/dashboard/init.log',
+            'when': 'm',
+            'interval': 1,
+            'backupCount': 5,
+            'encoding': 'utf8'
         },
     },
-    'handlers': {'wsgi': {
-        'class': 'logging.StreamHandler',
-        'stream': 'ext://flask.logging.wsgi_errors_stream',
-        'formatter': 'simple'  # default
-    }},
     'root': {
         'level': 'DEBUG',
-        'handlers': ['wsgi']
+        'handlers': ['wsgi', 'file']
     }
 })
 
diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2-py3-none-any.whl b/dbrepo-dashboard-service/lib/dbrepo-1.8.2-py3-none-any.whl
index 6a21f512b36f30367f641061c8efeba90108a6c7..48beeb5ebf61c7cca654e0ee66343fac70bb4d53 100644
Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.2-py3-none-any.whl and b/dbrepo-dashboard-service/lib/dbrepo-1.8.2-py3-none-any.whl differ
diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.8.2.tar.gz
index f98a45d02b802376ff7614c008eec8783f281896..3e3b65b6b93a602ee26c2f4d4c71c2d3cd331211 100644
Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.2.tar.gz and b/dbrepo-dashboard-service/lib/dbrepo-1.8.2.tar.gz differ
diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl
deleted file mode 100644
index 86a1af2af41c44d35a4da7a472c180854f0cd82c..0000000000000000000000000000000000000000
Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl and /dev/null differ
diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc3.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc3.tar.gz
deleted file mode 100644
index 9c03ed275c6da5b2eef3619c59269f398d59c7de..0000000000000000000000000000000000000000
Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc3.tar.gz and /dev/null differ
diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl
deleted file mode 100644
index 5a0dbc7c95592f2e70bed13fa33d85cc6cdf7811..0000000000000000000000000000000000000000
Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl and /dev/null differ
diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc4.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc4.tar.gz
deleted file mode 100644
index 1dbc78c989362d4d0c3750b1ad942abe46f205dd..0000000000000000000000000000000000000000
Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc4.tar.gz and /dev/null differ
diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl
deleted file mode 100644
index 50bf1b8195987f6f8d23a36f34bc0f912b6fd9b3..0000000000000000000000000000000000000000
Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl and /dev/null differ
diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc5.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc5.tar.gz
deleted file mode 100644
index be8784437f111e2d4a5cdac36baf77605114dfa5..0000000000000000000000000000000000000000
Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc5.tar.gz and /dev/null differ
diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl
deleted file mode 100644
index 8e4c745a2ce782c174d5e1db7eef22d51d26624c..0000000000000000000000000000000000000000
Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl and /dev/null differ
diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc6.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc6.tar.gz
deleted file mode 100644
index 279243fd37fe033fe4aa740361b5e9a370516924..0000000000000000000000000000000000000000
Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.2rc6.tar.gz and /dev/null differ
diff --git a/dbrepo-dashboard-ui/dashboards/System/dbrepo.json b/dbrepo-dashboard-ui/dashboards/System/dbrepo.json
index ca75b2fffe9345b8a4c9fecd825e027377932909..dc3d570df03df3c485aa9ed64caadaf2b1e75c03 100644
--- a/dbrepo-dashboard-ui/dashboards/System/dbrepo.json
+++ b/dbrepo-dashboard-ui/dashboards/System/dbrepo.json
@@ -18,7 +18,7 @@
   "editable": true,
   "fiscalYearStartMonth": 0,
   "graphTooltip": 1,
-  "id": 3,
+  "id": 4,
   "links": [
     {
       "asDropdown": false,
@@ -112,7 +112,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -182,7 +182,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -250,7 +250,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -318,7 +318,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -434,7 +434,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -510,7 +510,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -604,7 +604,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -699,7 +699,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -781,7 +781,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -859,7 +859,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -933,7 +933,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1005,7 +1005,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1094,7 +1094,7 @@
         "sizing": "auto",
         "valueMode": "color"
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1197,7 +1197,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1284,7 +1284,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1358,7 +1358,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1440,7 +1440,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1522,7 +1522,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1604,7 +1604,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1735,7 +1735,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1829,7 +1829,7 @@
         "sizing": "auto",
         "valueMode": "color"
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1946,7 +1946,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -2108,7 +2108,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -2269,7 +2269,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -2400,7 +2400,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -2418,13 +2418,385 @@
       "title": "Failed API Requests",
       "type": "timeseries"
     },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "fixed"
+          },
+          "custom": {
+            "axisBorderShow": false,
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
+            "axisLabel": "Count",
+            "axisPlacement": "auto",
+            "fillOpacity": 80,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          }
+        },
+        "overrides": [
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "200"
+            },
+            "properties": [
+              {
+                "id": "color",
+                "value": {
+                  "fixedColor": "green",
+                  "mode": "fixed"
+                }
+              },
+              {
+                "id": "displayName",
+                "value": "200s"
+              }
+            ]
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "300"
+            },
+            "properties": [
+              {
+                "id": "color",
+                "value": {
+                  "fixedColor": "purple",
+                  "mode": "fixed"
+                }
+              },
+              {
+                "id": "displayName",
+                "value": "300s"
+              }
+            ]
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "400"
+            },
+            "properties": [
+              {
+                "id": "color",
+                "value": {
+                  "fixedColor": "orange",
+                  "mode": "fixed"
+                }
+              },
+              {
+                "id": "displayName",
+                "value": "400s"
+              }
+            ]
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "500"
+            },
+            "properties": [
+              {
+                "id": "color",
+                "value": {
+                  "fixedColor": "red",
+                  "mode": "fixed"
+                }
+              },
+              {
+                "id": "displayName",
+                "value": "500s"
+              }
+            ]
+          }
+        ]
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 12,
+        "x": 0,
+        "y": 48
+      },
+      "id": 43,
+      "options": {
+        "barRadius": 0,
+        "barWidth": 0.97,
+        "fullHighlight": false,
+        "groupWidth": 0.7,
+        "legend": {
+          "calcs": [],
+          "displayMode": "list",
+          "placement": "right",
+          "showLegend": true
+        },
+        "orientation": "auto",
+        "showValue": "auto",
+        "stacking": "normal",
+        "tooltip": {
+          "hideZeros": false,
+          "mode": "multi",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 0,
+        "xTickLabelSpacing": 100
+      },
+      "pluginVersion": "11.3.1",
+      "targets": [
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "status: (>=200 AND <300)",
+          "queryType": "lucene",
+          "refId": "200",
+          "timeField": "@timestamp"
+        },
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "status: (>=300 AND <400)",
+          "queryType": "lucene",
+          "refId": "300",
+          "timeField": "@timestamp"
+        },
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "status: (>=400 AND <500)",
+          "queryType": "lucene",
+          "refId": "400",
+          "timeField": "@timestamp"
+        },
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "status: >=500",
+          "queryType": "lucene",
+          "refId": "500",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "HTTP Status Codes over Time",
+      "type": "barchart"
+    },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "fieldConfig": {
+        "defaults": {},
+        "overrides": [
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "200"
+            },
+            "properties": []
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "300"
+            },
+            "properties": []
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "400"
+            },
+            "properties": []
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "500"
+            },
+            "properties": []
+          }
+        ]
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 12,
+        "x": 12,
+        "y": 48
+      },
+      "id": 44,
+      "options": {
+        "dedupStrategy": "none",
+        "enableLogDetails": true,
+        "prettifyLogMessage": false,
+        "showCommonLabels": false,
+        "showLabels": false,
+        "showTime": false,
+        "sortOrder": "Descending",
+        "wrapLogMessage": false
+      },
+      "pluginVersion": "11.3.1",
+      "targets": [
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Logs",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "logs"
+            }
+          ],
+          "query": "status: >=400",
+          "queryType": "lucene",
+          "refId": "ERROR",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "REST API Errors",
+      "type": "logs"
+    },
     {
       "collapsed": false,
       "gridPos": {
         "h": 1,
         "w": 24,
         "x": 0,
-        "y": 48
+        "y": 56
       },
       "id": 39,
       "panels": [],
@@ -2496,7 +2868,7 @@
         "h": 8,
         "w": 12,
         "x": 0,
-        "y": 49
+        "y": 57
       },
       "id": 41,
       "options": {
@@ -2513,7 +2885,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -2607,7 +2979,7 @@
         "h": 8,
         "w": 12,
         "x": 12,
-        "y": 49
+        "y": 57
       },
       "id": 42,
       "options": {
@@ -2624,7 +2996,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -2671,13 +3043,13 @@
     "list": []
   },
   "time": {
-    "from": "now-24h",
+    "from": "now-3h",
     "to": "now"
   },
   "timepicker": {},
   "timezone": "browser",
   "title": "DBRepo",
   "uid": "bdz20owu8zn5se",
-  "version": 9,
+  "version": 1,
   "weekStart": ""
 }
\ No newline at end of file
diff --git a/dbrepo-dashboard-ui/dashboards/System/keycloak.json b/dbrepo-dashboard-ui/dashboards/System/keycloak.json
index 7c2115a8ecc143851275d456d4c954bdd881f5b2..aa5e2a8c572b6a5273bb9c89c908b3adff857dfa 100644
--- a/dbrepo-dashboard-ui/dashboards/System/keycloak.json
+++ b/dbrepo-dashboard-ui/dashboards/System/keycloak.json
@@ -2342,7 +2342,7 @@
   "refresh": "5m",
   "schemaVersion": 26,
   "style": "dark",
-  "tags": [],
+  "tags": ["provisioned", "auth"],
   "templating": {
     "list": [
       {
@@ -2357,7 +2357,7 @@
     ]
   },
   "time": {
-    "from": "now-24h",
+    "from": "now-3h",
     "to": "now"
   },
   "timepicker": {
@@ -2386,7 +2386,7 @@
     ]
   },
   "timezone": "",
-  "title": "Keycloak Metrics Dashboard",
+  "title": "Keycloak - Overview",
   "uid": "keycloak-dashboard",
   "version": 6,
   "description": "Dashboard of Keycloak metrics exported with Keycloak Metrics SPI\r\n\r\nhttps://github.com/aerogear/keycloak-metrics-spi"
diff --git a/dbrepo-dashboard-ui/dashboards/System/mariadb.json b/dbrepo-dashboard-ui/dashboards/System/mariadb.json
index 3402ae51ddf74df0ea9d17da64719dcb8df7431c..b6297de19c2dcd0c179c49a8c616ab2f230caf6b 100644
--- a/dbrepo-dashboard-ui/dashboards/System/mariadb.json
+++ b/dbrepo-dashboard-ui/dashboards/System/mariadb.json
@@ -1366,12 +1366,12 @@
     ]
   },
   "time": {
-    "from": "now-24h",
+    "from": "now-3h",
     "to": "now"
   },
   "timepicker": {},
   "timezone": "",
-  "title": "Galera/MariaDB - Overview",
+  "title": "MariaDB Galera - Overview",
   "uid": "pXgz0qFGk",
   "version": 2
 }
\ No newline at end of file
diff --git a/dbrepo-dashboard-ui/dashboards/System/rabbitmq.json b/dbrepo-dashboard-ui/dashboards/System/rabbitmq.json
index 99d810c39226c30aa8aa6e834971c67ef2a1ce1d..fbaaf04ba0f7b32f7da9a10ac3edbafab23f273a 100644
--- a/dbrepo-dashboard-ui/dashboards/System/rabbitmq.json
+++ b/dbrepo-dashboard-ui/dashboards/System/rabbitmq.json
@@ -8133,7 +8133,7 @@
     ]
   },
   "time": {
-    "from": "now-24h",
+    "from": "now-3h",
     "to": "now"
   },
   "timepicker": {
diff --git a/dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml b/dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3b26f0a4746712c597b90799f5004aab23d31b51
--- /dev/null
+++ b/dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml
@@ -0,0 +1,14 @@
+apiVersion: 1
+
+datasources:
+  - name: dbrepo-opensearch
+    uid: dbrepoopensearch0
+    type: grafana-opensearch-datasource
+    basicAuth: false
+    url: http://search-db:9200
+    jsonData:
+      flavor: "opensearch"
+      logLevelField: "level"
+      logMessageField: "message"
+      timeField: "@timestamp"
+      version: "2.19.0"
diff --git a/dbrepo-data-service/Dockerfile b/dbrepo-data-service/Dockerfile
index ca40f6557fe378cd28bc76cde6fd96d59bffb8e1..32cdfc7d7a8b0f5b463012b22fe00591d7018f7f 100644
--- a/dbrepo-data-service/Dockerfile
+++ b/dbrepo-data-service/Dockerfile
@@ -26,6 +26,9 @@ RUN apk --no-cache add \
 
 WORKDIR /app
 
+RUN mkdir -p /var/log/app/service/data && \
+    chown -R 1001:1001 /var/log/app/service/data
+
 RUN adduser -D dbrepo --uid 1001 && \
     chown -R 1001:1001 /app
 
diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml
index 66a1e9d56a6b5c1ac64014fd0ff6b1d45bedd548..948ef796727fe72b26e26efbcd0c16b4ca13c2b7 100644
--- a/dbrepo-data-service/pom.xml
+++ b/dbrepo-data-service/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>3.3.5</version>
+        <version>3.4.0</version>
     </parent>
 
     <organization>
@@ -239,6 +239,13 @@
             <artifactId>amqp-client</artifactId>
             <version>${rabbitmq.version}</version>
         </dependency>
+        <!-- Api -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>${lombok.version}</version>
+            <scope>provided</scope>
+        </dependency>
         <!-- Testing -->
         <dependency>
             <groupId>org.springframework</groupId>
diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/SubsetEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/SubsetEndpoint.java
index 8c3656b0cd603f69946a8c69c6b02ff887ede6ad..bf48f8f25a248b16944cdd5009f1dfa292f942db 100644
--- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/SubsetEndpoint.java
+++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/SubsetEndpoint.java
@@ -86,7 +86,7 @@ public class SubsetEndpoint extends RestEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "404",
-                    description = "Failed to find database in metadata database or query in query store of the data database",
+                    description = "Failed to find database or user in metadata database or query in query store of the data database",
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
@@ -100,7 +100,7 @@ public class SubsetEndpoint extends RestEndpoint {
                                                @RequestParam(name = "persisted", required = false) Boolean filterPersisted,
                                                Principal principal)
             throws DatabaseUnavailableException, DatabaseNotFoundException, RemoteUnavailableException,
-            QueryNotFoundException, NotAllowedException, MetadataServiceException {
+            QueryNotFoundException, NotAllowedException, MetadataServiceException, UserNotFoundException {
         log.debug("endpoint find subsets in database, databaseId={}, filterPersisted={}", databaseId, filterPersisted);
         final DatabaseDto database = cacheService.getDatabase(databaseId);
         if (!database.getIsPublic()) {
diff --git a/dbrepo-data-service/rest-service/src/main/resources/application.yml b/dbrepo-data-service/rest-service/src/main/resources/application.yml
index d8dec2e455c0d5fb199207deb3fe3ff3dc7fd21f..70ad1bde9ca32afd7106597922e5be6d3bee637e 100644
--- a/dbrepo-data-service/rest-service/src/main/resources/application.yml
+++ b/dbrepo-data-service/rest-service/src/main/resources/application.yml
@@ -48,11 +48,17 @@ server:
   tomcat:
     max-swallow-size: -1
 logging:
-  pattern.console: "%d %highlight(%-5level) %msg%n"
+  file:
+    name: /var/log/app/service/data/app.log
   level:
     root: warn
     at.ac.tuwien.ifs.dbrepo.: "${LOG_LEVEL:info}"
     org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug
+  pattern:
+    console: "%d %highlight(%-5level) %msg%n"
+  structured:
+    format:
+      file: ecs
 dbrepo:
   endpoints:
     metadataService: "${METADATA_SERVICE_ENDPOINT:http://metadata-service:8080}"
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/AccessEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/AccessEndpointUnitTest.java
index a634c2b45239f85fd528cdb697242743d01291ea..725814004440115e255b67d31ecfe977f80e42fd 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/AccessEndpointUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/AccessEndpointUnitTest.java
@@ -13,7 +13,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.test.context.support.WithMockUser;
@@ -32,10 +32,10 @@ public class AccessEndpointUnitTest extends BaseTest {
     @Autowired
     private AccessEndpoint accessEndpoint;
 
-    @MockBean
+    @MockitoBean
     private CacheService credentialService;
 
-    @MockBean
+    @MockitoBean
     private AccessService accessService;
 
     @Test
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/DatabaseEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/DatabaseEndpointUnitTest.java
index 01a575b4609b4dd2a882f2bae6e40ba520229b74..431d88d72c651875e587aadf3737d95c59715acb 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/DatabaseEndpointUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/DatabaseEndpointUnitTest.java
@@ -15,10 +15,10 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 import java.sql.SQLException;
@@ -37,16 +37,16 @@ public class DatabaseEndpointUnitTest extends BaseTest {
     @Autowired
     private DatabaseEndpoint databaseEndpoint;
 
-    @MockBean
+    @MockitoBean
     private ContainerService containerService;
 
-    @MockBean
+    @MockitoBean
     private AccessService accessService;
 
-    @MockBean
+    @MockitoBean
     private DatabaseService databaseService;
 
-    @MockBean
+    @MockitoBean
     private CacheService credentialService;
 
     @Test
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/SubsetEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/SubsetEndpointUnitTest.java
index 195e42026ddbe710855d4b6ceb9248cb8e486c97..8aa9327c8b8ba1a22d934a97543c769b11dfcca2 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/SubsetEndpointUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/SubsetEndpointUnitTest.java
@@ -21,11 +21,11 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.test.context.support.WithAnonymousUser;
 import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 import java.security.Principal;
@@ -49,22 +49,22 @@ public class SubsetEndpointUnitTest extends BaseTest {
     @Autowired
     private SparkSession sparkSession;
 
-    @MockBean
+    @MockitoBean
     private SubsetService subsetService;
 
-    @MockBean
+    @MockitoBean
     private HttpServletRequest httpServletRequest;
 
-    @MockBean
+    @MockitoBean
     private StorageService storageService;
 
-    @MockBean
+    @MockitoBean
     private DatabaseService databaseService;
 
-    @MockBean
+    @MockitoBean
     private CacheService cacheService;
 
-    @MockBean
+    @MockitoBean
     private MetadataServiceGateway metadataServiceGateway;
 
     @Test
@@ -708,7 +708,7 @@ public class SubsetEndpointUnitTest extends BaseTest {
 
     protected List<QueryDto> generic_list(UUID databaseId, DatabaseDto database, Principal principal)
             throws NotAllowedException, DatabaseUnavailableException, QueryNotFoundException, DatabaseNotFoundException,
-            RemoteUnavailableException, MetadataServiceException {
+            RemoteUnavailableException, MetadataServiceException, UserNotFoundException {
 
         /* mock */
         if (database != null) {
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/TableEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/TableEndpointUnitTest.java
index 8bfd1c527fc1d4ad772aa22460219b306a611492..70ef32af913b44111ae91a8c9b0eb98be1c84390 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/TableEndpointUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/TableEndpointUnitTest.java
@@ -26,7 +26,7 @@ import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.AccessDeniedException;
@@ -54,22 +54,22 @@ public class TableEndpointUnitTest extends BaseTest {
     @Autowired
     private SparkSession sparkSession;
 
-    @MockBean
+    @MockitoBean
     private HttpServletRequest httpServletRequest;
 
-    @MockBean
+    @MockitoBean
     private TableService tableService;
 
-    @MockBean
+    @MockitoBean
     private SubsetService subsetService;
 
-    @MockBean
+    @MockitoBean
     private DatabaseService databaseService;
 
-    @MockBean
+    @MockitoBean
     private CacheService credentialService;
 
-    @MockBean
+    @MockitoBean
     private MetadataServiceGateway metadataServiceGateway;
 
     public static Stream<Arguments> size_arguments() {
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/ViewEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/ViewEndpointUnitTest.java
index 9e0b1c4454f3a6abd12af702d5658b5b6bec9802..5660e073f0f71a9928330130a738af0899e97f03 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/ViewEndpointUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/ViewEndpointUnitTest.java
@@ -18,7 +18,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.test.context.support.WithAnonymousUser;
@@ -38,19 +38,19 @@ import static org.mockito.Mockito.*;
 @ExtendWith(SpringExtension.class)
 public class ViewEndpointUnitTest extends BaseTest {
 
-    @MockBean
+    @MockitoBean
     private ViewService viewService;
 
-    @MockBean
+    @MockitoBean
     private DatabaseService databaseService;
 
-    @MockBean
+    @MockitoBean
     private CacheService credentialService;
 
-    @MockBean
+    @MockitoBean
     private HttpServletRequest httpServletRequest;
 
-    @MockBean
+    @MockitoBean
     private SubsetService subsetService;
 
     @Autowired
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/InterceptorUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/InterceptorUnitTest.java
index b56888551b5da6ca4bb34cfb6f3bc96481ba3a04..f36754f0b2460dfc8666c07351a7e88790ca7d61 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/InterceptorUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/InterceptorUnitTest.java
@@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.ResponseEntity;
@@ -22,7 +22,7 @@ import static org.mockito.Mockito.when;
 @ExtendWith(SpringExtension.class)
 public class InterceptorUnitTest extends BaseTest {
 
-    @MockBean
+    @MockitoBean
     @Qualifier("keycloakRestTemplate")
     private RestTemplate restTemplate;
 
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/MetadataServiceGatewayUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/MetadataServiceGatewayUnitTest.java
index 60860315edd4f23aea7dc43fc6960a628c2ef996..751c5248c1655dee2440521441a50d1bc9d50324 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/MetadataServiceGatewayUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/MetadataServiceGatewayUnitTest.java
@@ -15,7 +15,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.http.*;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 import org.springframework.web.client.HttpClientErrorException;
@@ -35,7 +35,7 @@ import static org.mockito.Mockito.when;
 @ExtendWith(SpringExtension.class)
 public class MetadataServiceGatewayUnitTest extends BaseTest {
 
-    @MockBean
+    @MockitoBean
     @Qualifier("internalRestTemplate")
     private RestTemplate internalRestTemplate;
 
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerIntegrationTest.java
index dcb0af3d66d698f4db8eeffe6e7e13401848a9d5..c87cd5fd49066b15b326b7d4ddf8f0eda3ec6b17 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerIntegrationTest.java
@@ -15,7 +15,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.amqp.core.Message;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.boot.test.system.CapturedOutput;
 import org.springframework.boot.test.system.OutputCaptureExtension;
 import org.springframework.test.annotation.DirtiesContext;
@@ -40,7 +40,7 @@ import static org.mockito.Mockito.when;
 @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
 public class DefaultListenerIntegrationTest extends BaseTest {
 
-    @MockBean
+    @MockitoBean
     private CacheService credentialService;
 
     @Autowired
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerUnitTest.java
index 8b0eedcebebf8a01ef8cd7a42ea916afd30ebf7a..72aba7246361b328fee630a1972bc53c431799e5 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerUnitTest.java
@@ -8,7 +8,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.amqp.core.Message;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.boot.test.system.CapturedOutput;
 import org.springframework.boot.test.system.OutputCaptureExtension;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
@@ -29,7 +29,7 @@ import static org.mockito.Mockito.doThrow;
 @Testcontainers
 public class DefaultListenerUnitTest {
 
-    @MockBean
+    @MockitoBean
     private CacheService credentialService;
 
     @Autowired
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/SubsetEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/SubsetEndpointMvcTest.java
index 593954df956fc4e599bba665355b01a405e0611e..69d41cf983863859dd42a85c3380102776bd00f8 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/SubsetEndpointMvcTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/SubsetEndpointMvcTest.java
@@ -10,7 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.actuate.observability.AutoConfigureObservability;
 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.http.MediaType;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 import org.springframework.test.web.servlet.MockMvc;
@@ -27,10 +27,10 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 @AutoConfigureObservability
 public class SubsetEndpointMvcTest extends BaseTest {
 
-    @MockBean
+    @MockitoBean
     private MetadataServiceGateway metadataServiceGateway;
 
-    @MockBean
+    @MockitoBean
     private SubsetService subsetService;
 
     @Autowired
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/CredentialServiceUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/CredentialServiceUnitTest.java
index febf388d59531bb4e8a831b43a81facf19a7eb01..4fcafa9e86525537d69186898a2ce4dfcfaa6d4e 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/CredentialServiceUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/CredentialServiceUnitTest.java
@@ -16,7 +16,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
 import java.sql.SQLException;
@@ -32,7 +32,7 @@ public class CredentialServiceUnitTest extends BaseTest {
     @Autowired
     private CacheServiceImpl credentialService;
 
-    @MockBean
+    @MockitoBean
     private MetadataServiceGateway metadataServiceGateway;
 
     @BeforeEach
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/QueueServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/QueueServiceIntegrationTest.java
index 99e3f77f807c1d5c09c1f58773d31724006c42ee..594cb113ad0f897f58a62fe14e17779c802047ef 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/QueueServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/QueueServiceIntegrationTest.java
@@ -16,7 +16,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 import org.testcontainers.containers.MariaDBContainer;
 import org.testcontainers.junit.jupiter.Container;
@@ -37,7 +37,7 @@ public class QueueServiceIntegrationTest extends BaseTest {
     @Autowired
     private QueueServiceRabbitMqImpl queueService;
 
-    @MockBean
+    @MockitoBean
     private MetadataServiceGateway metadataServiceGateway;
 
     @Container
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/SubsetServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/SubsetServiceIntegrationTest.java
index d6f657ed2b937beb1b286895a123663ec1b170c4..597d8812013f8899ce9ebf4a4d0734b1ede1894c 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/SubsetServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/SubsetServiceIntegrationTest.java
@@ -18,7 +18,7 @@ import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 import org.testcontainers.containers.MariaDBContainer;
 import org.testcontainers.junit.jupiter.Container;
@@ -44,7 +44,7 @@ public class SubsetServiceIntegrationTest extends BaseTest {
     @Autowired
     private SubsetService subsetService;
 
-    @MockBean
+    @MockitoBean
     private MetadataServiceGateway metadataServiceGateway;
 
     public static Stream<Arguments> create_arguments() {
diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java
index 1a2d9fa2def0fe261c417ac3d594ae948319e2d4..ad1719cb13f9263beb4315b65aec081439c55dd0 100644
--- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java
@@ -11,6 +11,7 @@ import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper;
 import at.ac.tuwien.ifs.dbrepo.service.ContainerService;
 import com.mchange.v2.c3p0.ComboPooledDataSource;
 import lombok.extern.log4j.Log4j2;
+import org.apache.logging.log4j.message.MapMessage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
diff --git a/dbrepo-gateway-service/README.md b/dbrepo-gateway-service/README.md
deleted file mode 100644
index 025b6a81ed37ba5bf21a05b71e14923604385e5f..0000000000000000000000000000000000000000
--- a/dbrepo-gateway-service/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Gateway Service
-
-NGINX, test the syntax/regex with https://nginx.viraptor.info/
\ No newline at end of file
diff --git a/dbrepo-gateway-service/dbrepo.conf b/dbrepo-gateway-service/dbrepo.conf
index 0ee5bfdfb5fb5c8950e61fff324abc4044a5bc1d..153d6fb7f50444c94fbcd2a29371f12833d20d6d 100644
--- a/dbrepo-gateway-service/dbrepo.conf
+++ b/dbrepo-gateway-service/dbrepo.conf
@@ -4,8 +4,6 @@ map $http_upgrade $connection_upgrade {
   '' close;
 }
 
-client_max_body_size     20G;
-
 proxy_buffer_size        128k;
 proxy_buffers       4    256k;
 proxy_busy_buffers_size  256k;
diff --git a/dbrepo-metadata-service/Dockerfile b/dbrepo-metadata-service/Dockerfile
index 5b7a3386162aa93217758f081503dc073e942a64..f9bb4cb4da6a136acde726f8cfdf97df07ed1b5e 100644
--- a/dbrepo-metadata-service/Dockerfile
+++ b/dbrepo-metadata-service/Dockerfile
@@ -27,6 +27,9 @@ RUN apk --no-cache add \
 
 WORKDIR /app
 
+RUN mkdir -p /var/log/app/service/metadata && \
+    chown -R 1001:1001 /var/log/app
+
 RUN adduser -D dbrepo --uid 1001 && \
     chown -R 1001:1001 /app
 
diff --git a/dbrepo-metadata-service/oai/pom.xml b/dbrepo-metadata-service/oai/pom.xml
index 264c194aa59989743ab5c65a003d84fc0844986c..94a25b78ef0d2a57cbff12b106f52c73123c22f2 100644
--- a/dbrepo-metadata-service/oai/pom.xml
+++ b/dbrepo-metadata-service/oai/pom.xml
@@ -10,7 +10,7 @@
     </parent>
 
     <name>oai</name>
-    <artifactId>metadata-service-oai</artifactId>
+    <artifactId>oai</artifactId>
     <version>1.8.2</version>
 
     <dependencies/>
diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml
index 1c0c6ce2ecc0012e02ba19d7f71831afbe38fbad..2567b704b2819f92ff56995743990787833e49e2 100644
--- a/dbrepo-metadata-service/pom.xml
+++ b/dbrepo-metadata-service/pom.xml
@@ -5,7 +5,7 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>3.3.5</version>
+        <version>3.4.0</version>
     </parent>
 
     <organization>
@@ -67,9 +67,9 @@
 
     <dependencies>
         <dependency>
-            <groupId>${project.groupId}</groupId>
+            <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
             <artifactId>dbrepo-core</artifactId>
-            <version>${project.version}</version>
+            <version>1.8.2</version>
         </dependency>
         <!-- Data Source -->
         <dependency>
diff --git a/dbrepo-metadata-service/report/pom.xml b/dbrepo-metadata-service/report/pom.xml
index 08706f25c64d43c7cc7cb78d0dabdc8e08375eb5..ffbe87d0cce2489b32f0de0773a1a6969190020d 100644
--- a/dbrepo-metadata-service/report/pom.xml
+++ b/dbrepo-metadata-service/report/pom.xml
@@ -10,13 +10,13 @@
     </parent>
 
     <name>report</name>
-    <artifactId>metadata-service-report</artifactId>
+    <artifactId>report</artifactId>
     <version>1.8.2</version>
 
     <dependencies>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
-            <artifactId>metadata-service-services</artifactId>
+            <artifactId>services</artifactId>
             <version>1.8.2</version>
         </dependency>
     </dependencies>
diff --git a/dbrepo-metadata-service/repositories/pom.xml b/dbrepo-metadata-service/repositories/pom.xml
index 699acf938a51f824cb2b755216c0aae4ea5fd72a..10458ac4cdb92ea34e0b976376a0226d479b4be1 100644
--- a/dbrepo-metadata-service/repositories/pom.xml
+++ b/dbrepo-metadata-service/repositories/pom.xml
@@ -10,13 +10,13 @@
     </parent>
 
     <name>repositories</name>
-    <artifactId>metadata-service-repositories</artifactId>
+    <artifactId>repositories</artifactId>
     <version>1.8.2</version>
 
     <dependencies>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
-            <artifactId>metadata-service-oai</artifactId>
+            <artifactId>oai</artifactId>
             <version>1.8.2</version>
         </dependency>
     </dependencies>
diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/IdentifierRepository.java b/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/IdentifierRepository.java
index 4011a8d1683329af5181d387b6031cefa8fd461b..35eebe00f36c175043984c5d277aae7dcebaa3ab 100644
--- a/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/IdentifierRepository.java
+++ b/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/IdentifierRepository.java
@@ -11,6 +11,8 @@ import java.util.UUID;
 @Repository
 public interface IdentifierRepository extends JpaRepository<Identifier, UUID> {
 
+    List<Identifier> findAll();
+
     /**
      * Finds identifiers by given database id.
      *
diff --git a/dbrepo-metadata-service/rest-service/pom.xml b/dbrepo-metadata-service/rest-service/pom.xml
index ed9dba6fb69699776281109c9e79ef88bc3350f5..bbc8d1e069d529a5fc9b5f85a6f378229b1b81d3 100644
--- a/dbrepo-metadata-service/rest-service/pom.xml
+++ b/dbrepo-metadata-service/rest-service/pom.xml
@@ -10,13 +10,13 @@
     </parent>
 
     <name>rest-service</name>
-    <artifactId>metadata-service-service</artifactId>
+    <artifactId>rest-service</artifactId>
     <version>1.8.2</version>
 
     <dependencies>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
-            <artifactId>metadata-service-services</artifactId>
+            <artifactId>services</artifactId>
             <version>1.8.2</version>
         </dependency>
     </dependencies>
diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml
index 492aafb6c558a28956190e5c48f198b9e1f333ae..72fd264e48ab00e4c305d3d98db7036b30a0a75a 100644
--- a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml
+++ b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml
@@ -42,11 +42,17 @@ management:
 server:
   port: 8080
 logging:
-  pattern.console: "%d %highlight(%-5level) %msg%n"
+  file:
+    name: /var/log/app/service/metadata/app.log
   level:
     root: warn
     at.ac.tuwien.ifs.dbrepo.: "${LOG_LEVEL:info}"
     org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug
+  pattern:
+    console: "%d %highlight(%-5level) %msg%n"
+  structured:
+    format:
+      file: ecs
 dbrepo:
   datacite:
     url: "${DATACITE_URL:https://api.datacite.org}"
diff --git a/dbrepo-metadata-service/services/pom.xml b/dbrepo-metadata-service/services/pom.xml
index 963d6c9e963b29463e64f9089fca88155ebf6a96..ccc6c60cfb220016e4eb13f6fa2decc949292049 100644
--- a/dbrepo-metadata-service/services/pom.xml
+++ b/dbrepo-metadata-service/services/pom.xml
@@ -10,18 +10,18 @@
     </parent>
 
     <name>services</name>
-    <artifactId>metadata-service-services</artifactId>
+    <artifactId>services</artifactId>
     <version>1.8.2</version>
 
     <dependencies>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
-            <artifactId>metadata-service-oai</artifactId>
+            <artifactId>oai</artifactId>
             <version>1.8.2</version>
         </dependency>
         <dependency>
             <groupId>at.ac.tuwien.ifs.dbrepo</groupId>
-            <artifactId>metadata-service-repositories</artifactId>
+            <artifactId>repositories</artifactId>
             <version>1.8.2</version>
         </dependency>
     </dependencies>
diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataCiteIdentifierServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataCiteIdentifierServiceImpl.java
index 5c109633183eb1d62f4a560e878140d15d75a6cd..e5bf8efa9bd8ad202bf3f82d9a087106ca35dd73 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataCiteIdentifierServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataCiteIdentifierServiceImpl.java
@@ -1,5 +1,7 @@
 package at.ac.tuwien.ifs.dbrepo.service.impl;
 
+import at.ac.tuwien.ifs.dbrepo.config.DataCiteConfig;
+import at.ac.tuwien.ifs.dbrepo.config.EndpointConfig;
 import at.ac.tuwien.ifs.dbrepo.core.api.datacite.DataCiteBody;
 import at.ac.tuwien.ifs.dbrepo.core.api.datacite.DataCiteData;
 import at.ac.tuwien.ifs.dbrepo.core.api.datacite.doi.DataCiteCreateDoi;
@@ -9,8 +11,6 @@ import at.ac.tuwien.ifs.dbrepo.core.api.identifier.BibliographyTypeDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.identifier.CreateIdentifierDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierSaveDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierTypeDto;
-import at.ac.tuwien.ifs.dbrepo.config.DataCiteConfig;
-import at.ac.tuwien.ifs.dbrepo.config.EndpointConfig;
 import at.ac.tuwien.ifs.dbrepo.core.entity.database.Database;
 import at.ac.tuwien.ifs.dbrepo.core.entity.identifier.Identifier;
 import at.ac.tuwien.ifs.dbrepo.core.entity.identifier.IdentifierStatusType;
@@ -128,18 +128,25 @@ public class DataCiteIdentifierServiceImpl implements IdentifierService {
         final HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_JSON);
         headers.setBasicAuth(dataCiteConfig.getUsername(), dataCiteConfig.getPassword());
+        final DataCiteCreateDoi attributes = metadataMapper.identifierToDataCiteCreateDoi(identifier,
+                endpointConfig.getWebsiteUrl() + "/pid/" + identifier.getId(),
+                dataCiteConfig.getPrefix(), event);
         final HttpEntity<DataCiteBody<DataCiteCreateDoi>> request = new HttpEntity<>(
                 DataCiteBody.<DataCiteCreateDoi>builder()
                         .data(DataCiteData.<DataCiteCreateDoi>builder()
                                 .type("dois")
-                                .attributes(metadataMapper.identifierToDataCiteCreateDoi(identifier,
-                                        endpointConfig.getWebsiteUrl() + "/pid/" + identifier.getId(),
-                                        dataCiteConfig.getPrefix(), event))
+                                .attributes(attributes)
                                 .build())
                         .build(),
                 headers
         );
         final String url = dataCiteConfig.getUrl() + "/dois";
+        log.atDebug()
+                .setMessage("register doi from datacite url: " + url)
+                .addKeyValue("type", "dois")
+                .addKeyValue("event", event)
+                .addKeyValue("attributes", attributes)
+                .log();
         log.trace("request doi from url {}", url);
         try {
             final ResponseEntity<DataCiteBody<DataCiteDoi>> response = restTemplate.exchange(url, HttpMethod.POST,
@@ -148,15 +155,26 @@ public class DataCiteIdentifierServiceImpl implements IdentifierService {
                 log.error("Failed to mint doi: {}", response);
                 throw new ExternalServiceException("Failed to mint doi: " + response.getBody());
             }
-            return response.getBody()
+            final String doi = response.getBody()
                     .getData()
                     .getAttributes()
                     .getDoi();
+            log.atInfo()
+                    .setMessage("Saved doi: " + doi)
+                    .addKeyValue("doi", doi)
+                    .log();
+            return doi;
         } catch (HttpClientErrorException e) {
-            log.error("Failed to mint doi: malformed metadata: {}", e.getMessage());
-            throw new MalformedException("Failed to mint doi: malformed metadata: " + e.getMessage(), e);
+            log.atError()
+                    .setMessage("Failed to mint doi")
+                    .setCause(e)
+                    .log();
+            throw new MalformedException("Failed to mint doi: " + e.getMessage(), e);
         } catch (RestClientException e) {
-            log.error("Failed to mint doi: {}", e.getMessage());
+            log.atError()
+                    .setMessage("Failed to mint doi")
+                    .setCause(e)
+                    .log();
             throw new DataServiceConnectionException("Failed to mint doi: " + e.getMessage(), e);
         }
     }
diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/IdentifierServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/IdentifierServiceImpl.java
index f8b2c273e8c9032a103b327f84892528aad7826f..c04d388f8ce4142bacb609b8f62098383fc99303 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/IdentifierServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/IdentifierServiceImpl.java
@@ -1,11 +1,11 @@
 package at.ac.tuwien.ifs.dbrepo.service.impl;
 
+import at.ac.tuwien.ifs.dbrepo.config.MetadataConfig;
 import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.identifier.BibliographyTypeDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.identifier.CreateIdentifierDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierSaveDto;
 import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierTypeDto;
-import at.ac.tuwien.ifs.dbrepo.config.MetadataConfig;
 import at.ac.tuwien.ifs.dbrepo.core.entity.database.Database;
 import at.ac.tuwien.ifs.dbrepo.core.entity.database.LanguageType;
 import at.ac.tuwien.ifs.dbrepo.core.entity.database.View;
@@ -22,6 +22,7 @@ import at.ac.tuwien.ifs.dbrepo.service.IdentifierService;
 import at.ac.tuwien.ifs.dbrepo.service.ViewService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
+import org.slf4j.spi.LoggingEventBuilder;
 import org.springframework.core.io.InputStreamResource;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -150,7 +151,10 @@ public class IdentifierServiceImpl implements IdentifierService {
         identifier = identifierRepository.save(identifier);
         /* update in search service */
         searchServiceGateway.update(identifier.getDatabase());
-        log.info("Published identifier with id {}", identifier.getId());
+        log.atInfo()
+                .setMessage("Published identifier")
+                .addKeyValue("id", identifier.getId())
+                .log();
         return identifier;
     }
 
@@ -280,10 +284,14 @@ public class IdentifierServiceImpl implements IdentifierService {
     public Identifier save(Identifier identifier) throws DataServiceException, DataServiceConnectionException,
             ViewNotFoundException, DatabaseNotFoundException, QueryNotFoundException, SearchServiceException,
             SearchServiceConnectionException {
+        LoggingEventBuilder loggingBuilder = log.atDebug()
+                .setMessage("save identifier")
+                .addKeyValue("type", identifier.getType())
+                .addKeyValue("database_id", identifier.getDatabase().getId());
         /* save identifier */
         switch (identifier.getType()) {
             case SUBSET -> {
-                log.debug("identifier type: subset with id {}", identifier.getQueryId());
+                loggingBuilder = loggingBuilder.addKeyValue("query_id", identifier.getQueryId());
                 final QueryDto query = dataServiceGateway.findQuery(identifier.getDatabase().getId(), identifier.getQueryId());
                 identifier.setQuery(query.getQuery());
                 identifier.setQueryId(query.getId());
@@ -294,16 +302,16 @@ public class IdentifierServiceImpl implements IdentifierService {
                 identifier.setResultHash(query.getResultHash());
             }
             case VIEW -> {
-                log.debug("identifier type: view with id {}", identifier.getViewId());
+                loggingBuilder = loggingBuilder.addKeyValue("view_id", identifier.getViewId());
                 final View view = viewService.findById(identifier.getDatabase(), identifier.getViewId());
                 identifier.setViewId(view.getId());
                 identifier.setQuery(view.getQuery());
                 identifier.setQueryNormalized(view.getQuery());
                 identifier.setQueryHash(view.getQueryHash());
             }
-            case DATABASE -> log.debug("identifier type: database with id {}", identifier.getDatabase().getId());
-            case TABLE -> log.debug("identifier type: table with id {}", identifier.getTableId());
+            case TABLE -> loggingBuilder = loggingBuilder.addKeyValue("table_id", identifier.getTableId());
         }
+        loggingBuilder.log();
         /* save identifier in metadata database */
         final Identifier out = identifierRepository.save(identifier);
         /* update in search database */
@@ -327,7 +335,6 @@ public class IdentifierServiceImpl implements IdentifierService {
         final String body = templateEngine.process("record_oai_datacite.xml", context)
                 .replaceAll("\\s+", " ");
         final InputStreamResource resource = new InputStreamResource(IOUtils.toInputStream(body, Charset.defaultCharset()));
-        log.debug("mapped file stream {}", resource.getDescription());
         return resource;
     }
 
@@ -366,7 +373,10 @@ public class IdentifierServiceImpl implements IdentifierService {
                 .getIdentifiers()
                 .remove(identifier);
         searchServiceGateway.update(identifier.getDatabase());
-        log.info("Deleted identifier with id {}", identifier.getId());
+        log.atInfo()
+                .setMessage("Deleted identifier")
+                .addKeyValue("id", identifier.getId())
+                .log();
     }
 
     public IdentifierTitle preferTitle(List<IdentifierTitle> titles) {
diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UserServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UserServiceImpl.java
index f93dacc21c112d9bdbd1be6f511c0d89829ea836..351b61e82de310ccdef35830986dd8f4d9ee1f7e 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UserServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UserServiceImpl.java
@@ -13,6 +13,7 @@ import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.nio.charset.StandardCharsets;
 import java.util.List;
@@ -33,11 +34,13 @@ public class UserServiceImpl implements UserService {
     }
 
     @Override
+    @Transactional(readOnly = true)
     public List<User> findAll() {
         return userRepository.findAll();
     }
 
     @Override
+    @Transactional(readOnly = true)
     public User findByUsername(String username) throws UserNotFoundException {
         final Optional<User> optional = userRepository.findByUsername(username);
         if (optional.isEmpty()) {
@@ -48,11 +51,13 @@ public class UserServiceImpl implements UserService {
     }
 
     @Override
+    @Transactional(readOnly = true)
     public List<User> findAllInternalUsers() {
         return userRepository.findAllInternal();
     }
 
     @Override
+    @Transactional(readOnly = true)
     public User findById(UUID id) throws UserNotFoundException {
         final Optional<User> optional = userRepository.findById(id);
         if (optional.isEmpty()) {
@@ -63,6 +68,7 @@ public class UserServiceImpl implements UserService {
     }
 
     @Override
+    @Transactional
     public User create(CreateUserDto data) {
         /* create at authentication service */
         final String passwordHash = "*" + DigestUtils.sha1Hex(DigestUtils.sha1(RandomStringUtils.randomAlphabetic(40)
@@ -86,6 +92,7 @@ public class UserServiceImpl implements UserService {
     }
 
     @Override
+    @Transactional
     public User modify(User user, UserUpdateDto data) throws UserNotFoundException, AuthServiceException {
         user.setFirstname(data.getFirstname());
         user.setLastname(data.getLastname());
diff --git a/dbrepo-search-service/Dockerfile b/dbrepo-search-service/Dockerfile
index 1d0862a9e51d82a0f8e8154caea2efec9a51dba0..c290684944d7ff48d177f21c728cbb4d1ee760fc 100644
--- a/dbrepo-search-service/Dockerfile
+++ b/dbrepo-search-service/Dockerfile
@@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001
 
 WORKDIR /app
 
+RUN mkdir -p /var/log/app/service/search && \
+    chown -R 1001:1001 /var/log/app
+
 USER 1001
 
 COPY --chown=1001 ./friendly_names_overrides.json ./friendly_names_overrides.json
diff --git a/dbrepo-search-service/Pipfile b/dbrepo-search-service/Pipfile
index 83e75e0fb82b4caf4ab44bd5d3761aac5bf4f0e4..99ece7bda6961c60b13e34bc6e9c38b791867c1b 100644
--- a/dbrepo-search-service/Pipfile
+++ b/dbrepo-search-service/Pipfile
@@ -17,7 +17,7 @@ flask_httpauth = "*"
 jwt = "~=1.3"
 rdflib = "*"
 grafana-client = "*"
-dbrepo = {path = "./lib/dbrepo-1.8.2rc6.tar.gz"}
+dbrepo = {path = "./lib/dbrepo-1.8.2.tar.gz"}
 gunicorn = "*"
 
 [dev-packages]
diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock
index e934f1f67f79d9793a5fb6a15ace17cc3752288b..65fe75dd41218de10e1b573db8c386163a3cef08 100644
--- a/dbrepo-search-service/Pipfile.lock
+++ b/dbrepo-search-service/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "68aaa1acf2e9a0bce5e435584ced545d48713e8eeb563b27fbb3ee112a74bb81"
+            "sha256": "81c685d7b8966e019d5e9f0821ae592ec36dae0ab851cc342bcbb1b173e69cc0"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -16,109 +16,6 @@
         ]
     },
     "default": {
-        "aiohappyeyeballs": {
-            "hashes": [
-                "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558",
-                "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==2.6.1"
-        },
-        "aiohttp": {
-            "hashes": [
-                "sha256:0700055a6e05c2f4711011a44364020d7a10fbbcd02fbf3e30e8f7e7fddc8717",
-                "sha256:0a8d8f20c39d3fa84d1c28cdb97f3111387e48209e224408e75f29c6f8e0861d",
-                "sha256:0e2a92101efb9f4c2942252c69c63ddb26d20f46f540c239ccfa5af865197bb8",
-                "sha256:0f421843b0f70740772228b9e8093289924359d306530bcd3926f39acbe1adda",
-                "sha256:106032eaf9e62fd6bc6578c8b9e6dc4f5ed9a5c1c7fb2231010a1b4304393421",
-                "sha256:11d5391946605f445ddafda5eab11caf310f90cdda1fd99865564e3164f5cff9",
-                "sha256:122f3e739f6607e5e4c6a2f8562a6f476192a682a52bda8b4c6d4254e1138f4d",
-                "sha256:12a62691eb5aac58d65200c7ae94d73e8a65c331c3a86a2e9670927e94339ee8",
-                "sha256:13cd38515568ae230e1ef6919e2e33da5d0f46862943fcda74e7e915096815f3",
-                "sha256:1596ebf17e42e293cbacc7a24c3e0dc0f8f755b40aff0402cb74c1ff6baec1d3",
-                "sha256:25557982dd36b9e32c0a3357f30804e80790ec2c4d20ac6bcc598533e04c6361",
-                "sha256:28c3f975e5ae3dbcbe95b7e3dcd30e51da561a0a0f2cfbcdea30fc1308d72137",
-                "sha256:2c828b6d23b984255b85b9b04a5b963a74278b7356a7de84fda5e3b76866597b",
-                "sha256:2d9f6c0152f8d71361905aaf9ed979259537981f47ad099c8b3d81e0319814bd",
-                "sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8",
-                "sha256:3849ead845e8444f7331c284132ab314b4dac43bfae1e3cf350906d4fff4620f",
-                "sha256:3a621d85e85dccabd700294494d7179ed1590b6d07a35709bb9bd608c7f5dd1d",
-                "sha256:3b8d2b42073611c860a37f718b3d61ae8b4c2b124b2e776e2c10619d920350ec",
-                "sha256:3cc314245deb311364884e44242e00c18b5896e4fe6d5f942e7ad7e4cb640adb",
-                "sha256:3cec21dd68924179258ae14af9f5418c1ebdbba60b98c667815891293902e5e0",
-                "sha256:3d518ce32179f7e2096bf4e3e8438cf445f05fedd597f252de9f54c728574756",
-                "sha256:40fbf91f6a0ac317c0a07eb328a1384941872f6761f2e6f7208b63c4cc0a7ff6",
-                "sha256:427fdc56ccb6901ff8088544bde47084845ea81591deb16f957897f0f0ba1be9",
-                "sha256:44ff5625413fec55216da5eaa011cf6b0a2ed67a565914a212a51aa3755b0009",
-                "sha256:46533e6792e1410f9801d09fd40cbbff3f3518d1b501d6c3c5b218f427f6ff08",
-                "sha256:469ac32375d9a716da49817cd26f1916ec787fc82b151c1c832f58420e6d3533",
-                "sha256:474215ec618974054cf5dc465497ae9708543cbfc312c65212325d4212525811",
-                "sha256:5199be2a2f01ffdfa8c3a6f5981205242986b9e63eb8ae03fd18f736e4840721",
-                "sha256:540b8a1f3a424f1af63e0af2d2853a759242a1769f9f1ab053996a392bd70118",
-                "sha256:554c918ec43f8480b47a5ca758e10e793bd7410b83701676a4782672d670da55",
-                "sha256:5691dc38750fcb96a33ceef89642f139aa315c8a193bbd42a0c33476fd4a1609",
-                "sha256:5bc0ae0a5e9939e423e065a3e5b00b24b8379f1db46046d7ab71753dfc7dd0e1",
-                "sha256:5c2eaa145bb36b33af1ff2860820ba0589e165be4ab63a49aebfd0981c173b66",
-                "sha256:5d61df4a05476ff891cff0030329fee4088d40e4dc9b013fac01bc3c745542c2",
-                "sha256:5e7007b8d1d09bce37b54111f593d173691c530b80f27c6493b928dabed9e6ef",
-                "sha256:5e8452ad6b2863709f8b3d615955aa0807bc093c34b8e25b3b52097fe421cb7f",
-                "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2",
-                "sha256:6ced70adf03920d4e67c373fd692123e34d3ac81dfa1c27e45904a628567d804",
-                "sha256:73b8870fe1c9a201b8c0d12c94fe781b918664766728783241a79e0468427e4f",
-                "sha256:767a97e6900edd11c762be96d82d13a1d7c4fc4b329f054e88b57cdc21fded94",
-                "sha256:7ccec9e72660b10f8e283e91aa0295975c7bd85c204011d9f5eb69310555cf30",
-                "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e",
-                "sha256:7e889c9df381a2433802991288a61e5a19ceb4f61bd14f5c9fa165655dcb1fd1",
-                "sha256:7f33a92a2fde08e8c6b0c61815521324fc1612f397abf96eed86b8e31618fdb4",
-                "sha256:8a4076a2b3ba5b004b8cffca6afe18a3b2c5c9ef679b4d1e9859cf76295f8d4f",
-                "sha256:8bd1cde83e4684324e6ee19adfc25fd649d04078179890be7b29f76b501de8e4",
-                "sha256:8e57da93e24303a883146510a434f0faf2f1e7e659f3041abc4e3fb3f6702a9f",
-                "sha256:9602044ff047043430452bc3a2089743fa85da829e6fc9ee0025351d66c332b6",
-                "sha256:96264854fedbea933a9ca4b7e0c745728f01380691687b7365d18d9e977179c4",
-                "sha256:9c23fd8d08eb9c2af3faeedc8c56e134acdaf36e2117ee059d7defa655130e5f",
-                "sha256:9d4df95ad522c53f2b9ebc07f12ccd2cb15550941e11a5bbc5ddca2ca56316d7",
-                "sha256:9ea345fda05bae217b6cce2acf3682ce3b13d0d16dd47d0de7080e5e21362421",
-                "sha256:9f26545b9940c4b46f0a9388fd04ee3ad7064c4017b5a334dd450f616396590e",
-                "sha256:a2fd04ae4971b914e54fe459dd7edbbd3f2ba875d69e057d5e3c8e8cac094935",
-                "sha256:a35197013ed929c0aed5c9096de1fc5a9d336914d73ab3f9df14741668c0616c",
-                "sha256:ab2ef72f8605046115bc9aa8e9d14fd49086d405855f40b79ed9e5c1f9f4faea",
-                "sha256:ad2f41203e2808616292db5d7170cccf0c9f9c982d02544443c7eb0296e8b0c7",
-                "sha256:ad8c745ff9460a16b710e58e06a9dec11ebc0d8f4dd82091cefb579844d69868",
-                "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a",
-                "sha256:b2f317d1678002eee6fe85670039fb34a757972284614638f82b903a03feacdc",
-                "sha256:b426495fb9140e75719b3ae70a5e8dd3a79def0ae3c6c27e012fc59f16544a4a",
-                "sha256:b491e42183e8fcc9901d8dcd8ae644ff785590f1727f76ca86e731c61bfe6643",
-                "sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01",
-                "sha256:c1b90407ced992331dd6d4f1355819ea1c274cc1ee4d5b7046c6761f9ec11829",
-                "sha256:c28875e316c7b4c3e745172d882d8a5c835b11018e33432d281211af35794a93",
-                "sha256:cc93a4121d87d9f12739fc8fab0a95f78444e571ed63e40bfc78cd5abe700ac9",
-                "sha256:cdd1bbaf1e61f0d94aced116d6e95fe25942f7a5f42382195fd9501089db5d78",
-                "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508",
-                "sha256:d9e6b0e519067caa4fd7fb72e3e8002d16a68e84e62e7291092a5433763dc0dd",
-                "sha256:e220e7562467dc8d589e31c1acd13438d82c03d7f385c9cd41a3f6d1d15807c1",
-                "sha256:e6d3e32b8753c8d45ac550b11a1090dd66d110d4ef805ffe60fa61495360b3b2",
-                "sha256:e6f3c0a3a1e73e88af384b2e8a0b9f4fb73245afd47589df2afcab6b638fa0e6",
-                "sha256:ea4cf2488156e0f281f93cc2fd365025efcba3e2d217cbe3df2840f8c73db261",
-                "sha256:eab7b040a8a873020113ba814b7db7fa935235e4cbaf8f3da17671baa1024863",
-                "sha256:f0ddc9337a0fb0e727785ad4f41163cc314376e82b31846d3835673786420ef1",
-                "sha256:f2c50bad73ed629cc326cc0f75aed8ecfb013f88c5af116f33df556ed47143eb",
-                "sha256:f414f37b244f2a97e79b98d48c5ff0789a0b4b4609b17d64fa81771ad780e415",
-                "sha256:f8af2ef3b4b652ff109f98087242e2ab974b2b2b496304063585e3d78de0b000",
-                "sha256:f9e6710ebebfce2ba21cee6d91e7452d1125100f41b906fb5af3da8c78b764c1",
-                "sha256:fdb239f47328581e2ec7744ab5911f97afb10752332a6dd3d98e14e429e1a9e7",
-                "sha256:fe7cdd3f7d1df43200e1c80f1aed86bb36033bf65e3c7cf46a2b97a253ef8798"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==3.11.18"
-        },
-        "aiosignal": {
-            "hashes": [
-                "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5",
-                "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==1.3.2"
-        },
         "annotated-types": {
             "hashes": [
                 "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53",
@@ -221,7 +118,7 @@
                 "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87",
                 "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"
             ],
-            "markers": "platform_python_implementation != 'PyPy'",
+            "markers": "python_version >= '3.8'",
             "version": "==1.17.1"
         },
         "charset-normalizer": {
@@ -375,10 +272,9 @@
         },
         "dbrepo": {
             "hashes": [
-                "sha256:5dbd2230489d0af8eb4509b7231764289972e6282037b27e97a3824a5d234090"
+                "sha256:76f0ab97d1e914a779aa51b5e5a17591b2f1c88f15dc9df27273deb4dc7ed125"
             ],
-            "path": "./lib/dbrepo-1.8.2rc6.tar.gz",
-            "version": "==1.8.2rc6"
+            "path": "./lib/dbrepo-1.8.2.tar.gz"
         },
         "events": {
             "hashes": [
@@ -399,6 +295,7 @@
                 "sha256:f69fcd559dc907ed196ab9df0e48471709175e696d6e698dd4dbe940f96ce66b"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8'",
             "version": "==2.3.3"
         },
         "flask-cors": {
@@ -423,6 +320,7 @@
                 "sha256:8085d6757505b6f3291a2638c84d207e8f0ad0de662d1f46aa2f77e658a0c976"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9' and python_version < '4'",
             "version": "==4.7.1"
         },
         "flask-sqlalchemy": {
@@ -431,124 +329,16 @@
                 "sha256:e4b68bb881802dda1a7d878b2fc84c06d1ee57fb40b874d3dc97dabfa36b8312"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8'",
             "version": "==3.1.1"
         },
-        "frozenlist": {
-            "hashes": [
-                "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117",
-                "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2",
-                "sha256:0dbae96c225d584f834b8d3cc688825911960f003a85cb0fd20b6e5512468c42",
-                "sha256:0e6f8653acb82e15e5443dba415fb62a8732b68fe09936bb6d388c725b57f812",
-                "sha256:0f2ca7810b809ed0f1917293050163c7654cefc57a49f337d5cd9de717b8fad3",
-                "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a",
-                "sha256:1255d5d64328c5a0d066ecb0f02034d086537925f1f04b50b1ae60d37afbf572",
-                "sha256:1330f0a4376587face7637dfd245380a57fe21ae8f9d360c1c2ef8746c4195fa",
-                "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b",
-                "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626",
-                "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e",
-                "sha256:1db8b2fc7ee8a940b547a14c10e56560ad3ea6499dc6875c354e2335812f739d",
-                "sha256:2187248203b59625566cac53572ec8c2647a140ee2738b4e36772930377a533c",
-                "sha256:2b8cf4cfea847d6c12af06091561a89740f1f67f331c3fa8623391905e878530",
-                "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878",
-                "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e",
-                "sha256:36d2fc099229f1e4237f563b2a3e0ff7ccebc3999f729067ce4e64a97a7f2869",
-                "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd",
-                "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603",
-                "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606",
-                "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85",
-                "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64",
-                "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f",
-                "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0",
-                "sha256:4da6fc43048b648275a220e3a61c33b7fff65d11bdd6dcb9d9c145ff708b804c",
-                "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4",
-                "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103",
-                "sha256:52021b528f1571f98a7d4258c58aa8d4b1a96d4f01d00d51f1089f2e0323cb02",
-                "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191",
-                "sha256:536a1236065c29980c15c7229fbb830dedf809708c10e159b8136534233545f0",
-                "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e",
-                "sha256:56a0b8dd6d0d3d971c91f1df75e824986667ccce91e20dca2023683814344791",
-                "sha256:5c9e89bf19ca148efcc9e3c44fd4c09d5af85c8a7dd3dbd0da1cb83425ef4983",
-                "sha256:625170a91dd7261a1d1c2a0c1a353c9e55d21cd67d0852185a5fef86587e6f5f",
-                "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff",
-                "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8",
-                "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860",
-                "sha256:69bbd454f0fb23b51cadc9bdba616c9678e4114b6f9fa372d462ff2ed9323ec8",
-                "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25",
-                "sha256:6ef8e7e8f2f3820c5f175d70fdd199b79e417acf6c72c5d0aa8f63c9f721646f",
-                "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba",
-                "sha256:75ecee69073312951244f11b8627e3700ec2bfe07ed24e3a685a5979f0412d24",
-                "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e",
-                "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd",
-                "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911",
-                "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c",
-                "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595",
-                "sha256:7daa508e75613809c7a57136dec4871a21bca3080b3a8fc347c50b187df4f00c",
-                "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc",
-                "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2",
-                "sha256:89ffdb799154fd4d7b85c56d5fa9d9ad48946619e0eb95755723fffa11022d75",
-                "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4",
-                "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0",
-                "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe",
-                "sha256:920b6bd77d209931e4c263223381d63f76828bec574440f29eb497cf3394c249",
-                "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c",
-                "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576",
-                "sha256:9799257237d0479736e2b4c01ff26b5c7f7694ac9692a426cb717f3dc02fff9b",
-                "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770",
-                "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046",
-                "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584",
-                "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497",
-                "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f",
-                "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f",
-                "sha256:aa733d123cc78245e9bb15f29b44ed9e5780dc6867cfc4e544717b91f980af3b",
-                "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f",
-                "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d",
-                "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a",
-                "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e",
-                "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68",
-                "sha256:ba7f8d97152b61f22d7f59491a781ba9b177dd9f318486c5fbc52cde2db12189",
-                "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9",
-                "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8",
-                "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1",
-                "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0",
-                "sha256:c7c608f833897501dac548585312d73a7dca028bf3b8688f0d712b7acfaf7fb3",
-                "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29",
-                "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0",
-                "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215",
-                "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590",
-                "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c",
-                "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821",
-                "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1",
-                "sha256:d3ceb265249fb401702fce3792e6b44c1166b9319737d21495d3611028d95769",
-                "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506",
-                "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3",
-                "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348",
-                "sha256:e19c0fc9f4f030fcae43b4cdec9e8ab83ffe30ec10c79a4a43a04d1af6c5e1ad",
-                "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a",
-                "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad",
-                "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6",
-                "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45",
-                "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188",
-                "sha256:e6e558ea1e47fd6fa8ac9ccdad403e5dd5ecc6ed8dda94343056fa4277d5c65e",
-                "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70",
-                "sha256:ed5e3a4462ff25ca84fb09e0fada8ea267df98a450340ead4c91b44857267d70",
-                "sha256:f1a39819a5a3e84304cd286e3dc62a549fe60985415851b3337b6f5cc91907f1",
-                "sha256:f27a9f9a86dcf00708be82359db8de86b80d029814e6693259befe82bb58a106",
-                "sha256:f2c7d5aa19714b1b01a0f515d078a629e445e667b9da869a3cd0e6fe7dec78bd",
-                "sha256:f3a7bb0fe1f7a70fb5c6f497dc32619db7d2cdd53164af30ade2f34673f8b1fc",
-                "sha256:f4b3cd7334a4bbc0c472164f3744562cb72d05002cc6fcf58adb104630bbc352",
-                "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91",
-                "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1",
-                "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==1.6.0"
-        },
         "grafana-client": {
             "hashes": [
                 "sha256:2477a47b923fd0637947e620b0b777c641af18a3025464fa4505783dbf05dfcc",
                 "sha256:8cb61bb2a87ec07bca10974df276b9a1a95bfdb63f3a696f065692ffc9b8c389"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==4.3.2"
         },
         "greenlet": {
@@ -609,7 +399,7 @@
                 "sha256:e98328b8b8f160925d6b1c5b1879d8e64f6bd8cf11472b7127d579da575b77d9",
                 "sha256:ff38c869ed30fff07f1452d9a204ece1ec6d3c0870e0ba6e478ce7c1515acf22"
             ],
-            "markers": "python_version < '3.14' and (platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32'))))))",
+            "markers": "python_version >= '3.9'",
             "version": "==3.2.1"
         },
         "gunicorn": {
@@ -618,6 +408,7 @@
                 "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==23.0.0"
         },
         "h11": {
@@ -776,6 +567,7 @@
                 "sha256:61c9170f92e736b530655e75374681d4fcca9cfa8763ab42be57353b2b203494"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.6'",
             "version": "==1.3.1"
         },
         "markupsafe": {
@@ -853,116 +645,6 @@
             "markers": "python_version >= '3.8'",
             "version": "==3.1.3"
         },
-        "multidict": {
-            "hashes": [
-                "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756",
-                "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8",
-                "sha256:0bb8f8302fbc7122033df959e25777b0b7659b1fd6bcb9cb6bed76b5de67afef",
-                "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c",
-                "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5",
-                "sha256:0ee1bf613c448997f73fc4efb4ecebebb1c02268028dd4f11f011f02300cf1e8",
-                "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db",
-                "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713",
-                "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44",
-                "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378",
-                "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5",
-                "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676",
-                "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08",
-                "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea",
-                "sha256:224b79471b4f21169ea25ebc37ed6f058040c578e50ade532e2066562597b8a9",
-                "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9",
-                "sha256:2427370f4a255262928cd14533a70d9738dfacadb7563bc3b7f704cc2360fc4e",
-                "sha256:24a8caa26521b9ad09732972927d7b45b66453e6ebd91a3c6a46d811eeb7349b",
-                "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508",
-                "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1",
-                "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852",
-                "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac",
-                "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde",
-                "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8",
-                "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504",
-                "sha256:32a998bd8a64ca48616eac5a8c1cc4fa38fb244a3facf2eeb14abe186e0f6cc5",
-                "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02",
-                "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4",
-                "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec",
-                "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a",
-                "sha256:3ccdde001578347e877ca4f629450973c510e88e8865d5aefbcb89b852ccc666",
-                "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc",
-                "sha256:3cf62f8e447ea2c1395afa289b332e49e13d07435369b6f4e41f887db65b40bf",
-                "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790",
-                "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8",
-                "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589",
-                "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d",
-                "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07",
-                "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56",
-                "sha256:5427a2679e95a642b7f8b0f761e660c845c8e6fe3141cddd6b62005bd133fc21",
-                "sha256:578568c4ba5f2b8abd956baf8b23790dbfdc953e87d5b110bce343b4a54fc9e7",
-                "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9",
-                "sha256:5e3929269e9d7eff905d6971d8b8c85e7dbc72c18fb99c8eae6fe0a152f2e343",
-                "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9",
-                "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4",
-                "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a",
-                "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427",
-                "sha256:6b5a272bc7c36a2cd1b56ddc6bff02e9ce499f9f14ee4a45c45434ef083f2459",
-                "sha256:6d79cf5c0c6284e90f72123f4a3e4add52d6c6ebb4a9054e88df15b8d08444c6",
-                "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208",
-                "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229",
-                "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0",
-                "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474",
-                "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817",
-                "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd",
-                "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618",
-                "sha256:8b6fcf6054fc4114a27aa865f8840ef3d675f9316e81868e0ad5866184a6cba5",
-                "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3",
-                "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124",
-                "sha256:909f7d43ff8f13d1adccb6a397094adc369d4da794407f8dd592c51cf0eae4b1",
-                "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb",
-                "sha256:99592bd3162e9c664671fd14e578a33bfdba487ea64bcb41d281286d3c870ad7",
-                "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3",
-                "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375",
-                "sha256:9f35de41aec4b323c71f54b0ca461ebf694fb48bec62f65221f52e0017955b39",
-                "sha256:a059ad6b80de5b84b9fa02a39400319e62edd39d210b4e4f8c4f1243bdac4752",
-                "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0",
-                "sha256:a54ec568f1fc7f3c313c2f3b16e5db346bf3660e1309746e7fccbbfded856188",
-                "sha256:a62d78a1c9072949018cdb05d3c533924ef8ac9bcb06cbf96f6d14772c5cd451",
-                "sha256:a7bd27f7ab3204f16967a6f899b3e8e9eb3362c0ab91f2ee659e0345445e0078",
-                "sha256:a7be07e5df178430621c716a63151165684d3e9958f2bbfcb644246162007ab7",
-                "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7",
-                "sha256:abcfed2c4c139f25c2355e180bcc077a7cae91eefbb8b3927bb3f836c9586f1f",
-                "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b",
-                "sha256:ae93e0ff43b6f6892999af64097b18561691ffd835e21a8348a441e256592e1f",
-                "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c",
-                "sha256:b128dbf1c939674a50dd0b28f12c244d90e5015e751a4f339a96c54f7275e291",
-                "sha256:b1b389ae17296dd739015d5ddb222ee99fd66adeae910de21ac950e00979d897",
-                "sha256:b57e28dbc031d13916b946719f213c494a517b442d7b48b29443e79610acd887",
-                "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1",
-                "sha256:b9cb19dfd83d35b6ff24a4022376ea6e45a2beba8ef3f0836b8a4b288b6ad685",
-                "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf",
-                "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6",
-                "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731",
-                "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507",
-                "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b",
-                "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae",
-                "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777",
-                "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7",
-                "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be",
-                "sha256:dd53893675b729a965088aaadd6a1f326a72b83742b056c1065bdd2e2a42b4df",
-                "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054",
-                "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2",
-                "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124",
-                "sha256:eccb67b0e78aa2e38a04c5ecc13bab325a43e5159a181a9d1a6723db913cbb3c",
-                "sha256:edf74dc5e212b8c75165b435c43eb0d5e81b6b300a938a4eb82827119115e840",
-                "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8",
-                "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd",
-                "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8",
-                "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3",
-                "sha256:f92c7f62d59373cd93bc9969d2da9b4b21f78283b1379ba012f7ee8127b3152e",
-                "sha256:fb6214fe1750adc2a1b801a199d64b5a67671bf76ebf24c730b157846d0e90d2",
-                "sha256:fbd8d737867912b6c5f99f56782b8cb81f978a97b4437a1c476de90a3e41c9a1",
-                "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==6.4.3"
-        },
         "niquests": {
             "hashes": [
                 "sha256:68e0a7e9f338466b3606945fffd11f75e3c90af7498aa9336ef03812323b7e36",
@@ -1029,7 +711,7 @@
                 "sha256:ee461a4eaab4f165b68780a6a1af95fb23a29932be7569b9fab666c407969051",
                 "sha256:f5045039100ed58fa817a6227a356240ea1b9a1bc141018864c306c1a16d4175"
             ],
-            "markers": "python_version == '3.11'",
+            "markers": "python_version >= '3.10'",
             "version": "==2.2.5"
         },
         "opensearch-py": {
@@ -1038,6 +720,7 @@
                 "sha256:6598df0bc7a003294edd0ba88a331e0793acbb8c910c43edf398791e3b2eccda"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8' and python_version < '4'",
             "version": "==2.8.0"
         },
         "packaging": {
@@ -1120,110 +803,6 @@
             "index": "pypi",
             "version": "==0.23.2"
         },
-        "propcache": {
-            "hashes": [
-                "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e",
-                "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b",
-                "sha256:069e7212890b0bcf9b2be0a03afb0c2d5161d91e1bf51569a64f629acc7defbf",
-                "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b",
-                "sha256:0c3c3a203c375b08fd06a20da3cf7aac293b834b6f4f4db71190e8422750cca5",
-                "sha256:0c86e7ceea56376216eba345aa1fc6a8a6b27ac236181f840d1d7e6a1ea9ba5c",
-                "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c",
-                "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a",
-                "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf",
-                "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8",
-                "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5",
-                "sha256:1f6cc0ad7b4560e5637eb2c994e97b4fa41ba8226069c9277eb5ea7101845b42",
-                "sha256:27c6ac6aa9fc7bc662f594ef380707494cb42c22786a558d95fcdedb9aa5d035",
-                "sha256:2d219b0dbabe75e15e581fc1ae796109b07c8ba7d25b9ae8d650da582bed01b0",
-                "sha256:2fce1df66915909ff6c824bbb5eb403d2d15f98f1518e583074671a30fe0c21e",
-                "sha256:319fa8765bfd6a265e5fa661547556da381e53274bc05094fc9ea50da51bfd46",
-                "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d",
-                "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24",
-                "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d",
-                "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de",
-                "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf",
-                "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7",
-                "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371",
-                "sha256:47ef24aa6511e388e9894ec16f0fbf3313a53ee68402bc428744a367ec55b833",
-                "sha256:4cf9e93a81979f1424f1a3d155213dc928f1069d697e4353edb8a5eba67c6259",
-                "sha256:4d0dfdd9a2ebc77b869a0b04423591ea8823f791293b527dc1bb896c1d6f1136",
-                "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25",
-                "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005",
-                "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef",
-                "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7",
-                "sha256:5b9145c35cc87313b5fd480144f8078716007656093d23059e8993d3a8fa730f",
-                "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53",
-                "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0",
-                "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb",
-                "sha256:603f1fe4144420374f1a69b907494c3acbc867a581c2d49d4175b0de7cc64566",
-                "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a",
-                "sha256:64a956dff37080b352c1c40b2966b09defb014347043e740d420ca1eb7c9b908",
-                "sha256:668ddddc9f3075af019f784456267eb504cb77c2c4bd46cc8402d723b4d200bf",
-                "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458",
-                "sha256:6f173bbfe976105aaa890b712d1759de339d8a7cef2fc0a1714cc1a1e1c47f64",
-                "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9",
-                "sha256:730178f476ef03d3d4d255f0c9fa186cb1d13fd33ffe89d39f2cda4da90ceb71",
-                "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b",
-                "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5",
-                "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037",
-                "sha256:82de5da8c8893056603ac2d6a89eb8b4df49abf1a7c19d536984c8dd63f481d5",
-                "sha256:83be47aa4e35b87c106fc0c84c0fc069d3f9b9b06d3c494cd404ec6747544894",
-                "sha256:8638f99dca15b9dff328fb6273e09f03d1c50d9b6512f3b65a4154588a7595fe",
-                "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757",
-                "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3",
-                "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976",
-                "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6",
-                "sha256:916cd229b0150129d645ec51614d38129ee74c03293a9f3f17537be0029a9641",
-                "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7",
-                "sha256:967a8eec513dbe08330f10137eacb427b2ca52118769e82ebcfcab0fba92a649",
-                "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120",
-                "sha256:9979643ffc69b799d50d3a7b72b5164a2e97e117009d7af6dfdd2ab906cb72cd",
-                "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40",
-                "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e",
-                "sha256:9e64e948ab41411958670f1093c0a57acfdc3bee5cf5b935671bbd5313bcf229",
-                "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c",
-                "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7",
-                "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111",
-                "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654",
-                "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f",
-                "sha256:a461959ead5b38e2581998700b26346b78cd98540b5524796c175722f18b0294",
-                "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da",
-                "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f",
-                "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7",
-                "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0",
-                "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073",
-                "sha256:b303b194c2e6f171cfddf8b8ba30baefccf03d36a4d9cab7fd0bb68ba476a3d7",
-                "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11",
-                "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f",
-                "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27",
-                "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70",
-                "sha256:c66d8ccbc902ad548312b96ed8d5d266d0d2c6d006fd0f66323e9d8f2dd49be7",
-                "sha256:cd6a55f65241c551eb53f8cf4d2f4af33512c39da5d9777694e9d9c60872f519",
-                "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5",
-                "sha256:d4e89cde74154c7b5957f87a355bb9c8ec929c167b59c83d90654ea36aeb6180",
-                "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f",
-                "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee",
-                "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18",
-                "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815",
-                "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e",
-                "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a",
-                "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7",
-                "sha256:ed5f6d2edbf349bd8d630e81f474d33d6ae5d07760c44d33cd808e2f5c8f4ae6",
-                "sha256:ef2e4e91fb3945769e14ce82ed53007195e616a63aa43b40fb7ebaaf907c8d4c",
-                "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc",
-                "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8",
-                "sha256:f27785888d2fdd918bc36de8b8739f2d6c791399552333721b58193f68ea3e98",
-                "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256",
-                "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5",
-                "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744",
-                "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723",
-                "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277",
-                "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==0.3.1"
-        },
         "pycparser": {
             "hashes": [
                 "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6",
@@ -1375,6 +954,7 @@
                 "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==1.1.0"
         },
         "pytz": {
@@ -1541,7 +1121,7 @@
                 "sha256:fa1bf4d9838e4c8cdf309500a908fc412cdc325a63e5c74ad88a794bed16c943",
                 "sha256:fcdd2f6b1b1500bde96b442d777a563eadca1b825db0c42ac6aef45ad9ec3c4d"
             ],
-            "markers": "(platform_python_implementation != 'CPython' or python_full_version > '3.7.10') and (platform_system == 'Darwin' or platform_system == 'Windows' or platform_system == 'Linux') and (platform_machine == 'x86_64' or platform_machine == 's390x' or platform_machine == 'armv7l' or platform_machine == 'ppc64le' or platform_machine == 'ppc64' or platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'arm64' or platform_machine == 'ARM64' or platform_machine == 'x86' or platform_machine == 'i686') and (platform_python_implementation == 'CPython' or (platform_python_implementation == 'PyPy' and python_version < '3.12'))",
+            "markers": "python_version >= '3.7'",
             "version": "==1.5.1"
         },
         "rdflib": {
@@ -1550,6 +1130,7 @@
                 "sha256:fed46e24f26a788e2ab8e445f7077f00edcf95abb73bcef4b86cefa8b62dd174"
             ],
             "index": "pypi",
+            "markers": "python_full_version >= '3.8.1' and python_full_version < '4.0.0'",
             "version": "==7.1.4"
         },
         "referencing": {
@@ -1765,24 +1346,9 @@
                 "sha256:bc599c8c3b3319e53ce6c5c3c471120bd325d0071fb6f38a10e924e3d07b9990"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==0.41.2"
         },
-        "tinydb": {
-            "hashes": [
-                "sha256:f7dfc39b8d7fda7a1ca62a8dbb449ffd340a117c1206b68c50b1a481fb95181d",
-                "sha256:f97030ee5cbc91eeadd1d7af07ab0e48ceb04aa63d4a983adbaca4cba16e86c3"
-            ],
-            "markers": "python_version >= '3.8' and python_version < '4.0'",
-            "version": "==4.8.2"
-        },
-        "tuspy": {
-            "hashes": [
-                "sha256:156734eac5c61a046cfecd70f14119f05be92cce198eb5a1a99a664482bedb89",
-                "sha256:7fc5ac8fb25de37c96c90213f83a1ffdede7f48a471cb5a15a2f57846828a79a"
-            ],
-            "markers": "python_full_version >= '3.5.3'",
-            "version": "==1.1.0"
-        },
         "typing-extensions": {
             "hashes": [
                 "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c",
@@ -1812,16 +1378,16 @@
                 "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466",
                 "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"
             ],
-            "markers": "python_version >= '3.10'",
+            "markers": "python_version >= '3.9'",
             "version": "==2.4.0"
         },
         "urllib3-future": {
             "hashes": [
-                "sha256:ce90c1ef08b265eccf29676f759a3a30a36b6ccc8a9e97d3473ea4b26f586d52",
-                "sha256:f341b1ff506c0c7f92cf3d98bd6683b398cad24b62e0277ce6f386222b85951a"
+                "sha256:642b235a89cbddb7a3c6703a11fd0255473231be791214fd01abd465371ea8fb",
+                "sha256:a4f2a94da920f62f4c957931d3a1cc364efdd0fbb984624db7ad7347aa27afad"
             ],
             "markers": "python_version >= '3.7'",
-            "version": "==2.12.919"
+            "version": "==2.12.920"
         },
         "verlib2": {
             "hashes": [
@@ -1934,116 +1500,6 @@
             ],
             "markers": "python_version >= '3.9'",
             "version": "==3.1.3"
-        },
-        "yarl": {
-            "hashes": [
-                "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9",
-                "sha256:04d9c7a1dc0a26efb33e1acb56c8849bd57a693b85f44774356c92d610369efa",
-                "sha256:06d06c9d5b5bc3eb56542ceeba6658d31f54cf401e8468512447834856fb0e61",
-                "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2",
-                "sha256:083ce0393ea173cd37834eb84df15b6853b555d20c52703e21fbababa8c129d2",
-                "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33",
-                "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902",
-                "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2",
-                "sha256:119bca25e63a7725b0c9d20ac67ca6d98fa40e5a894bd5d4686010ff73397914",
-                "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0",
-                "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0",
-                "sha256:1a06701b647c9939d7019acdfa7ebbfbb78ba6aa05985bb195ad716ea759a569",
-                "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f",
-                "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7",
-                "sha256:27359776bc359ee6eaefe40cb19060238f31228799e43ebd3884e9c589e63b20",
-                "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00",
-                "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1",
-                "sha256:35d20fb919546995f1d8c9e41f485febd266f60e55383090010f272aca93edcc",
-                "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f",
-                "sha256:3b4e88d6c3c8672f45a30867817e4537df1bbc6f882a91581faf1f6d9f0f1b5a",
-                "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd",
-                "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c",
-                "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f",
-                "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5",
-                "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d",
-                "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501",
-                "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3",
-                "sha256:44869ee8538208fe5d9342ed62c11cc6a7a1af1b3d0bb79bb795101b6e77f6e0",
-                "sha256:484e7a08f72683c0f160270566b4395ea5412b4359772b98659921411d32ad26",
-                "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2",
-                "sha256:4ba5e59f14bfe8d261a654278a0f6364feef64a794bd456a8c9e823071e5061c",
-                "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c",
-                "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae",
-                "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de",
-                "sha256:4f1a350a652bbbe12f666109fbddfdf049b3ff43696d18c9ab1531fbba1c977a",
-                "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe",
-                "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8",
-                "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124",
-                "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb",
-                "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc",
-                "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2",
-                "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac",
-                "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307",
-                "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58",
-                "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e",
-                "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e",
-                "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62",
-                "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b",
-                "sha256:7595498d085becc8fb9203aa314b136ab0516c7abd97e7d74f7bb4eb95042abe",
-                "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda",
-                "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5",
-                "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64",
-                "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229",
-                "sha256:85a231fa250dfa3308f3c7896cc007a47bc76e9e8e8595c20b7426cac4884c62",
-                "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6",
-                "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d",
-                "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791",
-                "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672",
-                "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb",
-                "sha256:8d8a3d54a090e0fff5837cd3cc305dd8a07d3435a088ddb1f65e33b322f66a94",
-                "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a",
-                "sha256:95b50910e496567434cb77a577493c26bce0f31c8a305135f3bda6a2483b8e10",
-                "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e",
-                "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9",
-                "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5",
-                "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da",
-                "sha256:a884b8974729e3899d9287df46f015ce53f7282d8d3340fa0ed57536b440621c",
-                "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a",
-                "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d",
-                "sha256:af5607159085dcdb055d5678fc2d34949bd75ae6ea6b4381e784bbab1c3aa195",
-                "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594",
-                "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8",
-                "sha256:b594113a301ad537766b4e16a5a6750fcbb1497dcc1bc8a4daae889e6402a634",
-                "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051",
-                "sha256:b7fa0cb9fd27ffb1211cde944b41f5c67ab1c13a13ebafe470b1e206b8459da8",
-                "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e",
-                "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384",
-                "sha256:bc906b636239631d42eb8a07df8359905da02704a868983265603887ed68c076",
-                "sha256:bdb77efde644d6f1ad27be8a5d67c10b7f769804fff7a966ccb1da5a4de4b656",
-                "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018",
-                "sha256:c27d98f4e5c4060582f44e58309c1e55134880558f1add7a87c1bc36ecfade19",
-                "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a",
-                "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4",
-                "sha256:ce360ae48a5e9961d0c730cf891d40698a82804e85f6e74658fb175207a77cb2",
-                "sha256:d0bf955b96ea44ad914bc792c26a0edcd71b4668b93cbcd60f5b0aeaaed06c64",
-                "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145",
-                "sha256:d4fad6e5189c847820288286732075f213eabf81be4d08d6cc309912e62be5b7",
-                "sha256:d88cc43e923f324203f6ec14434fa33b85c06d18d59c167a0637164863b8e995",
-                "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6",
-                "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f",
-                "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f",
-                "sha256:e52d6ed9ea8fd3abf4031325dc714aed5afcbfa19ee4a89898d663c9976eb487",
-                "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9",
-                "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a",
-                "sha256:f0cf05ae2d3d87a8c9022f3885ac6dea2b751aefd66a4f200e408a61ae9b7f0d",
-                "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f",
-                "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1",
-                "sha256:f1f6670b9ae3daedb325fa55fbe31c22c8228f6e0b513772c2e1c623caa6ab22",
-                "sha256:f4d3fa9b9f013f7050326e165c3279e22850d02ae544ace285674cb6174b5d6d",
-                "sha256:f8d8aa8dd89ffb9a831fedbcb27d00ffd9f4842107d52dc9d57e64cb34073d5c",
-                "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877",
-                "sha256:faa709b66ae0e24c8e5134033187a972d849d87ed0a12a0366bedcc6b5dc14a5",
-                "sha256:fb0caeac4a164aadce342f1597297ec0ce261ec4532bbc5a9ca8da5622f53867",
-                "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3"
-            ],
-            "markers": "python_version >= '3.9'",
-            "version": "==1.20.0"
         }
     },
     "develop": {
@@ -2125,7 +1581,7 @@
                 "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87",
                 "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"
             ],
-            "markers": "platform_python_implementation != 'PyPy'",
+            "markers": "python_version >= '3.8'",
             "version": "==1.17.1"
         },
         "charset-normalizer": {
@@ -2293,6 +1749,7 @@
                 "sha256:fa260de59dfb143af06dcf30c2be0b200bed2a73737a8a59248fcb9fa601ef0f"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==7.8.0"
         },
         "cryptography": {
@@ -2373,6 +1830,7 @@
                 "sha256:61c9170f92e736b530655e75374681d4fcca9cfa8763ab42be57353b2b203494"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.6'",
             "version": "==1.3.1"
         },
         "opensearch-py": {
@@ -2381,6 +1839,7 @@
                 "sha256:6598df0bc7a003294edd0ba88a331e0793acbb8c910c43edf398791e3b2eccda"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8' and python_version < '4'",
             "version": "==2.8.0"
         },
         "packaging": {
@@ -2413,6 +1872,7 @@
                 "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8'",
             "version": "==8.3.5"
         },
         "python-dateutil": {
@@ -2437,6 +1897,7 @@
                 "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.5'",
             "version": "==1.12.1"
         },
         "six": {
@@ -2459,6 +1920,7 @@
                 "sha256:0bdf270b5b7f53915832f7c31dd2bd3ffdc20b534ea6b32231cc7003049bd0e1"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==0.0.1rc1"
         },
         "urllib3": {
@@ -2466,7 +1928,7 @@
                 "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466",
                 "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"
             ],
-            "markers": "python_version >= '3.10'",
+            "markers": "python_version >= '3.9'",
             "version": "==2.4.0"
         },
         "wrapt": {
diff --git a/dbrepo-search-service/app.py b/dbrepo-search-service/app.py
index f8413609a617b7e0bf639c24c2362f2a01c24e98..ef577429b79ee647d2daf9221d9a445964780863 100644
--- a/dbrepo-search-service/app.py
+++ b/dbrepo-search-service/app.py
@@ -29,17 +29,32 @@ dictConfig({
             'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
         },
         'simple': {
-            'format': '[%(asctime)s] %(levelname)s: %(message)s',
+            'format': '[%(asctime)s] [%(levelname)s] %(message)s',
+        },
+        'ecs': {
+            'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "search-service", "service_version": "1.8.2"}',
+            'datefmt': '%Y-%m-%dT%H:%M:%S'
+        },
+    },
+    'handlers': {
+        'wsgi': {
+            'class': 'logging.StreamHandler',
+            'stream': 'ext://flask.logging.wsgi_errors_stream',
+            'formatter': 'simple'
+        },
+        'file': {
+            'class': 'logging.handlers.TimedRotatingFileHandler',
+            'formatter': 'ecs',
+            'filename': '/var/log/app/service/search/app.log',
+            'when': 'm',
+            'interval': 1,
+            'backupCount': 5,
+            'encoding': 'utf8'
         },
     },
-    'handlers': {'wsgi': {
-        'class': 'logging.StreamHandler',
-        'stream': 'ext://flask.logging.wsgi_errors_stream',
-        'formatter': 'simple'  # default
-    }},
     'root': {
         'level': 'DEBUG',
-        'handlers': ['wsgi']
+        'handlers': ['wsgi', 'file']
     }
 })
 
@@ -60,8 +75,8 @@ swagger_config = {
     "headers": [],
     "specs": [
         {
-            "endpoint": "api-search",
-            "route": "/api-search.json",
+            "endpoint": "api-docs",
+            "route": "/api-docs.json",
             "rule_filter": lambda rule: rule.endpoint.startswith('search'),
             "model_filter": lambda tag: True,  # all in
         }
@@ -281,7 +296,7 @@ def health():
 
 @app.route("/api/search/<string:index>", methods=["GET"], endpoint="search_get_index")
 @metrics.gauge(name='dbrepo_search_index_list', description='Time needed to list search index')
-@swag_from("os-yml/get_index.yml")
+@swag_from("/app/os-yml/get_index.yml")
 def get_index(index: str):
     """
     returns all entries in a specific index
@@ -305,7 +320,7 @@ def get_index(index: str):
 
 @app.route("/api/search/<string:field_type>/fields", methods=["GET"], endpoint="search_get_index_fields")
 @metrics.gauge(name='dbrepo_search_type_list', description='Time needed to list search types')
-@swag_from("os-yml/get_fields.yml")
+@swag_from("/app/os-yml/get_fields.yml")
 def get_fields(field_type: str):
     """
     returns a list of attributes of the data for a specific index.
@@ -324,7 +339,7 @@ def get_fields(field_type: str):
 
 @app.route("/api/search", methods=["GET"], endpoint="search_fuzzy_search")
 @metrics.gauge(name='dbrepo_search_fuzzy', description='Time needed to search fuzzy')
-@swag_from("os-yml/get_fuzzy_search.yml")
+@swag_from("/app/os-yml/get_fuzzy_search.yml")
 def get_fuzzy_search():
     """
     Main endpoint for fuzzy searching.
@@ -347,7 +362,7 @@ def get_fuzzy_search():
 
 @app.route("/api/search/<string:field_type>", methods=["POST"], endpoint="search_post_general_search")
 @metrics.gauge(name='dbrepo_search_type', description='Time needed to search by type')
-@swag_from("os-yml/post_general_search.yml")
+@swag_from("/app/os-yml/post_general_search.yml")
 def post_general_search(field_type):
     """
     Main endpoint for fuzzy searching.
@@ -430,8 +445,8 @@ def save_database(database_id: str):
     try:
         payload = Database.model_validate(request.json)
     except ValidationError as e:
-        logging.error(f"Failed to validate: {e}")
-        return ApiError(status='BAD_REQUEST', message=f'Malformed payload: {e}',
+        logging.error(f"Failed to validate: {str(e).strip()}")
+        return ApiError(status='BAD_REQUEST', message=f'Malformed payload: {str(e).strip()}',
                         code='search.general.missing').model_dump(), 400
     search_client().save_database(database_id, payload)
     return Response(), 202, headers
diff --git a/dbrepo-search-service/init.Dockerfile b/dbrepo-search-service/init.Dockerfile
index 2099df48cc53586a0cfa64bae3ea1dd4615c6780..231e8d85513adb62beac7c208b2fa97a4924ec37 100644
--- a/dbrepo-search-service/init.Dockerfile
+++ b/dbrepo-search-service/init.Dockerfile
@@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001
 
 WORKDIR /app
 
+RUN mkdir -p /var/log/app/service/search && \
+    chown -R 1001:1001 /var/log/app
+
 USER 1001
 
 COPY --chown=1001 ./database.json ./database.json
diff --git a/dbrepo-search-service/init.py b/dbrepo-search-service/init.py
index 48a59538e01fc232fe49675db5692cb21c2f8942..798b59b9df4e02303ac72d6268be4e63bc42c99d 100644
--- a/dbrepo-search-service/init.py
+++ b/dbrepo-search-service/init.py
@@ -19,17 +19,32 @@ dictConfig({
             'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
         },
         'simple': {
-            'format': '[%(asctime)s] %(levelname)s: %(message)s',
+            'format': '[%(asctime)s] [%(levelname)s] %(message)s',
+        },
+        'ecs': {
+            'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "search-service-init", "service_version": "1.8.2"}',
+            'datefmt': '%Y-%m-%dT%H:%M:%S'
+        },
+    },
+    'handlers': {
+        'wsgi': {
+            'class': 'logging.StreamHandler',
+            'stream': 'ext://flask.logging.wsgi_errors_stream',
+            'formatter': 'simple'
+        },
+        'file': {
+            'class': 'logging.handlers.TimedRotatingFileHandler',
+            'formatter': 'ecs',
+            'filename': '/var/log/app/service/search/init.log',
+            'when': 'm',
+            'interval': 1,
+            'backupCount': 5,
+            'encoding': 'utf8'
         },
     },
-    'handlers': {'wsgi': {
-        'class': 'logging.StreamHandler',
-        'stream': 'ext://flask.logging.wsgi_errors_stream',
-        'formatter': 'simple'  # default
-    }},
     'root': {
         'level': 'DEBUG',
-        'handlers': ['wsgi']
+        'handlers': ['wsgi', 'file']
     }
 })
 
diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.8.2-py3-none-any.whl
index 6a21f512b36f30367f641061c8efeba90108a6c7..48beeb5ebf61c7cca654e0ee66343fac70bb4d53 100644
Binary files a/dbrepo-search-service/lib/dbrepo-1.8.2-py3-none-any.whl and b/dbrepo-search-service/lib/dbrepo-1.8.2-py3-none-any.whl differ
diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2.tar.gz b/dbrepo-search-service/lib/dbrepo-1.8.2.tar.gz
index f98a45d02b802376ff7614c008eec8783f281896..3e3b65b6b93a602ee26c2f4d4c71c2d3cd331211 100644
Binary files a/dbrepo-search-service/lib/dbrepo-1.8.2.tar.gz and b/dbrepo-search-service/lib/dbrepo-1.8.2.tar.gz differ
diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl
deleted file mode 100644
index 86a1af2af41c44d35a4da7a472c180854f0cd82c..0000000000000000000000000000000000000000
Binary files a/dbrepo-search-service/lib/dbrepo-1.8.2rc3-py3-none-any.whl and /dev/null differ
diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc3.tar.gz b/dbrepo-search-service/lib/dbrepo-1.8.2rc3.tar.gz
deleted file mode 100644
index 9c03ed275c6da5b2eef3619c59269f398d59c7de..0000000000000000000000000000000000000000
Binary files a/dbrepo-search-service/lib/dbrepo-1.8.2rc3.tar.gz and /dev/null differ
diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl
deleted file mode 100644
index 5a0dbc7c95592f2e70bed13fa33d85cc6cdf7811..0000000000000000000000000000000000000000
Binary files a/dbrepo-search-service/lib/dbrepo-1.8.2rc4-py3-none-any.whl and /dev/null differ
diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc4.tar.gz b/dbrepo-search-service/lib/dbrepo-1.8.2rc4.tar.gz
deleted file mode 100644
index 1dbc78c989362d4d0c3750b1ad942abe46f205dd..0000000000000000000000000000000000000000
Binary files a/dbrepo-search-service/lib/dbrepo-1.8.2rc4.tar.gz and /dev/null differ
diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl
deleted file mode 100644
index 50bf1b8195987f6f8d23a36f34bc0f912b6fd9b3..0000000000000000000000000000000000000000
Binary files a/dbrepo-search-service/lib/dbrepo-1.8.2rc5-py3-none-any.whl and /dev/null differ
diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc5.tar.gz b/dbrepo-search-service/lib/dbrepo-1.8.2rc5.tar.gz
deleted file mode 100644
index be8784437f111e2d4a5cdac36baf77605114dfa5..0000000000000000000000000000000000000000
Binary files a/dbrepo-search-service/lib/dbrepo-1.8.2rc5.tar.gz and /dev/null differ
diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl
deleted file mode 100644
index 8e4c745a2ce782c174d5e1db7eef22d51d26624c..0000000000000000000000000000000000000000
Binary files a/dbrepo-search-service/lib/dbrepo-1.8.2rc6-py3-none-any.whl and /dev/null differ
diff --git a/dbrepo-search-service/lib/dbrepo-1.8.2rc6.tar.gz b/dbrepo-search-service/lib/dbrepo-1.8.2rc6.tar.gz
deleted file mode 100644
index 279243fd37fe033fe4aa740361b5e9a370516924..0000000000000000000000000000000000000000
Binary files a/dbrepo-search-service/lib/dbrepo-1.8.2rc6.tar.gz and /dev/null differ
diff --git a/dbrepo-storage-service/init/Dockerfile b/dbrepo-storage-service/init/Dockerfile
index ad0d2ae853b7a0cb9a4aa87c782c939547c3dd4b..7ea74cddf1e5d1ca5fe686aee621c5f988756560 100644
--- a/dbrepo-storage-service/init/Dockerfile
+++ b/dbrepo-storage-service/init/Dockerfile
@@ -7,6 +7,9 @@ RUN apk --no-cache add \
 
 WORKDIR /app
 
+RUN mkdir -p /var/log/app/service/storage && \
+    chown -R 1001:1001 /var/log/app/service/storage
+
 RUN adduser -D dbrepo --uid 1001
 
 COPY --chown=1001 --chmod=0744 ./init.sh /app/init.sh
diff --git a/dbrepo-storage-service/init/init.sh b/dbrepo-storage-service/init/init.sh
index b112f70ac8cae6b6dae0612bf2e0d0bb7c6f5f27..f40712e81be5e7030c4c3988896411e8fde7f36a 100644
--- a/dbrepo-storage-service/init/init.sh
+++ b/dbrepo-storage-service/init/init.sh
@@ -10,12 +10,18 @@ use_https = False
 signature_v2 = False
 EOF
 
+function log() {
+    echo "{\"@timestamp\":\"$(date --rfc-3339='seconds')\", \"log.level\": \"$1\", \"message\": \"$2\"}" >> /var/log/app/service/storage/init.log
+}
+
 # create bucket
 if s3cmd --config=/app/.s3cfg ls | grep -q "s3://${S3_BUCKET}"; then
-  echo "[INFO] Bucket s3://${S3_BUCKET} already exists, skip."
+  echo "[INFO] Bucket s3://${S3_BUCKET} already exists, skip"
+  log "INFO" "Bucket s3://${S3_BUCKET} already exists, skip"
 else
   if ! s3cmd --config=/app/.s3cfg mb s3://${S3_BUCKET}; then
     echo "[ERROR] Failed to create bucket s3://${S3_BUCKET}"
+    log "ERROR" "Failed to create bucket s3://${S3_BUCKET}"
   fi
 fi
 
diff --git a/dbrepo-ui/bun.lockb b/dbrepo-ui/bun.lockb
index a4bc73dcd16c8e4a59a34fd431a7acf3a20627fa..d455f25e4329f14f8ca9973e541a3a5a1bba5281 100755
Binary files a/dbrepo-ui/bun.lockb and b/dbrepo-ui/bun.lockb differ
diff --git a/dbrepo-ui/layouts/default.vue b/dbrepo-ui/layouts/default.vue
index 7267242288c5eadaf184fdb1afe4e485a03f78dc..5784905294da2842c18aa9779e191a34f3c4ab76 100644
--- a/dbrepo-ui/layouts/default.vue
+++ b/dbrepo-ui/layouts/default.vue
@@ -56,7 +56,7 @@
           <v-spacer />
           <v-btn
             variant="plain"
-            :text="commitShort"
+            :text="commit"
             size="x-small"
             prepend-icon="mdi-source-commit"
             :href="`https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/commit/${commit}`" />
@@ -249,9 +249,6 @@ export default {
     commit () {
       return this.$config.public.commit
     },
-    commitShort () {
-      return this.$config.public.commit.substr(0, 8)
-    },
     error () {
       if (this.identifier) {
         return null
diff --git a/dbrepo-ui/package-lock.json b/dbrepo-ui/package-lock.json
deleted file mode 100644
index 52dbae9ae9248f8c70c251817a101b95ecf42ed9..0000000000000000000000000000000000000000
--- a/dbrepo-ui/package-lock.json
+++ /dev/null
@@ -1,12446 +0,0 @@
-{
-  "name": "dbrepo-ui",
-  "lockfileVersion": 3,
-  "requires": true,
-  "packages": {
-    "": {
-      "name": "dbrepo-ui",
-      "hasInstallScript": true,
-      "dependencies": {
-        "@artmizu/nuxt-prometheus": "^2.4.0",
-        "@date-fns/utc": "^2.1.0",
-        "@fontsource/open-sans": "^5.0.24",
-        "@mdi/font": "^7.4.47",
-        "@nuxtjs/robots": "^3.0.0",
-        "@nuxtjs/sitemap": "^5.2.0",
-        "@pinia/nuxt": "^0.5.1",
-        "ace-builds": "^1.32.6",
-        "axios": "^1.6.7",
-        "buffer": "^6.0.3",
-        "chart.js": "^4.4.1",
-        "date-fns": "^3.3.1",
-        "http-status-codes": "^2.3.0",
-        "jwt-decode": "^4.0.0",
-        "merkle-json": "^2.6.0",
-        "moment": "^2.30.1",
-        "nuxt": "^3.10.3",
-        "nuxt-oidc-auth": "^1.0.0-beta.5",
-        "parse-md": "^3.0.3",
-        "pinia": "^2.1.7",
-        "qs": "^6.11.2",
-        "sql-formatter": "^15.2.0",
-        "tus-js-client": "^4.0.1",
-        "vue": "^3.4.21",
-        "vue-axios": "^3.5.2",
-        "vue-chartjs": "^5.3.0",
-        "vue-meta": "^2.4.0",
-        "vue-toast-notification": "^3.1.2",
-        "vue3-ace-editor": "^2.2.4",
-        "vuetify": "^3.7.2"
-      },
-      "devDependencies": {
-        "@nuxtjs/i18n": "^8.1.1",
-        "@pinia-plugin-persistedstate/nuxt": "^1.2.0",
-        "@types/qs": "^6.9.12",
-        "sass": "^1.71.0",
-        "vite-plugin-vuetify": "^2.0.4"
-      }
-    },
-    "node_modules/@ampproject/remapping": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
-      "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
-      "dependencies": {
-        "@jridgewell/gen-mapping": "^0.3.5",
-        "@jridgewell/trace-mapping": "^0.3.24"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@antfu/install-pkg": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.0.0.tgz",
-      "integrity": "sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==",
-      "dependencies": {
-        "package-manager-detector": "^0.2.8",
-        "tinyexec": "^0.3.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@antfu/utils": {
-      "version": "0.7.10",
-      "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz",
-      "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@artmizu/nuxt-prometheus": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/@artmizu/nuxt-prometheus/-/nuxt-prometheus-2.4.0.tgz",
-      "integrity": "sha512-scLoSmOXN2SAGOkO/eFFN1MvfLUcj/FLN7cXCda5xQnHfHTKL3ac2BHgeyv4ylleirnOwYfWzco/KQXx2WixHQ==",
-      "dependencies": {
-        "@mswjs/interceptors": "^0.28.4",
-        "@nuxt/kit": "^3.11.2",
-        "consola": "^3.2.3",
-        "defu": "^6.1.2",
-        "h3": "^1.7.1",
-        "prom-client": "^14.2.0"
-      }
-    },
-    "node_modules/@babel/code-frame": {
-      "version": "7.26.2",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
-      "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
-      "dependencies": {
-        "@babel/helper-validator-identifier": "^7.25.9",
-        "js-tokens": "^4.0.0",
-        "picocolors": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/compat-data": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
-      "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/core": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz",
-      "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==",
-      "dependencies": {
-        "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.26.2",
-        "@babel/generator": "^7.26.9",
-        "@babel/helper-compilation-targets": "^7.26.5",
-        "@babel/helper-module-transforms": "^7.26.0",
-        "@babel/helpers": "^7.26.9",
-        "@babel/parser": "^7.26.9",
-        "@babel/template": "^7.26.9",
-        "@babel/traverse": "^7.26.9",
-        "@babel/types": "^7.26.9",
-        "convert-source-map": "^2.0.0",
-        "debug": "^4.1.0",
-        "gensync": "^1.0.0-beta.2",
-        "json5": "^2.2.3",
-        "semver": "^6.3.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/babel"
-      }
-    },
-    "node_modules/@babel/core/node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/generator": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz",
-      "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==",
-      "dependencies": {
-        "@babel/parser": "^7.26.9",
-        "@babel/types": "^7.26.9",
-        "@jridgewell/gen-mapping": "^0.3.5",
-        "@jridgewell/trace-mapping": "^0.3.25",
-        "jsesc": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-annotate-as-pure": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
-      "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
-      "dependencies": {
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.26.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
-      "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
-      "dependencies": {
-        "@babel/compat-data": "^7.26.5",
-        "@babel/helper-validator-option": "^7.25.9",
-        "browserslist": "^4.24.0",
-        "lru-cache": "^5.1.1",
-        "semver": "^6.3.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/helper-create-class-features-plugin": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz",
-      "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==",
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.25.9",
-        "@babel/helper-member-expression-to-functions": "^7.25.9",
-        "@babel/helper-optimise-call-expression": "^7.25.9",
-        "@babel/helper-replace-supers": "^7.26.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
-        "@babel/traverse": "^7.26.9",
-        "semver": "^6.3.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/helper-member-expression-to-functions": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
-      "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
-      "dependencies": {
-        "@babel/traverse": "^7.25.9",
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-module-imports": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
-      "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
-      "dependencies": {
-        "@babel/traverse": "^7.25.9",
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-module-transforms": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
-      "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
-      "dependencies": {
-        "@babel/helper-module-imports": "^7.25.9",
-        "@babel/helper-validator-identifier": "^7.25.9",
-        "@babel/traverse": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/helper-optimise-call-expression": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
-      "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
-      "dependencies": {
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.26.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
-      "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-replace-supers": {
-      "version": "7.26.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz",
-      "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==",
-      "dependencies": {
-        "@babel/helper-member-expression-to-functions": "^7.25.9",
-        "@babel/helper-optimise-call-expression": "^7.25.9",
-        "@babel/traverse": "^7.26.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
-      "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
-      "dependencies": {
-        "@babel/traverse": "^7.25.9",
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-string-parser": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
-      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
-      "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-validator-option": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
-      "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helpers": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz",
-      "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==",
-      "dependencies": {
-        "@babel/template": "^7.26.9",
-        "@babel/types": "^7.26.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/parser": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz",
-      "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==",
-      "dependencies": {
-        "@babel/types": "^7.26.9"
-      },
-      "bin": {
-        "parser": "bin/babel-parser.js"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-decorators": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz",
-      "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==",
-      "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/plugin-syntax-decorators": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-decorators": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz",
-      "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-import-attributes": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
-      "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-import-meta": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
-      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-jsx": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
-      "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-typescript": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
-      "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-typescript": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz",
-      "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==",
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.25.9",
-        "@babel/helper-create-class-features-plugin": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.26.5",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
-        "@babel/plugin-syntax-typescript": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/standalone": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.26.9.tgz",
-      "integrity": "sha512-UTeQKy0kzJwWRe55kT1uK4G9H6D0lS6G4207hCU/bDaOhA5t2aC0qHN6GmID0Axv3OFLNXm27NdqcWp+BXcGtA==",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/template": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
-      "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
-      "dependencies": {
-        "@babel/code-frame": "^7.26.2",
-        "@babel/parser": "^7.26.9",
-        "@babel/types": "^7.26.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/traverse": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz",
-      "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==",
-      "dependencies": {
-        "@babel/code-frame": "^7.26.2",
-        "@babel/generator": "^7.26.9",
-        "@babel/parser": "^7.26.9",
-        "@babel/template": "^7.26.9",
-        "@babel/types": "^7.26.9",
-        "debug": "^4.3.1",
-        "globals": "^11.1.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/types": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz",
-      "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==",
-      "dependencies": {
-        "@babel/helper-string-parser": "^7.25.9",
-        "@babel/helper-validator-identifier": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@cloudflare/kv-asset-handler": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz",
-      "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==",
-      "dependencies": {
-        "mime": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=16.13"
-      }
-    },
-    "node_modules/@cloudflare/kv-asset-handler/node_modules/mime": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
-      "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/@date-fns/utc": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@date-fns/utc/-/utc-2.1.0.tgz",
-      "integrity": "sha512-176grgAgU2U303rD2/vcOmNg0kGPbhzckuH1TEP2al7n0AQipZIy9P15usd2TKQCG1g+E1jX/ZVQSzs4sUDwgA=="
-    },
-    "node_modules/@esbuild/aix-ppc64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz",
-      "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==",
-      "cpu": [
-        "ppc64"
-      ],
-      "optional": true,
-      "os": [
-        "aix"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/android-arm": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz",
-      "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==",
-      "cpu": [
-        "arm"
-      ],
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/android-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz",
-      "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/android-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz",
-      "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz",
-      "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/darwin-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz",
-      "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz",
-      "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz",
-      "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-arm": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz",
-      "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==",
-      "cpu": [
-        "arm"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz",
-      "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-ia32": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz",
-      "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==",
-      "cpu": [
-        "ia32"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-loong64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz",
-      "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==",
-      "cpu": [
-        "loong64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz",
-      "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==",
-      "cpu": [
-        "mips64el"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz",
-      "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==",
-      "cpu": [
-        "ppc64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz",
-      "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==",
-      "cpu": [
-        "riscv64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-s390x": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz",
-      "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==",
-      "cpu": [
-        "s390x"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz",
-      "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/netbsd-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz",
-      "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz",
-      "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/openbsd-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz",
-      "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz",
-      "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/sunos-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz",
-      "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/win32-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz",
-      "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/win32-ia32": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz",
-      "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==",
-      "cpu": [
-        "ia32"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/win32-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz",
-      "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@fontsource/open-sans": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/@fontsource/open-sans/-/open-sans-5.1.1.tgz",
-      "integrity": "sha512-Wfio5om0XH24ZUu6FfW4r50e4xLdoLzvd8midtqUFT2unniyWQj6GJ05RW1YQsHp4Sug3i+agFBIxEmYQzUHSg=="
-    },
-    "node_modules/@iconify-json/carbon": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/@iconify-json/carbon/-/carbon-1.2.7.tgz",
-      "integrity": "sha512-nqEjicnNdb3CnY21MsTr9DfU8JBkP9C8hup1bCe4zvpLKjcU9YRmYChUbqZYBP4P+BL5NdrprTSN+B7qJg3H3Q==",
-      "dependencies": {
-        "@iconify/types": "*"
-      }
-    },
-    "node_modules/@iconify-json/logos": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/@iconify-json/logos/-/logos-1.2.4.tgz",
-      "integrity": "sha512-XC4If5D/hbaZvUkTV8iaZuGlQCyG6CNOlaAaJaGa13V5QMYwYjgtKk3vPP8wz3wtTVNVEVk3LRx1fOJz+YnSMw==",
-      "dependencies": {
-        "@iconify/types": "*"
-      }
-    },
-    "node_modules/@iconify-json/ri": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/@iconify-json/ri/-/ri-1.2.5.tgz",
-      "integrity": "sha512-kWGimOXMZrlYusjBKKXYOWcKhbOHusFsmrmRGmjS7rH0BpML5A9/fy8KHZqFOwZfC4M6amObQYbh8BqO5cMC3w==",
-      "dependencies": {
-        "@iconify/types": "*"
-      }
-    },
-    "node_modules/@iconify-json/tabler": {
-      "version": "1.2.16",
-      "resolved": "https://registry.npmjs.org/@iconify-json/tabler/-/tabler-1.2.16.tgz",
-      "integrity": "sha512-gjvKz38+aOxfZtRvycYrASYipCsHRbCZ/Df49T0tfPntT0ur+qsgJ7PxCM4JF/Xs6+n3JkaFdiUz/N4ZZxDKdQ==",
-      "dependencies": {
-        "@iconify/types": "*"
-      }
-    },
-    "node_modules/@iconify/types": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
-      "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="
-    },
-    "node_modules/@iconify/utils": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz",
-      "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==",
-      "dependencies": {
-        "@antfu/install-pkg": "^1.0.0",
-        "@antfu/utils": "^8.1.0",
-        "@iconify/types": "^2.0.0",
-        "debug": "^4.4.0",
-        "globals": "^15.14.0",
-        "kolorist": "^1.8.0",
-        "local-pkg": "^1.0.0",
-        "mlly": "^1.7.4"
-      }
-    },
-    "node_modules/@iconify/utils/node_modules/@antfu/utils": {
-      "version": "8.1.1",
-      "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz",
-      "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@iconify/utils/node_modules/globals": {
-      "version": "15.15.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
-      "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@iconify/utils/node_modules/local-pkg": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz",
-      "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==",
-      "dependencies": {
-        "mlly": "^1.7.3",
-        "pkg-types": "^1.3.0"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@intlify/bundle-utils": {
-      "version": "7.5.1",
-      "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-7.5.1.tgz",
-      "integrity": "sha512-UovJl10oBIlmYEcWw+VIHdKY5Uv5sdPG0b/b6bOYxGLln3UwB75+2dlc0F3Fsa0RhoznQ5Rp589/BZpABpE4Xw==",
-      "dev": true,
-      "dependencies": {
-        "@intlify/message-compiler": "^9.4.0",
-        "@intlify/shared": "^9.4.0",
-        "acorn": "^8.8.2",
-        "escodegen": "^2.1.0",
-        "estree-walker": "^2.0.2",
-        "jsonc-eslint-parser": "^2.3.0",
-        "magic-string": "^0.30.0",
-        "mlly": "^1.2.0",
-        "source-map-js": "^1.0.1",
-        "yaml-eslint-parser": "^1.2.2"
-      },
-      "engines": {
-        "node": ">= 14.16"
-      },
-      "peerDependenciesMeta": {
-        "petite-vue-i18n": {
-          "optional": true
-        },
-        "vue-i18n": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@intlify/bundle-utils/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-      "dev": true
-    },
-    "node_modules/@intlify/core": {
-      "version": "9.14.2",
-      "resolved": "https://registry.npmjs.org/@intlify/core/-/core-9.14.2.tgz",
-      "integrity": "sha512-/YsYOtRdKn2RbIz9FjYdb4ZntcB7hJmlfHjMRrRXOH2rJE9T5kdYCTS+LS75xQkRCeHFdAmjGMADuoy4HYpHfA==",
-      "dev": true,
-      "dependencies": {
-        "@intlify/core-base": "9.14.2",
-        "@intlify/shared": "9.14.2"
-      },
-      "engines": {
-        "node": ">= 16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/kazupon"
-      }
-    },
-    "node_modules/@intlify/core-base": {
-      "version": "9.14.2",
-      "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.2.tgz",
-      "integrity": "sha512-DZyQ4Hk22sC81MP4qiCDuU+LdaYW91A6lCjq8AWPvY3+mGMzhGDfOCzvyR6YBQxtlPjFqMoFk9ylnNYRAQwXtQ==",
-      "dev": true,
-      "dependencies": {
-        "@intlify/message-compiler": "9.14.2",
-        "@intlify/shared": "9.14.2"
-      },
-      "engines": {
-        "node": ">= 16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/kazupon"
-      }
-    },
-    "node_modules/@intlify/h3": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/@intlify/h3/-/h3-0.5.0.tgz",
-      "integrity": "sha512-cgfrtD3qu3BPJ47gfZ35J2LJpI64Riic0K8NGgid5ilyPXRQTNY7mXlT/B+HZYQg1hmBxKa5G5HJXyAZ4R2H5A==",
-      "dev": true,
-      "dependencies": {
-        "@intlify/core": "^9.8.0",
-        "@intlify/utils": "^0.12.0"
-      },
-      "engines": {
-        "node": ">= 18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/kazupon"
-      }
-    },
-    "node_modules/@intlify/message-compiler": {
-      "version": "9.14.2",
-      "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.2.tgz",
-      "integrity": "sha512-YsKKuV4Qv4wrLNsvgWbTf0E40uRv+Qiw1BeLQ0LAxifQuhiMe+hfTIzOMdWj/ZpnTDj4RSZtkXjJM7JDiiB5LQ==",
-      "dev": true,
-      "dependencies": {
-        "@intlify/shared": "9.14.2",
-        "source-map-js": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/kazupon"
-      }
-    },
-    "node_modules/@intlify/shared": {
-      "version": "9.14.2",
-      "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.2.tgz",
-      "integrity": "sha512-uRAHAxYPeF+G5DBIboKpPgC/Waecd4Jz8ihtkpJQD5ycb5PwXp0k/+hBGl5dAjwF7w+l74kz/PKA8r8OK//RUw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/kazupon"
-      }
-    },
-    "node_modules/@intlify/unplugin-vue-i18n": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-3.0.1.tgz",
-      "integrity": "sha512-q1zJhA/WpoLBzAAuKA5/AEp0e+bMOM10ll/HxT4g1VAw/9JhC4TTobP9KobKH90JMZ4U2daLFlYQfKNd29lpqw==",
-      "dev": true,
-      "dependencies": {
-        "@intlify/bundle-utils": "^7.4.0",
-        "@intlify/shared": "^9.4.0",
-        "@rollup/pluginutils": "^5.1.0",
-        "@vue/compiler-sfc": "^3.2.47",
-        "debug": "^4.3.3",
-        "fast-glob": "^3.2.12",
-        "js-yaml": "^4.1.0",
-        "json5": "^2.2.3",
-        "pathe": "^1.0.0",
-        "picocolors": "^1.0.0",
-        "source-map-js": "^1.0.2",
-        "unplugin": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 14.16"
-      },
-      "peerDependencies": {
-        "petite-vue-i18n": "*",
-        "vue-i18n": "*",
-        "vue-i18n-bridge": "*"
-      },
-      "peerDependenciesMeta": {
-        "petite-vue-i18n": {
-          "optional": true
-        },
-        "vue-i18n": {
-          "optional": true
-        },
-        "vue-i18n-bridge": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@intlify/unplugin-vue-i18n/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
-      "dev": true
-    },
-    "node_modules/@intlify/utils": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/@intlify/utils/-/utils-0.12.0.tgz",
-      "integrity": "sha512-yCBNcuZQ49iInqmWC2xfW0rgEQyNtCM8C8KcWKTXxyscgUE1+48gjLgZZqP75MjhlApxwph7ZMWLqyABkSgxQA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/kazupon"
-      }
-    },
-    "node_modules/@ioredis/commands": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz",
-      "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg=="
-    },
-    "node_modules/@isaacs/cliui": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
-      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
-      "dependencies": {
-        "string-width": "^5.1.2",
-        "string-width-cjs": "npm:string-width@^4.2.0",
-        "strip-ansi": "^7.0.1",
-        "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
-        "wrap-ansi": "^8.1.0",
-        "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
-      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
-      }
-    },
-    "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
-      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
-      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
-    },
-    "node_modules/@isaacs/cliui/node_modules/string-width": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
-      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
-      "dependencies": {
-        "eastasianwidth": "^0.2.0",
-        "emoji-regex": "^9.2.2",
-        "strip-ansi": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
-      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
-      "dependencies": {
-        "ansi-regex": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
-      }
-    },
-    "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
-      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
-      "dependencies": {
-        "ansi-styles": "^6.1.0",
-        "string-width": "^5.0.1",
-        "strip-ansi": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/@isaacs/fs-minipass": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
-      "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
-      "dependencies": {
-        "minipass": "^7.0.4"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
-    "node_modules/@isaacs/fs-minipass/node_modules/minipass": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
-      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      }
-    },
-    "node_modules/@jridgewell/gen-mapping": {
-      "version": "0.3.8",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
-      "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
-      "dependencies": {
-        "@jridgewell/set-array": "^1.2.1",
-        "@jridgewell/sourcemap-codec": "^1.4.10",
-        "@jridgewell/trace-mapping": "^0.3.24"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@jridgewell/resolve-uri": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
-      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@jridgewell/set-array": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
-      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@jridgewell/source-map": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
-      "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
-      "dependencies": {
-        "@jridgewell/gen-mapping": "^0.3.5",
-        "@jridgewell/trace-mapping": "^0.3.25"
-      }
-    },
-    "node_modules/@jridgewell/sourcemap-codec": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
-      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
-    },
-    "node_modules/@jridgewell/trace-mapping": {
-      "version": "0.3.25",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
-      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
-      "dependencies": {
-        "@jridgewell/resolve-uri": "^3.1.0",
-        "@jridgewell/sourcemap-codec": "^1.4.14"
-      }
-    },
-    "node_modules/@kurkle/color": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz",
-      "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w=="
-    },
-    "node_modules/@kwsites/file-exists": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
-      "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==",
-      "dependencies": {
-        "debug": "^4.1.1"
-      }
-    },
-    "node_modules/@kwsites/promise-deferred": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz",
-      "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="
-    },
-    "node_modules/@mapbox/node-pre-gyp": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz",
-      "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==",
-      "dependencies": {
-        "consola": "^3.2.3",
-        "detect-libc": "^2.0.0",
-        "https-proxy-agent": "^7.0.5",
-        "node-fetch": "^2.6.7",
-        "nopt": "^8.0.0",
-        "semver": "^7.5.3",
-        "tar": "^7.4.0"
-      },
-      "bin": {
-        "node-pre-gyp": "bin/node-pre-gyp"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/chownr": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
-      "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/detect-libc": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
-      "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/minipass": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
-      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      }
-    },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/minizlib": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz",
-      "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==",
-      "dependencies": {
-        "minipass": "^7.0.4",
-        "rimraf": "^5.0.5"
-      },
-      "engines": {
-        "node": ">= 18"
-      }
-    },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/mkdirp": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
-      "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
-      "bin": {
-        "mkdirp": "dist/cjs/src/bin.js"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/tar": {
-      "version": "7.4.3",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz",
-      "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==",
-      "dependencies": {
-        "@isaacs/fs-minipass": "^4.0.0",
-        "chownr": "^3.0.0",
-        "minipass": "^7.1.2",
-        "minizlib": "^3.0.1",
-        "mkdirp": "^3.0.1",
-        "yallist": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
-      "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@mdi/font": {
-      "version": "7.4.47",
-      "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.4.47.tgz",
-      "integrity": "sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw=="
-    },
-    "node_modules/@miyaneee/rollup-plugin-json5": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@miyaneee/rollup-plugin-json5/-/rollup-plugin-json5-1.2.0.tgz",
-      "integrity": "sha512-JjTIaXZp9WzhUHpElrqPnl1AzBi/rvRs065F71+aTmlqvTMVkdbjZ8vfFl4nRlgJy+TPBw69ZK4pwFdmOAt4aA==",
-      "dev": true,
-      "dependencies": {
-        "@rollup/pluginutils": "^5.1.0",
-        "json5": "^2.2.3"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0"
-      }
-    },
-    "node_modules/@mswjs/interceptors": {
-      "version": "0.28.4",
-      "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.28.4.tgz",
-      "integrity": "sha512-xQpXZswUUG+V+7bD/L2hZUC5mvxW1BPba2yI5yhRq+IpEXFPEGYzUuJUuvJBELyG7RLCxgrOjmqzeE5hgqa0aQ==",
-      "dependencies": {
-        "@open-draft/deferred-promise": "^2.2.0",
-        "@open-draft/logger": "^0.3.0",
-        "@open-draft/until": "^2.0.0",
-        "is-node-process": "^1.2.0",
-        "outvariant": "^1.2.1",
-        "strict-event-emitter": "^0.5.1"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@netlify/functions": {
-      "version": "2.8.2",
-      "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-2.8.2.tgz",
-      "integrity": "sha512-DeoAQh8LuNPvBE4qsKlezjKj0PyXDryOFJfJKo3Z1qZLKzQ21sT314KQKPVjfvw6knqijj+IO+0kHXy/TJiqNA==",
-      "dependencies": {
-        "@netlify/serverless-functions-api": "1.26.1"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      }
-    },
-    "node_modules/@netlify/node-cookies": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/@netlify/node-cookies/-/node-cookies-0.1.0.tgz",
-      "integrity": "sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==",
-      "engines": {
-        "node": "^14.16.0 || >=16.0.0"
-      }
-    },
-    "node_modules/@netlify/serverless-functions-api": {
-      "version": "1.26.1",
-      "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.26.1.tgz",
-      "integrity": "sha512-q3L9i3HoNfz0SGpTIS4zTcKBbRkxzCRpd169eyiTuk3IwcPC3/85mzLHranlKo2b+HYT0gu37YxGB45aD8A3Tw==",
-      "dependencies": {
-        "@netlify/node-cookies": "^0.1.0",
-        "urlpattern-polyfill": "8.0.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
-    "node_modules/@nodelib/fs.scandir": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
-      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
-      "dependencies": {
-        "@nodelib/fs.stat": "2.0.5",
-        "run-parallel": "^1.1.9"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nodelib/fs.stat": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
-      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nodelib/fs.walk": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
-      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
-      "dependencies": {
-        "@nodelib/fs.scandir": "2.1.5",
-        "fastq": "^1.6.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nuxt/cli": {
-      "version": "3.22.2",
-      "resolved": "https://registry.npmjs.org/@nuxt/cli/-/cli-3.22.2.tgz",
-      "integrity": "sha512-Xtu3Loe3fVLvOE1/NC/SrE6Buu7Aj6qrnu3hewAfamUyZ7mVUBOsJ5ScUhofSK2L6muGPvS3R1PisuJMFbdexg==",
-      "dependencies": {
-        "c12": "^2.0.2",
-        "chokidar": "^4.0.3",
-        "citty": "^0.1.6",
-        "clipboardy": "^4.0.0",
-        "consola": "^3.4.0",
-        "defu": "^6.1.4",
-        "fuse.js": "^7.1.0",
-        "giget": "^1.2.4",
-        "h3": "^1.15.0",
-        "httpxy": "^0.1.7",
-        "jiti": "^2.4.2",
-        "listhen": "^1.9.0",
-        "nypm": "^0.5.2",
-        "ofetch": "^1.4.1",
-        "ohash": "^2.0.2",
-        "pathe": "^2.0.3",
-        "perfect-debounce": "^1.0.0",
-        "pkg-types": "^1.3.1",
-        "scule": "^1.3.0",
-        "semver": "^7.7.1",
-        "std-env": "^3.8.0",
-        "tinyexec": "^0.3.2",
-        "ufo": "^1.5.4"
-      },
-      "bin": {
-        "nuxi": "bin/nuxi.mjs",
-        "nuxi-ng": "bin/nuxi.mjs",
-        "nuxt": "bin/nuxi.mjs",
-        "nuxt-cli": "bin/nuxi.mjs"
-      },
-      "engines": {
-        "node": "^16.10.0 || >=18.0.0"
-      }
-    },
-    "node_modules/@nuxt/cli/node_modules/ohash": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.4.tgz",
-      "integrity": "sha512-ac+SFwzhdHb0hp48/dbR7Jta39qfbuj7t3hApd9uyHS8bisHTfVzSEvjOVgV0L3zG7VR2/7JjkSGimP75D+hOQ=="
-    },
-    "node_modules/@nuxt/devalue": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.2.tgz",
-      "integrity": "sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA=="
-    },
-    "node_modules/@nuxt/devtools": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/@nuxt/devtools/-/devtools-1.7.0.tgz",
-      "integrity": "sha512-uvnjt5Zowkz7tZmnks2cGreg1XZIiSyVzQ2MYiRXACodlXcwJ0dpUS3WTxu8BR562K+772oRdvKie9AQlyZUgg==",
-      "dependencies": {
-        "@antfu/utils": "^0.7.10",
-        "@nuxt/devtools-kit": "1.7.0",
-        "@nuxt/devtools-wizard": "1.7.0",
-        "@nuxt/kit": "^3.15.0",
-        "@vue/devtools-core": "7.6.8",
-        "@vue/devtools-kit": "7.6.8",
-        "birpc": "^0.2.19",
-        "consola": "^3.3.1",
-        "cronstrue": "^2.52.0",
-        "destr": "^2.0.3",
-        "error-stack-parser-es": "^0.1.5",
-        "execa": "^7.2.0",
-        "fast-npm-meta": "^0.2.2",
-        "flatted": "^3.3.2",
-        "get-port-please": "^3.1.2",
-        "hookable": "^5.5.3",
-        "image-meta": "^0.2.1",
-        "is-installed-globally": "^1.0.0",
-        "launch-editor": "^2.9.1",
-        "local-pkg": "^0.5.1",
-        "magicast": "^0.3.5",
-        "nypm": "^0.4.1",
-        "ohash": "^1.1.4",
-        "pathe": "^1.1.2",
-        "perfect-debounce": "^1.0.0",
-        "pkg-types": "^1.2.1",
-        "rc9": "^2.1.2",
-        "scule": "^1.3.0",
-        "semver": "^7.6.3",
-        "simple-git": "^3.27.0",
-        "sirv": "^3.0.0",
-        "tinyglobby": "^0.2.10",
-        "unimport": "^3.14.5",
-        "vite-plugin-inspect": "~0.8.9",
-        "vite-plugin-vue-inspector": "^5.3.1",
-        "which": "^3.0.1",
-        "ws": "^8.18.0"
-      },
-      "bin": {
-        "devtools": "cli.mjs"
-      },
-      "peerDependencies": {
-        "vite": "*"
-      }
-    },
-    "node_modules/@nuxt/devtools-kit": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-1.7.0.tgz",
-      "integrity": "sha512-+NgZ2uP5BuneqvQbe7EdOEaFEDy8762c99pLABtn7/Ur0ExEsQJMP7pYjjoTfKubhBqecr5Vo9yHkPBj1eHulQ==",
-      "dependencies": {
-        "@nuxt/kit": "^3.15.0",
-        "@nuxt/schema": "^3.15.0",
-        "execa": "^7.2.0"
-      },
-      "peerDependencies": {
-        "vite": "*"
-      }
-    },
-    "node_modules/@nuxt/devtools-ui-kit": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/@nuxt/devtools-ui-kit/-/devtools-ui-kit-1.7.0.tgz",
-      "integrity": "sha512-pYjwCP3FHz/rrEoJpb8plMinnPHRh+fFc90O+MncMC0aIGydtu4SGwAE3fZsg//JXqkvlY+JyozxqtF9IRA7rA==",
-      "dependencies": {
-        "@iconify-json/carbon": "^1.2.5",
-        "@iconify-json/logos": "^1.2.4",
-        "@iconify-json/ri": "^1.2.5",
-        "@iconify-json/tabler": "^1.2.13",
-        "@nuxt/devtools-kit": "1.7.0",
-        "@nuxt/kit": "^3.15.0",
-        "@unocss/core": "^0.65.3",
-        "@unocss/nuxt": "^0.65.3",
-        "@unocss/preset-attributify": "^0.65.3",
-        "@unocss/preset-icons": "^0.65.3",
-        "@unocss/preset-mini": "^0.65.3",
-        "@unocss/reset": "^0.65.3",
-        "@vueuse/core": "^12.2.0",
-        "@vueuse/integrations": "^12.2.0",
-        "@vueuse/nuxt": "^12.2.0",
-        "defu": "^6.1.4",
-        "focus-trap": "^7.6.2",
-        "splitpanes": "^3.1.5",
-        "unocss": "^0.65.3",
-        "v-lazy-show": "^0.3.0"
-      },
-      "peerDependencies": {
-        "@nuxt/devtools": "1.7.0"
-      }
-    },
-    "node_modules/@nuxt/devtools-wizard": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/@nuxt/devtools-wizard/-/devtools-wizard-1.7.0.tgz",
-      "integrity": "sha512-86Gd92uEw0Dh2ErIYT9TMIrMOISE96fCRN4rxeryTvyiowQOsyrbkCeMNYrEehoRL+lohoyK6iDmFajadPNwWQ==",
-      "dependencies": {
-        "consola": "^3.3.1",
-        "diff": "^7.0.0",
-        "execa": "^7.2.0",
-        "global-directory": "^4.0.1",
-        "magicast": "^0.3.5",
-        "pathe": "^1.1.2",
-        "pkg-types": "^1.2.1",
-        "prompts": "^2.4.2",
-        "rc9": "^2.1.2",
-        "semver": "^7.6.3"
-      },
-      "bin": {
-        "devtools-wizard": "cli.mjs"
-      }
-    },
-    "node_modules/@nuxt/devtools-wizard/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
-    },
-    "node_modules/@nuxt/devtools/node_modules/js-tokens": {
-      "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
-      "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="
-    },
-    "node_modules/@nuxt/devtools/node_modules/nypm": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.4.1.tgz",
-      "integrity": "sha512-1b9mihliBh8UCcKtcGRu//G50iHpjxIQVUqkdhPT/SDVE7KdJKoHXLS0heuYTQCx95dFqiyUbXZB9r8ikn+93g==",
-      "dependencies": {
-        "citty": "^0.1.6",
-        "consola": "^3.2.3",
-        "pathe": "^1.1.2",
-        "pkg-types": "^1.2.1",
-        "tinyexec": "^0.3.1",
-        "ufo": "^1.5.4"
-      },
-      "bin": {
-        "nypm": "dist/cli.mjs"
-      },
-      "engines": {
-        "node": "^14.16.0 || >=16.10.0"
-      }
-    },
-    "node_modules/@nuxt/devtools/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
-    },
-    "node_modules/@nuxt/devtools/node_modules/sirv": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz",
-      "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==",
-      "dependencies": {
-        "@polka/url": "^1.0.0-next.24",
-        "mrmime": "^2.0.0",
-        "totalist": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@nuxt/devtools/node_modules/strip-literal": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz",
-      "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==",
-      "dependencies": {
-        "js-tokens": "^9.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@nuxt/devtools/node_modules/unimport": {
-      "version": "3.14.6",
-      "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.14.6.tgz",
-      "integrity": "sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==",
-      "dependencies": {
-        "@rollup/pluginutils": "^5.1.4",
-        "acorn": "^8.14.0",
-        "escape-string-regexp": "^5.0.0",
-        "estree-walker": "^3.0.3",
-        "fast-glob": "^3.3.3",
-        "local-pkg": "^1.0.0",
-        "magic-string": "^0.30.17",
-        "mlly": "^1.7.4",
-        "pathe": "^2.0.1",
-        "picomatch": "^4.0.2",
-        "pkg-types": "^1.3.0",
-        "scule": "^1.3.0",
-        "strip-literal": "^2.1.1",
-        "unplugin": "^1.16.1"
-      }
-    },
-    "node_modules/@nuxt/devtools/node_modules/unimport/node_modules/local-pkg": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz",
-      "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==",
-      "dependencies": {
-        "mlly": "^1.7.3",
-        "pkg-types": "^1.3.0"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@nuxt/devtools/node_modules/unimport/node_modules/pathe": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
-      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="
-    },
-    "node_modules/@nuxt/devtools/node_modules/which": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz",
-      "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==",
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/which.js"
-      },
-      "engines": {
-        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-      }
-    },
-    "node_modules/@nuxt/kit": {
-      "version": "3.15.4",
-      "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.15.4.tgz",
-      "integrity": "sha512-dr7I7eZOoRLl4uxdxeL2dQsH0OrbEiVPIyBHnBpA4co24CBnoJoF+JINuP9l3PAM3IhUzc5JIVq3/YY3lEc3Hw==",
-      "dependencies": {
-        "c12": "^2.0.1",
-        "consola": "^3.4.0",
-        "defu": "^6.1.4",
-        "destr": "^2.0.3",
-        "globby": "^14.0.2",
-        "ignore": "^7.0.3",
-        "jiti": "^2.4.2",
-        "klona": "^2.0.6",
-        "knitwork": "^1.2.0",
-        "mlly": "^1.7.4",
-        "ohash": "^1.1.4",
-        "pathe": "^2.0.2",
-        "pkg-types": "^1.3.1",
-        "scule": "^1.3.0",
-        "semver": "^7.6.3",
-        "std-env": "^3.8.0",
-        "ufo": "^1.5.4",
-        "unctx": "^2.4.1",
-        "unimport": "^4.0.0",
-        "untyped": "^1.5.2"
-      },
-      "engines": {
-        "node": ">=18.12.0"
-      }
-    },
-    "node_modules/@nuxt/schema": {
-      "version": "3.15.4",
-      "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.15.4.tgz",
-      "integrity": "sha512-pAYZb/3ocSC/db1EFd5y+otmgHqUkvfxfhd9EknDB5DygnJuOIQNuGJ7LMJM6S2c0DYgBIHOdEelLxKHOjwbgQ==",
-      "dependencies": {
-        "consola": "^3.4.0",
-        "defu": "^6.1.4",
-        "pathe": "^2.0.2",
-        "std-env": "^3.8.0"
-      },
-      "engines": {
-        "node": "^14.18.0 || >=16.10.0"
-      }
-    },
-    "node_modules/@nuxt/telemetry": {
-      "version": "2.6.5",
-      "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-2.6.5.tgz",
-      "integrity": "sha512-lwMp9OHML/m0mjh7P5iz9PxINnk5smGkGebh88Wh8PjvnRooY1TBsbyq7mlSrNibpwD1BkwqhV5IAZOXWHLxMQ==",
-      "dependencies": {
-        "@nuxt/kit": "^3.15.4",
-        "citty": "^0.1.6",
-        "consola": "^3.4.0",
-        "destr": "^2.0.3",
-        "dotenv": "^16.4.7",
-        "git-url-parse": "^16.0.0",
-        "is-docker": "^3.0.0",
-        "ofetch": "^1.4.1",
-        "package-manager-detector": "^0.2.9",
-        "parse-git-config": "^3.0.0",
-        "pathe": "^2.0.2",
-        "rc9": "^2.1.2",
-        "std-env": "^3.8.0"
-      },
-      "bin": {
-        "nuxt-telemetry": "bin/nuxt-telemetry.mjs"
-      },
-      "engines": {
-        "node": ">=18.12.0"
-      }
-    },
-    "node_modules/@nuxt/vite-builder": {
-      "version": "3.15.4",
-      "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.15.4.tgz",
-      "integrity": "sha512-yBK6tWT973+ExKC3ciTWymZpjJ+enToOtYz574kXCyGO0PbSnuXdoJKTvrwXw1lK97PajCKxExlmwI/3oLOmMQ==",
-      "dependencies": {
-        "@nuxt/kit": "3.15.4",
-        "@rollup/plugin-replace": "^6.0.2",
-        "@vitejs/plugin-vue": "^5.2.1",
-        "@vitejs/plugin-vue-jsx": "^4.1.1",
-        "autoprefixer": "^10.4.20",
-        "consola": "^3.4.0",
-        "cssnano": "^7.0.6",
-        "defu": "^6.1.4",
-        "esbuild": "^0.24.2",
-        "escape-string-regexp": "^5.0.0",
-        "externality": "^1.0.2",
-        "get-port-please": "^3.1.2",
-        "h3": "^1.14.0",
-        "jiti": "^2.4.2",
-        "knitwork": "^1.2.0",
-        "magic-string": "^0.30.17",
-        "mlly": "^1.7.4",
-        "ohash": "^1.1.4",
-        "pathe": "^2.0.2",
-        "perfect-debounce": "^1.0.0",
-        "pkg-types": "^1.3.1",
-        "postcss": "^8.5.1",
-        "rollup-plugin-visualizer": "^5.13.1",
-        "std-env": "^3.8.0",
-        "ufo": "^1.5.4",
-        "unenv": "^1.10.0",
-        "unplugin": "^2.1.2",
-        "vite": "^6.0.11",
-        "vite-node": "^3.0.4",
-        "vite-plugin-checker": "^0.8.0",
-        "vue-bundle-renderer": "^2.1.1"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0.0"
-      },
-      "peerDependencies": {
-        "vue": "^3.3.4"
-      }
-    },
-    "node_modules/@nuxt/vite-builder/node_modules/unplugin": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz",
-      "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==",
-      "dependencies": {
-        "acorn": "^8.14.0",
-        "webpack-virtual-modules": "^0.6.2"
-      },
-      "engines": {
-        "node": ">=18.12.0"
-      }
-    },
-    "node_modules/@nuxtjs/i18n": {
-      "version": "8.5.6",
-      "resolved": "https://registry.npmjs.org/@nuxtjs/i18n/-/i18n-8.5.6.tgz",
-      "integrity": "sha512-L+g+LygKNoaS/AXExk7tzS9wSNn9QdP1T9VdTjjEGYftpeFgv2U8AQsY0dQAhgPIbXXhIAkNYxTk4YcINj9CfA==",
-      "dev": true,
-      "dependencies": {
-        "@intlify/h3": "^0.5.0",
-        "@intlify/shared": "^9.14.1",
-        "@intlify/unplugin-vue-i18n": "^3.0.1",
-        "@intlify/utils": "^0.12.0",
-        "@miyaneee/rollup-plugin-json5": "^1.2.0",
-        "@nuxt/kit": "^3.13.1",
-        "@rollup/plugin-yaml": "^4.1.2",
-        "@vue/compiler-sfc": "^3.5.4",
-        "debug": "^4.3.5",
-        "defu": "^6.1.2",
-        "estree-walker": "^3.0.3",
-        "is-https": "^4.0.0",
-        "knitwork": "^1.1.0",
-        "magic-string": "^0.30.10",
-        "mlly": "^1.7.1",
-        "pathe": "^1.1.1",
-        "scule": "^1.1.1",
-        "sucrase": "^3.35.0",
-        "ufo": "^1.3.1",
-        "unplugin": "^1.10.1",
-        "vue-i18n": "^9.14.1",
-        "vue-router": "^4.4.4"
-      },
-      "engines": {
-        "node": "^14.16.0 || >=16.11.0"
-      }
-    },
-    "node_modules/@nuxtjs/i18n/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
-      "dev": true
-    },
-    "node_modules/@nuxtjs/robots": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@nuxtjs/robots/-/robots-3.0.0.tgz",
-      "integrity": "sha512-qsHGW1KXBvV5Kq7u3huPnFCUTbHS4Fk8Za2mNPgmUXcwLgp3exvhPtdZfIdjrCF/aZk3A8OZONNmGghs6CecBA==",
-      "dependencies": {
-        "@nuxt/kit": "^3.0.0",
-        "h3": "^1.0.1"
-      }
-    },
-    "node_modules/@nuxtjs/sitemap": {
-      "version": "5.3.5",
-      "resolved": "https://registry.npmjs.org/@nuxtjs/sitemap/-/sitemap-5.3.5.tgz",
-      "integrity": "sha512-TfhEImgVHEZaI/vphZdoCaWM2TRBJqprHZPhIQwWYJz+dpQWkfY6z8UpjhmUh6npvbj5kNY9ncLenkw0cDJp9g==",
-      "dependencies": {
-        "@nuxt/devtools-kit": "^1.3.9",
-        "@nuxt/kit": "^3.12.3",
-        "chalk": "^5.3.0",
-        "defu": "^6.1.4",
-        "h3-compression": "^0.3.2",
-        "nuxt-site-config": "^2.2.15",
-        "nuxt-site-config-kit": "^2.2.15",
-        "ofetch": "^1.3.4",
-        "pathe": "^1.1.2",
-        "pkg-types": "^1.1.3",
-        "radix3": "^1.1.2",
-        "semver": "^7.6.2",
-        "sirv": "^2.0.4",
-        "site-config-stack": "^2.2.15",
-        "ufo": "^1.5.3"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/harlan-zw"
-      }
-    },
-    "node_modules/@nuxtjs/sitemap/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
-    },
-    "node_modules/@open-draft/deferred-promise": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz",
-      "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="
-    },
-    "node_modules/@open-draft/logger": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz",
-      "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==",
-      "dependencies": {
-        "is-node-process": "^1.2.0",
-        "outvariant": "^1.4.0"
-      }
-    },
-    "node_modules/@open-draft/until": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz",
-      "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg=="
-    },
-    "node_modules/@parcel/watcher": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz",
-      "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==",
-      "hasInstallScript": true,
-      "dependencies": {
-        "detect-libc": "^1.0.3",
-        "is-glob": "^4.0.3",
-        "micromatch": "^4.0.5",
-        "node-addon-api": "^7.0.0"
-      },
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      },
-      "optionalDependencies": {
-        "@parcel/watcher-android-arm64": "2.5.1",
-        "@parcel/watcher-darwin-arm64": "2.5.1",
-        "@parcel/watcher-darwin-x64": "2.5.1",
-        "@parcel/watcher-freebsd-x64": "2.5.1",
-        "@parcel/watcher-linux-arm-glibc": "2.5.1",
-        "@parcel/watcher-linux-arm-musl": "2.5.1",
-        "@parcel/watcher-linux-arm64-glibc": "2.5.1",
-        "@parcel/watcher-linux-arm64-musl": "2.5.1",
-        "@parcel/watcher-linux-x64-glibc": "2.5.1",
-        "@parcel/watcher-linux-x64-musl": "2.5.1",
-        "@parcel/watcher-win32-arm64": "2.5.1",
-        "@parcel/watcher-win32-ia32": "2.5.1",
-        "@parcel/watcher-win32-x64": "2.5.1"
-      }
-    },
-    "node_modules/@parcel/watcher-android-arm64": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz",
-      "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-darwin-arm64": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz",
-      "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-darwin-x64": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz",
-      "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-freebsd-x64": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz",
-      "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-linux-arm-glibc": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz",
-      "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==",
-      "cpu": [
-        "arm"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-linux-arm-musl": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz",
-      "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==",
-      "cpu": [
-        "arm"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-linux-arm64-glibc": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz",
-      "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-linux-arm64-musl": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz",
-      "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-linux-x64-glibc": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz",
-      "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-linux-x64-musl": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz",
-      "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-wasm": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.5.1.tgz",
-      "integrity": "sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==",
-      "bundleDependencies": [
-        "napi-wasm"
-      ],
-      "dependencies": {
-        "is-glob": "^4.0.3",
-        "micromatch": "^4.0.5",
-        "napi-wasm": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-wasm/node_modules/napi-wasm": {
-      "version": "1.1.0",
-      "inBundle": true,
-      "license": "MIT"
-    },
-    "node_modules/@parcel/watcher-win32-arm64": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz",
-      "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-win32-ia32": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz",
-      "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==",
-      "cpu": [
-        "ia32"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-win32-x64": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz",
-      "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@pinia-plugin-persistedstate/nuxt": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@pinia-plugin-persistedstate/nuxt/-/nuxt-1.2.1.tgz",
-      "integrity": "sha512-q8s+4aQW/AjBMyeqLL48/qzBR5lcgnvvf1525ovNuKf6Wl9CsoLjPKh/5X8vNoKGwSow4gP7lVmdYPQRypgjgg==",
-      "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
-      "dev": true,
-      "dependencies": {
-        "@nuxt/kit": "^3.12.2",
-        "defu": "^6.1.4",
-        "pinia-plugin-persistedstate": ">=3.2.1"
-      },
-      "peerDependencies": {
-        "@pinia/nuxt": "^0.5.0"
-      }
-    },
-    "node_modules/@pinia/nuxt": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/@pinia/nuxt/-/nuxt-0.5.5.tgz",
-      "integrity": "sha512-wjxS7YqIesh4OLK+qE3ZjhdOJ5pYZQ+VlEmZNtTwzQn1Kavei/khovx7mzXVXNA/mvSPXVhb9xBzhyS3XMURtw==",
-      "dependencies": {
-        "@nuxt/kit": "^3.9.0",
-        "pinia": "^2.2.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/posva"
-      }
-    },
-    "node_modules/@pkgjs/parseargs": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
-      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
-      "optional": true,
-      "engines": {
-        "node": ">=14"
-      }
-    },
-    "node_modules/@polka/url": {
-      "version": "1.0.0-next.28",
-      "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz",
-      "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw=="
-    },
-    "node_modules/@redocly/ajv": {
-      "version": "8.11.2",
-      "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz",
-      "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==",
-      "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "json-schema-traverse": "^1.0.0",
-        "require-from-string": "^2.0.2",
-        "uri-js-replace": "^1.0.1"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "node_modules/@redocly/config": {
-      "version": "0.20.3",
-      "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.20.3.tgz",
-      "integrity": "sha512-Nyyv1Bj7GgYwj/l46O0nkH1GTKWbO3Ixe7KFcn021aZipkZd+z8Vlu1BwkhqtVgivcKaClaExtWU/lDHkjBzag=="
-    },
-    "node_modules/@redocly/openapi-core": {
-      "version": "1.30.0",
-      "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.30.0.tgz",
-      "integrity": "sha512-ZZc+FXKoQXJ9cOR7qRKHxOfKOsGCj2wSodklKdtM2FofzyjzvIwn1rksD5+9iJxvHuORPOPv3ppAHcM+iMr/Ag==",
-      "dependencies": {
-        "@redocly/ajv": "^8.11.2",
-        "@redocly/config": "^0.20.1",
-        "colorette": "^1.2.0",
-        "https-proxy-agent": "^7.0.5",
-        "js-levenshtein": "^1.1.6",
-        "js-yaml": "^4.1.0",
-        "minimatch": "^5.0.1",
-        "pluralize": "^8.0.0",
-        "yaml-ast-parser": "0.0.43"
-      },
-      "engines": {
-        "node": ">=18.17.0",
-        "npm": ">=9.5.0"
-      }
-    },
-    "node_modules/@redocly/openapi-core/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/@redocly/openapi-core/node_modules/colorette": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
-      "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g=="
-    },
-    "node_modules/@redocly/openapi-core/node_modules/minimatch": {
-      "version": "5.1.6",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
-      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@rollup/plugin-alias": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.1.1.tgz",
-      "integrity": "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==",
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/plugin-commonjs": {
-      "version": "28.0.2",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.2.tgz",
-      "integrity": "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==",
-      "dependencies": {
-        "@rollup/pluginutils": "^5.0.1",
-        "commondir": "^1.0.1",
-        "estree-walker": "^2.0.2",
-        "fdir": "^6.2.0",
-        "is-reference": "1.2.1",
-        "magic-string": "^0.30.3",
-        "picomatch": "^4.0.2"
-      },
-      "engines": {
-        "node": ">=16.0.0 || 14 >= 14.17"
-      },
-      "peerDependencies": {
-        "rollup": "^2.68.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
-    },
-    "node_modules/@rollup/plugin-inject": {
-      "version": "5.0.5",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz",
-      "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==",
-      "dependencies": {
-        "@rollup/pluginutils": "^5.0.1",
-        "estree-walker": "^2.0.2",
-        "magic-string": "^0.30.3"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/plugin-inject/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
-    },
-    "node_modules/@rollup/plugin-json": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz",
-      "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==",
-      "dependencies": {
-        "@rollup/pluginutils": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/plugin-node-resolve": {
-      "version": "15.3.1",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz",
-      "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==",
-      "dependencies": {
-        "@rollup/pluginutils": "^5.0.1",
-        "@types/resolve": "1.20.2",
-        "deepmerge": "^4.2.2",
-        "is-module": "^1.0.0",
-        "resolve": "^1.22.1"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^2.78.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/plugin-replace": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.2.tgz",
-      "integrity": "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==",
-      "dependencies": {
-        "@rollup/pluginutils": "^5.0.1",
-        "magic-string": "^0.30.3"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/plugin-terser": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz",
-      "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==",
-      "dependencies": {
-        "serialize-javascript": "^6.0.1",
-        "smob": "^1.0.0",
-        "terser": "^5.17.4"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^2.0.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/plugin-yaml": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-yaml/-/plugin-yaml-4.1.2.tgz",
-      "integrity": "sha512-RpupciIeZMUqhgFE97ba0s98mOFS7CWzN3EJNhJkqSv9XLlWYtwVdtE6cDw6ASOF/sZVFS7kRJXftaqM2Vakdw==",
-      "dev": true,
-      "dependencies": {
-        "@rollup/pluginutils": "^5.0.1",
-        "js-yaml": "^4.1.0",
-        "tosource": "^2.0.0-alpha.3"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/pluginutils": {
-      "version": "5.1.4",
-      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz",
-      "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==",
-      "dependencies": {
-        "@types/estree": "^1.0.0",
-        "estree-walker": "^2.0.2",
-        "picomatch": "^4.0.2"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@rollup/pluginutils/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
-    },
-    "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz",
-      "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==",
-      "cpu": [
-        "arm"
-      ],
-      "optional": true,
-      "os": [
-        "android"
-      ]
-    },
-    "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz",
-      "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "android"
-      ]
-    },
-    "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz",
-      "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz",
-      "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz",
-      "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "freebsd"
-      ]
-    },
-    "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz",
-      "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "freebsd"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz",
-      "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==",
-      "cpu": [
-        "arm"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz",
-      "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==",
-      "cpu": [
-        "arm"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz",
-      "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz",
-      "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz",
-      "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==",
-      "cpu": [
-        "loong64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz",
-      "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==",
-      "cpu": [
-        "ppc64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz",
-      "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==",
-      "cpu": [
-        "riscv64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz",
-      "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==",
-      "cpu": [
-        "s390x"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz",
-      "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz",
-      "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz",
-      "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz",
-      "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==",
-      "cpu": [
-        "ia32"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz",
-      "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@sindresorhus/merge-streams": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
-      "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@trysound/sax": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
-      "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/@types/eslint": {
-      "version": "9.6.1",
-      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
-      "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
-      "peer": true,
-      "dependencies": {
-        "@types/estree": "*",
-        "@types/json-schema": "*"
-      }
-    },
-    "node_modules/@types/eslint-scope": {
-      "version": "3.7.7",
-      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
-      "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
-      "peer": true,
-      "dependencies": {
-        "@types/eslint": "*",
-        "@types/estree": "*"
-      }
-    },
-    "node_modules/@types/estree": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
-      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="
-    },
-    "node_modules/@types/http-proxy": {
-      "version": "1.17.16",
-      "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz",
-      "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/json-schema": {
-      "version": "7.0.15",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
-      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
-      "peer": true
-    },
-    "node_modules/@types/node": {
-      "version": "22.13.5",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz",
-      "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==",
-      "dependencies": {
-        "undici-types": "~6.20.0"
-      }
-    },
-    "node_modules/@types/parse-path": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.0.3.tgz",
-      "integrity": "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg=="
-    },
-    "node_modules/@types/qs": {
-      "version": "6.9.18",
-      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz",
-      "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==",
-      "dev": true
-    },
-    "node_modules/@types/resolve": {
-      "version": "1.20.2",
-      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz",
-      "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="
-    },
-    "node_modules/@types/web-bluetooth": {
-      "version": "0.0.20",
-      "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
-      "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="
-    },
-    "node_modules/@unhead/dom": {
-      "version": "1.11.19",
-      "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.11.19.tgz",
-      "integrity": "sha512-udkgITdIblEWH3hsoFQMKW+6QXNO2qFZlZ2FI37bVAplQSnK/PytTPt/5oA1GWkoVwT0DsQNGHbU6kOg/3SlNg==",
-      "dependencies": {
-        "@unhead/schema": "1.11.19",
-        "@unhead/shared": "1.11.19"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/harlan-zw"
-      }
-    },
-    "node_modules/@unhead/schema": {
-      "version": "1.11.19",
-      "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.11.19.tgz",
-      "integrity": "sha512-7VhYHWK7xHgljdv+C01MepCSYZO2v6OhgsfKWPxRQBDDGfUKCUaChox0XMq3tFvXP6u4zSp6yzcDw2yxCfVMwg==",
-      "dependencies": {
-        "hookable": "^5.5.3",
-        "zhead": "^2.2.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/harlan-zw"
-      }
-    },
-    "node_modules/@unhead/shared": {
-      "version": "1.11.19",
-      "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.11.19.tgz",
-      "integrity": "sha512-UYE9EIeQLJOhx8vC71bWGkAGY4Zzq/H8qYlihowUg4NiFOfL+KKMnj96datb74PRxSDvHac9V3OLktNcsX2NuA==",
-      "dependencies": {
-        "@unhead/schema": "1.11.19",
-        "packrup": "^0.1.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/harlan-zw"
-      }
-    },
-    "node_modules/@unhead/ssr": {
-      "version": "1.11.19",
-      "resolved": "https://registry.npmjs.org/@unhead/ssr/-/ssr-1.11.19.tgz",
-      "integrity": "sha512-OH+rj6xBTdYyLsSntk4lEQyR+z57aEUZIiR2UpPl1zWGtBZPIr5zs3GY5+EyJ8t8e0zLemPR/Pu7VembTJ8o1w==",
-      "dependencies": {
-        "@unhead/schema": "1.11.19",
-        "@unhead/shared": "1.11.19"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/harlan-zw"
-      }
-    },
-    "node_modules/@unhead/vue": {
-      "version": "1.11.19",
-      "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.11.19.tgz",
-      "integrity": "sha512-/XATTP8wVLs3+2Pkj2crvr/Z55nybVQyOwISh+sAlr/48/9n3jGNiCZHKpHgL4MpOnGT4krwzWzbfhBO/G2BSQ==",
-      "dependencies": {
-        "@unhead/schema": "1.11.19",
-        "@unhead/shared": "1.11.19",
-        "hookable": "^5.5.3",
-        "unhead": "1.11.19"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/harlan-zw"
-      },
-      "peerDependencies": {
-        "vue": ">=2.7 || >=3"
-      }
-    },
-    "node_modules/@unocss/astro": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-0.65.4.tgz",
-      "integrity": "sha512-ex1CJOQ6yeftBEPcbA9/W47/YoV+mhQnrAoc8MA1VVrvvFKDitICFU62+nSt3NWRe53XL/fXnQbcbCb8AAgKlA==",
-      "dependencies": {
-        "@unocss/core": "0.65.4",
-        "@unocss/reset": "0.65.4",
-        "@unocss/vite": "0.65.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0"
-      },
-      "peerDependenciesMeta": {
-        "vite": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@unocss/cli": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-0.65.4.tgz",
-      "integrity": "sha512-D/4hY5Hezh3QETscl4i+ojb+q8YU9Cl9AYJ8v3gsjc/GjTmEuIOD5V4x+/aN25vY5wjqgoApOgaIDGCV3b+2Ig==",
-      "dependencies": {
-        "@ampproject/remapping": "^2.3.0",
-        "@rollup/pluginutils": "^5.1.4",
-        "@unocss/config": "0.65.4",
-        "@unocss/core": "0.65.4",
-        "@unocss/preset-uno": "0.65.4",
-        "cac": "^6.7.14",
-        "chokidar": "^3.6.0",
-        "colorette": "^2.0.20",
-        "consola": "^3.3.1",
-        "magic-string": "^0.30.17",
-        "pathe": "^1.1.2",
-        "perfect-debounce": "^1.0.0",
-        "tinyglobby": "^0.2.10"
-      },
-      "bin": {
-        "unocss": "bin/unocss.mjs"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/cli/node_modules/chokidar": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
-      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
-      "dependencies": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/@unocss/cli/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
-    },
-    "node_modules/@unocss/cli/node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/@unocss/cli/node_modules/readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/@unocss/config": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.65.4.tgz",
-      "integrity": "sha512-/vCt4AXnJ4p4Ow6xqsYwdrelF9533yhZjzkg3SQmL3rKeSkicPayKpeq8nkYECdhDI03VTCVD+6oh5Y/26Hg7A==",
-      "dependencies": {
-        "@unocss/core": "0.65.4",
-        "unconfig": "~0.6.0"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/core": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.65.4.tgz",
-      "integrity": "sha512-a2JOoFutrhqd5RgPhIR5FIXrDoHDU3gwCbPrpT6KYTjsqlSc/fv02yZ+JGOZFN3MCFhCmaPTs+idDFtwb3xU8g==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/extractor-arbitrary-variants": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.65.4.tgz",
-      "integrity": "sha512-GbvTgsDaHplfWfsQtOY8RrvEZvptmvR9k9NwQ5NsZBNIG1JepYVel93CVQvsxT5KioKcoWngXxTYLNOGyxLs0g==",
-      "dependencies": {
-        "@unocss/core": "0.65.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/inspector": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-0.65.4.tgz",
-      "integrity": "sha512-byg9x549Ul17U4Ety7ufDwC0UOygypoq4QnLEPzhlZ0KJG1f7WmXKYanOhupeg3h4qCj6Nc/xdZYMGbHl9QRIg==",
-      "dependencies": {
-        "@unocss/core": "0.65.4",
-        "@unocss/rule-utils": "0.65.4",
-        "colorette": "^2.0.20",
-        "gzip-size": "^6.0.0",
-        "sirv": "^3.0.0",
-        "vue-flow-layout": "^0.1.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/inspector/node_modules/gzip-size": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
-      "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
-      "dependencies": {
-        "duplexer": "^0.1.2"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@unocss/inspector/node_modules/sirv": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz",
-      "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==",
-      "dependencies": {
-        "@polka/url": "^1.0.0-next.24",
-        "mrmime": "^2.0.0",
-        "totalist": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@unocss/nuxt": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/nuxt/-/nuxt-0.65.4.tgz",
-      "integrity": "sha512-dEJdqgvrukgZJk1szxRW6MiIozUZDLeFyyxmnO+iW3loPlji9hu95j2KBVHaQWIzi39XqVSORi4lH5flvAz3Pg==",
-      "dependencies": {
-        "@nuxt/kit": "^3.15.0",
-        "@unocss/config": "0.65.4",
-        "@unocss/core": "0.65.4",
-        "@unocss/preset-attributify": "0.65.4",
-        "@unocss/preset-icons": "0.65.4",
-        "@unocss/preset-tagify": "0.65.4",
-        "@unocss/preset-typography": "0.65.4",
-        "@unocss/preset-uno": "0.65.4",
-        "@unocss/preset-web-fonts": "0.65.4",
-        "@unocss/preset-wind": "0.65.4",
-        "@unocss/reset": "0.65.4",
-        "@unocss/vite": "0.65.4",
-        "@unocss/webpack": "0.65.4",
-        "unocss": "0.65.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/postcss": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-0.65.4.tgz",
-      "integrity": "sha512-8peDRo0+rNQsnKh/H2uZEVy67sV2cC16rAeSLpgbVJUMNfZlmF0rC2DNGsOV17uconUXSwz7+mGcHKNiv+8YlQ==",
-      "dependencies": {
-        "@unocss/config": "0.65.4",
-        "@unocss/core": "0.65.4",
-        "@unocss/rule-utils": "0.65.4",
-        "css-tree": "^3.1.0",
-        "postcss": "^8.4.49",
-        "tinyglobby": "^0.2.10"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.21"
-      }
-    },
-    "node_modules/@unocss/postcss/node_modules/css-tree": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz",
-      "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==",
-      "dependencies": {
-        "mdn-data": "2.12.2",
-        "source-map-js": "^1.0.1"
-      },
-      "engines": {
-        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
-      }
-    },
-    "node_modules/@unocss/postcss/node_modules/mdn-data": {
-      "version": "2.12.2",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
-      "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="
-    },
-    "node_modules/@unocss/preset-attributify": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-0.65.4.tgz",
-      "integrity": "sha512-zxE9hJJ5b37phjdzDdZsxX559ZlmH9rFlY5LVEcQySTnsfY0znviHxPbD2iRpCBCRd+YC5HfFd2jb3XlnTKMJQ==",
-      "dependencies": {
-        "@unocss/core": "0.65.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/preset-icons": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-0.65.4.tgz",
-      "integrity": "sha512-5sSzTN72X2Ag3VH48xY1pYudeWnql9jqdMiwgZuLJcmvETBNGelXy2wGxm7tsUUEx/l40Yr04Ck8XRPGT9jLBw==",
-      "dependencies": {
-        "@iconify/utils": "^2.2.1",
-        "@unocss/core": "0.65.4",
-        "ofetch": "^1.4.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/preset-mini": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-0.65.4.tgz",
-      "integrity": "sha512-dcO2PzSl87qN1KdQWcfZDIKEhpdFeImWbYfiXtE7k6pi1393FJkdHEopgI/1ZciIQN1CkTvQJ5c7EpEVWftYRA==",
-      "dependencies": {
-        "@unocss/core": "0.65.4",
-        "@unocss/extractor-arbitrary-variants": "0.65.4",
-        "@unocss/rule-utils": "0.65.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/preset-tagify": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-0.65.4.tgz",
-      "integrity": "sha512-qll6koqdFEkvmz594vKnxj9+3nfM3ugkJxYHrTkqtwx7DAnTgtM8fInFFGZelvjwUzR3o3+Zw6uMhFkLTVTfvg==",
-      "dependencies": {
-        "@unocss/core": "0.65.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/preset-typography": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-0.65.4.tgz",
-      "integrity": "sha512-Dl940ATrviWD9Vh+4fcN0QZXb6wA7al+c7QkdVAzW7I+NtdN2ELvLcN0cY22KnLRpwztzmg52Qp2J/1QnqrLTw==",
-      "dependencies": {
-        "@unocss/core": "0.65.4",
-        "@unocss/preset-mini": "0.65.4"
-      }
-    },
-    "node_modules/@unocss/preset-uno": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-0.65.4.tgz",
-      "integrity": "sha512-56bdBtf476i+soQCQmT36uGzcF2z+7DGCnG1hwWiw6XAbL6gmRMQsubwi1c8z8TcTQNBsOFUnOziFil0gbWufw==",
-      "dependencies": {
-        "@unocss/core": "0.65.4",
-        "@unocss/preset-mini": "0.65.4",
-        "@unocss/preset-wind": "0.65.4",
-        "@unocss/rule-utils": "0.65.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/preset-web-fonts": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-0.65.4.tgz",
-      "integrity": "sha512-UB/MvXHUTqMNVH1bbiKZ/ZtZUI5tsYlTYAvBrnXPO1Cztuwr8hJKSi4RCfI9g+YYtKHX4uYuxUbW5bcN85gmBQ==",
-      "dependencies": {
-        "@unocss/core": "0.65.4",
-        "ofetch": "^1.4.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/preset-wind": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-0.65.4.tgz",
-      "integrity": "sha512-0rbNbw5E8Lvh2yf4R1Mq+lxI/wL5Tm6+r+crE0uAAhCPe9kxPHW4k+x1cWKDIwq6Vudlm3cNX85N49wN5tYgdA==",
-      "dependencies": {
-        "@unocss/core": "0.65.4",
-        "@unocss/preset-mini": "0.65.4",
-        "@unocss/rule-utils": "0.65.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/reset": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-0.65.4.tgz",
-      "integrity": "sha512-m685H0KFvVMz6R2i5GDIFv4RS9Z7y2G8hJK7xg2OWli+7w8l2ZMihYvXKofPsst4q/ms8EgKXpWc/qqUOTucvA==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/rule-utils": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-0.65.4.tgz",
-      "integrity": "sha512-+EzdJEWcqGcO6HwbBTe7vEdBRpuKkBiz4MycQeLD6GEio04T45y6VHHO7/WTqxltbO4YwwW9/s2TKRMxKtoG8g==",
-      "dependencies": {
-        "@unocss/core": "^0.65.4",
-        "magic-string": "^0.30.17"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/transformer-attributify-jsx": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.65.4.tgz",
-      "integrity": "sha512-n438EzWdTKlLCOlAUSpFjmH6FflctqzIReMzMZSJDkmkorymc+C5GpjN3Nty2cKRJXIl6Vwq0oxPuB59RT+FIw==",
-      "dependencies": {
-        "@unocss/core": "0.65.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/transformer-compile-class": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-0.65.4.tgz",
-      "integrity": "sha512-n1yHDC/iIbcj/9fBUTXkSoASKfLBuRoCN7P1a0ecPc8Gu+uOGfoxafOhrlqC+tpD3hlQGoL+0h74BHSKh+L23Q==",
-      "dependencies": {
-        "@unocss/core": "0.65.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/transformer-directives": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-0.65.4.tgz",
-      "integrity": "sha512-zkoDEwzPkgXi6ohW7P11gbArwfTRMZ9knYSUYoPEltQz+UZYzeRQ85exiAmdz5MsbCAuhQEr577Kd/CWfhjEuA==",
-      "dependencies": {
-        "@unocss/core": "0.65.4",
-        "@unocss/rule-utils": "0.65.4",
-        "css-tree": "^3.1.0"
-      }
-    },
-    "node_modules/@unocss/transformer-directives/node_modules/css-tree": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz",
-      "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==",
-      "dependencies": {
-        "mdn-data": "2.12.2",
-        "source-map-js": "^1.0.1"
-      },
-      "engines": {
-        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
-      }
-    },
-    "node_modules/@unocss/transformer-directives/node_modules/mdn-data": {
-      "version": "2.12.2",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
-      "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="
-    },
-    "node_modules/@unocss/transformer-variant-group": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-0.65.4.tgz",
-      "integrity": "sha512-ggO6xMGeOeoD5GHS2xXBJrYFuzqyiZ25tM0zHAMJn9QU9GIu1NwWvcXluvLCF/MRIygBJGPpAE98aEICI6ifEA==",
-      "dependencies": {
-        "@unocss/core": "0.65.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@unocss/vite": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-0.65.4.tgz",
-      "integrity": "sha512-02pRcVLfb5UUxMJwudnjS/0ZQdSlskjuXVHdpZpLBZCA8hhoru2uEOsPbUOBRNNMjDj6ld00pmgk/+im07M35Q==",
-      "dependencies": {
-        "@ampproject/remapping": "^2.3.0",
-        "@rollup/pluginutils": "^5.1.4",
-        "@unocss/config": "0.65.4",
-        "@unocss/core": "0.65.4",
-        "@unocss/inspector": "0.65.4",
-        "chokidar": "^3.6.0",
-        "magic-string": "^0.30.17",
-        "tinyglobby": "^0.2.10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0"
-      }
-    },
-    "node_modules/@unocss/vite/node_modules/chokidar": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
-      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
-      "dependencies": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/@unocss/vite/node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/@unocss/vite/node_modules/readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/@unocss/webpack": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/@unocss/webpack/-/webpack-0.65.4.tgz",
-      "integrity": "sha512-cnd0qnJdSxYlQ+zuF0Qad3xZk2X0/p70XLzlA4TaBZuKa2OPJOyulfJwJSqcrSc4PXYOd9B/B8nXJk8WQ1yBHQ==",
-      "dependencies": {
-        "@ampproject/remapping": "^2.3.0",
-        "@rollup/pluginutils": "^5.1.4",
-        "@unocss/config": "0.65.4",
-        "@unocss/core": "0.65.4",
-        "chokidar": "^3.6.0",
-        "magic-string": "^0.30.17",
-        "tinyglobby": "^0.2.10",
-        "unplugin": "^2.1.0",
-        "webpack-sources": "^3.2.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "webpack": "^4 || ^5"
-      }
-    },
-    "node_modules/@unocss/webpack/node_modules/chokidar": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
-      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
-      "dependencies": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/@unocss/webpack/node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/@unocss/webpack/node_modules/readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/@unocss/webpack/node_modules/unplugin": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz",
-      "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==",
-      "dependencies": {
-        "acorn": "^8.14.0",
-        "webpack-virtual-modules": "^0.6.2"
-      },
-      "engines": {
-        "node": ">=18.12.0"
-      }
-    },
-    "node_modules/@vercel/nft": {
-      "version": "0.27.10",
-      "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.10.tgz",
-      "integrity": "sha512-zbaF9Wp/NsZtKLE4uVmL3FyfFwlpDyuymQM1kPbeT0mVOHKDQQNjnnfslB3REg3oZprmNFJuh3pkHBk2qAaizg==",
-      "dependencies": {
-        "@mapbox/node-pre-gyp": "^2.0.0-rc.0",
-        "@rollup/pluginutils": "^5.1.3",
-        "acorn": "^8.6.0",
-        "acorn-import-attributes": "^1.9.5",
-        "async-sema": "^3.1.1",
-        "bindings": "^1.4.0",
-        "estree-walker": "2.0.2",
-        "glob": "^7.1.3",
-        "graceful-fs": "^4.2.9",
-        "node-gyp-build": "^4.2.2",
-        "picomatch": "^4.0.2",
-        "resolve-from": "^5.0.0"
-      },
-      "bin": {
-        "nft": "out/cli.js"
-      },
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/@vercel/nft/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
-    },
-    "node_modules/@vitejs/plugin-vue": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz",
-      "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==",
-      "engines": {
-        "node": "^18.0.0 || >=20.0.0"
-      },
-      "peerDependencies": {
-        "vite": "^5.0.0 || ^6.0.0",
-        "vue": "^3.2.25"
-      }
-    },
-    "node_modules/@vitejs/plugin-vue-jsx": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.1.1.tgz",
-      "integrity": "sha512-uMJqv/7u1zz/9NbWAD3XdjaY20tKTf17XVfQ9zq4wY1BjsB/PjpJPMe2xiG39QpP4ZdhYNhm4Hvo66uJrykNLA==",
-      "dependencies": {
-        "@babel/core": "^7.26.0",
-        "@babel/plugin-transform-typescript": "^7.25.9",
-        "@vue/babel-plugin-jsx": "^1.2.5"
-      },
-      "engines": {
-        "node": "^18.0.0 || >=20.0.0"
-      },
-      "peerDependencies": {
-        "vite": "^5.0.0 || ^6.0.0",
-        "vue": "^3.0.0"
-      }
-    },
-    "node_modules/@vue-macros/common": {
-      "version": "1.16.1",
-      "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-1.16.1.tgz",
-      "integrity": "sha512-Pn/AWMTjoMYuquepLZP813BIcq8DTZiNCoaceuNlvaYuOTd8DqBZWc5u0uOMQZMInwME1mdSmmBAcTluiV9Jtg==",
-      "dependencies": {
-        "@vue/compiler-sfc": "^3.5.13",
-        "ast-kit": "^1.4.0",
-        "local-pkg": "^1.0.0",
-        "magic-string-ast": "^0.7.0",
-        "pathe": "^2.0.2",
-        "picomatch": "^4.0.2"
-      },
-      "engines": {
-        "node": ">=16.14.0"
-      },
-      "peerDependencies": {
-        "vue": "^2.7.0 || ^3.2.25"
-      },
-      "peerDependenciesMeta": {
-        "vue": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@vue-macros/common/node_modules/local-pkg": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz",
-      "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==",
-      "dependencies": {
-        "mlly": "^1.7.3",
-        "pkg-types": "^1.3.0"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@vue/babel-helper-vue-transform-on": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz",
-      "integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw=="
-    },
-    "node_modules/@vue/babel-plugin-jsx": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz",
-      "integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==",
-      "dependencies": {
-        "@babel/helper-module-imports": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/plugin-syntax-jsx": "^7.24.7",
-        "@babel/template": "^7.25.0",
-        "@babel/traverse": "^7.25.6",
-        "@babel/types": "^7.25.6",
-        "@vue/babel-helper-vue-transform-on": "1.2.5",
-        "@vue/babel-plugin-resolve-type": "1.2.5",
-        "html-tags": "^3.3.1",
-        "svg-tags": "^1.0.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      },
-      "peerDependenciesMeta": {
-        "@babel/core": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@vue/babel-plugin-resolve-type": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz",
-      "integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==",
-      "dependencies": {
-        "@babel/code-frame": "^7.24.7",
-        "@babel/helper-module-imports": "^7.24.7",
-        "@babel/helper-plugin-utils": "^7.24.8",
-        "@babel/parser": "^7.25.6",
-        "@vue/compiler-sfc": "^3.5.3"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@vue/compiler-core": {
-      "version": "3.5.13",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
-      "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==",
-      "dependencies": {
-        "@babel/parser": "^7.25.3",
-        "@vue/shared": "3.5.13",
-        "entities": "^4.5.0",
-        "estree-walker": "^2.0.2",
-        "source-map-js": "^1.2.0"
-      }
-    },
-    "node_modules/@vue/compiler-core/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
-    },
-    "node_modules/@vue/compiler-dom": {
-      "version": "3.5.13",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz",
-      "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==",
-      "dependencies": {
-        "@vue/compiler-core": "3.5.13",
-        "@vue/shared": "3.5.13"
-      }
-    },
-    "node_modules/@vue/compiler-sfc": {
-      "version": "3.5.13",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz",
-      "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==",
-      "dependencies": {
-        "@babel/parser": "^7.25.3",
-        "@vue/compiler-core": "3.5.13",
-        "@vue/compiler-dom": "3.5.13",
-        "@vue/compiler-ssr": "3.5.13",
-        "@vue/shared": "3.5.13",
-        "estree-walker": "^2.0.2",
-        "magic-string": "^0.30.11",
-        "postcss": "^8.4.48",
-        "source-map-js": "^1.2.0"
-      }
-    },
-    "node_modules/@vue/compiler-sfc/node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
-    },
-    "node_modules/@vue/compiler-ssr": {
-      "version": "3.5.13",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz",
-      "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==",
-      "dependencies": {
-        "@vue/compiler-dom": "3.5.13",
-        "@vue/shared": "3.5.13"
-      }
-    },
-    "node_modules/@vue/devtools-api": {
-      "version": "6.6.4",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
-      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
-    },
-    "node_modules/@vue/devtools-core": {
-      "version": "7.6.8",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.6.8.tgz",
-      "integrity": "sha512-8X4roysTwzQ94o7IobjVcOd1aZF5iunikrMrHPI2uUdigZCi2kFTQc7ffYiFiTNaLElCpjOhCnM7bo7aK1yU7A==",
-      "dependencies": {
-        "@vue/devtools-kit": "^7.6.8",
-        "@vue/devtools-shared": "^7.6.8",
-        "mitt": "^3.0.1",
-        "nanoid": "^5.0.9",
-        "pathe": "^1.1.2",
-        "vite-hot-client": "^0.2.4"
-      },
-      "peerDependencies": {
-        "vue": "^3.0.0"
-      }
-    },
-    "node_modules/@vue/devtools-core/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
-    },
-    "node_modules/@vue/devtools-kit": {
-      "version": "7.6.8",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.6.8.tgz",
-      "integrity": "sha512-JhJ8M3sPU+v0P2iZBF2DkdmR9L0dnT5RXJabJqX6o8KtFs3tebdvfoXV2Dm3BFuqeECuMJIfF1aCzSt+WQ4wrw==",
-      "dependencies": {
-        "@vue/devtools-shared": "^7.6.8",
-        "birpc": "^0.2.19",
-        "hookable": "^5.5.3",
-        "mitt": "^3.0.1",
-        "perfect-debounce": "^1.0.0",
-        "speakingurl": "^14.0.1",
-        "superjson": "^2.2.1"
-      }
-    },
-    "node_modules/@vue/devtools-shared": {
-      "version": "7.7.2",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz",
-      "integrity": "sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==",
-      "dependencies": {
-        "rfdc": "^1.4.1"
-      }
-    },
-    "node_modules/@vue/reactivity": {
-      "version": "3.5.13",
-      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz",
-      "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==",
-      "dependencies": {
-        "@vue/shared": "3.5.13"
-      }
-    },
-    "node_modules/@vue/runtime-core": {
-      "version": "3.5.13",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz",
-      "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==",
-      "dependencies": {
-        "@vue/reactivity": "3.5.13",
-        "@vue/shared": "3.5.13"
-      }
-    },
-    "node_modules/@vue/runtime-dom": {
-      "version": "3.5.13",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz",
-      "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==",
-      "dependencies": {
-        "@vue/reactivity": "3.5.13",
-        "@vue/runtime-core": "3.5.13",
-        "@vue/shared": "3.5.13",
-        "csstype": "^3.1.3"
-      }
-    },
-    "node_modules/@vue/server-renderer": {
-      "version": "3.5.13",
-      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz",
-      "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==",
-      "dependencies": {
-        "@vue/compiler-ssr": "3.5.13",
-        "@vue/shared": "3.5.13"
-      },
-      "peerDependencies": {
-        "vue": "3.5.13"
-      }
-    },
-    "node_modules/@vue/shared": {
-      "version": "3.5.13",
-      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz",
-      "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
-    },
-    "node_modules/@vuetify/loader-shared": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@vuetify/loader-shared/-/loader-shared-2.1.0.tgz",
-      "integrity": "sha512-dNE6Ceym9ijFsmJKB7YGW0cxs7xbYV8+1LjU6jd4P14xOt/ji4Igtgzt0rJFbxu+ZhAzqz853lhB0z8V9Dy9cQ==",
-      "devOptional": true,
-      "dependencies": {
-        "upath": "^2.0.1"
-      },
-      "peerDependencies": {
-        "vue": "^3.0.0",
-        "vuetify": "^3.0.0"
-      }
-    },
-    "node_modules/@vueuse/core": {
-      "version": "12.7.0",
-      "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.7.0.tgz",
-      "integrity": "sha512-jtK5B7YjZXmkGNHjviyGO4s3ZtEhbzSgrbX+s5o+Lr8i2nYqNyHuPVOeTdM1/hZ5Tkxg/KktAuAVDDiHMraMVA==",
-      "dependencies": {
-        "@types/web-bluetooth": "^0.0.20",
-        "@vueuse/metadata": "12.7.0",
-        "@vueuse/shared": "12.7.0",
-        "vue": "^3.5.13"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@vueuse/integrations": {
-      "version": "12.7.0",
-      "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.7.0.tgz",
-      "integrity": "sha512-IEq7K4bCl7mn3uKJaWtNXnd1CAPaHLUMuyj5K1/k/pVcItt0VONZW8xiGxdIovJcQjkzOHjImhX5t6gija+0/g==",
-      "dependencies": {
-        "@vueuse/core": "12.7.0",
-        "@vueuse/shared": "12.7.0",
-        "vue": "^3.5.13"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "async-validator": "^4",
-        "axios": "^1",
-        "change-case": "^5",
-        "drauu": "^0.4",
-        "focus-trap": "^7",
-        "fuse.js": "^7",
-        "idb-keyval": "^6",
-        "jwt-decode": "^4",
-        "nprogress": "^0.2",
-        "qrcode": "^1.5",
-        "sortablejs": "^1",
-        "universal-cookie": "^7"
-      },
-      "peerDependenciesMeta": {
-        "async-validator": {
-          "optional": true
-        },
-        "axios": {
-          "optional": true
-        },
-        "change-case": {
-          "optional": true
-        },
-        "drauu": {
-          "optional": true
-        },
-        "focus-trap": {
-          "optional": true
-        },
-        "fuse.js": {
-          "optional": true
-        },
-        "idb-keyval": {
-          "optional": true
-        },
-        "jwt-decode": {
-          "optional": true
-        },
-        "nprogress": {
-          "optional": true
-        },
-        "qrcode": {
-          "optional": true
-        },
-        "sortablejs": {
-          "optional": true
-        },
-        "universal-cookie": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@vueuse/metadata": {
-      "version": "12.7.0",
-      "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.7.0.tgz",
-      "integrity": "sha512-4VvTH9mrjXqFN5LYa5YfqHVRI6j7R00Vy4995Rw7PQxyCL3z0Lli86iN4UemWqixxEvYfRjG+hF9wL8oLOn+3g==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@vueuse/nuxt": {
-      "version": "12.7.0",
-      "resolved": "https://registry.npmjs.org/@vueuse/nuxt/-/nuxt-12.7.0.tgz",
-      "integrity": "sha512-JG1yjJifcIZkFr+X1VmfNsdNZyHia/wXcpUHqVI2gwax5+bgmUlybqh9nStNGbX9NLUuPvPNNq043es5DlSJKg==",
-      "dependencies": {
-        "@nuxt/kit": "^3.15.4",
-        "@vueuse/core": "12.7.0",
-        "@vueuse/metadata": "12.7.0",
-        "local-pkg": "^1.0.0",
-        "vue": "^3.5.13"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "nuxt": "^3.0.0"
-      }
-    },
-    "node_modules/@vueuse/nuxt/node_modules/local-pkg": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz",
-      "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==",
-      "dependencies": {
-        "mlly": "^1.7.3",
-        "pkg-types": "^1.3.0"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@vueuse/shared": {
-      "version": "12.7.0",
-      "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.7.0.tgz",
-      "integrity": "sha512-coLlUw2HHKsm7rPN6WqHJQr18WymN4wkA/3ThFaJ4v4gWGWAQQGK+MJxLuJTBs4mojQiazlVWAKNJNpUWGRkNw==",
-      "dependencies": {
-        "vue": "^3.5.13"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/@webassemblyjs/ast": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
-      "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/helper-numbers": "1.13.2",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
-      }
-    },
-    "node_modules/@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
-      "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
-      "peer": true
-    },
-    "node_modules/@webassemblyjs/helper-api-error": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
-      "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
-      "peer": true
-    },
-    "node_modules/@webassemblyjs/helper-buffer": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
-      "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
-      "peer": true
-    },
-    "node_modules/@webassemblyjs/helper-numbers": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
-      "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/floating-point-hex-parser": "1.13.2",
-        "@webassemblyjs/helper-api-error": "1.13.2",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
-      "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
-      "peer": true
-    },
-    "node_modules/@webassemblyjs/helper-wasm-section": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
-      "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-buffer": "1.14.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
-        "@webassemblyjs/wasm-gen": "1.14.1"
-      }
-    },
-    "node_modules/@webassemblyjs/ieee754": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
-      "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
-      "peer": true,
-      "dependencies": {
-        "@xtuc/ieee754": "^1.2.0"
-      }
-    },
-    "node_modules/@webassemblyjs/leb128": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
-      "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
-      "peer": true,
-      "dependencies": {
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webassemblyjs/utf8": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
-      "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
-      "peer": true
-    },
-    "node_modules/@webassemblyjs/wasm-edit": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
-      "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-buffer": "1.14.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
-        "@webassemblyjs/helper-wasm-section": "1.14.1",
-        "@webassemblyjs/wasm-gen": "1.14.1",
-        "@webassemblyjs/wasm-opt": "1.14.1",
-        "@webassemblyjs/wasm-parser": "1.14.1",
-        "@webassemblyjs/wast-printer": "1.14.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-gen": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
-      "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
-        "@webassemblyjs/ieee754": "1.13.2",
-        "@webassemblyjs/leb128": "1.13.2",
-        "@webassemblyjs/utf8": "1.13.2"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-opt": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
-      "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-buffer": "1.14.1",
-        "@webassemblyjs/wasm-gen": "1.14.1",
-        "@webassemblyjs/wasm-parser": "1.14.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-parser": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
-      "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-api-error": "1.13.2",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
-        "@webassemblyjs/ieee754": "1.13.2",
-        "@webassemblyjs/leb128": "1.13.2",
-        "@webassemblyjs/utf8": "1.13.2"
-      }
-    },
-    "node_modules/@webassemblyjs/wast-printer": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
-      "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@xtuc/ieee754": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
-      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
-      "peer": true
-    },
-    "node_modules/@xtuc/long": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
-      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
-      "peer": true
-    },
-    "node_modules/abbrev": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz",
-      "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==",
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/abort-controller": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
-      "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
-      "dependencies": {
-        "event-target-shim": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=6.5"
-      }
-    },
-    "node_modules/ace-builds": {
-      "version": "1.39.0",
-      "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.39.0.tgz",
-      "integrity": "sha512-MqoZojv4gpc5QyTMor/dS6kmruDV9db9LVZbCiT4qYz6WsDiv4qyG5f7ZPc+wjUl6oLMqgCAsBjo1whdSVyMlQ=="
-    },
-    "node_modules/acorn": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
-      "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/acorn-import-attributes": {
-      "version": "1.9.5",
-      "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
-      "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
-      "peerDependencies": {
-        "acorn": "^8"
-      }
-    },
-    "node_modules/acorn-jsx": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
-      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
-      "dev": true,
-      "peerDependencies": {
-        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
-      }
-    },
-    "node_modules/agent-base": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
-      "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/ajv": {
-      "version": "8.17.1",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
-      "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
-      "peer": true,
-      "dependencies": {
-        "fast-deep-equal": "^3.1.3",
-        "fast-uri": "^3.0.1",
-        "json-schema-traverse": "^1.0.0",
-        "require-from-string": "^2.0.2"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "node_modules/ajv-formats": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
-      "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
-      "peer": true,
-      "dependencies": {
-        "ajv": "^8.0.0"
-      },
-      "peerDependencies": {
-        "ajv": "^8.0.0"
-      },
-      "peerDependenciesMeta": {
-        "ajv": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/ajv-keywords": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
-      "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
-      "peer": true,
-      "dependencies": {
-        "fast-deep-equal": "^3.1.3"
-      },
-      "peerDependencies": {
-        "ajv": "^8.8.2"
-      }
-    },
-    "node_modules/ansi-colors": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
-      "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/ansi-escapes": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
-      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
-      "dependencies": {
-        "type-fest": "^0.21.3"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/ansi-escapes/node_modules/type-fest": {
-      "version": "0.21.3",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
-      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/any-promise": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
-      "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
-      "dev": true
-    },
-    "node_modules/anymatch": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
-      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
-      "dependencies": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/anymatch/node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/archiver": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz",
-      "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==",
-      "dependencies": {
-        "archiver-utils": "^5.0.2",
-        "async": "^3.2.4",
-        "buffer-crc32": "^1.0.0",
-        "readable-stream": "^4.0.0",
-        "readdir-glob": "^1.1.2",
-        "tar-stream": "^3.0.0",
-        "zip-stream": "^6.0.1"
-      },
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/archiver-utils": {
-      "version": "5.0.2",
-      "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz",
-      "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==",
-      "dependencies": {
-        "glob": "^10.0.0",
-        "graceful-fs": "^4.2.0",
-        "is-stream": "^2.0.1",
-        "lazystream": "^1.0.0",
-        "lodash": "^4.17.15",
-        "normalize-path": "^3.0.0",
-        "readable-stream": "^4.0.0"
-      },
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/archiver-utils/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/archiver-utils/node_modules/glob": {
-      "version": "10.4.5",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
-      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
-      "dependencies": {
-        "foreground-child": "^3.1.0",
-        "jackspeak": "^3.1.2",
-        "minimatch": "^9.0.4",
-        "minipass": "^7.1.2",
-        "package-json-from-dist": "^1.0.0",
-        "path-scurry": "^1.11.1"
-      },
-      "bin": {
-        "glob": "dist/esm/bin.mjs"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/archiver-utils/node_modules/is-stream": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/archiver-utils/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/archiver-utils/node_modules/minipass": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
-      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      }
-    },
-    "node_modules/argparse": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
-    },
-    "node_modules/ast-kit": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-1.4.0.tgz",
-      "integrity": "sha512-BlGeOw73FDsX7z0eZE/wuuafxYoek2yzNJ6l6A1nsb4+z/p87TOPbHaWuN53kFKNuUXiCQa2M+xLF71IqQmRSw==",
-      "dependencies": {
-        "@babel/parser": "^7.26.5",
-        "pathe": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=16.14.0"
-      }
-    },
-    "node_modules/ast-walker-scope": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.6.2.tgz",
-      "integrity": "sha512-1UWOyC50xI3QZkRuDj6PqDtpm1oHWtYs+NQGwqL/2R11eN3Q81PHAHPM0SWW3BNQm53UDwS//Jv8L4CCVLM1bQ==",
-      "dependencies": {
-        "@babel/parser": "^7.25.3",
-        "ast-kit": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=16.14.0"
-      }
-    },
-    "node_modules/async": {
-      "version": "3.2.6",
-      "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
-      "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="
-    },
-    "node_modules/async-sema": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz",
-      "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg=="
-    },
-    "node_modules/asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
-    },
-    "node_modules/autoprefixer": {
-      "version": "10.4.20",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
-      "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/postcss/"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/autoprefixer"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "dependencies": {
-        "browserslist": "^4.23.3",
-        "caniuse-lite": "^1.0.30001646",
-        "fraction.js": "^4.3.7",
-        "normalize-range": "^0.1.2",
-        "picocolors": "^1.0.1",
-        "postcss-value-parser": "^4.2.0"
-      },
-      "bin": {
-        "autoprefixer": "bin/autoprefixer"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >=14"
-      },
-      "peerDependencies": {
-        "postcss": "^8.1.0"
-      }
-    },
-    "node_modules/axios": {
-      "version": "1.7.9",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
-      "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
-      "dependencies": {
-        "follow-redirects": "^1.15.6",
-        "form-data": "^4.0.0",
-        "proxy-from-env": "^1.1.0"
-      }
-    },
-    "node_modules/b4a": {
-      "version": "1.6.7",
-      "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
-      "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
-    },
-    "node_modules/bare-events": {
-      "version": "2.5.4",
-      "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz",
-      "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==",
-      "optional": true
-    },
-    "node_modules/base64-js": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/binary-extensions": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
-      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/bindings": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
-      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
-      "dependencies": {
-        "file-uri-to-path": "1.0.0"
-      }
-    },
-    "node_modules/bintrees": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz",
-      "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw=="
-    },
-    "node_modules/birpc": {
-      "version": "0.2.19",
-      "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz",
-      "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/boolbase": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
-    },
-    "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/braces": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
-      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
-      "dependencies": {
-        "fill-range": "^7.1.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/browserslist": {
-      "version": "4.24.4",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
-      "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/browserslist"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/browserslist"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "dependencies": {
-        "caniuse-lite": "^1.0.30001688",
-        "electron-to-chromium": "^1.5.73",
-        "node-releases": "^2.0.19",
-        "update-browserslist-db": "^1.1.1"
-      },
-      "bin": {
-        "browserslist": "cli.js"
-      },
-      "engines": {
-        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
-      }
-    },
-    "node_modules/buffer": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
-      "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "dependencies": {
-        "base64-js": "^1.3.1",
-        "ieee754": "^1.2.1"
-      }
-    },
-    "node_modules/buffer-crc32": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz",
-      "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==",
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/buffer-from": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
-      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
-    },
-    "node_modules/bundle-name": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
-      "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
-      "dependencies": {
-        "run-applescript": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/bundle-require": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz",
-      "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==",
-      "dependencies": {
-        "load-tsconfig": "^0.2.3"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "peerDependencies": {
-        "esbuild": ">=0.18"
-      }
-    },
-    "node_modules/c12": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/c12/-/c12-2.0.4.tgz",
-      "integrity": "sha512-3DbbhnFt0fKJHxU4tEUPmD1ahWE4PWPMomqfYsTJdrhpmEnRKJi3qSC4rO5U6E6zN1+pjBY7+z8fUmNRMaVKLw==",
-      "dependencies": {
-        "chokidar": "^4.0.3",
-        "confbox": "^0.1.8",
-        "defu": "^6.1.4",
-        "dotenv": "^16.4.7",
-        "giget": "^1.2.4",
-        "jiti": "^2.4.2",
-        "mlly": "^1.7.4",
-        "ohash": "^2.0.4",
-        "pathe": "^2.0.3",
-        "perfect-debounce": "^1.0.0",
-        "pkg-types": "^1.3.1",
-        "rc9": "^2.1.2"
-      },
-      "peerDependencies": {
-        "magicast": "^0.3.5"
-      },
-      "peerDependenciesMeta": {
-        "magicast": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/c12/node_modules/ohash": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.4.tgz",
-      "integrity": "sha512-ac+SFwzhdHb0hp48/dbR7Jta39qfbuj7t3hApd9uyHS8bisHTfVzSEvjOVgV0L3zG7VR2/7JjkSGimP75D+hOQ=="
-    },
-    "node_modules/cac": {
-      "version": "6.7.14",
-      "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
-      "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/call-bind-apply-helpers": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
-      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "function-bind": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/call-bound": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
-      "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.1",
-        "get-intrinsic": "^1.2.6"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/caniuse-api": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
-      "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
-      "dependencies": {
-        "browserslist": "^4.0.0",
-        "caniuse-lite": "^1.0.0",
-        "lodash.memoize": "^4.1.2",
-        "lodash.uniq": "^4.5.0"
-      }
-    },
-    "node_modules/caniuse-lite": {
-      "version": "1.0.30001700",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz",
-      "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==",
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/browserslist"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ]
-    },
-    "node_modules/chalk": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
-      "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
-      "engines": {
-        "node": "^12.17.0 || ^14.13 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/change-case": {
-      "version": "5.4.4",
-      "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz",
-      "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="
-    },
-    "node_modules/chart.js": {
-      "version": "4.4.8",
-      "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.8.tgz",
-      "integrity": "sha512-IkGZlVpXP+83QpMm4uxEiGqSI7jFizwVtF3+n5Pc3k7sMO+tkd0qxh2OzLhenM0K80xtmAONWGBn082EiBQSDA==",
-      "dependencies": {
-        "@kurkle/color": "^0.3.0"
-      },
-      "engines": {
-        "pnpm": ">=8"
-      }
-    },
-    "node_modules/chokidar": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
-      "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
-      "dependencies": {
-        "readdirp": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 14.16.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      }
-    },
-    "node_modules/chownr": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/chrome-trace-event": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
-      "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
-      "peer": true,
-      "engines": {
-        "node": ">=6.0"
-      }
-    },
-    "node_modules/citty": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
-      "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
-      "dependencies": {
-        "consola": "^3.2.3"
-      }
-    },
-    "node_modules/clipboardy": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz",
-      "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==",
-      "dependencies": {
-        "execa": "^8.0.1",
-        "is-wsl": "^3.1.0",
-        "is64bit": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/clipboardy/node_modules/execa": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
-      "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
-      "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^8.0.1",
-        "human-signals": "^5.0.0",
-        "is-stream": "^3.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^5.1.0",
-        "onetime": "^6.0.0",
-        "signal-exit": "^4.1.0",
-        "strip-final-newline": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=16.17"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
-      }
-    },
-    "node_modules/clipboardy/node_modules/get-stream": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
-      "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
-      "engines": {
-        "node": ">=16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/clipboardy/node_modules/human-signals": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
-      "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
-      "engines": {
-        "node": ">=16.17.0"
-      }
-    },
-    "node_modules/clipboardy/node_modules/signal-exit": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
-      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/cliui": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
-      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
-      "dependencies": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.1",
-        "wrap-ansi": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/cluster-key-slot": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
-      "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-    },
-    "node_modules/colord": {
-      "version": "2.9.3",
-      "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
-      "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="
-    },
-    "node_modules/colorette": {
-      "version": "2.0.20",
-      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
-      "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="
-    },
-    "node_modules/combine-errors": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz",
-      "integrity": "sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==",
-      "dependencies": {
-        "custom-error-instance": "2.1.1",
-        "lodash.uniqby": "4.5.0"
-      }
-    },
-    "node_modules/combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dependencies": {
-        "delayed-stream": "~1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
-    },
-    "node_modules/commondir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
-      "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
-    },
-    "node_modules/compatx": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/compatx/-/compatx-0.1.8.tgz",
-      "integrity": "sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw=="
-    },
-    "node_modules/compress-commons": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz",
-      "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==",
-      "dependencies": {
-        "crc-32": "^1.2.0",
-        "crc32-stream": "^6.0.0",
-        "is-stream": "^2.0.1",
-        "normalize-path": "^3.0.0",
-        "readable-stream": "^4.0.0"
-      },
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/compress-commons/node_modules/is-stream": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
-    },
-    "node_modules/confbox": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
-      "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="
-    },
-    "node_modules/consola": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz",
-      "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==",
-      "engines": {
-        "node": "^14.18.0 || >=16.10.0"
-      }
-    },
-    "node_modules/convert-source-map": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
-      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
-    },
-    "node_modules/cookie-es": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz",
-      "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="
-    },
-    "node_modules/copy-anything": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
-      "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
-      "dependencies": {
-        "is-what": "^4.1.8"
-      },
-      "engines": {
-        "node": ">=12.13"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mesqueeb"
-      }
-    },
-    "node_modules/core-util-is": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
-    },
-    "node_modules/crc-32": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
-      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
-      "bin": {
-        "crc32": "bin/crc32.njs"
-      },
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/crc32-stream": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz",
-      "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==",
-      "dependencies": {
-        "crc-32": "^1.2.0",
-        "readable-stream": "^4.0.0"
-      },
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/croner": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/croner/-/croner-9.0.0.tgz",
-      "integrity": "sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==",
-      "engines": {
-        "node": ">=18.0"
-      }
-    },
-    "node_modules/cronstrue": {
-      "version": "2.55.0",
-      "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.55.0.tgz",
-      "integrity": "sha512-ZsBZNtQWb0Rk6CNGJlzpPBYqNE7t93Aez5ZCExLihGwmIpE5qThSTDQzDV8Z1Nw6ksmLkwI98nPKyciZ5sH7dw==",
-      "bin": {
-        "cronstrue": "bin/cli.js"
-      }
-    },
-    "node_modules/cross-spawn": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
-      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
-      "dependencies": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/crossws": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.4.tgz",
-      "integrity": "sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==",
-      "dependencies": {
-        "uncrypto": "^0.1.3"
-      }
-    },
-    "node_modules/css-declaration-sorter": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz",
-      "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==",
-      "engines": {
-        "node": "^14 || ^16 || >=18"
-      },
-      "peerDependencies": {
-        "postcss": "^8.0.9"
-      }
-    },
-    "node_modules/css-select": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
-      "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
-      "dependencies": {
-        "boolbase": "^1.0.0",
-        "css-what": "^6.1.0",
-        "domhandler": "^5.0.2",
-        "domutils": "^3.0.1",
-        "nth-check": "^2.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/fb55"
-      }
-    },
-    "node_modules/css-tree": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
-      "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
-      "dependencies": {
-        "mdn-data": "2.0.30",
-        "source-map-js": "^1.0.1"
-      },
-      "engines": {
-        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
-      }
-    },
-    "node_modules/css-what": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
-      "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
-      "engines": {
-        "node": ">= 6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/fb55"
-      }
-    },
-    "node_modules/cssesc": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
-      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
-      "bin": {
-        "cssesc": "bin/cssesc"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/cssnano": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.6.tgz",
-      "integrity": "sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==",
-      "dependencies": {
-        "cssnano-preset-default": "^7.0.6",
-        "lilconfig": "^3.1.2"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/cssnano"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/cssnano-preset-default": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz",
-      "integrity": "sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==",
-      "dependencies": {
-        "browserslist": "^4.23.3",
-        "css-declaration-sorter": "^7.2.0",
-        "cssnano-utils": "^5.0.0",
-        "postcss-calc": "^10.0.2",
-        "postcss-colormin": "^7.0.2",
-        "postcss-convert-values": "^7.0.4",
-        "postcss-discard-comments": "^7.0.3",
-        "postcss-discard-duplicates": "^7.0.1",
-        "postcss-discard-empty": "^7.0.0",
-        "postcss-discard-overridden": "^7.0.0",
-        "postcss-merge-longhand": "^7.0.4",
-        "postcss-merge-rules": "^7.0.4",
-        "postcss-minify-font-values": "^7.0.0",
-        "postcss-minify-gradients": "^7.0.0",
-        "postcss-minify-params": "^7.0.2",
-        "postcss-minify-selectors": "^7.0.4",
-        "postcss-normalize-charset": "^7.0.0",
-        "postcss-normalize-display-values": "^7.0.0",
-        "postcss-normalize-positions": "^7.0.0",
-        "postcss-normalize-repeat-style": "^7.0.0",
-        "postcss-normalize-string": "^7.0.0",
-        "postcss-normalize-timing-functions": "^7.0.0",
-        "postcss-normalize-unicode": "^7.0.2",
-        "postcss-normalize-url": "^7.0.0",
-        "postcss-normalize-whitespace": "^7.0.0",
-        "postcss-ordered-values": "^7.0.1",
-        "postcss-reduce-initial": "^7.0.2",
-        "postcss-reduce-transforms": "^7.0.0",
-        "postcss-svgo": "^7.0.1",
-        "postcss-unique-selectors": "^7.0.3"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/cssnano-utils": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz",
-      "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==",
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/csso": {
-      "version": "5.0.5",
-      "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
-      "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
-      "dependencies": {
-        "css-tree": "~2.2.0"
-      },
-      "engines": {
-        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
-        "npm": ">=7.0.0"
-      }
-    },
-    "node_modules/csso/node_modules/css-tree": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
-      "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
-      "dependencies": {
-        "mdn-data": "2.0.28",
-        "source-map-js": "^1.0.1"
-      },
-      "engines": {
-        "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
-        "npm": ">=7.0.0"
-      }
-    },
-    "node_modules/csso/node_modules/mdn-data": {
-      "version": "2.0.28",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
-      "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="
-    },
-    "node_modules/csstype": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
-      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
-    },
-    "node_modules/custom-error-instance": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz",
-      "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg=="
-    },
-    "node_modules/date-fns": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
-      "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==",
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/kossnocorp"
-      }
-    },
-    "node_modules/db0": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/db0/-/db0-0.2.4.tgz",
-      "integrity": "sha512-hIzftLH1nMsF95zSLjDLYLbE9huOXnLYUTAQ5yKF5amp0FpeD+B15XJa8BvGYSOeSCH4gl2WahB/y1FcUByQSg==",
-      "peerDependencies": {
-        "@electric-sql/pglite": "*",
-        "@libsql/client": "*",
-        "better-sqlite3": "*",
-        "drizzle-orm": "*",
-        "mysql2": "*",
-        "sqlite3": "*"
-      },
-      "peerDependenciesMeta": {
-        "@electric-sql/pglite": {
-          "optional": true
-        },
-        "@libsql/client": {
-          "optional": true
-        },
-        "better-sqlite3": {
-          "optional": true
-        },
-        "drizzle-orm": {
-          "optional": true
-        },
-        "mysql2": {
-          "optional": true
-        },
-        "sqlite3": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/debug": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
-      "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
-      "dependencies": {
-        "ms": "^2.1.3"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/deep-pick-omit": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz",
-      "integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==",
-      "dev": true
-    },
-    "node_modules/deepmerge": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
-      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/default-browser": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
-      "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
-      "dependencies": {
-        "bundle-name": "^4.1.0",
-        "default-browser-id": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/default-browser-id": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
-      "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/define-lazy-prop": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
-      "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/defu": {
-      "version": "6.1.4",
-      "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
-      "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="
-    },
-    "node_modules/delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/denque": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
-      "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/depd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
-      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/destr": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz",
-      "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ=="
-    },
-    "node_modules/destroy": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
-      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
-      "engines": {
-        "node": ">= 0.8",
-        "npm": "1.2.8000 || >= 1.4.16"
-      }
-    },
-    "node_modules/detect-libc": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
-      "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
-      "bin": {
-        "detect-libc": "bin/detect-libc.js"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/devalue": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz",
-      "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw=="
-    },
-    "node_modules/diff": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz",
-      "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==",
-      "engines": {
-        "node": ">=0.3.1"
-      }
-    },
-    "node_modules/discontinuous-range": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz",
-      "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ=="
-    },
-    "node_modules/dom-serializer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
-      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
-      "dependencies": {
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.2",
-        "entities": "^4.2.0"
-      },
-      "funding": {
-        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
-      }
-    },
-    "node_modules/domelementtype": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
-      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/fb55"
-        }
-      ]
-    },
-    "node_modules/domhandler": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
-      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
-      "dependencies": {
-        "domelementtype": "^2.3.0"
-      },
-      "engines": {
-        "node": ">= 4"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/domhandler?sponsor=1"
-      }
-    },
-    "node_modules/domutils": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
-      "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
-      "dependencies": {
-        "dom-serializer": "^2.0.0",
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.3"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/domutils?sponsor=1"
-      }
-    },
-    "node_modules/dot-prop": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz",
-      "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==",
-      "dependencies": {
-        "type-fest": "^4.18.2"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/dotenv": {
-      "version": "16.4.7",
-      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
-      "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://dotenvx.com"
-      }
-    },
-    "node_modules/dunder-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
-      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.1",
-        "es-errors": "^1.3.0",
-        "gopd": "^1.2.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/duplexer": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
-      "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="
-    },
-    "node_modules/eastasianwidth": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
-      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
-    },
-    "node_modules/ee-first": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
-    },
-    "node_modules/electron-to-chromium": {
-      "version": "1.5.103",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.103.tgz",
-      "integrity": "sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA=="
-    },
-    "node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
-    },
-    "node_modules/encodeurl": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
-      "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/enhanced-resolve": {
-      "version": "5.18.1",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz",
-      "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
-      "dependencies": {
-        "graceful-fs": "^4.2.4",
-        "tapable": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/entities": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
-      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
-      "engines": {
-        "node": ">=0.12"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
-    "node_modules/error-stack-parser-es": {
-      "version": "0.1.5",
-      "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz",
-      "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/errx": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/errx/-/errx-0.1.0.tgz",
-      "integrity": "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q=="
-    },
-    "node_modules/es-define-property": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
-      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-errors": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
-      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-module-lexer": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
-      "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ=="
-    },
-    "node_modules/es-object-atoms": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
-      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
-      "dependencies": {
-        "es-errors": "^1.3.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-set-tostringtag": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
-      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.6",
-        "has-tostringtag": "^1.0.2",
-        "hasown": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/esbuild": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz",
-      "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==",
-      "hasInstallScript": true,
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.24.2",
-        "@esbuild/android-arm": "0.24.2",
-        "@esbuild/android-arm64": "0.24.2",
-        "@esbuild/android-x64": "0.24.2",
-        "@esbuild/darwin-arm64": "0.24.2",
-        "@esbuild/darwin-x64": "0.24.2",
-        "@esbuild/freebsd-arm64": "0.24.2",
-        "@esbuild/freebsd-x64": "0.24.2",
-        "@esbuild/linux-arm": "0.24.2",
-        "@esbuild/linux-arm64": "0.24.2",
-        "@esbuild/linux-ia32": "0.24.2",
-        "@esbuild/linux-loong64": "0.24.2",
-        "@esbuild/linux-mips64el": "0.24.2",
-        "@esbuild/linux-ppc64": "0.24.2",
-        "@esbuild/linux-riscv64": "0.24.2",
-        "@esbuild/linux-s390x": "0.24.2",
-        "@esbuild/linux-x64": "0.24.2",
-        "@esbuild/netbsd-arm64": "0.24.2",
-        "@esbuild/netbsd-x64": "0.24.2",
-        "@esbuild/openbsd-arm64": "0.24.2",
-        "@esbuild/openbsd-x64": "0.24.2",
-        "@esbuild/sunos-x64": "0.24.2",
-        "@esbuild/win32-arm64": "0.24.2",
-        "@esbuild/win32-ia32": "0.24.2",
-        "@esbuild/win32-x64": "0.24.2"
-      }
-    },
-    "node_modules/escalade": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
-      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/escape-html": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
-    },
-    "node_modules/escape-string-regexp": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
-      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/escodegen": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
-      "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
-      "dev": true,
-      "dependencies": {
-        "esprima": "^4.0.1",
-        "estraverse": "^5.2.0",
-        "esutils": "^2.0.2"
-      },
-      "bin": {
-        "escodegen": "bin/escodegen.js",
-        "esgenerate": "bin/esgenerate.js"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "optionalDependencies": {
-        "source-map": "~0.6.1"
-      }
-    },
-    "node_modules/eslint-scope": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
-      "peer": true,
-      "dependencies": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/eslint-scope/node_modules/estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "peer": true,
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/eslint-visitor-keys": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
-      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
-      "dev": true,
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/espree": {
-      "version": "9.6.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
-      "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
-      "dev": true,
-      "dependencies": {
-        "acorn": "^8.9.0",
-        "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^3.4.1"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true,
-      "bin": {
-        "esparse": "bin/esparse.js",
-        "esvalidate": "bin/esvalidate.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/esrecurse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-      "peer": true,
-      "dependencies": {
-        "estraverse": "^5.2.0"
-      },
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/estraverse": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/estree-walker": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
-      "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
-      "dependencies": {
-        "@types/estree": "^1.0.0"
-      }
-    },
-    "node_modules/esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/event-target-shim": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
-      "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/events": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
-      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
-      "engines": {
-        "node": ">=0.8.x"
-      }
-    },
-    "node_modules/execa": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz",
-      "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==",
-      "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.1",
-        "human-signals": "^4.3.0",
-        "is-stream": "^3.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^5.1.0",
-        "onetime": "^6.0.0",
-        "signal-exit": "^3.0.7",
-        "strip-final-newline": "^3.0.0"
-      },
-      "engines": {
-        "node": "^14.18.0 || ^16.14.0 || >=18.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
-      }
-    },
-    "node_modules/externality": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/externality/-/externality-1.0.2.tgz",
-      "integrity": "sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==",
-      "dependencies": {
-        "enhanced-resolve": "^5.14.1",
-        "mlly": "^1.3.0",
-        "pathe": "^1.1.1",
-        "ufo": "^1.1.2"
-      }
-    },
-    "node_modules/externality/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
-    },
-    "node_modules/fast-deep-equal": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
-    },
-    "node_modules/fast-fifo": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
-      "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="
-    },
-    "node_modules/fast-glob": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
-      "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
-      "dependencies": {
-        "@nodelib/fs.stat": "^2.0.2",
-        "@nodelib/fs.walk": "^1.2.3",
-        "glob-parent": "^5.1.2",
-        "merge2": "^1.3.0",
-        "micromatch": "^4.0.8"
-      },
-      "engines": {
-        "node": ">=8.6.0"
-      }
-    },
-    "node_modules/fast-npm-meta": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/fast-npm-meta/-/fast-npm-meta-0.2.2.tgz",
-      "integrity": "sha512-E+fdxeaOQGo/CMWc9f4uHFfgUPJRAu7N3uB8GBvB3SDPAIWJK4GKyYhkAGFq+GYrcbKNfQIz5VVQyJnDuPPCrg==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/fast-uri": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
-      "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/fastify"
-        },
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/fastify"
-        }
-      ],
-      "peer": true
-    },
-    "node_modules/fastq": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz",
-      "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==",
-      "dependencies": {
-        "reusify": "^1.0.4"
-      }
-    },
-    "node_modules/fdir": {
-      "version": "6.4.3",
-      "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz",
-      "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
-      "peerDependencies": {
-        "picomatch": "^3 || ^4"
-      },
-      "peerDependenciesMeta": {
-        "picomatch": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/file-uri-to-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
-      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
-    },
-    "node_modules/fill-range": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
-      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/flatted": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
-      "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="
-    },
-    "node_modules/focus-trap": {
-      "version": "7.6.4",
-      "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.4.tgz",
-      "integrity": "sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==",
-      "dependencies": {
-        "tabbable": "^6.2.0"
-      }
-    },
-    "node_modules/follow-redirects": {
-      "version": "1.15.9",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
-      "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/RubenVerborgh"
-        }
-      ],
-      "engines": {
-        "node": ">=4.0"
-      },
-      "peerDependenciesMeta": {
-        "debug": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/foreground-child": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
-      "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
-      "dependencies": {
-        "cross-spawn": "^7.0.6",
-        "signal-exit": "^4.0.1"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/foreground-child/node_modules/signal-exit": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
-      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/form-data": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
-      "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
-      "dependencies": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.8",
-        "es-set-tostringtag": "^2.1.0",
-        "mime-types": "^2.1.12"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/fraction.js": {
-      "version": "4.3.7",
-      "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
-      "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "type": "patreon",
-        "url": "https://github.com/sponsors/rawify"
-      }
-    },
-    "node_modules/fresh": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
-      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/fs-extra": {
-      "version": "11.3.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
-      "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
-      "dependencies": {
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^6.0.1",
-        "universalify": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=14.14"
-      }
-    },
-    "node_modules/fs-minipass": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
-      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/fs-minipass/node_modules/minipass": {
-      "version": "3.3.6",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
-      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/fs-minipass/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-    },
-    "node_modules/fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
-    },
-    "node_modules/fsevents": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
-      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
-      "hasInstallScript": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/fuse.js": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz",
-      "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/gensync": {
-      "version": "1.0.0-beta.2",
-      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
-      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "engines": {
-        "node": "6.* || 8.* || >= 10.*"
-      }
-    },
-    "node_modules/get-intrinsic": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
-      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.2",
-        "es-define-property": "^1.0.1",
-        "es-errors": "^1.3.0",
-        "es-object-atoms": "^1.1.1",
-        "function-bind": "^1.1.2",
-        "get-proto": "^1.0.1",
-        "gopd": "^1.2.0",
-        "has-symbols": "^1.1.0",
-        "hasown": "^2.0.2",
-        "math-intrinsics": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/get-port-please": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz",
-      "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ=="
-    },
-    "node_modules/get-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
-      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
-      "dependencies": {
-        "dunder-proto": "^1.0.1",
-        "es-object-atoms": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/get-stdin": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
-      "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/get-tsconfig": {
-      "version": "4.10.0",
-      "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz",
-      "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==",
-      "dependencies": {
-        "resolve-pkg-maps": "^1.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
-      }
-    },
-    "node_modules/giget": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.5.tgz",
-      "integrity": "sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==",
-      "dependencies": {
-        "citty": "^0.1.6",
-        "consola": "^3.4.0",
-        "defu": "^6.1.4",
-        "node-fetch-native": "^1.6.6",
-        "nypm": "^0.5.4",
-        "pathe": "^2.0.3",
-        "tar": "^6.2.1"
-      },
-      "bin": {
-        "giget": "dist/cli.mjs"
-      }
-    },
-    "node_modules/git-config-path": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-2.0.0.tgz",
-      "integrity": "sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA==",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/git-up": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.0.1.tgz",
-      "integrity": "sha512-2XFu1uNZMSjkyetaF+8rqn6P0XqpMq/C+2ycjI6YwrIKcszZ5/WR4UubxjN0lILOKqLkLaHDaCr2B6fP1cke6g==",
-      "dependencies": {
-        "is-ssh": "^1.4.0",
-        "parse-url": "^9.2.0"
-      }
-    },
-    "node_modules/git-url-parse": {
-      "version": "16.0.1",
-      "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.0.1.tgz",
-      "integrity": "sha512-mcD36GrhAzX5JVOsIO52qNpgRyFzYWRbU1VSRFCvJt1IJvqfvH427wWw/CFqkWvjVPtdG5VTx4MKUeC5GeFPDQ==",
-      "dependencies": {
-        "git-up": "^8.0.0"
-      }
-    },
-    "node_modules/glob": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
-      "deprecated": "Glob versions prior to v9 are no longer supported",
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.1.1",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      },
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/glob-parent": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/glob-to-regexp": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
-      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
-      "peer": true
-    },
-    "node_modules/global-directory": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz",
-      "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==",
-      "dependencies": {
-        "ini": "4.1.1"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/globals": {
-      "version": "11.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/globby": {
-      "version": "14.1.0",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz",
-      "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==",
-      "dependencies": {
-        "@sindresorhus/merge-streams": "^2.1.0",
-        "fast-glob": "^3.3.3",
-        "ignore": "^7.0.3",
-        "path-type": "^6.0.0",
-        "slash": "^5.1.0",
-        "unicorn-magic": "^0.3.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/gopd": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
-      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/graceful-fs": {
-      "version": "4.2.11",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
-      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
-    },
-    "node_modules/gzip-size": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-7.0.0.tgz",
-      "integrity": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==",
-      "dependencies": {
-        "duplexer": "^0.1.2"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/h3": {
-      "version": "1.15.1",
-      "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.1.tgz",
-      "integrity": "sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==",
-      "dependencies": {
-        "cookie-es": "^1.2.2",
-        "crossws": "^0.3.3",
-        "defu": "^6.1.4",
-        "destr": "^2.0.3",
-        "iron-webcrypto": "^1.2.1",
-        "node-mock-http": "^1.0.0",
-        "radix3": "^1.1.2",
-        "ufo": "^1.5.4",
-        "uncrypto": "^0.1.3"
-      }
-    },
-    "node_modules/h3-compression": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/h3-compression/-/h3-compression-0.3.2.tgz",
-      "integrity": "sha512-B+yCKyDRnO0BXSfjAP4tCXJgJwmnKp3GyH5Yh66mY9KuOCrrGQSPk/gBFG2TgH7OyB/6mvqNZ1X0XNVuy0qRsw==",
-      "funding": {
-        "url": "https://github.com/sponsors/codedredd"
-      },
-      "peerDependencies": {
-        "h3": "^1.6.0"
-      }
-    },
-    "node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/has-symbols": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
-      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-tostringtag": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
-      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
-      "dependencies": {
-        "has-symbols": "^1.0.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/hasown": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
-      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
-      "dependencies": {
-        "function-bind": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/hookable": {
-      "version": "5.5.3",
-      "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
-      "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="
-    },
-    "node_modules/html-tags": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
-      "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/http-errors": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
-      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
-      "dependencies": {
-        "depd": "2.0.0",
-        "inherits": "2.0.4",
-        "setprototypeof": "1.2.0",
-        "statuses": "2.0.1",
-        "toidentifier": "1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/http-shutdown": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz",
-      "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==",
-      "engines": {
-        "iojs": ">= 1.0.0",
-        "node": ">= 0.12.0"
-      }
-    },
-    "node_modules/http-status-codes": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz",
-      "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA=="
-    },
-    "node_modules/https-proxy-agent": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
-      "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
-      "dependencies": {
-        "agent-base": "^7.1.2",
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/httpxy": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.1.7.tgz",
-      "integrity": "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ=="
-    },
-    "node_modules/human-signals": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz",
-      "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==",
-      "engines": {
-        "node": ">=14.18.0"
-      }
-    },
-    "node_modules/ieee754": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/ignore": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz",
-      "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/image-meta": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/image-meta/-/image-meta-0.2.1.tgz",
-      "integrity": "sha512-K6acvFaelNxx8wc2VjbIzXKDVB0Khs0QT35U6NkGfTdCmjLNcO2945m7RFNR9/RPVFm48hq7QPzK8uGH18HCGw=="
-    },
-    "node_modules/immutable": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz",
-      "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==",
-      "devOptional": true
-    },
-    "node_modules/importx": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/importx/-/importx-0.5.2.tgz",
-      "integrity": "sha512-YEwlK86Ml5WiTxN/ECUYC5U7jd1CisAVw7ya4i9ZppBoHfFkT2+hChhr3PE2fYxUKLkNyivxEQpa5Ruil1LJBQ==",
-      "dependencies": {
-        "bundle-require": "^5.1.0",
-        "debug": "^4.4.0",
-        "esbuild": "^0.20.2 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0",
-        "jiti": "^2.4.2",
-        "pathe": "^2.0.3",
-        "tsx": "^4.19.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/impound": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/impound/-/impound-0.2.0.tgz",
-      "integrity": "sha512-gXgeSyp9Hf7qG2/PLKmywHXyQf2xFrw+mJGpoj9DsAB9L7/MIKn+DeEx98UryWXdmbv8wUUPdcQof6qXnZoCGg==",
-      "dependencies": {
-        "@rollup/pluginutils": "^5.1.2",
-        "mlly": "^1.7.2",
-        "pathe": "^1.1.2",
-        "unenv": "^1.10.0",
-        "unplugin": "^1.14.1"
-      }
-    },
-    "node_modules/impound/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
-    },
-    "node_modules/index-to-position": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz",
-      "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
-      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
-      "dependencies": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "node_modules/inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-    },
-    "node_modules/ini": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz",
-      "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==",
-      "engines": {
-        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-      }
-    },
-    "node_modules/ioredis": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.5.0.tgz",
-      "integrity": "sha512-7CutT89g23FfSa8MDoIFs2GYYa0PaNiW/OrT+nRyjRXHDZd17HmIgy+reOQ/yhh72NznNjGuS8kbCAcA4Ro4mw==",
-      "dependencies": {
-        "@ioredis/commands": "^1.1.1",
-        "cluster-key-slot": "^1.1.0",
-        "debug": "^4.3.4",
-        "denque": "^2.1.0",
-        "lodash.defaults": "^4.2.0",
-        "lodash.isarguments": "^3.1.0",
-        "redis-errors": "^1.2.0",
-        "redis-parser": "^3.0.0",
-        "standard-as-callback": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=12.22.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/ioredis"
-      }
-    },
-    "node_modules/iron-webcrypto": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz",
-      "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==",
-      "funding": {
-        "url": "https://github.com/sponsors/brc-dd"
-      }
-    },
-    "node_modules/is-binary-path": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
-      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
-      "dependencies": {
-        "binary-extensions": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-core-module": {
-      "version": "2.16.1",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
-      "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
-      "dependencies": {
-        "hasown": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-docker": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
-      "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
-      "bin": {
-        "is-docker": "cli.js"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-https": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/is-https/-/is-https-4.0.0.tgz",
-      "integrity": "sha512-FeMLiqf8E5g6SdiVJsPcNZX8k4h2fBs1wp5Bb6uaNxn58ufK1axBqQZdmAQsqh0t9BuwFObybrdVJh6MKyPlyg==",
-      "dev": true
-    },
-    "node_modules/is-inside-container": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
-      "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
-      "dependencies": {
-        "is-docker": "^3.0.0"
-      },
-      "bin": {
-        "is-inside-container": "cli.js"
-      },
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-installed-globally": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz",
-      "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==",
-      "dependencies": {
-        "global-directory": "^4.0.1",
-        "is-path-inside": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-module": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
-      "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="
-    },
-    "node_modules/is-node-process": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz",
-      "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw=="
-    },
-    "node_modules/is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/is-path-inside": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz",
-      "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-reference": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
-      "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
-      "dependencies": {
-        "@types/estree": "*"
-      }
-    },
-    "node_modules/is-ssh": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz",
-      "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==",
-      "dependencies": {
-        "protocols": "^2.0.1"
-      }
-    },
-    "node_modules/is-stream": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
-      "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-what": {
-      "version": "4.1.16",
-      "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
-      "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
-      "engines": {
-        "node": ">=12.13"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mesqueeb"
-      }
-    },
-    "node_modules/is-wsl": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
-      "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
-      "dependencies": {
-        "is-inside-container": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is64bit": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz",
-      "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==",
-      "dependencies": {
-        "system-architecture": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
-    },
-    "node_modules/isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
-    },
-    "node_modules/jackspeak": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
-      "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
-      "dependencies": {
-        "@isaacs/cliui": "^8.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      },
-      "optionalDependencies": {
-        "@pkgjs/parseargs": "^0.11.0"
-      }
-    },
-    "node_modules/jest-worker": {
-      "version": "27.5.1",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
-      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
-      "peer": true,
-      "dependencies": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^8.0.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/jest-worker/node_modules/supports-color": {
-      "version": "8.1.1",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
-      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-      "peer": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/supports-color?sponsor=1"
-      }
-    },
-    "node_modules/jiti": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
-      "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
-      "bin": {
-        "jiti": "lib/jiti-cli.mjs"
-      }
-    },
-    "node_modules/jose": {
-      "version": "5.10.0",
-      "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz",
-      "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==",
-      "funding": {
-        "url": "https://github.com/sponsors/panva"
-      }
-    },
-    "node_modules/js-base64": {
-      "version": "3.7.7",
-      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz",
-      "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw=="
-    },
-    "node_modules/js-levenshtein": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
-      "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
-    },
-    "node_modules/js-yaml": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-      "dependencies": {
-        "argparse": "^2.0.1"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
-      }
-    },
-    "node_modules/jsesc": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
-      "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
-      "bin": {
-        "jsesc": "bin/jsesc"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "peer": true
-    },
-    "node_modules/json-schema-traverse": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
-    },
-    "node_modules/json5": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
-      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
-      "bin": {
-        "json5": "lib/cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/jsonc-eslint-parser": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz",
-      "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==",
-      "dev": true,
-      "dependencies": {
-        "acorn": "^8.5.0",
-        "eslint-visitor-keys": "^3.0.0",
-        "espree": "^9.0.0",
-        "semver": "^7.3.5"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ota-meshi"
-      }
-    },
-    "node_modules/jsonfile": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
-      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
-      "dependencies": {
-        "universalify": "^2.0.0"
-      },
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "node_modules/jwt-decode": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz",
-      "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/kleur": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
-      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/klona": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
-      "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/knitwork": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.2.0.tgz",
-      "integrity": "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg=="
-    },
-    "node_modules/kolorist": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz",
-      "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="
-    },
-    "node_modules/launch-editor": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz",
-      "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==",
-      "dependencies": {
-        "picocolors": "^1.0.0",
-        "shell-quote": "^1.8.1"
-      }
-    },
-    "node_modules/lazystream": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
-      "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
-      "dependencies": {
-        "readable-stream": "^2.0.5"
-      },
-      "engines": {
-        "node": ">= 0.6.3"
-      }
-    },
-    "node_modules/lazystream/node_modules/readable-stream": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
-      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/lazystream/node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-    },
-    "node_modules/lazystream/node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "node_modules/lilconfig": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
-      "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antonk52"
-      }
-    },
-    "node_modules/lines-and-columns": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
-      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
-      "dev": true
-    },
-    "node_modules/listhen": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.9.0.tgz",
-      "integrity": "sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==",
-      "dependencies": {
-        "@parcel/watcher": "^2.4.1",
-        "@parcel/watcher-wasm": "^2.4.1",
-        "citty": "^0.1.6",
-        "clipboardy": "^4.0.0",
-        "consola": "^3.2.3",
-        "crossws": ">=0.2.0 <0.4.0",
-        "defu": "^6.1.4",
-        "get-port-please": "^3.1.2",
-        "h3": "^1.12.0",
-        "http-shutdown": "^1.2.2",
-        "jiti": "^2.1.2",
-        "mlly": "^1.7.1",
-        "node-forge": "^1.3.1",
-        "pathe": "^1.1.2",
-        "std-env": "^3.7.0",
-        "ufo": "^1.5.4",
-        "untun": "^0.1.3",
-        "uqr": "^0.1.2"
-      },
-      "bin": {
-        "listen": "bin/listhen.mjs",
-        "listhen": "bin/listhen.mjs"
-      }
-    },
-    "node_modules/listhen/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
-    },
-    "node_modules/load-tsconfig": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
-      "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      }
-    },
-    "node_modules/loader-runner": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
-      "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
-      "peer": true,
-      "engines": {
-        "node": ">=6.11.5"
-      }
-    },
-    "node_modules/local-pkg": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz",
-      "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==",
-      "dependencies": {
-        "mlly": "^1.7.3",
-        "pkg-types": "^1.2.1"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-    },
-    "node_modules/lodash._baseiteratee": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz",
-      "integrity": "sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==",
-      "dependencies": {
-        "lodash._stringtopath": "~4.8.0"
-      }
-    },
-    "node_modules/lodash._basetostring": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz",
-      "integrity": "sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw=="
-    },
-    "node_modules/lodash._baseuniq": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz",
-      "integrity": "sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==",
-      "dependencies": {
-        "lodash._createset": "~4.0.0",
-        "lodash._root": "~3.0.0"
-      }
-    },
-    "node_modules/lodash._createset": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz",
-      "integrity": "sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA=="
-    },
-    "node_modules/lodash._root": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
-      "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ=="
-    },
-    "node_modules/lodash._stringtopath": {
-      "version": "4.8.0",
-      "resolved": "https://registry.npmjs.org/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz",
-      "integrity": "sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==",
-      "dependencies": {
-        "lodash._basetostring": "~4.12.0"
-      }
-    },
-    "node_modules/lodash.defaults": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
-      "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="
-    },
-    "node_modules/lodash.isarguments": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
-      "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg=="
-    },
-    "node_modules/lodash.memoize": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
-      "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="
-    },
-    "node_modules/lodash.throttle": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
-      "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
-    },
-    "node_modules/lodash.uniq": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
-      "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="
-    },
-    "node_modules/lodash.uniqby": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz",
-      "integrity": "sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==",
-      "dependencies": {
-        "lodash._baseiteratee": "~4.7.0",
-        "lodash._baseuniq": "~4.6.0"
-      }
-    },
-    "node_modules/lru-cache": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-      "dependencies": {
-        "yallist": "^3.0.2"
-      }
-    },
-    "node_modules/magic-string": {
-      "version": "0.30.17",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
-      "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
-      "dependencies": {
-        "@jridgewell/sourcemap-codec": "^1.5.0"
-      }
-    },
-    "node_modules/magic-string-ast": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-0.7.0.tgz",
-      "integrity": "sha512-686fgAHaJY7wLTFEq7nnKqeQrhqmXB19d1HnqT35Ci7BN6hbAYLZUezTQ062uUHM7ggZEQlqJ94Ftls+KDXU8Q==",
-      "dependencies": {
-        "magic-string": "^0.30.17"
-      },
-      "engines": {
-        "node": ">=16.14.0"
-      }
-    },
-    "node_modules/magicast": {
-      "version": "0.3.5",
-      "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz",
-      "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==",
-      "dependencies": {
-        "@babel/parser": "^7.25.4",
-        "@babel/types": "^7.25.4",
-        "source-map-js": "^1.2.0"
-      }
-    },
-    "node_modules/math-intrinsics": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
-      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/mdn-data": {
-      "version": "2.0.30",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
-      "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="
-    },
-    "node_modules/merge-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
-    },
-    "node_modules/merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/merkle-json": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/merkle-json/-/merkle-json-2.7.0.tgz",
-      "integrity": "sha512-yzOZPrvIydATWQMk0lLxKjudKQV7Deu4hh/EJT7+q6c4aYs7J02WVGG5Mv6B5QbLJGy78h+u2nE5f8eUpDFGEg==",
-      "dependencies": {
-        "merkle-json": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6.11.0"
-      }
-    },
-    "node_modules/micromatch": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
-      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
-      "dependencies": {
-        "braces": "^3.0.3",
-        "picomatch": "^2.3.1"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/micromatch/node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/mime": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.6.tgz",
-      "integrity": "sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A==",
-      "funding": [
-        "https://github.com/sponsors/broofa"
-      ],
-      "bin": {
-        "mime": "bin/cli.js"
-      },
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/mime-db": {
-      "version": "1.52.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mime-types": {
-      "version": "2.1.35",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
-      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "dependencies": {
-        "mime-db": "1.52.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mimic-fn": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
-      "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/minipass": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
-      "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/minizlib": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
-      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-      "dependencies": {
-        "minipass": "^3.0.0",
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/minizlib/node_modules/minipass": {
-      "version": "3.3.6",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
-      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/minizlib/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-    },
-    "node_modules/mitt": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
-      "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
-    },
-    "node_modules/mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/mlly": {
-      "version": "1.7.4",
-      "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz",
-      "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==",
-      "dependencies": {
-        "acorn": "^8.14.0",
-        "pathe": "^2.0.1",
-        "pkg-types": "^1.3.0",
-        "ufo": "^1.5.4"
-      }
-    },
-    "node_modules/moment": {
-      "version": "2.30.1",
-      "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
-      "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/moo": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz",
-      "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q=="
-    },
-    "node_modules/mrmime": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
-      "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/ms": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
-    },
-    "node_modules/mz": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
-      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
-      "dev": true,
-      "dependencies": {
-        "any-promise": "^1.0.0",
-        "object-assign": "^4.0.1",
-        "thenify-all": "^1.0.0"
-      }
-    },
-    "node_modules/nanoid": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz",
-      "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "bin": {
-        "nanoid": "bin/nanoid.js"
-      },
-      "engines": {
-        "node": "^18 || >=20"
-      }
-    },
-    "node_modules/nanotar": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/nanotar/-/nanotar-0.2.0.tgz",
-      "integrity": "sha512-9ca1h0Xjvo9bEkE4UOxgAzLV0jHKe6LMaxo37ND2DAhhAtd0j8pR1Wxz+/goMrZO8AEZTWCmyaOsFI/W5AdpCQ=="
-    },
-    "node_modules/nearley": {
-      "version": "2.20.1",
-      "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz",
-      "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==",
-      "dependencies": {
-        "commander": "^2.19.0",
-        "moo": "^0.5.0",
-        "railroad-diagrams": "^1.0.0",
-        "randexp": "0.4.6"
-      },
-      "bin": {
-        "nearley-railroad": "bin/nearley-railroad.js",
-        "nearley-test": "bin/nearley-test.js",
-        "nearley-unparse": "bin/nearley-unparse.js",
-        "nearleyc": "bin/nearleyc.js"
-      },
-      "funding": {
-        "type": "individual",
-        "url": "https://nearley.js.org/#give-to-nearley"
-      }
-    },
-    "node_modules/neo-async": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
-      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
-      "peer": true
-    },
-    "node_modules/nitropack": {
-      "version": "2.10.4",
-      "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.10.4.tgz",
-      "integrity": "sha512-sJiG/MIQlZCVSw2cQrFG1H6mLeSqHlYfFerRjLKz69vUfdu0EL2l0WdOxlQbzJr3mMv/l4cOlCCLzVRzjzzF/g==",
-      "dependencies": {
-        "@cloudflare/kv-asset-handler": "^0.3.4",
-        "@netlify/functions": "^2.8.2",
-        "@rollup/plugin-alias": "^5.1.1",
-        "@rollup/plugin-commonjs": "^28.0.1",
-        "@rollup/plugin-inject": "^5.0.5",
-        "@rollup/plugin-json": "^6.1.0",
-        "@rollup/plugin-node-resolve": "^15.3.0",
-        "@rollup/plugin-replace": "^6.0.1",
-        "@rollup/plugin-terser": "^0.4.4",
-        "@rollup/pluginutils": "^5.1.3",
-        "@types/http-proxy": "^1.17.15",
-        "@vercel/nft": "^0.27.5",
-        "archiver": "^7.0.1",
-        "c12": "2.0.1",
-        "chokidar": "^3.6.0",
-        "citty": "^0.1.6",
-        "compatx": "^0.1.8",
-        "confbox": "^0.1.8",
-        "consola": "^3.2.3",
-        "cookie-es": "^1.2.2",
-        "croner": "^9.0.0",
-        "crossws": "^0.3.1",
-        "db0": "^0.2.1",
-        "defu": "^6.1.4",
-        "destr": "^2.0.3",
-        "dot-prop": "^9.0.0",
-        "esbuild": "^0.24.0",
-        "escape-string-regexp": "^5.0.0",
-        "etag": "^1.8.1",
-        "fs-extra": "^11.2.0",
-        "globby": "^14.0.2",
-        "gzip-size": "^7.0.0",
-        "h3": "^1.13.0",
-        "hookable": "^5.5.3",
-        "httpxy": "^0.1.5",
-        "ioredis": "^5.4.1",
-        "jiti": "^2.4.0",
-        "klona": "^2.0.6",
-        "knitwork": "^1.1.0",
-        "listhen": "^1.9.0",
-        "magic-string": "^0.30.12",
-        "magicast": "^0.3.5",
-        "mime": "^4.0.4",
-        "mlly": "^1.7.2",
-        "node-fetch-native": "^1.6.4",
-        "ofetch": "^1.4.1",
-        "ohash": "^1.1.4",
-        "openapi-typescript": "^7.4.2",
-        "pathe": "^1.1.2",
-        "perfect-debounce": "^1.0.0",
-        "pkg-types": "^1.2.1",
-        "pretty-bytes": "^6.1.1",
-        "radix3": "^1.1.2",
-        "rollup": "^4.24.3",
-        "rollup-plugin-visualizer": "^5.12.0",
-        "scule": "^1.3.0",
-        "semver": "^7.6.3",
-        "serve-placeholder": "^2.0.2",
-        "serve-static": "^1.16.2",
-        "std-env": "^3.7.0",
-        "ufo": "^1.5.4",
-        "uncrypto": "^0.1.3",
-        "unctx": "^2.3.1",
-        "unenv": "^1.10.0",
-        "unimport": "^3.13.1",
-        "unstorage": "^1.13.1",
-        "untyped": "^1.5.1",
-        "unwasm": "^0.3.9"
-      },
-      "bin": {
-        "nitro": "dist/cli/index.mjs",
-        "nitropack": "dist/cli/index.mjs"
-      },
-      "engines": {
-        "node": "^16.11.0 || >=17.0.0"
-      },
-      "peerDependencies": {
-        "xml2js": "^0.6.2"
-      },
-      "peerDependenciesMeta": {
-        "xml2js": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/nitropack/node_modules/c12": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/c12/-/c12-2.0.1.tgz",
-      "integrity": "sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==",
-      "dependencies": {
-        "chokidar": "^4.0.1",
-        "confbox": "^0.1.7",
-        "defu": "^6.1.4",
-        "dotenv": "^16.4.5",
-        "giget": "^1.2.3",
-        "jiti": "^2.3.0",
-        "mlly": "^1.7.1",
-        "ohash": "^1.1.4",
-        "pathe": "^1.1.2",
-        "perfect-debounce": "^1.0.0",
-        "pkg-types": "^1.2.0",
-        "rc9": "^2.1.2"
-      },
-      "peerDependencies": {
-        "magicast": "^0.3.5"
-      },
-      "peerDependenciesMeta": {
-        "magicast": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/nitropack/node_modules/c12/node_modules/chokidar": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
-      "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
-      "dependencies": {
-        "readdirp": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 14.16.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      }
-    },
-    "node_modules/nitropack/node_modules/chokidar": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
-      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
-      "dependencies": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/nitropack/node_modules/chokidar/node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/nitropack/node_modules/chokidar/node_modules/readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/nitropack/node_modules/js-tokens": {
-      "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
-      "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="
-    },
-    "node_modules/nitropack/node_modules/local-pkg": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz",
-      "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==",
-      "dependencies": {
-        "mlly": "^1.7.3",
-        "pkg-types": "^1.3.0"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/nitropack/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
-    },
-    "node_modules/nitropack/node_modules/strip-literal": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz",
-      "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==",
-      "dependencies": {
-        "js-tokens": "^9.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/nitropack/node_modules/unimport": {
-      "version": "3.14.6",
-      "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.14.6.tgz",
-      "integrity": "sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==",
-      "dependencies": {
-        "@rollup/pluginutils": "^5.1.4",
-        "acorn": "^8.14.0",
-        "escape-string-regexp": "^5.0.0",
-        "estree-walker": "^3.0.3",
-        "fast-glob": "^3.3.3",
-        "local-pkg": "^1.0.0",
-        "magic-string": "^0.30.17",
-        "mlly": "^1.7.4",
-        "pathe": "^2.0.1",
-        "picomatch": "^4.0.2",
-        "pkg-types": "^1.3.0",
-        "scule": "^1.3.0",
-        "strip-literal": "^2.1.1",
-        "unplugin": "^1.16.1"
-      }
-    },
-    "node_modules/nitropack/node_modules/unimport/node_modules/pathe": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
-      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="
-    },
-    "node_modules/node-addon-api": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
-      "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="
-    },
-    "node_modules/node-fetch": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
-      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
-      "dependencies": {
-        "whatwg-url": "^5.0.0"
-      },
-      "engines": {
-        "node": "4.x || >=6.0.0"
-      },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
-      },
-      "peerDependenciesMeta": {
-        "encoding": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/node-fetch-native": {
-      "version": "1.6.6",
-      "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz",
-      "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="
-    },
-    "node_modules/node-forge": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
-      "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
-      "engines": {
-        "node": ">= 6.13.0"
-      }
-    },
-    "node_modules/node-gyp-build": {
-      "version": "4.8.4",
-      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
-      "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
-      "bin": {
-        "node-gyp-build": "bin.js",
-        "node-gyp-build-optional": "optional.js",
-        "node-gyp-build-test": "build-test.js"
-      }
-    },
-    "node_modules/node-mock-http": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.0.tgz",
-      "integrity": "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ=="
-    },
-    "node_modules/node-releases": {
-      "version": "2.0.19",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
-      "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="
-    },
-    "node_modules/nopt": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz",
-      "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==",
-      "dependencies": {
-        "abbrev": "^3.0.0"
-      },
-      "bin": {
-        "nopt": "bin/nopt.js"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/normalize-range": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
-      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/npm-run-path": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
-      "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
-      "dependencies": {
-        "path-key": "^4.0.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/npm-run-path/node_modules/path-key": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
-      "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/nth-check": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
-      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
-      "dependencies": {
-        "boolbase": "^1.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/nth-check?sponsor=1"
-      }
-    },
-    "node_modules/nuxt": {
-      "version": "3.15.4",
-      "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.15.4.tgz",
-      "integrity": "sha512-hSbZO4mR0uAMJtZPNTnCfiAtgleoOu28gvJcBNU7KQHgWnNXPjlWgwMczko2O4Tmnv9zIe/CQged+2HsPwl2ZA==",
-      "dependencies": {
-        "@nuxt/cli": "^3.21.1",
-        "@nuxt/devalue": "^2.0.2",
-        "@nuxt/devtools": "^1.7.0",
-        "@nuxt/kit": "3.15.4",
-        "@nuxt/schema": "3.15.4",
-        "@nuxt/telemetry": "^2.6.4",
-        "@nuxt/vite-builder": "3.15.4",
-        "@unhead/dom": "^1.11.18",
-        "@unhead/shared": "^1.11.18",
-        "@unhead/ssr": "^1.11.18",
-        "@unhead/vue": "^1.11.18",
-        "@vue/shared": "^3.5.13",
-        "acorn": "8.14.0",
-        "c12": "^2.0.1",
-        "chokidar": "^4.0.3",
-        "compatx": "^0.1.8",
-        "consola": "^3.4.0",
-        "cookie-es": "^1.2.2",
-        "defu": "^6.1.4",
-        "destr": "^2.0.3",
-        "devalue": "^5.1.1",
-        "errx": "^0.1.0",
-        "esbuild": "^0.24.2",
-        "escape-string-regexp": "^5.0.0",
-        "estree-walker": "^3.0.3",
-        "globby": "^14.0.2",
-        "h3": "^1.14.0",
-        "hookable": "^5.5.3",
-        "ignore": "^7.0.3",
-        "impound": "^0.2.0",
-        "jiti": "^2.4.2",
-        "klona": "^2.0.6",
-        "knitwork": "^1.2.0",
-        "magic-string": "^0.30.17",
-        "mlly": "^1.7.4",
-        "nanotar": "^0.2.0",
-        "nitropack": "^2.10.4",
-        "nypm": "^0.5.2",
-        "ofetch": "^1.4.1",
-        "ohash": "^1.1.4",
-        "pathe": "^2.0.2",
-        "perfect-debounce": "^1.0.0",
-        "pkg-types": "^1.3.1",
-        "radix3": "^1.1.2",
-        "scule": "^1.3.0",
-        "semver": "^7.6.3",
-        "std-env": "^3.8.0",
-        "strip-literal": "^3.0.0",
-        "tinyglobby": "0.2.10",
-        "ufo": "^1.5.4",
-        "ultrahtml": "^1.5.3",
-        "uncrypto": "^0.1.3",
-        "unctx": "^2.4.1",
-        "unenv": "^1.10.0",
-        "unhead": "^1.11.18",
-        "unimport": "^4.0.0",
-        "unplugin": "^2.1.2",
-        "unplugin-vue-router": "^0.11.2",
-        "unstorage": "^1.14.4",
-        "untyped": "^1.5.2",
-        "vue": "^3.5.13",
-        "vue-bundle-renderer": "^2.1.1",
-        "vue-devtools-stub": "^0.1.0",
-        "vue-router": "^4.5.0"
-      },
-      "bin": {
-        "nuxi": "bin/nuxt.mjs",
-        "nuxt": "bin/nuxt.mjs"
-      },
-      "engines": {
-        "node": "^18.20.5 || ^20.9.0 || >=22.0.0"
-      },
-      "peerDependencies": {
-        "@parcel/watcher": "^2.1.0",
-        "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@parcel/watcher": {
-          "optional": true
-        },
-        "@types/node": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/nuxt-oidc-auth": {
-      "version": "1.0.0-beta.5",
-      "resolved": "https://registry.npmjs.org/nuxt-oidc-auth/-/nuxt-oidc-auth-1.0.0-beta.5.tgz",
-      "integrity": "sha512-/bZ3yBfKmT40Kk66RZ9757SGMvqcZqLYRX6HK3l2o4N1dPvz1gW50t6cZ6UFJ63G7FWdHUuoRyo2INEpvbXe4g==",
-      "dependencies": {
-        "@nuxt/devtools-kit": "^1.7.0",
-        "@nuxt/devtools-ui-kit": "^1.7.0",
-        "consola": "^3.4.0",
-        "defu": "^6.1.4",
-        "h3": "^1.13.1",
-        "jose": "^5.9.6",
-        "ofetch": "^1.4.1",
-        "scule": "^1.3.0",
-        "sirv": "^3.0.0",
-        "ufo": "^1.5.4",
-        "uncrypto": "^0.1.3",
-        "undici": "^7.2.3",
-        "undio": "^0.2.0"
-      },
-      "peerDependencies": {
-        "undici": "^7.2.1"
-      },
-      "peerDependenciesMeta": {
-        "undici": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/nuxt-oidc-auth/node_modules/sirv": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz",
-      "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==",
-      "dependencies": {
-        "@polka/url": "^1.0.0-next.24",
-        "mrmime": "^2.0.0",
-        "totalist": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/nuxt-site-config": {
-      "version": "2.2.21",
-      "resolved": "https://registry.npmjs.org/nuxt-site-config/-/nuxt-site-config-2.2.21.tgz",
-      "integrity": "sha512-VsHpR4socGrlRPjyg2F8JqbirBqH4yCkTQa60fj7saqKMPW1VcRROn21OJzfTHDpjeD+KayRdR3FB0Jxk9WFNA==",
-      "dependencies": {
-        "@nuxt/devtools-kit": "^1.6.0",
-        "@nuxt/kit": "^3.13.2",
-        "@nuxt/schema": "^3.13.2",
-        "nuxt-site-config-kit": "2.2.21",
-        "pathe": "^1.1.2",
-        "pkg-types": "^1.2.1",
-        "sirv": "^3.0.0",
-        "site-config-stack": "2.2.21",
-        "ufo": "^1.5.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/harlan-zw"
-      }
-    },
-    "node_modules/nuxt-site-config-kit": {
-      "version": "2.2.21",
-      "resolved": "https://registry.npmjs.org/nuxt-site-config-kit/-/nuxt-site-config-kit-2.2.21.tgz",
-      "integrity": "sha512-xO41Zf6bXlA9Zvj+fX7ftD+ITee4LfrkzHj85Gt4FpgwonFxzGO5pMBtAqIxXKJwuyT1z2wVAixHI+ov66wV0w==",
-      "dependencies": {
-        "@nuxt/kit": "^3.13.2",
-        "@nuxt/schema": "^3.13.2",
-        "pkg-types": "^1.2.1",
-        "site-config-stack": "2.2.21",
-        "std-env": "^3.7.0",
-        "ufo": "^1.5.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/harlan-zw"
-      }
-    },
-    "node_modules/nuxt-site-config/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
-    },
-    "node_modules/nuxt-site-config/node_modules/sirv": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz",
-      "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==",
-      "dependencies": {
-        "@polka/url": "^1.0.0-next.24",
-        "mrmime": "^2.0.0",
-        "totalist": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/nuxt/node_modules/unplugin": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz",
-      "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==",
-      "dependencies": {
-        "acorn": "^8.14.0",
-        "webpack-virtual-modules": "^0.6.2"
-      },
-      "engines": {
-        "node": ">=18.12.0"
-      }
-    },
-    "node_modules/nypm": {
-      "version": "0.5.4",
-      "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.5.4.tgz",
-      "integrity": "sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==",
-      "dependencies": {
-        "citty": "^0.1.6",
-        "consola": "^3.4.0",
-        "pathe": "^2.0.3",
-        "pkg-types": "^1.3.1",
-        "tinyexec": "^0.3.2",
-        "ufo": "^1.5.4"
-      },
-      "bin": {
-        "nypm": "dist/cli.mjs"
-      },
-      "engines": {
-        "node": "^14.16.0 || >=16.10.0"
-      }
-    },
-    "node_modules/object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-inspect": {
-      "version": "1.13.4",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
-      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/ofetch": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz",
-      "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==",
-      "dependencies": {
-        "destr": "^2.0.3",
-        "node-fetch-native": "^1.6.4",
-        "ufo": "^1.5.4"
-      }
-    },
-    "node_modules/ohash": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.4.tgz",
-      "integrity": "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g=="
-    },
-    "node_modules/on-finished": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
-      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
-      "dependencies": {
-        "ee-first": "1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-      "dependencies": {
-        "wrappy": "1"
-      }
-    },
-    "node_modules/onetime": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
-      "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
-      "dependencies": {
-        "mimic-fn": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/open": {
-      "version": "8.4.2",
-      "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
-      "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
-      "dependencies": {
-        "define-lazy-prop": "^2.0.0",
-        "is-docker": "^2.1.1",
-        "is-wsl": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/open/node_modules/is-docker": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
-      "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
-      "bin": {
-        "is-docker": "cli.js"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/open/node_modules/is-wsl": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
-      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
-      "dependencies": {
-        "is-docker": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/openapi-typescript": {
-      "version": "7.6.1",
-      "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.6.1.tgz",
-      "integrity": "sha512-F7RXEeo/heF3O9lOXo2bNjCOtfp7u+D6W3a3VNEH2xE6v+fxLtn5nq0uvUcA1F5aT+CMhNeC5Uqtg5tlXFX/ag==",
-      "dependencies": {
-        "@redocly/openapi-core": "^1.28.0",
-        "ansi-colors": "^4.1.3",
-        "change-case": "^5.4.4",
-        "parse-json": "^8.1.0",
-        "supports-color": "^9.4.0",
-        "yargs-parser": "^21.1.1"
-      },
-      "bin": {
-        "openapi-typescript": "bin/cli.js"
-      },
-      "peerDependencies": {
-        "typescript": "^5.x"
-      }
-    },
-    "node_modules/outvariant": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz",
-      "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA=="
-    },
-    "node_modules/package-json-from-dist": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
-      "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="
-    },
-    "node_modules/package-manager-detector": {
-      "version": "0.2.9",
-      "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.9.tgz",
-      "integrity": "sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q=="
-    },
-    "node_modules/packrup": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/packrup/-/packrup-0.1.2.tgz",
-      "integrity": "sha512-ZcKU7zrr5GlonoS9cxxrb5HVswGnyj6jQvwFBa6p5VFw7G71VAHcUKL5wyZSU/ECtPM/9gacWxy2KFQKt1gMNA==",
-      "funding": {
-        "url": "https://github.com/sponsors/harlan-zw"
-      }
-    },
-    "node_modules/parse-git-config": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-3.0.0.tgz",
-      "integrity": "sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==",
-      "dependencies": {
-        "git-config-path": "^2.0.0",
-        "ini": "^1.3.5"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/parse-git-config/node_modules/ini": {
-      "version": "1.3.8",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
-      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
-    },
-    "node_modules/parse-json": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz",
-      "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==",
-      "dependencies": {
-        "@babel/code-frame": "^7.22.13",
-        "index-to-position": "^0.1.2",
-        "type-fest": "^4.7.1"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/parse-md": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/parse-md/-/parse-md-3.0.3.tgz",
-      "integrity": "sha512-2kpNrrW1GBgli5VT9X9/Y6n4PVsIFVdG49tguq1PHwzsRSK0Cu0yJPTUFOwWouFT85atYNWQ1T/rmqfj7kLd8g==",
-      "dependencies": {
-        "js-yaml": "^4.1.0"
-      }
-    },
-    "node_modules/parse-path": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.1.tgz",
-      "integrity": "sha512-6ReLMptznuuOEzLoGEa+I1oWRSj2Zna5jLWC+l6zlfAI4dbbSaIES29ThzuPkbhNahT65dWzfoZEO6cfJw2Ksg==",
-      "dependencies": {
-        "protocols": "^2.0.0"
-      }
-    },
-    "node_modules/parse-url": {
-      "version": "9.2.0",
-      "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz",
-      "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==",
-      "dependencies": {
-        "@types/parse-path": "^7.0.0",
-        "parse-path": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=14.13.0"
-      }
-    },
-    "node_modules/parseurl": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
-      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
-    },
-    "node_modules/path-scurry": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
-      "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
-      "dependencies": {
-        "lru-cache": "^10.2.0",
-        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/path-scurry/node_modules/lru-cache": {
-      "version": "10.4.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
-      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
-    },
-    "node_modules/path-type": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz",
-      "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/pathe": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
-      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="
-    },
-    "node_modules/perfect-debounce": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
-      "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="
-    },
-    "node_modules/picocolors": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
-      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
-    },
-    "node_modules/picomatch": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
-      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/pinia": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.1.tgz",
-      "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==",
-      "dependencies": {
-        "@vue/devtools-api": "^6.6.3",
-        "vue-demi": "^0.14.10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/posva"
-      },
-      "peerDependencies": {
-        "typescript": ">=4.4.4",
-        "vue": "^2.7.0 || ^3.5.11"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/pinia-plugin-persistedstate": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.2.0.tgz",
-      "integrity": "sha512-3buhA7ac+ssbOIx3VRCC8oHkoFwhDM9oHRCjo7nj+O8WUqnW+jRqh7eYT5eS/DNa3H28zp3dYf/nd/Vc8zj8eQ==",
-      "dev": true,
-      "dependencies": {
-        "@nuxt/kit": "^3.14.1592",
-        "deep-pick-omit": "^1.2.1",
-        "defu": "^6.1.4",
-        "destr": "^2.0.3"
-      },
-      "peerDependencies": {
-        "@pinia/nuxt": ">=0.9.0",
-        "pinia": ">=2.3.0"
-      },
-      "peerDependenciesMeta": {
-        "@pinia/nuxt": {
-          "optional": true
-        },
-        "pinia": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/pirates": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
-      "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/pkg-types": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
-      "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
-      "dependencies": {
-        "confbox": "^0.1.8",
-        "mlly": "^1.7.4",
-        "pathe": "^2.0.1"
-      }
-    },
-    "node_modules/pluralize": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
-      "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss": {
-      "version": "8.5.3",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
-      "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/postcss/"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/postcss"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "dependencies": {
-        "nanoid": "^3.3.8",
-        "picocolors": "^1.1.1",
-        "source-map-js": "^1.2.1"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >=14"
-      }
-    },
-    "node_modules/postcss-calc": {
-      "version": "10.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz",
-      "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==",
-      "dependencies": {
-        "postcss-selector-parser": "^7.0.0",
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12 || ^20.9 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.38"
-      }
-    },
-    "node_modules/postcss-colormin": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz",
-      "integrity": "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==",
-      "dependencies": {
-        "browserslist": "^4.23.3",
-        "caniuse-api": "^3.0.0",
-        "colord": "^2.9.3",
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-convert-values": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz",
-      "integrity": "sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==",
-      "dependencies": {
-        "browserslist": "^4.23.3",
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-discard-comments": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz",
-      "integrity": "sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==",
-      "dependencies": {
-        "postcss-selector-parser": "^6.1.2"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-discard-comments/node_modules/postcss-selector-parser": {
-      "version": "6.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
-      "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
-      "dependencies": {
-        "cssesc": "^3.0.0",
-        "util-deprecate": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-discard-duplicates": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz",
-      "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==",
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-discard-empty": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz",
-      "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==",
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-discard-overridden": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz",
-      "integrity": "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==",
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-merge-longhand": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz",
-      "integrity": "sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==",
-      "dependencies": {
-        "postcss-value-parser": "^4.2.0",
-        "stylehacks": "^7.0.4"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-merge-rules": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz",
-      "integrity": "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==",
-      "dependencies": {
-        "browserslist": "^4.23.3",
-        "caniuse-api": "^3.0.0",
-        "cssnano-utils": "^5.0.0",
-        "postcss-selector-parser": "^6.1.2"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": {
-      "version": "6.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
-      "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
-      "dependencies": {
-        "cssesc": "^3.0.0",
-        "util-deprecate": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-minify-font-values": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz",
-      "integrity": "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==",
-      "dependencies": {
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-minify-gradients": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz",
-      "integrity": "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==",
-      "dependencies": {
-        "colord": "^2.9.3",
-        "cssnano-utils": "^5.0.0",
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-minify-params": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz",
-      "integrity": "sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==",
-      "dependencies": {
-        "browserslist": "^4.23.3",
-        "cssnano-utils": "^5.0.0",
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-minify-selectors": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz",
-      "integrity": "sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==",
-      "dependencies": {
-        "cssesc": "^3.0.0",
-        "postcss-selector-parser": "^6.1.2"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": {
-      "version": "6.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
-      "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
-      "dependencies": {
-        "cssesc": "^3.0.0",
-        "util-deprecate": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-normalize-charset": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz",
-      "integrity": "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==",
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-normalize-display-values": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz",
-      "integrity": "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==",
-      "dependencies": {
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-normalize-positions": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz",
-      "integrity": "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==",
-      "dependencies": {
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-normalize-repeat-style": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz",
-      "integrity": "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==",
-      "dependencies": {
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-normalize-string": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz",
-      "integrity": "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==",
-      "dependencies": {
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-normalize-timing-functions": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz",
-      "integrity": "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==",
-      "dependencies": {
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-normalize-unicode": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz",
-      "integrity": "sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==",
-      "dependencies": {
-        "browserslist": "^4.23.3",
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-normalize-url": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz",
-      "integrity": "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==",
-      "dependencies": {
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-normalize-whitespace": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz",
-      "integrity": "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==",
-      "dependencies": {
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-ordered-values": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz",
-      "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==",
-      "dependencies": {
-        "cssnano-utils": "^5.0.0",
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-reduce-initial": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz",
-      "integrity": "sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==",
-      "dependencies": {
-        "browserslist": "^4.23.3",
-        "caniuse-api": "^3.0.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-reduce-transforms": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz",
-      "integrity": "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==",
-      "dependencies": {
-        "postcss-value-parser": "^4.2.0"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-selector-parser": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
-      "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
-      "dependencies": {
-        "cssesc": "^3.0.0",
-        "util-deprecate": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-svgo": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.1.tgz",
-      "integrity": "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==",
-      "dependencies": {
-        "postcss-value-parser": "^4.2.0",
-        "svgo": "^3.3.2"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >= 18"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-unique-selectors": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz",
-      "integrity": "sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==",
-      "dependencies": {
-        "postcss-selector-parser": "^6.1.2"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/postcss-unique-selectors/node_modules/postcss-selector-parser": {
-      "version": "6.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
-      "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
-      "dependencies": {
-        "cssesc": "^3.0.0",
-        "util-deprecate": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-value-parser": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
-      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
-    },
-    "node_modules/postcss/node_modules/nanoid": {
-      "version": "3.3.8",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
-      "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "bin": {
-        "nanoid": "bin/nanoid.cjs"
-      },
-      "engines": {
-        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
-      }
-    },
-    "node_modules/pretty-bytes": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz",
-      "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==",
-      "engines": {
-        "node": "^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
-      "engines": {
-        "node": ">= 0.6.0"
-      }
-    },
-    "node_modules/process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
-    },
-    "node_modules/prom-client": {
-      "version": "14.2.0",
-      "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.2.0.tgz",
-      "integrity": "sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==",
-      "dependencies": {
-        "tdigest": "^0.1.1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/prompts": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
-      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
-      "dependencies": {
-        "kleur": "^3.0.3",
-        "sisteransi": "^1.0.5"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/proper-lockfile": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz",
-      "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==",
-      "dependencies": {
-        "graceful-fs": "^4.2.4",
-        "retry": "^0.12.0",
-        "signal-exit": "^3.0.2"
-      }
-    },
-    "node_modules/protocols": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz",
-      "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ=="
-    },
-    "node_modules/proxy-from-env": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
-    },
-    "node_modules/qs": {
-      "version": "6.14.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
-      "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
-      "dependencies": {
-        "side-channel": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/querystringify": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
-      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
-    },
-    "node_modules/queue-microtask": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
-      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/radix3": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz",
-      "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="
-    },
-    "node_modules/railroad-diagrams": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz",
-      "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A=="
-    },
-    "node_modules/randexp": {
-      "version": "0.4.6",
-      "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz",
-      "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==",
-      "dependencies": {
-        "discontinuous-range": "1.0.0",
-        "ret": "~0.1.10"
-      },
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "node_modules/randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "dependencies": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "node_modules/range-parser": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
-      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/rc9": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz",
-      "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==",
-      "dependencies": {
-        "defu": "^6.1.4",
-        "destr": "^2.0.3"
-      }
-    },
-    "node_modules/readable-stream": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
-      "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
-      "dependencies": {
-        "abort-controller": "^3.0.0",
-        "buffer": "^6.0.3",
-        "events": "^3.3.0",
-        "process": "^0.11.10",
-        "string_decoder": "^1.3.0"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      }
-    },
-    "node_modules/readdir-glob": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz",
-      "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
-      "dependencies": {
-        "minimatch": "^5.1.0"
-      }
-    },
-    "node_modules/readdir-glob/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/readdir-glob/node_modules/minimatch": {
-      "version": "5.1.6",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
-      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/readdirp": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
-      "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
-      "engines": {
-        "node": ">= 14.18.0"
-      },
-      "funding": {
-        "type": "individual",
-        "url": "https://paulmillr.com/funding/"
-      }
-    },
-    "node_modules/redis-errors": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
-      "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/redis-parser": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
-      "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==",
-      "dependencies": {
-        "redis-errors": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/require-from-string": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
-      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/requires-port": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
-    },
-    "node_modules/resize-observer-polyfill": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
-      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
-    },
-    "node_modules/resolve": {
-      "version": "1.22.10",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
-      "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
-      "dependencies": {
-        "is-core-module": "^2.16.0",
-        "path-parse": "^1.0.7",
-        "supports-preserve-symlinks-flag": "^1.0.0"
-      },
-      "bin": {
-        "resolve": "bin/resolve"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/resolve-from": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/resolve-pkg-maps": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
-      "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
-      "funding": {
-        "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
-      }
-    },
-    "node_modules/ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "node_modules/retry": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
-      "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-      "engines": {
-        "iojs": ">=1.0.0",
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/rfdc": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
-      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="
-    },
-    "node_modules/rimraf": {
-      "version": "5.0.10",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
-      "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==",
-      "dependencies": {
-        "glob": "^10.3.7"
-      },
-      "bin": {
-        "rimraf": "dist/esm/bin.mjs"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/rimraf/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/rimraf/node_modules/glob": {
-      "version": "10.4.5",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
-      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
-      "dependencies": {
-        "foreground-child": "^3.1.0",
-        "jackspeak": "^3.1.2",
-        "minimatch": "^9.0.4",
-        "minipass": "^7.1.2",
-        "package-json-from-dist": "^1.0.0",
-        "path-scurry": "^1.11.1"
-      },
-      "bin": {
-        "glob": "dist/esm/bin.mjs"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/rimraf/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/rimraf/node_modules/minipass": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
-      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      }
-    },
-    "node_modules/rollup": {
-      "version": "4.34.8",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz",
-      "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==",
-      "dependencies": {
-        "@types/estree": "1.0.6"
-      },
-      "bin": {
-        "rollup": "dist/bin/rollup"
-      },
-      "engines": {
-        "node": ">=18.0.0",
-        "npm": ">=8.0.0"
-      },
-      "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.34.8",
-        "@rollup/rollup-android-arm64": "4.34.8",
-        "@rollup/rollup-darwin-arm64": "4.34.8",
-        "@rollup/rollup-darwin-x64": "4.34.8",
-        "@rollup/rollup-freebsd-arm64": "4.34.8",
-        "@rollup/rollup-freebsd-x64": "4.34.8",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.34.8",
-        "@rollup/rollup-linux-arm-musleabihf": "4.34.8",
-        "@rollup/rollup-linux-arm64-gnu": "4.34.8",
-        "@rollup/rollup-linux-arm64-musl": "4.34.8",
-        "@rollup/rollup-linux-loongarch64-gnu": "4.34.8",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8",
-        "@rollup/rollup-linux-riscv64-gnu": "4.34.8",
-        "@rollup/rollup-linux-s390x-gnu": "4.34.8",
-        "@rollup/rollup-linux-x64-gnu": "4.34.8",
-        "@rollup/rollup-linux-x64-musl": "4.34.8",
-        "@rollup/rollup-win32-arm64-msvc": "4.34.8",
-        "@rollup/rollup-win32-ia32-msvc": "4.34.8",
-        "@rollup/rollup-win32-x64-msvc": "4.34.8",
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/rollup-plugin-visualizer": {
-      "version": "5.14.0",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.14.0.tgz",
-      "integrity": "sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==",
-      "dependencies": {
-        "open": "^8.4.0",
-        "picomatch": "^4.0.2",
-        "source-map": "^0.7.4",
-        "yargs": "^17.5.1"
-      },
-      "bin": {
-        "rollup-plugin-visualizer": "dist/bin/cli.js"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "rolldown": "1.x",
-        "rollup": "2.x || 3.x || 4.x"
-      },
-      "peerDependenciesMeta": {
-        "rolldown": {
-          "optional": true
-        },
-        "rollup": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/rollup-plugin-visualizer/node_modules/source-map": {
-      "version": "0.7.4",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
-      "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/run-applescript": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
-      "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/run-parallel": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
-      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "dependencies": {
-        "queue-microtask": "^1.2.2"
-      }
-    },
-    "node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/sass": {
-      "version": "1.85.0",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz",
-      "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==",
-      "devOptional": true,
-      "dependencies": {
-        "chokidar": "^4.0.0",
-        "immutable": "^5.0.2",
-        "source-map-js": ">=0.6.2 <2.0.0"
-      },
-      "bin": {
-        "sass": "sass.js"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "optionalDependencies": {
-        "@parcel/watcher": "^2.4.1"
-      }
-    },
-    "node_modules/schema-utils": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
-      "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
-      "peer": true,
-      "dependencies": {
-        "@types/json-schema": "^7.0.9",
-        "ajv": "^8.9.0",
-        "ajv-formats": "^2.1.1",
-        "ajv-keywords": "^5.1.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      }
-    },
-    "node_modules/scule": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz",
-      "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="
-    },
-    "node_modules/semver": {
-      "version": "7.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
-      "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/send": {
-      "version": "0.19.0",
-      "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
-      "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
-      "dependencies": {
-        "debug": "2.6.9",
-        "depd": "2.0.0",
-        "destroy": "1.2.0",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "fresh": "0.5.2",
-        "http-errors": "2.0.0",
-        "mime": "1.6.0",
-        "ms": "2.1.3",
-        "on-finished": "2.4.1",
-        "range-parser": "~1.2.1",
-        "statuses": "2.0.1"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/send/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/send/node_modules/debug/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-    },
-    "node_modules/send/node_modules/encodeurl": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/send/node_modules/mime": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/serialize-javascript": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
-      "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
-      "dependencies": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "node_modules/serve-placeholder": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/serve-placeholder/-/serve-placeholder-2.0.2.tgz",
-      "integrity": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==",
-      "dependencies": {
-        "defu": "^6.1.4"
-      }
-    },
-    "node_modules/serve-static": {
-      "version": "1.16.2",
-      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
-      "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
-      "dependencies": {
-        "encodeurl": "~2.0.0",
-        "escape-html": "~1.0.3",
-        "parseurl": "~1.3.3",
-        "send": "0.19.0"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/setprototypeof": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
-      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
-    },
-    "node_modules/shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dependencies": {
-        "shebang-regex": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shell-quote": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz",
-      "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
-      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "object-inspect": "^1.13.3",
-        "side-channel-list": "^1.0.0",
-        "side-channel-map": "^1.0.1",
-        "side-channel-weakmap": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-list": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
-      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "object-inspect": "^1.13.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-map": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
-      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
-      "dependencies": {
-        "call-bound": "^1.0.2",
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.5",
-        "object-inspect": "^1.13.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-weakmap": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
-      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
-      "dependencies": {
-        "call-bound": "^1.0.2",
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.5",
-        "object-inspect": "^1.13.3",
-        "side-channel-map": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/signal-exit": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
-    },
-    "node_modules/simple-git": {
-      "version": "3.27.0",
-      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.27.0.tgz",
-      "integrity": "sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==",
-      "dependencies": {
-        "@kwsites/file-exists": "^1.1.1",
-        "@kwsites/promise-deferred": "^1.1.1",
-        "debug": "^4.3.5"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/steveukx/git-js?sponsor=1"
-      }
-    },
-    "node_modules/sirv": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz",
-      "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==",
-      "dependencies": {
-        "@polka/url": "^1.0.0-next.24",
-        "mrmime": "^2.0.0",
-        "totalist": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/sisteransi": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
-      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
-    },
-    "node_modules/site-config-stack": {
-      "version": "2.2.21",
-      "resolved": "https://registry.npmjs.org/site-config-stack/-/site-config-stack-2.2.21.tgz",
-      "integrity": "sha512-HRIgIgZAEK8XFYYepL/KtygJgmcUPdgxBJl0ueSrA12lNo2tk5aMkSuA2Oz/k6chnTbEwd6ESMYCs6opgYKNHw==",
-      "dependencies": {
-        "ufo": "^1.5.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/harlan-zw"
-      },
-      "peerDependencies": {
-        "vue": "^3"
-      }
-    },
-    "node_modules/slash": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
-      "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/smob": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz",
-      "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig=="
-    },
-    "node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-js": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
-      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-support": {
-      "version": "0.5.21",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
-      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
-    "node_modules/speakingurl": {
-      "version": "14.0.1",
-      "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
-      "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/splitpanes": {
-      "version": "3.1.8",
-      "resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-3.1.8.tgz",
-      "integrity": "sha512-iYir0doakV9gYBfCuflGCxCD5Yhh09OGgT+epjfc6LZfTvGDdMXuD0Q4w6jI3hlkdRR1Ta3DlARcV3MOkybymg==",
-      "funding": {
-        "url": "https://github.com/sponsors/antoniandre"
-      },
-      "peerDependencies": {
-        "vue": "^3.2.0"
-      }
-    },
-    "node_modules/sql-formatter": {
-      "version": "15.4.11",
-      "resolved": "https://registry.npmjs.org/sql-formatter/-/sql-formatter-15.4.11.tgz",
-      "integrity": "sha512-AfIjH0mYxv0NVzs4mbcGIAcos2Si20LeF9GMk0VmVA4A3gs1PFIixVu3rtcz34ls7ghPAjrDb+XbRly/aF6HAg==",
-      "dependencies": {
-        "argparse": "^2.0.1",
-        "get-stdin": "=8.0.0",
-        "nearley": "^2.20.1"
-      },
-      "bin": {
-        "sql-formatter": "bin/sql-formatter-cli.cjs"
-      }
-    },
-    "node_modules/standard-as-callback": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz",
-      "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="
-    },
-    "node_modules/statuses": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
-      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/std-env": {
-      "version": "3.8.0",
-      "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz",
-      "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w=="
-    },
-    "node_modules/streamx": {
-      "version": "2.22.0",
-      "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz",
-      "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==",
-      "dependencies": {
-        "fast-fifo": "^1.3.2",
-        "text-decoder": "^1.1.0"
-      },
-      "optionalDependencies": {
-        "bare-events": "^2.2.0"
-      }
-    },
-    "node_modules/strict-event-emitter": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz",
-      "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ=="
-    },
-    "node_modules/string_decoder": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-      "dependencies": {
-        "safe-buffer": "~5.2.0"
-      }
-    },
-    "node_modules/string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/string-width-cjs": {
-      "name": "string-width",
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-ansi-cjs": {
-      "name": "strip-ansi",
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-final-newline": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
-      "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/strip-literal": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz",
-      "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==",
-      "dependencies": {
-        "js-tokens": "^9.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/strip-literal/node_modules/js-tokens": {
-      "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
-      "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="
-    },
-    "node_modules/stylehacks": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.4.tgz",
-      "integrity": "sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==",
-      "dependencies": {
-        "browserslist": "^4.23.3",
-        "postcss-selector-parser": "^6.1.2"
-      },
-      "engines": {
-        "node": "^18.12.0 || ^20.9.0 || >=22.0"
-      },
-      "peerDependencies": {
-        "postcss": "^8.4.31"
-      }
-    },
-    "node_modules/stylehacks/node_modules/postcss-selector-parser": {
-      "version": "6.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
-      "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
-      "dependencies": {
-        "cssesc": "^3.0.0",
-        "util-deprecate": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/sucrase": {
-      "version": "3.35.0",
-      "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
-      "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
-      "dev": true,
-      "dependencies": {
-        "@jridgewell/gen-mapping": "^0.3.2",
-        "commander": "^4.0.0",
-        "glob": "^10.3.10",
-        "lines-and-columns": "^1.1.6",
-        "mz": "^2.7.0",
-        "pirates": "^4.0.1",
-        "ts-interface-checker": "^0.1.9"
-      },
-      "bin": {
-        "sucrase": "bin/sucrase",
-        "sucrase-node": "bin/sucrase-node"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      }
-    },
-    "node_modules/sucrase/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/sucrase/node_modules/commander": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
-      "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
-      "dev": true,
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/sucrase/node_modules/glob": {
-      "version": "10.4.5",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
-      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
-      "dev": true,
-      "dependencies": {
-        "foreground-child": "^3.1.0",
-        "jackspeak": "^3.1.2",
-        "minimatch": "^9.0.4",
-        "minipass": "^7.1.2",
-        "package-json-from-dist": "^1.0.0",
-        "path-scurry": "^1.11.1"
-      },
-      "bin": {
-        "glob": "dist/esm/bin.mjs"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/sucrase/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/sucrase/node_modules/minipass": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
-      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
-      "dev": true,
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      }
-    },
-    "node_modules/superjson": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz",
-      "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
-      "dependencies": {
-        "copy-anything": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/supports-color": {
-      "version": "9.4.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz",
-      "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/supports-color?sponsor=1"
-      }
-    },
-    "node_modules/supports-preserve-symlinks-flag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
-      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/svg-tags": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
-      "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA=="
-    },
-    "node_modules/svgo": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz",
-      "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==",
-      "dependencies": {
-        "@trysound/sax": "0.2.0",
-        "commander": "^7.2.0",
-        "css-select": "^5.1.0",
-        "css-tree": "^2.3.1",
-        "css-what": "^6.1.0",
-        "csso": "^5.0.5",
-        "picocolors": "^1.0.0"
-      },
-      "bin": {
-        "svgo": "bin/svgo"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/svgo"
-      }
-    },
-    "node_modules/svgo/node_modules/commander": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
-      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/system-architecture": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz",
-      "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/tabbable": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
-      "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="
-    },
-    "node_modules/tapable": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
-      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/tar": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
-      "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
-      "dependencies": {
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.0.0",
-        "minipass": "^5.0.0",
-        "minizlib": "^2.1.1",
-        "mkdirp": "^1.0.3",
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/tar-stream": {
-      "version": "3.1.7",
-      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
-      "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
-      "dependencies": {
-        "b4a": "^1.6.4",
-        "fast-fifo": "^1.2.0",
-        "streamx": "^2.15.0"
-      }
-    },
-    "node_modules/tar/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-    },
-    "node_modules/tdigest": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz",
-      "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==",
-      "dependencies": {
-        "bintrees": "1.0.2"
-      }
-    },
-    "node_modules/terser": {
-      "version": "5.39.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz",
-      "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==",
-      "dependencies": {
-        "@jridgewell/source-map": "^0.3.3",
-        "acorn": "^8.8.2",
-        "commander": "^2.20.0",
-        "source-map-support": "~0.5.20"
-      },
-      "bin": {
-        "terser": "bin/terser"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/terser-webpack-plugin": {
-      "version": "5.3.11",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz",
-      "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==",
-      "peer": true,
-      "dependencies": {
-        "@jridgewell/trace-mapping": "^0.3.25",
-        "jest-worker": "^27.4.5",
-        "schema-utils": "^4.3.0",
-        "serialize-javascript": "^6.0.2",
-        "terser": "^5.31.1"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "webpack": "^5.1.0"
-      },
-      "peerDependenciesMeta": {
-        "@swc/core": {
-          "optional": true
-        },
-        "esbuild": {
-          "optional": true
-        },
-        "uglify-js": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/text-decoder": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
-      "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
-      "dependencies": {
-        "b4a": "^1.6.4"
-      }
-    },
-    "node_modules/thenify": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
-      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
-      "dev": true,
-      "dependencies": {
-        "any-promise": "^1.0.0"
-      }
-    },
-    "node_modules/thenify-all": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
-      "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
-      "dev": true,
-      "dependencies": {
-        "thenify": ">= 3.1.0 < 4"
-      },
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/tiny-invariant": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
-      "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="
-    },
-    "node_modules/tinyexec": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
-      "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="
-    },
-    "node_modules/tinyglobby": {
-      "version": "0.2.10",
-      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz",
-      "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==",
-      "dependencies": {
-        "fdir": "^6.4.2",
-        "picomatch": "^4.0.2"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
-    "node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/toidentifier": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
-      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
-      "engines": {
-        "node": ">=0.6"
-      }
-    },
-    "node_modules/tosource": {
-      "version": "2.0.0-alpha.3",
-      "resolved": "https://registry.npmjs.org/tosource/-/tosource-2.0.0-alpha.3.tgz",
-      "integrity": "sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/totalist": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
-      "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-    },
-    "node_modules/ts-interface-checker": {
-      "version": "0.1.13",
-      "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
-      "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
-      "dev": true
-    },
-    "node_modules/tsx": {
-      "version": "4.19.3",
-      "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz",
-      "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==",
-      "dependencies": {
-        "esbuild": "~0.25.0",
-        "get-tsconfig": "^4.7.5"
-      },
-      "bin": {
-        "tsx": "dist/cli.mjs"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.3"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/aix-ppc64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz",
-      "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==",
-      "cpu": [
-        "ppc64"
-      ],
-      "optional": true,
-      "os": [
-        "aix"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/android-arm": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz",
-      "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==",
-      "cpu": [
-        "arm"
-      ],
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/android-arm64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz",
-      "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/android-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz",
-      "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/darwin-arm64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz",
-      "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/darwin-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz",
-      "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz",
-      "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/freebsd-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz",
-      "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-arm": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz",
-      "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==",
-      "cpu": [
-        "arm"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-arm64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz",
-      "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-ia32": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz",
-      "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==",
-      "cpu": [
-        "ia32"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-loong64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz",
-      "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==",
-      "cpu": [
-        "loong64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-mips64el": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz",
-      "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==",
-      "cpu": [
-        "mips64el"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-ppc64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz",
-      "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==",
-      "cpu": [
-        "ppc64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-riscv64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz",
-      "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==",
-      "cpu": [
-        "riscv64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-s390x": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz",
-      "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==",
-      "cpu": [
-        "s390x"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/linux-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz",
-      "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz",
-      "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/netbsd-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz",
-      "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz",
-      "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/openbsd-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz",
-      "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/sunos-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz",
-      "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/win32-arm64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz",
-      "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==",
-      "cpu": [
-        "arm64"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/win32-ia32": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz",
-      "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==",
-      "cpu": [
-        "ia32"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/@esbuild/win32-x64": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz",
-      "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==",
-      "cpu": [
-        "x64"
-      ],
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tsx/node_modules/esbuild": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz",
-      "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==",
-      "hasInstallScript": true,
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.25.0",
-        "@esbuild/android-arm": "0.25.0",
-        "@esbuild/android-arm64": "0.25.0",
-        "@esbuild/android-x64": "0.25.0",
-        "@esbuild/darwin-arm64": "0.25.0",
-        "@esbuild/darwin-x64": "0.25.0",
-        "@esbuild/freebsd-arm64": "0.25.0",
-        "@esbuild/freebsd-x64": "0.25.0",
-        "@esbuild/linux-arm": "0.25.0",
-        "@esbuild/linux-arm64": "0.25.0",
-        "@esbuild/linux-ia32": "0.25.0",
-        "@esbuild/linux-loong64": "0.25.0",
-        "@esbuild/linux-mips64el": "0.25.0",
-        "@esbuild/linux-ppc64": "0.25.0",
-        "@esbuild/linux-riscv64": "0.25.0",
-        "@esbuild/linux-s390x": "0.25.0",
-        "@esbuild/linux-x64": "0.25.0",
-        "@esbuild/netbsd-arm64": "0.25.0",
-        "@esbuild/netbsd-x64": "0.25.0",
-        "@esbuild/openbsd-arm64": "0.25.0",
-        "@esbuild/openbsd-x64": "0.25.0",
-        "@esbuild/sunos-x64": "0.25.0",
-        "@esbuild/win32-arm64": "0.25.0",
-        "@esbuild/win32-ia32": "0.25.0",
-        "@esbuild/win32-x64": "0.25.0"
-      }
-    },
-    "node_modules/tus-js-client": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/tus-js-client/-/tus-js-client-4.3.1.tgz",
-      "integrity": "sha512-ZLeYmjrkaU1fUsKbIi8JML52uAocjEZtBx4DKjRrqzrZa0O4MYwT6db+oqePlspV+FxXJAyFBc/L5gwUi2OFsg==",
-      "dependencies": {
-        "buffer-from": "^1.1.2",
-        "combine-errors": "^3.0.3",
-        "is-stream": "^2.0.0",
-        "js-base64": "^3.7.2",
-        "lodash.throttle": "^4.1.1",
-        "proper-lockfile": "^4.1.2",
-        "url-parse": "^1.5.7"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/tus-js-client/node_modules/is-stream": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/type-fest": {
-      "version": "4.35.0",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.35.0.tgz",
-      "integrity": "sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==",
-      "engines": {
-        "node": ">=16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/typescript": {
-      "version": "5.7.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
-      "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
-      "peer": true,
-      "bin": {
-        "tsc": "bin/tsc",
-        "tsserver": "bin/tsserver"
-      },
-      "engines": {
-        "node": ">=14.17"
-      }
-    },
-    "node_modules/ufo": {
-      "version": "1.5.4",
-      "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz",
-      "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ=="
-    },
-    "node_modules/ultrahtml": {
-      "version": "1.5.3",
-      "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.3.tgz",
-      "integrity": "sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg=="
-    },
-    "node_modules/unconfig": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.6.1.tgz",
-      "integrity": "sha512-cVU+/sPloZqOyJEAfNwnQSFCzFrZm85vcVkryH7lnlB/PiTycUkAjt5Ds79cfIshGOZ+M5v3PBDnKgpmlE5DtA==",
-      "dependencies": {
-        "@antfu/utils": "^8.1.0",
-        "defu": "^6.1.4",
-        "importx": "^0.5.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/unconfig/node_modules/@antfu/utils": {
-      "version": "8.1.1",
-      "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz",
-      "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/uncrypto": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz",
-      "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="
-    },
-    "node_modules/unctx": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.4.1.tgz",
-      "integrity": "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==",
-      "dependencies": {
-        "acorn": "^8.14.0",
-        "estree-walker": "^3.0.3",
-        "magic-string": "^0.30.17",
-        "unplugin": "^2.1.0"
-      }
-    },
-    "node_modules/unctx/node_modules/unplugin": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz",
-      "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==",
-      "dependencies": {
-        "acorn": "^8.14.0",
-        "webpack-virtual-modules": "^0.6.2"
-      },
-      "engines": {
-        "node": ">=18.12.0"
-      }
-    },
-    "node_modules/undici": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmjs.org/undici/-/undici-7.3.0.tgz",
-      "integrity": "sha512-Qy96NND4Dou5jKoSJ2gm8ax8AJM/Ey9o9mz7KN1bb9GP+G0l20Zw8afxTnY2f4b7hmhn/z8aC2kfArVQlAhFBw==",
-      "engines": {
-        "node": ">=20.18.1"
-      }
-    },
-    "node_modules/undici-types": {
-      "version": "6.20.0",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
-      "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="
-    },
-    "node_modules/undio": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/undio/-/undio-0.2.0.tgz",
-      "integrity": "sha512-1LH824ipsUNqX1qsO6qpcusv0oGPlfFWVykwWq5jJB0Mq6x4kEHO/izSq2KLjGZvOosEd91+HXoxYUSoVI0zPg=="
-    },
-    "node_modules/unenv": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.10.0.tgz",
-      "integrity": "sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==",
-      "dependencies": {
-        "consola": "^3.2.3",
-        "defu": "^6.1.4",
-        "mime": "^3.0.0",
-        "node-fetch-native": "^1.6.4",
-        "pathe": "^1.1.2"
-      }
-    },
-    "node_modules/unenv/node_modules/mime": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
-      "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/unenv/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
-    },
-    "node_modules/unhead": {
-      "version": "1.11.19",
-      "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.11.19.tgz",
-      "integrity": "sha512-O5AYb3+xUOzBlwDmPfC/DgGp9rDMoGkB4gFkhoaz8IonQqP8W8qqetxYf5ZyEdntvXnFsMWS8lZF//5176xo6Q==",
-      "dependencies": {
-        "@unhead/dom": "1.11.19",
-        "@unhead/schema": "1.11.19",
-        "@unhead/shared": "1.11.19",
-        "hookable": "^5.5.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/harlan-zw"
-      }
-    },
-    "node_modules/unicorn-magic": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
-      "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/unimport": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/unimport/-/unimport-4.1.2.tgz",
-      "integrity": "sha512-oVUL7PSlyVV3QRhsdcyYEMaDX8HJyS/CnUonEJTYA3//bWO+o/4gG8F7auGWWWkrrxBQBYOO8DKe+C53ktpRXw==",
-      "dependencies": {
-        "acorn": "^8.14.0",
-        "escape-string-regexp": "^5.0.0",
-        "estree-walker": "^3.0.3",
-        "local-pkg": "^1.0.0",
-        "magic-string": "^0.30.17",
-        "mlly": "^1.7.4",
-        "pathe": "^2.0.3",
-        "picomatch": "^4.0.2",
-        "pkg-types": "^1.3.1",
-        "scule": "^1.3.0",
-        "strip-literal": "^3.0.0",
-        "tinyglobby": "^0.2.11",
-        "unplugin": "^2.2.0",
-        "unplugin-utils": "^0.2.4"
-      },
-      "engines": {
-        "node": ">=18.12.0"
-      }
-    },
-    "node_modules/unimport/node_modules/local-pkg": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz",
-      "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==",
-      "dependencies": {
-        "mlly": "^1.7.3",
-        "pkg-types": "^1.3.0"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/unimport/node_modules/tinyglobby": {
-      "version": "0.2.12",
-      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
-      "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
-      "dependencies": {
-        "fdir": "^6.4.3",
-        "picomatch": "^4.0.2"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/SuperchupuDev"
-      }
-    },
-    "node_modules/unimport/node_modules/unplugin": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz",
-      "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==",
-      "dependencies": {
-        "acorn": "^8.14.0",
-        "webpack-virtual-modules": "^0.6.2"
-      },
-      "engines": {
-        "node": ">=18.12.0"
-      }
-    },
-    "node_modules/universalify": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
-      "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
-      "engines": {
-        "node": ">= 10.0.0"
-      }
-    },
-    "node_modules/unocss": {
-      "version": "0.65.4",
-      "resolved": "https://registry.npmjs.org/unocss/-/unocss-0.65.4.tgz",
-      "integrity": "sha512-KUCW5OzI20Ik6j1zXkkrpWhxZ59TwSKl6+DvmYHEzMfaEcrHlBZaFSApAoSt2CYSvo6SluGiKyr+Im1UTkd4KA==",
-      "dependencies": {
-        "@unocss/astro": "0.65.4",
-        "@unocss/cli": "0.65.4",
-        "@unocss/core": "0.65.4",
-        "@unocss/postcss": "0.65.4",
-        "@unocss/preset-attributify": "0.65.4",
-        "@unocss/preset-icons": "0.65.4",
-        "@unocss/preset-mini": "0.65.4",
-        "@unocss/preset-tagify": "0.65.4",
-        "@unocss/preset-typography": "0.65.4",
-        "@unocss/preset-uno": "0.65.4",
-        "@unocss/preset-web-fonts": "0.65.4",
-        "@unocss/preset-wind": "0.65.4",
-        "@unocss/transformer-attributify-jsx": "0.65.4",
-        "@unocss/transformer-compile-class": "0.65.4",
-        "@unocss/transformer-directives": "0.65.4",
-        "@unocss/transformer-variant-group": "0.65.4",
-        "@unocss/vite": "0.65.4"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@unocss/webpack": "0.65.4",
-        "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0"
-      },
-      "peerDependenciesMeta": {
-        "@unocss/webpack": {
-          "optional": true
-        },
-        "vite": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/unplugin": {
-      "version": "1.16.1",
-      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz",
-      "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==",
-      "dependencies": {
-        "acorn": "^8.14.0",
-        "webpack-virtual-modules": "^0.6.2"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      }
-    },
-    "node_modules/unplugin-utils": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.4.tgz",
-      "integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==",
-      "dependencies": {
-        "pathe": "^2.0.2",
-        "picomatch": "^4.0.2"
-      },
-      "engines": {
-        "node": ">=18.12.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sxzz"
-      }
-    },
-    "node_modules/unplugin-vue-router": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/unplugin-vue-router/-/unplugin-vue-router-0.11.2.tgz",
-      "integrity": "sha512-X8BbQ3BNnMqaCYeMj80jtz5jC4AB0jcpdmECIYey9qKm6jy/upaPZ/WzfuT+iTGRiQAY4WemHueXxuzH127oOg==",
-      "dependencies": {
-        "@babel/types": "^7.26.5",
-        "@rollup/pluginutils": "^5.1.4",
-        "@vue-macros/common": "^1.16.1",
-        "ast-walker-scope": "^0.6.2",
-        "chokidar": "^3.6.0",
-        "fast-glob": "^3.3.3",
-        "json5": "^2.2.3",
-        "local-pkg": "^1.0.0",
-        "magic-string": "^0.30.17",
-        "mlly": "^1.7.4",
-        "pathe": "^2.0.2",
-        "scule": "^1.3.0",
-        "unplugin": "2.1.2",
-        "yaml": "^2.7.0"
-      },
-      "peerDependencies": {
-        "vue-router": "^4.4.0"
-      },
-      "peerDependenciesMeta": {
-        "vue-router": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/unplugin-vue-router/node_modules/chokidar": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
-      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
-      "dependencies": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/unplugin-vue-router/node_modules/local-pkg": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz",
-      "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==",
-      "dependencies": {
-        "mlly": "^1.7.3",
-        "pkg-types": "^1.3.0"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      }
-    },
-    "node_modules/unplugin-vue-router/node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/unplugin-vue-router/node_modules/readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/unplugin-vue-router/node_modules/unplugin": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.1.2.tgz",
-      "integrity": "sha512-Q3LU0e4zxKfRko1wMV2HmP8lB9KWislY7hxXpxd+lGx0PRInE4vhMBVEZwpdVYHvtqzhSrzuIfErsob6bQfCzw==",
-      "dependencies": {
-        "acorn": "^8.14.0",
-        "webpack-virtual-modules": "^0.6.2"
-      },
-      "engines": {
-        "node": ">=18.12.0"
-      }
-    },
-    "node_modules/unstorage": {
-      "version": "1.15.0",
-      "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.15.0.tgz",
-      "integrity": "sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==",
-      "dependencies": {
-        "anymatch": "^3.1.3",
-        "chokidar": "^4.0.3",
-        "destr": "^2.0.3",
-        "h3": "^1.15.0",
-        "lru-cache": "^10.4.3",
-        "node-fetch-native": "^1.6.6",
-        "ofetch": "^1.4.1",
-        "ufo": "^1.5.4"
-      },
-      "peerDependencies": {
-        "@azure/app-configuration": "^1.8.0",
-        "@azure/cosmos": "^4.2.0",
-        "@azure/data-tables": "^13.3.0",
-        "@azure/identity": "^4.6.0",
-        "@azure/keyvault-secrets": "^4.9.0",
-        "@azure/storage-blob": "^12.26.0",
-        "@capacitor/preferences": "^6.0.3",
-        "@deno/kv": ">=0.9.0",
-        "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0",
-        "@planetscale/database": "^1.19.0",
-        "@upstash/redis": "^1.34.3",
-        "@vercel/blob": ">=0.27.1",
-        "@vercel/kv": "^1.0.1",
-        "aws4fetch": "^1.0.20",
-        "db0": ">=0.2.1",
-        "idb-keyval": "^6.2.1",
-        "ioredis": "^5.4.2",
-        "uploadthing": "^7.4.4"
-      },
-      "peerDependenciesMeta": {
-        "@azure/app-configuration": {
-          "optional": true
-        },
-        "@azure/cosmos": {
-          "optional": true
-        },
-        "@azure/data-tables": {
-          "optional": true
-        },
-        "@azure/identity": {
-          "optional": true
-        },
-        "@azure/keyvault-secrets": {
-          "optional": true
-        },
-        "@azure/storage-blob": {
-          "optional": true
-        },
-        "@capacitor/preferences": {
-          "optional": true
-        },
-        "@deno/kv": {
-          "optional": true
-        },
-        "@netlify/blobs": {
-          "optional": true
-        },
-        "@planetscale/database": {
-          "optional": true
-        },
-        "@upstash/redis": {
-          "optional": true
-        },
-        "@vercel/blob": {
-          "optional": true
-        },
-        "@vercel/kv": {
-          "optional": true
-        },
-        "aws4fetch": {
-          "optional": true
-        },
-        "db0": {
-          "optional": true
-        },
-        "idb-keyval": {
-          "optional": true
-        },
-        "ioredis": {
-          "optional": true
-        },
-        "uploadthing": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/unstorage/node_modules/lru-cache": {
-      "version": "10.4.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
-      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
-    },
-    "node_modules/untun": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz",
-      "integrity": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==",
-      "dependencies": {
-        "citty": "^0.1.5",
-        "consola": "^3.2.3",
-        "pathe": "^1.1.1"
-      },
-      "bin": {
-        "untun": "bin/untun.mjs"
-      }
-    },
-    "node_modules/untun/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
-    },
-    "node_modules/untyped": {
-      "version": "1.5.2",
-      "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.5.2.tgz",
-      "integrity": "sha512-eL/8PlhLcMmlMDtNPKhyyz9kEBDS3Uk4yMu/ewlkT2WFbtzScjHWPJLdQLmaGPUKjXzwe9MumOtOgc4Fro96Kg==",
-      "dependencies": {
-        "@babel/core": "^7.26.0",
-        "@babel/standalone": "^7.26.4",
-        "@babel/types": "^7.26.3",
-        "citty": "^0.1.6",
-        "defu": "^6.1.4",
-        "jiti": "^2.4.1",
-        "knitwork": "^1.2.0",
-        "scule": "^1.3.0"
-      },
-      "bin": {
-        "untyped": "dist/cli.mjs"
-      }
-    },
-    "node_modules/unwasm": {
-      "version": "0.3.9",
-      "resolved": "https://registry.npmjs.org/unwasm/-/unwasm-0.3.9.tgz",
-      "integrity": "sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==",
-      "dependencies": {
-        "knitwork": "^1.0.0",
-        "magic-string": "^0.30.8",
-        "mlly": "^1.6.1",
-        "pathe": "^1.1.2",
-        "pkg-types": "^1.0.3",
-        "unplugin": "^1.10.0"
-      }
-    },
-    "node_modules/unwasm/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="
-    },
-    "node_modules/upath": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz",
-      "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==",
-      "devOptional": true,
-      "engines": {
-        "node": ">=4",
-        "yarn": "*"
-      }
-    },
-    "node_modules/update-browserslist-db": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
-      "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/browserslist"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/browserslist"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "dependencies": {
-        "escalade": "^3.2.0",
-        "picocolors": "^1.1.1"
-      },
-      "bin": {
-        "update-browserslist-db": "cli.js"
-      },
-      "peerDependencies": {
-        "browserslist": ">= 4.21.0"
-      }
-    },
-    "node_modules/uqr": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz",
-      "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA=="
-    },
-    "node_modules/uri-js-replace": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz",
-      "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g=="
-    },
-    "node_modules/url-parse": {
-      "version": "1.5.10",
-      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
-      "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
-      "dependencies": {
-        "querystringify": "^2.1.1",
-        "requires-port": "^1.0.0"
-      }
-    },
-    "node_modules/urlpattern-polyfill": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz",
-      "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ=="
-    },
-    "node_modules/util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
-    },
-    "node_modules/v-lazy-show": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/v-lazy-show/-/v-lazy-show-0.3.0.tgz",
-      "integrity": "sha512-xpVALnvzB+RoDkI/5gqzVC2bL/Mh0Mw5/cPpSWJTTS6K4yDwFE2hZr5OsgFS74c6IHV6/k0jzSkAFXJttnhufg==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/compiler-core": "^3.5"
-      }
-    },
-    "node_modules/vite": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz",
-      "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==",
-      "dependencies": {
-        "esbuild": "^0.24.2",
-        "postcss": "^8.5.2",
-        "rollup": "^4.30.1"
-      },
-      "bin": {
-        "vite": "bin/vite.js"
-      },
-      "engines": {
-        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/vitejs/vite?sponsor=1"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.3"
-      },
-      "peerDependencies": {
-        "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
-        "jiti": ">=1.21.0",
-        "less": "*",
-        "lightningcss": "^1.21.0",
-        "sass": "*",
-        "sass-embedded": "*",
-        "stylus": "*",
-        "sugarss": "*",
-        "terser": "^5.16.0",
-        "tsx": "^4.8.1",
-        "yaml": "^2.4.2"
-      },
-      "peerDependenciesMeta": {
-        "@types/node": {
-          "optional": true
-        },
-        "jiti": {
-          "optional": true
-        },
-        "less": {
-          "optional": true
-        },
-        "lightningcss": {
-          "optional": true
-        },
-        "sass": {
-          "optional": true
-        },
-        "sass-embedded": {
-          "optional": true
-        },
-        "stylus": {
-          "optional": true
-        },
-        "sugarss": {
-          "optional": true
-        },
-        "terser": {
-          "optional": true
-        },
-        "tsx": {
-          "optional": true
-        },
-        "yaml": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vite-hot-client": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-0.2.4.tgz",
-      "integrity": "sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==",
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0"
-      }
-    },
-    "node_modules/vite-node": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.7.tgz",
-      "integrity": "sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==",
-      "dependencies": {
-        "cac": "^6.7.14",
-        "debug": "^4.4.0",
-        "es-module-lexer": "^1.6.0",
-        "pathe": "^2.0.3",
-        "vite": "^5.0.0 || ^6.0.0"
-      },
-      "bin": {
-        "vite-node": "vite-node.mjs"
-      },
-      "engines": {
-        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/vitest"
-      }
-    },
-    "node_modules/vite-plugin-checker": {
-      "version": "0.8.0",
-      "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.8.0.tgz",
-      "integrity": "sha512-UA5uzOGm97UvZRTdZHiQVYFnd86AVn8EVaD4L3PoVzxH+IZSfaAw14WGFwX9QS23UW3lV/5bVKZn6l0w+q9P0g==",
-      "dependencies": {
-        "@babel/code-frame": "^7.12.13",
-        "ansi-escapes": "^4.3.0",
-        "chalk": "^4.1.1",
-        "chokidar": "^3.5.1",
-        "commander": "^8.0.0",
-        "fast-glob": "^3.2.7",
-        "fs-extra": "^11.1.0",
-        "npm-run-path": "^4.0.1",
-        "strip-ansi": "^6.0.0",
-        "tiny-invariant": "^1.1.0",
-        "vscode-languageclient": "^7.0.0",
-        "vscode-languageserver": "^7.0.0",
-        "vscode-languageserver-textdocument": "^1.0.1",
-        "vscode-uri": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=14.16"
-      },
-      "peerDependencies": {
-        "@biomejs/biome": ">=1.7",
-        "eslint": ">=7",
-        "meow": "^9.0.0",
-        "optionator": "^0.9.1",
-        "stylelint": ">=13",
-        "typescript": "*",
-        "vite": ">=2.0.0",
-        "vls": "*",
-        "vti": "*",
-        "vue-tsc": "~2.1.6"
-      },
-      "peerDependenciesMeta": {
-        "@biomejs/biome": {
-          "optional": true
-        },
-        "eslint": {
-          "optional": true
-        },
-        "meow": {
-          "optional": true
-        },
-        "optionator": {
-          "optional": true
-        },
-        "stylelint": {
-          "optional": true
-        },
-        "typescript": {
-          "optional": true
-        },
-        "vls": {
-          "optional": true
-        },
-        "vti": {
-          "optional": true
-        },
-        "vue-tsc": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vite-plugin-checker/node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/vite-plugin-checker/node_modules/chokidar": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
-      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
-      "dependencies": {
-        "anymatch": "~3.1.2",
-        "braces": "~3.0.2",
-        "glob-parent": "~5.1.2",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.6.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/vite-plugin-checker/node_modules/commander": {
-      "version": "8.3.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
-      "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
-      "engines": {
-        "node": ">= 12"
-      }
-    },
-    "node_modules/vite-plugin-checker/node_modules/npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-      "dependencies": {
-        "path-key": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/vite-plugin-checker/node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/vite-plugin-checker/node_modules/readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/vite-plugin-checker/node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/vite-plugin-inspect": {
-      "version": "0.8.9",
-      "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz",
-      "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==",
-      "dependencies": {
-        "@antfu/utils": "^0.7.10",
-        "@rollup/pluginutils": "^5.1.3",
-        "debug": "^4.3.7",
-        "error-stack-parser-es": "^0.1.5",
-        "fs-extra": "^11.2.0",
-        "open": "^10.1.0",
-        "perfect-debounce": "^1.0.0",
-        "picocolors": "^1.1.1",
-        "sirv": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1"
-      },
-      "peerDependenciesMeta": {
-        "@nuxt/kit": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vite-plugin-inspect/node_modules/define-lazy-prop": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
-      "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/vite-plugin-inspect/node_modules/open": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz",
-      "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==",
-      "dependencies": {
-        "default-browser": "^5.2.1",
-        "define-lazy-prop": "^3.0.0",
-        "is-inside-container": "^1.0.0",
-        "is-wsl": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/vite-plugin-inspect/node_modules/sirv": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz",
-      "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==",
-      "dependencies": {
-        "@polka/url": "^1.0.0-next.24",
-        "mrmime": "^2.0.0",
-        "totalist": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/vite-plugin-vue-inspector": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.1.tgz",
-      "integrity": "sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==",
-      "dependencies": {
-        "@babel/core": "^7.23.0",
-        "@babel/plugin-proposal-decorators": "^7.23.0",
-        "@babel/plugin-syntax-import-attributes": "^7.22.5",
-        "@babel/plugin-syntax-import-meta": "^7.10.4",
-        "@babel/plugin-transform-typescript": "^7.22.15",
-        "@vue/babel-plugin-jsx": "^1.1.5",
-        "@vue/compiler-dom": "^3.3.4",
-        "kolorist": "^1.8.0",
-        "magic-string": "^0.30.4"
-      },
-      "peerDependencies": {
-        "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0"
-      }
-    },
-    "node_modules/vite-plugin-vuetify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-2.1.0.tgz",
-      "integrity": "sha512-4wEAQtZaigPpwbFcZbrKpYwutOsWwWdeXn22B9XHzDPQNxVsKT+K9lKcXZnI5JESO1Iaql48S9rOk8RZZEt+Mw==",
-      "devOptional": true,
-      "dependencies": {
-        "@vuetify/loader-shared": "^2.1.0",
-        "debug": "^4.3.3",
-        "upath": "^2.0.1"
-      },
-      "engines": {
-        "node": "^18.0.0 || >=20.0.0"
-      },
-      "peerDependencies": {
-        "vite": ">=5",
-        "vue": "^3.0.0",
-        "vuetify": "^3.0.0"
-      }
-    },
-    "node_modules/vscode-jsonrpc": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz",
-      "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==",
-      "engines": {
-        "node": ">=8.0.0 || >=10.0.0"
-      }
-    },
-    "node_modules/vscode-languageclient": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz",
-      "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==",
-      "dependencies": {
-        "minimatch": "^3.0.4",
-        "semver": "^7.3.4",
-        "vscode-languageserver-protocol": "3.16.0"
-      },
-      "engines": {
-        "vscode": "^1.52.0"
-      }
-    },
-    "node_modules/vscode-languageserver": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz",
-      "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==",
-      "dependencies": {
-        "vscode-languageserver-protocol": "3.16.0"
-      },
-      "bin": {
-        "installServerIntoExtension": "bin/installServerIntoExtension"
-      }
-    },
-    "node_modules/vscode-languageserver-protocol": {
-      "version": "3.16.0",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz",
-      "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==",
-      "dependencies": {
-        "vscode-jsonrpc": "6.0.0",
-        "vscode-languageserver-types": "3.16.0"
-      }
-    },
-    "node_modules/vscode-languageserver-textdocument": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz",
-      "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="
-    },
-    "node_modules/vscode-languageserver-types": {
-      "version": "3.16.0",
-      "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz",
-      "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA=="
-    },
-    "node_modules/vscode-uri": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
-      "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="
-    },
-    "node_modules/vue": {
-      "version": "3.5.13",
-      "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz",
-      "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==",
-      "dependencies": {
-        "@vue/compiler-dom": "3.5.13",
-        "@vue/compiler-sfc": "3.5.13",
-        "@vue/runtime-dom": "3.5.13",
-        "@vue/server-renderer": "3.5.13",
-        "@vue/shared": "3.5.13"
-      },
-      "peerDependencies": {
-        "typescript": "*"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vue-axios": {
-      "version": "3.5.2",
-      "resolved": "https://registry.npmjs.org/vue-axios/-/vue-axios-3.5.2.tgz",
-      "integrity": "sha512-GP+dct7UlAWkl1qoP3ppw0z6jcSua5/IrMpjB5O8bh089iIiJ+hdxPYH2NPEpajlYgkW5EVMP95ttXWdas1O0g==",
-      "peerDependencies": {
-        "axios": "*",
-        "vue": "^3.0.0 || ^2.0.0"
-      }
-    },
-    "node_modules/vue-bundle-renderer": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/vue-bundle-renderer/-/vue-bundle-renderer-2.1.1.tgz",
-      "integrity": "sha512-+qALLI5cQncuetYOXp4yScwYvqh8c6SMXee3B+M7oTZxOgtESP0l4j/fXdEJoZ+EdMxkGWIj+aSEyjXkOdmd7g==",
-      "dependencies": {
-        "ufo": "^1.5.4"
-      }
-    },
-    "node_modules/vue-chartjs": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/vue-chartjs/-/vue-chartjs-5.3.2.tgz",
-      "integrity": "sha512-NrkbRRoYshbXbWqJkTN6InoDVwVb90C0R7eAVgMWcB9dPikbruaOoTFjFYHE/+tNPdIe6qdLCDjfjPHQ0fw4jw==",
-      "peerDependencies": {
-        "chart.js": "^4.1.1",
-        "vue": "^3.0.0-0 || ^2.7.0"
-      }
-    },
-    "node_modules/vue-demi": {
-      "version": "0.14.10",
-      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
-      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
-      "hasInstallScript": true,
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vue-devtools-stub": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/vue-devtools-stub/-/vue-devtools-stub-0.1.0.tgz",
-      "integrity": "sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ=="
-    },
-    "node_modules/vue-flow-layout": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/vue-flow-layout/-/vue-flow-layout-0.1.1.tgz",
-      "integrity": "sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==",
-      "peerDependencies": {
-        "vue": "^3.4.37"
-      }
-    },
-    "node_modules/vue-i18n": {
-      "version": "9.14.2",
-      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.2.tgz",
-      "integrity": "sha512-JK9Pm80OqssGJU2Y6F7DcM8RFHqVG4WkuCqOZTVsXkEzZME7ABejAUqUdA931zEBedc4thBgSUWxeQh4uocJAQ==",
-      "dev": true,
-      "dependencies": {
-        "@intlify/core-base": "9.14.2",
-        "@intlify/shared": "9.14.2",
-        "@vue/devtools-api": "^6.5.0"
-      },
-      "engines": {
-        "node": ">= 16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/kazupon"
-      },
-      "peerDependencies": {
-        "vue": "^3.0.0"
-      }
-    },
-    "node_modules/vue-meta": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/vue-meta/-/vue-meta-2.4.0.tgz",
-      "integrity": "sha512-XEeZUmlVeODclAjCNpWDnjgw+t3WA6gdzs6ENoIAgwO1J1d5p1tezDhtteLUFwcaQaTtayRrsx7GL6oXp/m2Jw==",
-      "dependencies": {
-        "deepmerge": "^4.2.2"
-      }
-    },
-    "node_modules/vue-router": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz",
-      "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==",
-      "dependencies": {
-        "@vue/devtools-api": "^6.6.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/posva"
-      },
-      "peerDependencies": {
-        "vue": "^3.2.0"
-      }
-    },
-    "node_modules/vue-toast-notification": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/vue-toast-notification/-/vue-toast-notification-3.1.3.tgz",
-      "integrity": "sha512-XNyWqwLIGBFfX5G9sK+clq3N3IPlhDjzNdbZaXkEElcotPlWs0wWZailk1vqhdtLYT/93Y4FHAVuzyatLmPZRA==",
-      "engines": {
-        "node": ">=12.15.0"
-      },
-      "peerDependencies": {
-        "vue": "^3.0"
-      }
-    },
-    "node_modules/vue3-ace-editor": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/vue3-ace-editor/-/vue3-ace-editor-2.2.4.tgz",
-      "integrity": "sha512-FZkEyfpbH068BwjhMyNROxfEI8135Sc+x8ouxkMdCNkuj/Tuw83VP/gStFQqZHqljyX9/VfMTCdTqtOnJZGN8g==",
-      "dependencies": {
-        "resize-observer-polyfill": "^1.5.1"
-      },
-      "peerDependencies": {
-        "ace-builds": "*",
-        "vue": "^3"
-      }
-    },
-    "node_modules/vuetify": {
-      "version": "3.7.13",
-      "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.7.13.tgz",
-      "integrity": "sha512-4+RuQU+zLtXhlN2eZUpKXums9ftzUzhMeiNEJvvJY4XdOzVwUCth2dTnEZkSF6EKdLHk3WhtRk0cIWXZxpBvcw==",
-      "engines": {
-        "node": "^12.20 || >=14.13"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/johnleider"
-      },
-      "peerDependencies": {
-        "typescript": ">=4.7",
-        "vite-plugin-vuetify": ">=1.0.0",
-        "vue": "^3.3.0",
-        "webpack-plugin-vuetify": ">=2.0.0"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        },
-        "vite-plugin-vuetify": {
-          "optional": true
-        },
-        "webpack-plugin-vuetify": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/watchpack": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
-      "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
-      "peer": true,
-      "dependencies": {
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.1.2"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-    },
-    "node_modules/webpack": {
-      "version": "5.98.0",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz",
-      "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==",
-      "peer": true,
-      "dependencies": {
-        "@types/eslint-scope": "^3.7.7",
-        "@types/estree": "^1.0.6",
-        "@webassemblyjs/ast": "^1.14.1",
-        "@webassemblyjs/wasm-edit": "^1.14.1",
-        "@webassemblyjs/wasm-parser": "^1.14.1",
-        "acorn": "^8.14.0",
-        "browserslist": "^4.24.0",
-        "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.17.1",
-        "es-module-lexer": "^1.2.1",
-        "eslint-scope": "5.1.1",
-        "events": "^3.2.0",
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.2.11",
-        "json-parse-even-better-errors": "^2.3.1",
-        "loader-runner": "^4.2.0",
-        "mime-types": "^2.1.27",
-        "neo-async": "^2.6.2",
-        "schema-utils": "^4.3.0",
-        "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.3.11",
-        "watchpack": "^2.4.1",
-        "webpack-sources": "^3.2.3"
-      },
-      "bin": {
-        "webpack": "bin/webpack.js"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependenciesMeta": {
-        "webpack-cli": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/webpack-sources": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
-      "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/webpack-virtual-modules": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
-      "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="
-    },
-    "node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
-    },
-    "node_modules/which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/node-which"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/wrap-ansi": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/wrap-ansi-cjs": {
-      "name": "wrap-ansi",
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
-    },
-    "node_modules/ws": {
-      "version": "8.18.1",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
-      "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
-      "engines": {
-        "node": ">=10.0.0"
-      },
-      "peerDependencies": {
-        "bufferutil": "^4.0.1",
-        "utf-8-validate": ">=5.0.2"
-      },
-      "peerDependenciesMeta": {
-        "bufferutil": {
-          "optional": true
-        },
-        "utf-8-validate": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/y18n": {
-      "version": "5.0.8",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
-      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/yallist": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
-    },
-    "node_modules/yaml": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
-      "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
-      "bin": {
-        "yaml": "bin.mjs"
-      },
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/yaml-ast-parser": {
-      "version": "0.0.43",
-      "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz",
-      "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A=="
-    },
-    "node_modules/yaml-eslint-parser": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.3.tgz",
-      "integrity": "sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==",
-      "dev": true,
-      "dependencies": {
-        "eslint-visitor-keys": "^3.0.0",
-        "lodash": "^4.17.21",
-        "yaml": "^2.0.0"
-      },
-      "engines": {
-        "node": "^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ota-meshi"
-      }
-    },
-    "node_modules/yargs": {
-      "version": "17.7.2",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
-      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
-      "dependencies": {
-        "cliui": "^8.0.1",
-        "escalade": "^3.1.1",
-        "get-caller-file": "^2.0.5",
-        "require-directory": "^2.1.1",
-        "string-width": "^4.2.3",
-        "y18n": "^5.0.5",
-        "yargs-parser": "^21.1.1"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/yargs-parser": {
-      "version": "21.1.1",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
-      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/zhead": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/zhead/-/zhead-2.2.4.tgz",
-      "integrity": "sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==",
-      "funding": {
-        "url": "https://github.com/sponsors/harlan-zw"
-      }
-    },
-    "node_modules/zip-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz",
-      "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==",
-      "dependencies": {
-        "archiver-utils": "^5.0.0",
-        "compress-commons": "^6.0.2",
-        "readable-stream": "^4.0.0"
-      },
-      "engines": {
-        "node": ">= 14"
-      }
-    }
-  }
-}
diff --git a/docker-compose.yml b/docker-compose.yml
index 5f7f2cf605ea9d27ae0af32845ed42805d3bdc5d..29035ae3c5b67406e658b8b648eb26cf3caed119 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,57 +1,3 @@
-x-resources-nano: &resources-nano
-  resources:
-    reservations:
-      cpus: '0.1'
-      memory: 128M
-    limits:
-      cpus: '0.15'
-      memory: 192M
-
-x-resources-micro: &resources-micro
-  resources:
-    reservations:
-      cpus: '0.25'
-      memory: 256M
-    limits:
-      cpus: '0.375'
-      memory: 384M
-
-x-resources-small: &resources-small
-  resources:
-    reservations:
-      cpus: '0.5'
-      memory: 512M
-    limits:
-      cpus: '0.75'
-      memory: 768M
-
-x-resources-medium: &resources-medium
-  resources:
-    reservations:
-      cpus: '0.5'
-      memory: 1024M
-    limits:
-      cpus: '0.75'
-      memory: 1536M
-
-x-resources-large: &resources-large
-  resources:
-    reservations:
-      cpus: '1'
-      memory: 2048M
-    limits:
-      cpus: '1.5'
-      memory: 3072M
-
-x-resources-xlarge: &resources-xlarge
-  resources:
-    reservations:
-      cpus: '1.5'
-      memory: 3072M
-    limits:
-      cpus: '2'
-      memory: 6144M
-
 x-healthcheck-params: &healthcheck-params
   interval: 30s
   timeout: 10s
@@ -90,8 +36,6 @@ services:
     healthcheck:
       test: /opt/bitnami/scripts/mariadb-galera/healthcheck.sh --connect --innodb_initialized
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-xlarge
     logging:
       driver: json-file
 
@@ -108,8 +52,6 @@ services:
     healthcheck:
       test: -h
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-nano
     depends_on:
       dbrepo-metadata-db:
         condition: service_healthy
@@ -135,8 +77,6 @@ services:
     healthcheck:
       test: /opt/bitnami/scripts/mariadb-galera/healthcheck.sh --connect --innodb_initialized
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-xlarge
     logging:
       driver: json-file
 
@@ -153,8 +93,6 @@ services:
     healthcheck:
       test: -h
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-nano
     depends_on:
       dbrepo-data-db:
         condition: service_healthy
@@ -168,8 +106,6 @@ services:
     image: docker.io/bitnami/postgresql:${POSTGRES_VERSION}
     volumes:
       - auth-db-data:/bitnami/postgresql
-    ports:
-      - "5432:5432"
     environment:
       POSTGRESQL_DATABASE: "${AUTH_DB_NAME:-keycloak}"
       POSTGRESQL_USERNAME: "${AUTH_DB_USERNAME:-keycloak}"
@@ -178,8 +114,6 @@ services:
     healthcheck:
       test: "psql -U ${AUTH_DB_USERNAME:-keycloak} -h 127.0.0.1 -p 5432 -d ${AUTH_DB_NAME:-keycloak} -c 'select version();'"
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-micro
     logging:
       driver: json-file
 
@@ -197,8 +131,6 @@ services:
     healthcheck:
       test: "psql -U ${DASHBOARD_DB_USERNAME:-grafana} -h 127.0.0.1 -p 5432 -d ${DASHBOARD_DB_NAME:-grafana} -c 'select version();'"
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-micro
     logging:
       driver: json-file
 
@@ -233,8 +165,6 @@ services:
     healthcheck:
       test: curl -fsS localhost:8080/realms/master
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-medium
     depends_on:
       dbrepo-identity-service:
         condition: service_healthy
@@ -259,8 +189,6 @@ services:
       READONLY_USERNAME: "${READONLY_USERNAME:-readonly}"
       SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}"
       SYSTEM_PASSWORD: ${SYSTEM_PASSWORD:-admin}
-    deploy:
-      <<: *resources-nano
     depends_on:
       dbrepo-auth-service:
         condition: service_healthy
@@ -279,8 +207,6 @@ services:
     build:
       context: ./dbrepo-metadata-service
       network: host
-    ports:
-      - "9099:8080"
     environment:
       ADMIN_EMAIL: "${ADMIN_EMAIL:-noreply@localhost}"
       ANALYSE_SERVICE_ENDPOINT: "${ANALYSE_SERVICE_ENDPOINT:-http://analyse-service:8080}"
@@ -322,8 +248,6 @@ services:
     healthcheck:
       test: curl -sSL localhost:8080/actuator/health/liveness | grep 'UP' || exit 1
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-small
     depends_on:
       dbrepo-auth-service:
         condition: service_healthy
@@ -348,8 +272,6 @@ services:
     build:
       context: ./dbrepo-analyse-service
       network: host
-    ports:
-      - "4050:8080"
     environment:
       AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client}
       AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}
@@ -366,8 +288,6 @@ services:
     healthcheck:
       test: curl -sSL localhost:8080/health | grep 'UP' || exit 1
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-micro
     logging:
       driver: json-file
 
@@ -394,8 +314,6 @@ services:
     healthcheck:
       test: rabbitmq-diagnostics -q is_running | grep 'is fully booted and running'
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-micro
     logging:
       driver: json-file
 
@@ -411,8 +329,6 @@ services:
     healthcheck:
       test: curl -sSL 127.0.0.1:9200
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-medium
     logging:
       driver: json-file
 
@@ -424,8 +340,6 @@ services:
     build:
       context: ./dbrepo-search-service
       network: host
-    ports:
-      - "4060:8080"
     environment:
       AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client}
       AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT_SECRET:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}
@@ -440,8 +354,6 @@ services:
     healthcheck:
       test: curl -sSL localhost:8080/health | grep 'UP' || exit 1
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-micro
     logging:
       driver: json-file
 
@@ -472,8 +384,6 @@ services:
     healthcheck:
       test: curl -fsSL 127.0.0.1:3000 && curl -fsSL 127.0.0.1:3000/health
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-micro
     depends_on:
       dbrepo-search-service:
         condition: service_healthy
@@ -486,16 +396,14 @@ services:
     restart: "no"
     container_name: dbrepo-gateway-service
     hostname: gateway-service
-    image: docker.io/nginx:${NGINX_VERSION}
+    image: docker.io/bitnami/nginx:${NGINX_VERSION}
     ports:
       - "80:8080"
     volumes:
-      - ./dbrepo-gateway-service/dbrepo.conf:/etc/nginx/conf.d/default.conf
+      - ./dbrepo-gateway-service/dbrepo.conf:/opt/bitnami/nginx/conf/server_blocks/dbrepo.conf:ro
     healthcheck:
-      test: lsof -i TCP:80 || exit 1
+      test: wget -O- http://127.0.0.1:8080
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-nano
     depends_on:
       dbrepo-analyse-service:
         condition: service_healthy
@@ -535,8 +443,6 @@ services:
     healthcheck:
       test: "ldapwhoami -H ldap://localhost:1389 -D ${IDENTITY_SERVICE_ADMIN_DN:-cn=admin,dc=dbrepo,dc=at} -w ${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin} || exit 1"
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-nano
     logging:
       driver: json-file
 
@@ -557,8 +463,6 @@ services:
       OPENSEARCH_PORT: ${OPENSEARCH_PORT:-9200}
       SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}"
       SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}"
-    deploy:
-      <<: *resources-nano
     depends_on:
       dbrepo-search-db:
         condition: service_healthy
@@ -583,8 +487,6 @@ services:
       METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080}
       SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}"
       SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}"
-    deploy:
-      <<: *resources-nano
     depends_on:
       dbrepo-dashboard-ui:
         condition: service_healthy
@@ -607,8 +509,6 @@ services:
     healthcheck:
       test: echo "cluster.check" | weed shell | grep "checking master.*ok" || exit 1
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-nano
     logging:
       driver: json-file
 
@@ -617,16 +517,12 @@ services:
     container_name: dbrepo-metric-db
     hostname: metric-db
     image: docker.io/bitnami/prometheus:${PROMETHEUS_VERSION}
-    ports:
-      - 9090:9090
     volumes:
       - ./dbrepo-metric-db/prometheus.yml:/etc/prometheus/prometheus.yml
       - metric-db-data:/opt/bitnami/prometheus/data
     healthcheck:
       test: promtool check healthy
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-nano
     logging:
       driver: json-file
 
@@ -644,8 +540,6 @@ services:
       S3_BUCKET: "${S3_BUCKET:-dbrepo}"
       S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-seaweedfsadmin}
       STORAGE_ENDPOINT: ${STORAGE_ENDPOINT:-http://storage-service:9000}
-    deploy:
-      <<: *resources-nano
     depends_on:
       dbrepo-storage-service:
         condition: service_healthy
@@ -660,8 +554,6 @@ services:
     build:
       context: ./dbrepo-data-service
       network: host
-    ports:
-      - "9093:8080"
     environment:
       AUTH_SERVICE_CLIENT: "${AUTH_SERVICE_CLIENT:-dbrepo-client}"
       AUTH_SERVICE_CLIENT_SECRET: "${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}"
@@ -696,8 +588,6 @@ services:
     healthcheck:
       test: curl -sSL localhost:8080/actuator/health/liveness | grep 'UP' || exit 1
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-large
     depends_on:
       dbrepo-data-db:
         condition: service_healthy
@@ -708,7 +598,7 @@ services:
     restart: "no"
     container_name: dbrepo-dashboard-ui
     hostname: dashboard-ui
-    image: docker.io/bitnami/grafana:11.5.3
+    image: docker.io/bitnami/grafana:${GRAFANA_VERSION}
     ports:
       - "3000:3000"
     volumes:
@@ -718,6 +608,7 @@ services:
       - ./dbrepo-dashboard-ui/provisioning/dashboards/provider.yaml:/opt/bitnami/grafana/conf/provisioning/dashboards/provider.yaml
       - ./dbrepo-dashboard-ui/provisioning/datasources/infinity.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/infinity.yaml
       - ./dbrepo-dashboard-ui/provisioning/datasources/prometheus.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/prometheus.yaml
+      - ./dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/opensearch.yaml
     environment:
       BASE_URL: "${BASE_URL:-http://localhost}"
       # do not attempt to set it in the grafana.ini, hours wasted here: 7
@@ -733,8 +624,6 @@ services:
     healthcheck:
       test: curl -fsSL --head 127.0.0.1:3000
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-nano
     extra_hosts:
       - "localhost:host-gateway"
     logging:
@@ -748,8 +637,6 @@ services:
     build:
       context: ./dbrepo-dashboard-service
       network: host
-    ports:
-      - "4070:8080"
     environment:
       AUTH_SERVICE_ENDPOINT: ${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080}
       BASE_URL: "${BASE_URL:-http://localhost}"
@@ -759,8 +646,6 @@ services:
     healthcheck:
       test: curl -fsSL --head 127.0.0.1:8080/health
       <<: *healthcheck-params
-    deploy:
-      <<: *resources-micro
     depends_on:
       dbrepo-dashboard-ui:
         condition: service_healthy
diff --git a/helm/dbrepo/Chart.lock b/helm/dbrepo/Chart.lock
index 0a15410fa69b2de832327f2d734019f30d4ffb14..43c2689e41816f86d8fac571c580e9966b900658 100644
--- a/helm/dbrepo/Chart.lock
+++ b/helm/dbrepo/Chart.lock
@@ -4,7 +4,10 @@ dependencies:
   version: 1.4.0
 - name: keycloak
   repository: https://charts.bitnami.com/bitnami
-  version: 24.6.3
+  version: 24.6.6
+- name: nginx
+  repository: https://charts.bitnami.com/bitnami
+  version: 20.0.2
 - name: mariadb-galera
   repository: https://charts.bitnami.com/bitnami
   version: 13.2.7
@@ -16,18 +19,15 @@ dependencies:
   version: 14.0.0
 - name: seaweedfs
   repository: file://../seaweedfs
-  version: 4.2.1
+  version: 4.8.7
 - name: grafana
   repository: https://charts.bitnami.com/bitnami
   version: 11.4.2
 - name: prometheus
   repository: https://charts.bitnami.com/bitnami
   version: 1.3.22
-- name: nginx
-  repository: https://charts.bitnami.com/bitnami
-  version: 18.3.1
 - name: postgresql
   repository: https://charts.bitnami.com/bitnami
   version: 16.1.0
-digest: sha256:fd6fb7a9547e6bb1c7d311b67dae7a3987247e16256ef3b553593ddd90b91340
-generated: "2025-05-02T14:16:07.24283973+02:00"
+digest: sha256:bbe97a5c50a63d3449e457cc6973b7c58e841a82552a8c137d07cd4d6b60fe78
+generated: "2025-05-14T15:39:57.551220972+02:00"
diff --git a/helm/dbrepo/Chart.yaml b/helm/dbrepo/Chart.yaml
index ee659eb5386b3cdabee8c3f6ab20ea38c5a071db..0814c1a5c763bd44f508079726cb04bab317aa51 100644
--- a/helm/dbrepo/Chart.yaml
+++ b/helm/dbrepo/Chart.yaml
@@ -24,9 +24,14 @@ dependencies:
     condition: searchdb.enabled
   - name: keycloak
     alias: authservice
-    version: 24.6.3  # app version: 26.2.2
+    version: 24.6.6
     repository: https://charts.bitnami.com/bitnami
     condition: authservice.enabled
+  - name: nginx
+    alias: gatewayservice
+    version: 20.0.2
+    repository: https://charts.bitnami.com/bitnami
+    condition: gatewayservice.enabled
   - name: mariadb-galera
     alias: datadb
     version: 13.2.7
@@ -44,7 +49,7 @@ dependencies:
     condition: brokerservice.enabled
   - name: seaweedfs
     alias: storageservice
-    version: 4.2.1
+    version: 4.8.7
     repository: file://../seaweedfs
     condition: storageservice.enabled
   - name: grafana
@@ -57,11 +62,6 @@ dependencies:
     version: 1.3.22
     repository: https://charts.bitnami.com/bitnami
     condition: metricdb.enabled
-  - name: nginx
-    alias: gatewayservice
-    version: 18.3.1
-    repository: https://charts.bitnami.com/bitnami
-    condition: gatewayservice.enabled
   - name: postgresql
     alias: dashboarddb
     version: 16.1.0
diff --git a/helm/dbrepo/README.md b/helm/dbrepo/README.md
index c16c138725cb1272565928bb4666c56750eab4d2..0f60690e238d473d1a20df1d1b3dbe2b3cff9e70 100644
--- a/helm/dbrepo/README.md
+++ b/helm/dbrepo/README.md
@@ -34,7 +34,7 @@ variable when you increase the available Pod memory for performance.
 To install the chart with the release name `my-release`:
 
 ```bash
-helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.8.1"
+helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.8.2"
 ```
 
 The command deploys DBRepo on the Kubernetes cluster in the default configuration. The Parameters section lists the
@@ -54,10 +54,13 @@ The command removes all the Kubernetes components associated with the chart and
 
 ### Global parameters
 
-| Name                                                  | Description                                                                                                                                                                                                                                                                                                                                                         | Value  |
-| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
-| `global.compatibility.openshift.adaptSecurityContext` | Adapt the securityContext sections of the deployment to make them compatible with Openshift restricted-v2 SCC: remove runAsUser, runAsGroup and fsGroup and let the platform use their allowed default IDs. Possible values: auto (apply if the detected running cluster is Openshift), force (perform the adaptation always), disabled (do not perform adaptation) | `auto` |
-| `global.storageClass`                                 | Global StorageClass for Persistent Volume(s)                                                                                                                                                                                                                                                                                                                        | `""`   |
+| Name                                                  | Description                                                                                                                                                                                                                                                                                                                                                         | Value                                |
+| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |
+| `global.compatibility.openshift.adaptSecurityContext` | Adapt the securityContext sections of the deployment to make them compatible with Openshift restricted-v2 SCC: remove runAsUser, runAsGroup and fsGroup and let the platform use their allowed default IDs. Possible values: auto (apply if the detected running cluster is Openshift), force (perform the adaptation always), disabled (do not perform adaptation) | `auto`                               |
+| `global.storageClass`                                 | Global StorageClass for Persistent Volume(s)                                                                                                                                                                                                                                                                                                                        | `""`                                 |
+| `global.loggingSidecar.enabled`                       | Enable the logging sidecars for the analyse-, dashboard-, data-, gateway-, metadata- and search service.                                                                                                                                                                                                                                                            | `true`                               |
+| `global.loggingSidecar.image.name`                    | The logging sidecar image.                                                                                                                                                                                                                                                                                                                                          | `docker.io/bitnami/fluent-bit:4.0.0` |
+| `global.loggingSidecar.resourcesPreset`               | The resource definitions for the logging sidecar.                                                                                                                                                                                                                                                                                                                   | `nano`                               |
 
 ### Common parameters
 
@@ -81,11 +84,10 @@ The command removes all the Kubernetes components associated with the chart and
 | `metadatadb.galera.mariabackup.user`     | The database backup username.                                                                                                          | `backup`                                                               |
 | `metadatadb.galera.mariabackup.password` | The database backup user password                                                                                                      | `backup`                                                               |
 | `metadatadb.jdbcExtraArgs`               | The extra arguments for JDBC connections in the microservices.                                                                         | `""`                                                                   |
-| `metadatadb.configurationConfigMap`      | The database configuration files.                                                                                                      | `metadata-db-config`                                                   |
 | `metadatadb.extraInitDbScripts`          | Additional init.db scripts that are executed on the first start.                                                                       | `{}`                                                                   |
-| `metadatadb.replicaCount`                | The number of cluster nodes, should be uneven i.e. 2n+1                                                                                | `3`                                                                    |
 | `metadatadb.resourcesPreset`             | The container resource preset                                                                                                          | `xlarge`                                                               |
 | `metadatadb.persistence.enabled`         | Enable persistent storage.                                                                                                             | `true`                                                                 |
+| `metadatadb.replicaCount`                | The number of cluster nodes, should be uneven i.e. 2n+1                                                                                | `1`                                                                    |
 
 ### Dashboard Database Enable the Dashboard Database.
 
@@ -152,39 +154,48 @@ The command removes all the Kubernetes components associated with the chart and
 
 ### Broker Service
 
-| Name                                             | Description                                                                                                                      | Value                                                                                      |
-| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
-| `brokerservice.enabled`                          | Enable the Broker Service.                                                                                                       | `true`                                                                                     |
-| `brokerservice.image.debug`                      | Set the logging level to `trace`. Otherwise, set to `info`.                                                                      | `true`                                                                                     |
-| `brokerservice.endpoint`                         | The management api endpoint for the microservices.                                                                               | `http://broker-service:15672`                                                              |
-| `brokerservice.host`                             | The hostname for the microservices.                                                                                              | `broker-service`                                                                           |
-| `brokerservice.port`                             | The port for the microservices.                                                                                                  | `5672`                                                                                     |
-| `brokerservice.virtualHost`                      | The default virtual host name.                                                                                                   | `dbrepo`                                                                                   |
-| `brokerservice.queueName`                        | The default queue name.                                                                                                          | `dbrepo`                                                                                   |
-| `brokerservice.exchangeName`                     | The default exchange name.                                                                                                       | `dbrepo`                                                                                   |
-| `brokerservice.routingKey`                       | The default routing key binding from the default queue to the default exchange.                                                  | `dbrepo.#`                                                                                 |
-| `brokerservice.connectionTimeout`                | The connection timeout in ms.                                                                                                    | `60000`                                                                                    |
-| `brokerservice.ldap.binddn`                      | The domain name the broker service should bind to. In many cases this is the admin user from `identityservice.global.adminUser`. | `cn=admin,dc=dbrepo,dc=at`                                                                 |
-| `brokerservice.ldap.bindpw`                      | The password to bind on the identity service. In many cases this value is equal to `identityservice.global.adminPassword`.       | `admin`                                                                                    |
-| `brokerservice.ldap.uidField`                    | The field containing the user id.                                                                                                | `uid`                                                                                      |
-| `brokerservice.ldap.basedn`                      | The base domain name containing the users.                                                                                       | `dc=dbrepo,dc=at`                                                                          |
-| `brokerservice.ldap.userDnPattern`               | The pattern to determine the user.                                                                                               | `${username}`                                                                              |
-| `brokerservice.auth.tls.enabled`                 | Enable TLS support                                                                                                               | `false`                                                                                    |
-| `brokerservice.auth.tls.existingSecretFullChain` | If set to `true` the service uses the full chain in the certificate `tls.crt`, otherwise it attempts to read from `ca.crt`       | `false`                                                                                    |
-| `brokerservice.auth.tls.existingSecret`          | Existing secret with certificate content                                                                                         | `ingress-cert`                                                                             |
-| `brokerservice.extraPlugins`                     | The list of plugins to be activated.                                                                                             | `rabbitmq_prometheus rabbitmq_auth_backend_ldap rabbitmq_auth_mechanism_ssl rabbitmq_mqtt` |
-| `brokerservice.persistence.enabled`              | If set to true, a PVC will be created.                                                                                           | `false`                                                                                    |
-| `brokerservice.extraConfiguration`               | The extra configuration for MQTT                                                                                                 | `mqtt.vhost = dbrepo
+| Name                                             | Description                                                                                                                      | Value                                                                                                                                                                                                                                                                                                                                                                                                                                         |
+| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `brokerservice.enabled`                          | Enable the Broker Service.                                                                                                       | `true`                                                                                                                                                                                                                                                                                                                                                                                                                                        |
+| `brokerservice.image.debug`                      | Set the logging level to `trace`. Otherwise, set to `info`.                                                                      | `true`                                                                                                                                                                                                                                                                                                                                                                                                                                        |
+| `brokerservice.endpoint`                         | The management api endpoint for the microservices.                                                                               | `http://broker-service:15672`                                                                                                                                                                                                                                                                                                                                                                                                                 |
+| `brokerservice.host`                             | The hostname for the microservices.                                                                                              | `broker-service`                                                                                                                                                                                                                                                                                                                                                                                                                              |
+| `brokerservice.port`                             | The port for the microservices.                                                                                                  | `5672`                                                                                                                                                                                                                                                                                                                                                                                                                                        |
+| `brokerservice.virtualHost`                      | The default virtual host name.                                                                                                   | `dbrepo`                                                                                                                                                                                                                                                                                                                                                                                                                                      |
+| `brokerservice.queueName`                        | The default queue name.                                                                                                          | `dbrepo`                                                                                                                                                                                                                                                                                                                                                                                                                                      |
+| `brokerservice.exchangeName`                     | The default exchange name.                                                                                                       | `dbrepo`                                                                                                                                                                                                                                                                                                                                                                                                                                      |
+| `brokerservice.routingKey`                       | The default routing key binding from the default queue to the default exchange.                                                  | `dbrepo.#`                                                                                                                                                                                                                                                                                                                                                                                                                                    |
+| `brokerservice.connectionTimeout`                | The connection timeout in ms.                                                                                                    | `60000`                                                                                                                                                                                                                                                                                                                                                                                                                                       |
+| `brokerservice.ldap.binddn`                      | The domain name the broker service should bind to. In many cases this is the admin user from `identityservice.global.adminUser`. | `cn=admin,dc=dbrepo,dc=at`                                                                                                                                                                                                                                                                                                                                                                                                                    |
+| `brokerservice.ldap.bindpw`                      | The password to bind on the identity service. In many cases this value is equal to `identityservice.global.adminPassword`.       | `admin`                                                                                                                                                                                                                                                                                                                                                                                                                                       |
+| `brokerservice.ldap.uidField`                    | The field containing the user id.                                                                                                | `uid`                                                                                                                                                                                                                                                                                                                                                                                                                                         |
+| `brokerservice.ldap.basedn`                      | The base domain name containing the users.                                                                                       | `dc=dbrepo,dc=at`                                                                                                                                                                                                                                                                                                                                                                                                                             |
+| `brokerservice.ldap.userDnPattern`               | The pattern to determine the user.                                                                                               | `${username}`                                                                                                                                                                                                                                                                                                                                                                                                                                 |
+| `brokerservice.auth.tls.enabled`                 | Enable TLS support                                                                                                               | `false`                                                                                                                                                                                                                                                                                                                                                                                                                                       |
+| `brokerservice.auth.tls.existingSecretFullChain` | If set to `true` the service uses the full chain in the certificate `tls.crt`, otherwise it attempts to read from `ca.crt`       | `false`                                                                                                                                                                                                                                                                                                                                                                                                                                       |
+| `brokerservice.auth.tls.existingSecret`          | Existing secret with certificate content                                                                                         | `ingress-cert`                                                                                                                                                                                                                                                                                                                                                                                                                                |
+| `brokerservice.extraPlugins`                     | The list of plugins to be activated.                                                                                             | `rabbitmq_prometheus rabbitmq_auth_backend_ldap rabbitmq_auth_mechanism_ssl rabbitmq_mqtt`                                                                                                                                                                                                                                                                                                                                                    |
+| `brokerservice.extraConfiguration`               | The extra configuration for MQTT                                                                                                 | `# https://www.rabbitmq.com/docs/logging#log-message-categories
+log.connection.level = warning
+log.file = /opt/bitnami/rabbitmq/var/log/rabbitmq/app.log
+log.file.formatter = json
+log.file.level = info
+# rotate when the file reaches 10 MiB
+log.file.rotation.size = 10485760
+# keep up to 5 archived log files in addition to the current one
+log.file.rotation.count = 5
+mqtt.vhost = dbrepo
 mqtt.exchange = dbrepo
 mqtt.prefetch = 10
-`                           |
-| `brokerservice.replicaCount`                     | The number of replicas.                                                                                                          | `1`                                                                                        |
+` |
+| `brokerservice.replicaCount`                     | The number of replicas.                                                                                                          | `1`                                                                                                                                                                                                                                                                                                                                                                                                                                           |
 
 ### Analyse Service
 
 | Name                                                               | Description                                                                                                       | Value                     |
 | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------- | ------------------------- |
 | `analyseservice.enabled`                                           | Enable the Broker Service.                                                                                        | `true`                    |
+| `analyseservice.podAnnotations`                                    | the pod annotations. Evaluated as a template                                                                      | `{}`                      |
 | `analyseservice.podSecurityContext.enabled`                        | Enable pods' Security Context                                                                                     | `true`                    |
 | `analyseservice.podSecurityContext.fsGroupChangePolicy`            | Set filesystem group change policy                                                                                | `Always`                  |
 | `analyseservice.podSecurityContext.sysctls`                        | Set kernel settings using the sysctl interface                                                                    | `[]`                      |
@@ -211,6 +222,7 @@ mqtt.prefetch = 10
 | Name                                                                | Description                                                                                                       | Value                            |
 | ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------------- |
 | `metadataservice.enabled`                                           | Enable the Broker Service.                                                                                        | `true`                           |
+| `metadataservice.podAnnotations`                                    | the pod annotations. Evaluated as a template                                                                      | `{}`                             |
 | `metadataservice.podSecurityContext.enabled`                        | Enable pods' Security Context                                                                                     | `true`                           |
 | `metadataservice.podSecurityContext.fsGroupChangePolicy`            | Set filesystem group change policy                                                                                | `Always`                         |
 | `metadataservice.podSecurityContext.sysctls`                        | Set kernel settings using the sysctl interface                                                                    | `[]`                             |
@@ -251,6 +263,7 @@ mqtt.prefetch = 10
 | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- |
 | `dataservice.enabled`                                           | Enable the Broker Service.                                                                                                                       | `true`                                                                                                                      |
 | `dataservice.endpoint`                                          | Absolute URL to the data service in the form of http://host:port                                                                                 | `http://data-service`                                                                                                       |
+| `dataservice.podAnnotations`                                    | the pod annotations. Evaluated as a template                                                                                                     | `{}`                                                                                                                        |
 | `dataservice.podSecurityContext.enabled`                        | Enable pods' Security Context                                                                                                                    | `true`                                                                                                                      |
 | `dataservice.podSecurityContext.fsGroupChangePolicy`            | Set filesystem group change policy                                                                                                               | `Always`                                                                                                                    |
 | `dataservice.podSecurityContext.sysctls`                        | Set kernel settings using the sysctl interface                                                                                                   | `[]`                                                                                                                        |
@@ -287,6 +300,7 @@ mqtt.prefetch = 10
 | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------- |
 | `searchservice.enabled`                                           | Enable the Broker Service.                                                                                        | `true`                  |
 | `searchservice.endpoint`                                          | Absolute URL to the search service in the form of http://host:port                                                | `http://search-service` |
+| `searchservice.podAnnotations`                                    | the pod annotations. Evaluated as a template                                                                      | `{}`                    |
 | `searchservice.podSecurityContext.enabled`                        | Enable pods' Security Context                                                                                     | `true`                  |
 | `searchservice.podSecurityContext.fsGroupChangePolicy`            | Set filesystem group change policy                                                                                | `Always`                |
 | `searchservice.podSecurityContext.sysctls`                        | Set kernel settings using the sysctl interface                                                                    | `[]`                    |
@@ -303,8 +317,9 @@ mqtt.prefetch = 10
 | `searchservice.containerSecurityContext.seccompProfile.type`      | Set container's Security Context seccomp profile                                                                  | `RuntimeDefault`        |
 | `searchservice.resourcesPreset`                                   | The container resource preset                                                                                     | `micro`                 |
 | `searchservice.resources`                                         | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}`                    |
-| `searchservice.init.resourcesPreset`                              | The container resource preset                                                                                     | `nano`                  |
-| `searchservice.init.resources`                                    | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}`                    |
+| `searchservice.setupJob.enabled`                                  | Enable the setup job that syncs missing databases from the Metadata Database into the Search Database.            | `true`                  |
+| `searchservice.setupJob.resourcesPreset`                          | The container resource preset                                                                                     | `nano`                  |
+| `searchservice.setupJob.resources`                                | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}`                    |
 | `searchservice.replicaCount`                                      | The number of replicas.                                                                                           | `2`                     |
 
 ### Storage Service
@@ -321,9 +336,10 @@ mqtt.prefetch = 10
 | `storageservice.s3.auth.adminSecretAccessKey` | The S3 secret access key for the admin user. In some systems this is named `password`.                            | `seaweedfsadmin`                 |
 | `storageservice.s3.auth.readAccessKeyId`      | The S3 access key id for the read only user.                                                                      | `seaweedfsuser`                  |
 | `storageservice.s3.auth.readSecretAccessKey`  | The S3 secret access key for the read only user.                                                                  | `seaweedfsuser`                  |
-| `storageservice.init.s3.endpoint`             | The S3-capable endpoint the microservice connects to.                                                             | `http://storage-service-s3:8333` |
-| `storageservice.init.resourcesPreset`         | The container resource preset                                                                                     | `nano`                           |
-| `storageservice.init.resources`               | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}`                             |
+| `storageservice.setupJob.enabled`             | Enable the setup job that creates the bucket in the s3 endpoint.                                                  | `true`                           |
+| `storageservice.setupJob.s3.endpoint`         | The S3-capable endpoint the microservice connects to.                                                             | `http://storage-service-s3:8333` |
+| `storageservice.setupJob.resourcesPreset`     | The container resource preset                                                                                     | `nano`                           |
+| `storageservice.setupJob.resources`           | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}`                             |
 
 ### Identity Service
 
@@ -333,6 +349,7 @@ mqtt.prefetch = 10
 | `identityservice.global.ldapDomain`                                 | The LDAP domain name in domain "dbrepo.at" form or explicit in "dc=dbrepo,dc=at" form.                            | `dc=dbrepo,dc=at`      |
 | `identityservice.global.adminUser`                                  | The admin username that is used to bind.                                                                          | `admin`                |
 | `identityservice.global.adminPassword`                              | The admin user password that is used to bind.                                                                     | `admin`                |
+| `identityservice.podAnnotations`                                    | the pod annotations. Evaluated as a template                                                                      | `{}`                   |
 | `identityservice.podSecurityContext.enabled`                        | Enable pods' Security Context                                                                                     | `true`                 |
 | `identityservice.podSecurityContext.fsGroupChangePolicy`            | Set filesystem group change policy                                                                                | `Always`               |
 | `identityservice.podSecurityContext.sysctls`                        | Set kernel settings using the sysctl interface                                                                    | `[]`                   |
@@ -363,6 +380,7 @@ mqtt.prefetch = 10
 | `ui.oidc.authSessionSecret`                            | This should be a at least 48 characters random string. It is used to encrypt the user session.                                                                                                                                                                                                                       | `qJteD-fvcHNafjwDtJOT3pF7IrN1OEzQRcIyPO0xAT4gzct0`          |
 | `ui.oidc.sessionSecret`                                | This should be a at least 48 characters random string. It is used to encrypt the user session.                                                                                                                                                                                                                       | `TjOH1lFnocixYmy5ol2I5cOdsYUdrd5_jZsGxo6aMVPNNDkh`          |
 | `ui.oidc.tokenKey`                                     | This needs to be a random cryptographic AES key in base64. Used to encrypt the server side token store. You can generate a key in JS with await subtle.exportKey('raw', await subtle.generateKey({ name: 'AES-GCM', length: 256, }, true, ['encrypt', 'decrypt'])). You just have to encode it to base64 afterwards. | `data:;base64,ntxOAfrF6yw22Ec1AFHK21iFz7L3PZmz9857Uqwyme0=` |
+| `ui.podAnnotations`                                    | the pod annotations. Evaluated as a template                                                                                                                                                                                                                                                                         | `{}`                                                        |
 | `ui.podSecurityContext.enabled`                        | Enable pods' Security Context                                                                                                                                                                                                                                                                                        | `true`                                                      |
 | `ui.podSecurityContext.fsGroupChangePolicy`            | Set filesystem group change policy                                                                                                                                                                                                                                                                                   | `Always`                                                    |
 | `ui.podSecurityContext.sysctls`                        | Set kernel settings using the sysctl interface                                                                                                                                                                                                                                                                       | `[]`                                                        |
@@ -401,6 +419,7 @@ mqtt.prefetch = 10
 | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------- |
 | `dashboardservice.enabled`                                           | Enable the Dashboard Service.                                                                                     | `true`                     |
 | `dashboardservice.endpoint`                                          | The endpoint for the microservices.                                                                               | `http://dashboard-service` |
+| `dashboardservice.podAnnotations`                                    | the pod annotations. Evaluated as a template                                                                      | `{}`                       |
 | `dashboardservice.podSecurityContext.enabled`                        | Enable pods' Security Context                                                                                     | `true`                     |
 | `dashboardservice.podSecurityContext.fsGroupChangePolicy`            | Set filesystem group change policy                                                                                | `Always`                   |
 | `dashboardservice.podSecurityContext.sysctls`                        | Set kernel settings using the sysctl interface                                                                    | `[]`                       |
@@ -418,8 +437,9 @@ mqtt.prefetch = 10
 | `dashboardservice.resourcesPreset`                                   | The container resource preset                                                                                     | `micro`                    |
 | `dashboardservice.resources`                                         | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}`                       |
 | `dashboardservice.replicaCount`                                      | The number of replicas.                                                                                           | `2`                        |
-| `dashboardservice.init.resourcesPreset`                              | The container resource preset                                                                                     | `nano`                     |
-| `dashboardservice.init.resources`                                    | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}`                       |
+| `dashboardservice.setupJob.enabled`                                  | Enable the setup job that creates dashboards for existing databases in the Dashboard UI.                          | `true`                     |
+| `dashboardservice.setupJob.resourcesPreset`                          | The container resource preset                                                                                     | `nano`                     |
+| `dashboardservice.setupJob.resources`                                | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}`                       |
 | `dashboardservice.replicaCount`                                      | The number of replicas.                                                                                           | `2`                        |
 
 ### Dashboard UI
@@ -440,13 +460,13 @@ mqtt.prefetch = 10
 
 ### Gateway Service
 
-| Name                                          | Description                                   | Value                    |
-| --------------------------------------------- | --------------------------------------------- | ------------------------ |
-| `gatewayservice.enabled`                      | Enable the Gateway Service.                   | `true`                   |
-| `gatewayservice.service.type`                 | The service type.                             | `ClusterIP`              |
-| `gatewayservice.metrics.enabled`              | Enable the Prometheus metrics sidecar.        | `false`                  |
-| `gatewayservice.existingServerBlockConfigmap` | The extra configuration for the reverse proxy | `gateway-service-config` |
-| `gatewayservice.replicaCount`                 | The number of replicas.                       | `3`                      |
+| Name                                          | Description                                   | Value                   |
+| --------------------------------------------- | --------------------------------------------- | ----------------------- |
+| `gatewayservice.enabled`                      | Enable the Gateway Service.                   | `true`                  |
+| `gatewayservice.service.type`                 | The service type.                             | `ClusterIP`             |
+| `gatewayservice.metrics.enabled`              | Enable the Prometheus metrics sidecar.        | `false`                 |
+| `gatewayservice.existingServerBlockConfigmap` | The extra configuration for the reverse proxy | `gateway-service-setup` |
+| `gatewayservice.replicaCount`                 | The number of replicas.                       | `3`                     |
 
 ### Analytics Service
 
diff --git a/helm/dbrepo/charts/keycloak-24.6.3.tgz b/helm/dbrepo/charts/keycloak-24.6.3.tgz
deleted file mode 100644
index 2196f1737a0aa9a6e1c4947de17fe842b171b610..0000000000000000000000000000000000000000
Binary files a/helm/dbrepo/charts/keycloak-24.6.3.tgz and /dev/null differ
diff --git a/helm/dbrepo/charts/keycloak-24.6.6.tgz b/helm/dbrepo/charts/keycloak-24.6.6.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..9b9fc4efafb111da60cae8ad4197eb2b733dc7fd
Binary files /dev/null and b/helm/dbrepo/charts/keycloak-24.6.6.tgz differ
diff --git a/helm/dbrepo/charts/nginx-18.3.1.tgz b/helm/dbrepo/charts/nginx-18.3.1.tgz
deleted file mode 100644
index 66ed8e26a1578edede247ba67dc160133d3bc93f..0000000000000000000000000000000000000000
Binary files a/helm/dbrepo/charts/nginx-18.3.1.tgz and /dev/null differ
diff --git a/helm/dbrepo/charts/nginx-20.0.2.tgz b/helm/dbrepo/charts/nginx-20.0.2.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..91f0c9d5f253e4e2cfc7dfa011954a8e981e6552
Binary files /dev/null and b/helm/dbrepo/charts/nginx-20.0.2.tgz differ
diff --git a/helm/dbrepo/charts/seaweedfs-4.2.1.tgz b/helm/dbrepo/charts/seaweedfs-4.2.1.tgz
deleted file mode 100644
index 01a3290449116e207f01e24349da14aee6af8f79..0000000000000000000000000000000000000000
Binary files a/helm/dbrepo/charts/seaweedfs-4.2.1.tgz and /dev/null differ
diff --git a/helm/dbrepo/charts/seaweedfs-4.8.7.tgz b/helm/dbrepo/charts/seaweedfs-4.8.7.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..437a8c385c0d079f33436580068eda55bd9083aa
Binary files /dev/null and b/helm/dbrepo/charts/seaweedfs-4.8.7.tgz differ
diff --git a/helm/dbrepo/files/create-event-listener.jar b/helm/dbrepo/files/create-event-listener.jar
index 4e8060b6ba6d6f0ad9bf2a71d447368492fff775..c5dc64eadaaae60cab812f38609825e3c6e08336 100644
Binary files a/helm/dbrepo/files/create-event-listener.jar and b/helm/dbrepo/files/create-event-listener.jar differ
diff --git a/helm/dbrepo/files/dbrepo.conf b/helm/dbrepo/files/dbrepo.conf
new file mode 100644
index 0000000000000000000000000000000000000000..b98aca8b0c890cb5312a99246e912310933dd8a5
--- /dev/null
+++ b/helm/dbrepo/files/dbrepo.conf
@@ -0,0 +1,187 @@
+# This is required to proxy Grafana Live WebSocket connections.
+map $http_upgrade $connection_upgrade {
+  default upgrade;
+  '' close;
+}
+
+proxy_buffer_size        128k;
+proxy_buffers       4    256k;
+proxy_busy_buffers_size  256k;
+
+log_format structured '{"remote_addr": "$remote_addr", "remote_user": "$remote_user", "request": "$request", "status": $status, "body_bytes_sent": $body_bytes_sent, "http_referer": "$http_referer", "http_user_agent": "$http_user_agent"}';
+
+server {
+    gzip on;
+    access_log /var/log/nginx/access.log structured;
+
+    listen 8080 default_server;
+    server_name _;
+
+    location /dashboard/ {
+        proxy_set_header        Host $http_host;
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://dashboard-ui:3000/;
+        proxy_read_timeout      90;
+    }
+
+    # Proxy Grafana Live WebSocket connections.
+    location /dashboard/api/live/ws {
+        rewrite  ^/dashboard/(.*)  /$1 break;
+        proxy_set_header        Host $http_host;
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_set_header        Upgrade $http_upgrade;
+        proxy_set_header        Connection $connection_upgrade;
+        proxy_http_version      1.1;
+        proxy_pass              http://dashboard-ui:3000/;
+        proxy_read_timeout      90;
+    }
+
+    # Proxy Keycloak OIDC connections, c.f. https://www.keycloak.org/server/reverseproxy#_exposed_path_recommendations
+    location /realms {
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://auth-service;
+        proxy_read_timeout      90;
+    }
+
+    # Proxy Keycloak assets, c.f. https://www.keycloak.org/server/reverseproxy#_exposed_path_recommendations
+    location /resources {
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://auth-service;
+        proxy_read_timeout      90;
+    }
+
+    location /api/search {
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://search-service;
+        proxy_read_timeout      90;
+    }
+
+    location /api/datasource {
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://dashboard-service;
+        proxy_read_timeout      90;
+    }
+
+    location /api/dashboard {
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://dashboard-service;
+        proxy_read_timeout      90;
+    }
+
+    location /api/upload {
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_pass              http://data-service;
+        proxy_read_timeout      90;
+        # Disable request and response buffering
+        proxy_request_buffering off;
+        proxy_buffering         off;
+        proxy_http_version      1.1;
+    }
+
+    location /api/analyse {
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://analyse-service;
+        proxy_read_timeout      90;
+    }
+
+    location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/table/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/(data|statistic|history)" {
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://data-service;
+        proxy_read_timeout      90;
+    }
+
+    location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/view/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/(data|statistic)" {
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://data-service;
+        proxy_read_timeout      90;
+    }
+
+    location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/view" {
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://metadata-service;
+        proxy_read_timeout      90;
+    }
+
+    location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/subset" {
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://data-service;
+        proxy_read_timeout      600;
+    }
+
+    location ~ "/api/(database|concept|container|identifier|image|message|license|oai|ontology|unit|user)" {
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://metadata-service;
+        proxy_read_timeout      90;
+    }
+
+    location ~ "/api/identifier/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})" {
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://metadata-service;
+        proxy_read_timeout      90;
+    }
+
+    location ~ "/pid/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})" {
+        rewrite /pid/(.*) /api/identifier/$1 break;
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://metadata-service;
+        proxy_read_timeout      90;
+    }
+
+    location / {
+        proxy_set_header        X-Real-IP $remote_addr;
+        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_set_header        X-Forwarded-Host $host;
+        proxy_set_header        X-Forwarded-Proto $scheme;
+        proxy_pass              http://ui:3000;
+        proxy_read_timeout      90;
+    }
+}
diff --git a/helm/dbrepo/files/dbrepo.json b/helm/dbrepo/files/dbrepo.json
index ca75b2fffe9345b8a4c9fecd825e027377932909..dc3d570df03df3c485aa9ed64caadaf2b1e75c03 100644
--- a/helm/dbrepo/files/dbrepo.json
+++ b/helm/dbrepo/files/dbrepo.json
@@ -18,7 +18,7 @@
   "editable": true,
   "fiscalYearStartMonth": 0,
   "graphTooltip": 1,
-  "id": 3,
+  "id": 4,
   "links": [
     {
       "asDropdown": false,
@@ -112,7 +112,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -182,7 +182,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -250,7 +250,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -318,7 +318,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -434,7 +434,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -510,7 +510,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -604,7 +604,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -699,7 +699,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -781,7 +781,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -859,7 +859,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -933,7 +933,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1005,7 +1005,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1094,7 +1094,7 @@
         "sizing": "auto",
         "valueMode": "color"
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1197,7 +1197,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1284,7 +1284,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1358,7 +1358,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1440,7 +1440,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1522,7 +1522,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1604,7 +1604,7 @@
         "textMode": "auto",
         "wideLayout": true
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1735,7 +1735,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1829,7 +1829,7 @@
         "sizing": "auto",
         "valueMode": "color"
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -1946,7 +1946,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -2108,7 +2108,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -2269,7 +2269,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -2400,7 +2400,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -2418,13 +2418,385 @@
       "title": "Failed API Requests",
       "type": "timeseries"
     },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "mode": "fixed"
+          },
+          "custom": {
+            "axisBorderShow": false,
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
+            "axisLabel": "Count",
+            "axisPlacement": "auto",
+            "fillOpacity": 80,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "lineWidth": 1,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "green",
+                "value": null
+              }
+            ]
+          }
+        },
+        "overrides": [
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "200"
+            },
+            "properties": [
+              {
+                "id": "color",
+                "value": {
+                  "fixedColor": "green",
+                  "mode": "fixed"
+                }
+              },
+              {
+                "id": "displayName",
+                "value": "200s"
+              }
+            ]
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "300"
+            },
+            "properties": [
+              {
+                "id": "color",
+                "value": {
+                  "fixedColor": "purple",
+                  "mode": "fixed"
+                }
+              },
+              {
+                "id": "displayName",
+                "value": "300s"
+              }
+            ]
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "400"
+            },
+            "properties": [
+              {
+                "id": "color",
+                "value": {
+                  "fixedColor": "orange",
+                  "mode": "fixed"
+                }
+              },
+              {
+                "id": "displayName",
+                "value": "400s"
+              }
+            ]
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "500"
+            },
+            "properties": [
+              {
+                "id": "color",
+                "value": {
+                  "fixedColor": "red",
+                  "mode": "fixed"
+                }
+              },
+              {
+                "id": "displayName",
+                "value": "500s"
+              }
+            ]
+          }
+        ]
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 12,
+        "x": 0,
+        "y": 48
+      },
+      "id": 43,
+      "options": {
+        "barRadius": 0,
+        "barWidth": 0.97,
+        "fullHighlight": false,
+        "groupWidth": 0.7,
+        "legend": {
+          "calcs": [],
+          "displayMode": "list",
+          "placement": "right",
+          "showLegend": true
+        },
+        "orientation": "auto",
+        "showValue": "auto",
+        "stacking": "normal",
+        "tooltip": {
+          "hideZeros": false,
+          "mode": "multi",
+          "sort": "none"
+        },
+        "xTickLabelRotation": 0,
+        "xTickLabelSpacing": 100
+      },
+      "pluginVersion": "11.3.1",
+      "targets": [
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "status: (>=200 AND <300)",
+          "queryType": "lucene",
+          "refId": "200",
+          "timeField": "@timestamp"
+        },
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "status: (>=300 AND <400)",
+          "queryType": "lucene",
+          "refId": "300",
+          "timeField": "@timestamp"
+        },
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "status: (>=400 AND <500)",
+          "queryType": "lucene",
+          "refId": "400",
+          "timeField": "@timestamp"
+        },
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "status: >=500",
+          "queryType": "lucene",
+          "refId": "500",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "HTTP Status Codes over Time",
+      "type": "barchart"
+    },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "fieldConfig": {
+        "defaults": {},
+        "overrides": [
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "200"
+            },
+            "properties": []
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "300"
+            },
+            "properties": []
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "400"
+            },
+            "properties": []
+          },
+          {
+            "matcher": {
+              "id": "byFrameRefID",
+              "options": "500"
+            },
+            "properties": []
+          }
+        ]
+      },
+      "gridPos": {
+        "h": 8,
+        "w": 12,
+        "x": 12,
+        "y": 48
+      },
+      "id": 44,
+      "options": {
+        "dedupStrategy": "none",
+        "enableLogDetails": true,
+        "prettifyLogMessage": false,
+        "showCommonLabels": false,
+        "showLabels": false,
+        "showTime": false,
+        "sortOrder": "Descending",
+        "wrapLogMessage": false
+      },
+      "pluginVersion": "11.3.1",
+      "targets": [
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Logs",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "logs"
+            }
+          ],
+          "query": "status: >=400",
+          "queryType": "lucene",
+          "refId": "ERROR",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "REST API Errors",
+      "type": "logs"
+    },
     {
       "collapsed": false,
       "gridPos": {
         "h": 1,
         "w": 24,
         "x": 0,
-        "y": 48
+        "y": 56
       },
       "id": 39,
       "panels": [],
@@ -2496,7 +2868,7 @@
         "h": 8,
         "w": 12,
         "x": 0,
-        "y": 49
+        "y": 57
       },
       "id": 41,
       "options": {
@@ -2513,7 +2885,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -2607,7 +2979,7 @@
         "h": 8,
         "w": 12,
         "x": 12,
-        "y": 49
+        "y": 57
       },
       "id": 42,
       "options": {
@@ -2624,7 +2996,7 @@
           "sort": "none"
         }
       },
-      "pluginVersion": "11.5.3",
+      "pluginVersion": "11.3.1",
       "targets": [
         {
           "datasource": {
@@ -2671,13 +3043,13 @@
     "list": []
   },
   "time": {
-    "from": "now-24h",
+    "from": "now-3h",
     "to": "now"
   },
   "timepicker": {},
   "timezone": "browser",
   "title": "DBRepo",
   "uid": "bdz20owu8zn5se",
-  "version": 9,
+  "version": 1,
   "weekStart": ""
 }
\ No newline at end of file
diff --git a/helm/dbrepo/files/keycloak.json b/helm/dbrepo/files/keycloak.json
index 7c2115a8ecc143851275d456d4c954bdd881f5b2..aa5e2a8c572b6a5273bb9c89c908b3adff857dfa 100644
--- a/helm/dbrepo/files/keycloak.json
+++ b/helm/dbrepo/files/keycloak.json
@@ -2342,7 +2342,7 @@
   "refresh": "5m",
   "schemaVersion": 26,
   "style": "dark",
-  "tags": [],
+  "tags": ["provisioned", "auth"],
   "templating": {
     "list": [
       {
@@ -2357,7 +2357,7 @@
     ]
   },
   "time": {
-    "from": "now-24h",
+    "from": "now-3h",
     "to": "now"
   },
   "timepicker": {
@@ -2386,7 +2386,7 @@
     ]
   },
   "timezone": "",
-  "title": "Keycloak Metrics Dashboard",
+  "title": "Keycloak - Overview",
   "uid": "keycloak-dashboard",
   "version": 6,
   "description": "Dashboard of Keycloak metrics exported with Keycloak Metrics SPI\r\n\r\nhttps://github.com/aerogear/keycloak-metrics-spi"
diff --git a/helm/dbrepo/files/logging.json b/helm/dbrepo/files/logging.json
new file mode 100644
index 0000000000000000000000000000000000000000..4bd065db8e64f6da2dcb835f7b6ad13cea013cc9
--- /dev/null
+++ b/helm/dbrepo/files/logging.json
@@ -0,0 +1,865 @@
+{
+  "annotations": {
+    "list": [
+      {
+        "builtIn": 1,
+        "datasource": {
+          "type": "grafana",
+          "uid": "-- Grafana --"
+        },
+        "enable": true,
+        "hide": true,
+        "iconColor": "rgba(0, 211, 255, 1)",
+        "name": "Annotations & Alerts",
+        "type": "dashboard"
+      }
+    ]
+  },
+  "editable": true,
+  "fiscalYearStartMonth": 0,
+  "graphTooltip": 0,
+  "id": 4,
+  "links": [],
+  "panels": [
+    {
+      "collapsed": false,
+      "gridPos": {
+        "h": 1,
+        "w": 24,
+        "x": 0,
+        "y": 0
+      },
+      "id": 6,
+      "panels": [],
+      "title": "System",
+      "type": "row"
+    },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "fixedColor": "orange",
+            "mode": "fixed"
+          },
+          "custom": {
+            "axisBorderShow": false,
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "barWidthFactor": 0.6,
+            "drawStyle": "bars",
+            "fillOpacity": 0,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "insertNulls": false,
+            "lineInterpolation": "smooth",
+            "lineStyle": {
+              "fill": "solid"
+            },
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "auto",
+            "spanNulls": false,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "orange",
+                "value": null
+              }
+            ]
+          }
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 4,
+        "w": 12,
+        "x": 0,
+        "y": 1
+      },
+      "id": 1,
+      "options": {
+        "legend": {
+          "calcs": [],
+          "displayMode": "list",
+          "placement": "bottom",
+          "showLegend": false
+        },
+        "tooltip": {
+          "mode": "single",
+          "sort": "none"
+        }
+      },
+      "pluginVersion": "11.3.1",
+      "targets": [
+        {
+          "alias": "WARN",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "hide": false,
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "log_level: WARN",
+          "queryType": "lucene",
+          "refId": "warn",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "Warnings over time",
+      "type": "timeseries"
+    },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "fixedColor": "red",
+            "mode": "fixed"
+          },
+          "custom": {
+            "axisBorderShow": false,
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "barWidthFactor": 0.6,
+            "drawStyle": "bars",
+            "fillOpacity": 0,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "insertNulls": false,
+            "lineInterpolation": "smooth",
+            "lineStyle": {
+              "fill": "solid"
+            },
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "auto",
+            "spanNulls": false,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "red",
+                "value": null
+              }
+            ]
+          }
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 4,
+        "w": 12,
+        "x": 12,
+        "y": 1
+      },
+      "id": 18,
+      "options": {
+        "legend": {
+          "calcs": [],
+          "displayMode": "list",
+          "placement": "bottom",
+          "showLegend": false
+        },
+        "tooltip": {
+          "mode": "single",
+          "sort": "none"
+        }
+      },
+      "pluginVersion": "11.3.1",
+      "targets": [
+        {
+          "alias": "ERROR",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "hide": false,
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "log_level: ERROR",
+          "queryType": "lucene",
+          "refId": "warn",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "Errors over time",
+      "type": "timeseries"
+    },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "description": "",
+      "fieldConfig": {
+        "defaults": {},
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 10,
+        "w": 12,
+        "x": 0,
+        "y": 5
+      },
+      "id": 9,
+      "options": {
+        "dedupStrategy": "none",
+        "enableInfiniteScrolling": false,
+        "enableLogDetails": true,
+        "prettifyLogMessage": false,
+        "showCommonLabels": false,
+        "showLabels": false,
+        "showTime": true,
+        "sortOrder": "Descending",
+        "wrapLogMessage": false
+      },
+      "pluginVersion": "11.3.1",
+      "targets": [
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "field": "@timestamp",
+              "id": "2",
+              "settings": {
+                "interval": "auto"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Logs",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "logs"
+            }
+          ],
+          "query": "log_level: WARN",
+          "queryType": "lucene",
+          "refId": "A",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "Warnings",
+      "transformations": [
+        {
+          "id": "filterFieldsByName",
+          "options": {
+            "include": {
+              "names": [
+                "@timestamp",
+                "message",
+                "log_logger",
+                "process_pid",
+                "process_thread_name",
+                "service_name",
+                "service_version",
+                "log_level"
+              ]
+            }
+          }
+        }
+      ],
+      "type": "logs"
+    },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "description": "",
+      "fieldConfig": {
+        "defaults": {},
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 10,
+        "w": 12,
+        "x": 12,
+        "y": 5
+      },
+      "id": 19,
+      "options": {
+        "dedupStrategy": "none",
+        "enableInfiniteScrolling": false,
+        "enableLogDetails": true,
+        "prettifyLogMessage": false,
+        "showCommonLabels": false,
+        "showLabels": false,
+        "showTime": true,
+        "sortOrder": "Descending",
+        "wrapLogMessage": false
+      },
+      "pluginVersion": "11.3.1",
+      "targets": [
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "field": "@timestamp",
+              "id": "2",
+              "settings": {
+                "interval": "auto"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Logs",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "logs"
+            }
+          ],
+          "query": "log_level: ERROR",
+          "queryType": "lucene",
+          "refId": "A",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "Errors",
+      "transformations": [
+        {
+          "id": "filterFieldsByName",
+          "options": {
+            "include": {
+              "names": [
+                "@timestamp",
+                "message",
+                "log_logger",
+                "process_pid",
+                "process_thread_name",
+                "service_name",
+                "service_version",
+                "log_level"
+              ]
+            }
+          }
+        }
+      ],
+      "type": "logs"
+    },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "fixedColor": "#ffffff",
+            "mode": "fixed"
+          },
+          "custom": {
+            "axisBorderShow": false,
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "barWidthFactor": 0.6,
+            "drawStyle": "bars",
+            "fillOpacity": 0,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "insertNulls": false,
+            "lineInterpolation": "smooth",
+            "lineStyle": {
+              "fill": "solid"
+            },
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "auto",
+            "spanNulls": false,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "#ffffff",
+                "value": null
+              }
+            ]
+          }
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 4,
+        "w": 12,
+        "x": 0,
+        "y": 15
+      },
+      "id": 20,
+      "options": {
+        "legend": {
+          "calcs": [],
+          "displayMode": "list",
+          "placement": "bottom",
+          "showLegend": false
+        },
+        "tooltip": {
+          "mode": "single",
+          "sort": "none"
+        }
+      },
+      "pluginVersion": "11.3.1",
+      "targets": [
+        {
+          "alias": "DEBUG",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "hide": false,
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "log_level: DEBUG",
+          "queryType": "lucene",
+          "refId": "warn",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "Debugs over time",
+      "type": "timeseries"
+    },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "fieldConfig": {
+        "defaults": {
+          "color": {
+            "fixedColor": "blue",
+            "mode": "fixed"
+          },
+          "custom": {
+            "axisBorderShow": false,
+            "axisCenteredZero": false,
+            "axisColorMode": "text",
+            "axisLabel": "",
+            "axisPlacement": "auto",
+            "barAlignment": 0,
+            "barWidthFactor": 0.6,
+            "drawStyle": "bars",
+            "fillOpacity": 0,
+            "gradientMode": "none",
+            "hideFrom": {
+              "legend": false,
+              "tooltip": false,
+              "viz": false
+            },
+            "insertNulls": false,
+            "lineInterpolation": "smooth",
+            "lineStyle": {
+              "fill": "solid"
+            },
+            "lineWidth": 1,
+            "pointSize": 5,
+            "scaleDistribution": {
+              "type": "linear"
+            },
+            "showPoints": "auto",
+            "spanNulls": false,
+            "stacking": {
+              "group": "A",
+              "mode": "none"
+            },
+            "thresholdsStyle": {
+              "mode": "off"
+            }
+          },
+          "mappings": [],
+          "thresholds": {
+            "mode": "absolute",
+            "steps": [
+              {
+                "color": "blue",
+                "value": null
+              }
+            ]
+          }
+        },
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 4,
+        "w": 12,
+        "x": 12,
+        "y": 15
+      },
+      "id": 21,
+      "options": {
+        "legend": {
+          "calcs": [],
+          "displayMode": "list",
+          "placement": "bottom",
+          "showLegend": false
+        },
+        "tooltip": {
+          "mode": "single",
+          "sort": "none"
+        }
+      },
+      "pluginVersion": "11.3.1",
+      "targets": [
+        {
+          "alias": "INFO",
+          "bucketAggs": [
+            {
+              "id": "2",
+              "settings": {
+                "interval": "auto",
+                "min_doc_count": "0",
+                "trimEdges": "0"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Metric",
+          "metrics": [
+            {
+              "hide": false,
+              "id": "1",
+              "type": "count"
+            }
+          ],
+          "query": "log_level: INFO",
+          "queryType": "lucene",
+          "refId": "warn",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "Infos over time",
+      "type": "timeseries"
+    },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "description": "",
+      "fieldConfig": {
+        "defaults": {},
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 10,
+        "w": 12,
+        "x": 0,
+        "y": 19
+      },
+      "id": 23,
+      "options": {
+        "dedupStrategy": "none",
+        "enableInfiniteScrolling": false,
+        "enableLogDetails": true,
+        "prettifyLogMessage": false,
+        "showCommonLabels": false,
+        "showLabels": false,
+        "showTime": true,
+        "sortOrder": "Descending",
+        "wrapLogMessage": false
+      },
+      "pluginVersion": "11.3.1",
+      "targets": [
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "field": "@timestamp",
+              "id": "2",
+              "settings": {
+                "interval": "auto"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Logs",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "logs"
+            }
+          ],
+          "query": "log_level: DEBUG",
+          "queryType": "lucene",
+          "refId": "A",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "Debugs",
+      "transformations": [
+        {
+          "id": "filterFieldsByName",
+          "options": {
+            "include": {
+              "names": [
+                "@timestamp",
+                "message",
+                "log_logger",
+                "process_pid",
+                "process_thread_name",
+                "service_name",
+                "service_version",
+                "log_level"
+              ]
+            }
+          }
+        }
+      ],
+      "type": "logs"
+    },
+    {
+      "datasource": {
+        "type": "grafana-opensearch-datasource",
+        "uid": "dbrepoopensearch0"
+      },
+      "description": "",
+      "fieldConfig": {
+        "defaults": {},
+        "overrides": []
+      },
+      "gridPos": {
+        "h": 10,
+        "w": 12,
+        "x": 12,
+        "y": 19
+      },
+      "id": 22,
+      "options": {
+        "dedupStrategy": "none",
+        "enableInfiniteScrolling": false,
+        "enableLogDetails": true,
+        "prettifyLogMessage": false,
+        "showCommonLabels": false,
+        "showLabels": false,
+        "showTime": true,
+        "sortOrder": "Descending",
+        "wrapLogMessage": false
+      },
+      "pluginVersion": "11.3.1",
+      "targets": [
+        {
+          "alias": "",
+          "bucketAggs": [
+            {
+              "field": "@timestamp",
+              "id": "2",
+              "settings": {
+                "interval": "auto"
+              },
+              "type": "date_histogram"
+            }
+          ],
+          "datasource": {
+            "type": "grafana-opensearch-datasource",
+            "uid": "dbrepoopensearch0"
+          },
+          "format": "table",
+          "hide": false,
+          "luceneQueryType": "Logs",
+          "metrics": [
+            {
+              "id": "1",
+              "type": "logs"
+            }
+          ],
+          "query": "log_level: INFO",
+          "queryType": "lucene",
+          "refId": "A",
+          "timeField": "@timestamp"
+        }
+      ],
+      "title": "Infos",
+      "transformations": [
+        {
+          "id": "filterFieldsByName",
+          "options": {
+            "include": {
+              "names": [
+                "@timestamp",
+                "message",
+                "log_logger",
+                "process_pid",
+                "process_thread_name",
+                "service_name",
+                "service_version",
+                "log_level"
+              ]
+            }
+          }
+        }
+      ],
+      "type": "logs"
+    }
+  ],
+  "preload": false,
+  "refresh": "5m",
+  "schemaVersion": 40,
+  "tags": [
+    "ui",
+    "dashboard",
+    "metadata",
+    "data",
+    "gateway",
+    "analyse",
+    "metrics",
+    "auth",
+    "search"
+  ],
+  "templating": {
+    "list": []
+  },
+  "time": {
+    "from": "now-30m",
+    "to": "now"
+  },
+  "timepicker": {},
+  "timezone": "browser",
+  "title": "Logging - Overview",
+  "uid": "aejhojr0mrpj4c",
+  "version": 1,
+  "weekStart": ""
+}
\ No newline at end of file
diff --git a/helm/dbrepo/files/mariadb.json b/helm/dbrepo/files/mariadb.json
index 3402ae51ddf74df0ea9d17da64719dcb8df7431c..b6297de19c2dcd0c179c49a8c616ab2f230caf6b 100644
--- a/helm/dbrepo/files/mariadb.json
+++ b/helm/dbrepo/files/mariadb.json
@@ -1366,12 +1366,12 @@
     ]
   },
   "time": {
-    "from": "now-24h",
+    "from": "now-3h",
     "to": "now"
   },
   "timepicker": {},
   "timezone": "",
-  "title": "Galera/MariaDB - Overview",
+  "title": "MariaDB Galera - Overview",
   "uid": "pXgz0qFGk",
   "version": 2
 }
\ No newline at end of file
diff --git a/helm/dbrepo/files/my.cnf b/helm/dbrepo/files/my.cnf
deleted file mode 100644
index 2798f37644d8b2b2691335277c50e41dcd295def..0000000000000000000000000000000000000000
--- a/helm/dbrepo/files/my.cnf
+++ /dev/null
@@ -1,125 +0,0 @@
-[client]
-port=3306
-socket=/opt/bitnami/mariadb/tmp/mysql.sock
-plugin_dir=/opt/bitnami/mariadb/plugin
-
-[mysqld]
-explicit_defaults_for_timestamp
-default_storage_engine=InnoDB
-basedir=/opt/bitnami/mariadb
-datadir=/bitnami/mariadb/data
-plugin_dir=/opt/bitnami/mariadb/plugin
-tmpdir=/opt/bitnami/mariadb/tmp
-socket=/opt/bitnami/mariadb/tmp/mysql.sock
-pid_file=/opt/bitnami/mariadb/tmp/mysqld.pid
-bind_address=0.0.0.0
-
-## Character set
-##
-collation_server=utf8_unicode_ci
-init_connect='SET NAMES utf8'
-character_set_server=utf8
-
-## MyISAM
-##
-key_buffer_size=32M
-myisam_recover_options=FORCE,BACKUP
-
-## Safety
-##
-skip_host_cache
-skip_name_resolve
-max_allowed_packet=16M
-max_connect_errors=1000000
-sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY
-sysdate_is_now=1
-
-## Binary Logging
-##
-log_bin=mysql-bin
-expire_logs_days=14
-# Disabling for performance per http://severalnines.com/blog/9-tips-going-production-galera-cluster-mysql
-sync_binlog=0
-# Required for Galera
-binlog_format=row
-
-## Caches and Limits
-##
-tmp_table_size=32M
-max_heap_table_size=32M
-# Re-enabling as now works with Maria 10.1.2
-query_cache_type=1
-query_cache_limit=4M
-query_cache_size=256M
-max_connections=500
-thread_cache_size=50
-open_files_limit=65535
-table_definition_cache=4096
-table_open_cache=4096
-
-## InnoDB
-##
-innodb=FORCE
-innodb_strict_mode=1
-# Mandatory per https://github.com/codership/documentation/issues/25
-innodb_autoinc_lock_mode=2
-# Per https://www.percona.com/blog/2006/08/04/innodb-double-write/
-innodb_doublewrite=1
-innodb_flush_method=O_DIRECT
-innodb_log_files_in_group=2
-innodb_log_file_size=128M
-innodb_flush_log_at_trx_commit=1
-innodb_file_per_table=1
-# 80% Memory is default reco.
-# Need to re-evaluate when DB size grows
-innodb_buffer_pool_size=1430M
-innodb_file_format=Barracuda
-
-## Logging
-##
-log_error=/opt/bitnami/mariadb/logs/mysqld.log
-slow_query_log_file=/opt/bitnami/mariadb/logs/mysqld.log
-log_queries_not_using_indexes=1
-slow_query_log=1
-
-## SSL
-## Use extraVolumes and extraVolumeMounts to mount /certs filesystem
-# ssl_ca=/certs/ca.pem
-# ssl_cert=/certs/server-cert.pem
-# ssl_key=/certs/server-key.pem
-
-[galera]
-wsrep_on=ON
-wsrep_provider=/opt/bitnami/mariadb/lib/libgalera_smm.so
-wsrep_sst_method=mariabackup
-wsrep_slave_threads=4
-wsrep_cluster_address=gcomm://
-wsrep_cluster_name=galera
-wsrep_sst_auth="root:"
-# Enabled for performance per https://mariadb.com/kb/en/innodb-system-variables/#innodb_flush_log_at_trx_commit
-innodb_flush_log_at_trx_commit=2
-# MYISAM REPLICATION SUPPORT #
-wsrep_mode=REPLICATE_MYISAM
-
-[mariadb]
-plugin_load_add=auth_pam
-
-## Data-at-Rest Encryption
-## Use extraVolumes and extraVolumeMounts to mount /encryption filesystem
-# plugin_load_add=file_key_management
-# file_key_management_filename=/encryption/keyfile.enc
-# file_key_management_filekey=FILE:/encryption/keyfile.key
-# file_key_management_encryption_algorithm=AES_CTR
-# encrypt_binlog=ON
-# encrypt_tmp_files=ON
-
-## InnoDB/XtraDB Encryption
-# innodb_encrypt_tables=ON
-# innodb_encrypt_temporary_tables=ON
-# innodb_encrypt_log=ON
-# innodb_encryption_threads=4
-# innodb_encryption_rotate_key_age=1
-
-## Aria Encryption
-# aria_encrypt_tables=ON
-# encrypt_tmp_disk_tables=ON
\ No newline at end of file
diff --git a/helm/dbrepo/files/rabbitmq.json b/helm/dbrepo/files/rabbitmq.json
index 99d810c39226c30aa8aa6e834971c67ef2a1ce1d..fbaaf04ba0f7b32f7da9a10ac3edbafab23f273a 100644
--- a/helm/dbrepo/files/rabbitmq.json
+++ b/helm/dbrepo/files/rabbitmq.json
@@ -8133,7 +8133,7 @@
     ]
   },
   "time": {
-    "from": "now-24h",
+    "from": "now-3h",
     "to": "now"
   },
   "timepicker": {
diff --git a/helm/dbrepo/hack/add-hosts.sh b/helm/dbrepo/hack/add-hosts.sh
deleted file mode 100755
index 93d1bbcb52c80ce3d3c173b4d458fd76489fde21..0000000000000000000000000000000000000000
--- a/helm/dbrepo/hack/add-hosts.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-cat /etc/hosts | grep "dbrepo.local"
-if [ "$?" -ne 0 ]; then
-  echo "$(minikube ip)  dbrepo.local" | sudo tee -a /etc/hosts
-fi
\ No newline at end of file
diff --git a/helm/dbrepo/hack/generate-rabbitmq-pw.sh b/helm/dbrepo/hack/generate-rabbitmq-pw.sh
deleted file mode 100755
index 4bccc93d7b0b9dc8a9e8b4116bcd6826f83f3f71..0000000000000000000000000000000000000000
--- a/helm/dbrepo/hack/generate-rabbitmq-pw.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/bash
-# https://stackoverflow.com/a/53175209/2634294
-# THIS SCRIPT REQUIRES xxd TO BE INSTALLED:
-#     DEBIAN: apt install xxd
-#     MACOS: brew install coreutils
-function encode_password()
-{
-    SALT=$(od -A n -t x -N 4 /dev/urandom)
-    PASS=$SALT$(echo -n $1 | xxd -ps | tr -d '\n' | tr -d ' ')
-    PASS=$(echo -n $PASS | xxd -r -p | sha256sum | head -c 128)
-    PASS=$(echo -n $SALT$PASS | xxd -r -p | base64 | tr -d '\n')
-    echo $PASS
-}
-encode_password $1
\ No newline at end of file
diff --git a/helm/dbrepo/hack/generate-tls-cert.sh b/helm/dbrepo/hack/generate-tls-cert.sh
deleted file mode 100755
index cfe69dfdb0e59f7c2b0895b63f4bf039e074c9e4..0000000000000000000000000000000000000000
--- a/helm/dbrepo/hack/generate-tls-cert.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-HOSTNAME="dbrepo.local"
-
-openssl genrsa -out ./tls/ca.key 2048
-openssl req -new -x509 -days 365 -key ./tls/ca.key -subj "/C=AT/O=Acme, Inc./CN=Acme Root CA" -out ./tls/ca.crt
-openssl req -newkey rsa:2048 -nodes -keyout ./tls/tls.key -subj "/C=AT/O=DBRepo/CN=${HOSTNAME}" -out ./tls/tls.csr
-openssl x509 -req -extfile <(printf "subjectAltName=DNS:${HOSTNAME},DNS:www.${HOSTNAME}") -days 365 -in ./tls/tls.csr \
-  -CA ./tls/ca.crt -CAkey ./tls/ca.key -CAcreateserial -out ./tls/tls.crt
\ No newline at end of file
diff --git a/helm/dbrepo/hack/install-cert-manager.sh b/helm/dbrepo/hack/install-cert-manager.sh
deleted file mode 100755
index 8b0569b733164132d0932e3e645e1fb025a3d84f..0000000000000000000000000000000000000000
--- a/helm/dbrepo/hack/install-cert-manager.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v${CERT_MANAGER_VERSION}/cert-manager.yaml
-if [ $? -ne 0 ]; then
-  echo "ERROR: Failed to install cert-manager" > /dev/stderr
-else
-  echo "SUCCESS: Installed cert-manager"
-fi
-cat <<EOF | kubectl apply -f -
-apiVersion: cert-manager.io/v1
-kind: ClusterIssuer
-metadata:
-  name: selfsigned-cluster-issuer
-spec:
-  selfSigned: {}
-EOF
diff --git a/helm/dbrepo/hack/install-seaweedfs.sh b/helm/dbrepo/hack/install-seaweedfs.sh
deleted file mode 100755
index 5842de8eafcb47bb163645b6a51a14e5ab140fd7..0000000000000000000000000000000000000000
--- a/helm/dbrepo/hack/install-seaweedfs.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-helm upgrade -n seaweedfs seaweedfs https://seaweedfs.github.io/seaweedfs-csi-driver/helm/seaweedfs-csi-driver-0.1.3.tgz \
-  --install --create-namespace
\ No newline at end of file
diff --git a/helm/dbrepo/hack/tls/.gitkeep b/helm/dbrepo/hack/tls/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/helm/dbrepo/templates/_helpers.tpl b/helm/dbrepo/templates/_helpers.tpl
index b58ad0e517c2d1e9ff34a89e3700c0505eafe3b0..b9b6534de6ebab17707d0f19124698fda0e524fd 100644
--- a/helm/dbrepo/templates/_helpers.tpl
+++ b/helm/dbrepo/templates/_helpers.tpl
@@ -61,6 +61,57 @@ Create the name of the service account to use
 {{- end }}
 {{- end }}
 
+{{/*
+Service configuration for the sidecar metrics
+*/}}
+{{- define "dbrepo.logging.sidecarOpensearchService" -}}
+[SERVICE]
+    Flush                       5
+    Daemon                      Off
+    Log_Level                   debug
+    Parsers_File                /opt/bitnami/fluent-bit/conf/parsers.conf
+{{- end -}}
+
+{{/*
+Input configuration for the sidecar metrics
+*/}}
+{{- define "dbrepo.logging.sidecarOpensearchInput" -}}
+[INPUT]
+    Name                        tail
+    Tag                         *
+    Path                        /var/log/app/service/*/*.log
+    Parser                      docker
+    Mem_Buf_Limit               5MB
+    Buffer_Chunk_size           32k
+    Buffer_Max_size             32k
+{{- end -}}
+
+{{/*
+Output configuration for the sidecar metrics
+*/}}
+{{- define "dbrepo.logging.sidecarOpensearchOutput" -}}
+[OUTPUT]
+    Name                        opensearch
+    Match                       *
+    Host                        search-db
+    Port                        9200
+    Index                       logging
+    Replace_Dots                On
+    Suppress_Type_Name          On
+    Trace_Error                 On
+{{- end -}}
+
+{{/*
+Output configuration for the sidecar metrics
+*/}}
+{{- define "dbrepo.logging.sidecarMetricsOutput" -}}
+[OUTPUT]
+    name                        prometheus_exporter
+    match                       internal_metrics
+    host                        0.0.0.0
+    port                        2021
+{{- end -}}
+
 {{/*
 Broker connections
 */}}
diff --git a/helm/dbrepo/templates/analyse-configmap.yaml b/helm/dbrepo/templates/analyse-configmap.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..45d4cb32219d114b9bec6e50e56a7f165ce93097
--- /dev/null
+++ b/helm/dbrepo/templates/analyse-configmap.yaml
@@ -0,0 +1,15 @@
+{{- if .Values.analyseservice.enabled }}
+{{- if .Values.global.loggingSidecar.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: analyse-service-config
+  namespace: {{ include "common.names.namespace" . | quote }}
+data:
+  fluent-bit.conf: |-
+    {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }}
+{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/helm/dbrepo/templates/analyse-deployment.yaml b/helm/dbrepo/templates/analyse-deployment.yaml
index d3e6b699c0b66e1100bdae7aab6a560380a6f19e..07f02ce9192b2ebcbaf1477378ee2435e1630546 100644
--- a/helm/dbrepo/templates/analyse-deployment.yaml
+++ b/helm/dbrepo/templates/analyse-deployment.yaml
@@ -18,6 +18,10 @@ spec:
       service: analyse-service
   template:
     metadata:
+      annotations:
+        {{- if .Values.analyseservice.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.analyseservice.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
       labels:
         app: analyse-service
         service: analyse-service
@@ -35,6 +39,9 @@ spec:
           ports:
             - containerPort: 8080
               protocol: TCP
+          volumeMounts:
+            - name: empty-dir
+              mountPath: /var/log/app/service/analyse
           envFrom:
             - secretRef:
                 name: analyse-service-secret
@@ -59,4 +66,37 @@ spec:
           {{- else if ne .Values.analyseservice.resourcesPreset "none" }}
           resources: {{- include "common.resources.preset" (dict "type" .Values.analyseservice.resourcesPreset) | nindent 12 }}
           {{- end }}
+        {{- if .Values.global.loggingSidecar.enabled }}
+        - name: logging-agent
+          image: {{ .Values.global.loggingSidecar.image.name }}
+          imagePullPolicy: {{ .Values.analyseservice.image.pullPolicy | default "IfNotPresent" }}
+          {{- if .Values.analyseservice.containerSecurityContext.enabled }}
+          securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.analyseservice.containerSecurityContext "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: logging-config
+              mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf
+              subPath: fluent-bit.conf
+            - name: empty-dir
+              mountPath: /var/log/app/service/analyse
+          livenessProbe:
+            httpGet:
+              port: 2021
+            initialDelaySeconds: 150
+            periodSeconds: 10
+          readinessProbe:
+            httpGet:
+              port: 2021
+            initialDelaySeconds: 30
+            periodSeconds: 10
+          resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }}
+        {{- end }}
+      volumes:
+        {{- if .Values.global.loggingSidecar.enabled }}
+        - name: logging-config
+          configMap:
+            name: analyse-service-config
+        {{- end }}
+        - name: empty-dir
+          emptyDir: {}
 {{- end }}
diff --git a/helm/dbrepo/templates/auth-configmap.yaml b/helm/dbrepo/templates/auth-configmap.yaml
index 8d8340bd9bb3db42e8a1385cdf4a0e631963f525..4e95365743d17062227c2095d745e92b8a04207f 100644
--- a/helm/dbrepo/templates/auth-configmap.yaml
+++ b/helm/dbrepo/templates/auth-configmap.yaml
@@ -8,19 +8,6 @@ binaryData:
   create-event-listener.jar: |-
     {{ .Files.Get "files/create-event-listener.jar" | b64enc }}
 data:
-  AUTH_SERVICE_ADMIN: "{{ .Values.authservice.auth.adminUser }}"
-  AUTH_SERVICE_ADMIN_PASSWORD: "{{ .Values.authservice.auth.adminPassword }}"
-  AUTH_SERVICE_ENDPOINT: "{{ .Values.authservice.endpoint }}"
-  KEYCLOAK_HOSTNAME: "{{ .Values.gateway }}"
-  LDAP_ROOT: "{{ .Values.identityservice.global.ldapDomain }}"
-  LDAP_ADMIN_DN: "cn={{ .Values.identityservice.global.adminUser }},{{ .Values.identityservice.global.ldapDomain }}"
-  LDAP_ADMIN_PASSWORD: "{{ .Values.identityservice.global.adminPassword }}"
-  METADATA_DB: "{{ .Values.metadatadb.db.name }}"
-  METADATA_DB_PASSWORD: "{{ .Values.metadatadb.rootUser.password }}"
-  METADATA_SERVICE_ENDPOINT: "{{ .Values.metadataservice.endpoint }}"
-  METADATA_USERNAME: "{{ .Values.metadatadb.rootUser.user }}"
-  SYSTEM_USERNAME: "{{ .Values.identityservice.users }}"
-  SYSTEM_PASSWORD: "{{ .Values.identityservice.userPasswords }}"
   {{ (.Files.Glob "files/dbrepo-realm.json").AsConfig | nindent 2 }}
   {{ (.Files.Glob "files/master-realm.json").AsConfig | nindent 2 }}
 {{- end }}
\ No newline at end of file
diff --git a/helm/dbrepo/templates/auth-secret.yaml b/helm/dbrepo/templates/auth-secret.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..da47194ddfd93d225242ed84df35802d42501ecf
--- /dev/null
+++ b/helm/dbrepo/templates/auth-secret.yaml
@@ -0,0 +1,26 @@
+{{- if .Values.authservice.enabled }}
+---
+apiVersion: v1
+kind: Secret
+metadata:
+  name: auth-service-secret
+  namespace: {{ include "common.names.namespace" . | quote }}
+stringData:
+  AUTH_SERVICE_ADMIN: "{{ .Values.authservice.auth.adminUser }}"
+  AUTH_SERVICE_ADMIN_PASSWORD: "{{ .Values.authservice.auth.adminPassword }}"
+  AUTH_SERVICE_ENDPOINT: "{{ .Values.authservice.endpoint }}"
+  KC_LOG: "console,file"
+  KC_LOG_FILE_JSON_FORMAT: "ecs"
+  KC_LOG_FILE_LEVEL: "debug"
+  KC_LOG_FILE_OUTPUT: "json"
+  KEYCLOAK_HOSTNAME: "{{ .Values.gateway }}"
+  LDAP_ROOT: "{{ .Values.identityservice.global.ldapDomain }}"
+  LDAP_ADMIN_DN: "cn={{ .Values.identityservice.global.adminUser }},{{ .Values.identityservice.global.ldapDomain }}"
+  LDAP_ADMIN_PASSWORD: "{{ .Values.identityservice.global.adminPassword }}"
+  METADATA_DB: "{{ .Values.metadatadb.db.name }}"
+  METADATA_DB_PASSWORD: "{{ .Values.metadatadb.rootUser.password }}"
+  METADATA_SERVICE_ENDPOINT: "{{ .Values.metadataservice.endpoint }}"
+  METADATA_USERNAME: "{{ .Values.metadatadb.rootUser.user }}"
+  SYSTEM_USERNAME: "{{ .Values.identityservice.users }}"
+  SYSTEM_PASSWORD: "{{ .Values.identityservice.userPasswords }}"
+{{- end }}
diff --git a/helm/dbrepo/templates/auth-job.yaml b/helm/dbrepo/templates/auth-setup-job.yaml
similarity index 80%
rename from helm/dbrepo/templates/auth-job.yaml
rename to helm/dbrepo/templates/auth-setup-job.yaml
index ca58e6a287cb97365b62fa4bec597ae8cb0ebab9..9b83684bf501402d5387b295eeab7b83869b2293 100644
--- a/helm/dbrepo/templates/auth-job.yaml
+++ b/helm/dbrepo/templates/auth-setup-job.yaml
@@ -16,6 +16,9 @@ spec:
         - name: init
           image: {{ .Values.authservice.setupJob.image.name }}
           imagePullPolicy: {{ .Values.authservice.setupJob.image.pullPolicy | default "IfNotPresent" }}
+          {{- if .Values.authservice.containerSecurityContext.enabled }}
+          securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.authservice.containerSecurityContext "context" $) | nindent 12 }}
+          {{- end }}
           env:
             - name: POD_IP
               valueFrom:
@@ -30,8 +33,8 @@ spec:
                 fieldRef:
                   fieldPath: metadata.namespace
           envFrom:
-            - configMapRef:
-                name: auth-service-config
+            - secretRef:
+                name: auth-service-secret
           {{- if .Values.authservice.setupJob.resources }}
           resources: {{- toYaml .Values.authservice.setupJob.resources | nindent 12 }}
           {{- else if ne .Values.authservice.setupJob.resourcesPreset "none" }}
diff --git a/helm/dbrepo/templates/broker-configmap.yaml b/helm/dbrepo/templates/broker-configmap.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..e39e2cebd1c5fa6b830ed31303774318f343dfb6
--- /dev/null
+++ b/helm/dbrepo/templates/broker-configmap.yaml
@@ -0,0 +1,41 @@
+{{- if .Values.brokerservice.enabled }}
+{{- if .Values.global.loggingSidecar.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: broker-service-config
+  namespace: {{ include "common.names.namespace" . | quote }}
+data:
+  fluent-bit.conf: |-
+    [SERVICE]
+        Flush                 5
+        Daemon                Off
+        Log_Level             debug
+        Parsers_File          /opt/bitnami/fluent-bit/conf/parsers.conf
+    [INPUT]
+        Name                  tail
+        Tag                   *
+        Path                  /opt/bitnami/rabbitmq/var/log/rabbitmq/*.log
+        Parser                rabbitmq
+        Mem_Buf_Limit         5MB
+        Buffer_Chunk_size     32k
+        Buffer_Max_size       32k
+    [FILTER]
+        Name                  modify
+        Match                 *
+        Rename                time @timestamp
+        Rename                level log.level
+        Rename                pid process.pid
+        Rename                msg message
+        Add                   service.name broker-service
+    {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }}
+  parsers.conf: |-
+    [PARSER]
+        Name                  rabbitmq
+        Format                json
+        Time_Key              time
+        Time_Format           %Y-%m-%d %H:%M:%S.%L
+        Time_Keep             On
+{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/helm/dbrepo/templates/dashboard-configmap.yaml b/helm/dbrepo/templates/dashboard-configmap.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..567878c48e500d7e432963e4cbbd1c3d8a7dfb23
--- /dev/null
+++ b/helm/dbrepo/templates/dashboard-configmap.yaml
@@ -0,0 +1,15 @@
+{{- if .Values.dashboardservice.enabled }}
+{{- if .Values.global.loggingSidecar.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: dashboard-service-config
+  namespace: {{ include "common.names.namespace" . | quote }}
+data:
+  fluent-bit.conf: |-
+    {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }}
+{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/helm/dbrepo/templates/dashboard-deployment.yaml b/helm/dbrepo/templates/dashboard-deployment.yaml
index f2c1a6fff16b55ada432db13abca7fb40f5d45e8..9671d4ddd5aaecc54fd867c164802c37c310f998 100644
--- a/helm/dbrepo/templates/dashboard-deployment.yaml
+++ b/helm/dbrepo/templates/dashboard-deployment.yaml
@@ -18,6 +18,10 @@ spec:
       service: dashboard-service
   template:
     metadata:
+      annotations:
+        {{- if .Values.dashboardservice.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.dashboardservice.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
       labels:
         app: dashboard-service
         service: dashboard-service
@@ -25,21 +29,6 @@ spec:
       {{- if .Values.dashboardservice.podSecurityContext.enabled }}
       securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.dashboardservice.podSecurityContext "context" $) | nindent 8 }}
       {{- end }}
-      initContainers:
-        - name: init
-          image: {{ .Values.dashboardservice.init.image.name }}
-          imagePullPolicy: {{ .Values.dashboardservice.init.image.pullPolicy | default "IfNotPresent" }}
-          {{- if .Values.dashboardservice.containerSecurityContext.enabled }}
-          securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.dashboardservice.containerSecurityContext "context" $) | nindent 12 }}
-          {{- end }}
-          envFrom:
-            - secretRef:
-                name: dashboard-service-secret
-          {{- if .Values.dashboardservice.init.resources }}
-          resources: {{- toYaml .Values.dashboardservice.init.resources | nindent 12 }}
-          {{- else if ne .Values.dashboardservice.init.resourcesPreset "none" }}
-          resources: {{- include "common.resources.preset" (dict "type" .Values.dashboardservice.init.resourcesPreset) | nindent 12 }}
-          {{- end }}
       containers:
         - name: dashboard-service
           image: {{ .Values.dashboardservice.image.name }}
@@ -50,6 +39,9 @@ spec:
           ports:
             - containerPort: 8080
               protocol: TCP
+          volumeMounts:
+            - name: empty-dir
+              mountPath: /var/log/app/service/dashboard
           envFrom:
             - secretRef:
                 name: dashboard-service-secret
@@ -74,4 +66,37 @@ spec:
           {{- else if ne .Values.dashboardservice.resourcesPreset "none" }}
           resources: {{- include "common.resources.preset" (dict "type" .Values.dashboardservice.resourcesPreset) | nindent 12 }}
           {{- end }}
+        {{- if .Values.global.loggingSidecar.enabled }}
+        - name: logging-agent
+          image: {{ .Values.global.loggingSidecar.image.name }}
+          imagePullPolicy: {{ .Values.dashboardservice.image.pullPolicy | default "IfNotPresent" }}
+          {{- if .Values.dashboardservice.containerSecurityContext.enabled }}
+          securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.dashboardservice.containerSecurityContext "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: logging-config
+              mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf
+              subPath: fluent-bit.conf
+            - name: empty-dir
+              mountPath: /var/log/app/service/dashboard
+          livenessProbe:
+            httpGet:
+              port: 2021
+            initialDelaySeconds: 150
+            periodSeconds: 10
+          readinessProbe:
+            httpGet:
+              port: 2021
+            initialDelaySeconds: 30
+            periodSeconds: 10
+          resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }}
+        {{- end }}
+      volumes:
+        {{- if .Values.global.loggingSidecar.enabled }}
+        - name: logging-config
+          configMap:
+            name: dashboard-service-config
+        {{- end }}
+        - name: empty-dir
+          emptyDir: { }
 {{- end }}
diff --git a/helm/dbrepo/templates/dashboard-setup-job.yaml b/helm/dbrepo/templates/dashboard-setup-job.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a12228661b6af4b1d0c3cb8700c017b0e5573399
--- /dev/null
+++ b/helm/dbrepo/templates/dashboard-setup-job.yaml
@@ -0,0 +1,49 @@
+{{- if .Values.dashboardservice.enabled }}
+---
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: dashboard-service-setup-job
+  namespace: {{ include "common.names.namespace" . | quote }}
+spec:
+  backoffLimit: {{ .Values.dashboardservice.setupJob.backoffLimit | default "10" }}
+  template:
+    metadata:
+      name: auth-service-setup-job
+    spec:
+      restartPolicy: OnFailure
+      containers:
+        - name: init
+          image: {{ .Values.dashboardservice.setupJob.image.name }}
+          imagePullPolicy: {{ .Values.dashboardservice.setupJob.image.pullPolicy | default "IfNotPresent" }}
+          {{- if .Values.dashboardservice.containerSecurityContext.enabled }}
+          securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.dashboardservice.containerSecurityContext "context" $) | nindent 12 }}
+          {{- end }}
+          env:
+            - name: POD_IP
+              valueFrom:
+                fieldRef:
+                  fieldPath: status.podIP
+            - name: POD_NAME
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.name
+            - name: NAMESPACE
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.namespace
+          envFrom:
+            - secretRef:
+                name: dashboard-service-secret
+          volumeMounts:
+            - name: empty-dir
+              mountPath: /var/log/app/service/dashboard
+          {{- if .Values.dashboardservice.setupJob.resources }}
+          resources: {{- toYaml .Values.dashboardservice.setupJob.resources | nindent 12 }}
+          {{- else if ne .Values.dashboardservice.setupJob.resourcesPreset "none" }}
+          resources: {{- include "common.resources.preset" (dict "type" .Values.dashboardservice.setupJob.resourcesPreset) | nindent 12 }}
+          {{- end }}
+      volumes:
+        - name: empty-dir
+          emptyDir: { }
+{{- end }}
diff --git a/helm/dbrepo/templates/dashboard-ui-configmap.yaml b/helm/dbrepo/templates/dashboard-ui-configmap.yaml
index ba15e681d234c08a2a7fb8921964ad2a54c1fb7a..9fe92bc9e2aca14e59805388e4a723d85593d5fd 100644
--- a/helm/dbrepo/templates/dashboard-ui-configmap.yaml
+++ b/helm/dbrepo/templates/dashboard-ui-configmap.yaml
@@ -6,8 +6,9 @@ metadata:
   name: dashboard-ui-config
   namespace: {{ include "common.names.namespace" . | quote }}
 data:
-  {{ (.Files.Glob "files/mariadb.json").AsConfig | nindent 2 }}
-  {{ (.Files.Glob "files/rabbitmq.json").AsConfig | nindent 2 }}
   {{ (.Files.Glob "files/dbrepo.json").AsConfig | nindent 2 }}
   {{ (.Files.Glob "files/keycloak.json").AsConfig | nindent 2 }}
+  {{ (.Files.Glob "files/logging.json").AsConfig | nindent 2 }}
+  {{ (.Files.Glob "files/mariadb.json").AsConfig | nindent 2 }}
+  {{ (.Files.Glob "files/rabbitmq.json").AsConfig | nindent 2 }}
 {{- end }}
diff --git a/helm/dbrepo/templates/dashboard-ui-datasources-secret.yaml b/helm/dbrepo/templates/dashboard-ui-datasources-secret.yaml
index 5ce6c299e9094bb14500df16ad53e428034a4e33..8a21a20db8dd41dad8f36174cf23ca5420562a60 100644
--- a/helm/dbrepo/templates/dashboard-ui-datasources-secret.yaml
+++ b/helm/dbrepo/templates/dashboard-ui-datasources-secret.yaml
@@ -30,4 +30,18 @@ stringData:
         type: prometheus
         uid: dbrepometrics0
         url: http://metric-db-server
+  opensearch.yaml: |-
+    apiVersion: 1
+    datasources:
+      - name: dbrepo-opensearch
+        uid: dbrepoopensearch0
+        type: grafana-opensearch-datasource
+        basicAuth: false
+        url: http://search-db:9200
+        jsonData:
+          flavor: "opensearch"
+          logLevelField: "level"
+          logMessageField: "message"
+          timeField: "@timestamp"
+          version: "2.19.0"
 {{- end }}
diff --git a/helm/dbrepo/templates/data-configmap.yaml b/helm/dbrepo/templates/data-configmap.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..8d9d4b6334a90101e8c348afe6c1c8243697bdcf
--- /dev/null
+++ b/helm/dbrepo/templates/data-configmap.yaml
@@ -0,0 +1,15 @@
+{{- if .Values.dataservice.enabled }}
+{{- if .Values.global.loggingSidecar.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: data-service-config
+  namespace: {{ include "common.names.namespace" . | quote }}
+data:
+  fluent-bit.conf: |-
+    {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }}
+{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/helm/dbrepo/templates/data-deployment.yaml b/helm/dbrepo/templates/data-deployment.yaml
index 7e77d2020e39a877b6d0165452adcf25f2b34eba..6a2a1be15eff868a283fb973856a58cc7f3d3b01 100644
--- a/helm/dbrepo/templates/data-deployment.yaml
+++ b/helm/dbrepo/templates/data-deployment.yaml
@@ -18,6 +18,10 @@ spec:
       service: data-service
   template:
     metadata:
+      annotations:
+        {{- if .Values.dataservice.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.dataservice.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
       labels:
         app: data-service
         service: data-service
@@ -35,6 +39,9 @@ spec:
           ports:
             - containerPort: 8080
               protocol: TCP
+          volumeMounts:
+            - name: empty-dir
+              mountPath: /var/log/app/service/data
           envFrom:
             - secretRef:
                 name: data-service-secret
@@ -59,4 +66,37 @@ spec:
           {{- else if ne .Values.dataservice.resourcesPreset "none" }}
           resources: {{- include "common.resources.preset" (dict "type" .Values.dataservice.resourcesPreset) | nindent 12 }}
           {{- end }}
+        {{- if .Values.global.loggingSidecar.enabled }}
+        - name: logging-agent
+          image: {{ .Values.global.loggingSidecar.image.name }}
+          imagePullPolicy: {{ .Values.metadataservice.image.pullPolicy | default "IfNotPresent" }}
+          {{- if .Values.metadataservice.containerSecurityContext.enabled }}
+          securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.metadataservice.containerSecurityContext "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: logging-config
+              mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf
+              subPath: fluent-bit.conf
+            - name: empty-dir
+              mountPath: /var/log/app/service/data
+          livenessProbe:
+            httpGet:
+              port: 2021
+            initialDelaySeconds: 150
+            periodSeconds: 10
+          readinessProbe:
+            httpGet:
+              port: 2021
+            initialDelaySeconds: 30
+            periodSeconds: 10
+          resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }}
+        {{- end }}
+      volumes:
+        {{- if .Values.global.loggingSidecar.enabled }}
+        - name: logging-config
+          configMap:
+            name: data-service-config
+        {{- end }}
+        - name: empty-dir
+          emptyDir: { }
 {{- end }}
diff --git a/helm/dbrepo/templates/gateway-configmap.yaml b/helm/dbrepo/templates/gateway-configmap.yaml
index 3f500f0d9b0683e427e86a45a6d988900b5d9cbd..e92ccaab9a23b78c21c65a0e63419cb1bf34c281 100644
--- a/helm/dbrepo/templates/gateway-configmap.yaml
+++ b/helm/dbrepo/templates/gateway-configmap.yaml
@@ -1,201 +1,22 @@
 {{- if .Values.gatewayservice.enabled }}
+{{- if .Values.global.loggingSidecar.enabled }}
 apiVersion: v1
 kind: ConfigMap
 metadata:
   name: gateway-service-config
   namespace: {{ include "common.names.namespace" . | quote }}
 data:
-  dbrepo.conf: |-
-    # This is required to proxy Grafana Live WebSocket connections.
-    map $http_upgrade $connection_upgrade {
-      default upgrade;
-      '' close;
-    }
-
-    proxy_buffer_size        128k;
-    proxy_buffers       4    256k;
-    proxy_busy_buffers_size  256k;
-
-    server {
-        listen 8080 default_server;
-        server_name _;
-
-        location /assets/ {
-            root                    /app/assets;
-            expires                 max;
-            access_log              off;
-            autoindex               on;
-            autoindex_exact_size    off;
-            autoindex_format        html;
-            autoindex_localtime     on;
-        }
-
-        location /dashboard/ {
-            proxy_set_header        Host $http_host;
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://dashboard-ui:3000/;
-            proxy_read_timeout      90;
-        }
-
-        # Proxy Grafana Live WebSocket connections.
-        location /dashboard/api/live/ws {
-            rewrite  ^/dashboard/(.*)  /$1 break;
-            proxy_set_header        Host $http_host;
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_set_header        Upgrade $http_upgrade;
-            proxy_set_header        Connection $connection_upgrade;
-            proxy_http_version      1.1;
-            proxy_pass              http://dashboard-ui:3000/;
-            proxy_read_timeout      90;
-        }
-
-        # Proxy Keycloak OIDC connections, c.f. https://www.keycloak.org/server/reverseproxy#_exposed_path_recommendations
-        location /realms {
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://auth-service;
-            proxy_read_timeout      90;
-        }
-
-        # Proxy Keycloak assets, c.f. https://www.keycloak.org/server/reverseproxy#_exposed_path_recommendations
-        location /resources {
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://auth-service;
-            proxy_read_timeout      90;
-        }
-
-        location /api/search {
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://search-service;
-            proxy_read_timeout      90;
-        }
-
-        location /api/datasource {
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://dashboard-service;
-            proxy_read_timeout      90;
-        }
-
-        location /api/dashboard {
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://dashboard-service;
-            proxy_read_timeout      90;
-        }
-
-        location /api/upload {
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_pass              http://data-service;
-            proxy_read_timeout      90;
-            # Disable request and response buffering
-            proxy_request_buffering off;
-            proxy_buffering         off;
-            proxy_http_version      1.1;
-        }
-
-        location /api/analyse {
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://analyse-service;
-            proxy_read_timeout      90;
-        }
-
-        location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/table/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/(data|statistic|history)" {
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://data-service;
-            proxy_read_timeout      90;
-        }
-
-        location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/view/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/(data|statistic)" {
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://data-service;
-            proxy_read_timeout      90;
-        }
-
-        location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/view" {
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://metadata-service;
-            proxy_read_timeout      90;
-        }
-
-        location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/subset" {
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://data-service;
-            proxy_read_timeout      600;
-        }
-
-        location ~ "/api/(database|concept|container|identifier|image|message|license|oai|ontology|unit|user)" {
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://metadata-service;
-            proxy_read_timeout      90;
-        }
-
-        location ~ "/api/identifier/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})" {
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://metadata-service;
-            proxy_read_timeout      90;
-        }
-
-        location ~ "/pid/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})" {
-            rewrite /pid/(.*) /api/identifier/$1 break;
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://metadata-service;
-            proxy_read_timeout      90;
-        }
-
-        location / {
-            proxy_set_header        X-Real-IP $remote_addr;
-            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
-            proxy_set_header        X-Forwarded-Host $host;
-            proxy_set_header        X-Forwarded-Proto $scheme;
-            proxy_pass              http://ui;
-            proxy_read_timeout      90;
-        }
-    }
+  fluent-bit.conf: |-
+    {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }}
+    [INPUT]
+        Name                  tail
+        Tag                   *
+        Path                  /var/log/nginx/*.log
+        Parser                docker
+        Mem_Buf_Limit         5MB
+        Buffer_Chunk_size     32k
+        Buffer_Max_size       32k
+    {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }}
+{{- end }}
 {{- end }}
\ No newline at end of file
diff --git a/helm/dbrepo/templates/gateway-serverblock-configmap.yaml b/helm/dbrepo/templates/gateway-serverblock-configmap.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..2a50958d9d7edf6c78322fd0299e41b14df43e53
--- /dev/null
+++ b/helm/dbrepo/templates/gateway-serverblock-configmap.yaml
@@ -0,0 +1,9 @@
+{{- if .Values.gatewayservice.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: gateway-service-setup
+  namespace: {{ include "common.names.namespace" . | quote }}
+data:
+  {{ (.Files.Glob "files/dbrepo.conf").AsConfig | nindent 2 }}
+{{- end }}
\ No newline at end of file
diff --git a/helm/dbrepo/templates/identity-statefulset.yaml b/helm/dbrepo/templates/identity-statefulset.yaml
index 57b3dd7c328b6cc24caf2df59c1bde970065c26d..4c1d9b3f29a66e55af1738fd1050ebf56b3a1510 100644
--- a/helm/dbrepo/templates/identity-statefulset.yaml
+++ b/helm/dbrepo/templates/identity-statefulset.yaml
@@ -16,6 +16,10 @@ spec:
       service: identity-service
   template:
     metadata:
+      annotations:
+        {{- if .Values.identityservice.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.identityservice.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
       labels:
         app: identity-service
         service: identity-service
diff --git a/helm/dbrepo/templates/metadata-configmap.yaml b/helm/dbrepo/templates/metadata-configmap.yaml
index e837c8072ada18d0bb9a364456834bfaecc3e697..4d4960aa62bad21dcccdbc26039e4b8f6bfa4e5d 100644
--- a/helm/dbrepo/templates/metadata-configmap.yaml
+++ b/helm/dbrepo/templates/metadata-configmap.yaml
@@ -1,24 +1,15 @@
-{{- if .Values.metadatadb.enabled }}
----
+{{- if .Values.metadataservice.enabled }}
+{{- if .Values.global.loggingSidecar.enabled }}
 apiVersion: v1
 kind: ConfigMap
 metadata:
-  name: metadata-db-config
+  name: metadata-service-config
   namespace: {{ include "common.names.namespace" . | quote }}
 data:
-  {{- with .Values.metadatadb.extraInitDbScripts }}
-  {{ toYaml . | nindent 2 }}
-  {{- end }}
-  {{ (.Files.Glob "files/01-setup-schema.sql").AsConfig | nindent 2 }}
-  02-setup-data.sql: |-
-    BEGIN;
-    INSERT INTO `mdb_containers` (id, name, internal_name, image_id, host, port, ui_host, ui_port, privileged_username,
-                                  privileged_password, readonly_username, readonly_password)
-    VALUES ('6cfb3b8e-1792-4e46-871a-f3d103527203', 'mariadb:11.1.3-debian-11-r6', 'mariadb_11_1_3',
-            'd79cb089-363c-488b-9717-649e44d8fcc5', 'data-db', {{ .Values.datadb.containerPorts.mysql  }},
-            '{{ .Values.hostname }}', {{ .Values.datadb.containerPorts.mysql  }}, '{{ .Values.datadb.rootUser.user }}',
-            '{{ .Values.datadb.rootUser.password }}', '{{ .Values.datadb.db.user }}',
-            '{{ .Values.datadb.db.password }}');
-    COMMIT;
-  {{ (.Files.Glob "files/my.cnf").AsConfig | nindent 2 }}
+  fluent-bit.conf: |-
+    {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }}
 {{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/helm/dbrepo/templates/metadata-db-configmap.yaml b/helm/dbrepo/templates/metadata-db-configmap.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..09fa8a566157890d788d661228fe45620eb83436
--- /dev/null
+++ b/helm/dbrepo/templates/metadata-db-configmap.yaml
@@ -0,0 +1,23 @@
+{{- if .Values.metadatadb.enabled }}
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: metadata-db-config
+  namespace: {{ include "common.names.namespace" . | quote }}
+data:
+  {{- with .Values.metadatadb.extraInitDbScripts }}
+  {{ toYaml . | nindent 2 }}
+  {{- end }}
+  {{ (.Files.Glob "files/01-setup-schema.sql").AsConfig | nindent 2 }}
+  02-setup-data.sql: |-
+    BEGIN;
+    INSERT INTO `mdb_containers` (id, name, internal_name, image_id, host, port, ui_host, ui_port, privileged_username,
+                                  privileged_password, readonly_username, readonly_password)
+    VALUES ('6cfb3b8e-1792-4e46-871a-f3d103527203', 'mariadb:11.1.3-debian-11-r6', 'mariadb_11_1_3',
+            'd79cb089-363c-488b-9717-649e44d8fcc5', 'data-db', {{ .Values.datadb.containerPorts.mysql  }},
+            '{{ .Values.hostname }}', {{ .Values.datadb.containerPorts.mysql  }}, '{{ .Values.datadb.rootUser.user }}',
+            '{{ .Values.datadb.rootUser.password }}', '{{ .Values.datadb.db.user }}',
+            '{{ .Values.datadb.db.password }}');
+    COMMIT;
+{{- end }}
diff --git a/helm/dbrepo/templates/metadata-deployment.yaml b/helm/dbrepo/templates/metadata-deployment.yaml
index f5f27378e1d88c2ee59743a5d2dbbcbe110e0235..c175341703aff14dd07b76b6e9753442d42d2409 100644
--- a/helm/dbrepo/templates/metadata-deployment.yaml
+++ b/helm/dbrepo/templates/metadata-deployment.yaml
@@ -18,6 +18,10 @@ spec:
       service: metadata-service
   template:
     metadata:
+      annotations:
+        {{- if .Values.metadataservice.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.metadataservice.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
       labels:
         app: metadata-service
         service: metadata-service
@@ -35,6 +39,9 @@ spec:
           ports:
             - containerPort: 8080
               protocol: TCP
+          volumeMounts:
+            - name: empty-dir
+              mountPath: /var/log/app/service/metadata
           envFrom:
             - secretRef:
                 name: metadata-service-secret
@@ -59,4 +66,37 @@ spec:
           {{- else if ne .Values.metadataservice.resourcesPreset "none" }}
           resources: {{- include "common.resources.preset" (dict "type" .Values.metadataservice.resourcesPreset) | nindent 12 }}
           {{- end }}
+        {{- if .Values.global.loggingSidecar.enabled }}
+        - name: logging-agent
+          image: {{ .Values.global.loggingSidecar.image.name }}
+          imagePullPolicy: {{ .Values.metadataservice.image.pullPolicy | default "IfNotPresent" }}
+          {{- if .Values.metadataservice.containerSecurityContext.enabled }}
+          securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.metadataservice.containerSecurityContext "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: logging-config
+              mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf
+              subPath: fluent-bit.conf
+            - name: empty-dir
+              mountPath: /var/log/app/service/metadata
+          livenessProbe:
+            httpGet:
+              port: 2021
+            initialDelaySeconds: 150
+            periodSeconds: 10
+          readinessProbe:
+            httpGet:
+              port: 2021
+            initialDelaySeconds: 30
+            periodSeconds: 10
+          resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }}
+        {{- end }}
+      volumes:
+        {{- if .Values.global.loggingSidecar.enabled }}
+        - name: logging-config
+          configMap:
+            name: metadata-service-config
+        {{- end }}
+        - name: empty-dir
+          emptyDir: { }
 {{- end }}
diff --git a/helm/dbrepo/templates/metadata-setup-configmap.yaml b/helm/dbrepo/templates/metadata-setup-configmap.yaml
deleted file mode 100644
index 608f1d13e162665464faeaf3eaa789834f6a8429..0000000000000000000000000000000000000000
--- a/helm/dbrepo/templates/metadata-setup-configmap.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-{{- if .Values.metadatadb.enabled }}
----
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: metadata-db-setup
-  namespace: {{ include "common.names.namespace" . | quote }}
-data:
-  {{- with .Values.metadatadb.extraInitDbScripts }}
-  {{ toYaml . | nindent 2 }}
-  {{- end }}
-  {{ (.Files.Glob "files/01-setup-schema.sql").AsConfig | nindent 2 }}
-  02-setup-data.sql: |
-    BEGIN;
-    INSERT INTO `mdb_containers` (name, internal_name, image_id, host, port, privileged_username, privileged_password)
-    VALUES ('mariadb-galera:11.3.2-debian-12-r9', 'mariadb-galera:11.3.2-debian-12-r9', 1, 'data-db', 3306, '{{ .Values.datadb.rootUser.user }}', '{{ .Values.datadb.rootUser.password }}');
-    COMMIT;
-  {{ (.Files.Glob "files/my.cnf").AsConfig | nindent 2 }}
-{{- end }}
diff --git a/helm/dbrepo/templates/search-configmap.yaml b/helm/dbrepo/templates/search-configmap.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..407d7ee90ec6a297b0be728eaba6a68ec22b9b1a
--- /dev/null
+++ b/helm/dbrepo/templates/search-configmap.yaml
@@ -0,0 +1,15 @@
+{{- if .Values.searchservice.enabled }}
+{{- if .Values.global.loggingSidecar.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: search-service-config
+  namespace: {{ include "common.names.namespace" . | quote }}
+data:
+  fluent-bit.conf: |-
+    {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }}
+{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/helm/dbrepo/templates/search-deployment.yaml b/helm/dbrepo/templates/search-deployment.yaml
index 98908f0c4202f31fdbf9e0915a1eeaea866193ad..cdaddbafe0283cdeaf7c12df929c5b9bdf915f81 100644
--- a/helm/dbrepo/templates/search-deployment.yaml
+++ b/helm/dbrepo/templates/search-deployment.yaml
@@ -18,6 +18,10 @@ spec:
       service: search-service
   template:
     metadata:
+      annotations:
+        {{- if .Values.searchservice.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.searchservice.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
       labels:
         app: search-service
         service: search-service
@@ -25,21 +29,6 @@ spec:
       {{- if .Values.searchservice.podSecurityContext.enabled }}
       securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.searchservice.podSecurityContext "context" $) | nindent 8 }}
       {{- end }}
-      initContainers:
-        - name: init
-          image: {{ .Values.searchservice.init.image.name }}
-          imagePullPolicy: {{ .Values.searchservice.init.image.pullPolicy | default "IfNotPresent" }}
-          {{- if .Values.searchservice.containerSecurityContext.enabled }}
-          securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.searchservice.containerSecurityContext "context" $) | nindent 12 }}
-          {{- end }}
-          envFrom:
-            - secretRef:
-                name: search-service-secret
-          {{- if .Values.searchservice.init.resources }}
-          resources: {{- toYaml .Values.searchservice.init.resources | nindent 12 }}
-          {{- else if ne .Values.searchservice.init.resourcesPreset "none" }}
-          resources: {{- include "common.resources.preset" (dict "type" .Values.searchservice.init.resourcesPreset) | nindent 12 }}
-          {{- end }}
       containers:
         - name: search-service
           image: {{ .Values.searchservice.image.name }}
@@ -54,8 +43,10 @@ spec:
             - secretRef:
                 name: search-service-secret
           volumeMounts:
-            - mountPath: /tmp
-              name: cache
+            - name: empty-dir
+              mountPath: /tmp
+            - name: empty-dir
+              mountPath: /var/log/app/service/search
           livenessProbe:
             exec:
               command:
@@ -77,8 +68,37 @@ spec:
           {{- else if ne .Values.searchservice.resourcesPreset "none" }}
           resources: {{- include "common.resources.preset" (dict "type" .Values.searchservice.resourcesPreset) | nindent 12 }}
           {{- end }}
+        {{- if .Values.global.loggingSidecar.enabled }}
+        - name: logging-agent
+          image: {{ .Values.global.loggingSidecar.image.name }}
+          imagePullPolicy: {{ .Values.searchservice.image.pullPolicy | default "IfNotPresent" }}
+          {{- if .Values.searchservice.containerSecurityContext.enabled }}
+          securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.searchservice.containerSecurityContext "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: logging-config
+              mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf
+              subPath: fluent-bit.conf
+            - name: empty-dir
+              mountPath: /var/log/app/service/search
+          livenessProbe:
+            httpGet:
+              port: 2021
+            initialDelaySeconds: 150
+            periodSeconds: 10
+          readinessProbe:
+            httpGet:
+              port: 2021
+            initialDelaySeconds: 30
+            periodSeconds: 10
+          resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }}
+        {{- end }}
       volumes:
-        - name: cache
-          emptyDir:
-            sizeLimit: 100Mi
+        {{- if .Values.global.loggingSidecar.enabled }}
+        - name: logging-config
+          configMap:
+            name: search-service-config
+        {{- end }}
+        - name: empty-dir
+          emptyDir: { }
 {{- end }}
diff --git a/helm/dbrepo/templates/search-setup-job.yaml b/helm/dbrepo/templates/search-setup-job.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..4c01e19e0f54378f699be94627d63d96a10fd632
--- /dev/null
+++ b/helm/dbrepo/templates/search-setup-job.yaml
@@ -0,0 +1,49 @@
+{{- if .Values.searchservice.enabled }}
+---
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: search-service-setup-job
+  namespace: {{ include "common.names.namespace" . | quote }}
+spec:
+  backoffLimit: {{ .Values.searchservice.setupJob.backoffLimit | default "10" }}
+  template:
+    metadata:
+      name: search-service-setup-job
+    spec:
+      restartPolicy: OnFailure
+      containers:
+        - name: init
+          image: {{ .Values.searchservice.setupJob.image.name }}
+          imagePullPolicy: {{ .Values.searchservice.setupJob.image.pullPolicy | default "IfNotPresent" }}
+          {{- if .Values.searchservice.containerSecurityContext.enabled }}
+          securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.searchservice.containerSecurityContext "context" $) | nindent 12 }}
+          {{- end }}
+          env:
+            - name: POD_IP
+              valueFrom:
+                fieldRef:
+                  fieldPath: status.podIP
+            - name: POD_NAME
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.name
+            - name: NAMESPACE
+              valueFrom:
+                fieldRef:
+                  fieldPath: metadata.namespace
+          envFrom:
+            - secretRef:
+                name: search-service-secret
+          volumeMounts:
+            - name: empty-dir
+              mountPath: /var/log/app/service/search
+          {{- if .Values.searchservice.setupJob.resources }}
+          resources: {{- toYaml .Values.searchservice.setupJob.resources | nindent 12 }}
+          {{- else if ne .Values.searchservice.setupJob.resourcesPreset "none" }}
+          resources: {{- include "common.resources.preset" (dict "type" .Values.searchservice.setupJob.resourcesPreset) | nindent 12 }}
+          {{- end }}
+      volumes:
+        - name: empty-dir
+          emptyDir: { }
+{{- end }}
diff --git a/helm/dbrepo/templates/storage-configmap.yaml b/helm/dbrepo/templates/storage-configmap.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..c3d2469e069e029ec4f1efef8fa3cce190d466c0
--- /dev/null
+++ b/helm/dbrepo/templates/storage-configmap.yaml
@@ -0,0 +1,26 @@
+{{- if .Values.storageservice.setupJob.enabled }}
+{{- if .Values.global.loggingSidecar.enabled }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: storage-service-config
+  namespace: {{ include "common.names.namespace" . | quote }}
+data:
+  fluent-bit.conf: |-
+    [SERVICE]
+        Flush                 5
+        Daemon                Off
+        Log_Level             debug
+        Parsers_File          /opt/bitnami/fluent-bit/conf/parsers.conf
+    [INPUT]
+        Name                  tail
+        Tag                   *
+        Path                  /var/log/app/service/*/*.log
+        Parser                docker
+        Mem_Buf_Limit         5MB
+        Buffer_Chunk_size     32k
+        Buffer_Max_size       32k
+    {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }}
+    {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }}
+{{- end }}
+{{- end }}
\ No newline at end of file
diff --git a/helm/dbrepo/templates/storage-secret.yaml b/helm/dbrepo/templates/storage-secret.yaml
index 452baecbf9480295e86fcc3975ab62996431f52c..7df792fc4bd371571ec168250f64e5dce749c690 100644
--- a/helm/dbrepo/templates/storage-secret.yaml
+++ b/helm/dbrepo/templates/storage-secret.yaml
@@ -7,7 +7,7 @@ metadata:
   namespace: {{ include "common.names.namespace" . | quote }}
 stringData:
   S3_BUCKET: "{{ .Values.storageservice.s3.bucket }}"
-  STORAGE_ENDPOINT: "{{ .Values.storageservice.init.s3.endpoint }}"
+  STORAGE_ENDPOINT: "{{ .Values.storageservice.setupJob.s3.endpoint }}"
   admin_access_key_id: "{{ .Values.storageservice.s3.auth.adminAccessKeyId }}"
   admin_secret_access_key: "{{ .Values.storageservice.s3.auth.adminSecretAccessKey }}"
   read_access_key_id: "{{ .Values.storageservice.s3.auth.readAccessKeyId }}"
diff --git a/helm/dbrepo/templates/storage-job.yaml b/helm/dbrepo/templates/storage-setup-job.yaml
similarity index 71%
rename from helm/dbrepo/templates/storage-job.yaml
rename to helm/dbrepo/templates/storage-setup-job.yaml
index ebc26f22125a10e94d910e0b385729b10b0c3c19..69845b1846deed121c66587413d611ba834b6d9d 100644
--- a/helm/dbrepo/templates/storage-job.yaml
+++ b/helm/dbrepo/templates/storage-setup-job.yaml
@@ -6,7 +6,7 @@ metadata:
   name: storage-service-setup-job
   namespace: {{ include "common.names.namespace" . | quote }}
 spec:
-  backoffLimit: {{ .Values.storageservice.init.backoffLimit | default "10" }}
+  backoffLimit: {{ .Values.storageservice.setupJob.backoffLimit | default "10" }}
   template:
     metadata:
       name: storage-service-setup-job
@@ -14,8 +14,8 @@ spec:
       restartPolicy: OnFailure
       containers:
         - name: init
-          image: {{ .Values.storageservice.init.image.name }}
-          imagePullPolicy: {{ .Values.storageservice.init.image.pullPolicy | default "IfNotPresent" }}
+          image: {{ .Values.storageservice.setupJob.image.name }}
+          imagePullPolicy: {{ .Values.storageservice.setupJob.image.pullPolicy | default "IfNotPresent" }}
           env:
             - name: POD_IP
               valueFrom:
@@ -50,14 +50,14 @@ spec:
                   name: storage-service-secret
                   key: STORAGE_ENDPOINT
           volumeMounts:
-            - name: app-cache
+            - name: empty-dir
               mountPath: /app/config
-          {{- if .Values.storageservice.init.resources }}
-          resources: {{- toYaml .Values.storageservice.init.resources | nindent 12 }}
-          {{- else if ne .Values.storageservice.init.resourcesPreset "none" }}
-          resources: {{- include "common.resources.preset" (dict "type" .Values.storageservice.init.resourcesPreset) | nindent 12 }}
+          {{- if .Values.storageservice.setupJob.resources }}
+          resources: {{- toYaml .Values.storageservice.setupJob.resources | nindent 12 }}
+          {{- else if ne .Values.storageservice.setupJob.resourcesPreset "none" }}
+          resources: {{- include "common.resources.preset" (dict "type" .Values.storageservice.setupJob.resourcesPreset) | nindent 12 }}
           {{- end }}
       volumes:
-        - name: app-cache
-          emptyDir: {}
+        - name: empty-dir
+          emptyDir: { }
 {{- end }}
diff --git a/helm/dbrepo/templates/ui-deployment.yaml b/helm/dbrepo/templates/ui-deployment.yaml
index 512b3f403f8f18a4949de2c6b8d835f894da46a9..32e2f5905ff9e955a2ca93fafb7824b83b49d969 100644
--- a/helm/dbrepo/templates/ui-deployment.yaml
+++ b/helm/dbrepo/templates/ui-deployment.yaml
@@ -18,6 +18,10 @@ spec:
       service: ui
   template:
     metadata:
+      annotations:
+        {{- if .Values.ui.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.ui.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
       labels:
         app: ui
         service: ui
diff --git a/helm/dbrepo/templates/ui-service.yaml b/helm/dbrepo/templates/ui-service.yaml
index 1ec140db603c075948b18cf933e2f5f322ac6aae..1f4fc63a133f0b3a2cab0241062e07d558270548 100644
--- a/helm/dbrepo/templates/ui-service.yaml
+++ b/helm/dbrepo/templates/ui-service.yaml
@@ -11,7 +11,7 @@ spec:
   type: ClusterIP
   ports:
     - name: ""
-      port: 80
+      port: 3000
       targetPort: 3000
       protocol: TCP
   selector:
diff --git a/helm/dbrepo/values.schema.json b/helm/dbrepo/values.schema.json
index bd549d45cdecbd222353e809b8bcb20defba5c61..141dd1b385a6c05c1b94006223093b92eb8d15be 100644
--- a/helm/dbrepo/values.schema.json
+++ b/helm/dbrepo/values.schema.json
@@ -63,6 +63,10 @@
                     },
                     "type": "object"
                 },
+                "podAnnotations": {
+                    "properties": {},
+                    "type": "object"
+                },
                 "podSecurityContext": {
                     "properties": {
                         "enabled": {
@@ -126,7 +130,7 @@
                 "endpoint": {
                     "type": "string"
                 },
-                "extraEnvVarsCM": {
+                "extraEnvVarsSecret": {
                     "type": "string"
                 },
                 "extraVolumeMounts": {
@@ -157,14 +161,6 @@
                                 },
                                 "type": "object"
                             },
-                            "emptyDir": {
-                                "properties": {
-                                    "sizeLimit": {
-                                        "type": "string"
-                                    }
-                                },
-                                "type": "object"
-                            },
                             "name": {
                                 "type": "string"
                             }
@@ -301,6 +297,39 @@
                 "extraPlugins": {
                     "type": "string"
                 },
+                "extraVolumeMounts": {
+                    "items": {
+                        "properties": {
+                            "mountPath": {
+                                "type": "string"
+                            },
+                            "name": {
+                                "type": "string"
+                            }
+                        },
+                        "type": "object"
+                    },
+                    "type": "array"
+                },
+                "extraVolumes": {
+                    "items": {
+                        "properties": {
+                            "configMap": {
+                                "properties": {
+                                    "name": {
+                                        "type": "string"
+                                    }
+                                },
+                                "type": "object"
+                            },
+                            "name": {
+                                "type": "string"
+                            }
+                        },
+                        "type": "object"
+                    },
+                    "type": "array"
+                },
                 "fullnameOverride": {
                     "type": "string"
                 },
@@ -361,15 +390,10 @@
                     },
                     "type": "object"
                 },
-                "metrics": {
-                    "properties": {
-                        "enabled": {
-                            "type": "boolean"
-                        }
-                    },
-                    "type": "object"
+                "logs": {
+                    "type": "string"
                 },
-                "persistence": {
+                "metrics": {
                     "properties": {
                         "enabled": {
                             "type": "boolean"
@@ -415,16 +439,158 @@
                                 "type": "object"
                             },
                             "type": "array"
-                        },
-                        "managerPortEnabled": {
-                            "type": "boolean"
-                        },
-                        "type": {
-                            "type": "string"
                         }
                     },
                     "type": "object"
                 },
+                "sidecars": {
+                    "items": {
+                        "properties": {
+                            "image": {
+                                "type": "string"
+                            },
+                            "imagePullPolicy": {
+                                "type": "string"
+                            },
+                            "livenessProbe": {
+                                "properties": {
+                                    "httpGet": {
+                                        "properties": {
+                                            "port": {
+                                                "type": "integer"
+                                            }
+                                        },
+                                        "type": "object"
+                                    },
+                                    "initialDelaySeconds": {
+                                        "type": "integer"
+                                    },
+                                    "periodSeconds": {
+                                        "type": "integer"
+                                    }
+                                },
+                                "type": "object"
+                            },
+                            "name": {
+                                "type": "string"
+                            },
+                            "readinessProbe": {
+                                "properties": {
+                                    "httpGet": {
+                                        "properties": {
+                                            "port": {
+                                                "type": "integer"
+                                            }
+                                        },
+                                        "type": "object"
+                                    },
+                                    "initialDelaySeconds": {
+                                        "type": "integer"
+                                    },
+                                    "periodSeconds": {
+                                        "type": "integer"
+                                    }
+                                },
+                                "type": "object"
+                            },
+                            "resources": {
+                                "properties": {
+                                    "limits": {
+                                        "properties": {
+                                            "cpu": {
+                                                "type": "string"
+                                            },
+                                            "ephemeral-storage": {
+                                                "type": "string"
+                                            },
+                                            "memory": {
+                                                "type": "string"
+                                            }
+                                        },
+                                        "type": "object"
+                                    },
+                                    "requests": {
+                                        "properties": {
+                                            "cpu": {
+                                                "type": "string"
+                                            },
+                                            "ephemeral-storage": {
+                                                "type": "string"
+                                            },
+                                            "memory": {
+                                                "type": "string"
+                                            }
+                                        },
+                                        "type": "object"
+                                    }
+                                },
+                                "type": "object"
+                            },
+                            "securityContext": {
+                                "properties": {
+                                    "allowPrivilegeEscalation": {
+                                        "type": "boolean"
+                                    },
+                                    "capabilities": {
+                                        "properties": {
+                                            "drop": {
+                                                "items": {
+                                                    "type": "string"
+                                                },
+                                                "type": "array"
+                                            }
+                                        },
+                                        "type": "object"
+                                    },
+                                    "readOnlyRootFilesystem": {
+                                        "type": "boolean"
+                                    },
+                                    "runAsGroup": {
+                                        "type": "integer"
+                                    },
+                                    "runAsNonRoot": {
+                                        "type": "boolean"
+                                    },
+                                    "runAsUser": {
+                                        "type": "integer"
+                                    },
+                                    "seLinuxOptions": {
+                                        "properties": {},
+                                        "type": "object"
+                                    },
+                                    "seccompProfile": {
+                                        "properties": {
+                                            "type": {
+                                                "type": "string"
+                                            }
+                                        },
+                                        "type": "object"
+                                    }
+                                },
+                                "type": "object"
+                            },
+                            "volumeMounts": {
+                                "items": {
+                                    "properties": {
+                                        "mountPath": {
+                                            "type": "string"
+                                        },
+                                        "name": {
+                                            "type": "string"
+                                        },
+                                        "subPath": {
+                                            "type": "string"
+                                        }
+                                    },
+                                    "type": "object"
+                                },
+                                "type": "array"
+                            }
+                        },
+                        "type": "object"
+                    },
+                    "type": "array"
+                },
                 "virtualHost": {
                     "type": "string"
                 }
@@ -540,24 +706,8 @@
                     },
                     "type": "object"
                 },
-                "init": {
-                    "properties": {
-                        "image": {
-                            "properties": {
-                                "name": {
-                                    "type": "string"
-                                }
-                            },
-                            "type": "object"
-                        },
-                        "resources": {
-                            "properties": {},
-                            "type": "object"
-                        },
-                        "resourcesPreset": {
-                            "type": "string"
-                        }
-                    },
+                "podAnnotations": {
+                    "properties": {},
                     "type": "object"
                 },
                 "podSecurityContext": {
@@ -589,6 +739,29 @@
                 },
                 "resourcesPreset": {
                     "type": "string"
+                },
+                "setupJob": {
+                    "properties": {
+                        "enabled": {
+                            "type": "boolean"
+                        },
+                        "image": {
+                            "properties": {
+                                "name": {
+                                    "type": "string"
+                                }
+                            },
+                            "type": "object"
+                        },
+                        "resources": {
+                            "properties": {},
+                            "type": "object"
+                        },
+                        "resourcesPreset": {
+                            "type": "string"
+                        }
+                    },
+                    "type": "object"
                 }
             },
             "type": "object"
@@ -856,6 +1029,10 @@
                     },
                     "type": "object"
                 },
+                "podAnnotations": {
+                    "properties": {},
+                    "type": "object"
+                },
                 "podSecurityContext": {
                     "properties": {
                         "enabled": {
@@ -950,6 +1127,39 @@
                 "existingServerBlockConfigmap": {
                     "type": "string"
                 },
+                "extraVolumeMounts": {
+                    "items": {
+                        "properties": {
+                            "mountPath": {
+                                "type": "string"
+                            },
+                            "name": {
+                                "type": "string"
+                            }
+                        },
+                        "type": "object"
+                    },
+                    "type": "array"
+                },
+                "extraVolumes": {
+                    "items": {
+                        "properties": {
+                            "configMap": {
+                                "properties": {
+                                    "name": {
+                                        "type": "string"
+                                    }
+                                },
+                                "type": "object"
+                            },
+                            "name": {
+                                "type": "string"
+                            }
+                        },
+                        "type": "object"
+                    },
+                    "type": "array"
+                },
                 "fullnameOverride": {
                     "type": "string"
                 },
@@ -971,6 +1181,154 @@
                         }
                     },
                     "type": "object"
+                },
+                "sidecars": {
+                    "items": {
+                        "properties": {
+                            "image": {
+                                "type": "string"
+                            },
+                            "imagePullPolicy": {
+                                "type": "string"
+                            },
+                            "livenessProbe": {
+                                "properties": {
+                                    "httpGet": {
+                                        "properties": {
+                                            "port": {
+                                                "type": "integer"
+                                            }
+                                        },
+                                        "type": "object"
+                                    },
+                                    "initialDelaySeconds": {
+                                        "type": "integer"
+                                    },
+                                    "periodSeconds": {
+                                        "type": "integer"
+                                    }
+                                },
+                                "type": "object"
+                            },
+                            "name": {
+                                "type": "string"
+                            },
+                            "readinessProbe": {
+                                "properties": {
+                                    "httpGet": {
+                                        "properties": {
+                                            "port": {
+                                                "type": "integer"
+                                            }
+                                        },
+                                        "type": "object"
+                                    },
+                                    "initialDelaySeconds": {
+                                        "type": "integer"
+                                    },
+                                    "periodSeconds": {
+                                        "type": "integer"
+                                    }
+                                },
+                                "type": "object"
+                            },
+                            "resources": {
+                                "properties": {
+                                    "limits": {
+                                        "properties": {
+                                            "cpu": {
+                                                "type": "string"
+                                            },
+                                            "ephemeral-storage": {
+                                                "type": "string"
+                                            },
+                                            "memory": {
+                                                "type": "string"
+                                            }
+                                        },
+                                        "type": "object"
+                                    },
+                                    "requests": {
+                                        "properties": {
+                                            "cpu": {
+                                                "type": "string"
+                                            },
+                                            "ephemeral-storage": {
+                                                "type": "string"
+                                            },
+                                            "memory": {
+                                                "type": "string"
+                                            }
+                                        },
+                                        "type": "object"
+                                    }
+                                },
+                                "type": "object"
+                            },
+                            "securityContext": {
+                                "properties": {
+                                    "allowPrivilegeEscalation": {
+                                        "type": "boolean"
+                                    },
+                                    "capabilities": {
+                                        "properties": {
+                                            "drop": {
+                                                "items": {
+                                                    "type": "string"
+                                                },
+                                                "type": "array"
+                                            }
+                                        },
+                                        "type": "object"
+                                    },
+                                    "readOnlyRootFilesystem": {
+                                        "type": "boolean"
+                                    },
+                                    "runAsGroup": {
+                                        "type": "integer"
+                                    },
+                                    "runAsNonRoot": {
+                                        "type": "boolean"
+                                    },
+                                    "runAsUser": {
+                                        "type": "integer"
+                                    },
+                                    "seLinuxOptions": {
+                                        "properties": {},
+                                        "type": "object"
+                                    },
+                                    "seccompProfile": {
+                                        "properties": {
+                                            "type": {
+                                                "type": "string"
+                                            }
+                                        },
+                                        "type": "object"
+                                    }
+                                },
+                                "type": "object"
+                            },
+                            "volumeMounts": {
+                                "items": {
+                                    "properties": {
+                                        "mountPath": {
+                                            "type": "string"
+                                        },
+                                        "name": {
+                                            "type": "string"
+                                        },
+                                        "subPath": {
+                                            "type": "string"
+                                        }
+                                    },
+                                    "type": "object"
+                                },
+                                "type": "array"
+                            }
+                        },
+                        "type": "object"
+                    },
+                    "type": "array"
                 }
             },
             "type": "object"
@@ -990,6 +1348,25 @@
                     },
                     "type": "object"
                 },
+                "loggingSidecar": {
+                    "properties": {
+                        "enabled": {
+                            "type": "boolean"
+                        },
+                        "image": {
+                            "properties": {
+                                "name": {
+                                    "type": "string"
+                                }
+                            },
+                            "type": "object"
+                        },
+                        "resourcesPreset": {
+                            "type": "string"
+                        }
+                    },
+                    "type": "object"
+                },
                 "storageClass": {
                     "type": "string"
                 }
@@ -1100,6 +1477,10 @@
                     },
                     "type": "object"
                 },
+                "podAnnotations": {
+                    "properties": {},
+                    "type": "object"
+                },
                 "podSecurityContext": {
                     "properties": {
                         "enabled": {
@@ -1164,9 +1545,6 @@
         },
         "metadatadb": {
             "properties": {
-                "configurationConfigMap": {
-                    "type": "string"
-                },
                 "db": {
                     "properties": {
                         "name": {
@@ -1353,6 +1731,10 @@
                     },
                     "type": "object"
                 },
+                "podAnnotations": {
+                    "properties": {},
+                    "type": "object"
+                },
                 "podSecurityContext": {
                     "properties": {
                         "enabled": {
@@ -1654,24 +2036,8 @@
                     },
                     "type": "object"
                 },
-                "init": {
-                    "properties": {
-                        "image": {
-                            "properties": {
-                                "name": {
-                                    "type": "string"
-                                }
-                            },
-                            "type": "object"
-                        },
-                        "resources": {
-                            "properties": {},
-                            "type": "object"
-                        },
-                        "resourcesPreset": {
-                            "type": "string"
-                        }
-                    },
+                "podAnnotations": {
+                    "properties": {},
                     "type": "object"
                 },
                 "podSecurityContext": {
@@ -1703,28 +2069,12 @@
                 },
                 "resourcesPreset": {
                     "type": "string"
-                }
-            },
-            "type": "object"
-        },
-        "storageservice": {
-            "properties": {
-                "enabled": {
-                    "type": "boolean"
                 },
-                "filer": {
+                "setupJob": {
                     "properties": {
                         "enabled": {
                             "type": "boolean"
-                        }
-                    },
-                    "type": "object"
-                },
-                "fullnameOverride": {
-                    "type": "string"
-                },
-                "init": {
-                    "properties": {
+                        },
                         "image": {
                             "properties": {
                                 "name": {
@@ -1739,17 +2089,28 @@
                         },
                         "resourcesPreset": {
                             "type": "string"
-                        },
-                        "s3": {
-                            "properties": {
-                                "endpoint": {
-                                    "type": "string"
-                                }
-                            },
-                            "type": "object"
                         }
                     },
                     "type": "object"
+                }
+            },
+            "type": "object"
+        },
+        "storageservice": {
+            "properties": {
+                "enabled": {
+                    "type": "boolean"
+                },
+                "filer": {
+                    "properties": {
+                        "enabled": {
+                            "type": "boolean"
+                        }
+                    },
+                    "type": "object"
+                },
+                "fullnameOverride": {
+                    "type": "string"
                 },
                 "mariadb": {
                     "properties": {
@@ -1822,6 +2183,37 @@
                     },
                     "type": "object"
                 },
+                "setupJob": {
+                    "properties": {
+                        "enabled": {
+                            "type": "boolean"
+                        },
+                        "image": {
+                            "properties": {
+                                "name": {
+                                    "type": "string"
+                                }
+                            },
+                            "type": "object"
+                        },
+                        "resources": {
+                            "properties": {},
+                            "type": "object"
+                        },
+                        "resourcesPreset": {
+                            "type": "string"
+                        },
+                        "s3": {
+                            "properties": {
+                                "endpoint": {
+                                    "type": "string"
+                                }
+                            },
+                            "type": "object"
+                        }
+                    },
+                    "type": "object"
+                },
                 "volume": {
                     "properties": {
                         "enabled": {
@@ -1915,6 +2307,10 @@
                     },
                     "type": "object"
                 },
+                "podAnnotations": {
+                    "properties": {},
+                    "type": "object"
+                },
                 "podSecurityContext": {
                     "properties": {
                         "enabled": {
diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml
index 9020cae3acf7577f65487504b81c139aecbd4c33..bffbc00c339d56115e82a6bda85e1c1d0e2d99f6 100644
--- a/helm/dbrepo/values.yaml
+++ b/helm/dbrepo/values.yaml
@@ -12,6 +12,14 @@ global:
       adaptSecurityContext: auto
   ## @param global.storageClass Global StorageClass for Persistent Volume(s)
   storageClass: ""
+  loggingSidecar:
+    ## @param global.loggingSidecar.enabled Enable the logging sidecars for the analyse-, dashboard-, data-, gateway-, metadata- and search service.
+    enabled: true
+    image:
+      ## @param global.loggingSidecar.image.name The logging sidecar image.
+      name: docker.io/bitnami/fluent-bit:4.0.0
+    ## @param global.loggingSidecar.resourcesPreset The resource definitions for the logging sidecar.
+    resourcesPreset: nano
 
 ## @section Common parameters
 
@@ -56,8 +64,6 @@ metadatadb:
     enabled: true
   ## @skip metadatadb.initdbScriptsConfigMap The initial database scripts.
   initdbScriptsConfigMap: metadata-db-config
-  ## @param metadatadb.configurationConfigMap The database configuration files.
-  configurationConfigMap: metadata-db-config
   ## @param metadatadb.extraInitDbScripts Additional init.db scripts that are executed on the first start.
   extraInitDbScripts: { }
   #    03-additional-data.sql: |
@@ -65,13 +71,13 @@ metadatadb:
   #      INSERT INTO `mdb_containers` (name, internal_name, image_id, host, port, sidecar_host, sidecar_port, privileged_username, privileged_password)
   #        VALUES ('MariaDB Galera TEST', 'mariadb_11_1_3', 1, 'data-db', 3306, 'data-db', 80, 'root', 'dbrepo');
   #      COMMIT;
-  ## @param metadatadb.replicaCount The number of cluster nodes, should be uneven i.e. 2n+1
-  replicaCount: 3
   ## @param metadatadb.resourcesPreset The container resource preset
   resourcesPreset: "xlarge"
   persistence:
     ## @param metadatadb.persistence.enabled Enable persistent storage.
     enabled: true
+  ## @param metadatadb.replicaCount The number of cluster nodes, should be uneven i.e. 2n+1
+  replicaCount: 1
 
 ## @section Dashboard Database Enable the Dashboard Database.
 
@@ -146,29 +152,24 @@ authservice:
     ##   limits:
     ##     cpu: 500m
     ##     memory: 1024Mi
-  ## @skip authservice.extraEnvVarsCM
-  extraEnvVarsCM: auth-service-config
+  ## @skip authservice.extraEnvVarsSecret
+  extraEnvVarsSecret: auth-service-secret
   ## @skip authservice.extraVolumes
   extraVolumes:
-    - name: config-map
+    - name: config
       configMap:
         name: auth-service-config
-    - name: cache
-      emptyDir:
-        sizeLimit: 100Mi
   ## @skip authservice.extraVolumeMounts
   extraVolumeMounts:
-    - name: config-map
+    - name: config
       mountPath: /opt/keycloak/data/import/dbrepo-realm.json
       subPath: dbrepo-realm.json
-    - name: config-map
+    - name: config
       mountPath: /opt/keycloak/data/import/master-realm.json
       subPath: master-realm.json
-    - name: config-map
+    - name: config
       mountPath: /opt/bitnami/keycloak/providers/create-event-listener.jar
       subPath: create-event-listener.jar
-    - name: cache
-      mountPath: /bitnami/keycloak/
   ## @skip authservice.replicaCount The number of replicas.
   replicaCount: 2
 
@@ -300,7 +301,7 @@ brokerservice:
     servers:
       - identity-service
     ## @skip brokerservice.ldap.port
-    port: 389
+    port: 1389
     ## @param brokerservice.ldap.binddn The domain name the broker service should bind to. In many cases this is the admin user from `identityservice.global.adminUser`.
     binddn: cn=admin,dc=dbrepo,dc=at
     ## @param brokerservice.ldap.bindpw The password to bind on the identity service. In many cases this value is equal to `identityservice.global.adminPassword`.
@@ -330,23 +331,84 @@ brokerservice:
     existingSecret: broker-service-secret
   ## @param brokerservice.extraPlugins The list of plugins to be activated.
   extraPlugins: rabbitmq_prometheus rabbitmq_auth_backend_ldap rabbitmq_auth_mechanism_ssl rabbitmq_mqtt
-  persistence:
-    ## @param brokerservice.persistence.enabled If set to true, a PVC will be created.
-    enabled: false
-  ## @skip brokerservice.service
   service:
-    type: ClusterIP
-    managerPortEnabled: true
+    ## @skip brokerservice.service.extraPorts
     extraPorts:
       - name: mqtt
         port: 1883
         targetPort: 1883
     # loadBalancerIP:
+  ## @skip brokerservice.logs
+  logs: ""
   ## @param brokerservice.extraConfiguration The extra configuration for MQTT
   extraConfiguration: |
+    # https://www.rabbitmq.com/docs/logging#log-message-categories
+    log.connection.level = warning
+    log.file = /opt/bitnami/rabbitmq/var/log/rabbitmq/app.log
+    log.file.formatter = json
+    log.file.level = info
+    # rotate when the file reaches 10 MiB
+    log.file.rotation.size = 10485760
+    # keep up to 5 archived log files in addition to the current one
+    log.file.rotation.count = 5
     mqtt.vhost = dbrepo
     mqtt.exchange = dbrepo
     mqtt.prefetch = 10
+  ## @skip brokerservice.sidecars
+  sidecars:
+    - name: logging-agent
+      image: docker.io/bitnami/fluent-bit:4.0.0
+      imagePullPolicy: IfNotPresent
+      securityContext:
+        allowPrivilegeEscalation: false
+        capabilities:
+          drop:
+            - ALL
+        readOnlyRootFilesystem: false
+        runAsGroup: 1001
+        runAsNonRoot: true
+        runAsUser: 1001
+        seLinuxOptions: { }
+        seccompProfile:
+          type: RuntimeDefault
+      volumeMounts:
+        - name: logging-config
+          mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf
+          subPath: fluent-bit.conf
+        - name: logging-config
+          mountPath: /opt/bitnami/fluent-bit/conf/parsers.conf
+          subPath: parsers.conf
+        - name: empty-dir
+          mountPath: /opt/bitnami/rabbitmq/var/log/rabbitmq
+          subPath: app-logs-dir
+      livenessProbe:
+        httpGet:
+          port: 2021
+        initialDelaySeconds: 150
+        periodSeconds: 10
+      readinessProbe:
+        httpGet:
+          port: 2021
+        initialDelaySeconds: 30
+        periodSeconds: 10
+      resources:
+        requests:
+          cpu: 100m
+          memory: 128Mi
+          ephemeral-storage: 50Mi
+        limits:
+          cpu: 150m
+          memory: 192Mi
+          ephemeral-storage: 2Gi
+  ## @skip brokerservice.extraVolumes
+  extraVolumes:
+    - name: logging-config
+      configMap:
+        name: broker-service-config
+  ## @skip brokerservice.extraVolumeMounts
+  extraVolumeMounts:
+    - name: logging-config
+      mountPath: /tmp/rabbitmq # irrelevant but needed from bitnami chart
   ## @param brokerservice.replicaCount The number of replicas.
   replicaCount: 1
 
@@ -358,6 +420,9 @@ analyseservice:
   image:
     ## @skip analyseservice.image.name
     name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.8.2
+  ## @param analyseservice.podAnnotations the pod annotations. Evaluated as a template
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  podAnnotations: { }
   ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
   podSecurityContext:
     ## @param analyseservice.podSecurityContext.enabled Enable pods' Security Context
@@ -419,6 +484,9 @@ metadataservice:
   image:
     ## @skip metadataservice.image.name
     name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.8.2
+  ## @param metadataservice.podAnnotations the pod annotations. Evaluated as a template
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  podAnnotations: { }
   ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
   podSecurityContext:
     ## @param metadataservice.podSecurityContext.enabled Enable pods' Security Context
@@ -516,6 +584,9 @@ dataservice:
   image:
     ## @skip dataservice.image.name
     name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.8.2
+  ## @param dataservice.podAnnotations the pod annotations. Evaluated as a template
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  podAnnotations: { }
   ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
   podSecurityContext:
     ## @param dataservice.podSecurityContext.enabled Enable pods' Security Context
@@ -602,6 +673,9 @@ searchservice:
   image:
     ## @skip searchservice.image.name
     name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.8.2
+  ## @param searchservice.podAnnotations the pod annotations. Evaluated as a template
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  podAnnotations: { }
   ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
   podSecurityContext:
     ## @param searchservice.podSecurityContext.enabled Enable pods' Security Context
@@ -645,13 +719,15 @@ searchservice:
   ##   limits:
   ##     cpu: 500m
   ##     memory: 1024Mi
-  init:
+  setupJob:
+    ## @param searchservice.setupJob.enabled Enable the setup job that syncs missing databases from the Metadata Database into the Search Database.
+    enabled: true
     image:
-      ## @skip searchservice.init.image.name
+      ## @skip searchservice.setupJob.image.name
       name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.8.2
-    ## @param searchservice.init.resourcesPreset The container resource preset
+    ## @param searchservice.setupJob.resourcesPreset The container resource preset
     resourcesPreset: "nano"
-    ## @param searchservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads)
+    ## @param searchservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads)
     resources: { }
     ##   requests:
     ##     cpu: 250m
@@ -706,16 +782,18 @@ storageservice:
       readAccessKeyId: seaweedfsuser
       ## @param storageservice.s3.auth.readSecretAccessKey The S3 secret access key for the read only user.
       readSecretAccessKey: seaweedfsuser
-  init:
+  setupJob:
+    ## @param storageservice.setupJob.enabled Enable the setup job that creates the bucket in the s3 endpoint.
+    enabled: true
     image:
-      ## @skip storageservice.init.image.name
+      ## @skip storageservice.setupJob.image.name
       name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.8.2
     s3:
-      ## @param storageservice.init.s3.endpoint The S3-capable endpoint the microservice connects to.
+      ## @param storageservice.setupJob.s3.endpoint The S3-capable endpoint the microservice connects to.
       endpoint: http://storage-service-s3:8333
-    ## @param storageservice.init.resourcesPreset The container resource preset
+    ## @param storageservice.setupJob.resourcesPreset The container resource preset
     resourcesPreset: "nano"
-    ## @param storageservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads)
+    ## @param storageservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads)
     resources: { }
     ##   requests:
     ##     cpu: 250m
@@ -741,6 +819,9 @@ identityservice:
     adminPassword: admin
     ## @skip identityservice.global.configUserEnabled
     configUserEnabled: false
+  ## @param identityservice.podAnnotations the pod annotations. Evaluated as a template
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  podAnnotations: { }
   ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
   podSecurityContext:
     ## @param identityservice.podSecurityContext.enabled Enable pods' Security Context
@@ -827,6 +908,9 @@ ui:
     sessionSecret: TjOH1lFnocixYmy5ol2I5cOdsYUdrd5_jZsGxo6aMVPNNDkh
     ## @param ui.oidc.tokenKey This needs to be a random cryptographic AES key in base64. Used to encrypt the server side token store. You can generate a key in JS with await subtle.exportKey('raw', await subtle.generateKey({ name: 'AES-GCM', length: 256, }, true, ['encrypt', 'decrypt'])). You just have to encode it to base64 afterwards.
     tokenKey: data:;base64,ntxOAfrF6yw22Ec1AFHK21iFz7L3PZmz9857Uqwyme0=
+  ## @param ui.podAnnotations the pod annotations. Evaluated as a template
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  podAnnotations: { }
   ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
   podSecurityContext:
     ## @param ui.podSecurityContext.enabled Enable pods' Security Context
@@ -939,6 +1023,9 @@ dashboardservice:
     name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.8.2
   ## @param dashboardservice.endpoint The endpoint for the microservices.
   endpoint: http://dashboard-service
+  ## @param dashboardservice.podAnnotations the pod annotations. Evaluated as a template
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  podAnnotations: { }
   ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
   podSecurityContext:
     ## @param dashboardservice.podSecurityContext.enabled Enable pods' Security Context
@@ -983,13 +1070,15 @@ dashboardservice:
   ##     cpu: 500m
   ##     memory: 1024Mi
   ## @param dashboardservice.replicaCount The number of replicas.
-  init:
+  setupJob:
+    ## @param dashboardservice.setupJob.enabled Enable the setup job that creates dashboards for existing databases in the Dashboard UI.
+    enabled: true
     image:
-      ## @skip dashboardservice.init.image.name
+      ## @skip dashboardservice.setupJob.image.name
       name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:1.8.2
-    ## @param dashboardservice.init.resourcesPreset The container resource preset
+    ## @param dashboardservice.setupJob.resourcesPreset The container resource preset
     resourcesPreset: "nano"
-    ## @param dashboardservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads)
+    ## @param dashboardservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads)
     resources: { }
     ##   requests:
     ##     cpu: 250m
@@ -1072,27 +1161,27 @@ metricdb:
         metrics_path: '/actuator/prometheus'
         static_configs:
           - targets:
-            - data-service
-            - metadata-service
+              - data-service
+              - metadata-service
       - job_name: 'metrics scrape'
         metrics_path: '/metrics'
         static_configs:
           - targets:
-            - analyse-service
-            - auth-service-metrics:9000
-            - broker-service:9419
-            - dashboard-db-metrics:9187
-            - dashboard-service
-            - data-db-metrics:9104
-            - metadata-db-metrics:9104
-            - search-service
-            - storage-service-master-metrics:9327
-            - ui
+              - analyse-service
+              - auth-service-metrics:9000
+              - broker-service:9419
+              - dashboard-db-metrics:9187
+              - dashboard-service
+              - data-db-metrics:9104
+              - metadata-db-metrics:9104
+              - search-service
+              - storage-service-master-metrics:9327
+              - ui:3000
       - job_name: 'realm scrape'
         metrics_path: '/realms/dbrepo/metrics'
         static_configs:
           - targets:
-            - auth-service-metrics:8080
+              - auth-service-metrics:8080
 
 ## @section Gateway Service
 
@@ -1108,7 +1197,60 @@ gatewayservice:
     ## @param gatewayservice.metrics.enabled Enable the Prometheus metrics sidecar.
     enabled: false
   ## @param gatewayservice.existingServerBlockConfigmap The extra configuration for the reverse proxy
-  existingServerBlockConfigmap: gateway-service-config
+  existingServerBlockConfigmap: gateway-service-setup
+  ## @skip gatewayservice.sidecars
+  sidecars:
+    - name: logging-agent
+      image: docker.io/bitnami/fluent-bit:4.0.0
+      imagePullPolicy: IfNotPresent
+      securityContext:
+        allowPrivilegeEscalation: false
+        capabilities:
+          drop:
+            - ALL
+        readOnlyRootFilesystem: false
+        runAsGroup: 1001
+        runAsNonRoot: true
+        runAsUser: 1001
+        seLinuxOptions: { }
+        seccompProfile:
+          type: RuntimeDefault
+      volumeMounts:
+        - name: logging-config
+          mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf
+          subPath: fluent-bit.conf
+        - name: empty-dir
+          mountPath: /var/log/nginx/
+      livenessProbe:
+        httpGet:
+          port: 2021
+        initialDelaySeconds: 150
+        periodSeconds: 10
+      readinessProbe:
+        httpGet:
+          port: 2021
+        initialDelaySeconds: 30
+        periodSeconds: 10
+      resources:
+        requests:
+          cpu: 100m
+          memory: 128Mi
+          ephemeral-storage: 50Mi
+        limits:
+          cpu: 150m
+          memory: 192Mi
+          ephemeral-storage: 2Gi
+  ## @skip gatewayservice.extraVolumes
+  extraVolumes:
+    - name: logging-config
+      configMap:
+        name: gateway-service-config
+  ## @skip gatewayservice.extraVolumeMounts
+  extraVolumeMounts:
+    - name: empty-dir
+      mountPath: /var/log/nginx
+    - name: logging-config
+      mountPath: /app # irrelevant but needed from bitnami chart
   ## @param gatewayservice.replicaCount The number of replicas.
   replicaCount: 3
 
@@ -1118,6 +1260,7 @@ computeservice:
   ## @param computeservice.endpoint Configure the number of parallel workers with local[n]
   endpoint: local[2]
 
+
 ## @section Ingress
 
 ingress:
diff --git a/helm/seaweedfs/CHANGELOG.md b/helm/seaweedfs/CHANGELOG.md
index e880917876b0c345b35c2706b379a006bc41de99..ac474a8e78abe8978ad2659e5267ecdccb43b6bb 100644
--- a/helm/seaweedfs/CHANGELOG.md
+++ b/helm/seaweedfs/CHANGELOG.md
@@ -1,8 +1,102 @@
 # Changelog
 
+## 4.8.7 (2025-05-07)
+
+* [bitnami/seaweedfs] Release 4.8.7 ([#33539](https://github.com/bitnami/charts/pull/33539))
+
+## <small>4.8.6 (2025-05-06)</small>
+
+* [bitnami/seaweedfs] chore: :recycle: :arrow_up: Update common and remove k8s < 1.23 references (#334 ([3789e42](https://github.com/bitnami/charts/commit/3789e42484b6f398325c81a52f273d9218129b89)), closes [#33434](https://github.com/bitnami/charts/issues/33434)
+
+## <small>4.8.5 (2025-05-05)</small>
+
+* [bitnami/seaweedfs] Release 4.8.5 (#33315) ([af40402](https://github.com/bitnami/charts/commit/af40402b56235183cc899c55777c0267e0c50312)), closes [#33315](https://github.com/bitnami/charts/issues/33315)
+
+## <small>4.8.4 (2025-05-02)</small>
+
+* [bitnami/seaweedfs] Release 4.8.4 (#33300) ([6078309](https://github.com/bitnami/charts/commit/60783099201f5864d286b6da2f272c5c9bdfa1db)), closes [#33300](https://github.com/bitnami/charts/issues/33300)
+
+## <small>4.8.3 (2025-04-02)</small>
+
+* [bitnami/*] Add tanzuCategory annotation (#32409) ([a8fba5c](https://github.com/bitnami/charts/commit/a8fba5cb01f6f4464ca7f69c50b0fbe97d837a95)), closes [#32409](https://github.com/bitnami/charts/issues/32409)
+* [bitnami/seaweedfs] Release 4.8.3 (#32763) ([e6f401a](https://github.com/bitnami/charts/commit/e6f401a180a1ba2452c52072192119442b72c8a5)), closes [#32763](https://github.com/bitnami/charts/issues/32763)
+
+## <small>4.8.2 (2025-03-10)</small>
+
+* [bitnami/seaweedfs]: fix README for loglevel (#31735) ([b537041](https://github.com/bitnami/charts/commit/b53704137dc1722164ee6cd3c60968bc7154abb3)), closes [#31735](https://github.com/bitnami/charts/issues/31735)
+
+## <small>4.8.1 (2025-03-05)</small>
+
+* [bitnami/seaweedfs] Release 4.8.1 (#32317) ([f248247](https://github.com/bitnami/charts/commit/f248247c983ac0c353a3ddc214dba911883b11a2)), closes [#32317](https://github.com/bitnami/charts/issues/32317)
+
+## 4.8.0 (2025-03-03)
+
+* [bitnami/seaweedfs] Add support for `s3.allowEmptyFolder` (#32234) ([ce208fa](https://github.com/bitnami/charts/commit/ce208faae53c07ca52f4f239604f37af7ae1786a)), closes [#32234](https://github.com/bitnami/charts/issues/32234)
+
+## 4.7.0 (2025-02-24)
+
+* [bitnami/seaweedfs] Set `usePasswordFiles=true` by default (#32119) ([dbc5cb6](https://github.com/bitnami/charts/commit/dbc5cb6ebacef3036f8bbb32ae1d761f171b8bdd)), closes [#32119](https://github.com/bitnami/charts/issues/32119)
+
+## <small>4.6.2 (2025-02-20)</small>
+
+* [bitnami/seaweedfs] Release 4.6.2 (#32035) ([efa99db](https://github.com/bitnami/charts/commit/efa99db7094cc5f19ec968634b5a87850c40cb73)), closes [#32035](https://github.com/bitnami/charts/issues/32035)
+
+## <small>4.6.1 (2025-02-12)</small>
+
+* [bitnami/*] Use CDN url for the Bitnami Application Icons (#31881) ([d9bb11a](https://github.com/bitnami/charts/commit/d9bb11a9076b9bfdcc70ea022c25ef50e9713657)), closes [#31881](https://github.com/bitnami/charts/issues/31881)
+* [bitnami/seaweedfs] Release 4.6.1 (#31902) ([f15c5ed](https://github.com/bitnami/charts/commit/f15c5ed37c1829961a0ba4391809c524237382fb)), closes [#31902](https://github.com/bitnami/charts/issues/31902)
+* [bitnami/seaweedfs]: correct typo in README (#31867) ([bb5c61b](https://github.com/bitnami/charts/commit/bb5c61b6fe4c89ac0b115b63ebed43b312f31809)), closes [#31867](https://github.com/bitnami/charts/issues/31867)
+
+## 4.6.0 (2025-02-05)
+
+* [bitnami/seaweedfs] Add support for log persistence (#31793) ([2561c2a](https://github.com/bitnami/charts/commit/2561c2aaba3b08507f1c10bdae3b933d74f01427)), closes [#31793](https://github.com/bitnami/charts/issues/31793)
+
+## <small>4.5.5 (2025-02-05)</small>
+
+* [bitnami/seaweedfs] Release 4.5.5 (#31779) ([db2813f](https://github.com/bitnami/charts/commit/db2813f08e07f03142c8acd5b587c47bf66a0057)), closes [#31779](https://github.com/bitnami/charts/issues/31779)
+
+## <small>4.5.4 (2025-02-03)</small>
+
+* [bitnami/seaweedfs] Release 4.5.4 (#31718) ([b4de2a7](https://github.com/bitnami/charts/commit/b4de2a7edbae2d1bba926a18ffc1415c39a5ca9d)), closes [#31718](https://github.com/bitnami/charts/issues/31718)
+
+## <small>4.5.3 (2025-02-03)</small>
+
+* [bitnami/seaweedfs] Release 4.5.3 (#31700) ([6752afa](https://github.com/bitnami/charts/commit/6752afab2f7805c38dfca3ab7e75afffcb0db3e7)), closes [#31700](https://github.com/bitnami/charts/issues/31700)
+* Update copyright year (#31682) ([e9f02f5](https://github.com/bitnami/charts/commit/e9f02f5007068751f7eb2270fece811e685c99b6)), closes [#31682](https://github.com/bitnami/charts/issues/31682)
+
+## <small>4.5.2 (2025-01-24)</small>
+
+* [bitnami/seaweedfs] Release 4.5.2 (#31583) ([fd84724](https://github.com/bitnami/charts/commit/fd8472445476e56d22e2f54014e90d54fef780db)), closes [#31583](https://github.com/bitnami/charts/issues/31583)
+
+## <small>4.5.1 (2025-01-21)</small>
+
+* [bitnami/seaweedfs] Release 4.5.1 (#31490) ([97dae84](https://github.com/bitnami/charts/commit/97dae844ebf47a25522c0b7752595849ca3b711a)), closes [#31490](https://github.com/bitnami/charts/issues/31490)
+
+## 4.5.0 (2025-01-20)
+
+* [bitnami/seaweedfs]: add pod for `weed iam` (#31334) ([5f5a702](https://github.com/bitnami/charts/commit/5f5a70213129a814f4a0d4be92409b9fec9686a5)), closes [#31334](https://github.com/bitnami/charts/issues/31334)
+
+## <small>4.3.2 (2025-01-17)</small>
+
+* [bitnami/seaweedfs] Release 4.3.2 (#31443) ([942718e](https://github.com/bitnami/charts/commit/942718e8ec1eef14fcd63ebc11e2f2ce7a180c17)), closes [#31443](https://github.com/bitnami/charts/issues/31443)
+
+## <small>4.3.1 (2025-01-13)</small>
+
+* [bitnami/seaweedfs]: correct typo in values.yaml regarding s3.auth.existingSecret (#31339) ([31d0532](https://github.com/bitnami/charts/commit/31d0532a517bd0669b445e6974c2c5aace41697d)), closes [#31339](https://github.com/bitnami/charts/issues/31339)
+
+## 4.3.0 (2025-01-10)
+
+* [bitnami/seaweedfs] Make database check on start optional (#31277) ([ddb8a97](https://github.com/bitnami/charts/commit/ddb8a97d80c5bc87f2c33be751fbc35797f5f1be)), closes [#31277](https://github.com/bitnami/charts/issues/31277)
+
+## <small>4.2.1 (2025-01-07)</small>
+
+* [bitnami/*] Fix typo in README (#31052) ([b41a51d](https://github.com/bitnami/charts/commit/b41a51d1bd04841fc108b78d3b8357a5292771c8)), closes [#31052](https://github.com/bitnami/charts/issues/31052)
+* [bitnami/seaweedfs] Release 4.2.1 (#31244) ([75fba5d](https://github.com/bitnami/charts/commit/75fba5d61dbf307dabd130d1ff3f621bb85320cc)), closes [#31244](https://github.com/bitnami/charts/issues/31244)
+
 ## 4.2.0 (2024-12-10)
 
-* [bitnami/seaweedfs] Detect non-standard images ([#30967](https://github.com/bitnami/charts/pull/30967))
+* [bitnami/*] Add Bitnami Premium to NOTES.txt (#30854) ([3dfc003](https://github.com/bitnami/charts/commit/3dfc00376df6631f0ce54b8d440d477f6caa6186)), closes [#30854](https://github.com/bitnami/charts/issues/30854)
+* [bitnami/seaweedfs] Detect non-standard images (#30967) ([a4d9265](https://github.com/bitnami/charts/commit/a4d9265e61197d5ed5e6c4a0f85ce7460abd4a66)), closes [#30967](https://github.com/bitnami/charts/issues/30967)
 
 ## <small>4.1.2 (2024-12-04)</small>
 
diff --git a/helm/seaweedfs/Chart.lock b/helm/seaweedfs/Chart.lock
index 961967091af3ad7989746d89b7732777a6f6f7b0..039c66b559f25f3801a766a9bb074a20eb722fda 100644
--- a/helm/seaweedfs/Chart.lock
+++ b/helm/seaweedfs/Chart.lock
@@ -1,12 +1,12 @@
 dependencies:
 - name: mariadb
   repository: oci://registry-1.docker.io/bitnamicharts
-  version: 20.5.3
+  version: 20.5.5
 - name: postgresql
   repository: oci://registry-1.docker.io/bitnamicharts
-  version: 16.6.6
+  version: 16.7.2
 - name: common
   repository: oci://registry-1.docker.io/bitnamicharts
-  version: 2.30.2
-digest: sha256:79a3aee363cd4d88cd19f0c034d739b8dea199b2762f5d238bd9904ed77849d6
-generated: "2025-05-02T13:23:11.176099554+02:00"
+  version: 2.31.1
+digest: sha256:07ea3df0034b01d47e5e8b3764de78232d8b0e23c3c2fce27a6d4e8bd71837ba
+generated: "2025-05-11T13:55:38.808367927+02:00"
diff --git a/helm/seaweedfs/Chart.yaml b/helm/seaweedfs/Chart.yaml
index 0c7bf3c684c6c3bcee0ebe2d521a9794c4634c59..d3531a424a17629fb197eb52706f9bd12120352c 100644
--- a/helm/seaweedfs/Chart.yaml
+++ b/helm/seaweedfs/Chart.yaml
@@ -3,18 +3,19 @@
 
 annotations:
   category: Infrastructure
-  licenses: Apache-2.0
   images: |
     - name: mariadb
-      image: docker.io/bitnami/mariadb:11.4.4-debian-12-r1
+      image: docker.io/bitnami/mariadb:11.4.5-debian-12-r12
     - name: os-shell
-      image: docker.io/bitnami/os-shell:12-debian-12-r33
+      image: docker.io/bitnami/os-shell:12-debian-12-r43
     - name: postgresql
-      image: docker.io/bitnami/postgresql:17.2.0-debian-12-r2
+      image: docker.io/bitnami/postgresql:17.4.0-debian-12-r19
     - name: seaweedfs
-      image: docker.io/bitnami/seaweedfs:3.80.0-debian-12-r1
+      image: docker.io/bitnami/seaweedfs:3.87.0-debian-12-r1
+  licenses: Apache-2.0
+  tanzuCategory: clusterUtility
 apiVersion: v2
-appVersion: 3.80.0
+appVersion: 3.87.0
 dependencies:
 - condition: mariadb.enabled
   name: mariadb
@@ -35,7 +36,7 @@ dependencies:
   version: 2.x.x
 description: SeaweedFS is a simple and highly scalable distributed file system.
 home: https://bitnami.com
-icon: https://bitnami.com/assets/stacks/seaweedfs/img/seaweedfs-stack-220x234.png
+icon: https://dyltqmyl993wv.cloudfront.net/assets/stacks/seaweedfs/img/seaweedfs-stack-220x234.png
 keywords:
 - seaweedfs
 - storage
@@ -50,4 +51,4 @@ name: seaweedfs
 sources:
 - https://github.com/bitnami/charts/tree/main/bitnami/seawwedfs
 - https://github.com/bitnami/containers/tree/main/bitnami/seaweedfs
-version: 4.2.1
+version: 4.8.7
diff --git a/helm/seaweedfs/README.md b/helm/seaweedfs/README.md
index 7506718dc1087f1ede7d95d9ebb28f40632a0b86..cd0c7e1cc30c7c56e4357523b12b3abbb6bbe8f8 100644
--- a/helm/seaweedfs/README.md
+++ b/helm/seaweedfs/README.md
@@ -22,8 +22,6 @@ Bitnami charts for Helm are carefully engineered, actively maintained and are th
 
 This chart bootstraps a [SeaweedFS](https://github.com/seaweedfs/seaweedfs) deployment in a [Kubernetes](https://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager.
 
-Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters.
-
 ## Prerequisites
 
 - Kubernetes 1.23+
@@ -166,7 +164,7 @@ You can manually create the required TLS certificates for each SeaweedFS compone
 #### S3 Authentication
 
 Authentication can be enabled in the SeaweedFS S3 API by setting the `s3.auth.enabled` parameter to `true`.
-You can provide your custom authentication configuration creating a secret with the configuration and setting the `s3.auth.cexistingSecret` parameter with the name of the secret.
+You can provide your custom authentication configuration creating a secret with the configuration and setting the `s3.auth.existingSecret` parameter with the name of the secret.
 Alternatively, you can rely on the chart to create a basic configuration with two main users: `admin` and `read-only`. You can provide the admin user credentials using the `s3.auth.adminAccessKeyId` and `s3.auth.adminSecretAccessKey` parameters, and the read-only user credentials using the `s3.auth.readAccessKeyId` and `s3.auth.readSecretAccessKey` parameters.
 
 ### Additional environment variables
@@ -349,7 +347,7 @@ If you encounter errors when working with persistent volumes, refer to our [trou
 | `master.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in Master Server container' Security Context                                                                                                                                                              | `false`          |
 | `master.containerSecurityContext.capabilities.drop`        | List of capabilities to be dropped in Master Server container                                                                                                                                                                          | `["ALL"]`        |
 | `master.containerSecurityContext.seccompProfile.type`      | Set seccomp profile in Master Server container                                                                                                                                                                                         | `RuntimeDefault` |
-| `master.logLevel`                                          | Master Server log level [0|1|2|3|4]                                                                                                                                                                                                    | `1`              |
+| `master.logLevel`                                          | Master Server log level (0, 1, 2, 3, or 4)                                                                                                                                                                                             | `1`              |
 | `master.bindAddress`                                       | Master Server bind address                                                                                                                                                                                                             | `0.0.0.0`        |
 | `master.volumeSizeLimitMB`                                 | Limit (in MB) to stop directing writes to oversized volumes                                                                                                                                                                            | `1000`           |
 | `master.config`                                            | Master Server configuration                                                                                                                                                                                                            | `""`             |
@@ -436,16 +434,26 @@ If you encounter errors when working with persistent volumes, refer to our [trou
 
 | Name                                                      | Description                                                                                             | Value               |
 | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------- |
-| `master.persistence.enabled`                              | Enable persistence on Master Server using Persistent Volume Claims                                      | `true`              |
+| `master.persistence.enabled`                              | Enable data persistence on Master Server using Persistent Volume Claims                                 | `true`              |
 | `master.persistence.mountPath`                            | Path to mount the volume at.                                                                            | `/data`             |
 | `master.persistence.subPath`                              | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""`                |
 | `master.persistence.storageClass`                         | Storage class of backing PVC                                                                            | `""`                |
 | `master.persistence.annotations`                          | Persistent Volume Claim annotations                                                                     | `{}`                |
 | `master.persistence.accessModes`                          | Persistent Volume Access Modes                                                                          | `["ReadWriteOnce"]` |
 | `master.persistence.size`                                 | Size of data volume                                                                                     | `8Gi`               |
-| `master.persistence.existingClaim`                        | The name of an existing PVC to use for persistence                                                      | `""`                |
+| `master.persistence.existingClaim`                        | The name of an existing PVC to use for data persistence                                                 | `""`                |
 | `master.persistence.selector`                             | Selector to match an existing Persistent Volume for data PVC                                            | `{}`                |
 | `master.persistence.dataSource`                           | Custom PVC data source                                                                                  | `{}`                |
+| `master.logPersistence.enabled`                           | Enable logs persistence on Master Server using Persistent Volume Claims                                 | `false`             |
+| `master.logPersistence.mountPath`                         | Path to mount the volume at.                                                                            | `/logs`             |
+| `master.logPersistence.subPath`                           | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""`                |
+| `master.logPersistence.storageClass`                      | Storage class of backing PVC                                                                            | `""`                |
+| `master.logPersistence.annotations`                       | Persistent Volume Claim annotations                                                                     | `{}`                |
+| `master.logPersistence.accessModes`                       | Persistent Volume Access Modes                                                                          | `["ReadWriteOnce"]` |
+| `master.logPersistence.size`                              | Size of logs volume                                                                                     | `8Gi`               |
+| `master.logPersistence.existingClaim`                     | The name of an existing PVC to use for logs persistence                                                 | `""`                |
+| `master.logPersistence.selector`                          | Selector to match an existing Persistent Volume for logs PVC                                            | `{}`                |
+| `master.logPersistence.dataSource`                        | Custom PVC data source                                                                                  | `{}`                |
 | `master.persistentVolumeClaimRetentionPolicy.enabled`     | Controls if and how PVCs are deleted during the lifecycle of the Master Server StatefulSet              | `false`             |
 | `master.persistentVolumeClaimRetentionPolicy.whenScaled`  | Volume retention behavior when the replica count of the StatefulSet is reduced                          | `Retain`            |
 | `master.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted                                  | `Retain`            |
@@ -516,7 +524,7 @@ If you encounter errors when working with persistent volumes, refer to our [trou
 | `volume.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in Volume Server container' Security Context                                                                                                                                                              | `false`          |
 | `volume.containerSecurityContext.capabilities.drop`        | List of capabilities to be dropped in Volume Server container                                                                                                                                                                          | `["ALL"]`        |
 | `volume.containerSecurityContext.seccompProfile.type`      | Set seccomp profile in Volume Server container                                                                                                                                                                                         | `RuntimeDefault` |
-| `volume.logLevel`                                          | Volume Server log level [0|1|2|3|4]                                                                                                                                                                                                    | `1`              |
+| `volume.logLevel`                                          | Volume Server log level (0, 1, 2, 3, or 4)                                                                                                                                                                                             | `1`              |
 | `volume.bindAddress`                                       | Volume Server bind address                                                                                                                                                                                                             | `0.0.0.0`        |
 | `volume.publicUrl`                                         | Volume Server public URL                                                                                                                                                                                                               | `""`             |
 | `volume.config`                                            | Volume Server configuration                                                                                                                                                                                                            | `""`             |
@@ -615,6 +623,16 @@ If you encounter errors when working with persistent volumes, refer to our [trou
 | `volume.dataVolumes[0].persistence.existingClaim`         | The name of an existing PVC to use for persistence                                                                                                                            | `""`                |
 | `volume.dataVolumes[0].persistence.selector`              | Selector to match an existing Persistent Volume for data PVC                                                                                                                  | `{}`                |
 | `volume.dataVolumes[0].persistence.dataSource`            | Custom PVC data source                                                                                                                                                        | `{}`                |
+| `volume.logPersistence.enabled`                           | Enable logs persistence on Volume Server using Persistent Volume Claims                                                                                                       | `false`             |
+| `volume.logPersistence.mountPath`                         | Path to mount the volume at.                                                                                                                                                  | `/logs`             |
+| `volume.logPersistence.subPath`                           | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services                                                                       | `""`                |
+| `volume.logPersistence.storageClass`                      | Storage class of backing PVC                                                                                                                                                  | `""`                |
+| `volume.logPersistence.annotations`                       | Persistent Volume Claim annotations                                                                                                                                           | `{}`                |
+| `volume.logPersistence.accessModes`                       | Persistent Volume Access Modes                                                                                                                                                | `["ReadWriteOnce"]` |
+| `volume.logPersistence.size`                              | Size of logs volume                                                                                                                                                           | `8Gi`               |
+| `volume.logPersistence.existingClaim`                     | The name of an existing PVC to use for logs persistence                                                                                                                       | `""`                |
+| `volume.logPersistence.selector`                          | Selector to match an existing Persistent Volume for logs PVC                                                                                                                  | `{}`                |
+| `volume.logPersistence.dataSource`                        | Custom PVC data source                                                                                                                                                        | `{}`                |
 | `volume.persistentVolumeClaimRetentionPolicy.enabled`     | Controls if and how PVCs are deleted during the lifecycle of the Volume Server StatefulSet                                                                                    | `false`             |
 | `volume.persistentVolumeClaimRetentionPolicy.whenScaled`  | Volume retention behavior when the replica count of the StatefulSet is reduced                                                                                                | `Retain`            |
 | `volume.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted                                                                                                        | `Retain`            |
@@ -686,12 +704,14 @@ If you encounter errors when working with persistent volumes, refer to our [trou
 | `filer.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in Filer Server container' Security Context                                                                                                                                                            | `false`                       |
 | `filer.containerSecurityContext.capabilities.drop`        | List of capabilities to be dropped in Filer Server container                                                                                                                                                                        | `["ALL"]`                     |
 | `filer.containerSecurityContext.seccompProfile.type`      | Set seccomp profile in Filer Server container                                                                                                                                                                                       | `RuntimeDefault`              |
-| `filer.logLevel`                                          | Filer Server log level [0|1|2|3|4]                                                                                                                                                                                                  | `1`                           |
+| `filer.logLevel`                                          | Filer Server log level (0, 1, 2, 3, or 4)                                                                                                                                                                                           | `1`                           |
 | `filer.bindAddress`                                       | Filer Server bind address                                                                                                                                                                                                           | `0.0.0.0`                     |
 | `filer.config`                                            | Filer Server configuration                                                                                                                                                                                                          | `[leveldb2]
 enabled = false
 ` |
 | `filer.existingConfigmap`                                 | The name of an existing ConfigMap with your custom configuration for Filer Server                                                                                                                                                   | `""`                          |
+| `filer.notificationConfig`                                | Filer Server notification configuration                                                                                                                                                                                             | `""`                          |
+| `filer.existingNotificationConfigmap`                     | The name of an existing ConfigMap with your custom notification configuration for Filer Server                                                                                                                                      | `""`                          |
 | `filer.command`                                           | Override default Filer Server container command (useful when using custom images)                                                                                                                                                   | `[]`                          |
 | `filer.args`                                              | Override default Filer Server container args (useful when using custom images)                                                                                                                                                      | `[]`                          |
 | `filer.automountServiceAccountToken`                      | Mount Service Account token in Filer Server pods                                                                                                                                                                                    | `false`                       |
@@ -770,6 +790,24 @@ enabled = false
 | `filer.ingress.secrets`                       | Custom TLS certificates as secrets                                                                                               | `[]`                     |
 | `filer.ingress.extraRules`                    | Additional rules to be covered with this ingress record                                                                          | `[]`                     |
 
+### Filer Server Persistence Parameters
+
+| Name                                                     | Description                                                                                             | Value               |
+| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------- |
+| `filer.logPersistence.enabled`                           | Enable logs persistence on Filer Server using Persistent Volume Claims                                  | `false`             |
+| `filer.logPersistence.mountPath`                         | Path to mount the volume at.                                                                            | `/logs`             |
+| `filer.logPersistence.subPath`                           | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""`                |
+| `filer.logPersistence.storageClass`                      | Storage class of backing PVC                                                                            | `""`                |
+| `filer.logPersistence.annotations`                       | Persistent Volume Claim annotations                                                                     | `{}`                |
+| `filer.logPersistence.accessModes`                       | Persistent Volume Access Modes                                                                          | `["ReadWriteOnce"]` |
+| `filer.logPersistence.size`                              | Size of logs volume                                                                                     | `8Gi`               |
+| `filer.logPersistence.existingClaim`                     | The name of an existing PVC to use for logs persistence                                                 | `""`                |
+| `filer.logPersistence.selector`                          | Selector to match an existing Persistent Volume for logs PVC                                            | `{}`                |
+| `filer.logPersistence.dataSource`                        | Custom PVC data source                                                                                  | `{}`                |
+| `filer.persistentVolumeClaimRetentionPolicy.enabled`     | Controls if and how PVCs are deleted during the lifecycle of the Master Server StatefulSet              | `false`             |
+| `filer.persistentVolumeClaimRetentionPolicy.whenScaled`  | Volume retention behavior when the replica count of the StatefulSet is reduced                          | `Retain`            |
+| `filer.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted                                  | `Retain`            |
+
 ### Filer Server Metrics Parameters
 
 | Name                                             | Description                                                                                            | Value   |
@@ -837,15 +875,16 @@ enabled = false
 | `s3.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in Amazon S3 API container' Security Context                                                                                                                                                      | `false`          |
 | `s3.containerSecurityContext.capabilities.drop`        | List of capabilities to be dropped in Amazon S3 API container                                                                                                                                                                  | `["ALL"]`        |
 | `s3.containerSecurityContext.seccompProfile.type`      | Set seccomp profile in Amazon S3 API container                                                                                                                                                                                 | `RuntimeDefault` |
-| `s3.logLevel`                                          | Amazon S3 API log level [0|1|2|3|4]                                                                                                                                                                                            | `1`              |
+| `s3.logLevel`                                          | Amazon S3 API log level (0, 1, 2, 3, or 4)                                                                                                                                                                                     | `1`              |
 | `s3.bindAddress`                                       | Amazon S3 API bind address                                                                                                                                                                                                     | `0.0.0.0`        |
+| `s3.allowEmptyFolder`                                  | Allow empty folders in Amazon S3 API                                                                                                                                                                                           | `true`           |
 | `s3.auth.enabled`                                      | Enable Amazon S3 API authentication                                                                                                                                                                                            | `false`          |
 | `s3.auth.existingSecret`                               | Existing secret with Amazon S3 API authentication configuration                                                                                                                                                                | `""`             |
 | `s3.auth.existingSecretConfigKey`                      | Key of the above existing secret with S3 API authentication configuration, defaults to `config.json`                                                                                                                           | `""`             |
-| `s3.auth.adminAccessKeyId`                             | Amazon S3 API access key with admin privileges. Ignored if `security.mTLS.volume.existingSecret` is set                                                                                                                        | `""`             |
-| `s3.auth.adminSecretAccessKey`                         | Amazon S3 API secret key with admin privileges. Ignored if `security.mTLS.volume.existingSecret` is set                                                                                                                        | `""`             |
-| `s3.auth.readAccessKeyId`                              | Amazon S3 API read access key with read-only privileges. Ignored if `security.mTLS.volume.existingSecret` is set                                                                                                               | `""`             |
-| `s3.auth.readSecretAccessKey`                          | Amazon S3 API read secret key with read-only privileges. Ignored if `security.mTLS.volume.existingSecret` is set                                                                                                               | `""`             |
+| `s3.auth.adminAccessKeyId`                             | Amazon S3 API access key with admin privileges. Ignored if `s3.auth.existingSecret` is set                                                                                                                                     | `""`             |
+| `s3.auth.adminSecretAccessKey`                         | Amazon S3 API secret key with admin privileges. Ignored if `s3.auth.existingSecret` is set                                                                                                                                     | `""`             |
+| `s3.auth.readAccessKeyId`                              | Amazon S3 API read access key with read-only privileges. Ignored if `s3.auth.existingSecret` is set                                                                                                                            | `""`             |
+| `s3.auth.readSecretAccessKey`                          | Amazon S3 API read secret key with read-only privileges. Ignored if `s3.auth.existingSecret` is set                                                                                                                            | `""`             |
 | `s3.command`                                           | Override default Amazon S3 API container command (useful when using custom images)                                                                                                                                             | `[]`             |
 | `s3.args`                                              | Override default Amazon S3 API container args (useful when using custom images)                                                                                                                                                | `[]`             |
 | `s3.automountServiceAccountToken`                      | Mount Service Account token in Amazon S3 API pods                                                                                                                                                                              | `false`          |
@@ -988,7 +1027,7 @@ enabled = false
 | `webdav.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in WebDAV container' Security Context                                                                                                                                                              | `false`          |
 | `webdav.containerSecurityContext.capabilities.drop`        | List of capabilities to be dropped in WebDAV container                                                                                                                                                                          | `["ALL"]`        |
 | `webdav.containerSecurityContext.seccompProfile.type`      | Set seccomp profile in WebDAV container                                                                                                                                                                                         | `RuntimeDefault` |
-| `webdav.logLevel`                                          | WebDAV log level [0|1|2|3|4]                                                                                                                                                                                                    | `1`              |
+| `webdav.logLevel`                                          | WebDAV log level (0, 1, 2, 3, or 4)                                                                                                                                                                                             | `1`              |
 | `webdav.tls.enabled`                                       | Enable TLS transport for WebDAV                                                                                                                                                                                                 | `false`          |
 | `webdav.tls.autoGenerated.enabled`                         | Enable automatic generation of certificates for TLS                                                                                                                                                                             | `false`          |
 | `webdav.tls.autoGenerated.engine`                          | Mechanism to generate the certificates (allowed values: helm, cert-manager)                                                                                                                                                     | `helm`           |
@@ -1076,6 +1115,97 @@ enabled = false
 | `webdav.ingress.secrets`                       | Custom TLS certificates as secrets                                                                                               | `[]`                     |
 | `webdav.ingress.extraRules`                    | Additional rules to be covered with this ingress record                                                                          | `[]`                     |
 
+### IAM Parameters
+
+| Name                                                    | Description                                                                                                                                                                                                                  | Value            |
+| ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- |
+| `iam.enabled`                                           | Enable IAM deployment                                                                                                                                                                                                        | `false`          |
+| `iam.replicaCount`                                      | Number of IAM replicas to deploy                                                                                                                                                                                             | `1`              |
+| `iam.containerPorts.http`                               | IAM HTTP container port                                                                                                                                                                                                      | `8111`           |
+| `iam.livenessProbe.enabled`                             | Enable livenessProbe on IAM containers                                                                                                                                                                                       | `true`           |
+| `iam.livenessProbe.initialDelaySeconds`                 | Initial delay seconds for livenessProbe                                                                                                                                                                                      | `30`             |
+| `iam.livenessProbe.periodSeconds`                       | Period seconds for livenessProbe                                                                                                                                                                                             | `10`             |
+| `iam.livenessProbe.timeoutSeconds`                      | Timeout seconds for livenessProbe                                                                                                                                                                                            | `30`             |
+| `iam.livenessProbe.failureThreshold`                    | Failure threshold for livenessProbe                                                                                                                                                                                          | `6`              |
+| `iam.livenessProbe.successThreshold`                    | Success threshold for livenessProbe                                                                                                                                                                                          | `1`              |
+| `iam.readinessProbe.enabled`                            | Enable readinessProbe on IAM containers                                                                                                                                                                                      | `true`           |
+| `iam.readinessProbe.initialDelaySeconds`                | Initial delay seconds for readinessProbe                                                                                                                                                                                     | `30`             |
+| `iam.readinessProbe.periodSeconds`                      | Period seconds for readinessProbe                                                                                                                                                                                            | `10`             |
+| `iam.readinessProbe.timeoutSeconds`                     | Timeout seconds for readinessProbe                                                                                                                                                                                           | `30`             |
+| `iam.readinessProbe.failureThreshold`                   | Failure threshold for readinessProbe                                                                                                                                                                                         | `6`              |
+| `iam.readinessProbe.successThreshold`                   | Success threshold for readinessProbe                                                                                                                                                                                         | `1`              |
+| `iam.startupProbe.enabled`                              | Enable startupProbe on IAM containers                                                                                                                                                                                        | `false`          |
+| `iam.startupProbe.initialDelaySeconds`                  | Initial delay seconds for startupProbe                                                                                                                                                                                       | `5`              |
+| `iam.startupProbe.periodSeconds`                        | Period seconds for startupProbe                                                                                                                                                                                              | `5`              |
+| `iam.startupProbe.timeoutSeconds`                       | Timeout seconds for startupProbe                                                                                                                                                                                             | `1`              |
+| `iam.startupProbe.failureThreshold`                     | Failure threshold for startupProbe                                                                                                                                                                                           | `15`             |
+| `iam.startupProbe.successThreshold`                     | Success threshold for startupProbe                                                                                                                                                                                           | `1`              |
+| `iam.resourcesPreset`                                   | Set IAM container resources according to one common preset (allowed values: none, nano, small, medium, large, xlarge, 2xlarge). This is ignored if webdav.resources is set (webdav.resources is recommended for production). | `nano`           |
+| `iam.resources`                                         | Set IAM container requests and limits for different resources like CPU or memory (essential for production workloads)                                                                                                        | `{}`             |
+| `iam.podSecurityContext.enabled`                        | Enable IAM pods' Security Context                                                                                                                                                                                            | `true`           |
+| `iam.podSecurityContext.fsGroupChangePolicy`            | Set filesystem group change policy for IAM pods                                                                                                                                                                              | `Always`         |
+| `iam.podSecurityContext.sysctls`                        | Set kernel settings using the sysctl interface for IAM pods                                                                                                                                                                  | `[]`             |
+| `iam.podSecurityContext.supplementalGroups`             | Set filesystem extra groups for IAM pods                                                                                                                                                                                     | `[]`             |
+| `iam.podSecurityContext.fsGroup`                        | Set fsGroup in IAM pods' Security Context                                                                                                                                                                                    | `1001`           |
+| `iam.containerSecurityContext.enabled`                  | Enabled IAM container' Security Context                                                                                                                                                                                      | `true`           |
+| `iam.containerSecurityContext.seLinuxOptions`           | Set SELinux options in IAM container                                                                                                                                                                                         | `{}`             |
+| `iam.containerSecurityContext.runAsUser`                | Set runAsUser in IAM container' Security Context                                                                                                                                                                             | `1001`           |
+| `iam.containerSecurityContext.runAsGroup`               | Set runAsGroup in IAM container' Security Context                                                                                                                                                                            | `1001`           |
+| `iam.containerSecurityContext.runAsNonRoot`             | Set runAsNonRoot in IAM container' Security Context                                                                                                                                                                          | `true`           |
+| `iam.containerSecurityContext.readOnlyRootFilesystem`   | Set readOnlyRootFilesystem in IAM container' Security Context                                                                                                                                                                | `true`           |
+| `iam.containerSecurityContext.privileged`               | Set privileged in IAM container' Security Context                                                                                                                                                                            | `false`          |
+| `iam.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in IAM container' Security Context                                                                                                                                                              | `false`          |
+| `iam.containerSecurityContext.capabilities.drop`        | List of capabilities to be dropped in IAM container                                                                                                                                                                          | `["ALL"]`        |
+| `iam.containerSecurityContext.seccompProfile.type`      | Set seccomp profile in IAM container                                                                                                                                                                                         | `RuntimeDefault` |
+| `iam.logLevel`                                          | IAM log level (0, 1, 2, 3, or 4)                                                                                                                                                                                             | `1`              |
+| `iam.command`                                           | Override default IAM container command (useful when using custom images)                                                                                                                                                     | `[]`             |
+| `iam.args`                                              | Override default IAM container args (useful when using custom images)                                                                                                                                                        | `[]`             |
+| `iam.automountServiceAccountToken`                      | Mount Service Account token in IAM pods                                                                                                                                                                                      | `false`          |
+| `iam.hostAliases`                                       | IAM pods host aliases                                                                                                                                                                                                        | `[]`             |
+| `iam.statefulsetAnnotations`                            | Annotations for IAM statefulset                                                                                                                                                                                              | `{}`             |
+| `iam.podLabels`                                         | Extra labels for IAM pods                                                                                                                                                                                                    | `{}`             |
+| `iam.podAnnotations`                                    | Annotations for IAM pods                                                                                                                                                                                                     | `{}`             |
+| `iam.podAffinityPreset`                                 | Pod affinity preset. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard`                                                                                                                                      | `""`             |
+| `iam.podAntiAffinityPreset`                             | Pod anti-affinity preset. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard`                                                                                                                                 | `soft`           |
+| `iam.nodeAffinityPreset.type`                           | Node affinity preset type. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard`                                                                                                                                | `""`             |
+| `iam.nodeAffinityPreset.key`                            | Node label key to match. Ignored if `iam.affinity` is set                                                                                                                                                                    | `""`             |
+| `iam.nodeAffinityPreset.values`                         | Node label values to match. Ignored if `iam.affinity` is set                                                                                                                                                                 | `[]`             |
+| `iam.affinity`                                          | Affinity for IAM pods assignment                                                                                                                                                                                             | `{}`             |
+| `iam.nodeSelector`                                      | Node labels for IAM pods assignment                                                                                                                                                                                          | `{}`             |
+| `iam.tolerations`                                       | Tolerations for IAM pods assignment                                                                                                                                                                                          | `[]`             |
+| `iam.updateStrategy.type`                               | IAM deployment strategy type                                                                                                                                                                                                 | `RollingUpdate`  |
+| `iam.priorityClassName`                                 | IAM pods' priorityClassName                                                                                                                                                                                                  | `""`             |
+| `iam.topologySpreadConstraints`                         | Topology Spread Constraints for IAM pod assignment spread across your cluster among failure-domains                                                                                                                          | `[]`             |
+| `iam.schedulerName`                                     | Name of the k8s scheduler (other than default) for IAM pods                                                                                                                                                                  | `""`             |
+| `iam.terminationGracePeriodSeconds`                     | Seconds IAM pods need to terminate gracefully                                                                                                                                                                                | `""`             |
+| `iam.lifecycleHooks`                                    | for IAM containers to automate configuration before or after startup                                                                                                                                                         | `{}`             |
+| `iam.extraEnvVars`                                      | Array with extra environment variables to add to IAM containers                                                                                                                                                              | `[]`             |
+| `iam.extraEnvVarsCM`                                    | Name of existing ConfigMap containing extra env vars for IAM containers                                                                                                                                                      | `""`             |
+| `iam.extraEnvVarsSecret`                                | Name of existing Secret containing extra env vars for IAM containers                                                                                                                                                         | `""`             |
+| `iam.extraVolumes`                                      | Optionally specify extra list of additional volumes for the IAM pods                                                                                                                                                         | `[]`             |
+| `iam.extraVolumeMounts`                                 | Optionally specify extra list of additional volumeMounts for the IAM containers                                                                                                                                              | `[]`             |
+| `iam.sidecars`                                          | Add additional sidecar containers to the IAM pods                                                                                                                                                                            | `[]`             |
+| `iam.initContainers`                                    | Add additional init containers to the IAM pods                                                                                                                                                                               | `[]`             |
+| `iam.pdb.create`                                        | Enable/disable a Pod Disruption Budget creation                                                                                                                                                                              | `true`           |
+| `iam.pdb.minAvailable`                                  | Minimum number/percentage of pods that should remain scheduled                                                                                                                                                               | `""`             |
+| `iam.pdb.maxUnavailable`                                | Maximum number/percentage of pods that may be made unavailable. Defaults to `1` if both `iam.pdb.minAvailable` and `iam.pdb.maxUnavailable` are empty.                                                                       | `""`             |
+
+### IAM Traffic Exposure Parameters
+
+| Name                                   | Description                                                                    | Value       |
+| -------------------------------------- | ------------------------------------------------------------------------------ | ----------- |
+| `iam.service.type`                     | IAM service type                                                               | `ClusterIP` |
+| `iam.service.ports.http`               | IAM service HTTP port (HTTPS if `iam.tls.enabled` is `true`)                   | `8111`      |
+| `iam.service.nodePorts.http`           | Node port for HTTP (HTTPS if `iam.tls.enabled` is `true`)                      | `""`        |
+| `iam.service.clusterIP`                | IAM service Cluster IP                                                         | `""`        |
+| `iam.service.loadBalancerIP`           | IAM service Load Balancer IP                                                   | `""`        |
+| `iam.service.loadBalancerSourceRanges` | IAM service Load Balancer sources                                              | `[]`        |
+| `iam.service.externalTrafficPolicy`    | IAM service external traffic policy                                            | `Cluster`   |
+| `iam.service.annotations`              | Additional custom annotations for IAM service                                  | `{}`        |
+| `iam.service.extraPorts`               | Extra ports to expose in IAM service (normally used with the `sidecars` value) | `[]`        |
+| `iam.service.sessionAffinity`          | Control where client requests go, to the same pod or round-robin               | `None`      |
+| `iam.service.sessionAffinityConfig`    | Additional settings for the sessionAffinity                                    | `{}`        |
+
 ### Init Container Parameters
 
 | Name                                                        | Description                                                                                                                                                                                                                                         | Value                      |
@@ -1115,7 +1245,6 @@ enabled = false
 | `mariadb.auth.database`                                                              | MariaDB custom database                                                                                                                                                                                                                                                                                        | `bitnami_seaweedfs`          |
 | `mariadb.auth.username`                                                              | MariaDB custom user name                                                                                                                                                                                                                                                                                       | `bn_seaweedfs`               |
 | `mariadb.auth.password`                                                              | MariaDB custom user password                                                                                                                                                                                                                                                                                   | `""`                         |
-| `mariadb.auth.usePasswordFiles`                                                      | Mount credentials as a file instead of using an environment variable                                                                                                                                                                                                                                           | `false`                      |
 | `mariadb.initdbScripts`                                                              | Specify dictionary of scripts to be run at first boot                                                                                                                                                                                                                                                          | `{}`                         |
 | `mariadb.primary.persistence.enabled`                                                | Enable persistence on MariaDB using PVC(s)                                                                                                                                                                                                                                                                     | `true`                       |
 | `mariadb.primary.persistence.storageClass`                                           | Persistent Volume storage class                                                                                                                                                                                                                                                                                | `""`                         |
@@ -1151,6 +1280,7 @@ enabled = false
 | `externalDatabase.password`                                                          | External Database user password                                                                                                                                                                                                                                                                                | `""`                         |
 | `externalDatabase.database`                                                          | External Database database name                                                                                                                                                                                                                                                                                | `bitnami_seaweedfs`          |
 | `externalDatabase.existingSecret`                                                    | The name of an existing secret with database credentials. Evaluated as a template                                                                                                                                                                                                                              | `""`                         |
+| `externalDatabase.waitForDatabaseEnabled`                                            | Whether to check for external database before starting seaweedfs containers                                                                                                                                                                                                                                    | `true`                       |
 | `externalDatabase.initDatabaseJob.enabled`                                           | Enable the init external database job                                                                                                                                                                                                                                                                          | `false`                      |
 | `externalDatabase.initDatabaseJob.labels`                                            | Extra labels for the init external database job                                                                                                                                                                                                                                                                | `{}`                         |
 | `externalDatabase.initDatabaseJob.annotations`                                       | Extra annotations for the init external database job                                                                                                                                                                                                                                                           | `{}`                         |
@@ -1232,7 +1362,7 @@ Find more information about how to deal with common errors related to Bitnami's
 
 ## License
 
-Copyright &copy; 2024 Broadcom. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
+Copyright &copy; 2025 Broadcom. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/helm/seaweedfs/charts/common-2.30.2.tgz b/helm/seaweedfs/charts/common-2.30.2.tgz
deleted file mode 100644
index f35ca37f859944b5081011965987ff76bf3d75fc..0000000000000000000000000000000000000000
Binary files a/helm/seaweedfs/charts/common-2.30.2.tgz and /dev/null differ
diff --git a/helm/seaweedfs/charts/common-2.31.1.tgz b/helm/seaweedfs/charts/common-2.31.1.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..cf6cff738dbd2e462d1a295a45ebab5d32bd5c7b
Binary files /dev/null and b/helm/seaweedfs/charts/common-2.31.1.tgz differ
diff --git a/helm/seaweedfs/charts/mariadb-20.5.3.tgz b/helm/seaweedfs/charts/mariadb-20.5.3.tgz
deleted file mode 100644
index 26e91fd8cfba97218673197133afa7dbbb7db995..0000000000000000000000000000000000000000
Binary files a/helm/seaweedfs/charts/mariadb-20.5.3.tgz and /dev/null differ
diff --git a/helm/seaweedfs/charts/mariadb-20.5.5.tgz b/helm/seaweedfs/charts/mariadb-20.5.5.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..3e573f1be539f7cde21b4dc6e5e22e93907613d7
Binary files /dev/null and b/helm/seaweedfs/charts/mariadb-20.5.5.tgz differ
diff --git a/helm/seaweedfs/charts/postgresql-16.6.6.tgz b/helm/seaweedfs/charts/postgresql-16.6.6.tgz
deleted file mode 100644
index eea64cae7283ea48f6dd6977b6d7ba2af21cd948..0000000000000000000000000000000000000000
Binary files a/helm/seaweedfs/charts/postgresql-16.6.6.tgz and /dev/null differ
diff --git a/helm/seaweedfs/charts/postgresql-16.7.2.tgz b/helm/seaweedfs/charts/postgresql-16.7.2.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..8e301c65cb1ce405a17995e3462a81e4f052f917
Binary files /dev/null and b/helm/seaweedfs/charts/postgresql-16.7.2.tgz differ
diff --git a/helm/seaweedfs/templates/_helpers.tpl b/helm/seaweedfs/templates/_helpers.tpl
index 9f76dc6966ce3d40ec3337b4822f67a55702f52e..85cb277cc617c9ae37e51fe4a02c6c44bfb1876b 100644
--- a/helm/seaweedfs/templates/_helpers.tpl
+++ b/helm/seaweedfs/templates/_helpers.tpl
@@ -24,6 +24,13 @@ Return the proper SeaweedFS Filer Server fullname
 {{- printf "%s-filer" (include "common.names.fullname" .) | trunc 63 | trimSuffix "-" -}}
 {{- end -}}
 
+{{/*
+Return the proper SeaweedFS IAM Server fullname
+*/}}
+{{- define "seaweedfs.iam.fullname" -}}
+{{- printf "%s-iam" (include "common.names.fullname" .) | trunc 63 | trimSuffix "-" -}}
+{{- end -}}
+
 {{/*
 Return the proper SeaweedFS Amazon S3 API fullname
 */}}
@@ -77,6 +84,17 @@ Return the proper init external database job image name
 {{- end -}}
 {{- end -}}
 
+{{/*
+Returns whether wait for external database is enabled
+*/}}
+{{- define "seaweedfs.waitForDatabase.enabled" -}}
+{{- if or .Values.mariadb.enabled .Values.postgresql.enabled (and .Values.externalDatabase.enabled (eq .Values.externalDatabase.waitForDatabaseEnabled true) ) }}
+    {{- print "true" -}}
+  {{- else }}
+    {{- print "false" -}}
+{{- end -}}
+{{- end -}}
+
 {{/*
 Return the proper Docker Image Registry Secret Names
 */}}
@@ -128,6 +146,17 @@ Return the Filer Server configuration configmap.
 {{- end -}}
 {{- end -}}
 
+{{/*
+Return the Filer Server notification configuration configmap.
+*/}}
+{{- define "seaweedfs.filer.notificationConfigmapName" -}}
+{{- if .Values.filer.existingNotificationConfigmap -}}
+    {{- print (tpl .Values.filer.existingNotificationConfigmap .) -}}
+{{- else -}}
+    {{- printf "%s-notification" (include "seaweedfs.filer.fullname" .) -}}
+{{- end -}}
+{{- end -}}
+
 {{/*
 Return the Master Server peers
 */}}
@@ -339,6 +368,7 @@ Return the database secret key name
 Returns an init-container that waits for the database to be ready
 */}}
 {{- define "seaweedfs.filer.waitForDBInitContainer" -}}
+{{ if eq "true" ( include "seaweedfs.waitForDatabase.enabled" . ) }}
 - name: wait-for-db
   image: {{ include "seaweedfs.initDatabaseJob.image" . }}
   {{- if or .Values.mariadb.enabled (and .Values.externalDatabase.enabled (eq .Values.externalDatabase.store "mariadb") ) }}
@@ -415,6 +445,7 @@ Returns an init-container that waits for the database to be ready
     - name: db-credentials
       mountPath: /secrets
 {{- end -}}
+{{- end -}}
 
 {{/*
 Returns an init-container that generates auth configuration for the Amazon S3 API
@@ -431,7 +462,12 @@ Returns an init-container that generates auth configuration for the Amazon S3 AP
   args:
     - -ec
     - |
-      #!/bin/bash
+      {{- if .Values.usePasswordFiles }}
+      export ADMIN_ACCESS_KEY_ID="$(< $ADMIN_ACCESS_KEY_ID_FILE)"
+      export ADMIN_SECRET_ACCESS_KEY="$(< $ADMIN_SECRET_ACCESS_KEY_FILE)"
+      export READ_ACCESS_KEY_ID="$(< $READ_ACCESS_KEY_ID_FILE)"
+      export READ_SECRET_ACCESS_KEY="$(< $READ_SECRET_ACCESS_KEY_FILE)"
+      {{- end }}
 
       cat > "/auth/config.json" <<EOF
       {
@@ -468,6 +504,16 @@ Returns an init-container that generates auth configuration for the Amazon S3 AP
       }
       EOF
   env:
+    {{- if .Values.usePasswordFiles }}
+    - name: ADMIN_ACCESS_KEY_ID_FILE
+      value: "/opt/bitnami/seaweed/secrets/admin_access_key_id"
+    - name: ADMIN_SECRET_ACCESS_KEY_FILE
+      value: "/opt/bitnami/seaweed/secrets/admin_secret_access_key"
+    - name: READ_ACCESS_KEY_ID_FILE
+      value: "/opt/bitnami/seaweed/secrets/read_access_key_id"
+    - name: READ_SECRET_ACCESS_KEY_FILE
+      value: "/opt/bitnami/seaweed/secrets/read_secret_access_key"
+    {{- else }}
     - name: ADMIN_ACCESS_KEY_ID
       valueFrom:
         secretKeyRef:
@@ -488,6 +534,7 @@ Returns an init-container that generates auth configuration for the Amazon S3 AP
         secretKeyRef:
           name: {{ printf "%s-auth" (include "seaweedfs.s3.fullname" .) }}
           key: read_secret_access_key
+    {{- end }}
   {{- if .Values.s3.resources }}
   resources: {{- toYaml .Values.s3.resources | nindent 12 }}
   {{- else if ne .Values.s3.resourcesPreset "none" }}
@@ -497,6 +544,10 @@ Returns an init-container that generates auth configuration for the Amazon S3 AP
     - name: empty-dir
       mountPath: /auth
       subPath: auth-dir
+    {{- if .Values.usePasswordFiles }}
+    - name: seaweed-secrets
+      mountPath: /opt/bitnami/seaweed/secrets
+    {{- end}}
 {{- end -}}
 
 {{/*
@@ -518,6 +569,7 @@ Compile all warnings into a single message.
 {{- $messages := list -}}
 {{- $messages := append $messages (include "seaweedfs.validateValues.security.mTLS" .) -}}
 {{- $messages := append $messages (include "seaweedfs.validateValues.master.replicaCount" .) -}}
+{{- $messages := append $messages (include "seaweedfs.validateValues.filer.replicaCount" .) -}}
 {{- $messages := append $messages (include "seaweedfs.validateValues.volume.replicaCount" .) -}}
 {{- $messages := append $messages (include "seaweedfs.validateValues.volume.dataVolumes" .) -}}
 {{- $messages := append $messages (include "seaweedfs.validateValues.filer.database" .) -}}
@@ -562,12 +614,27 @@ Validate values of SeaweedFS - number of Master server replicas
 */}}
 {{- define "seaweedfs.validateValues.master.replicaCount" -}}
 {{- $masterReplicaCount := int .Values.master.replicaCount }}
-{{- if and .Values.master.persistence.enabled .Values.master.persistence.existingClaim (gt $masterReplicaCount 1) -}}
+{{- if and (or (and .Values.master.persistence.enabled .Values.master.persistence.existingClaim) (and .Values.master.logPersistence.enabled .Values.master.logPersistence.existingClaim)) (gt $masterReplicaCount 1) -}}
 master.replicaCount
     A single existing PVC cannot be shared between multiple Master Server replicas.
     Please set a valid number of replicas (--set master.replicaCount=1), disable persistence
-    (--set master.persistence.enabled=false) or rely on dynamic provisioning via Persitent
-    Volume Claims (--set master.persistence.existingClaim="").
+    (--set master.persistence.enabled=false,master.logPersistence.enabled=false) or
+    rely on dynamic provisioning via Persistent Volume Claims
+    (--set master.persistence.existingClaim="",master.logPersistence.existingClaim="").
+{{- end -}}
+{{- end -}}
+
+{{/*
+Validate values of SeaweedFS - number of Filer server replicas
+*/}}
+{{- define "seaweedfs.validateValues.filer.replicaCount" -}}
+{{- $filerReplicaCount := int .Values.filer.replicaCount }}
+{{- if and .Values.filer.enabled .Values.filer.logPersistence.enabled .Values.filer.logPersistence.existingClaim (gt $filerReplicaCount 1) -}}
+filer.replicaCount
+    A single existing PVC cannot be shared between multiple Filer Server replicas.
+    Please set a valid number of replicas (--set filer.replicaCount=1), disable persistence
+    (--set filer.logPersistence.enabled=false) or rely on dynamic provisioning via
+    Persistent Volume Claims (--set filer.logPersistence.existingClaim="").
 {{- end -}}
 {{- end -}}
 
@@ -585,6 +652,13 @@ volume.replicaCount
     Volume Claims (--set volume.dataVolumes[].persistence.existingClaim="").
 {{- end -}}
 {{- end -}}
+{{- if and .Values.volume.logPersistence.enabled .Values.volume.logPersistence.existingClaim (gt $volumeReplicaCount 1) -}}
+volume.replicaCount
+    A single existing PVC cannot be shared between multiple Volume Server replicas.
+    Please set a valid number of replicas (--set volume.replicaCount=1), disable persistence
+    (--set volume.logPersistence.enabled=false) or rely on dynamic provisioning via Persistent Volume Claims
+    (--set volume.logPersistence.existingClaim="").
+{{- end -}}
 {{- end -}}
 
 {{/*
diff --git a/helm/seaweedfs/templates/filer/hpa.yaml b/helm/seaweedfs/templates/filer/hpa.yaml
index c2c967235f6345af184794f7d689745738348b23..725158c21281674a09c86c8e6849ec44b95f143f 100644
--- a/helm/seaweedfs/templates/filer/hpa.yaml
+++ b/helm/seaweedfs/templates/filer/hpa.yaml
@@ -26,24 +26,16 @@ spec:
     - type: Resource
       resource:
         name: memory
-        {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }}
-        targetAverageUtilization: {{ .Values.filer.autoscaling.targetMemory  }}
-        {{- else }}
         target:
           type: Utilization
           averageUtilization: {{ .Values.filer.autoscaling.targetMemory }}
-        {{- end }}
     {{- end }}
     {{- if .Values.filer.autoscaling.targetCPU }}
     - type: Resource
       resource:
         name: cpu
-        {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }}
-        targetAverageUtilization: {{ .Values.filer.autoscaling.targetCPU }}
-        {{- else }}
         target:
           type: Utilization
           averageUtilization: {{ .Values.filer.autoscaling.targetCPU }}
-        {{- end }}
     {{- end }}
 {{- end }}
diff --git a/helm/seaweedfs/templates/filer/ingress.yaml b/helm/seaweedfs/templates/filer/ingress.yaml
index 5ebfed11f95cfdb173470d453d00d229e283caa0..c92a9314563052700129e5a322cd5d213623f7c4 100644
--- a/helm/seaweedfs/templates/filer/ingress.yaml
+++ b/helm/seaweedfs/templates/filer/ingress.yaml
@@ -16,7 +16,7 @@ metadata:
   annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }}
   {{- end }}
 spec:
-  {{- if and .Values.filer.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }}
+  {{- if .Values.filer.ingress.ingressClassName }}
   ingressClassName: {{ .Values.filer.ingress.ingressClassName | quote }}
   {{- end }}
   rules:
@@ -27,9 +27,7 @@ spec:
           {{- toYaml .Values.filer.ingress.extraPaths | nindent 10 }}
           {{- end }}
           - path: {{ .Values.filer.ingress.path }}
-            {{- if eq "true" (include "common.ingress.supportsPathType" .) }}
             pathType: {{ .Values.filer.ingress.pathType }}
-            {{- end }}
             backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.filer.fullname" .) "servicePort" "http" "context" $)  | nindent 14 }}
       {{- if not (empty .Values.filer.ingress.hostname )}}
       host: {{ .Values.filer.ingress.hostname }}
@@ -40,9 +38,7 @@ spec:
       http:
         paths:
           - path: {{ default "/" .path }}
-            {{- if eq "true" (include "common.ingress.supportsPathType" $) }}
             pathType: {{ default "ImplementationSpecific" .pathType }}
-            {{- end }}
             backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.filer.fullname" $) "servicePort" "http" "context" $) | nindent 14 }}
     {{- end }}
     {{- if .Values.filer.ingress.extraRules }}
diff --git a/helm/seaweedfs/templates/filer/notification-configmap.yaml b/helm/seaweedfs/templates/filer/notification-configmap.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..367e1bf9452d6a85dec31246a89a077f70ef672e
--- /dev/null
+++ b/helm/seaweedfs/templates/filer/notification-configmap.yaml
@@ -0,0 +1,20 @@
+{{- /*
+Copyright Broadcom, Inc. All Rights Reserved.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and .Values.filer.enabled .Values.filer.notificationConfig (empty .Values.filer.existingNotificationConfigmap) }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: {{ printf "%s-notification" (include "seaweedfs.filer.fullname" .) }}
+  namespace: {{ include "common.names.namespace" . | quote }}
+  labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+    app.kubernetes.io/component: filer
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+data:
+  notification.toml: |-
+{{ include "common.tplvalues.render" ( dict "value" .Values.filer.notificationConfig "context" $ ) | indent 4 }}
+{{- end }}
diff --git a/helm/seaweedfs/templates/filer/statefulset.yaml b/helm/seaweedfs/templates/filer/statefulset.yaml
index 8a9c8b442a0dc5b4a2a5f400669d02469d92a7f9..42037cec106d7aefe8f941ae03ca0510915284d7 100644
--- a/helm/seaweedfs/templates/filer/statefulset.yaml
+++ b/helm/seaweedfs/templates/filer/statefulset.yaml
@@ -34,6 +34,9 @@ spec:
         {{- if and .Values.filer.config (empty .Values.filer.existingConfigmap) }}
         checksum/config: {{ include (print $.Template.BasePath "/filer/configmap.yaml") . | sha256sum }}
         {{- end }}
+        {{- if and .Values.filer.notificationConfig (empty .Values.filer.existingNotificationConfigmap) }}
+        checksum/notification-config: {{ include (print $.Template.BasePath "/filer/notification-configmap.yaml") . | sha256sum }}
+        {{- end }}
         checksum/security-config: {{ include (print $.Template.BasePath "/security-configmap.yaml") . | sha256sum }}
         {{- if .Values.filer.podAnnotations }}
         {{- include "common.tplvalues.render" (dict "value" .Values.filer.podAnnotations "context" $) | nindent 8 }}
@@ -105,7 +108,11 @@ spec:
           args: {{- include "common.tplvalues.render" (dict "value" .Values.filer.args "context" $) | nindent 12 }}
           {{- else }}
           args:
+            {{- if .Values.filer.logPersistence.enabled }}
+            - -logdir={{ .Values.filer.logPersistence.mountPath }}
+            {{- else }}
             - -logtostderr=true
+            {{- end }}
             - -v={{ .Values.filer.logLevel }}
             - -config_dir=/etc/seaweedfs
             - filer
@@ -235,6 +242,13 @@ spec:
           lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.filer.lifecycleHooks "context" $) | nindent 12 }}
           {{- end }}
           volumeMounts:
+            {{- if .Values.filer.logPersistence.enabled }}
+            - name: logs
+              mountPath: {{ .Values.filer.logPersistence.mountPath }}
+              {{- if .Values.filer.logPersistence.subPath }}
+              subPath: {{ .Values.filer.logPersistence.subPath }}
+              {{- end }}
+            {{- end }}
             - name: empty-dir
               mountPath: /tmp
               subPath: tmp-dir
@@ -244,6 +258,12 @@ spec:
               subPath: filer.toml
               readOnly: true
             {{- end }}
+            {{- if or .Values.filer.notificationConfig .Values.filer.existingNotificationConfigmap }}
+            - name: notification-config
+              mountPath: /etc/seaweedfs/notification.toml
+              subPath: notification.toml
+              readOnly: true
+            {{- end }}
             - name: security-config
               mountPath: /etc/seaweedfs/security.toml
               subPath: security.toml
@@ -285,6 +305,11 @@ spec:
           configMap:
             name: {{ template "seaweedfs.filer.configmapName" . }}
         {{- end }}
+        {{- if or .Values.filer.notificationConfig .Values.filer.existingNotificationConfigmap }}
+        - name: notification-config
+          configMap:
+            name: {{ template "seaweedfs.filer.notificationConfigmapName" . }}
+        {{- end }}
         - name: security-config
           configMap:
             name: {{ printf "%s-security" (include "common.names.fullname" .) }}
@@ -311,4 +336,42 @@ spec:
         {{- if .Values.filer.extraVolumes }}
         {{- include "common.tplvalues.render" (dict "value" .Values.filer.extraVolumes "context" $) | nindent 8 }}
         {{- end }}
+  {{- if and .Values.filer.logPersistence.enabled .Values.filer.logPersistence.existingClaim }}
+        - name: logs
+          persistentVolumeClaim:
+            claimName: {{ tpl .Values.filer.logPersistence.existingClaim . }}
+  {{- else if .Values.filer.logPersistence.enabled }}
+  {{- if .Values.filer.persistentVolumeClaimRetentionPolicy.enabled }}
+  persistentVolumeClaimRetentionPolicy:
+    whenDeleted: {{ .Values.filer.persistentVolumeClaimRetentionPolicy.whenDeleted }}
+    whenScaled: {{ .Values.filer.persistentVolumeClaimRetentionPolicy.whenScaled }}
+  {{- end }}
+  volumeClaimTemplates:
+    - apiVersion: v1
+      kind: PersistentVolumeClaim
+      metadata:
+        name: logs
+        {{- if or .Values.filer.logPersistence.annotations .Values.commonAnnotations }}
+        {{- $claimAnnotations := include "common.tplvalues.merge" (dict "values" .Values.filer.logPersistence.annotations .Values.commonAnnotations "context" .) | fromYaml }}
+        annotations: {{- include "common.tplvalues.render" ( dict "value" $claimAnnotations "context" $ ) | nindent 10 }}
+        {{- end }}
+        {{- if .Values.commonLabels }}
+        labels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 10 }}
+        {{- end }}
+      spec:
+        {{- if .Values.filer.logPersistence.dataSource }}
+        dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.filer.logPersistence.dataSource "context" $) | nindent 10 }}
+        {{- end }}
+        accessModes:
+        {{- range .Values.filer.logPersistence.accessModes }}
+          - {{ . | quote }}
+        {{- end }}
+        resources:
+          requests:
+            storage: {{ .Values.filer.logPersistence.size | quote }}
+        {{- if .Values.filer.logPersistence.selector }}
+        selector: {{- include "common.tplvalues.render" (dict "value" .Values.filer.logPersistence.selector "context" $) | nindent 10 }}
+        {{- end }}
+        {{- include "common.storage.class" (dict "persistence" .Values.filer.logPersistence "global" .Values.global) | nindent 8 }}
+  {{- end }}
 {{- end }}
diff --git a/helm/seaweedfs/templates/iam/deployment.yaml b/helm/seaweedfs/templates/iam/deployment.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..9386f2bd67705ffca6ac9d2c0f3f1b19a362a43b
--- /dev/null
+++ b/helm/seaweedfs/templates/iam/deployment.yaml
@@ -0,0 +1,226 @@
+{{- /*
+Copyright Broadcom, Inc. All Rights Reserved.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and .Values.filer.enabled .Values.iam.enabled }}
+apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }}
+kind: Deployment
+metadata:
+  name: {{ template "seaweedfs.iam.fullname" . }}
+  namespace: {{ include "common.names.namespace" . | quote }}
+  labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+    app.kubernetes.io/component: iam
+  {{- if or .Values.iam.statefulsetAnnotations .Values.commonAnnotations }}
+  {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.iam.statefulsetAnnotations .Values.commonAnnotations) "context" .) }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  replicas: {{ .Values.iam.replicaCount }}
+  {{- $podLabels := include "common.tplvalues.merge" (dict "values" (list .Values.iam.podLabels .Values.commonLabels) "context" .) }}
+  selector:
+    matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }}
+      app.kubernetes.io/component: iam
+  {{- if .Values.iam.updateStrategy }}
+  strategy: {{- toYaml .Values.iam.updateStrategy | nindent 4 }}
+  {{- end }}
+  template:
+    metadata:
+      annotations:
+        checksum/security-config: {{ include (print $.Template.BasePath "/security-configmap.yaml") . | sha256sum }}
+        {{- if .Values.iam.podAnnotations }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.iam.podAnnotations "context" $) | nindent 8 }}
+        {{- end }}
+      labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }}
+        app.kubernetes.io/component: iam
+    spec:
+      {{- include "seaweedfs.imagePullSecrets" . | nindent 6 }}
+      serviceAccountName: {{ template "seaweedfs.serviceAccountName" . }}    
+      automountServiceAccountToken: {{ .Values.iam.automountServiceAccountToken }}
+      {{- if .Values.iam.hostAliases }}
+      hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.iam.hostAliases "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.iam.affinity }}
+      affinity: {{- include "common.tplvalues.render" ( dict "value" .Values.iam.affinity "context" $) | nindent 8 }}
+      {{- else }}
+      affinity:
+        {{- if not (empty .Values.iam.podAffinityPreset) }}
+        podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.iam.podAffinityPreset "component" "iam" "customLabels" $podLabels "context" $) | nindent 10 }}
+        {{- end }}
+        {{- if not (empty .Values.iam.podAntiAffinityPreset) }}
+        podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.iam.podAntiAffinityPreset "component" "iam" "customLabels" $podLabels "context" $) | nindent 10 }}
+        {{- end }}
+        {{- if not (empty .Values.iam.nodeAffinityPreset.type) }}
+        nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.iam.nodeAffinityPreset.type "key" .Values.iam.nodeAffinityPreset.key "values" .Values.iam.nodeAffinityPreset.values) | nindent 10 }}
+        {{- end }}
+      {{- end }}
+      {{- if .Values.iam.nodeSelector }}
+      nodeSelector: {{- include "common.tplvalues.render" ( dict "value" .Values.iam.nodeSelector "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.iam.tolerations }}
+      tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.iam.tolerations "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.iam.priorityClassName }}
+      priorityClassName: {{ .Values.iam.priorityClassName | quote }}
+      {{- end }}
+      {{- if .Values.iam.schedulerName }}
+      schedulerName: {{ .Values.iam.schedulerName | quote }}
+      {{- end }}
+      {{- if .Values.iam.topologySpreadConstraints }}
+      topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.iam.topologySpreadConstraints "context" .) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.iam.podSecurityContext.enabled }}
+      securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.iam.podSecurityContext "context" $) | nindent 8 }}
+      {{- end }}
+      {{- if .Values.iam.terminationGracePeriodSeconds }}
+      terminationGracePeriodSeconds: {{ .Values.iam.terminationGracePeriodSeconds }}
+      {{- end }}
+      initContainers:
+        {{- if .Values.iam.initContainers }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.iam.initContainers "context" $) | nindent 8 }}
+        {{- end }}
+      containers:
+        - name: seaweedfs
+          image: {{ template "seaweedfs.image" . }}
+          imagePullPolicy: {{ .Values.image.pullPolicy }}
+          {{- if .Values.iam.containerSecurityContext.enabled }}
+          securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.iam.containerSecurityContext "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }}
+          {{- else if .Values.iam.command }}
+          command: {{- include "common.tplvalues.render" (dict "value" .Values.iam.command "context" $) | nindent 12 }}
+          {{- end }}
+          {{- if .Values.diagnosticMode.enabled }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }}
+          {{- else if .Values.iam.args }}
+          args: {{- include "common.tplvalues.render" (dict "value" .Values.iam.args "context" $) | nindent 12 }}
+          {{- else }}
+          args:
+            - -logtostderr=true
+            - -v={{ .Values.iam.logLevel }}
+            - iam
+            - -port={{ .Values.iam.containerPorts.http }}
+            - -filer={{ printf "%s:%d" (include "seaweedfs.filer.fullname" .) (int .Values.filer.service.ports.http) }}
+            - -master={{ printf "%s:%d" (include "seaweedfs.master.fullname" .) (int .Values.master.service.ports.http) }}
+          {{- end }}
+          env:
+            - name: BITNAMI_DEBUG
+              value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }}
+            - name: WEED_CLUSTER_DEFAULT
+              value: {{ .Values.clusterDefault | quote }}
+            {{- if .Values.iam.extraEnvVars }}
+            {{- include "common.tplvalues.render" (dict "value" .Values.iam.extraEnvVars "context" $) | nindent 12 }}
+            {{- end }}
+          {{- if or .Values.iam.extraEnvVarsCM .Values.iam.extraEnvVarsSecret }}
+          envFrom:
+            {{- if .Values.iam.extraEnvVarsCM }}
+            - configMapRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.iam.extraEnvVarsCM "context" $) }}
+            {{- end }}
+            {{- if .Values.iam.extraEnvVarsSecret }}
+            - secretRef:
+                name: {{ include "common.tplvalues.render" (dict "value" .Values.iam.extraEnvVarsSecret "context" $) }}
+            {{- end }}
+          {{- end }}
+          {{- if .Values.iam.resources }}
+          resources: {{- toYaml .Values.iam.resources | nindent 12 }}
+          {{- else if ne .Values.iam.resourcesPreset "none" }}
+          resources: {{- include "common.resources.preset" (dict "type" .Values.iam.resourcesPreset) | nindent 12 }}
+          {{- end }}
+          ports:
+            - name: "http"
+              containerPort: {{ .Values.iam.containerPorts.http }}
+            {{- if .Values.iam.extraContainerPorts }}
+            {{- include "common.tplvalues.render" (dict "value" .Values.iam.extraContainerPorts "context" $) | nindent 12 }}
+            {{- end }}
+          {{- if not .Values.diagnosticMode.enabled }}
+          {{- if .Values.iam.customLivenessProbe }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.iam.customLivenessProbe "context" $) | nindent 12 }}
+          {{- else if .Values.iam.livenessProbe.enabled }}
+          livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.iam.livenessProbe "enabled") "context" $) | nindent 12 }}
+            exec:
+              command:
+                - pgrep
+                - -f
+                - iam
+          {{- end }}
+          {{- if .Values.iam.customReadinessProbe }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.iam.customReadinessProbe "context" $) | nindent 12 }}
+          {{- else if .Values.iam.readinessProbe.enabled }}
+          readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.iam.readinessProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: "http"
+          {{- end }}
+          {{- if .Values.iam.customStartupProbe }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.iam.customStartupProbe "context" $) | nindent 12 }}
+          {{- else if .Values.iam.startupProbe.enabled }}
+          startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.iam.startupProbe "enabled") "context" $) | nindent 12 }}
+            tcpSocket:
+              port: "http"
+          {{- end }}
+          {{- end }}
+          {{- if .Values.iam.lifecycleHooks }}
+          lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.iam.lifecycleHooks "context" $) | nindent 12 }}
+          {{- end }}
+          volumeMounts:
+            - name: empty-dir
+              mountPath: /tmp
+              subPath: tmp-dir
+            - name: security-config
+              mountPath: /etc/seaweedfs/security.toml
+              subPath: security.toml
+              readOnly: true
+            {{- if .Values.security.mTLS.enabled  }}
+            - name: ca-cert
+              readOnly: true
+              mountPath: /certs/ca
+            - name: master-cert
+              readOnly: true
+              mountPath: /certs/master
+            - name: filer-cert
+              readOnly: true
+              mountPath: /certs/filer
+            - name: volume-cert
+              readOnly: true
+              mountPath: /certs/volume
+            - name: client-cert
+              readOnly: true
+              mountPath: /certs/client
+            {{- end }}
+          {{- if .Values.iam.extraVolumeMounts }}
+          {{- include "common.tplvalues.render" (dict "value" .Values.iam.extraVolumeMounts "context" $) | nindent 12 }}
+          {{- end }}
+        {{- if .Values.iam.sidecars }}
+        {{- include "common.tplvalues.render" ( dict "value" .Values.iam.sidecars "context" $) | nindent 8 }}
+        {{- end }}
+      volumes:
+        - name: empty-dir
+          emptyDir: {}
+        - name: security-config
+          configMap:
+            name: {{ printf "%s-security" (include "common.names.fullname" .) }}
+        {{- if .Values.security.mTLS.enabled  }}
+        - name: ca-cert
+          secret:
+            secretName: {{ template "seaweedfs.security.mTLS.caSecretName" . }}
+            items:
+              - key: tls.crt
+                path: tls.crt
+        - name: master-cert
+          secret:
+            secretName: {{ template "seaweedfs.security.mTLS.master.secretName" . }}
+        - name: filer-cert
+          secret:
+            secretName: {{ template "seaweedfs.security.mTLS.filer.secretName" . }}
+        - name: volume-cert
+          secret:
+            secretName: {{ template "seaweedfs.security.mTLS.volume.secretName" . }}
+        - name: client-cert
+          secret:
+            secretName: {{ template "seaweedfs.security.mTLS.client.secretName" . }}
+        {{- end }}
+        {{- if .Values.iam.extraVolumes }}
+        {{- include "common.tplvalues.render" (dict "value" .Values.iam.extraVolumes "context" $) | nindent 8 }}
+        {{- end }}
+{{- end }}
diff --git a/helm/seaweedfs/templates/iam/pdb.yaml b/helm/seaweedfs/templates/iam/pdb.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..6c00475fa5037297f12a3620d660bc25c500bf68
--- /dev/null
+++ b/helm/seaweedfs/templates/iam/pdb.yaml
@@ -0,0 +1,28 @@
+{{- /*
+Copyright Broadcom, Inc. All Rights Reserved.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and .Values.filer.enabled .Values.iam.enabled .Values.iam.pdb.create }}
+apiVersion: {{ include "common.capabilities.policy.apiVersion" . }}
+kind: PodDisruptionBudget
+metadata:
+  name: {{ template "seaweedfs.iam.fullname" . }}
+  namespace: {{ include "common.names.namespace" . | quote }}
+  labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+    app.kubernetes.io/component: iam
+  {{- if .Values.commonAnnotations }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  {{- if .Values.iam.pdb.minAvailable }}
+  minAvailable: {{ .Values.iam.pdb.minAvailable }}
+  {{- end  }}
+  {{- if or .Values.iam.pdb.maxUnavailable (not .Values.iam.pdb.minAvailable) }}
+  maxUnavailable: {{ .Values.iam.pdb.maxUnavailable | default 1 }}
+  {{- end  }}
+  {{- $podLabels := include "common.tplvalues.merge" (dict "values" (list .Values.iam.podLabels .Values.commonLabels) "context" .) }}
+  selector:
+    matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }}
+      app.kubernetes.io/component: iam
+{{- end }}
diff --git a/helm/seaweedfs/templates/iam/service.yaml b/helm/seaweedfs/templates/iam/service.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..1589697cea5a2372c1f63d967511bcb049923873
--- /dev/null
+++ b/helm/seaweedfs/templates/iam/service.yaml
@@ -0,0 +1,54 @@
+{{- /*
+Copyright Broadcom, Inc. All Rights Reserved.
+SPDX-License-Identifier: APACHE-2.0
+*/}}
+
+{{- if and .Values.filer.enabled .Values.iam.enabled }}
+apiVersion: v1
+kind: Service
+metadata:
+  name: {{ template "seaweedfs.iam.fullname" . }}
+  namespace: {{ include "common.names.namespace" . | quote }}
+  labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
+    app.kubernetes.io/component: iam
+  {{- if or .Values.iam.service.annotations .Values.commonAnnotations }}
+  {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.iam.service.annotations .Values.commonAnnotations) "context" .) }}
+  annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }}
+  {{- end }}
+spec:
+  type: {{ .Values.iam.service.type }}
+  {{- if and .Values.iam.service.clusterIP (eq .Values.iam.service.type "ClusterIP") }}
+  clusterIP: {{ .Values.iam.service.clusterIP }}
+  {{- end }}
+  {{- if .Values.iam.service.sessionAffinity }}
+  sessionAffinity: {{ .Values.iam.service.sessionAffinity }}
+  {{- end }}
+  {{- if .Values.iam.service.sessionAffinityConfig }}
+  sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.iam.service.sessionAffinityConfig "context" $) | nindent 4 }}
+  {{- end }}
+  {{- if or (eq .Values.iam.service.type "LoadBalancer") (eq .Values.iam.service.type "NodePort") }}
+  externalTrafficPolicy: {{ .Values.iam.service.externalTrafficPolicy | quote }}
+  {{- end }}
+  {{- if and (eq .Values.iam.service.type "LoadBalancer") (not (empty .Values.iam.service.loadBalancerSourceRanges)) }}
+  loadBalancerSourceRanges: {{ .Values.iam.service.loadBalancerSourceRanges }}
+  {{- end }}
+  {{- if and (eq .Values.iam.service.type "LoadBalancer") (not (empty .Values.iam.service.loadBalancerIP)) }}
+  loadBalancerIP: {{ .Values.iam.service.loadBalancerIP }}
+  {{- end }}
+  ports:
+    - name: "http"
+      port: {{ .Values.iam.service.ports.http }}
+      targetPort: "http"
+      protocol: TCP
+      {{- if and (or (eq .Values.iam.service.type "NodePort") (eq .Values.iam.service.type "LoadBalancer")) (not (empty .Values.iam.service.nodePorts.http)) }}
+      nodePort: {{ .Values.iam.service.nodePorts.http }}
+      {{- else if eq .Values.iam.service.type "ClusterIP" }}
+      nodePort: null
+      {{- end }}
+    {{- if .Values.iam.service.extraPorts }}
+    {{- include "common.tplvalues.render" (dict "value" .Values.iam.service.extraPorts "context" $) | nindent 4 }}
+    {{- end }}
+  {{- $podLabels := include "common.tplvalues.merge" (dict "values" (list .Values.iam.podLabels .Values.commonLabels) "context" .) | fromYaml }}
+  selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }}
+    app.kubernetes.io/component: iam
+{{- end }}
diff --git a/helm/seaweedfs/templates/master/hpa.yaml b/helm/seaweedfs/templates/master/hpa.yaml
index b807e0be86a1b85e88f32dad997ae250f34d05b4..bc7441d4be87f66d466824691c567e28069c3a35 100644
--- a/helm/seaweedfs/templates/master/hpa.yaml
+++ b/helm/seaweedfs/templates/master/hpa.yaml
@@ -26,24 +26,16 @@ spec:
     - type: Resource
       resource:
         name: memory
-        {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }}
-        targetAverageUtilization: {{ .Values.master.autoscaling.targetMemory  }}
-        {{- else }}
         target:
           type: Utilization
           averageUtilization: {{ .Values.master.autoscaling.targetMemory }}
-        {{- end }}
     {{- end }}
     {{- if .Values.master.autoscaling.targetCPU }}
     - type: Resource
       resource:
         name: cpu
-        {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }}
-        targetAverageUtilization: {{ .Values.master.autoscaling.targetCPU }}
-        {{- else }}
         target:
           type: Utilization
           averageUtilization: {{ .Values.master.autoscaling.targetCPU }}
-        {{- end }}
     {{- end }}
 {{- end }}
diff --git a/helm/seaweedfs/templates/master/ingress.yaml b/helm/seaweedfs/templates/master/ingress.yaml
index c22d1f143bf4de3a4f1136f92f14e2dae38ea478..d76ee7d231d73534b76816088a54f5661ae5d373 100644
--- a/helm/seaweedfs/templates/master/ingress.yaml
+++ b/helm/seaweedfs/templates/master/ingress.yaml
@@ -16,7 +16,7 @@ metadata:
   annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }}
   {{- end }}
 spec:
-  {{- if and .Values.master.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }}
+  {{- if .Values.master.ingress.ingressClassName }}
   ingressClassName: {{ .Values.master.ingress.ingressClassName | quote }}
   {{- end }}
   rules:
@@ -27,9 +27,7 @@ spec:
           {{- toYaml .Values.master.ingress.extraPaths | nindent 10 }}
           {{- end }}
           - path: {{ .Values.master.ingress.path }}
-            {{- if eq "true" (include "common.ingress.supportsPathType" .) }}
             pathType: {{ .Values.master.ingress.pathType }}
-            {{- end }}
             backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.master.fullname" .) "servicePort" "http" "context" $)  | nindent 14 }}
       {{- if not (empty .Values.master.ingress.hostname )}}
       host: {{ .Values.master.ingress.hostname }}
@@ -40,9 +38,7 @@ spec:
       http:
         paths:
           - path: {{ default "/" .path }}
-            {{- if eq "true" (include "common.ingress.supportsPathType" $) }}
             pathType: {{ default "ImplementationSpecific" .pathType }}
-            {{- end }}
             backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.master.fullname" $) "servicePort" "http" "context" $) | nindent 14 }}
     {{- end }}
     {{- if .Values.master.ingress.extraRules }}
diff --git a/helm/seaweedfs/templates/master/statefulset.yaml b/helm/seaweedfs/templates/master/statefulset.yaml
index 22aa1180e8a0757bb55c4a63c52dfcb8f00e4284..67e09277dfe60ade5b2ab4bb890583a1de0839ba 100644
--- a/helm/seaweedfs/templates/master/statefulset.yaml
+++ b/helm/seaweedfs/templates/master/statefulset.yaml
@@ -130,7 +130,11 @@ spec:
           args: {{- include "common.tplvalues.render" (dict "value" .Values.master.args "context" $) | nindent 12 }}
           {{- else }}
           args:
+            {{- if .Values.master.logPersistence.enabled }}
+            - -logdir={{ .Values.master.logPersistence.mountPath }}
+            {{- else }}
             - -logtostderr=true
+            {{- end }}
             - -v={{ .Values.master.logLevel }}
             - -config_dir=/etc/seaweedfs
             - master
@@ -223,6 +227,13 @@ spec:
               {{- if .Values.master.persistence.subPath }}
               subPath: {{ .Values.master.persistence.subPath }}
               {{- end }}
+            {{- if .Values.master.logPersistence.enabled }}
+            - name: logs
+              mountPath: {{ .Values.master.logPersistence.mountPath }}
+              {{- if .Values.master.logPersistence.subPath }}
+              subPath: {{ .Values.master.logPersistence.subPath }}
+              {{- end }}
+            {{- end }}
             - name: empty-dir
               mountPath: /tmp
               subPath: tmp-dir
@@ -297,20 +308,27 @@ spec:
         {{- if .Values.master.extraVolumes }}
         {{- include "common.tplvalues.render" (dict "value" .Values.master.extraVolumes "context" $) | nindent 8 }}
         {{- end }}
-  {{- if not .Values.master.persistence.enabled }}
+        {{- if not .Values.master.persistence.enabled }}
         - name: data
           emptyDir: {}
-  {{- else if .Values.master.persistence.existingClaim }}
+        {{- else if .Values.master.persistence.existingClaim }}
         - name: data
           persistentVolumeClaim:
-            claimName: {{ .Values.master.persistence.existingClaim }}
-  {{- else }}
+            claimName: {{ tpl .Values.master.persistence.existingClaim . }}
+        {{- end }}
+        {{- if and .Values.master.logPersistence.enabled .Values.master.logPersistence.existingClaim }}
+        - name: logs
+          persistentVolumeClaim:
+            claimName: {{ tpl .Values.master.logPersistence.existingClaim . }}
+        {{- end }}
+  {{- if or (and .Values.master.persistence.enabled (not .Values.master.persistence.existingClaim)) (and .Values.master.logPersistence.enabled (not .Values.master.logPersistence.existingClaim)) }}
   {{- if .Values.master.persistentVolumeClaimRetentionPolicy.enabled }}
   persistentVolumeClaimRetentionPolicy:
     whenDeleted: {{ .Values.master.persistentVolumeClaimRetentionPolicy.whenDeleted }}
     whenScaled: {{ .Values.master.persistentVolumeClaimRetentionPolicy.whenScaled }}
   {{- end }}
   volumeClaimTemplates:
+    {{- if and .Values.master.persistence.enabled (not .Values.master.persistence.existingClaim) }}
     - apiVersion: v1
       kind: PersistentVolumeClaim
       metadata:
@@ -337,4 +355,33 @@ spec:
         selector: {{- include "common.tplvalues.render" (dict "value" .Values.master.persistence.selector "context" $) | nindent 10 }}
         {{- end }}
         {{- include "common.storage.class" (dict "persistence" .Values.master.persistence "global" .Values.global) | nindent 8 }}
+    {{- end }}
+    {{- if and .Values.master.logPersistence.enabled (not .Values.master.logPersistence.existingClaim) }}
+    - apiVersion: v1
+      kind: PersistentVolumeClaim
+      metadata:
+        name: logs
+        {{- if or .Values.master.logPersistence.annotations .Values.commonAnnotations }}
+        {{- $claimAnnotations := include "common.tplvalues.merge" (dict "values" .Values.master.logPersistence.annotations .Values.commonAnnotations "context" .) | fromYaml }}
+        annotations: {{- include "common.tplvalues.render" ( dict "value" $claimAnnotations "context" $ ) | nindent 10 }}
+        {{- end }}
+        {{- if .Values.commonLabels }}
+        labels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 10 }}
+        {{- end }}
+      spec:
+        {{- if .Values.master.logPersistence.dataSource }}
+        dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.master.logPersistence.dataSource "context" $) | nindent 10 }}
+        {{- end }}
+        accessModes:
+        {{- range .Values.master.logPersistence.accessModes }}
+          - {{ . | quote }}
+        {{- end }}
+        resources:
+          requests:
+            storage: {{ .Values.master.logPersistence.size | quote }}
+        {{- if .Values.master.logPersistence.selector }}
+        selector: {{- include "common.tplvalues.render" (dict "value" .Values.master.logPersistence.selector "context" $) | nindent 10 }}
+        {{- end }}
+        {{- include "common.storage.class" (dict "persistence" .Values.master.logPersistence "global" .Values.global) | nindent 8 }}
+    {{- end }}
   {{- end }}
diff --git a/helm/seaweedfs/templates/s3/deployment.yaml b/helm/seaweedfs/templates/s3/deployment.yaml
index 94bdbe54fab4adc521c59352652da45eb1f35e00..2866f56b36afe958cb7768b969e812a3e29cfc69 100644
--- a/helm/seaweedfs/templates/s3/deployment.yaml
+++ b/helm/seaweedfs/templates/s3/deployment.yaml
@@ -40,7 +40,7 @@ spec:
         app.kubernetes.io/component: s3
     spec:
       {{- include "seaweedfs.imagePullSecrets" . | nindent 6 }}
-      serviceAccountName: {{ template "seaweedfs.serviceAccountName" . }}    
+      serviceAccountName: {{ template "seaweedfs.serviceAccountName" . }}
       automountServiceAccountToken: {{ .Values.s3.automountServiceAccountToken }}
       {{- if .Values.s3.hostAliases }}
       hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.s3.hostAliases "context" $) | nindent 8 }}
@@ -118,6 +118,7 @@ spec:
             - -metricsPort={{ .Values.s3.containerPorts.metrics }}
             {{- end }}
             - -filer={{ printf "%s:%d" (include "seaweedfs.filer.fullname" .) (int .Values.filer.service.ports.http) }}
+            - -allowEmptyFolder={{ .Values.s3.allowEmptyFolder }}
           {{- end }}
           env:
             - name: BITNAMI_DEBUG
@@ -230,6 +231,11 @@ spec:
       volumes:
         - name: empty-dir
           emptyDir: {}
+        {{- if .Values.usePasswordFiles }}
+        - name: seaweed-secrets
+          secret:
+            secretName: {{ printf "%s-auth" (include "seaweedfs.s3.fullname" .) }}
+        {{- end }}
         {{- if and .Values.s3.auth.enabled .Values.s3.auth.existingSecret }}
         - name: auth
           secret:
diff --git a/helm/seaweedfs/templates/s3/hpa.yaml b/helm/seaweedfs/templates/s3/hpa.yaml
index 26aae790f7799e5593cef4365b7759449100794b..4af087ad1f36a7f95d0b53d6c7948bca2f988273 100644
--- a/helm/seaweedfs/templates/s3/hpa.yaml
+++ b/helm/seaweedfs/templates/s3/hpa.yaml
@@ -26,24 +26,16 @@ spec:
     - type: Resource
       resource:
         name: memory
-        {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }}
-        targetAverageUtilization: {{ .Values.s3.autoscaling.targetMemory  }}
-        {{- else }}
         target:
           type: Utilization
           averageUtilization: {{ .Values.s3.autoscaling.targetMemory }}
-        {{- end }}
     {{- end }}
     {{- if .Values.s3.autoscaling.targetCPU }}
     - type: Resource
       resource:
         name: cpu
-        {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }}
-        targetAverageUtilization: {{ .Values.s3.autoscaling.targetCPU }}
-        {{- else }}
         target:
           type: Utilization
           averageUtilization: {{ .Values.s3.autoscaling.targetCPU }}
-        {{- end }}
     {{- end }}
 {{- end }}
diff --git a/helm/seaweedfs/templates/s3/ingress.yaml b/helm/seaweedfs/templates/s3/ingress.yaml
index 9f55b3aae6ee63d91bdf637448fe9963cc84e2dc..51cfa640d848bbc7da25e6944d0033e8701fe3f5 100644
--- a/helm/seaweedfs/templates/s3/ingress.yaml
+++ b/helm/seaweedfs/templates/s3/ingress.yaml
@@ -16,7 +16,7 @@ metadata:
   annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }}
   {{- end }}
 spec:
-  {{- if and .Values.s3.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }}
+  {{- if .Values.s3.ingress.ingressClassName }}
   ingressClassName: {{ .Values.s3.ingress.ingressClassName | quote }}
   {{- end }}
   rules:
@@ -27,9 +27,7 @@ spec:
           {{- toYaml .Values.s3.ingress.extraPaths | nindent 10 }}
           {{- end }}
           - path: {{ .Values.s3.ingress.path }}
-            {{- if eq "true" (include "common.ingress.supportsPathType" .) }}
             pathType: {{ .Values.s3.ingress.pathType }}
-            {{- end }}
             backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.s3.fullname" .) "servicePort" "http" "context" $)  | nindent 14 }}
       {{- if not (empty .Values.s3.ingress.hostname )}}
       host: {{ .Values.s3.ingress.hostname }}
@@ -40,9 +38,7 @@ spec:
       http:
         paths:
           - path: {{ default "/" .path }}
-            {{- if eq "true" (include "common.ingress.supportsPathType" $) }}
             pathType: {{ default "ImplementationSpecific" .pathType }}
-            {{- end }}
             backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.s3.fullname" $) "servicePort" "http" "context" $) | nindent 14 }}
     {{- end }}
     {{- if .Values.s3.ingress.extraRules }}
diff --git a/helm/seaweedfs/templates/volume/hpa.yaml b/helm/seaweedfs/templates/volume/hpa.yaml
index 5c458873f6537b80a67795bd83be138aca17be46..5d7992beb1ac7a4baae71f481a1be77180d0a794 100644
--- a/helm/seaweedfs/templates/volume/hpa.yaml
+++ b/helm/seaweedfs/templates/volume/hpa.yaml
@@ -26,24 +26,16 @@ spec:
     - type: Resource
       resource:
         name: memory
-        {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }}
-        targetAverageUtilization: {{ .Values.volume.autoscaling.targetMemory  }}
-        {{- else }}
         target:
           type: Utilization
           averageUtilization: {{ .Values.volume.autoscaling.targetMemory }}
-        {{- end }}
     {{- end }}
     {{- if .Values.volume.autoscaling.targetCPU }}
     - type: Resource
       resource:
         name: cpu
-        {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }}
-        targetAverageUtilization: {{ .Values.volume.autoscaling.targetCPU }}
-        {{- else }}
         target:
           type: Utilization
           averageUtilization: {{ .Values.volume.autoscaling.targetCPU }}
-        {{- end }}
     {{- end }}
 {{- end }}
diff --git a/helm/seaweedfs/templates/volume/ingress.yaml b/helm/seaweedfs/templates/volume/ingress.yaml
index 6c3680b94faaf01ec5048705519e8299d3bfdb41..18544f670e071c1eae4ec495327ee4715edd17f8 100644
--- a/helm/seaweedfs/templates/volume/ingress.yaml
+++ b/helm/seaweedfs/templates/volume/ingress.yaml
@@ -16,7 +16,7 @@ metadata:
   annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }}
   {{- end }}
 spec:
-  {{- if and .Values.volume.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }}
+  {{- if .Values.volume.ingress.ingressClassName }}
   ingressClassName: {{ .Values.volume.ingress.ingressClassName | quote }}
   {{- end }}
   rules:
@@ -27,9 +27,7 @@ spec:
           {{- toYaml .Values.volume.ingress.extraPaths | nindent 10 }}
           {{- end }}
           - path: {{ .Values.volume.ingress.path }}
-            {{- if eq "true" (include "common.ingress.supportsPathType" .) }}
             pathType: {{ .Values.volume.ingress.pathType }}
-            {{- end }}
             backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.volume.fullname" .) "servicePort" "http" "context" $)  | nindent 14 }}
       {{- if not (empty .Values.volume.ingress.hostname )}}
       host: {{ .Values.volume.ingress.hostname }}
@@ -40,9 +38,7 @@ spec:
       http:
         paths:
           - path: {{ default "/" .path }}
-            {{- if eq "true" (include "common.ingress.supportsPathType" $) }}
             pathType: {{ default "ImplementationSpecific" .pathType }}
-            {{- end }}
             backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.volume.fullname" $) "servicePort" "http" "context" $) | nindent 14 }}
     {{- end }}
     {{- if .Values.volume.ingress.extraRules }}
diff --git a/helm/seaweedfs/templates/volume/statefulset.yaml b/helm/seaweedfs/templates/volume/statefulset.yaml
index 3ba977a7724c8c8c460f7dee623a906b72bf5695..c02cae0d84478ca8403066e1a868b7ac090cc49e 100644
--- a/helm/seaweedfs/templates/volume/statefulset.yaml
+++ b/helm/seaweedfs/templates/volume/statefulset.yaml
@@ -135,7 +135,11 @@ spec:
           args: {{- include "common.tplvalues.render" (dict "value" .Values.volume.args "context" $) | nindent 12 }}
           {{- else }}
           args:
+            {{- if .Values.volume.logPersistence.enabled }}
+            - -logdir={{ .Values.volume.logPersistence.mountPath }}
+            {{- else }}
             - -logtostderr=true
+            {{- end }}
             - -v={{ .Values.volume.logLevel }}
             - -config_dir=/etc/seaweedfs
             - volume
@@ -219,7 +223,7 @@ spec:
           {{- else if .Values.volume.readinessProbe.enabled }}
           readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.volume.readinessProbe "enabled") "context" $) | nindent 12 }}
             httpGet:
-              path: /status
+              path: /healthz
               port: http
           {{- end }}
           {{- if .Values.volume.customStartupProbe }}
@@ -242,6 +246,13 @@ spec:
               subPath: {{ .subPath }}
               {{- end }}
             {{- end }}
+            {{- if .Values.volume.logPersistence.enabled }}
+            - name: logs
+              mountPath: {{ .Values.volume.logPersistence.mountPath }}
+              {{- if .Values.volume.logPersistence.subPath }}
+              subPath: {{ .Values.volume.logPersistence.subPath }}
+              {{- end }}
+            {{- end }}
             - name: empty-dir
               mountPath: /tmp
               subPath: tmp-dir
@@ -326,14 +337,19 @@ spec:
             claimName: {{ .persistence.existingClaim }}
         {{- end }}
         {{- end }}
+        {{- if and .Values.volume.logPersistence.enabled .Values.volume.logPersistence.existingClaim }}
+        - name: logs
+          persistentVolumeClaim:
+            claimName: {{ tpl .Values.volume.logPersistence.existingClaim . }}
+        {{- end }}
   {{- if .Values.volume.persistentVolumeClaimRetentionPolicy.enabled }}
   persistentVolumeClaimRetentionPolicy:
     whenDeleted: {{ .Values.volume.persistentVolumeClaimRetentionPolicy.whenDeleted }}
     whenScaled: {{ .Values.volume.persistentVolumeClaimRetentionPolicy.whenScaled }}
   {{- end }}
   volumeClaimTemplates:
-  {{- range .Values.volume.dataVolumes }}
-  {{- if and .persistence.enabled (not .persistence.existingClaim) }}
+    {{- range .Values.volume.dataVolumes }}
+    {{- if and .persistence.enabled (not .persistence.existingClaim) }}
     - apiVersion: v1
       kind: PersistentVolumeClaim
       metadata:
@@ -360,5 +376,33 @@ spec:
         selector: {{- include "common.tplvalues.render" (dict "value" .persistence.selector "context" $) | nindent 10 }}
         {{- end }}
         {{- include "common.storage.class" (dict "persistence" .persistence "global" $.Values.global) | nindent 8 }}
-  {{- end }}
-  {{- end }}
+    {{- end }}
+    {{- end }}
+    {{- if and .Values.volume.logPersistence.enabled (not .Values.volume.logPersistence.existingClaim) }}
+    - apiVersion: v1
+      kind: PersistentVolumeClaim
+      metadata:
+        name: logs
+        {{- if or .Values.volume.logPersistence.annotations .Values.commonAnnotations }}
+        {{- $claimAnnotations := include "common.tplvalues.merge" (dict "values" .Values.volume.logPersistence.annotations .Values.commonAnnotations "context" .) | fromYaml }}
+        annotations: {{- include "common.tplvalues.render" ( dict "value" $claimAnnotations "context" $ ) | nindent 10 }}
+        {{- end }}
+        {{- if .Values.commonLabels }}
+        labels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 10 }}
+        {{- end }}
+      spec:
+        {{- if .Values.volume.logPersistence.dataSource }}
+        dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.volume.logPersistence.dataSource "context" $) | nindent 10 }}
+        {{- end }}
+        accessModes:
+        {{- range .Values.volume.logPersistence.accessModes }}
+          - {{ . | quote }}
+        {{- end }}
+        resources:
+          requests:
+            storage: {{ .Values.volume.logPersistence.size | quote }}
+        {{- if .Values.volume.logPersistence.selector }}
+        selector: {{- include "common.tplvalues.render" (dict "value" .Values.volume.logPersistence.selector "context" $) | nindent 10 }}
+        {{- end }}
+        {{- include "common.storage.class" (dict "persistence" .Values.volume.logPersistence "global" .Values.global) | nindent 8 }}
+    {{- end }}
diff --git a/helm/seaweedfs/templates/webadv/hpa.yaml b/helm/seaweedfs/templates/webadv/hpa.yaml
index e6434c258b6694736744052686dbda514797bc42..9c2208c369b6e3de2bd84ba1ff86c6d1c78d8324 100644
--- a/helm/seaweedfs/templates/webadv/hpa.yaml
+++ b/helm/seaweedfs/templates/webadv/hpa.yaml
@@ -26,24 +26,16 @@ spec:
     - type: Resource
       resource:
         name: memory
-        {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }}
-        targetAverageUtilization: {{ .Values.webdav.autoscaling.targetMemory  }}
-        {{- else }}
         target:
           type: Utilization
           averageUtilization: {{ .Values.webdav.autoscaling.targetMemory }}
-        {{- end }}
     {{- end }}
     {{- if .Values.webdav.autoscaling.targetCPU }}
     - type: Resource
       resource:
         name: cpu
-        {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }}
-        targetAverageUtilization: {{ .Values.webdav.autoscaling.targetCPU }}
-        {{- else }}
         target:
           type: Utilization
           averageUtilization: {{ .Values.webdav.autoscaling.targetCPU }}
-        {{- end }}
     {{- end }}
 {{- end }}
diff --git a/helm/seaweedfs/templates/webadv/ingress.yaml b/helm/seaweedfs/templates/webadv/ingress.yaml
index a42d6e9e3491709a4d69bdafd6eabe8ecbd2609b..821216f34d5011acb6473216253bf61f8aecb533 100644
--- a/helm/seaweedfs/templates/webadv/ingress.yaml
+++ b/helm/seaweedfs/templates/webadv/ingress.yaml
@@ -16,7 +16,7 @@ metadata:
   annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }}
   {{- end }}
 spec:
-  {{- if and .Values.webdav.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }}
+  {{- if .Values.webdav.ingress.ingressClassName }}
   ingressClassName: {{ .Values.webdav.ingress.ingressClassName | quote }}
   {{- end }}
   rules:
@@ -27,9 +27,7 @@ spec:
           {{- toYaml .Values.webdav.ingress.extraPaths | nindent 10 }}
           {{- end }}
           - path: {{ .Values.webdav.ingress.path }}
-            {{- if eq "true" (include "common.ingress.supportsPathType" .) }}
             pathType: {{ .Values.webdav.ingress.pathType }}
-            {{- end }}
             backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.webdav.fullname" .) "servicePort" (ternary "https" "http" .Values.webdav.tls.enabled) "context" $)  | nindent 14 }}
       {{- if not (empty .Values.webdav.ingress.hostname )}}
       host: {{ .Values.webdav.ingress.hostname }}
@@ -40,9 +38,7 @@ spec:
       http:
         paths:
           - path: {{ default "/" .path }}
-            {{- if eq "true" (include "common.ingress.supportsPathType" $) }}
             pathType: {{ default "ImplementationSpecific" .pathType }}
-            {{- end }}
             backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.webdav.fullname" $) "servicePort" ("https" "http" .Values.webdav.tls.enabled) "context" $) | nindent 14 }}
     {{- end }}
     {{- if .Values.webdav.ingress.extraRules }}
diff --git a/helm/seaweedfs/values.yaml b/helm/seaweedfs/values.yaml
index cbe833459d19a54b31f90cbfe31fc1e7569f695e..40321455a2a7e891b626ddca370a7512afa2de42 100644
--- a/helm/seaweedfs/values.yaml
+++ b/helm/seaweedfs/values.yaml
@@ -85,7 +85,7 @@ diagnosticMode:
 image:
   registry: docker.io
   repository: bitnami/seaweedfs
-  tag: 3.80.0-debian-12-r1
+  tag: 3.87.0-debian-12-r1
   digest: ""
   ## Specify a imagePullPolicy
   ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images
@@ -314,7 +314,7 @@ master:
       drop: ["ALL"]
     seccompProfile:
       type: "RuntimeDefault"
-  ## @param master.logLevel Master Server log level [0|1|2|3|4]
+  ## @param master.logLevel Master Server log level (0, 1, 2, 3, or 4)
   ##
   logLevel: 1
   ## @param master.bindAddress Master Server bind address
@@ -324,7 +324,7 @@ master:
   ##
   volumeSizeLimitMB: 1000
   ## @param master.config Master Server configuration
-  ## Specify content for master.yml
+  ## Specify content for master.toml
   ##
   config: ""
   ## @param master.existingConfigmap The name of an existing ConfigMap with your custom configuration for Master Server
@@ -716,11 +716,11 @@ master:
   ## @section Master Server Persistence Parameters
   ##
 
-  ## Enable persistence using Persistent Volume Claims
+  ## Enable Master data persistence using Persistent Volume Claims
   ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
   ##
   persistence:
-    ## @param master.persistence.enabled Enable persistence on Master Server using Persistent Volume Claims
+    ## @param master.persistence.enabled Enable data persistence on Master Server using Persistent Volume Claims
     ##
     enabled: true
     ## @param master.persistence.mountPath Path to mount the volume at.
@@ -747,7 +747,7 @@ master:
     ## @param master.persistence.size Size of data volume
     ##
     size: 8Gi
-    ## @param master.persistence.existingClaim The name of an existing PVC to use for persistence
+    ## @param master.persistence.existingClaim The name of an existing PVC to use for data persistence
     ##
     existingClaim: ""
     ## @param master.persistence.selector Selector to match an existing Persistent Volume for data PVC
@@ -761,6 +761,51 @@ master:
     ## @param master.persistence.dataSource Custom PVC data source
     ##
     dataSource: {}
+  ## Enable Master logs persistence using Persistent Volume Claims
+  ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
+  ##
+  logPersistence:
+    ## @param master.logPersistence.enabled Enable logs persistence on Master Server using Persistent Volume Claims
+    ##
+    enabled: false
+    ## @param master.logPersistence.mountPath Path to mount the volume at.
+    ##
+    mountPath: /logs
+    ## @param master.logPersistence.subPath The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services
+    ##
+    subPath: ""
+    ## @param master.logPersistence.storageClass Storage class of backing PVC
+    ## If defined, storageClassName: <storageClass>
+    ## If set to "-", storageClassName: "", which disables dynamic provisioning
+    ## If undefined (the default) or set to null, no storageClassName spec is
+    ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
+    ##   GKE, AWS & OpenStack)
+    ##
+    storageClass: ""
+    ## @param master.logPersistence.annotations Persistent Volume Claim annotations
+    ##
+    annotations: {}
+    ## @param master.logPersistence.accessModes Persistent Volume Access Modes
+    ##
+    accessModes:
+      - ReadWriteOnce
+    ## @param master.logPersistence.size Size of logs volume
+    ##
+    size: 8Gi
+    ## @param master.logPersistence.existingClaim The name of an existing PVC to use for logs persistence
+    ##
+    existingClaim: ""
+    ## @param master.logPersistence.selector Selector to match an existing Persistent Volume for logs PVC
+    ## If set, the PVC can't have a PV dynamically provisioned for it
+    ## E.g.
+    ## selector:
+    ##   matchLabels:
+    ##     app: my-app
+    ##
+    selector: {}
+    ## @param master.logPersistence.dataSource Custom PVC data source
+    ##
+    dataSource: {}
   ## persistentVolumeClaimRetentionPolicy
   ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention
   ## @param master.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of the Master Server StatefulSet
@@ -964,7 +1009,7 @@ volume:
       drop: ["ALL"]
     seccompProfile:
       type: "RuntimeDefault"
-  ## @param volume.logLevel Volume Server log level [0|1|2|3|4]
+  ## @param volume.logLevel Volume Server log level (0, 1, 2, 3, or 4)
   ##
   logLevel: 1
   ## @param volume.bindAddress Volume Server bind address
@@ -974,7 +1019,7 @@ volume:
   ##
   publicUrl: ""
   ## @param volume.config Volume Server configuration
-  ## Specify content for volume.yml
+  ## Specify content for volume.toml
   ##
   config: ""
   ## @param volume.existingConfigmap The name of an existing ConfigMap with your custom configuration for Volume Server
@@ -1421,6 +1466,51 @@ volume:
         ## @param volume.dataVolumes[0].persistence.dataSource Custom PVC data source
         ##
         dataSource: {}
+  ## Enable Volume logs persistence using Persistent Volume Claims
+  ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
+  ##
+  logPersistence:
+    ## @param volume.logPersistence.enabled Enable logs persistence on Volume Server using Persistent Volume Claims
+    ##
+    enabled: false
+    ## @param volume.logPersistence.mountPath Path to mount the volume at.
+    ##
+    mountPath: /logs
+    ## @param volume.logPersistence.subPath The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services
+    ##
+    subPath: ""
+    ## @param volume.logPersistence.storageClass Storage class of backing PVC
+    ## If defined, storageClassName: <storageClass>
+    ## If set to "-", storageClassName: "", which disables dynamic provisioning
+    ## If undefined (the default) or set to null, no storageClassName spec is
+    ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
+    ##   GKE, AWS & OpenStack)
+    ##
+    storageClass: ""
+    ## @param volume.logPersistence.annotations Persistent Volume Claim annotations
+    ##
+    annotations: {}
+    ## @param volume.logPersistence.accessModes Persistent Volume Access Modes
+    ##
+    accessModes:
+      - ReadWriteOnce
+    ## @param volume.logPersistence.size Size of logs volume
+    ##
+    size: 8Gi
+    ## @param volume.logPersistence.existingClaim The name of an existing PVC to use for logs persistence
+    ##
+    existingClaim: ""
+    ## @param volume.logPersistence.selector Selector to match an existing Persistent Volume for logs PVC
+    ## If set, the PVC can't have a PV dynamically provisioned for it
+    ## E.g.
+    ## selector:
+    ##   matchLabels:
+    ##     app: my-app
+    ##
+    selector: {}
+    ## @param volume.logPersistence.dataSource Custom PVC data source
+    ##
+    dataSource: {}
   ## persistentVolumeClaimRetentionPolicy
   ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention
   ## @param volume.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of the Volume Server StatefulSet
@@ -1627,14 +1717,14 @@ filer:
       drop: ["ALL"]
     seccompProfile:
       type: "RuntimeDefault"
-  ## @param filer.logLevel Filer Server log level [0|1|2|3|4]
+  ## @param filer.logLevel Filer Server log level (0, 1, 2, 3, or 4)
   ##
   logLevel: 1
   ## @param filer.bindAddress Filer Server bind address
   ##
   bindAddress: 0.0.0.0
   ## @param filer.config Filer Server configuration
-  ## Specify content for filer.yml
+  ## Specify content for filer.toml
   ##
   config: |
     [leveldb2]
@@ -1642,6 +1732,13 @@ filer:
   ## @param filer.existingConfigmap The name of an existing ConfigMap with your custom configuration for Filer Server
   ##
   existingConfigmap: ""
+  ## @param filer.notificationConfig Filer Server notification configuration
+  ## Specify content for custom notification.toml
+  ##
+  notificationConfig: ""
+  ## @param filer.existingNotificationConfigmap The name of an existing ConfigMap with your custom notification configuration for Filer Server
+  ##
+  existingNotificationConfigmap: ""
   ## @param filer.command Override default Filer Server container command (useful when using custom images)
   ##
   command: []
@@ -2025,6 +2122,65 @@ filer:
     ##
     extraRules: []
 
+  ## @section Filer Server Persistence Parameters
+  ##
+
+  ## Enable Filer logs persistence using Persistent Volume Claims
+  ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
+  ##
+  logPersistence:
+    ## @param filer.logPersistence.enabled Enable logs persistence on Filer Server using Persistent Volume Claims
+    ##
+    enabled: false
+    ## @param filer.logPersistence.mountPath Path to mount the volume at.
+    ##
+    mountPath: /logs
+    ## @param filer.logPersistence.subPath The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services
+    ##
+    subPath: ""
+    ## @param filer.logPersistence.storageClass Storage class of backing PVC
+    ## If defined, storageClassName: <storageClass>
+    ## If set to "-", storageClassName: "", which disables dynamic provisioning
+    ## If undefined (the default) or set to null, no storageClassName spec is
+    ##   set, choosing the default provisioner.  (gp2 on AWS, standard on
+    ##   GKE, AWS & OpenStack)
+    ##
+    storageClass: ""
+    ## @param filer.logPersistence.annotations Persistent Volume Claim annotations
+    ##
+    annotations: {}
+    ## @param filer.logPersistence.accessModes Persistent Volume Access Modes
+    ##
+    accessModes:
+      - ReadWriteOnce
+    ## @param filer.logPersistence.size Size of logs volume
+    ##
+    size: 8Gi
+    ## @param filer.logPersistence.existingClaim The name of an existing PVC to use for logs persistence
+    ##
+    existingClaim: ""
+    ## @param filer.logPersistence.selector Selector to match an existing Persistent Volume for logs PVC
+    ## If set, the PVC can't have a PV dynamically provisioned for it
+    ## E.g.
+    ## selector:
+    ##   matchLabels:
+    ##     app: my-app
+    ##
+    selector: {}
+    ## @param filer.logPersistence.dataSource Custom PVC data source
+    ##
+    dataSource: {}
+  ## persistentVolumeClaimRetentionPolicy
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention
+  ## @param filer.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of the Master Server StatefulSet
+  ## @param filer.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced
+  ## @param filer.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted
+  ##
+  persistentVolumeClaimRetentionPolicy:
+    enabled: false
+    whenScaled: Retain
+    whenDeleted: Retain
+
   ## @section Filer Server Metrics Parameters
   ##
   metrics:
@@ -2220,21 +2376,23 @@ s3:
       drop: ["ALL"]
     seccompProfile:
       type: "RuntimeDefault"
-  ## @param s3.logLevel Amazon S3 API log level [0|1|2|3|4]
+  ## @param s3.logLevel Amazon S3 API log level (0, 1, 2, 3, or 4)
   ##
   logLevel: 1
   ## @param s3.bindAddress Amazon S3 API bind address
   ##
   bindAddress: 0.0.0.0
+  ## @param s3.allowEmptyFolder Allow empty folders in Amazon S3 API
+  allowEmptyFolder: true
   ## S3 Authentication
   ## ref: https://github.com/seaweedfs/seaweedfs/wiki/Amazon-S3-API#s3-authentication
   ## @param s3.auth.enabled Enable Amazon S3 API authentication
   ## @param s3.auth.existingSecret Existing secret with Amazon S3 API authentication configuration
   ## @param s3.auth.existingSecretConfigKey Key of the above existing secret with S3 API authentication configuration, defaults to `config.json`
-  ## @param s3.auth.adminAccessKeyId Amazon S3 API access key with admin privileges. Ignored if `security.mTLS.volume.existingSecret` is set
-  ## @param s3.auth.adminSecretAccessKey Amazon S3 API secret key with admin privileges. Ignored if `security.mTLS.volume.existingSecret` is set
-  ## @param s3.auth.readAccessKeyId Amazon S3 API read access key with read-only privileges. Ignored if `security.mTLS.volume.existingSecret` is set
-  ## @param s3.auth.readSecretAccessKey Amazon S3 API read secret key with read-only privileges. Ignored if `security.mTLS.volume.existingSecret` is set
+  ## @param s3.auth.adminAccessKeyId Amazon S3 API access key with admin privileges. Ignored if `s3.auth.existingSecret` is set
+  ## @param s3.auth.adminSecretAccessKey Amazon S3 API secret key with admin privileges. Ignored if `s3.auth.existingSecret` is set
+  ## @param s3.auth.readAccessKeyId Amazon S3 API read access key with read-only privileges. Ignored if `s3.auth.existingSecret` is set
+  ## @param s3.auth.readSecretAccessKey Amazon S3 API read secret key with read-only privileges. Ignored if `s3.auth.existingSecret` is set
   ##
   auth:
     enabled: false
@@ -2814,7 +2972,7 @@ webdav:
       drop: ["ALL"]
     seccompProfile:
       type: "RuntimeDefault"
-  ## @param webdav.logLevel WebDAV log level [0|1|2|3|4]
+  ## @param webdav.logLevel WebDAV log level (0, 1, 2, 3, or 4)
   ##
   logLevel: 1
   ## TLS configuration for WebDAV
@@ -3223,6 +3381,326 @@ webdav:
     ##
     extraRules: []
 
+## @section IAM Parameters
+##
+iam:
+  ## @param iam.enabled Enable IAM deployment
+  ##
+  enabled: false
+  ## @param iam.replicaCount Number of IAM replicas to deploy
+  ##
+  replicaCount: 1
+  ## @param iam.containerPorts.http IAM HTTP container port
+  ##
+  containerPorts:
+    http: 8111
+  ## Configure extra options for IAM containers' liveness and readiness probes
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes
+  ## @param iam.livenessProbe.enabled Enable livenessProbe on IAM containers
+  ## @param iam.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
+  ## @param iam.livenessProbe.periodSeconds Period seconds for livenessProbe
+  ## @param iam.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
+  ## @param iam.livenessProbe.failureThreshold Failure threshold for livenessProbe
+  ## @param iam.livenessProbe.successThreshold Success threshold for livenessProbe
+  ##
+  livenessProbe:
+    enabled: true
+    initialDelaySeconds: 30
+    timeoutSeconds: 30
+    periodSeconds: 10
+    successThreshold: 1
+    failureThreshold: 6
+  ## @param iam.readinessProbe.enabled Enable readinessProbe on IAM containers
+  ## @param iam.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
+  ## @param iam.readinessProbe.periodSeconds Period seconds for readinessProbe
+  ## @param iam.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
+  ## @param iam.readinessProbe.failureThreshold Failure threshold for readinessProbe
+  ## @param iam.readinessProbe.successThreshold Success threshold for readinessProbe
+  ##
+  readinessProbe:
+    enabled: true
+    initialDelaySeconds: 30
+    timeoutSeconds: 30
+    periodSeconds: 10
+    successThreshold: 1
+    failureThreshold: 6
+  ## @param iam.startupProbe.enabled Enable startupProbe on IAM containers
+  ## @param iam.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
+  ## @param iam.startupProbe.periodSeconds Period seconds for startupProbe
+  ## @param iam.startupProbe.timeoutSeconds Timeout seconds for startupProbe
+  ## @param iam.startupProbe.failureThreshold Failure threshold for startupProbe
+  ## @param iam.startupProbe.successThreshold Success threshold for startupProbe
+  ##
+  startupProbe:
+    enabled: false
+    initialDelaySeconds: 5
+    periodSeconds: 5
+    timeoutSeconds: 1
+    failureThreshold: 15
+    successThreshold: 1
+
+  ## IAM resource requests and limits
+  ## ref: http://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/
+  ## @param iam.resourcesPreset Set IAM container resources according to one common preset (allowed values: none, nano, small, medium, large, xlarge, 2xlarge). This is ignored if webdav.resources is set (webdav.resources is recommended for production).
+  ## More information: https://github.com/bitnami/charts/blob/main/bitnami/common/templates/_resources.tpl#L15
+  ##
+  resourcesPreset: "nano"
+  ## @param iam.resources Set IAM container requests and limits for different resources like CPU or memory (essential for production workloads)
+  ## Example:
+  ## resources:
+  ##   requests:
+  ##     cpu: 2
+  ##     memory: 512Mi
+  ##   limits:
+  ##     cpu: 3
+  ##     memory: 1024Mi
+  ##
+  resources: {}
+  ## Configure Pods Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
+  ## @param iam.podSecurityContext.enabled Enable IAM pods' Security Context
+  ## @param iam.podSecurityContext.fsGroupChangePolicy Set filesystem group change policy for IAM pods
+  ## @param iam.podSecurityContext.sysctls Set kernel settings using the sysctl interface for IAM pods
+  ## @param iam.podSecurityContext.supplementalGroups Set filesystem extra groups for IAM pods
+  ## @param iam.podSecurityContext.fsGroup Set fsGroup in IAM pods' Security Context
+  ##
+  podSecurityContext:
+    enabled: true
+    fsGroupChangePolicy: Always
+    sysctls: []
+    supplementalGroups: []
+    fsGroup: 1001
+  ## Configure Container Security Context
+  ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container
+  ## @param iam.containerSecurityContext.enabled Enabled IAM container' Security Context
+  ## @param iam.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in IAM container
+  ## @param iam.containerSecurityContext.runAsUser Set runAsUser in IAM container' Security Context
+  ## @param iam.containerSecurityContext.runAsGroup Set runAsGroup in IAM container' Security Context
+  ## @param iam.containerSecurityContext.runAsNonRoot Set runAsNonRoot in IAM container' Security Context
+  ## @param iam.containerSecurityContext.readOnlyRootFilesystem Set readOnlyRootFilesystem in IAM container' Security Context
+  ## @param iam.containerSecurityContext.privileged Set privileged in IAM container' Security Context
+  ## @param iam.containerSecurityContext.allowPrivilegeEscalation Set allowPrivilegeEscalation in IAM container' Security Context
+  ## @param iam.containerSecurityContext.capabilities.drop List of capabilities to be dropped in IAM container
+  ## @param iam.containerSecurityContext.seccompProfile.type Set seccomp profile in IAM container
+  ##
+  containerSecurityContext:
+    enabled: true
+    seLinuxOptions: {}
+    runAsUser: 1001
+    runAsGroup: 1001
+    runAsNonRoot: true
+    readOnlyRootFilesystem: true
+    privileged: false
+    allowPrivilegeEscalation: false
+    capabilities:
+      drop: ["ALL"]
+    seccompProfile:
+      type: "RuntimeDefault"
+  ## @param iam.logLevel IAM log level (0, 1, 2, 3, or 4)
+  ##
+  logLevel: 1
+  ## @param iam.command Override default IAM container command (useful when using custom images)
+  ##
+  command: []
+  ## @param iam.args Override default IAM container args (useful when using custom images)
+  ##
+  args: []
+  ## @param iam.automountServiceAccountToken Mount Service Account token in IAM pods
+  ##
+  automountServiceAccountToken: false
+  ## @param iam.hostAliases IAM pods host aliases
+  ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
+  ##
+  hostAliases: []
+  ## @param iam.statefulsetAnnotations Annotations for IAM statefulset
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  ##
+  statefulsetAnnotations: {}
+  ## @param iam.podLabels Extra labels for IAM pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
+  ##
+  podLabels: {}
+  ## @param iam.podAnnotations Annotations for IAM pods
+  ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
+  ##
+  podAnnotations: {}
+  ## @param iam.podAffinityPreset Pod affinity preset. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAffinityPreset: ""
+  ## @param iam.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard`
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
+  ##
+  podAntiAffinityPreset: soft
+  ## Node iam.affinity preset
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
+  ##
+  nodeAffinityPreset:
+    ## @param iam.nodeAffinityPreset.type Node affinity preset type. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard`
+    ##
+    type: ""
+    ## @param iam.nodeAffinityPreset.key Node label key to match. Ignored if `iam.affinity` is set
+    ##
+    key: ""
+    ## @param iam.nodeAffinityPreset.values Node label values to match. Ignored if `iam.affinity` is set
+    ## E.g.
+    ## values:
+    ##   - e2e-az1
+    ##   - e2e-az2
+    ##
+    values: []
+  ## @param iam.affinity Affinity for IAM pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
+  ## NOTE: `iam.podAffinityPreset`, `iam.podAntiAffinityPreset`, and `iam.nodeAffinityPreset` will be ignored when it's set
+  ##
+  affinity: {}
+  ## @param iam.nodeSelector Node labels for IAM pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
+  ##
+  nodeSelector: {}
+  ## @param iam.tolerations Tolerations for IAM pods assignment
+  ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
+  ##
+  tolerations: []
+  ## @param iam.updateStrategy.type IAM deployment strategy type
+  ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies
+  ##
+  updateStrategy:
+    ## Can be set to RollingUpdate or Recreate
+    ##
+    type: RollingUpdate
+  ## @param iam.priorityClassName IAM pods' priorityClassName
+  ##
+  priorityClassName: ""
+  ## @param iam.topologySpreadConstraints Topology Spread Constraints for IAM pod assignment spread across your cluster among failure-domains
+  ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods
+  ##
+  topologySpreadConstraints: []
+  ## @param iam.schedulerName Name of the k8s scheduler (other than default) for IAM pods
+  ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
+  ##
+  schedulerName: ""
+  ## @param iam.terminationGracePeriodSeconds Seconds IAM pods need to terminate gracefully
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods
+  ##
+  terminationGracePeriodSeconds: ""
+  ## @param iam.lifecycleHooks for IAM containers to automate configuration before or after startup
+  ##
+  lifecycleHooks: {}
+  ## @param iam.extraEnvVars Array with extra environment variables to add to IAM containers
+  ## e.g:
+  ## extraEnvVars:
+  ##   - name: FOO
+  ##     value: "bar"
+  ##
+  extraEnvVars: []
+  ## @param iam.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for IAM containers
+  ##
+  extraEnvVarsCM: ""
+  ## @param iam.extraEnvVarsSecret Name of existing Secret containing extra env vars for IAM containers
+  ##
+  extraEnvVarsSecret: ""
+  ## @param iam.extraVolumes Optionally specify extra list of additional volumes for the IAM pods
+  ##
+  extraVolumes: []
+  ## @param iam.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the IAM containers
+  ##
+  extraVolumeMounts: []
+  ## @param iam.sidecars Add additional sidecar containers to the IAM pods
+  ## e.g:
+  ## sidecars:
+  ##   - name: your-image-name
+  ##     image: your-image
+  ##     imagePullPolicy: Always
+  ##     ports:
+  ##       - name: portname
+  ##         containerPort: 1234
+  ##
+  sidecars: []
+  ## @param iam.initContainers Add additional init containers to the IAM pods
+  ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
+  ## e.g:
+  ## initContainers:
+  ##  - name: your-image-name
+  ##    image: your-image
+  ##    imagePullPolicy: Always
+  ##    command: ['sh', '-c', 'echo "hello world"']
+  ##
+  initContainers: []
+  ## Pod Disruption Budget configuration
+  ## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb
+  ## @param iam.pdb.create Enable/disable a Pod Disruption Budget creation
+  ## @param iam.pdb.minAvailable Minimum number/percentage of pods that should remain scheduled
+  ## @param iam.pdb.maxUnavailable Maximum number/percentage of pods that may be made unavailable. Defaults to `1` if both `iam.pdb.minAvailable` and `iam.pdb.maxUnavailable` are empty.
+  ##
+  pdb:
+    create: true
+    minAvailable: ""
+    maxUnavailable: ""
+
+
+  ## @section IAM Traffic Exposure Parameters
+  ##
+
+  ## IAM service parameters
+  ##
+  service:
+    ## @param iam.service.type IAM service type
+    ##
+    type: ClusterIP
+    ## @param iam.service.ports.http IAM service HTTP port (HTTPS if `iam.tls.enabled` is `true`)
+    ##
+    ports:
+      http: 8111
+    ## Node ports to expose
+    ## @param iam.service.nodePorts.http Node port for HTTP (HTTPS if `iam.tls.enabled` is `true`)
+    ## NOTE: choose port between <30000-32767>
+    ##
+    nodePorts:
+      http: ""
+    ## @param iam.service.clusterIP IAM service Cluster IP
+    ## e.g.:
+    ## clusterIP: None
+    ##
+    clusterIP: ""
+    ## @param iam.service.loadBalancerIP IAM service Load Balancer IP
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer
+    ##
+    loadBalancerIP: ""
+    ## @param iam.service.loadBalancerSourceRanges IAM service Load Balancer sources
+    ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
+    ## e.g:
+    ## loadBalancerSourceRanges:
+    ##   - 10.10.10.0/24
+    ##
+    loadBalancerSourceRanges: []
+    ## @param iam.service.externalTrafficPolicy IAM service external traffic policy
+    ## ref http://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
+    ##
+    externalTrafficPolicy: Cluster
+    ## @param iam.service.annotations Additional custom annotations for IAM service
+    ##
+    annotations: {}
+    ## @param iam.service.extraPorts Extra ports to expose in IAM service (normally used with the `sidecars` value)
+    ##
+    extraPorts: []
+    ## @param iam.service.sessionAffinity Control where client requests go, to the same pod or round-robin
+    ## Values: ClientIP or None
+    ## ref: https://kubernetes.io/docs/concepts/services-networking/service/
+    ##
+    sessionAffinity: None
+    ## @param iam.service.sessionAffinityConfig Additional settings for the sessionAffinity
+    ## sessionAffinityConfig:
+    ##   clientIP:
+    ##     timeoutSeconds: 300
+    ##
+    sessionAffinityConfig: {}
+    ## Headless service properties
+    ##
+  ## Network Policies for IAM
+  ## Ref: https://kubernetes.io/docs/concepts/services-networking/network-policies/
+  ##
+
 ## @section Init Container Parameters
 ##
 
@@ -3245,7 +3723,7 @@ volumePermissions:
   image:
     registry: docker.io
     repository: bitnami/os-shell
-    tag: 12-debian-12-r33
+    tag: 12-debian-12-r43
     pullPolicy: IfNotPresent
     ## Optionally specify an array of imagePullSecrets.
     ## Secrets must be manually created in the namespace.
@@ -3329,7 +3807,7 @@ mariadb:
   image:
     registry: docker.io
     repository: bitnami/mariadb
-    tag: 11.4.4-debian-12-r1
+    tag: 11.4.5-debian-12-r12
     digest: ""
     ## Specify a imagePullPolicy
     ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images
@@ -3350,7 +3828,6 @@ mariadb:
   ## @param mariadb.auth.database MariaDB custom database
   ## @param mariadb.auth.username MariaDB custom user name
   ## @param mariadb.auth.password MariaDB custom user password
-  ## @param mariadb.auth.usePasswordFiles Mount credentials as a file instead of using an environment variable
   ## ref: https://github.com/bitnami/containers/tree/main/bitnami/mariadb#setting-the-root-password-on-first-run
   ##      https://github.com/bitnami/containers/blob/main/bitnami/mariadb/README.md#creating-a-database-on-first-run
   ##      https://github.com/bitnami/containers/blob/main/bitnami/mariadb/README.md#creating-a-database-user-on-first-run
@@ -3360,7 +3837,6 @@ mariadb:
     database: bitnami_seaweedfs
     username: bn_seaweedfs
     password: ""
-    usePasswordFiles: false
   ## @param mariadb.initdbScripts [object] Specify dictionary of scripts to be run at first boot
   ##
   initdbScripts:
@@ -3430,7 +3906,7 @@ postgresql:
   image:
     registry: docker.io
     repository: bitnami/postgresql
-    tag: 17.2.0-debian-12-r2
+    tag: 17.4.0-debian-12-r19
     digest: ""
     ## Specify a imagePullPolicy
     ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images
@@ -3538,6 +4014,10 @@ externalDatabase:
   ## NOTE: When it's set, the `externalDatabase.password` parameter is ignored
   ##
   existingSecret: ""
+  ## @param externalDatabase.waitForDatabaseEnabled Whether to check for external database before starting seaweedfs containers
+  ##
+  waitForDatabaseEnabled: true
+  ##
   ## Init external database job
   ##
   initDatabaseJob:
diff --git a/lib/java/dbrepo-core/pom.xml b/lib/java/dbrepo-core/pom.xml
index cbe2b4bf84718b6a849d84a8197a499dd314733e..487d9c9215c5a409ffa9c75bae7191e53140ee4c 100644
--- a/lib/java/dbrepo-core/pom.xml
+++ b/lib/java/dbrepo-core/pom.xml
@@ -7,7 +7,7 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>3.3.5</version>
+        <version>3.4.0</version>
     </parent>
 
     <organization>
@@ -37,7 +37,7 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <keycloak.version>26.0.4</keycloak.version>
         <mapstruct.version>1.6.3</mapstruct.version>
-        <spring-cloud.version>4.1.4</spring-cloud.version>
+        <spring-cloud.version>4.2.1</spring-cloud.version>
         <jackson-datatype.version>2.15.0</jackson-datatype.version>
         <springdoc-openapi.version>2.8.5</springdoc-openapi.version>
     </properties>
diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Identifier.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Identifier.java
index 04471509c6cd711b745f1a9060227d869f2dcb33..ac0559fa96fea27761b1b95f86db7da77563aef4 100644
--- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Identifier.java
+++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Identifier.java
@@ -33,6 +33,7 @@ import java.util.UUID;
         @NamedQuery(name = "Identifier.findSubsetIdentifier", query = "select i from Identifier i where i.database.id = ?1 and i.queryId = ?2 and i.type = 'SUBSET' ORDER BY i.id DESC"),
         @NamedQuery(name = "Identifier.findViewIdentifier", query = "select i from Identifier i where i.database.id = ?1 and i.viewId = ?2 and i.type = 'VIEW' ORDER BY i.id DESC"),
         @NamedQuery(name = "Identifier.findEarliest", query = "select i from Identifier i ORDER BY i.created ASC limit 1"),
+        @NamedQuery(name = "Identifier.findAll", query = "select i from Identifier i ORDER BY i.created DESC"),
 })
 public class Identifier implements Serializable {
 
diff --git a/lib/python/pyproject.toml b/lib/python/pyproject.toml
index 956d1241d102158b7c97645c86663c862046fbbf..d235ee9ae1976a6ffa426e7dbbf6d19e42064bfa 100644
--- a/lib/python/pyproject.toml
+++ b/lib/python/pyproject.toml
@@ -1,6 +1,6 @@
 [project]
 name = "dbrepo"
-version = "1.8.2rc6"
+version = "1.8.2"
 description = "DBRepo Python Library"
 keywords = [
     "DBRepo",
@@ -23,7 +23,6 @@ dependencies = [
     "requests >= 2.31",
     "pika",
     "pydantic",
-    "tuspy",
     "pandas"
 ]
 
@@ -35,6 +34,6 @@ build-backend = "setuptools.build_meta"
 
 [project.urls]
 Homepage = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/"
-Documentation = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/python/"
+Documentation = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/python/"
 Issues = "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues"
 Source = "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/"
\ No newline at end of file
diff --git a/lib/python/setup.py b/lib/python/setup.py
index bac2d6ad1217de2f44cd1877e3eb6f0a4f1b47ca..bb75727d7674ce488ed12fdd55dc011c64540d92 100644
--- a/lib/python/setup.py
+++ b/lib/python/setup.py
@@ -2,7 +2,7 @@
 from distutils.core import setup
 
 setup(name="dbrepo",
-      version="1.8.2rc6",
+      version="1.8.2",
       description="A library for communicating with DBRepo",
       url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/",
       author="Martin Weise",
diff --git a/make/build.mk b/make/build.mk
index 22e2c384c573a62bf6e404923a5a811616e84b71..6e2306052ebc7363eb6781d1b09bce53717c244a 100644
--- a/make/build.mk
+++ b/make/build.mk
@@ -21,21 +21,18 @@ build-ui: ## Build the UI.
 
 .PHONY: build-python-lib
 build-python-lib: ## Build the Python Library.
-	rm -rf ./dbrepo-analyse-service/venv/ ./dbrepo-analyse-service/Pipfile.lock ./dbrepo-analyse-service/lib/*
-	rm -rf ./dbrepo-search-service/venv/ ./dbrepo-search-service/Pipfile.lock ./dbrepo-search-service/lib/*
-	rm -rf ./dbrepo-dashboard-service/venv/ ./dbrepo-dashboard-service/Pipfile.lock ./dbrepo-dashboard-service/lib/*
+	rm -rf ./dbrepo-analyse-service/lib/* ./dbrepo-search-service/lib/* ./dbrepo-dashboard-service/lib/*
 	python3 -m build --sdist ./lib/python
 	python3 -m build --wheel ./lib/python
 	cp -r ./lib/python/dist/dbrepo-${APP_VERSION}* ./dbrepo-analyse-service/lib
-	(cd ./dbrepo-analyse-service && python3 -m venv venv && PIPENV_IGNORE_VIRTUALENVS=1 pipenv install --dev)
+	PIPENV_PIPFILE=./dbrepo-analyse-service/Pipfile pipenv lock
 	cp -r ./lib/python/dist/dbrepo-${APP_VERSION}* ./dbrepo-search-service/lib
-	(cd ./dbrepo-search-service && python3 -m venv venv && PIPENV_IGNORE_VIRTUALENVS=1 pipenv install --dev)
+	PIPENV_PIPFILE=./dbrepo-search-service/Pipfile pipenv lock
 	cp -r ./lib/python/dist/dbrepo-${APP_VERSION}* ./dbrepo-dashboard-service/lib
-	(cd ./dbrepo-dashboard-service && python3 -m venv venv && PIPENV_IGNORE_VIRTUALENVS=1 pipenv install --dev)
+	PIPENV_PIPFILE=./dbrepo-dashboard-service/Pipfile pipenv lock
 
 .PHONY: build-helm
 build-helm: ## Build the DBRepo and DBRepo MariaDB Galera Helm Charts.
-	helm dependency update ./helm/seaweedfs
 	helm package ./helm/seaweedfs --destination ./build
 	helm dependency update ./helm/dbrepo
 	helm package ./helm/dbrepo --destination ./build
diff --git a/make/dev.mk b/make/dev.mk
index e865e2d9dd1116ff801a549811c087ff31056019..e580b178b37af91fb32cedf523478c473db4ba62 100644
--- a/make/dev.mk
+++ b/make/dev.mk
@@ -12,7 +12,7 @@ stop-dev: ## Stop the development deployment and remove all data.
 
 .PHONY: package-config
 package-config: ## Package the config files
-	mkdir -p ./.docker/config/{dashboards,provisioning}
+	mkdir -p ./.docker/config
 	cp ./dbrepo-auth-service/dbrepo-realm.json ./.docker/config
 	cp ./dbrepo-auth-service/import-realms.sh ./.docker/config
 	cp ./dbrepo-auth-service/master-realm.json ./.docker/config
@@ -24,6 +24,12 @@ package-config: ## Package the config files
 	cp ./dbrepo-broker-service/definitions.json ./.docker/config
 	cp ./dbrepo-broker-service/advanced.config ./.docker/config
 	cp ./dbrepo-gateway-service/dbrepo.conf ./.docker/config
+	cp -r ./dbrepo-dashboard-ui/dashboards ./.docker/config
+	cp -r ./dbrepo-dashboard-ui/provisioning ./.docker/config
+	cp ./dbrepo-dashboard-ui/grafana.ini ./.docker/config/grafana.ini
+	cp ./dbrepo-dashboard-ui/ldap.toml ./.docker/config/ldap.toml
+	cp ./dbrepo-logging-service/fluentbit.conf ./.docker/config
+	cp ./dbrepo-logging-service/fluentbit_parser.conf ./.docker/config
 	cp ./dbrepo-metric-db/prometheus.yml ./.docker/config
 	cp ./dbrepo-storage-service/s3_config.json ./.docker/config
 	cp ./dbrepo-auth-service/listeners/target/create-event-listener.jar ./.docker/config
diff --git a/mkdocs.yml b/mkdocs.yml
index 7060289640e3f0034d0e20405526d9b512aa26ed..5051d9a3280ca8508dc30a1da884dcbe0cf09be6 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -20,6 +20,7 @@ nav:
     - Data Versioning: concepts/data-versioning.md
     - Dashboards: concepts/dashboards.md
     - Data Visibility: concepts/data-visibility.md
+    - Logging: concepts/logging.md
     - Messaging: concepts/messaging.md
     - Monitoring: concepts/monitoring.md
     - Persistent Identifier: concepts/pid.md