diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 15d4639ba03e72528b90e979bce42d5eab127ae2..f340faa4dd6012b599b0aebd2cbbc3f55c11532e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,4 @@
-image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/node:18
+image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/node:20
 cache:
   paths:
     - node_modules
@@ -34,16 +34,23 @@ build:
     paths:
       - dist
 
-publish-main-docker-container-job:
+.build-container-job:
   stage: deploy
   image:
-    name: gcr.io/kaniko-project/executor:v1.21.0-debug
-    entrypoint: [""]
+    name: gcr.io/kaniko-project/executor:v1.21.1-debug
+    entrypoint: [ "" ]
+  dependencies: [ ]
+  cache: [ ]
+  before_script:
+    - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"},\"$(echo -n $CI_DEPENDENCY_PROXY_SERVER | awk -F[:] '{print $1}')\":{\"auth\":\"$(printf "%s:%s" ${CI_DEPENDENCY_PROXY_USER} "${CI_DEPENDENCY_PROXY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
+
+
+
+publish-main-docker-container-job:
+  extends: .build-container-job
   only:
     refs:
       - main
-  before_script:
-    - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"},\"$(echo -n $CI_DEPENDENCY_PROXY_SERVER | awk -F[:] '{print $1}')\":{\"auth\":\"$(printf "%s:%s" ${CI_DEPENDENCY_PROXY_USER} "${CI_DEPENDENCY_PROXY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
   script:
     - /kaniko/executor
       --context "${CI_PROJECT_DIR}"
@@ -52,14 +59,9 @@ publish-main-docker-container-job:
       --destination "${CI_REGISTRY_IMAGE}:main-latest"
 
 publish-docker-container-job:
-  stage: deploy
-  image:
-    name: gcr.io/kaniko-project/executor:v1.21.0-debug
-    entrypoint: [""]
+  extends: .build-container-job
   only:
     - tags
-  before_script:
-    - echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"},\"$(echo -n $CI_DEPENDENCY_PROXY_SERVER | awk -F[:] '{print $1}')\":{\"auth\":\"$(printf "%s:%s" ${CI_DEPENDENCY_PROXY_USER} "${CI_DEPENDENCY_PROXY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
   script:
     - /kaniko/executor
       --context "${CI_PROJECT_DIR}"
diff --git a/Dockerfile b/Dockerfile
index dda87caaa5cc450b2fbb2bd8d0a3fc1bb37838a2..3293d59d4f883e4b6fd059eba5e27759020c7a9a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
 # build stage
-FROM node:18 as build-stage
+FROM node:20 as build-stage
 WORKDIR /app
 COPY package.json ./
 COPY package-lock.json ./
@@ -10,7 +10,7 @@ RUN npm run build-only
 # production stage
 FROM nginx:stable-alpine as production-stage
 EXPOSE 80
-HEALTHCHECK --interval=30s --timeout=2s CMD curl --head -f http://localhost || exit 1
+HEALTHCHECK --interval=10s --timeout=2s CMD curl --head -f http://localhost || exit 1
 COPY nginx.conf /etc/nginx/conf.d/default.conf
 COPY --from=build-stage /app/dist /usr/share/nginx/html
 COPY --from=build-stage /app/src/assets/env.template.js /tmp
diff --git a/package-lock.json b/package-lock.json
index 87d4ff0688099395e11f5523d084e53c1955ddfd..cdd2858fa2ac1e5203d121f657da0bb2b7d452cb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,9 +9,9 @@
       "version": "2.0.0",
       "license": "Apache-2.0",
       "dependencies": {
-        "@aws-sdk/client-s3": "^3.440.0",
-        "@aws-sdk/lib-storage": "^3.440.0",
-        "@aws-sdk/s3-request-presigner": "^3.440.0",
+        "@aws-sdk/client-s3": "<3.530.0",
+        "@aws-sdk/lib-storage": "<3.530.0",
+        "@aws-sdk/s3-request-presigner": "<3.530.0",
         "@fortawesome/fontawesome-free": "~6.5.0",
         "@popperjs/core": "~2.11.8",
         "ajv": "~8.12.0",
@@ -34,11 +34,11 @@
       "devDependencies": {
         "@esbuild-plugins/node-globals-polyfill": "~0.2.3",
         "@esbuild-plugins/node-modules-polyfill": "~0.2.2",
-        "@rushstack/eslint-patch": "~1.7.0",
-        "@tsconfig/node18": "^18.2.1",
+        "@rushstack/eslint-patch": "~1.9.0",
+        "@tsconfig/node20": "^20.1.2",
         "@types/bootstrap": "~5.2.0",
         "@types/dompurify": "~3.0.0",
-        "@types/node": "^18.19.5",
+        "@types/node": "^20.11.0",
         "@types/semver": "~7.5.1",
         "@types/showdown": "~2.0.1",
         "@types/sortablejs": "^1.15.7",
@@ -48,15 +48,15 @@
         "@vue/tsconfig": "~0.5.0",
         "axios": "~1.6.0",
         "eslint": "~8.57.0",
-        "eslint-plugin-vue": "~9.22.0",
+        "eslint-plugin-vue": "~9.24.0",
         "highlight.js": "^11.9.0",
         "npm-run-all": "~4.1.5",
-        "openapi-typescript-codegen": "^0.27.0",
+        "openapi-typescript-codegen": "^0.28.0",
         "prettier": "~3.2.0",
         "rollup-plugin-node-polyfills": "~0.2.1",
         "sass": "^1.66.0",
         "typescript": "~5.3.0",
-        "vite": "~5.1.0",
+        "vite": "~5.2.0",
         "vue-tsc": "~2.0.0"
       }
     },
@@ -70,16 +70,14 @@
       }
     },
     "node_modules/@apidevtools/json-schema-ref-parser": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-10.1.0.tgz",
-      "integrity": "sha512-3e+viyMuXdrcK8v5pvP+SDoAQ77FH6OyRmuK48SZKmdHJRFm87RsSs8qm6kP39a/pOPURByJw+OXzQIqcfmKtA==",
+      "version": "11.5.4",
+      "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.5.4.tgz",
+      "integrity": "sha512-o2fsypTGU0WxRxbax8zQoHiIB4dyrkwYfcm8TxZ+bx9pCzcWZbQtiMqpgBvWA/nJ2TrGjK5adCLfTH8wUeU/Wg==",
       "dev": true,
       "dependencies": {
         "@jsdevtools/ono": "^7.1.3",
-        "@types/json-schema": "^7.0.11",
-        "@types/lodash.clonedeep": "^4.5.7",
-        "js-yaml": "^4.1.0",
-        "lodash.clonedeep": "^4.5.0"
+        "@types/json-schema": "^7.0.15",
+        "js-yaml": "^4.1.0"
       },
       "engines": {
         "node": ">= 16"
@@ -876,11 +874,11 @@
       }
     },
     "node_modules/@aws-sdk/util-locate-window": {
-      "version": "3.495.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.495.0.tgz",
-      "integrity": "sha512-MfaPXT0kLX2tQaR90saBT9fWQq2DHqSSJRzW+MZWsmF+y5LGCOhO22ac/2o6TKSQm7h0HRc2GaADqYYYor62yg==",
+      "version": "3.535.0",
+      "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.535.0.tgz",
+      "integrity": "sha512-PHJ3SL6d2jpcgbqdgiPxkXpu7Drc2PYViwxSIqvvMKhDwzSB1W3mMvtpzwKM4IE7zLFodZo0GKjJ9AsoXndXhA==",
       "dependencies": {
-        "tslib": "^2.5.0"
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
@@ -940,9 +938,9 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.24.0",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz",
-      "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==",
+      "version": "7.24.1",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz",
+      "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==",
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -973,9 +971,9 @@
       }
     },
     "node_modules/@esbuild/aix-ppc64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz",
-      "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
+      "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
       "cpu": [
         "ppc64"
       ],
@@ -984,15 +982,14 @@
       "os": [
         "aix"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/android-arm": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz",
-      "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
+      "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
       "cpu": [
         "arm"
       ],
@@ -1001,15 +998,14 @@
       "os": [
         "android"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/android-arm64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz",
-      "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
+      "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
       "cpu": [
         "arm64"
       ],
@@ -1018,15 +1014,14 @@
       "os": [
         "android"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/android-x64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz",
-      "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
+      "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
       "cpu": [
         "x64"
       ],
@@ -1035,15 +1030,14 @@
       "os": [
         "android"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz",
-      "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
+      "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
       "cpu": [
         "arm64"
       ],
@@ -1052,15 +1046,14 @@
       "os": [
         "darwin"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/darwin-x64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz",
-      "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
+      "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
       "cpu": [
         "x64"
       ],
@@ -1069,15 +1062,14 @@
       "os": [
         "darwin"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz",
-      "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
+      "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
       "cpu": [
         "arm64"
       ],
@@ -1086,15 +1078,14 @@
       "os": [
         "freebsd"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz",
-      "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
+      "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
       "cpu": [
         "x64"
       ],
@@ -1103,15 +1094,14 @@
       "os": [
         "freebsd"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/linux-arm": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz",
-      "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
+      "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
       "cpu": [
         "arm"
       ],
@@ -1120,15 +1110,14 @@
       "os": [
         "linux"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/linux-arm64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz",
-      "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
+      "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
       "cpu": [
         "arm64"
       ],
@@ -1137,15 +1126,14 @@
       "os": [
         "linux"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/linux-ia32": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz",
-      "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
+      "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
       "cpu": [
         "ia32"
       ],
@@ -1154,15 +1142,14 @@
       "os": [
         "linux"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/linux-loong64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz",
-      "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
+      "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
       "cpu": [
         "loong64"
       ],
@@ -1171,15 +1158,14 @@
       "os": [
         "linux"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz",
-      "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
+      "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
       "cpu": [
         "mips64el"
       ],
@@ -1188,15 +1174,14 @@
       "os": [
         "linux"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz",
-      "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
+      "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
       "cpu": [
         "ppc64"
       ],
@@ -1205,15 +1190,14 @@
       "os": [
         "linux"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz",
-      "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
+      "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
       "cpu": [
         "riscv64"
       ],
@@ -1222,15 +1206,14 @@
       "os": [
         "linux"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/linux-s390x": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz",
-      "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
+      "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
       "cpu": [
         "s390x"
       ],
@@ -1239,15 +1222,14 @@
       "os": [
         "linux"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/linux-x64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz",
-      "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
+      "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
       "cpu": [
         "x64"
       ],
@@ -1256,15 +1238,14 @@
       "os": [
         "linux"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz",
-      "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
+      "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
       "cpu": [
         "x64"
       ],
@@ -1273,15 +1254,14 @@
       "os": [
         "netbsd"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz",
-      "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
+      "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
       "cpu": [
         "x64"
       ],
@@ -1290,15 +1270,14 @@
       "os": [
         "openbsd"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/sunos-x64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz",
-      "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
+      "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
       "cpu": [
         "x64"
       ],
@@ -1307,15 +1286,14 @@
       "os": [
         "sunos"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/win32-arm64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz",
-      "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
+      "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
       "cpu": [
         "arm64"
       ],
@@ -1324,15 +1302,14 @@
       "os": [
         "win32"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/win32-ia32": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz",
-      "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
+      "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
       "cpu": [
         "ia32"
       ],
@@ -1341,15 +1318,14 @@
       "os": [
         "win32"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/@esbuild/win32-x64": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz",
-      "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
+      "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
       "cpu": [
         "x64"
       ],
@@ -1358,7 +1334,6 @@
       "os": [
         "win32"
       ],
-      "peer": true,
       "engines": {
         "node": ">=12"
       }
@@ -1600,9 +1575,9 @@
       }
     },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.1.tgz",
-      "integrity": "sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.1.tgz",
+      "integrity": "sha512-4C4UERETjXpC4WpBXDbkgNVgHyWfG3B/NKY46e7w5H134UDOFqUJKpsLm0UYmuupW+aJmRgeScrDNfvZ5WV80A==",
       "cpu": [
         "arm"
       ],
@@ -1613,9 +1588,9 @@
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.1.tgz",
-      "integrity": "sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.1.tgz",
+      "integrity": "sha512-TrTaFJ9pXgfXEiJKQ3yQRelpQFqgRzVR9it8DbeRzG0RX7mKUy0bqhCFsgevwXLJepQKTnLl95TnPGf9T9AMOA==",
       "cpu": [
         "arm64"
       ],
@@ -1626,9 +1601,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.1.tgz",
-      "integrity": "sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.1.tgz",
+      "integrity": "sha512-fz7jN6ahTI3cKzDO2otQuybts5cyu0feymg0bjvYCBrZQ8tSgE8pc0sSNEuGvifrQJWiwx9F05BowihmLxeQKw==",
       "cpu": [
         "arm64"
       ],
@@ -1639,9 +1614,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.1.tgz",
-      "integrity": "sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.1.tgz",
+      "integrity": "sha512-WTvdz7SLMlJpektdrnWRUN9C0N2qNHwNbWpNo0a3Tod3gb9leX+yrYdCeB7VV36OtoyiPAivl7/xZ3G1z5h20g==",
       "cpu": [
         "x64"
       ],
@@ -1652,9 +1627,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.1.tgz",
-      "integrity": "sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.1.tgz",
+      "integrity": "sha512-dBHQl+7wZzBYcIF6o4k2XkAfwP2ks1mYW2q/Gzv9n39uDcDiAGDqEyml08OdY0BIct0yLSPkDTqn4i6czpBLLw==",
       "cpu": [
         "arm"
       ],
@@ -1665,9 +1640,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.1.tgz",
-      "integrity": "sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.1.tgz",
+      "integrity": "sha512-bur4JOxvYxfrAmocRJIW0SADs3QdEYK6TQ7dTNz6Z4/lySeu3Z1H/+tl0a4qDYv0bCdBpUYM0sYa/X+9ZqgfSQ==",
       "cpu": [
         "arm64"
       ],
@@ -1678,9 +1653,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.1.tgz",
-      "integrity": "sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.1.tgz",
+      "integrity": "sha512-ssp77SjcDIUSoUyj7DU7/5iwM4ZEluY+N8umtCT9nBRs3u045t0KkW02LTyHouHDomnMXaXSZcCSr2bdMK63kA==",
       "cpu": [
         "arm64"
       ],
@@ -1691,9 +1666,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.1.tgz",
-      "integrity": "sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.1.tgz",
+      "integrity": "sha512-Jv1DkIvwEPAb+v25/Unrnnq9BO3F5cbFPT821n3S5litkz+O5NuXuNhqtPx5KtcwOTtaqkTsO+IVzJOsxd11aQ==",
       "cpu": [
         "riscv64"
       ],
@@ -1703,10 +1678,23 @@
         "linux"
       ]
     },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.1.tgz",
+      "integrity": "sha512-U564BrhEfaNChdATQaEODtquCC7Ez+8Hxz1h5MAdMYj0AqD0GA9rHCpElajb/sQcaFL6NXmHc5O+7FXpWMa73Q==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.1.tgz",
-      "integrity": "sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.1.tgz",
+      "integrity": "sha512-zGRDulLTeDemR8DFYyFIQ8kMP02xpUsX4IBikc7lwL9PrwR3gWmX2NopqiGlI2ZVWMl15qZeUjumTwpv18N7sQ==",
       "cpu": [
         "x64"
       ],
@@ -1717,9 +1705,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.1.tgz",
-      "integrity": "sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.1.tgz",
+      "integrity": "sha512-VTk/MveyPdMFkYJJPCkYBw07KcTkGU2hLEyqYMsU4NjiOfzoaDTW9PWGRsNwiOA3qI0k/JQPjkl/4FCK1smskQ==",
       "cpu": [
         "x64"
       ],
@@ -1730,9 +1718,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.1.tgz",
-      "integrity": "sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.1.tgz",
+      "integrity": "sha512-L+hX8Dtibb02r/OYCsp4sQQIi3ldZkFI0EUkMTDwRfFykXBPptoz/tuuGqEd3bThBSLRWPR6wsixDSgOx/U3Zw==",
       "cpu": [
         "arm64"
       ],
@@ -1743,9 +1731,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.1.tgz",
-      "integrity": "sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.1.tgz",
+      "integrity": "sha512-+dI2jVPfM5A8zme8riEoNC7UKk0Lzc7jCj/U89cQIrOjrZTCWZl/+IXUeRT2rEZ5j25lnSA9G9H1Ob9azaF/KQ==",
       "cpu": [
         "ia32"
       ],
@@ -1756,9 +1744,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.1.tgz",
-      "integrity": "sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.1.tgz",
+      "integrity": "sha512-YY1Exxo2viZ/O2dMHuwQvimJ0SqvL+OAWQLLY6rvXavgQKjhQUzn7nc1Dd29gjB5Fqi00nrBWctJBOyfVMIVxw==",
       "cpu": [
         "x64"
       ],
@@ -1769,273 +1757,273 @@
       ]
     },
     "node_modules/@rushstack/eslint-patch": {
-      "version": "1.7.2",
-      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz",
-      "integrity": "sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==",
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.9.0.tgz",
+      "integrity": "sha512-AAWymnpvHbGty1BmgbdfbqQDboXs6xN6h2yAacO4yKVyyUUBnpYkp+P9jjPrV9zrAGw7JVVriRtGOHPInnfjZQ==",
       "dev": true
     },
     "node_modules/@smithy/abort-controller": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.1.4.tgz",
-      "integrity": "sha512-66HO817oIZ2otLIqy06R5muapqZjkgF1jfU0wyNko8cuqZNu8nbS9ljlhcRYw/M/uWRJzB9ih81DLSHhYbBLlQ==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.2.0.tgz",
+      "integrity": "sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==",
       "dependencies": {
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/chunked-blob-reader": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.1.1.tgz",
-      "integrity": "sha512-NjNFCKxC4jVvn+lUr3Yo4/PmUJj3tbyqH6GNHueyTGS5Q27vlEJ1MkNhUDV8QGxJI7Bodnc2pD18lU2zRfhHlQ==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.2.0.tgz",
+      "integrity": "sha512-3GJNvRwXBGdkDZZOGiziVYzDpn4j6zfyULHMDKAGIUo72yHALpE9CbhfQp/XcLNVoc1byfMpn6uW5H2BqPjgaQ==",
       "dependencies": {
-        "tslib": "^2.5.0"
+        "tslib": "^2.6.2"
       }
     },
     "node_modules/@smithy/chunked-blob-reader-native": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.1.2.tgz",
-      "integrity": "sha512-KwR9fFc/t5jH9RQFbrA9DHSmI+URTmB4v+i7H08UNET9AcN6GGBTBMiDKpA56Crw6CN7cSaSDXaRS/AsfOuupQ==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.2.0.tgz",
+      "integrity": "sha512-VNB5+1oCgX3Fzs072yuRsUoC2N4Zg/LJ11DTxX3+Qu+Paa6AmbIF0E9sc2wthz9Psrk/zcOlTCyuposlIhPjZQ==",
       "dependencies": {
-        "@smithy/util-base64": "^2.2.0",
-        "tslib": "^2.5.0"
+        "@smithy/util-base64": "^2.3.0",
+        "tslib": "^2.6.2"
       }
     },
     "node_modules/@smithy/config-resolver": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.1.5.tgz",
-      "integrity": "sha512-LcBB5JQC3Tx2ZExIJzfvWaajhFIwHrUNQeqxhred2r5nnqrdly9uoCrvM1sxOOdghYuWWm2Kr8tBCDOmxsgeTA==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.2.0.tgz",
+      "integrity": "sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==",
       "dependencies": {
-        "@smithy/node-config-provider": "^2.2.5",
-        "@smithy/types": "^2.11.0",
-        "@smithy/util-config-provider": "^2.2.1",
-        "@smithy/util-middleware": "^2.1.4",
-        "tslib": "^2.5.0"
+        "@smithy/node-config-provider": "^2.3.0",
+        "@smithy/types": "^2.12.0",
+        "@smithy/util-config-provider": "^2.3.0",
+        "@smithy/util-middleware": "^2.2.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/core": {
-      "version": "1.3.7",
-      "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.3.7.tgz",
-      "integrity": "sha512-zHrrstOO78g+/rOJoHi4j3mGUBtsljRhcKNzloWPv1XIwgcFUi+F1YFKr2qPQ3z7Ls5dNc4L2SPrVarNFIQqog==",
-      "dependencies": {
-        "@smithy/middleware-endpoint": "^2.4.6",
-        "@smithy/middleware-retry": "^2.1.6",
-        "@smithy/middleware-serde": "^2.2.1",
-        "@smithy/protocol-http": "^3.2.2",
-        "@smithy/smithy-client": "^2.4.4",
-        "@smithy/types": "^2.11.0",
-        "@smithy/util-middleware": "^2.1.4",
-        "tslib": "^2.5.0"
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.4.0.tgz",
+      "integrity": "sha512-uu9ZDI95Uij4qk+L6kyFjdk11zqBkcJ3Lv0sc6jZrqHvLyr0+oeekD3CnqMafBn/5PRI6uv6ulW3kNLRBUHeVw==",
+      "dependencies": {
+        "@smithy/middleware-endpoint": "^2.5.0",
+        "@smithy/middleware-retry": "^2.2.0",
+        "@smithy/middleware-serde": "^2.3.0",
+        "@smithy/protocol-http": "^3.3.0",
+        "@smithy/smithy-client": "^2.5.0",
+        "@smithy/types": "^2.12.0",
+        "@smithy/util-middleware": "^2.2.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/credential-provider-imds": {
-      "version": "2.2.6",
-      "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.2.6.tgz",
-      "integrity": "sha512-+xQe4Pite0kdk9qn0Vyw5BRVh0iSlj+T4TEKRXr4E1wZKtVgIzGlkCrfICSjiPVFkPxk4jMpVboMYdEiiA88/w==",
-      "dependencies": {
-        "@smithy/node-config-provider": "^2.2.5",
-        "@smithy/property-provider": "^2.1.4",
-        "@smithy/types": "^2.11.0",
-        "@smithy/url-parser": "^2.1.4",
-        "tslib": "^2.5.0"
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.3.0.tgz",
+      "integrity": "sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==",
+      "dependencies": {
+        "@smithy/node-config-provider": "^2.3.0",
+        "@smithy/property-provider": "^2.2.0",
+        "@smithy/types": "^2.12.0",
+        "@smithy/url-parser": "^2.2.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/eventstream-codec": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.1.4.tgz",
-      "integrity": "sha512-UkiieTztP7adg8EuqZvB0Y4LewdleZCJU7Kgt9RDutMsRYqO32fMpWeQHeTHaIMosmzcRZUykMRrhwGJe9mP3A==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.2.0.tgz",
+      "integrity": "sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==",
       "dependencies": {
         "@aws-crypto/crc32": "3.0.0",
-        "@smithy/types": "^2.11.0",
-        "@smithy/util-hex-encoding": "^2.1.1",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "@smithy/util-hex-encoding": "^2.2.0",
+        "tslib": "^2.6.2"
       }
     },
     "node_modules/@smithy/eventstream-serde-browser": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.1.4.tgz",
-      "integrity": "sha512-K0SyvrUu/vARKzNW+Wp9HImiC/cJ6K88/n7FTH1slY+MErdKoiSbRLaXbJ9qD6x1Hu28cplHMlhADwZelUx/Ww==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.2.0.tgz",
+      "integrity": "sha512-UaPf8jKbcP71BGiO0CdeLmlg+RhWnlN8ipsMSdwvqBFigl5nil3rHOI/5GE3tfiuX8LvY5Z9N0meuU7Rab7jWw==",
       "dependencies": {
-        "@smithy/eventstream-serde-universal": "^2.1.4",
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/eventstream-serde-universal": "^2.2.0",
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/eventstream-serde-config-resolver": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.1.4.tgz",
-      "integrity": "sha512-FH+2AwOwZ0kHPB9sciWJtUqx81V4vizfT3P6T9eslmIC2hi8ch/KFvQlF7jDmwR1aLlPlq6qqLKLqzK/71Ki4A==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.2.0.tgz",
+      "integrity": "sha512-RHhbTw/JW3+r8QQH7PrganjNCiuiEZmpi6fYUAetFfPLfZ6EkiA08uN3EFfcyKubXQxOwTeJRZSQmDDCdUshaA==",
       "dependencies": {
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/eventstream-serde-node": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.1.4.tgz",
-      "integrity": "sha512-gsc5ZTvVcB9sleLQzsK/rOhgn52+AAsmhEr41WDwAcctccBjh429+b8gT9t+SU8QyajypfsLOZfJQu0+zE515Q==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.2.0.tgz",
+      "integrity": "sha512-zpQMtJVqCUMn+pCSFcl9K/RPNtQE0NuMh8sKpCdEHafhwRsjP50Oq/4kMmvxSRy6d8Jslqd8BLvDngrUtmN9iA==",
       "dependencies": {
-        "@smithy/eventstream-serde-universal": "^2.1.4",
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/eventstream-serde-universal": "^2.2.0",
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/eventstream-serde-universal": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.1.4.tgz",
-      "integrity": "sha512-NKLAsYnZA5s+ntipJRKo1RrRbhYHrsEnmiUoz0EhVYrAih+UELY9sKR+A1ujGaFm3nKDs5fPfiozC2wpXq2zUA==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.2.0.tgz",
+      "integrity": "sha512-pvoe/vvJY0mOpuF84BEtyZoYfbehiFj8KKWk1ds2AT0mTLYFVs+7sBJZmioOFdBXKd48lfrx1vumdPdmGlCLxA==",
       "dependencies": {
-        "@smithy/eventstream-codec": "^2.1.4",
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/eventstream-codec": "^2.2.0",
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/fetch-http-handler": {
-      "version": "2.4.4",
-      "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.4.4.tgz",
-      "integrity": "sha512-DSUtmsnIx26tPuyyrK49dk2DAhPgEw6xRW7V62nMHIB5dk3NqhGnwcKO2fMdt/l3NUVgia34ZsSJA8bD+3nh7g==",
-      "dependencies": {
-        "@smithy/protocol-http": "^3.2.2",
-        "@smithy/querystring-builder": "^2.1.4",
-        "@smithy/types": "^2.11.0",
-        "@smithy/util-base64": "^2.2.0",
-        "tslib": "^2.5.0"
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.5.0.tgz",
+      "integrity": "sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==",
+      "dependencies": {
+        "@smithy/protocol-http": "^3.3.0",
+        "@smithy/querystring-builder": "^2.2.0",
+        "@smithy/types": "^2.12.0",
+        "@smithy/util-base64": "^2.3.0",
+        "tslib": "^2.6.2"
       }
     },
     "node_modules/@smithy/hash-blob-browser": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.1.4.tgz",
-      "integrity": "sha512-bDugS1DortnriGDdp0sqdq7dLI5if8CEOF9rKtpJa1ZYMq6fxOtTId//dlilS5QgUtUs6GHN5aMQVxEjhBzzQA==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.2.0.tgz",
+      "integrity": "sha512-SGPoVH8mdXBqrkVCJ1Hd1X7vh1zDXojNN1yZyZTZsCno99hVue9+IYzWDjq/EQDDXxmITB0gBmuyPh8oAZSTcg==",
       "dependencies": {
-        "@smithy/chunked-blob-reader": "^2.1.1",
-        "@smithy/chunked-blob-reader-native": "^2.1.2",
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/chunked-blob-reader": "^2.2.0",
+        "@smithy/chunked-blob-reader-native": "^2.2.0",
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       }
     },
     "node_modules/@smithy/hash-node": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.1.4.tgz",
-      "integrity": "sha512-uvCcpDLXaTTL0X/9ezF8T8sS77UglTfZVQaUOBiCvR0QydeSyio3t0Hj3QooVdyFsKTubR8gCk/ubLk3vAyDng==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.2.0.tgz",
+      "integrity": "sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==",
       "dependencies": {
-        "@smithy/types": "^2.11.0",
-        "@smithy/util-buffer-from": "^2.1.1",
-        "@smithy/util-utf8": "^2.2.0",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "@smithy/util-buffer-from": "^2.2.0",
+        "@smithy/util-utf8": "^2.3.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/hash-stream-node": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.1.4.tgz",
-      "integrity": "sha512-HcDQRs/Fcx7lwAd+/vSW/e7ltdh148D2Pq7XI61CEWcOoQdQ0W8aYBHDRC4zjtXv6hySdmWE+vo3dvdTt7aj8A==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.2.0.tgz",
+      "integrity": "sha512-aT+HCATOSRMGpPI7bi7NSsTNVZE/La9IaxLXWoVAYMxHT5hGO3ZOGEMZQg8A6nNL+pdFGtZQtND1eoY084HgHQ==",
       "dependencies": {
-        "@smithy/types": "^2.11.0",
-        "@smithy/util-utf8": "^2.2.0",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "@smithy/util-utf8": "^2.3.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/invalid-dependency": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.1.4.tgz",
-      "integrity": "sha512-QzlNBl6jt3nb9jNnE51wTegReVvUdozyMMrFEyb/rc6AzPID1O+qMJYjAAoNw098y0CZVfCpEnoK2+mfBOd8XA==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.2.0.tgz",
+      "integrity": "sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==",
       "dependencies": {
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       }
     },
     "node_modules/@smithy/is-array-buffer": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.1.1.tgz",
-      "integrity": "sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+      "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
       "dependencies": {
-        "tslib": "^2.5.0"
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/md5-js": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.1.4.tgz",
-      "integrity": "sha512-WHTnnYJPKE7Sy49DogLuox42TnlwD3cQ6TObPD6WFWjKocWIdpEpIvdJHwWUfSFf0JIi8ON8z6ZEhsnyKVCcLQ==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.2.0.tgz",
+      "integrity": "sha512-M26XTtt9IIusVMOWEAhIvFIr9jYj4ISPPGJROqw6vXngO3IYJCnVVSMFn4Tx1rUTG5BiKJNg9u2nxmBiZC5IlQ==",
       "dependencies": {
-        "@smithy/types": "^2.11.0",
-        "@smithy/util-utf8": "^2.2.0",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "@smithy/util-utf8": "^2.3.0",
+        "tslib": "^2.6.2"
       }
     },
     "node_modules/@smithy/middleware-content-length": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.1.4.tgz",
-      "integrity": "sha512-C6VRwfcr0w9qRFhDGCpWMVhlEIBFlmlPRP1aX9Cv9xDj9SUwlDrNvoV1oP1vjRYuLxCDgovBBynCwwcluS2wLw==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.2.0.tgz",
+      "integrity": "sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==",
       "dependencies": {
-        "@smithy/protocol-http": "^3.2.2",
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/protocol-http": "^3.3.0",
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/middleware-endpoint": {
-      "version": "2.4.6",
-      "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.4.6.tgz",
-      "integrity": "sha512-AsXtUXHPOAS0EGZUSFOsVJvc7p0KL29PGkLxLfycPOcFVLru/oinYB6yvyL73ZZPX2OB8sMYUMrj7eH2kI7V/w==",
-      "dependencies": {
-        "@smithy/middleware-serde": "^2.2.1",
-        "@smithy/node-config-provider": "^2.2.5",
-        "@smithy/shared-ini-file-loader": "^2.3.5",
-        "@smithy/types": "^2.11.0",
-        "@smithy/url-parser": "^2.1.4",
-        "@smithy/util-middleware": "^2.1.4",
-        "tslib": "^2.5.0"
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.0.tgz",
+      "integrity": "sha512-OBhI9ZEAG8Xen0xsFJwwNOt44WE2CWkfYIxTognC8x42Lfsdf0VN/wCMqpdkySMDio/vts10BiovAxQp0T0faA==",
+      "dependencies": {
+        "@smithy/middleware-serde": "^2.3.0",
+        "@smithy/node-config-provider": "^2.3.0",
+        "@smithy/shared-ini-file-loader": "^2.4.0",
+        "@smithy/types": "^2.12.0",
+        "@smithy/url-parser": "^2.2.0",
+        "@smithy/util-middleware": "^2.2.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/middleware-retry": {
-      "version": "2.1.6",
-      "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.1.6.tgz",
-      "integrity": "sha512-khpSV0NxqMHfa06kfG4WYv+978sVvfTFmn0hIFKKwOXtIxyYtPKiQWFT4nnwZD07fGdYGbtCBu3YALc8SsA5mA==",
-      "dependencies": {
-        "@smithy/node-config-provider": "^2.2.5",
-        "@smithy/protocol-http": "^3.2.2",
-        "@smithy/service-error-classification": "^2.1.4",
-        "@smithy/smithy-client": "^2.4.4",
-        "@smithy/types": "^2.11.0",
-        "@smithy/util-middleware": "^2.1.4",
-        "@smithy/util-retry": "^2.1.4",
-        "tslib": "^2.5.0",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.2.0.tgz",
+      "integrity": "sha512-PsjDOLpbevgn37yJbawmfVoanru40qVA8UEf2+YA1lvOefmhuhL6ZbKtGsLAWDRnE1OlAmedsbA/htH6iSZjNA==",
+      "dependencies": {
+        "@smithy/node-config-provider": "^2.3.0",
+        "@smithy/protocol-http": "^3.3.0",
+        "@smithy/service-error-classification": "^2.1.5",
+        "@smithy/smithy-client": "^2.5.0",
+        "@smithy/types": "^2.12.0",
+        "@smithy/util-middleware": "^2.2.0",
+        "@smithy/util-retry": "^2.2.0",
+        "tslib": "^2.6.2",
         "uuid": "^8.3.2"
       },
       "engines": {
@@ -2043,379 +2031,379 @@
       }
     },
     "node_modules/@smithy/middleware-serde": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.2.1.tgz",
-      "integrity": "sha512-VAWRWqnNjgccebndpyK94om4ZTYzXLQxUmNCXYzM/3O9MTfQjTNBgtFtQwyIIez6z7LWcCsXmnKVIOE9mLqAHQ==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.3.0.tgz",
+      "integrity": "sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==",
       "dependencies": {
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/middleware-stack": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.1.4.tgz",
-      "integrity": "sha512-Qqs2ba8Ax1rGKOSGJS2JN23fhhox2WMdRuzx0NYHtXzhxbJOIMmz9uQY6Hf4PY8FPteBPp1+h0j5Fmr+oW12sg==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.2.0.tgz",
+      "integrity": "sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==",
       "dependencies": {
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/node-config-provider": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.2.5.tgz",
-      "integrity": "sha512-CxPf2CXhjO79IypHJLBATB66Dw6suvr1Yc2ccY39hpR6wdse3pZ3E8RF83SODiNH0Wjmkd0ze4OF8exugEixgA==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.3.0.tgz",
+      "integrity": "sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==",
       "dependencies": {
-        "@smithy/property-provider": "^2.1.4",
-        "@smithy/shared-ini-file-loader": "^2.3.5",
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/property-provider": "^2.2.0",
+        "@smithy/shared-ini-file-loader": "^2.4.0",
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/node-http-handler": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.4.2.tgz",
-      "integrity": "sha512-yrj3c1g145uiK5io+1UPbJAHo8BSGORkBzrmzvAsOmBKb+1p3jmM8ZwNLDH/HTTxVLm9iM5rMszx+iAh1HUC4Q==",
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.5.0.tgz",
+      "integrity": "sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==",
       "dependencies": {
-        "@smithy/abort-controller": "^2.1.4",
-        "@smithy/protocol-http": "^3.2.2",
-        "@smithy/querystring-builder": "^2.1.4",
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/abort-controller": "^2.2.0",
+        "@smithy/protocol-http": "^3.3.0",
+        "@smithy/querystring-builder": "^2.2.0",
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/property-provider": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.1.4.tgz",
-      "integrity": "sha512-nWaY/MImj1BiXZ9WY65h45dcxOx8pl06KYoHxwojDxDL+Q9yLU1YnZpgv8zsHhEftlj9KhePENjQTlNowWVyug==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.2.0.tgz",
+      "integrity": "sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==",
       "dependencies": {
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/protocol-http": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.2.2.tgz",
-      "integrity": "sha512-xYBlllOQcOuLoxzhF2u8kRHhIFGQpDeTQj/dBSnw4kfI29WMKL5RnW1m9YjnJAJ49miuIvrkJR+gW5bCQ+Mchw==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.3.0.tgz",
+      "integrity": "sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==",
       "dependencies": {
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/querystring-builder": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.1.4.tgz",
-      "integrity": "sha512-LXSL0J/nRWvGT+jIj+Fip3j0J1ZmHkUyBFRzg/4SmPNCLeDrtVu7ptKOnTboPsFZu5BxmpYok3kJuQzzRdrhbw==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.2.0.tgz",
+      "integrity": "sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==",
       "dependencies": {
-        "@smithy/types": "^2.11.0",
-        "@smithy/util-uri-escape": "^2.1.1",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "@smithy/util-uri-escape": "^2.2.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/querystring-parser": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.1.4.tgz",
-      "integrity": "sha512-U2b8olKXgZAs0eRo7Op11jTNmmcC/sqYmsA7vN6A+jkGnDvJlEl7AetUegbBzU8q3D6WzC5rhR/joIy8tXPzIg==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.2.0.tgz",
+      "integrity": "sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==",
       "dependencies": {
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/service-error-classification": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.4.tgz",
-      "integrity": "sha512-JW2Hthy21evnvDmYYk1kItOmbp3X5XI5iqorXgFEunb6hQfSDZ7O1g0Clyxg7k/Pcr9pfLk5xDIR2To/IohlsQ==",
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.5.tgz",
+      "integrity": "sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==",
       "dependencies": {
-        "@smithy/types": "^2.11.0"
+        "@smithy/types": "^2.12.0"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/shared-ini-file-loader": {
-      "version": "2.3.5",
-      "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.3.5.tgz",
-      "integrity": "sha512-oI99+hOvsM8oAJtxAGmoL/YCcGXtbP0fjPseYGaNmJ4X5xOFTer0KPk7AIH3AL6c5AlYErivEi1X/X78HgTVIw==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.4.0.tgz",
+      "integrity": "sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==",
       "dependencies": {
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/signature-v4": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.1.4.tgz",
-      "integrity": "sha512-gnu9gCn0qQ8IdhNjs6o3QVCXzUs33znSDYwVMWo3nX4dM6j7z9u6FC302ShYyVWfO4MkVMuGCCJ6nl3PcH7V1Q==",
-      "dependencies": {
-        "@smithy/eventstream-codec": "^2.1.4",
-        "@smithy/is-array-buffer": "^2.1.1",
-        "@smithy/types": "^2.11.0",
-        "@smithy/util-hex-encoding": "^2.1.1",
-        "@smithy/util-middleware": "^2.1.4",
-        "@smithy/util-uri-escape": "^2.1.1",
-        "@smithy/util-utf8": "^2.2.0",
-        "tslib": "^2.5.0"
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.2.0.tgz",
+      "integrity": "sha512-+B5TNzj/fRZzVW3z8UUJOkNx15+4E0CLuvJmJUA1JUIZFp3rdJ/M2H5r2SqltaVPXL0oIxv/6YK92T9TsFGbFg==",
+      "dependencies": {
+        "@smithy/eventstream-codec": "^2.2.0",
+        "@smithy/is-array-buffer": "^2.2.0",
+        "@smithy/types": "^2.12.0",
+        "@smithy/util-hex-encoding": "^2.2.0",
+        "@smithy/util-middleware": "^2.2.0",
+        "@smithy/util-uri-escape": "^2.2.0",
+        "@smithy/util-utf8": "^2.3.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/smithy-client": {
-      "version": "2.4.4",
-      "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.4.4.tgz",
-      "integrity": "sha512-SNE17wjycPZIJ2P5sv6wMTteV/vQVPdaqQkoK1KeGoWHXx79t3iLhQXj1uqRdlkMUS9pXJrLOAS+VvUSOYwQKw==",
-      "dependencies": {
-        "@smithy/middleware-endpoint": "^2.4.6",
-        "@smithy/middleware-stack": "^2.1.4",
-        "@smithy/protocol-http": "^3.2.2",
-        "@smithy/types": "^2.11.0",
-        "@smithy/util-stream": "^2.1.4",
-        "tslib": "^2.5.0"
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.5.0.tgz",
+      "integrity": "sha512-DDXWHWdimtS3y/Kw1Jo46KQ0ZYsDKcldFynQERUGBPDpkW1lXOTHy491ALHjwfiBQvzsVKVxl5+ocXNIgJuX4g==",
+      "dependencies": {
+        "@smithy/middleware-endpoint": "^2.5.0",
+        "@smithy/middleware-stack": "^2.2.0",
+        "@smithy/protocol-http": "^3.3.0",
+        "@smithy/types": "^2.12.0",
+        "@smithy/util-stream": "^2.2.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/types": {
-      "version": "2.11.0",
-      "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.11.0.tgz",
-      "integrity": "sha512-AR0SXO7FuAskfNhyGfSTThpLRntDI5bOrU0xrpVYU0rZyjl3LBXInZFMTP/NNSd7IS6Ksdtar0QvnrPRIhVrLQ==",
+      "version": "2.12.0",
+      "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz",
+      "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==",
       "dependencies": {
-        "tslib": "^2.5.0"
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/url-parser": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.1.4.tgz",
-      "integrity": "sha512-1hTy6UYRYqOZlHKH2/2NzdNQ4NNmW2Lp0sYYvztKy+dEQuLvZL9w88zCzFQqqFer3DMcscYOshImxkJTGdV+rg==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.2.0.tgz",
+      "integrity": "sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==",
       "dependencies": {
-        "@smithy/querystring-parser": "^2.1.4",
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/querystring-parser": "^2.2.0",
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       }
     },
     "node_modules/@smithy/util-base64": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.2.0.tgz",
-      "integrity": "sha512-RiQI/Txu0SxCR38Ky5BMEVaFfkNTBjpbxlr2UhhxggSmnsHDQPZJWMtPoXs7TWZaseslIlAWMiHmqRT3AV/P2w==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.3.0.tgz",
+      "integrity": "sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==",
       "dependencies": {
-        "@smithy/util-buffer-from": "^2.1.1",
-        "@smithy/util-utf8": "^2.2.0",
-        "tslib": "^2.5.0"
+        "@smithy/util-buffer-from": "^2.2.0",
+        "@smithy/util-utf8": "^2.3.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/util-body-length-browser": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.1.1.tgz",
-      "integrity": "sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.2.0.tgz",
+      "integrity": "sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==",
       "dependencies": {
-        "tslib": "^2.5.0"
+        "tslib": "^2.6.2"
       }
     },
     "node_modules/@smithy/util-body-length-node": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.2.1.tgz",
-      "integrity": "sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.3.0.tgz",
+      "integrity": "sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==",
       "dependencies": {
-        "tslib": "^2.5.0"
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/util-buffer-from": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.1.1.tgz",
-      "integrity": "sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+      "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
       "dependencies": {
-        "@smithy/is-array-buffer": "^2.1.1",
-        "tslib": "^2.5.0"
+        "@smithy/is-array-buffer": "^2.2.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/util-config-provider": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.2.1.tgz",
-      "integrity": "sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.3.0.tgz",
+      "integrity": "sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==",
       "dependencies": {
-        "tslib": "^2.5.0"
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/util-defaults-mode-browser": {
-      "version": "2.1.6",
-      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.1.6.tgz",
-      "integrity": "sha512-lM2JMYCilrejfGf8WWnVfrKly3vf+mc5x9TrTpT++qIKP452uWfLqlaUxbz1TkSfhqm8RjrlY22589B9aI8A9w==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.2.0.tgz",
+      "integrity": "sha512-2okTdZaCBvOJszAPU/KSvlimMe35zLOKbQpHhamFJmR7t95HSe0K3C92jQPjKY3PmDBD+7iMkOnuW05F5OlF4g==",
       "dependencies": {
-        "@smithy/property-provider": "^2.1.4",
-        "@smithy/smithy-client": "^2.4.4",
-        "@smithy/types": "^2.11.0",
+        "@smithy/property-provider": "^2.2.0",
+        "@smithy/smithy-client": "^2.5.0",
+        "@smithy/types": "^2.12.0",
         "bowser": "^2.11.0",
-        "tslib": "^2.5.0"
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">= 10.0.0"
       }
     },
     "node_modules/@smithy/util-defaults-mode-node": {
-      "version": "2.2.6",
-      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.2.6.tgz",
-      "integrity": "sha512-UmUbPHbkBJCXRFbq+FPLpVwiFPHj1oPWXJS2f2sy23PtXM94c9X5EceI6JKuKdBty+tzhrAs5JbmPM/HvmDB8Q==",
-      "dependencies": {
-        "@smithy/config-resolver": "^2.1.5",
-        "@smithy/credential-provider-imds": "^2.2.6",
-        "@smithy/node-config-provider": "^2.2.5",
-        "@smithy/property-provider": "^2.1.4",
-        "@smithy/smithy-client": "^2.4.4",
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.0.tgz",
+      "integrity": "sha512-hfKXnNLmsW9cmLb/JXKIvtuO6Cf4SuqN5PN1C2Ru/TBIws+m1wSgb+A53vo0r66xzB6E82inKG2J7qtwdi+Kkw==",
+      "dependencies": {
+        "@smithy/config-resolver": "^2.2.0",
+        "@smithy/credential-provider-imds": "^2.3.0",
+        "@smithy/node-config-provider": "^2.3.0",
+        "@smithy/property-provider": "^2.2.0",
+        "@smithy/smithy-client": "^2.5.0",
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">= 10.0.0"
       }
     },
     "node_modules/@smithy/util-endpoints": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.1.5.tgz",
-      "integrity": "sha512-tgDpaUNsUtRvNiBulKU1VnpoXU1GINMfZZXunRhUXOTBEAufG1Wp79uDXLau2gg1RZ4dpAR6lXCkrmddihCGUg==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.2.0.tgz",
+      "integrity": "sha512-BuDHv8zRjsE5zXd3PxFXFknzBG3owCpjq8G3FcsXW3CykYXuEqM3nTSsmLzw5q+T12ZYuDlVUZKBdpNbhVtlrQ==",
       "dependencies": {
-        "@smithy/node-config-provider": "^2.2.5",
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/node-config-provider": "^2.3.0",
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">= 14.0.0"
       }
     },
     "node_modules/@smithy/util-hex-encoding": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.1.1.tgz",
-      "integrity": "sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.2.0.tgz",
+      "integrity": "sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==",
       "dependencies": {
-        "tslib": "^2.5.0"
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/util-middleware": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.1.4.tgz",
-      "integrity": "sha512-5yYNOgCN0DL0OplME0pthoUR/sCfipnROkbTO7m872o0GHCVNJj5xOFJ143rvHNA54+pIPMLum4z2DhPC2pVGA==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.2.0.tgz",
+      "integrity": "sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==",
       "dependencies": {
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/util-retry": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.1.4.tgz",
-      "integrity": "sha512-JRZwhA3fhkdenSEYIWatC8oLwt4Bdf2LhHbNQApqb7yFoIGMl4twcYI3BcJZ7YIBZrACA9jGveW6tuCd836XzQ==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.2.0.tgz",
+      "integrity": "sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==",
       "dependencies": {
-        "@smithy/service-error-classification": "^2.1.4",
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/service-error-classification": "^2.1.5",
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">= 14.0.0"
       }
     },
     "node_modules/@smithy/util-stream": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.1.4.tgz",
-      "integrity": "sha512-CiWaFPXstoR7v/PGHddFckovkhJb28wgQR7LwIt6RsQCJeRIHvUTVWhXw/Pco6Jm6nz/vfzN9FFdj/JN7RTkxQ==",
-      "dependencies": {
-        "@smithy/fetch-http-handler": "^2.4.4",
-        "@smithy/node-http-handler": "^2.4.2",
-        "@smithy/types": "^2.11.0",
-        "@smithy/util-base64": "^2.2.0",
-        "@smithy/util-buffer-from": "^2.1.1",
-        "@smithy/util-hex-encoding": "^2.1.1",
-        "@smithy/util-utf8": "^2.2.0",
-        "tslib": "^2.5.0"
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.2.0.tgz",
+      "integrity": "sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==",
+      "dependencies": {
+        "@smithy/fetch-http-handler": "^2.5.0",
+        "@smithy/node-http-handler": "^2.5.0",
+        "@smithy/types": "^2.12.0",
+        "@smithy/util-base64": "^2.3.0",
+        "@smithy/util-buffer-from": "^2.2.0",
+        "@smithy/util-hex-encoding": "^2.2.0",
+        "@smithy/util-utf8": "^2.3.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/util-uri-escape": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.1.1.tgz",
-      "integrity": "sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.2.0.tgz",
+      "integrity": "sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==",
       "dependencies": {
-        "tslib": "^2.5.0"
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/util-utf8": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.2.0.tgz",
-      "integrity": "sha512-hBsKr5BqrDrKS8qy+YcV7/htmMGxriA1PREOf/8AGBhHIZnfilVv1Waf1OyKhSbFW15U/8+gcMUQ9/Kk5qwpHQ==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+      "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
       "dependencies": {
-        "@smithy/util-buffer-from": "^2.1.1",
-        "tslib": "^2.5.0"
+        "@smithy/util-buffer-from": "^2.2.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
     "node_modules/@smithy/util-waiter": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.1.4.tgz",
-      "integrity": "sha512-AK17WaC0hx1wR9juAOsQkJ6DjDxBGEf5TrKhpXtNFEn+cVto9Li3MVsdpAO97AF7bhFXSyC8tJA3F4ThhqwCdg==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.2.0.tgz",
+      "integrity": "sha512-IHk53BVw6MPMi2Gsn+hCng8rFA3ZmR3Rk7GllxDUW9qFJl/hiSvskn7XldkECapQVkIg/1dHpMAxI9xSTaLLSA==",
       "dependencies": {
-        "@smithy/abort-controller": "^2.1.4",
-        "@smithy/types": "^2.11.0",
-        "tslib": "^2.5.0"
+        "@smithy/abort-controller": "^2.2.0",
+        "@smithy/types": "^2.12.0",
+        "tslib": "^2.6.2"
       },
       "engines": {
         "node": ">=14.0.0"
       }
     },
-    "node_modules/@tsconfig/node18": {
-      "version": "18.2.2",
-      "resolved": "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.2.tgz",
-      "integrity": "sha512-d6McJeGsuoRlwWZmVIeE8CUA27lu6jLjvv1JzqmpsytOYYbVi1tHZEnwCNVOXnj4pyLvneZlFlpXUK+X9wBWyw==",
+    "node_modules/@tsconfig/node20": {
+      "version": "20.1.4",
+      "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.4.tgz",
+      "integrity": "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==",
       "dev": true
     },
     "node_modules/@types/bootstrap": {
@@ -2448,25 +2436,10 @@
       "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
       "dev": true
     },
-    "node_modules/@types/lodash": {
-      "version": "4.14.202",
-      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz",
-      "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==",
-      "dev": true
-    },
-    "node_modules/@types/lodash.clonedeep": {
-      "version": "4.5.9",
-      "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.9.tgz",
-      "integrity": "sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==",
-      "dev": true,
-      "dependencies": {
-        "@types/lodash": "*"
-      }
-    },
     "node_modules/@types/node": {
-      "version": "18.19.22",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.22.tgz",
-      "integrity": "sha512-p3pDIfuMg/aXBmhkyanPshdfJuX5c5+bQjYLIikPLXAUycEogij/c50n/C+8XOA5L93cU4ZRXtn+dNQGi0IZqQ==",
+      "version": "20.11.30",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz",
+      "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==",
       "dev": true,
       "dependencies": {
         "undici-types": "~5.26.4"
@@ -2497,16 +2470,16 @@
       "dev": true
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz",
-      "integrity": "sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==",
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz",
+      "integrity": "sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==",
       "dev": true,
       "dependencies": {
         "@eslint-community/regexpp": "^4.5.1",
-        "@typescript-eslint/scope-manager": "7.1.1",
-        "@typescript-eslint/type-utils": "7.1.1",
-        "@typescript-eslint/utils": "7.1.1",
-        "@typescript-eslint/visitor-keys": "7.1.1",
+        "@typescript-eslint/scope-manager": "7.4.0",
+        "@typescript-eslint/type-utils": "7.4.0",
+        "@typescript-eslint/utils": "7.4.0",
+        "@typescript-eslint/visitor-keys": "7.4.0",
         "debug": "^4.3.4",
         "graphemer": "^1.4.0",
         "ignore": "^5.2.4",
@@ -2515,7 +2488,7 @@
         "ts-api-utils": "^1.0.1"
       },
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -2532,19 +2505,19 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.1.tgz",
-      "integrity": "sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==",
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.4.0.tgz",
+      "integrity": "sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "7.1.1",
-        "@typescript-eslint/types": "7.1.1",
-        "@typescript-eslint/typescript-estree": "7.1.1",
-        "@typescript-eslint/visitor-keys": "7.1.1",
+        "@typescript-eslint/scope-manager": "7.4.0",
+        "@typescript-eslint/types": "7.4.0",
+        "@typescript-eslint/typescript-estree": "7.4.0",
+        "@typescript-eslint/visitor-keys": "7.4.0",
         "debug": "^4.3.4"
       },
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -2560,16 +2533,16 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz",
-      "integrity": "sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==",
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.4.0.tgz",
+      "integrity": "sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "7.1.1",
-        "@typescript-eslint/visitor-keys": "7.1.1"
+        "@typescript-eslint/types": "7.4.0",
+        "@typescript-eslint/visitor-keys": "7.4.0"
       },
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -2577,18 +2550,18 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz",
-      "integrity": "sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==",
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.4.0.tgz",
+      "integrity": "sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "7.1.1",
-        "@typescript-eslint/utils": "7.1.1",
+        "@typescript-eslint/typescript-estree": "7.4.0",
+        "@typescript-eslint/utils": "7.4.0",
         "debug": "^4.3.4",
         "ts-api-utils": "^1.0.1"
       },
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -2604,12 +2577,12 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz",
-      "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==",
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.4.0.tgz",
+      "integrity": "sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==",
       "dev": true,
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -2617,13 +2590,13 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz",
-      "integrity": "sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==",
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.4.0.tgz",
+      "integrity": "sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "7.1.1",
-        "@typescript-eslint/visitor-keys": "7.1.1",
+        "@typescript-eslint/types": "7.4.0",
+        "@typescript-eslint/visitor-keys": "7.4.0",
         "debug": "^4.3.4",
         "globby": "^11.1.0",
         "is-glob": "^4.0.3",
@@ -2632,7 +2605,7 @@
         "ts-api-utils": "^1.0.1"
       },
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -2645,21 +2618,21 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.1.tgz",
-      "integrity": "sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==",
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.4.0.tgz",
+      "integrity": "sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
         "@types/json-schema": "^7.0.12",
         "@types/semver": "^7.5.0",
-        "@typescript-eslint/scope-manager": "7.1.1",
-        "@typescript-eslint/types": "7.1.1",
-        "@typescript-eslint/typescript-estree": "7.1.1",
+        "@typescript-eslint/scope-manager": "7.4.0",
+        "@typescript-eslint/types": "7.4.0",
+        "@typescript-eslint/typescript-estree": "7.4.0",
         "semver": "^7.5.4"
       },
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -2670,16 +2643,16 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz",
-      "integrity": "sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==",
+      "version": "7.4.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.4.0.tgz",
+      "integrity": "sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "7.1.1",
+        "@typescript-eslint/types": "7.4.0",
         "eslint-visitor-keys": "^3.4.1"
       },
       "engines": {
-        "node": "^16.0.0 || >=18.0.0"
+        "node": "^18.18.0 || >=20.0.0"
       },
       "funding": {
         "type": "opencollective",
@@ -2706,30 +2679,30 @@
       }
     },
     "node_modules/@volar/language-core": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.1.2.tgz",
-      "integrity": "sha512-5qsDp0Gf6fE09UWCeK7bkVn6NxMwC9OqFWQkMMkeej8h8XjyABPdRygC2RCrqDrfVdGijqlMQeXs6yRS+vfZYA==",
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.1.6.tgz",
+      "integrity": "sha512-pAlMCGX/HatBSiDFMdMyqUshkbwWbLxpN/RL7HCQDOo2gYBE+uS+nanosLc1qR6pTQ/U8q00xt8bdrrAFPSC0A==",
       "dev": true,
       "dependencies": {
-        "@volar/source-map": "2.1.2"
+        "@volar/source-map": "2.1.6"
       }
     },
     "node_modules/@volar/source-map": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.1.2.tgz",
-      "integrity": "sha512-yFJqsuLm1OaWrsz9E3yd3bJcYIlHqdZ8MbmIoZLrAzMYQDcoF26/INIhgziEXSdyHc8xd7rd/tJdSnUyh0gH4Q==",
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.1.6.tgz",
+      "integrity": "sha512-TeyH8pHHonRCHYI91J7fWUoxi0zWV8whZTVRlsWHSYfjm58Blalkf9LrZ+pj6OiverPTmrHRkBsG17ScQyWECw==",
       "dev": true,
       "dependencies": {
         "muggle-string": "^0.4.0"
       }
     },
     "node_modules/@volar/typescript": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.1.2.tgz",
-      "integrity": "sha512-lhTancZqamvaLvoz0u/uth8dpudENNt2LFZOWCw9JZiX14xRFhdhfzmphiCRb7am9E6qAJSbdS/gMt1utXAoHQ==",
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.1.6.tgz",
+      "integrity": "sha512-JgPGhORHqXuyC3r6skPmPHIZj4LoMmGlYErFTuPNBq9Nhc9VTv7ctHY7A3jMN3ngKEfRrfnUcwXHztvdSQqNfw==",
       "dev": true,
       "dependencies": {
-        "@volar/language-core": "2.1.2",
+        "@volar/language-core": "2.1.6",
         "path-browserify": "^1.0.1"
       }
     },
@@ -2844,12 +2817,12 @@
       }
     },
     "node_modules/@vue/language-core": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.6.tgz",
-      "integrity": "sha512-UzqU12tzf9XLqRO3TiWPwRNpP4fyUzE6MAfOQWQNZ4jy6a30ARRUpmODDKq6O8C4goMc2AlPqTmjOHPjHkilSg==",
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.7.tgz",
+      "integrity": "sha512-Vh1yZX3XmYjn9yYLkjU8DN6L0ceBtEcapqiyclHne8guG84IaTzqtvizZB1Yfxm3h6m7EIvjerLO5fvOZO6IIQ==",
       "dev": true,
       "dependencies": {
-        "@volar/language-core": "~2.1.2",
+        "@volar/language-core": "~2.1.3",
         "@vue/compiler-dom": "^3.4.0",
         "@vue/shared": "^3.4.0",
         "computeds": "^0.0.1",
@@ -3064,12 +3037,12 @@
       }
     },
     "node_modules/axios": {
-      "version": "1.6.7",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz",
-      "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==",
+      "version": "1.6.8",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
+      "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
       "dev": true,
       "dependencies": {
-        "follow-redirects": "^1.15.4",
+        "follow-redirects": "^1.15.6",
         "form-data": "^4.0.0",
         "proxy-from-env": "^1.1.0"
       }
@@ -3100,12 +3073,15 @@
       ]
     },
     "node_modules/binary-extensions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
-      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
       "dev": true,
       "engines": {
         "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/boolbase": {
@@ -3312,12 +3288,12 @@
       }
     },
     "node_modules/commander": {
-      "version": "11.1.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
-      "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+      "version": "12.0.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz",
+      "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==",
       "dev": true,
       "engines": {
-        "node": ">=16"
+        "node": ">=18"
       }
     },
     "node_modules/computeds": {
@@ -3363,20 +3339,71 @@
       "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
       "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
     },
-    "node_modules/dayjs": {
-      "version": "1.11.10",
-      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
-      "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
-    },
-    "node_modules/de-indent": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
-      "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
-      "dev": true
-    },
-    "node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+    "node_modules/data-view-buffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+      "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/data-view-byte-length": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+      "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.7",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/data-view-byte-offset": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+      "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.6",
+        "es-errors": "^1.3.0",
+        "is-data-view": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/dayjs": {
+      "version": "1.11.10",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
+      "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
+    },
+    "node_modules/de-indent": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+      "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
+      "dev": true
+    },
+    "node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
       "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dev": true,
       "dependencies": {
@@ -3465,9 +3492,9 @@
       }
     },
     "node_modules/dompurify": {
-      "version": "3.0.9",
-      "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.9.tgz",
-      "integrity": "sha512-uyb4NDIvQ3hRn6NiC+SIFaP4mJ/MdXlvtunaqK9Bn6dD3RuB/1S/gasEjDHD8eiaqdSael2vBv+hOs7Y+jhYOQ=="
+      "version": "3.0.11",
+      "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.11.tgz",
+      "integrity": "sha512-Fan4uMuyB26gFV3ovPoEoQbxRRPfTu3CvImyZnhGq5fsIEO+gEFLp45ISFt+kQBWsK5ulDdT0oV28jS1UrwQLg=="
     },
     "node_modules/entities": {
       "version": "4.5.0",
@@ -3490,17 +3517,21 @@
       }
     },
     "node_modules/es-abstract": {
-      "version": "1.22.5",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz",
-      "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==",
+      "version": "1.23.2",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz",
+      "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==",
       "dev": true,
       "dependencies": {
         "array-buffer-byte-length": "^1.0.1",
         "arraybuffer.prototype.slice": "^1.0.3",
         "available-typed-arrays": "^1.0.7",
         "call-bind": "^1.0.7",
+        "data-view-buffer": "^1.0.1",
+        "data-view-byte-length": "^1.0.1",
+        "data-view-byte-offset": "^1.0.0",
         "es-define-property": "^1.0.0",
         "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.0.0",
         "es-set-tostringtag": "^2.0.3",
         "es-to-primitive": "^1.2.1",
         "function.prototype.name": "^1.1.6",
@@ -3511,10 +3542,11 @@
         "has-property-descriptors": "^1.0.2",
         "has-proto": "^1.0.3",
         "has-symbols": "^1.0.3",
-        "hasown": "^2.0.1",
+        "hasown": "^2.0.2",
         "internal-slot": "^1.0.7",
         "is-array-buffer": "^3.0.4",
         "is-callable": "^1.2.7",
+        "is-data-view": "^1.0.1",
         "is-negative-zero": "^2.0.3",
         "is-regex": "^1.1.4",
         "is-shared-array-buffer": "^1.0.3",
@@ -3525,17 +3557,17 @@
         "object-keys": "^1.1.1",
         "object.assign": "^4.1.5",
         "regexp.prototype.flags": "^1.5.2",
-        "safe-array-concat": "^1.1.0",
+        "safe-array-concat": "^1.1.2",
         "safe-regex-test": "^1.0.3",
-        "string.prototype.trim": "^1.2.8",
-        "string.prototype.trimend": "^1.0.7",
+        "string.prototype.trim": "^1.2.9",
+        "string.prototype.trimend": "^1.0.8",
         "string.prototype.trimstart": "^1.0.7",
         "typed-array-buffer": "^1.0.2",
         "typed-array-byte-length": "^1.0.1",
         "typed-array-byte-offset": "^1.0.2",
         "typed-array-length": "^1.0.5",
         "unbox-primitive": "^1.0.2",
-        "which-typed-array": "^1.1.14"
+        "which-typed-array": "^1.1.15"
       },
       "engines": {
         "node": ">= 0.4"
@@ -3565,6 +3597,18 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/es-object-atoms": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+      "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+      "dev": true,
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/es-set-tostringtag": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
@@ -3597,12 +3641,11 @@
       }
     },
     "node_modules/esbuild": {
-      "version": "0.20.1",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz",
-      "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==",
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
+      "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
       "dev": true,
       "hasInstallScript": true,
-      "peer": true,
       "bin": {
         "esbuild": "bin/esbuild"
       },
@@ -3610,29 +3653,29 @@
         "node": ">=12"
       },
       "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.20.1",
-        "@esbuild/android-arm": "0.20.1",
-        "@esbuild/android-arm64": "0.20.1",
-        "@esbuild/android-x64": "0.20.1",
-        "@esbuild/darwin-arm64": "0.20.1",
-        "@esbuild/darwin-x64": "0.20.1",
-        "@esbuild/freebsd-arm64": "0.20.1",
-        "@esbuild/freebsd-x64": "0.20.1",
-        "@esbuild/linux-arm": "0.20.1",
-        "@esbuild/linux-arm64": "0.20.1",
-        "@esbuild/linux-ia32": "0.20.1",
-        "@esbuild/linux-loong64": "0.20.1",
-        "@esbuild/linux-mips64el": "0.20.1",
-        "@esbuild/linux-ppc64": "0.20.1",
-        "@esbuild/linux-riscv64": "0.20.1",
-        "@esbuild/linux-s390x": "0.20.1",
-        "@esbuild/linux-x64": "0.20.1",
-        "@esbuild/netbsd-x64": "0.20.1",
-        "@esbuild/openbsd-x64": "0.20.1",
-        "@esbuild/sunos-x64": "0.20.1",
-        "@esbuild/win32-arm64": "0.20.1",
-        "@esbuild/win32-ia32": "0.20.1",
-        "@esbuild/win32-x64": "0.20.1"
+        "@esbuild/aix-ppc64": "0.20.2",
+        "@esbuild/android-arm": "0.20.2",
+        "@esbuild/android-arm64": "0.20.2",
+        "@esbuild/android-x64": "0.20.2",
+        "@esbuild/darwin-arm64": "0.20.2",
+        "@esbuild/darwin-x64": "0.20.2",
+        "@esbuild/freebsd-arm64": "0.20.2",
+        "@esbuild/freebsd-x64": "0.20.2",
+        "@esbuild/linux-arm": "0.20.2",
+        "@esbuild/linux-arm64": "0.20.2",
+        "@esbuild/linux-ia32": "0.20.2",
+        "@esbuild/linux-loong64": "0.20.2",
+        "@esbuild/linux-mips64el": "0.20.2",
+        "@esbuild/linux-ppc64": "0.20.2",
+        "@esbuild/linux-riscv64": "0.20.2",
+        "@esbuild/linux-s390x": "0.20.2",
+        "@esbuild/linux-x64": "0.20.2",
+        "@esbuild/netbsd-x64": "0.20.2",
+        "@esbuild/openbsd-x64": "0.20.2",
+        "@esbuild/sunos-x64": "0.20.2",
+        "@esbuild/win32-arm64": "0.20.2",
+        "@esbuild/win32-ia32": "0.20.2",
+        "@esbuild/win32-x64": "0.20.2"
       }
     },
     "node_modules/escape-string-regexp": {
@@ -3745,12 +3788,13 @@
       }
     },
     "node_modules/eslint-plugin-vue": {
-      "version": "9.22.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.22.0.tgz",
-      "integrity": "sha512-7wCXv5zuVnBtZE/74z4yZ0CM8AjH6bk4MQGm7hZjUC2DBppKU5ioeOk5LGSg/s9a1ZJnIsdPLJpXnu1Rc+cVHg==",
+      "version": "9.24.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.24.0.tgz",
+      "integrity": "sha512-9SkJMvF8NGMT9aQCwFc5rj8Wo1XWSMSHk36i7ZwdI614BU7sIOR28ZjuFPKp8YGymZN12BSEbiSwa7qikp+PBw==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
+        "globals": "^13.24.0",
         "natural-compare": "^1.4.0",
         "nth-check": "^2.1.1",
         "postcss-selector-parser": "^6.0.15",
@@ -4004,9 +4048,9 @@
       }
     },
     "node_modules/filesize": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.0.tgz",
-      "integrity": "sha512-GTLKYyBSDz3nPhlLVPjPWZCnhkd9TrrRArNcy8Z+J2cqScB7h2McAzR6NBX6nYOoWafql0roY8hrocxnZBv9CQ==",
+      "version": "10.1.1",
+      "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.1.tgz",
+      "integrity": "sha512-L0cdwZrKlwZQkMSFnCflJ6J2Y+5egO/p3vgRSDQGxQt++QbUZe5gMbRO6kg6gzwQDPvq2Fk9AmoxUNfZ5gdqaQ==",
       "engines": {
         "node": ">= 10.4.0"
       }
@@ -4060,9 +4104,9 @@
       "dev": true
     },
     "node_modules/follow-redirects": {
-      "version": "1.15.5",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz",
-      "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==",
+      "version": "1.15.6",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+      "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
       "dev": true,
       "funding": [
         {
@@ -4649,6 +4693,21 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/is-data-view": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
+      "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+      "dev": true,
+      "dependencies": {
+        "is-typed-array": "^1.1.13"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/is-date-object": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
@@ -4935,12 +4994,6 @@
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
       "dev": true
     },
-    "node_modules/lodash.clonedeep": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
-      "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
-      "dev": true
-    },
     "node_modules/lodash.merge": {
       "version": "4.6.2",
       "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -5363,14 +5416,14 @@
       }
     },
     "node_modules/openapi-typescript-codegen": {
-      "version": "0.27.0",
-      "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.27.0.tgz",
-      "integrity": "sha512-QyQEod/vuel3zfnTRC3GgmYsqLPSBzB2OL4ojMYjO9hJmfYW02T+7tbQWEnuqWdhh2KSOBf3L8h59vLStr6vwA==",
+      "version": "0.28.0",
+      "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.28.0.tgz",
+      "integrity": "sha512-BZTsMUwhA/h2zCzisjagLUPQNHE64N1EN074yGB+WqA0LFlJwy8sKQYrXH5G4phbjj9KSPx7xuWKO4hkPIOARw==",
       "dev": true,
       "dependencies": {
-        "@apidevtools/json-schema-ref-parser": "^10.1.0",
+        "@apidevtools/json-schema-ref-parser": "^11.5.4",
         "camelcase": "^6.3.0",
-        "commander": "^11.1.0",
+        "commander": "^12.0.0",
         "fs-extra": "^11.2.0",
         "handlebars": "^4.7.8"
       },
@@ -5596,9 +5649,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.4.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz",
-      "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==",
+      "version": "8.4.38",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
+      "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
       "funding": [
         {
           "type": "opencollective",
@@ -5616,16 +5669,16 @@
       "dependencies": {
         "nanoid": "^3.3.7",
         "picocolors": "^1.0.0",
-        "source-map-js": "^1.0.2"
+        "source-map-js": "^1.2.0"
       },
       "engines": {
         "node": "^10 || ^12 || >=14"
       }
     },
     "node_modules/postcss-selector-parser": {
-      "version": "6.0.15",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
-      "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==",
+      "version": "6.0.16",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
+      "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
       "dev": true,
       "dependencies": {
         "cssesc": "^3.0.0",
@@ -5834,9 +5887,9 @@
       }
     },
     "node_modules/rollup": {
-      "version": "4.12.1",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.1.tgz",
-      "integrity": "sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==",
+      "version": "4.13.1",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.1.tgz",
+      "integrity": "sha512-hFi+fU132IvJ2ZuihN56dwgpltpmLZHZWsx27rMCTZ2sYwrqlgL5sECGy1eeV2lAihD8EzChBVVhsXci0wD4Tg==",
       "dev": true,
       "dependencies": {
         "@types/estree": "1.0.5"
@@ -5849,19 +5902,20 @@
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.12.1",
-        "@rollup/rollup-android-arm64": "4.12.1",
-        "@rollup/rollup-darwin-arm64": "4.12.1",
-        "@rollup/rollup-darwin-x64": "4.12.1",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.12.1",
-        "@rollup/rollup-linux-arm64-gnu": "4.12.1",
-        "@rollup/rollup-linux-arm64-musl": "4.12.1",
-        "@rollup/rollup-linux-riscv64-gnu": "4.12.1",
-        "@rollup/rollup-linux-x64-gnu": "4.12.1",
-        "@rollup/rollup-linux-x64-musl": "4.12.1",
-        "@rollup/rollup-win32-arm64-msvc": "4.12.1",
-        "@rollup/rollup-win32-ia32-msvc": "4.12.1",
-        "@rollup/rollup-win32-x64-msvc": "4.12.1",
+        "@rollup/rollup-android-arm-eabi": "4.13.1",
+        "@rollup/rollup-android-arm64": "4.13.1",
+        "@rollup/rollup-darwin-arm64": "4.13.1",
+        "@rollup/rollup-darwin-x64": "4.13.1",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.13.1",
+        "@rollup/rollup-linux-arm64-gnu": "4.13.1",
+        "@rollup/rollup-linux-arm64-musl": "4.13.1",
+        "@rollup/rollup-linux-riscv64-gnu": "4.13.1",
+        "@rollup/rollup-linux-s390x-gnu": "4.13.1",
+        "@rollup/rollup-linux-x64-gnu": "4.13.1",
+        "@rollup/rollup-linux-x64-musl": "4.13.1",
+        "@rollup/rollup-win32-arm64-msvc": "4.13.1",
+        "@rollup/rollup-win32-ia32-msvc": "4.13.1",
+        "@rollup/rollup-win32-x64-msvc": "4.13.1",
         "fsevents": "~2.3.2"
       }
     },
@@ -5973,9 +6027,9 @@
       }
     },
     "node_modules/sass": {
-      "version": "1.71.1",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.71.1.tgz",
-      "integrity": "sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==",
+      "version": "1.72.0",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz",
+      "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==",
       "dev": true,
       "dependencies": {
         "chokidar": ">=3.0.0 <4.0.0",
@@ -6130,9 +6184,9 @@
       }
     },
     "node_modules/source-map-js": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
-      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -6194,14 +6248,15 @@
       }
     },
     "node_modules/string.prototype.padend": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz",
-      "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==",
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz",
+      "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.2",
+        "es-object-atoms": "^1.0.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6211,14 +6266,15 @@
       }
     },
     "node_modules/string.prototype.trim": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
-      "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+      "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-abstract": "^1.23.0",
+        "es-object-atoms": "^1.0.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6228,28 +6284,31 @@
       }
     },
     "node_modules/string.prototype.trimend": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
-      "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+      "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
     },
     "node_modules/string.prototype.trimstart": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
-      "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+      "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1"
+        "call-bind": "^1.0.7",
+        "define-properties": "^1.2.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -6446,9 +6505,9 @@
       }
     },
     "node_modules/typed-array-length": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz",
-      "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
+      "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
       "dev": true,
       "dependencies": {
         "call-bind": "^1.0.7",
@@ -6553,14 +6612,14 @@
       }
     },
     "node_modules/vite": {
-      "version": "5.1.5",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz",
-      "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==",
+      "version": "5.2.6",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz",
+      "integrity": "sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==",
       "dev": true,
       "dependencies": {
-        "esbuild": "^0.19.3",
-        "postcss": "^8.4.35",
-        "rollup": "^4.2.0"
+        "esbuild": "^0.20.1",
+        "postcss": "^8.4.36",
+        "rollup": "^4.13.0"
       },
       "bin": {
         "vite": "bin/vite.js"
@@ -6607,412 +6666,6 @@
         }
       }
     },
-    "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
-      "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "aix"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/android-arm": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz",
-      "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/android-arm64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz",
-      "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/android-x64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz",
-      "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz",
-      "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/darwin-x64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz",
-      "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz",
-      "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz",
-      "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-arm": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz",
-      "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-arm64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz",
-      "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-ia32": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz",
-      "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-loong64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz",
-      "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==",
-      "cpu": [
-        "loong64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz",
-      "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==",
-      "cpu": [
-        "mips64el"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz",
-      "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz",
-      "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==",
-      "cpu": [
-        "riscv64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-s390x": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz",
-      "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==",
-      "cpu": [
-        "s390x"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-x64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz",
-      "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz",
-      "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz",
-      "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/sunos-x64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz",
-      "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/win32-arm64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz",
-      "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/win32-ia32": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz",
-      "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/win32-x64": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz",
-      "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/esbuild": {
-      "version": "0.19.12",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz",
-      "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==",
-      "dev": true,
-      "hasInstallScript": true,
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.19.12",
-        "@esbuild/android-arm": "0.19.12",
-        "@esbuild/android-arm64": "0.19.12",
-        "@esbuild/android-x64": "0.19.12",
-        "@esbuild/darwin-arm64": "0.19.12",
-        "@esbuild/darwin-x64": "0.19.12",
-        "@esbuild/freebsd-arm64": "0.19.12",
-        "@esbuild/freebsd-x64": "0.19.12",
-        "@esbuild/linux-arm": "0.19.12",
-        "@esbuild/linux-arm64": "0.19.12",
-        "@esbuild/linux-ia32": "0.19.12",
-        "@esbuild/linux-loong64": "0.19.12",
-        "@esbuild/linux-mips64el": "0.19.12",
-        "@esbuild/linux-ppc64": "0.19.12",
-        "@esbuild/linux-riscv64": "0.19.12",
-        "@esbuild/linux-s390x": "0.19.12",
-        "@esbuild/linux-x64": "0.19.12",
-        "@esbuild/netbsd-x64": "0.19.12",
-        "@esbuild/openbsd-x64": "0.19.12",
-        "@esbuild/sunos-x64": "0.19.12",
-        "@esbuild/win32-arm64": "0.19.12",
-        "@esbuild/win32-ia32": "0.19.12",
-        "@esbuild/win32-x64": "0.19.12"
-      }
-    },
     "node_modules/vue": {
       "version": "3.4.21",
       "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz",
@@ -7091,13 +6744,13 @@
       }
     },
     "node_modules/vue-tsc": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.6.tgz",
-      "integrity": "sha512-kK50W4XqQL34vHRkxlRWLicrT6+F9xfgCgJ4KSmCHcytKzc1u3c94XXgI+CjmhOSxyw0krpExF7Obo7y4+0dVQ==",
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.7.tgz",
+      "integrity": "sha512-LYa0nInkfcDBB7y8jQ9FQ4riJTRNTdh98zK/hzt4gEpBZQmf30dPhP+odzCa+cedGz6B/guvJEd0BavZaRptjg==",
       "dev": true,
       "dependencies": {
-        "@volar/typescript": "~2.1.2",
-        "@vue/language-core": "2.0.6",
+        "@volar/typescript": "~2.1.3",
+        "@vue/language-core": "2.0.7",
         "semver": "^7.5.4"
       },
       "bin": {
diff --git a/package.json b/package.json
index 038e834abb5a8c38da4d2bfdd305d756ec597e67..f4c3555c373b9f772c878de1624d34651ae5cd93 100644
--- a/package.json
+++ b/package.json
@@ -16,9 +16,9 @@
     "generate-resource-client": "openapi --input http://localhost:9999/api/resource-service/openapi.json --output src/client/resource --client axios"
   },
   "dependencies": {
-    "@aws-sdk/client-s3": "^3.440.0",
-    "@aws-sdk/lib-storage": "^3.440.0",
-    "@aws-sdk/s3-request-presigner": "^3.440.0",
+    "@aws-sdk/client-s3": "<3.530.0",
+    "@aws-sdk/lib-storage": "<3.530.0",
+    "@aws-sdk/s3-request-presigner": "<3.530.0",
     "@fortawesome/fontawesome-free": "~6.5.0",
     "@popperjs/core": "~2.11.8",
     "ajv": "~8.12.0",
@@ -41,11 +41,11 @@
   "devDependencies": {
     "@esbuild-plugins/node-globals-polyfill": "~0.2.3",
     "@esbuild-plugins/node-modules-polyfill": "~0.2.2",
-    "@rushstack/eslint-patch": "~1.7.0",
-    "@tsconfig/node18": "^18.2.1",
+    "@rushstack/eslint-patch": "~1.9.0",
+    "@tsconfig/node20": "^20.1.2",
     "@types/bootstrap": "~5.2.0",
     "@types/dompurify": "~3.0.0",
-    "@types/node": "^18.19.5",
+    "@types/node": "^20.11.0",
     "@types/semver": "~7.5.1",
     "@types/showdown": "~2.0.1",
     "@types/sortablejs": "^1.15.7",
@@ -55,15 +55,15 @@
     "@vue/tsconfig": "~0.5.0",
     "axios": "~1.6.0",
     "eslint": "~8.57.0",
-    "eslint-plugin-vue": "~9.22.0",
+    "eslint-plugin-vue": "~9.24.0",
     "highlight.js": "^11.9.0",
     "npm-run-all": "~4.1.5",
-    "openapi-typescript-codegen": "^0.27.0",
+    "openapi-typescript-codegen": "^0.28.0",
     "prettier": "~3.2.0",
     "rollup-plugin-node-polyfills": "~0.2.1",
     "sass": "^1.66.0",
     "typescript": "~5.3.0",
-    "vite": "~5.1.0",
+    "vite": "~5.2.0",
     "vue-tsc": "~2.0.0"
   }
 }
diff --git a/src/App.vue b/src/App.vue
index 0ba8e443fd1a7bb3568e18080273aaa75d8f8441..88d98f85e2cafe4eba35222987a776f66fbc6d40 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { onBeforeMount } from "vue";
+import { onBeforeMount, onMounted } from "vue";
 import { useCookies } from "vue3-cookies";
 import { useAuthStore } from "@/stores/users";
 import { useRoute, useRouter } from "vue-router";
@@ -12,12 +12,20 @@ import axios from "axios";
 import { useNameStore } from "@/stores/names";
 import AppHeader from "@/components/AppHeader.vue";
 import AppFooter from "@/components/AppFooter.vue";
+import { useResourceStore } from "@/stores/resources";
+import { useWorkflowStore } from "@/stores/workflows";
+import { useBucketStore } from "@/stores/buckets";
+import { useS3KeyStore } from "@/stores/s3keys";
 
 const { cookies } = useCookies();
-const store = useAuthStore();
 const router = useRouter();
 const route = useRoute();
+const userRepository = useAuthStore();
 const nameRepository = useNameStore();
+const resourceRepository = useResourceStore();
+const workflowRepository = useWorkflowStore();
+const bucketRepository = useBucketStore();
+const s3KeyRepository = useS3KeyStore();
 
 onBeforeMount(() => {
   S3ProxyOpenAPI.BASE = environment.S3PROXY_API_BASE_URL;
@@ -31,7 +39,7 @@ onBeforeMount(() => {
         (err.response.status === 400 || err.response.status === 403) &&
         err.response.data.detail?.includes("JWT")
       ) {
-        store.logout();
+        userRepository.logout();
         cookies.remove("bearer");
         router.push({
           name: "login",
@@ -46,15 +54,15 @@ onBeforeMount(() => {
       return Promise.reject(err);
     },
   );
-  store.setToken(cookies.get("bearer"));
+  userRepository.setToken(cookies.get("bearer"));
   router.afterEach((to, from) => {
     window._paq.push(["setReferrerUrl", from.path]);
     window._paq.push(["deleteCustomVariables", "page"]);
     window._paq.push(["deleteCustomDimension", 1]);
     window._paq.push(["setCustomUrl", to.path]);
     window._paq.push(["setDocumentTitle", to.name]);
-    if (store.currentUID.length > 0) {
-      window._paq.push(["setUserId", store.currentUID]);
+    if (userRepository.currentUID.length > 0) {
+      window._paq.push(["setUserId", userRepository.currentUID]);
     }
     window._paq.push(["trackPageView"]);
     window._paq.push(["enableLinkTracking"]);
@@ -62,7 +70,7 @@ onBeforeMount(() => {
   router.beforeEach(async (to) => {
     // make sure the user is authenticated
     if (
-      !store.authenticated &&
+      !userRepository.authenticated &&
       // ❗️ Avoid an infinite redirect
       to.name !== "login"
     ) {
@@ -73,20 +81,20 @@ onBeforeMount(() => {
       };
     } else if (
       to.meta.requiresDeveloperRole &&
-      !(store.workflowDev || store.admin)
+      !(userRepository.workflowDev || userRepository.admin)
     ) {
       return { name: "dashboard" };
     } else if (
       to.meta.requiresReviewerRole &&
-      !(store.rewiewer || store.admin)
+      !(userRepository.rewiewer || userRepository.admin)
     ) {
       return { name: "dashboard" };
     } else if (
       to.meta.requiresMaintainerRole &&
-      !(store.resourceMaintainer || store.admin)
+      !(userRepository.resourceMaintainer || userRepository.admin)
     ) {
       return { name: "dashboard" };
-    } else if (to.meta.adminRole && !store.admin) {
+    } else if (to.meta.adminRole && !userRepository.admin) {
       return { name: "dashboard" };
     } else if (to.name !== "login" && to.query.return_path) {
       // return to original path after login
@@ -95,6 +103,24 @@ onBeforeMount(() => {
   });
   nameRepository.loadNameMapping();
 });
+
+onMounted(() => {
+  if (userRepository.authenticated) {
+    resourceRepository.fetchPublicResources();
+    workflowRepository.fetchWorkflows();
+    bucketRepository.fetchBuckets();
+    s3KeyRepository.fetchS3Keys();
+    if (!userRepository.foreignUser) {
+      bucketRepository.fetchOwnPermissions();
+    }
+    if (userRepository.workflowDev || userRepository.admin) {
+      workflowRepository.fetchOwnWorkflows();
+    }
+    if (userRepository.resourceMaintainer || userRepository.admin) {
+      resourceRepository.fetchOwnResources();
+    }
+  }
+});
 </script>
 
 <template>
diff --git a/src/client/auth/core/ApiError.ts b/src/client/auth/core/ApiError.ts
index d6b8fcc3ad0b6b2bdf1aa4df97ec598e64995648..ec7b16af6f41b1323a8e3aa3d529bf2324959e66 100644
--- a/src/client/auth/core/ApiError.ts
+++ b/src/client/auth/core/ApiError.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/auth/core/ApiRequestOptions.ts b/src/client/auth/core/ApiRequestOptions.ts
index c19adcc94dc5f015865368d6d64751de5c243aa3..93143c3ce1ba5323894d4ac10299f62493f030f6 100644
--- a/src/client/auth/core/ApiRequestOptions.ts
+++ b/src/client/auth/core/ApiRequestOptions.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/auth/core/ApiResult.ts b/src/client/auth/core/ApiResult.ts
index ad8fef2bc334c2aedf5c043896fd394229453ff0..ee1126e2ccd1e37dba97511c38c56a282ceac4dc 100644
--- a/src/client/auth/core/ApiResult.ts
+++ b/src/client/auth/core/ApiResult.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/auth/core/CancelablePromise.ts b/src/client/auth/core/CancelablePromise.ts
index eb02246c31f61b897667a6433d55b8b413bafbc1..d70de92946d977e9da7970871375117a8b04770a 100644
--- a/src/client/auth/core/CancelablePromise.ts
+++ b/src/client/auth/core/CancelablePromise.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
@@ -85,9 +85,9 @@ export class CancelablePromise<T> implements Promise<T> {
         });
     }
 
-     get [Symbol.toStringTag]() {
-            return "Cancellable Promise";
-     }
+    get [Symbol.toStringTag]() {
+        return "Cancellable Promise";
+    }
 
     public then<TResult1 = T, TResult2 = never>(
         onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,
diff --git a/src/client/auth/core/OpenAPI.ts b/src/client/auth/core/OpenAPI.ts
index 9484fb91af3169d50a2a4fee46d01bed59b08907..0f6eb187b0cec075a8d22e60fc2bb652cb7d3ee7 100644
--- a/src/client/auth/core/OpenAPI.ts
+++ b/src/client/auth/core/OpenAPI.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/auth/core/request.ts b/src/client/auth/core/request.ts
index c6a0602a006d2d1855c2ab50d2d7f43c2eb1bab4..1dc6fef4aab4086ff57b48d26b20ec26bb8fa472 100644
--- a/src/client/auth/core/request.ts
+++ b/src/client/auth/core/request.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
@@ -175,7 +175,7 @@ export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptio
         headers['Authorization'] = `Basic ${credentials}`;
     }
 
-    if (options.body) {
+    if (options.body !== undefined) {
         if (options.mediaType) {
             headers['Content-Type'] = options.mediaType;
         } else if (isBlob(options.body)) {
@@ -215,6 +215,7 @@ export const sendRequest = async <T>(
         data: body ?? formData,
         method: options.method,
         withCredentials: config.WITH_CREDENTIALS,
+        withXSRFToken: config.CREDENTIALS === 'include' ? config.WITH_CREDENTIALS : false,
         cancelToken: source.token,
     };
 
diff --git a/src/client/auth/index.ts b/src/client/auth/index.ts
index e7078bd1a954b8bcc121ab77b85298540c58efa8..016081e45f1b86aa33a4ac54f09bfecbeb88a5f8 100644
--- a/src/client/auth/index.ts
+++ b/src/client/auth/index.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/auth/models/ErrorDetail.ts b/src/client/auth/models/ErrorDetail.ts
index 69dd37eb86bc15e2ab2037f3f82516493801e74d..3b8a588e591ca42adc538757044eee2cf6b5881a 100644
--- a/src/client/auth/models/ErrorDetail.ts
+++ b/src/client/auth/models/ErrorDetail.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/auth/models/HTTPValidationError.ts b/src/client/auth/models/HTTPValidationError.ts
index 892e4257ccbb49769737cb2e78e0aad49d81a3b1..f9b1a79e2c6debaa712bb1660d4353552f6fbfad 100644
--- a/src/client/auth/models/HTTPValidationError.ts
+++ b/src/client/auth/models/HTTPValidationError.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/auth/models/OIDCProvider.ts b/src/client/auth/models/OIDCProvider.ts
index 6bcf072eac6eea7b89228c999bf7e1954b8933ab..55d0ffe88b5308c7482c32344c7397a340b2770b 100644
--- a/src/client/auth/models/OIDCProvider.ts
+++ b/src/client/auth/models/OIDCProvider.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/auth/models/RoleEnum.ts b/src/client/auth/models/RoleEnum.ts
index d1a23ae7bd28accb81fa3d196c78cafd7aebe846..66c17a59edee7c6ac452ac757275260821cdd48f 100644
--- a/src/client/auth/models/RoleEnum.ts
+++ b/src/client/auth/models/RoleEnum.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/auth/models/User.ts b/src/client/auth/models/User.ts
index 5a1a2a0818d6fde1ed83cf5085a558edd232589b..537adb1841d16979e6ee0939fa21a4f96a232c00 100644
--- a/src/client/auth/models/User.ts
+++ b/src/client/auth/models/User.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/auth/models/ValidationError.ts b/src/client/auth/models/ValidationError.ts
index f2ff49a2b9ad95d18a90c95dc2a7c0b60b7e85e7..aaf1c921e8b674c3da9543cc2cb597e8e90d6d8f 100644
--- a/src/client/auth/models/ValidationError.ts
+++ b/src/client/auth/models/ValidationError.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/auth/services/AuthService.ts b/src/client/auth/services/AuthService.ts
index d1874e142839f9cd4b1fab476bce3665e7aed035..5cddd82bd5288be20e5ea44be156dbff0bab998d 100644
--- a/src/client/auth/services/AuthService.ts
+++ b/src/client/auth/services/AuthService.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/auth/services/UserService.ts b/src/client/auth/services/UserService.ts
index 99bdb40e5345009387559aa2731b4cad02909f96..37b02f80d6aeaf418bab6a02d9ffa4e1b01fbacf 100644
--- a/src/client/auth/services/UserService.ts
+++ b/src/client/auth/services/UserService.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/core/ApiError.ts b/src/client/resource/core/ApiError.ts
index d6b8fcc3ad0b6b2bdf1aa4df97ec598e64995648..ec7b16af6f41b1323a8e3aa3d529bf2324959e66 100644
--- a/src/client/resource/core/ApiError.ts
+++ b/src/client/resource/core/ApiError.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/core/ApiRequestOptions.ts b/src/client/resource/core/ApiRequestOptions.ts
index c19adcc94dc5f015865368d6d64751de5c243aa3..93143c3ce1ba5323894d4ac10299f62493f030f6 100644
--- a/src/client/resource/core/ApiRequestOptions.ts
+++ b/src/client/resource/core/ApiRequestOptions.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/core/ApiResult.ts b/src/client/resource/core/ApiResult.ts
index ad8fef2bc334c2aedf5c043896fd394229453ff0..ee1126e2ccd1e37dba97511c38c56a282ceac4dc 100644
--- a/src/client/resource/core/ApiResult.ts
+++ b/src/client/resource/core/ApiResult.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/core/CancelablePromise.ts b/src/client/resource/core/CancelablePromise.ts
index eb02246c31f61b897667a6433d55b8b413bafbc1..d70de92946d977e9da7970871375117a8b04770a 100644
--- a/src/client/resource/core/CancelablePromise.ts
+++ b/src/client/resource/core/CancelablePromise.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
@@ -85,9 +85,9 @@ export class CancelablePromise<T> implements Promise<T> {
         });
     }
 
-     get [Symbol.toStringTag]() {
-            return "Cancellable Promise";
-     }
+    get [Symbol.toStringTag]() {
+        return "Cancellable Promise";
+    }
 
     public then<TResult1 = T, TResult2 = never>(
         onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,
diff --git a/src/client/resource/core/OpenAPI.ts b/src/client/resource/core/OpenAPI.ts
index 6b53d3b96ba6dd7e71fd2068a1a9e3a0a139eab6..0ead9e182ad0cce6f9abc4021dec0367eb60cb63 100644
--- a/src/client/resource/core/OpenAPI.ts
+++ b/src/client/resource/core/OpenAPI.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/core/request.ts b/src/client/resource/core/request.ts
index c6a0602a006d2d1855c2ab50d2d7f43c2eb1bab4..1dc6fef4aab4086ff57b48d26b20ec26bb8fa472 100644
--- a/src/client/resource/core/request.ts
+++ b/src/client/resource/core/request.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
@@ -175,7 +175,7 @@ export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptio
         headers['Authorization'] = `Basic ${credentials}`;
     }
 
-    if (options.body) {
+    if (options.body !== undefined) {
         if (options.mediaType) {
             headers['Content-Type'] = options.mediaType;
         } else if (isBlob(options.body)) {
@@ -215,6 +215,7 @@ export const sendRequest = async <T>(
         data: body ?? formData,
         method: options.method,
         withCredentials: config.WITH_CREDENTIALS,
+        withXSRFToken: config.CREDENTIALS === 'include' ? config.WITH_CREDENTIALS : false,
         cancelToken: source.token,
     };
 
diff --git a/src/client/resource/index.ts b/src/client/resource/index.ts
index 52dfc0e292618fbe4fa8d1d04d0659bc2f16857c..8a53b0b2f563ff6d17c66114d31cfa106d74c038 100644
--- a/src/client/resource/index.ts
+++ b/src/client/resource/index.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/models/ErrorDetail.ts b/src/client/resource/models/ErrorDetail.ts
index 69dd37eb86bc15e2ab2037f3f82516493801e74d..3b8a588e591ca42adc538757044eee2cf6b5881a 100644
--- a/src/client/resource/models/ErrorDetail.ts
+++ b/src/client/resource/models/ErrorDetail.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/models/FileTree.ts b/src/client/resource/models/FileTree.ts
index 351cd8136de51e66926f5e7302cc5eb919913681..1771d7910d84faca0d50045561a8b879a2980d84 100644
--- a/src/client/resource/models/FileTree.ts
+++ b/src/client/resource/models/FileTree.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/models/HTTPValidationError.ts b/src/client/resource/models/HTTPValidationError.ts
index 892e4257ccbb49769737cb2e78e0aad49d81a3b1..f9b1a79e2c6debaa712bb1660d4353552f6fbfad 100644
--- a/src/client/resource/models/HTTPValidationError.ts
+++ b/src/client/resource/models/HTTPValidationError.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/models/ResourceIn.ts b/src/client/resource/models/ResourceIn.ts
index 661058019f2de83f2b1f3df27aeea194827daae7..2f6c25344f26b22af9af2f6e1299a61686178613 100644
--- a/src/client/resource/models/ResourceIn.ts
+++ b/src/client/resource/models/ResourceIn.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/models/ResourceOut.ts b/src/client/resource/models/ResourceOut.ts
index f708c6ba3ae5d4dcc1e3ddd2c50326cfa2a34c71..60b1290a47dc8151de42df19e72fcaf143092f6f 100644
--- a/src/client/resource/models/ResourceOut.ts
+++ b/src/client/resource/models/ResourceOut.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/models/ResourceVersionIn.ts b/src/client/resource/models/ResourceVersionIn.ts
index 68eb986b9852ca442172b4d9ac7ba2b1e33d8d00..c4421228c96da6c8a0530d37ed86fdecdbb99628 100644
--- a/src/client/resource/models/ResourceVersionIn.ts
+++ b/src/client/resource/models/ResourceVersionIn.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/models/ResourceVersionOut.ts b/src/client/resource/models/ResourceVersionOut.ts
index 7ab1dda6759829a8e9a4e3c4b0b9cf3658c8cb56..321971c86c97589a8f29f8bd73c99ae854ef04bb 100644
--- a/src/client/resource/models/ResourceVersionOut.ts
+++ b/src/client/resource/models/ResourceVersionOut.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/models/Status.ts b/src/client/resource/models/Status.ts
index e6f95179ce78544b3dba364c2fcfe0062ccfc08e..71fd950a1903618a6dacb1e94e7a2cbf7489db34 100644
--- a/src/client/resource/models/Status.ts
+++ b/src/client/resource/models/Status.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/models/UserRequestAnswer.ts b/src/client/resource/models/UserRequestAnswer.ts
index daf61d2400223daea12e2569b997bde58a9b405e..371bc72fdc40b0acccdcbf3c43ad5444c1721454 100644
--- a/src/client/resource/models/UserRequestAnswer.ts
+++ b/src/client/resource/models/UserRequestAnswer.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/models/UserSynchronizationRequestIn.ts b/src/client/resource/models/UserSynchronizationRequestIn.ts
index 702eed71b5a59f39bcd82546da602af51b9c13f7..14f1c691227c3a3dd0e9e3cab7010991e03a52b9 100644
--- a/src/client/resource/models/UserSynchronizationRequestIn.ts
+++ b/src/client/resource/models/UserSynchronizationRequestIn.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/models/UserSynchronizationRequestOut.ts b/src/client/resource/models/UserSynchronizationRequestOut.ts
index 7ad5039705f3f52edb26bb1a1ebc8a0bcd037faf..9f0bd3d6e70bcb52675bfe961a0b60fc6c591903 100644
--- a/src/client/resource/models/UserSynchronizationRequestOut.ts
+++ b/src/client/resource/models/UserSynchronizationRequestOut.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/models/ValidationError.ts b/src/client/resource/models/ValidationError.ts
index f2ff49a2b9ad95d18a90c95dc2a7c0b60b7e85e7..aaf1c921e8b674c3da9543cc2cb597e8e90d6d8f 100644
--- a/src/client/resource/models/ValidationError.ts
+++ b/src/client/resource/models/ValidationError.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/services/ResourceService.ts b/src/client/resource/services/ResourceService.ts
index 7edb06371331d7e1c3589d1074cdfc781c11a41a..cc6bbea61cf3f6367fbb3e19be00dee1488ab14e 100644
--- a/src/client/resource/services/ResourceService.ts
+++ b/src/client/resource/services/ResourceService.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/resource/services/ResourceVersionService.ts b/src/client/resource/services/ResourceVersionService.ts
index 50430260e825429f87986449a2fc29d96a2d5768..07c338369313a43ac36d1940cef78ea88acb77df 100644
--- a/src/client/resource/services/ResourceVersionService.ts
+++ b/src/client/resource/services/ResourceVersionService.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/core/ApiError.ts b/src/client/s3proxy/core/ApiError.ts
index d6b8fcc3ad0b6b2bdf1aa4df97ec598e64995648..ec7b16af6f41b1323a8e3aa3d529bf2324959e66 100644
--- a/src/client/s3proxy/core/ApiError.ts
+++ b/src/client/s3proxy/core/ApiError.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/core/ApiRequestOptions.ts b/src/client/s3proxy/core/ApiRequestOptions.ts
index c19adcc94dc5f015865368d6d64751de5c243aa3..93143c3ce1ba5323894d4ac10299f62493f030f6 100644
--- a/src/client/s3proxy/core/ApiRequestOptions.ts
+++ b/src/client/s3proxy/core/ApiRequestOptions.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/core/ApiResult.ts b/src/client/s3proxy/core/ApiResult.ts
index ad8fef2bc334c2aedf5c043896fd394229453ff0..ee1126e2ccd1e37dba97511c38c56a282ceac4dc 100644
--- a/src/client/s3proxy/core/ApiResult.ts
+++ b/src/client/s3proxy/core/ApiResult.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/core/CancelablePromise.ts b/src/client/s3proxy/core/CancelablePromise.ts
index eb02246c31f61b897667a6433d55b8b413bafbc1..d70de92946d977e9da7970871375117a8b04770a 100644
--- a/src/client/s3proxy/core/CancelablePromise.ts
+++ b/src/client/s3proxy/core/CancelablePromise.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
@@ -85,9 +85,9 @@ export class CancelablePromise<T> implements Promise<T> {
         });
     }
 
-     get [Symbol.toStringTag]() {
-            return "Cancellable Promise";
-     }
+    get [Symbol.toStringTag]() {
+        return "Cancellable Promise";
+    }
 
     public then<TResult1 = T, TResult2 = never>(
         onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,
diff --git a/src/client/s3proxy/core/OpenAPI.ts b/src/client/s3proxy/core/OpenAPI.ts
index f18fb9aeed82d0fd92b854566f9b61b5d519e1ca..35524ea4ce5a4157bdab674f394ae304ee6f0a35 100644
--- a/src/client/s3proxy/core/OpenAPI.ts
+++ b/src/client/s3proxy/core/OpenAPI.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/core/request.ts b/src/client/s3proxy/core/request.ts
index c6a0602a006d2d1855c2ab50d2d7f43c2eb1bab4..1dc6fef4aab4086ff57b48d26b20ec26bb8fa472 100644
--- a/src/client/s3proxy/core/request.ts
+++ b/src/client/s3proxy/core/request.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
@@ -175,7 +175,7 @@ export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptio
         headers['Authorization'] = `Basic ${credentials}`;
     }
 
-    if (options.body) {
+    if (options.body !== undefined) {
         if (options.mediaType) {
             headers['Content-Type'] = options.mediaType;
         } else if (isBlob(options.body)) {
@@ -215,6 +215,7 @@ export const sendRequest = async <T>(
         data: body ?? formData,
         method: options.method,
         withCredentials: config.WITH_CREDENTIALS,
+        withXSRFToken: config.CREDENTIALS === 'include' ? config.WITH_CREDENTIALS : false,
         cancelToken: source.token,
     };
 
diff --git a/src/client/s3proxy/index.ts b/src/client/s3proxy/index.ts
index fed4296d819361403d19656310823c02f50ab841..ae0ab189c9503085dd7cdbaa77e2bc5bcd08f160 100644
--- a/src/client/s3proxy/index.ts
+++ b/src/client/s3proxy/index.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/models/BucketIn.ts b/src/client/s3proxy/models/BucketIn.ts
index 9505a6420088ebf53b6601e1700d92a865272eb0..86846020f5817830fa44ea53712a389b1301c862 100644
--- a/src/client/s3proxy/models/BucketIn.ts
+++ b/src/client/s3proxy/models/BucketIn.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/models/BucketOut.ts b/src/client/s3proxy/models/BucketOut.ts
index bdd7171b00d8e1f08c4634273459e6b04aa9538e..f2fd7dd0b46dcad36bc88533172a2e05be934612 100644
--- a/src/client/s3proxy/models/BucketOut.ts
+++ b/src/client/s3proxy/models/BucketOut.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/models/BucketPermissionIn.ts b/src/client/s3proxy/models/BucketPermissionIn.ts
index e0e38255d47fedaf9bf6abda58b1e8e5e5537ef5..91014d0f8c2964cc56032732738118cd83a6fc9e 100644
--- a/src/client/s3proxy/models/BucketPermissionIn.ts
+++ b/src/client/s3proxy/models/BucketPermissionIn.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/models/BucketPermissionOut.ts b/src/client/s3proxy/models/BucketPermissionOut.ts
index e6fc7a7db9b7b2daed4f4cd520ffdf36ecdabc5d..fe4e066ab2928ee5882828b3ef42b530b4ebd86f 100644
--- a/src/client/s3proxy/models/BucketPermissionOut.ts
+++ b/src/client/s3proxy/models/BucketPermissionOut.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/models/BucketPermissionParameters.ts b/src/client/s3proxy/models/BucketPermissionParameters.ts
index 47c7576e18ad4ec0e6ff29040c723153eeee612b..6bc643a6bb5b6dd6abd7f544a76d64bb38ce4b8b 100644
--- a/src/client/s3proxy/models/BucketPermissionParameters.ts
+++ b/src/client/s3proxy/models/BucketPermissionParameters.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/models/BucketType.ts b/src/client/s3proxy/models/BucketType.ts
index 8001a27664273bd2a5ad360f6f10444be2e7046d..a974bb8026a85c4a3f683118ddd719e7e8c37bef 100644
--- a/src/client/s3proxy/models/BucketType.ts
+++ b/src/client/s3proxy/models/BucketType.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/models/Constraint.ts b/src/client/s3proxy/models/Constraint.ts
index 99043221bd2e12d3e2a112ae9308437d99e7df40..f33ad3b6dd99f415ef7c58226d0f026946cad402 100644
--- a/src/client/s3proxy/models/Constraint.ts
+++ b/src/client/s3proxy/models/Constraint.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/models/ErrorDetail.ts b/src/client/s3proxy/models/ErrorDetail.ts
index 69dd37eb86bc15e2ab2037f3f82516493801e74d..3b8a588e591ca42adc538757044eee2cf6b5881a 100644
--- a/src/client/s3proxy/models/ErrorDetail.ts
+++ b/src/client/s3proxy/models/ErrorDetail.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/models/HTTPValidationError.ts b/src/client/s3proxy/models/HTTPValidationError.ts
index 892e4257ccbb49769737cb2e78e0aad49d81a3b1..f9b1a79e2c6debaa712bb1660d4353552f6fbfad 100644
--- a/src/client/s3proxy/models/HTTPValidationError.ts
+++ b/src/client/s3proxy/models/HTTPValidationError.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/models/Permission.ts b/src/client/s3proxy/models/Permission.ts
index 33aebf753f36ab7b85a50e0de9d47501f3ff8709..e8896fc75f77bfe5636267d2c12e557cfb0ec402 100644
--- a/src/client/s3proxy/models/Permission.ts
+++ b/src/client/s3proxy/models/Permission.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/models/PermissionStatus.ts b/src/client/s3proxy/models/PermissionStatus.ts
index 0d858f08edd1fdb664ee83cc5805423dc3dd93f5..4d3c03cdbfba2ec55e1526f355f944f348c61dbc 100644
--- a/src/client/s3proxy/models/PermissionStatus.ts
+++ b/src/client/s3proxy/models/PermissionStatus.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/models/S3Key.ts b/src/client/s3proxy/models/S3Key.ts
index ebd17dbbf449b8507cad4fdf08082643238cd387..84bdd82f8c45c04d10fe0919505c4d2428329d46 100644
--- a/src/client/s3proxy/models/S3Key.ts
+++ b/src/client/s3proxy/models/S3Key.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/models/ValidationError.ts b/src/client/s3proxy/models/ValidationError.ts
index f2ff49a2b9ad95d18a90c95dc2a7c0b60b7e85e7..aaf1c921e8b674c3da9543cc2cb597e8e90d6d8f 100644
--- a/src/client/s3proxy/models/ValidationError.ts
+++ b/src/client/s3proxy/models/ValidationError.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/services/BucketPermissionService.ts b/src/client/s3proxy/services/BucketPermissionService.ts
index cc7df4bde5a8bba26e6f82c7f84bf5674032ab3f..c8b5b77acb0ec882a00eebacfde15a361e3493a0 100644
--- a/src/client/s3proxy/services/BucketPermissionService.ts
+++ b/src/client/s3proxy/services/BucketPermissionService.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/services/BucketService.ts b/src/client/s3proxy/services/BucketService.ts
index 5f73fa5031498e7bbfce37fad8f21872ffd68549..75d01ee454cb0e952b4fdd9b0c4b1b3ca1e00558 100644
--- a/src/client/s3proxy/services/BucketService.ts
+++ b/src/client/s3proxy/services/BucketService.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/s3proxy/services/S3KeyService.ts b/src/client/s3proxy/services/S3KeyService.ts
index 1d08223c7679f17b8200457fc327fb3954333fa1..58f2f589547a448652785a8765be5067d5fa3d48 100644
--- a/src/client/s3proxy/services/S3KeyService.ts
+++ b/src/client/s3proxy/services/S3KeyService.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/core/ApiError.ts b/src/client/workflow/core/ApiError.ts
index d6b8fcc3ad0b6b2bdf1aa4df97ec598e64995648..ec7b16af6f41b1323a8e3aa3d529bf2324959e66 100644
--- a/src/client/workflow/core/ApiError.ts
+++ b/src/client/workflow/core/ApiError.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/core/ApiRequestOptions.ts b/src/client/workflow/core/ApiRequestOptions.ts
index c19adcc94dc5f015865368d6d64751de5c243aa3..93143c3ce1ba5323894d4ac10299f62493f030f6 100644
--- a/src/client/workflow/core/ApiRequestOptions.ts
+++ b/src/client/workflow/core/ApiRequestOptions.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/core/ApiResult.ts b/src/client/workflow/core/ApiResult.ts
index ad8fef2bc334c2aedf5c043896fd394229453ff0..ee1126e2ccd1e37dba97511c38c56a282ceac4dc 100644
--- a/src/client/workflow/core/ApiResult.ts
+++ b/src/client/workflow/core/ApiResult.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/core/CancelablePromise.ts b/src/client/workflow/core/CancelablePromise.ts
index eb02246c31f61b897667a6433d55b8b413bafbc1..d70de92946d977e9da7970871375117a8b04770a 100644
--- a/src/client/workflow/core/CancelablePromise.ts
+++ b/src/client/workflow/core/CancelablePromise.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
@@ -85,9 +85,9 @@ export class CancelablePromise<T> implements Promise<T> {
         });
     }
 
-     get [Symbol.toStringTag]() {
-            return "Cancellable Promise";
-     }
+    get [Symbol.toStringTag]() {
+        return "Cancellable Promise";
+    }
 
     public then<TResult1 = T, TResult2 = never>(
         onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,
diff --git a/src/client/workflow/core/OpenAPI.ts b/src/client/workflow/core/OpenAPI.ts
index af264be25a464af3a2b3dcc57232c87766ac0180..c81a8eb67c222d70f094b26ab861ecd3265a081f 100644
--- a/src/client/workflow/core/OpenAPI.ts
+++ b/src/client/workflow/core/OpenAPI.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/core/request.ts b/src/client/workflow/core/request.ts
index c6a0602a006d2d1855c2ab50d2d7f43c2eb1bab4..1dc6fef4aab4086ff57b48d26b20ec26bb8fa472 100644
--- a/src/client/workflow/core/request.ts
+++ b/src/client/workflow/core/request.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
@@ -175,7 +175,7 @@ export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptio
         headers['Authorization'] = `Basic ${credentials}`;
     }
 
-    if (options.body) {
+    if (options.body !== undefined) {
         if (options.mediaType) {
             headers['Content-Type'] = options.mediaType;
         } else if (isBlob(options.body)) {
@@ -215,6 +215,7 @@ export const sendRequest = async <T>(
         data: body ?? formData,
         method: options.method,
         withCredentials: config.WITH_CREDENTIALS,
+        withXSRFToken: config.CREDENTIALS === 'include' ? config.WITH_CREDENTIALS : false,
         cancelToken: source.token,
     };
 
diff --git a/src/client/workflow/index.ts b/src/client/workflow/index.ts
index b7f66603ac980c9106fcf2fecc1ae97ee5ba91d2..dbfd76902980623fcd2985e539d58771cd365855 100644
--- a/src/client/workflow/index.ts
+++ b/src/client/workflow/index.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
@@ -14,10 +14,7 @@ export { DocumentationEnum } from './models/DocumentationEnum';
 export type { ErrorDetail } from './models/ErrorDetail';
 export type { HTTPValidationError } from './models/HTTPValidationError';
 export type { IconUpdateOut } from './models/IconUpdateOut';
-export type { ParameterExtension_Input } from './models/ParameterExtension_Input';
-export type { ParameterExtension_Output } from './models/ParameterExtension_Output';
-export type { ResourcePath_Input } from './models/ResourcePath_Input';
-export type { ResourcePath_Output } from './models/ResourcePath_Output';
+export type { ParameterExtension } from './models/ParameterExtension';
 export { Status } from './models/Status';
 export type { ValidationError } from './models/ValidationError';
 export type { WorkflowCredentialsIn } from './models/WorkflowCredentialsIn';
diff --git a/src/client/workflow/models/AnonymizedWorkflowExecution.ts b/src/client/workflow/models/AnonymizedWorkflowExecution.ts
index cc68ea3be9a98c612dae5a8a1fdc646e26b039ac..271df1bd1de51d908c544286bce2d0f6fe489899 100644
--- a/src/client/workflow/models/AnonymizedWorkflowExecution.ts
+++ b/src/client/workflow/models/AnonymizedWorkflowExecution.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/Body_Workflow_Version_upload_workflow_version_icon.ts b/src/client/workflow/models/Body_Workflow_Version_upload_workflow_version_icon.ts
index 01160c3790e18bb436fec90de50bf8c267454f18..b9b4fb0e29341a1d6fd9df456f6ceb9734049f5b 100644
--- a/src/client/workflow/models/Body_Workflow_Version_upload_workflow_version_icon.ts
+++ b/src/client/workflow/models/Body_Workflow_Version_upload_workflow_version_icon.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/DevWorkflowExecutionIn.ts b/src/client/workflow/models/DevWorkflowExecutionIn.ts
index ad6cbd949c0011a656dfd2ef699cfe7e90c180ac..f65f6ebdab303ad85e1ba0ba7705702b59bc0877 100644
--- a/src/client/workflow/models/DevWorkflowExecutionIn.ts
+++ b/src/client/workflow/models/DevWorkflowExecutionIn.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/DocumentationEnum.ts b/src/client/workflow/models/DocumentationEnum.ts
index 5540c023bc93402dd8d236a41632abe9dbbfe904..9bcb475dbc709abaf07a5faa8067932a1bdafd12 100644
--- a/src/client/workflow/models/DocumentationEnum.ts
+++ b/src/client/workflow/models/DocumentationEnum.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/ErrorDetail.ts b/src/client/workflow/models/ErrorDetail.ts
index 69dd37eb86bc15e2ab2037f3f82516493801e74d..3b8a588e591ca42adc538757044eee2cf6b5881a 100644
--- a/src/client/workflow/models/ErrorDetail.ts
+++ b/src/client/workflow/models/ErrorDetail.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/HTTPValidationError.ts b/src/client/workflow/models/HTTPValidationError.ts
index 892e4257ccbb49769737cb2e78e0aad49d81a3b1..f9b1a79e2c6debaa712bb1660d4353552f6fbfad 100644
--- a/src/client/workflow/models/HTTPValidationError.ts
+++ b/src/client/workflow/models/HTTPValidationError.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/IconUpdateOut.ts b/src/client/workflow/models/IconUpdateOut.ts
index 1210a9304608adaafc41a6be01dbbb145f8d9964..c53f21ab315ad28a74e27d42e4561c18e9c04d7d 100644
--- a/src/client/workflow/models/IconUpdateOut.ts
+++ b/src/client/workflow/models/IconUpdateOut.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/ParameterExtension.ts b/src/client/workflow/models/ParameterExtension.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6c96a7e822ca5b9f15635b64a1f870b2d81e5dba
--- /dev/null
+++ b/src/client/workflow/models/ParameterExtension.ts
@@ -0,0 +1,15 @@
+/* generated using openapi-typescript-codegen -- do not edit */
+/* istanbul ignore file */
+/* tslint:disable */
+/* eslint-disable */
+export type ParameterExtension = {
+    /**
+     * The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.
+     */
+    mapping?: Record<string, Record<string, (string | number)>>;
+    /**
+     * Dictionary with parameter name as key and default value as value
+     */
+    defaults?: Record<string, (string | number | boolean)>;
+};
+
diff --git a/src/client/workflow/models/ParameterExtension_Input.ts b/src/client/workflow/models/ParameterExtension_Input.ts
deleted file mode 100644
index a9b61aee03b5eaef407fd5c210579f5df9902e21..0000000000000000000000000000000000000000
--- a/src/client/workflow/models/ParameterExtension_Input.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-/* generated using openapi-typescript-codegen -- do no edit */
-/* istanbul ignore file */
-/* tslint:disable */
-/* eslint-disable */
-import type { ResourcePath_Input } from './ResourcePath_Input';
-export type ParameterExtension_Input = {
-    /**
-     * The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.
-     */
-    mapping?: Record<string, Record<string, (ResourcePath_Input | string | number)>>;
-    /**
-     * Dictionary with parameter name as key and default value as value
-     */
-    defaults?: Record<string, (ResourcePath_Input | string | number | boolean)>;
-};
-
diff --git a/src/client/workflow/models/ParameterExtension_Output.ts b/src/client/workflow/models/ParameterExtension_Output.ts
deleted file mode 100644
index da3a66e25f49587bb235d638383621848c184d2c..0000000000000000000000000000000000000000
--- a/src/client/workflow/models/ParameterExtension_Output.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-/* generated using openapi-typescript-codegen -- do no edit */
-/* istanbul ignore file */
-/* tslint:disable */
-/* eslint-disable */
-import type { ResourcePath_Output } from './ResourcePath_Output';
-export type ParameterExtension_Output = {
-    /**
-     * The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.
-     */
-    mapping?: Record<string, Record<string, (ResourcePath_Output | string | number)>>;
-    /**
-     * Dictionary with parameter name as key and default value as value
-     */
-    defaults?: Record<string, (ResourcePath_Output | string | number | boolean)>;
-};
-
diff --git a/src/client/workflow/models/ResourcePath_Input.ts b/src/client/workflow/models/ResourcePath_Input.ts
deleted file mode 100644
index c42ec4ee1ccc7a964ce4b68a2e0e176779f6f300..0000000000000000000000000000000000000000
--- a/src/client/workflow/models/ResourcePath_Input.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-/* generated using openapi-typescript-codegen -- do no edit */
-/* istanbul ignore file */
-/* tslint:disable */
-/* eslint-disable */
-export type ResourcePath_Input = {
-    /**
-     * ID of the resource version
-     */
-    resource_version_id: string;
-    /**
-     * ID of the resource
-     */
-    resource_id: string;
-    suffix?: (string | null);
-};
-
diff --git a/src/client/workflow/models/ResourcePath_Output.ts b/src/client/workflow/models/ResourcePath_Output.ts
deleted file mode 100644
index e985b797e4c0afd69c7059f5db4841efaef727a0..0000000000000000000000000000000000000000
--- a/src/client/workflow/models/ResourcePath_Output.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-/* generated using openapi-typescript-codegen -- do no edit */
-/* istanbul ignore file */
-/* tslint:disable */
-/* eslint-disable */
-export type ResourcePath_Output = {
-    /**
-     * ID of the resource version
-     */
-    resource_version_id: string;
-    /**
-     * ID of the resource
-     */
-    resource_id: string;
-    suffix?: (string | null);
-};
-
diff --git a/src/client/workflow/models/Status.ts b/src/client/workflow/models/Status.ts
index fd918bd83e94662808073249cf91cc0d8b721fac..db27a378d22e80e9ca6f7a66c7ed6ac9acc591f7 100644
--- a/src/client/workflow/models/Status.ts
+++ b/src/client/workflow/models/Status.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/ValidationError.ts b/src/client/workflow/models/ValidationError.ts
index f2ff49a2b9ad95d18a90c95dc2a7c0b60b7e85e7..aaf1c921e8b674c3da9543cc2cb597e8e90d6d8f 100644
--- a/src/client/workflow/models/ValidationError.ts
+++ b/src/client/workflow/models/ValidationError.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/WorkflowCredentialsIn.ts b/src/client/workflow/models/WorkflowCredentialsIn.ts
index a3b3c105701dfc4949bd81bb26409275e60a7b64..7887b8f262b348915cd85cd44c90362d4732bd9f 100644
--- a/src/client/workflow/models/WorkflowCredentialsIn.ts
+++ b/src/client/workflow/models/WorkflowCredentialsIn.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/WorkflowCredentialsOut.ts b/src/client/workflow/models/WorkflowCredentialsOut.ts
index 371252ccef56cbab9fae83919271e08aa6ae198d..3500a19860539a5481a39b56f833b7c6ddaa6b56 100644
--- a/src/client/workflow/models/WorkflowCredentialsOut.ts
+++ b/src/client/workflow/models/WorkflowCredentialsOut.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/WorkflowExecutionIn.ts b/src/client/workflow/models/WorkflowExecutionIn.ts
index 35c5f06034231f12ae852e8d83da244e62f3463a..6b39b2f28323e5169cc2cb8e3d93238126249cf2 100644
--- a/src/client/workflow/models/WorkflowExecutionIn.ts
+++ b/src/client/workflow/models/WorkflowExecutionIn.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/WorkflowExecutionOut.ts b/src/client/workflow/models/WorkflowExecutionOut.ts
index 29bf964a4428e93d6330b90678de154661c47766..514ea962aa479014f046a4c05032e37e3a865c45 100644
--- a/src/client/workflow/models/WorkflowExecutionOut.ts
+++ b/src/client/workflow/models/WorkflowExecutionOut.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/WorkflowExecutionStatus.ts b/src/client/workflow/models/WorkflowExecutionStatus.ts
index 6b92108d72486d7dbf7cd63606e0e5210d479c02..e0bc72f4011a92b6eb1478f7cbc71e409e5a2629 100644
--- a/src/client/workflow/models/WorkflowExecutionStatus.ts
+++ b/src/client/workflow/models/WorkflowExecutionStatus.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/WorkflowIn.ts b/src/client/workflow/models/WorkflowIn.ts
index c5322ce22a5df57eade165e222023333d7d79dd1..acc74b596d2bde22f15f43cf5cdd563644e24935 100644
--- a/src/client/workflow/models/WorkflowIn.ts
+++ b/src/client/workflow/models/WorkflowIn.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/WorkflowModeIn.ts b/src/client/workflow/models/WorkflowModeIn.ts
index 7d8d2d439cc4fa451a071aa2edbf5457c2c84c06..c09b4349d3129125b8e3989d1d7ab097c100a915 100644
--- a/src/client/workflow/models/WorkflowModeIn.ts
+++ b/src/client/workflow/models/WorkflowModeIn.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/WorkflowModeOut.ts b/src/client/workflow/models/WorkflowModeOut.ts
index d3b61d56fadb4e1e93d4ba47a6fb65e2118b6906..3adeebeca35255fd467c705685bd4098366a4d61 100644
--- a/src/client/workflow/models/WorkflowModeOut.ts
+++ b/src/client/workflow/models/WorkflowModeOut.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/WorkflowOut.ts b/src/client/workflow/models/WorkflowOut.ts
index 90fbae386c4790be3b6063d3cff5db722dcd9d4d..d4968c2c9c30003675c80ffc24fe181e1d4f303b 100644
--- a/src/client/workflow/models/WorkflowOut.ts
+++ b/src/client/workflow/models/WorkflowOut.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/WorkflowStatistic.ts b/src/client/workflow/models/WorkflowStatistic.ts
index d84e2dc9ce8a30ce6d93a355774e56957fb117e3..ba9815f493841b6192cc61a7ae1eda1fc2afcfff 100644
--- a/src/client/workflow/models/WorkflowStatistic.ts
+++ b/src/client/workflow/models/WorkflowStatistic.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/WorkflowUpdate.ts b/src/client/workflow/models/WorkflowUpdate.ts
index 879f4bc2d303f3e3bd247b63b3996a14b9fa1b41..9b3dac395a7cc364ad439019492ac29fd4291582 100644
--- a/src/client/workflow/models/WorkflowUpdate.ts
+++ b/src/client/workflow/models/WorkflowUpdate.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/models/WorkflowVersion.ts b/src/client/workflow/models/WorkflowVersion.ts
index 5f2f0d1e21d2afb22510dec18a6285e7740b3e52..da35ffd2a70d3d61a1adc69fd1a1672e78448492 100644
--- a/src/client/workflow/models/WorkflowVersion.ts
+++ b/src/client/workflow/models/WorkflowVersion.ts
@@ -1,8 +1,8 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
-import type { ParameterExtension_Output } from './ParameterExtension_Output';
+import type { ParameterExtension } from './ParameterExtension';
 import type { Status } from './Status';
 export type WorkflowVersion = {
     /**
@@ -36,6 +36,6 @@ export type WorkflowVersion = {
     /**
      * Parameter extension specific for this CloWM instance
      */
-    parameter_extension?: (ParameterExtension_Output | null);
+    parameter_extension?: (ParameterExtension | null);
 };
 
diff --git a/src/client/workflow/models/WorkflowVersionStatus.ts b/src/client/workflow/models/WorkflowVersionStatus.ts
index 765e6881cbcd8211096130a094584eb7f04ffa1d..9477c1f502dd983e11adf94656318f547606a044 100644
--- a/src/client/workflow/models/WorkflowVersionStatus.ts
+++ b/src/client/workflow/models/WorkflowVersionStatus.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/services/WorkflowCredentialsService.ts b/src/client/workflow/services/WorkflowCredentialsService.ts
index 6e664ec25e60ec6e16c31db2c6f3785981bdeb56..f7e79f5df8c1edee6f0a55ed2332e7e7c0a6fa83 100644
--- a/src/client/workflow/services/WorkflowCredentialsService.ts
+++ b/src/client/workflow/services/WorkflowCredentialsService.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/services/WorkflowExecutionService.ts b/src/client/workflow/services/WorkflowExecutionService.ts
index 1b785be2feb1b17bc505033c90275b32c9bf9842..c6d08278a58be2ae34d58a737900a4b98b0c9852 100644
--- a/src/client/workflow/services/WorkflowExecutionService.ts
+++ b/src/client/workflow/services/WorkflowExecutionService.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/services/WorkflowModeService.ts b/src/client/workflow/services/WorkflowModeService.ts
index c6f11743367cf3ea1ecc0dcbd08d1b92c509d63a..3d68f8bc35c2ff99a123cfd1af32bf89d3d0a030 100644
--- a/src/client/workflow/services/WorkflowModeService.ts
+++ b/src/client/workflow/services/WorkflowModeService.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/services/WorkflowService.ts b/src/client/workflow/services/WorkflowService.ts
index dbed2cf8d9a66b63886050375683ee0438b39af0..06a8be33ed8bcaa20777eff36f63a3cb1b6c3482 100644
--- a/src/client/workflow/services/WorkflowService.ts
+++ b/src/client/workflow/services/WorkflowService.ts
@@ -1,4 +1,4 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
diff --git a/src/client/workflow/services/WorkflowVersionService.ts b/src/client/workflow/services/WorkflowVersionService.ts
index ca8d35742d5f792862495273e42a202787679e8c..814605ed4b6c4f722a80bb8a484e2cd7862ceadb 100644
--- a/src/client/workflow/services/WorkflowVersionService.ts
+++ b/src/client/workflow/services/WorkflowVersionService.ts
@@ -1,11 +1,11 @@
-/* generated using openapi-typescript-codegen -- do no edit */
+/* generated using openapi-typescript-codegen -- do not edit */
 /* istanbul ignore file */
 /* tslint:disable */
 /* eslint-disable */
 import type { Body_Workflow_Version_upload_workflow_version_icon } from '../models/Body_Workflow_Version_upload_workflow_version_icon';
 import type { DocumentationEnum } from '../models/DocumentationEnum';
 import type { IconUpdateOut } from '../models/IconUpdateOut';
-import type { ParameterExtension_Input } from '../models/ParameterExtension_Input';
+import type { ParameterExtension } from '../models/ParameterExtension';
 import type { Status } from '../models/Status';
 import type { WorkflowVersion } from '../models/WorkflowVersion';
 import type { WorkflowVersionStatus } from '../models/WorkflowVersionStatus';
@@ -142,7 +142,7 @@ export class WorkflowVersionService {
         });
     }
     /**
-     * Deprecate a workflow version
+     * Update parameter extension of workflow version
      * Update the parameter extension of a workflow version.
      *
      *
@@ -156,7 +156,7 @@ export class WorkflowVersionService {
     public static workflowVersionUpdateWorkflowVersionParameterExtension(
         wid: string,
         gitCommitHash: string,
-        requestBody: ParameterExtension_Input,
+        requestBody: ParameterExtension,
     ): CancelablePromise<WorkflowVersion> {
         return __request(OpenAPI, {
             method: 'PATCH',
@@ -176,6 +176,37 @@ export class WorkflowVersionService {
             },
         });
     }
+    /**
+     * Delete parameter extension of workflow version
+     * Delete the parameter extension of a workflow version.
+     *
+     *
+     * Permission `workflow:update` required.
+     * @param wid ID of a workflow
+     * @param gitCommitHash Git commit git_commit_hash of specific version.
+     * @returns void
+     * @throws ApiError
+     */
+    public static workflowVersionDeleteWorkflowVersionParameterExtension(
+        wid: string,
+        gitCommitHash: string,
+    ): CancelablePromise<void> {
+        return __request(OpenAPI, {
+            method: 'DELETE',
+            url: '/workflows/{wid}/versions/{git_commit_hash}/parameter-extension',
+            path: {
+                'wid': wid,
+                'git_commit_hash': gitCommitHash,
+            },
+            errors: {
+                400: `Error decoding JWT Token`,
+                401: `Not authenticated`,
+                403: `Not authorized`,
+                404: `Entity not Found`,
+                422: `Validation Error`,
+            },
+        });
+    }
     /**
      * Fetch documentation for a workflow version
      * Get the documentation for a specific workflow version.
diff --git a/src/components/BootstrapToast.vue b/src/components/BootstrapToast.vue
index 000cdda2566dc3c96deff69fd34597ea945aca0e..0b9d98c282c65979fb0c566fe6bc51eaf52fefc2 100644
--- a/src/components/BootstrapToast.vue
+++ b/src/components/BootstrapToast.vue
@@ -1,18 +1,11 @@
 <script setup lang="ts">
 import { useSlots, computed, type PropType } from "vue";
-
-type colors =
-  | "primary"
-  | "secondary"
-  | "success"
-  | "warning"
-  | "danger"
-  | "info";
+import type { Colors } from "@/types/PropTypes";
 
 const slots = useSlots();
 const props = defineProps({
   colorClass: {
-    type: String as PropType<colors>,
+    type: String as PropType<Colors>,
     required: false,
     default: "success",
   },
diff --git a/src/components/modals/BootstrapModal.vue b/src/components/modals/BootstrapModal.vue
index 63806ef19d8f804f709b31185083703de16dcb67..7d6cc6cd2efbf855c48defec2e51adda0b16cbce 100644
--- a/src/components/modals/BootstrapModal.vue
+++ b/src/components/modals/BootstrapModal.vue
@@ -1,21 +1,22 @@
 <script setup lang="ts">
 import { computed } from "vue";
+import type { SizeModifierType } from "@/types/PropTypes";
 
 const props = defineProps<{
   modalId: string;
   modalLabel: string;
   staticBackdrop?: boolean;
-  sizeModifier?: sizeModifierType; // https://getbootstrap.com/docs/5.3/components/modal/#optional-sizes, e.g. sm, lg and xl
+  sizeModifierModal?: sizeModifierModalType; // https://getbootstrap.com/docs/5.3/components/modal/#optional-sizes, e.g. sm, lg and xl
   trackModalValue?: string;
 }>();
 
-type sizeModifierType = "sm" | "lg" | "xl";
+type sizeModifierModalType = SizeModifierType | "xl";
 
 const modalSizeClass = computed<string>(() => {
-  if (props.sizeModifier == undefined) {
+  if (props.sizeModifierModal == undefined) {
     return "";
   }
-  return "modal-" + props.sizeModifier;
+  return "modal-" + props.sizeModifierModal;
 });
 
 function trackModalShow() {
diff --git a/src/components/parameter-schema/ParameterSchemaFormComponent.vue b/src/components/parameter-schema/ParameterSchemaFormComponent.vue
index cc847a63f202ecab031ad5809adcda9f56530240..eb230b0057ca5a7b8ca5fa3d8034eafbb08fac9d 100644
--- a/src/components/parameter-schema/ParameterSchemaFormComponent.vue
+++ b/src/components/parameter-schema/ParameterSchemaFormComponent.vue
@@ -4,7 +4,7 @@ import ParameterGroupForm from "@/components/parameter-schema/form-mode/Paramete
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
 import Ajv from "ajv";
 import type { ValidateFunction } from "ajv";
-import ParameterStringInput from "@/components/parameter-schema/form-mode/ParameterStringInput.vue";
+import ParameterInput from "@/components/parameter-schema/form-mode/ParameterInput.vue";
 import { Toast, Tooltip } from "bootstrap";
 import { useBucketStore } from "@/stores/buckets";
 import { useS3KeyStore } from "@/stores/s3keys";
@@ -19,6 +19,7 @@ import type {
   WorkflowParameters,
 } from "@/types/WorkflowParameters";
 import { useWorkflowExecutionStore } from "@/stores/workflowExecutions";
+import type { ParameterExtension } from "@/client/workflow";
 
 const bucketRepository = useBucketStore();
 const resourceRepository = useResourceStore();
@@ -37,6 +38,10 @@ const props = defineProps({
     type: Object as PropType<ClowmInfo>,
     required: false,
   },
+  parameterExtension: {
+    type: Object as PropType<ParameterExtension>,
+    required: false,
+  },
   loading: {
     type: Boolean,
   },
@@ -184,6 +189,7 @@ function updateSchema(schema: Record<string, any>) {
   formState.formInput = groupedParameters.reduce((acc, val) => {
     return { ...acc, ...val };
   });
+  loadParameters({ params: props.parameterExtension?.defaults }, false);
   loadParameters(executionRepository.popTemporaryParameters());
 }
 
@@ -213,17 +219,26 @@ function startWorkflow() {
   }
 }
 
-function loadParameters(tempParams?: TemporaryParams) {
-  if (tempParams) {
+function loadParameters(
+  tempParams?: TemporaryParams,
+  showSuccessToast: boolean = true,
+) {
+  if (tempParams?.params) {
     for (const param in tempParams.params) {
       if (param in formState.formInput) {
         formState.formInput[param] = tempParams.params[param];
       }
     }
+  }
+  if (tempParams?.metaParams) {
     formState.metaParameters = tempParams.metaParams;
-    if (Object.keys(tempParams?.params ?? {}).length > 0) {
-      parameterLoadToast?.show();
-    }
+  }
+  if (
+    showSuccessToast &&
+    (Object.keys(tempParams?.params ?? {}).length > 0 ||
+      Object.keys(tempParams?.metaParams ?? {}).length > 0)
+  ) {
+    parameterLoadToast?.show();
   }
 }
 
@@ -296,6 +311,7 @@ onMounted(() => {
           :showHidden="showHidden"
           :show-optional="showOptional"
           :resource-parameters="props.clowmInfo?.resourceParameters"
+          :mapping="parameterExtension?.mapping"
         />
       </template>
       <div class="card mb-3">
@@ -338,14 +354,13 @@ onMounted(() => {
               <span class="input-group-text border border-secondary">
                 <font-awesome-icon icon="fa-solid fa-folder" />
               </span>
-              <parameter-string-input
-                parameter-name="logs_s3_path"
+              <parameter-input
                 v-model="formState.metaParameters.logs_s3_path"
                 :parameter="{
                   format: 'directory-path',
                   type: 'string',
                 }"
-                remove-advanced
+                border="secondary"
               />
             </div>
             <label class="mb-3" for="logsS3Path">
@@ -361,14 +376,13 @@ onMounted(() => {
               <span class="input-group-text border border-secondary">
                 <font-awesome-icon icon="fa-solid fa-folder" />
               </span>
-              <parameter-string-input
-                parameter-name="provenance_s3_path"
+              <parameter-input
                 v-model="formState.metaParameters.provenance_s3_path"
                 :parameter="{
                   format: 'directory-path',
                   type: 'string',
                 }"
-                remove-advanced
+                border="secondary"
               />
             </div>
             <label class="mb-3" for="provenanceS3Path">
@@ -385,14 +399,13 @@ onMounted(() => {
               <span class="input-group-text border border-secondary">
                 <font-awesome-icon icon="fa-solid fa-folder" />
               </span>
-              <parameter-string-input
-                parameter-name="debug_s3_path"
+              <parameter-input
                 v-model="formState.metaParameters.debug_s3_path"
                 :parameter="{
                   format: 'directory-path',
                   type: 'string',
                 }"
-                remove-advanced
+                border="secondary"
               />
             </div>
             <label class="mb-3" for="debugS3Path">
diff --git a/src/components/parameter-schema/form-mode/ParameterBooleanInput.vue b/src/components/parameter-schema/form-mode/ParameterBooleanInput.vue
index 54e519ccd40a64f2ab9801973389ae525ea3d97f..30010c4a0bc3fc94365de059d97d4d3cc13d236b 100644
--- a/src/components/parameter-schema/form-mode/ParameterBooleanInput.vue
+++ b/src/components/parameter-schema/form-mode/ParameterBooleanInput.vue
@@ -1,5 +1,6 @@
 <script setup lang="ts">
-import { computed } from "vue";
+import { computed, onMounted, type PropType, watch } from "vue";
+import type { ExtendedColors } from "@/types/PropTypes";
 
 const model = defineModel<boolean | undefined>({ required: true });
 
@@ -8,31 +9,52 @@ const props = defineProps({
     type: Object,
     required: true,
     validator(value: Record<string, never>) {
-      return "number" === value["type"];
+      return "boolean" === value["type"];
     },
   },
-  required: Boolean,
-  parameterName: {
-    type: String,
-    required: true,
-  },
-  helpId: {
-    type: String,
-  },
+  border: String as PropType<ExtendedColors>,
 });
 
 const randomIDSuffix = Math.random().toString(16).substring(2, 8);
 
 const helpTextPresent = computed<boolean>(() => props.parameter["help_text"]);
 const iconPresent = computed<boolean>(() => props.parameter["fa_icon"]);
+
+const dynamicCssClasses = computed<string[]>(() => {
+  const cssClasses = [];
+  if (props.border) {
+    cssClasses.push("border", `border-${props.border}`, "text-bg-light");
+  }
+  if (!helpTextPresent.value) {
+    cssClasses.push("rounded-end");
+  }
+  if (!iconPresent.value) {
+    cssClasses.push("rounded-start");
+  }
+  return cssClasses;
+});
+
+watch(model, (newVal) => {
+  if (typeof newVal === "number") {
+    // type conversion if true/false is represented by 0/1
+    model.value = !!newVal;
+  }
+});
+
+onMounted(() => {
+  if (model.value != undefined) {
+    // type conversion if true/false is represented by 0/1
+    model.value = model.value ? true : false;
+  }
+});
 </script>
 
 <template>
   <div
-    class="flex-fill mb-0 text-bg-light fs-6 ps-4 d-flex align-items-center justify-content-start py-1 border border-secondary"
-    :class="{ 'rounded-end': !helpTextPresent, 'rounded-start': !iconPresent }"
+    class="flex-fill mb-0 fs-6 d-flex align-items-center justify-content-start py-1 ps-4"
+    :class="dynamicCssClasses"
   >
-    <div class="form-check form-check-inline">
+    <div class="form-check form-check-inline mb-0">
       <label class="form-check-label" :for="'trueOption' + randomIDSuffix"
         >True</label
       >
@@ -45,7 +67,7 @@ const iconPresent = computed<boolean>(() => props.parameter["fa_icon"]);
         v-model="model"
       />
     </div>
-    <div class="form-check form-check-inline">
+    <div class="form-check form-check-inline mb-0">
       <input
         class="form-check-input"
         type="radio"
diff --git a/src/components/parameter-schema/form-mode/ParameterEnumInput.vue b/src/components/parameter-schema/form-mode/ParameterEnumInput.vue
index a92092cc77d4a17a2665bbbb46a979ba2ef18f29..182a3773ad3ef9507a168a27933e9553eac1eef7 100644
--- a/src/components/parameter-schema/form-mode/ParameterEnumInput.vue
+++ b/src/components/parameter-schema/form-mode/ParameterEnumInput.vue
@@ -1,5 +1,6 @@
 <script setup lang="ts">
-import { computed } from "vue";
+import { computed, type PropType } from "vue";
+import type { ExtendedColors, SizeModifierType } from "@/types/PropTypes";
 
 const model = defineModel<string | undefined>({ required: true });
 
@@ -12,25 +13,32 @@ const props = defineProps({
     },
   },
   required: Boolean,
-  parameterName: {
-    type: String,
-    required: true,
-  },
-  helpId: {
-    type: String,
+  sizeModifier: {
+    type: String as PropType<SizeModifierType>,
   },
+  border: String as PropType<ExtendedColors>,
 });
 
 const possibleValues = computed<string[]>(() => props.parameter["enum"]);
+
+const dynamicCssClasses = computed<string[]>(() => {
+  const cssClasses = [];
+  if (props.sizeModifier) {
+    cssClasses.push(`form-select-${props.sizeModifier}`);
+  }
+  if (props.border) {
+    cssClasses.push("border", `border-${props.border}`);
+  }
+  return cssClasses;
+});
 </script>
 
 <template>
   <select
-    ref="enumSelection"
     v-model="model"
-    class="form-select border border-secondary"
+    class="form-select"
+    :class="dynamicCssClasses"
     :required="required"
-    :aria-describedby="props.helpId"
   >
     <option v-for="val in possibleValues" :key="val">
       {{ val }}
diff --git a/src/components/parameter-schema/form-mode/ParameterFileInput.vue b/src/components/parameter-schema/form-mode/ParameterFileInput.vue
new file mode 100644
index 0000000000000000000000000000000000000000..80ab07e0103ca9643a1ce11d07c4ad70791c6662
--- /dev/null
+++ b/src/components/parameter-schema/form-mode/ParameterFileInput.vue
@@ -0,0 +1,206 @@
+<script setup lang="ts">
+import { computed, onMounted, type PropType, reactive, watch } from "vue";
+import { useS3ObjectStore } from "@/stores/s3objects";
+import { useBucketStore } from "@/stores/buckets";
+import type { ExtendedColors, SizeModifierType } from "@/types/PropTypes";
+
+const model = defineModel<string | undefined>({ required: true });
+const s3Regex = /s3:\/\/([^\s/]*)(\/\S*)?/g;
+
+const props = defineProps({
+  parameter: {
+    type: Object,
+    required: true,
+    validator(value: Record<string, never>) {
+      return value["format"] != undefined;
+    },
+  },
+  required: Boolean,
+  helpId: {
+    type: String,
+  },
+  sizeModifier: {
+    type: String as PropType<SizeModifierType>,
+  },
+  border: String as PropType<ExtendedColors>,
+  allowRaw: Boolean,
+});
+
+const emit = defineEmits<{
+  (e: "switch-to-raw"): void;
+}>();
+
+const s3ObjectRepository = useS3ObjectStore();
+const bucketRepository = useBucketStore();
+const randomIDSuffix = Math.random().toString(16).substring(2, 8);
+
+const baseDynamicClass = computed<string[]>(() =>
+  props.border ? ["border", `border-${props.border}`] : [],
+);
+
+const selectDynamicClass = computed<string[]>(() => {
+  const cssClasses = [...baseDynamicClass.value];
+  if (props.sizeModifier) {
+    cssClasses.push(`form-select-${props.sizeModifier}`);
+  }
+  return cssClasses;
+});
+const inputDynamicClass = computed<string[]>(() => {
+  const cssClasses = [...baseDynamicClass.value];
+  if (props.sizeModifier) {
+    cssClasses.push(`form-control-${props.sizeModifier}`);
+  }
+  if (!helpTextPresent.value && !props.allowRaw) {
+    cssClasses.push("rounded-end");
+  }
+  return cssClasses;
+});
+
+watch(model, (newVal, oldVal) => {
+  if (
+    newVal != oldVal &&
+    newVal !== translateToModel(s3Path.bucket, s3Path.key)
+  ) {
+    parseModel(newVal);
+  }
+});
+
+function parseModel(val?: string) {
+  if (val == undefined || val.length === 0) {
+    s3Path.bucket = "";
+    s3Path.key = undefined;
+    return;
+  }
+  const match = s3Regex.exec(val ?? "");
+  if (match) {
+    s3Path.bucket = match[1];
+    s3Path.key = match[2]?.slice(1);
+    if (bucketRepository.bucketMapping[s3Path.bucket] == undefined) {
+      // Missing bucket
+      emit("switch-to-raw");
+    }
+  } else {
+    // Not S3 Path
+    emit("switch-to-raw");
+  }
+}
+
+const s3Path = reactive<{
+  bucket: string;
+  key?: string;
+}>({
+  bucket: "",
+  key: undefined,
+});
+
+const helpTextPresent = computed<boolean>(() => props.parameter["help_text"]);
+
+const foldersInBucket = computed<string[]>(() =>
+  (s3ObjectRepository.objectMapping[s3Path.bucket ?? ""] ?? [])
+    .filter((obj) => obj.Key != undefined)
+    .map((obj) => {
+      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+      const parts = obj.Key!.split("/");
+      return parts
+        .slice(0, parts.length - 1)
+        .map((part, index) =>
+          parts.slice(0, index + 1).reduce((acc, val) => `${acc}/${val}`),
+        );
+    })
+    .flat()
+    .filter((val, index, array) => array.indexOf(val) === index),
+);
+
+const filesInBucket = computed<string[]>(() =>
+  (s3ObjectRepository.objectMapping[s3Path.bucket ?? ""] ?? [])
+    .filter((obj) => !obj.Key?.endsWith("/"))
+    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+    .map((obj) => obj.Key!),
+);
+
+const filesAndFoldersInBucket = computed<string[]>(() =>
+  filesInBucket.value.concat(foldersInBucket.value),
+);
+
+const keyDataList = computed<string[]>(() => {
+  switch (props.parameter["format"]) {
+    case "file-path":
+      return filesInBucket.value;
+    case "directory-path":
+      return foldersInBucket.value;
+    case "path":
+      return filesAndFoldersInBucket.value;
+    default:
+      return [];
+  }
+});
+
+watch(
+  () => s3Path.key,
+  (newVal, oldVal) => {
+    if (newVal !== oldVal) {
+      model.value = translateToModel(s3Path.bucket, newVal);
+    }
+  },
+);
+
+function updateBucket(bucket: string) {
+  s3Path.bucket = bucket;
+  model.value = translateToModel(bucket, s3Path.key);
+  s3ObjectRepository.fetchS3Objects(
+    bucket,
+    bucketRepository.ownPermissions[bucket]?.file_prefix ?? undefined,
+  );
+}
+
+function translateToModel(bucket: string, key?: string): string | undefined {
+  return !bucket ? undefined : `s3://${bucket}${key ? "/" + key : ""}`;
+}
+
+onMounted(() => {
+  parseModel(model.value);
+});
+</script>
+
+<template>
+  <select
+    class="form-select"
+    :class="selectDynamicClass"
+    :required="props.required"
+    :value="s3Path.bucket"
+    @change="
+      (event) => updateBucket((event.target as HTMLSelectElement)?.value)
+    "
+  >
+    <option selected disabled value="">Please select a bucket</option>
+    <option
+      v-for="bucket in bucketRepository.ownBucketsAndFullPermissions"
+      :key="bucket"
+      :value="bucket"
+    >
+      {{ bucket }}
+    </option>
+  </select>
+  <input
+    class="form-control"
+    :list="'keys-options-' + randomIDSuffix"
+    :class="inputDynamicClass"
+    placeholder="Type to search in bucket..."
+    :required="props.required && props.parameter['format'] === 'file-path'"
+    v-model="s3Path.key"
+    :pattern="props.parameter['pattern']"
+  />
+  <datalist :id="'keys-options-' + randomIDSuffix">
+    <option v-for="obj in keyDataList" :value="obj" :key="obj" />
+  </datalist>
+  <button
+    v-if="allowRaw"
+    type="button"
+    class="btn btn-outline-secondary"
+    @click="emit('switch-to-raw')"
+  >
+    Raw
+  </button>
+</template>
+
+<style scoped></style>
diff --git a/src/components/parameter-schema/form-mode/ParameterGroupForm.vue b/src/components/parameter-schema/form-mode/ParameterGroupForm.vue
index 9d4b0f398b7cf79348714c6bcabdf6f013d0d74f..c36f61227585a05f4ad28b48e5b1c60de7b655b4 100644
--- a/src/components/parameter-schema/form-mode/ParameterGroupForm.vue
+++ b/src/components/parameter-schema/form-mode/ParameterGroupForm.vue
@@ -1,12 +1,9 @@
 <script setup lang="ts">
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
 import { computed, type PropType } from "vue";
-import ParameterNumberInput from "@/components/parameter-schema/form-mode/ParameterNumberInput.vue";
 import MarkdownRenderer from "@/components/MarkdownRenderer.vue";
-import ParameterBooleanInput from "@/components/parameter-schema/form-mode/ParameterBooleanInput.vue";
-import ParameterEnumInput from "@/components/parameter-schema/form-mode/ParameterEnumInput.vue";
-import ParameterStringInput from "@/components/parameter-schema/form-mode/ParameterStringInput.vue";
 import type { WorkflowParameters } from "@/types/WorkflowParameters";
+import ParameterInput from "@/components/parameter-schema/form-mode/ParameterInput.vue";
 
 const model = defineModel<WorkflowParameters>({ required: true });
 
@@ -34,6 +31,7 @@ const props = defineProps({
     type: Array as PropType<string[]>,
     required: false,
   },
+  mapping: Object as PropType<Record<string, Record<string, string | number>>>,
 });
 const title = computed<string>(() => props.parameterGroup["title"]);
 const icon = computed<string>(() => props.parameterGroup["fa_icon"]);
@@ -63,6 +61,10 @@ function parameterRequired(
       ?.reduce((acc: boolean, val: string) => acc || val, false)
   );
 }
+
+function parameterId(parameterName: string): string {
+  return parameterName.replace(/\./g, "");
+}
 </script>
 
 <template>
@@ -101,61 +103,22 @@ function parameterRequired(
             >
               <font-awesome-icon :icon="parameter['fa_icon']" />
             </span>
-            <template
-              v-if="
-                parameter['type'] === 'number' ||
-                parameter['type'] === 'integer'
-              "
-            >
-              <!-- @vue-ignore -->
-              <parameter-number-input
-                :parameter-name="parameterName"
-                :parameter="parameter"
-                :help-id="parameterName + '-help'"
-                :required="parameterRequired(parameterGroup, parameterName)"
-                v-model="model[parameterName]"
-              />
-            </template>
-            <template v-else-if="parameter['type'] === 'boolean'">
-              <!-- @vue-ignore -->
-              <parameter-boolean-input
-                :parameter-name="parameterName"
-                :parameter="parameter"
-                :help-id="parameterName + '-help'"
-                v-model="model[parameterName]"
-              />
-            </template>
-            <template v-else-if="parameter['type'] === 'string'">
-              <!-- @vue-ignore -->
-              <template v-if="parameter['enum']">
-                <!-- @vue-ignore -->
-                <parameter-enum-input
-                  :parameter-name="parameterName"
-                  :parameter="parameter"
-                  :required="parameterRequired(parameterGroup, parameterName)"
-                  v-model="model[parameterName]"
-                />
-              </template>
-              <!-- @vue-ignore -->
-              <parameter-string-input
-                v-else
-                :parameter-name="parameterName"
-                :parameter="parameter"
-                :required="parameterRequired(parameterGroup, parameterName)"
-                v-model="model[parameterName]"
-                :remove-advanced="!showOptional"
-                :clowm-resource="resourceParameters?.includes(parameterName)"
-              />
-            </template>
+            <parameter-input
+              :parameter="parameter"
+              v-model="model[parameterName]"
+              :required="parameterRequired(parameterGroup, parameterName)"
+              border="secondary"
+              :resource-parameter="resourceParameters?.includes(parameterName)"
+              :allow-raw="showOptional"
+              :mapping="mapping?.[parameterName]"
+            />
             <span
               class="input-group-text cursor-pointer px-2 border border-secondary"
               v-if="parameter['help_text']"
               data-bs-toggle="collapse"
-              :data-bs-target="
-                '#helpCollapse' + parameterName.replace(/\./g, '')
-              "
+              :data-bs-target="'#help-collapse-' + parameterId(parameterName)"
               aria-expanded="false"
-              :aria-controls="'helpCollapse' + parameterName.replace(/\./g, '')"
+              :aria-controls="'help-collapse-' + parameterId(parameterName)"
             >
               <font-awesome-icon
                 class="cursor-pointer"
@@ -168,7 +131,7 @@ function parameterRequired(
           </label>
           <div
             class="collapse"
-            :id="'helpCollapse' + parameterName.replace(/\./g, '')"
+            :id="'help-collapse-' + parameterId(parameterName)"
             v-if="parameter['help_text']"
           >
             <div class="p-2 pb-0 mx-2 mb-3 flex-shrink-1 border rounded">
diff --git a/src/components/parameter-schema/form-mode/ParameterInput.vue b/src/components/parameter-schema/form-mode/ParameterInput.vue
new file mode 100644
index 0000000000000000000000000000000000000000..97c6b776925c8589774ea605fd5d91200ddcbfff
--- /dev/null
+++ b/src/components/parameter-schema/form-mode/ParameterInput.vue
@@ -0,0 +1,103 @@
+<script setup lang="ts">
+import { computed, ref } from "vue";
+import ParameterResourceInput from "@/components/parameter-schema/form-mode/ParameterResourceInput.vue";
+import ParameterNumberInput from "@/components/parameter-schema/form-mode/ParameterNumberInput.vue";
+import ParameterBooleanInput from "@/components/parameter-schema/form-mode/ParameterBooleanInput.vue";
+import ParameterEnumInput from "@/components/parameter-schema/form-mode/ParameterEnumInput.vue";
+import ParameterFileInput from "@/components/parameter-schema/form-mode/ParameterFileInput.vue";
+import ParameterStringInput from "@/components/parameter-schema/form-mode/ParameterStringInput.vue";
+import type { SizeModifierType, ExtendedColors } from "@/types/PropTypes";
+import ParameterMappingInput from "@/components/parameter-schema/form-mode/ParameterMappingInput.vue";
+
+const model = defineModel<number | string | boolean | undefined>({
+  required: true,
+});
+
+const rawInput = ref<boolean>(false);
+
+const props = defineProps<{
+  // eslint-disable-next-line @typescript-eslint/no-explicit-any
+  parameter: Record<string, any>;
+  required?: boolean;
+  resourceParameter?: boolean;
+  sizeModifier?: SizeModifierType;
+  border?: ExtendedColors;
+  allowRaw?: boolean;
+  forceRawFile?: boolean;
+  mapping?: Record<string, string | number>;
+}>();
+
+const parameterType = computed<string>(
+  () => props.parameter["type"] ?? "string",
+);
+</script>
+
+<template>
+  <parameter-mapping-input
+    v-if="mapping && Object.keys(mapping ?? {}).length > 0 && !rawInput"
+    v-model="model as string | number | undefined"
+    :required="required"
+    :size-modifier="sizeModifier"
+    :border="border"
+    :mapping="mapping"
+    :allow-raw="allowRaw"
+    @switch-to-raw="rawInput = true"
+  />
+  <parameter-number-input
+    v-else-if="parameterType === 'number' || parameterType === 'integer'"
+    :parameter="parameter"
+    v-model="model as number"
+    :required="required"
+    :size-modifier="sizeModifier"
+    :border="border"
+  />
+  <parameter-boolean-input
+    v-else-if="parameterType === 'boolean'"
+    :parameter="parameter"
+    v-model="model as boolean"
+    :border="border"
+  />
+  <parameter-enum-input
+    v-else-if="parameter['enum']"
+    :required="required"
+    :parameter="parameter"
+    v-model="model as string"
+    :size-modifier="sizeModifier"
+    :border="border"
+  />
+  <template v-else>
+    <parameter-resource-input
+      v-if="resourceParameter && !rawInput"
+      :parameter="parameter"
+      :required="required"
+      v-model="model as string"
+      :size-modifier="sizeModifier"
+      :border="border"
+      @switch-to-raw="rawInput = true"
+      :allow-raw="allowRaw"
+    />
+    <parameter-file-input
+      v-else-if="parameter['format'] && !rawInput && !forceRawFile"
+      :required="required"
+      :parameter="parameter"
+      v-model="model as string"
+      :size-modifier="sizeModifier"
+      :border="border"
+      @switch-to-raw="rawInput = true"
+      :allow-raw="allowRaw"
+    />
+    <parameter-string-input
+      v-else
+      :parameter="parameter"
+      :required="required"
+      v-model="model as string"
+      :size-modifier="sizeModifier"
+      :border="border"
+      :resource-parameter="resourceParameter"
+      :allow-switch="allowRaw"
+      @disable-raw="rawInput = false"
+    />
+  </template>
+</template>
+
+<style scoped></style>
diff --git a/src/components/parameter-schema/form-mode/ParameterMappingInput.vue b/src/components/parameter-schema/form-mode/ParameterMappingInput.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f8d8543b8d8c74b601c92e60ff84ecc4db904bbf
--- /dev/null
+++ b/src/components/parameter-schema/form-mode/ParameterMappingInput.vue
@@ -0,0 +1,56 @@
+<script setup lang="ts">
+import { computed } from "vue";
+import type { ExtendedColors, SizeModifierType } from "@/types/PropTypes";
+
+const model = defineModel<string | number | undefined>({ required: true });
+
+const props = defineProps<{
+  required?: boolean;
+  sizeModifier?: SizeModifierType;
+  border?: ExtendedColors;
+  mapping: Record<string, string | number>;
+  allowRaw?: boolean;
+}>();
+
+const emit = defineEmits<{
+  (e: "switch-to-raw"): void;
+}>();
+
+const dynamicCssClasses = computed<string[]>(() => {
+  const cssClasses = [];
+  if (props.sizeModifier) {
+    cssClasses.push(`form-select-${props.sizeModifier}`);
+  }
+  if (props.border) {
+    cssClasses.push("border", `border-${props.border}`);
+  }
+  return cssClasses;
+});
+</script>
+
+<template>
+  <select
+    v-model="model"
+    class="form-select"
+    :class="dynamicCssClasses"
+    :required="required"
+  >
+    <option
+      v-for="(val, paramOption) in mapping"
+      :key="paramOption"
+      :value="val"
+    >
+      {{ paramOption }}
+    </option>
+  </select>
+  <button
+    v-if="allowRaw"
+    type="button"
+    class="btn btn-outline-secondary"
+    @click="emit('switch-to-raw')"
+  >
+    Raw
+  </button>
+</template>
+
+<style scoped></style>
diff --git a/src/components/parameter-schema/form-mode/ParameterNumberInput.vue b/src/components/parameter-schema/form-mode/ParameterNumberInput.vue
index 0cc7ca60dd195a5c999b6570d88af7e85bb3b117..b8a429863492238b0d66e7996ca136f747deb8f1 100644
--- a/src/components/parameter-schema/form-mode/ParameterNumberInput.vue
+++ b/src/components/parameter-schema/form-mode/ParameterNumberInput.vue
@@ -1,4 +1,7 @@
 <script setup lang="ts">
+import { computed, type PropType } from "vue";
+import type { ExtendedColors, SizeModifierType } from "@/types/PropTypes";
+
 const model = defineModel<number | undefined>({ required: true });
 
 const props = defineProps({
@@ -10,19 +13,31 @@ const props = defineProps({
     },
   },
   required: Boolean,
-  parameterName: {
-    type: String,
-    required: true,
-  },
   helpId: {
     type: String,
   },
+  sizeModifier: {
+    type: String as PropType<SizeModifierType>,
+  },
+  border: String as PropType<ExtendedColors>,
+});
+
+const dynamicCssClasses = computed<string[]>(() => {
+  const cssClasses = [];
+  if (props.sizeModifier) {
+    cssClasses.push(`form-control-${props.sizeModifier}`);
+  }
+  if (props.border) {
+    cssClasses.push("border", `border-${props.border}`);
+  }
+  return cssClasses;
 });
 </script>
 
 <template>
   <input
-    class="form-control border border-secondary"
+    class="form-control flex-fill"
+    :class="dynamicCssClasses"
     type="number"
     :max="props.parameter['maximum']"
     :min="props.parameter['minimum']"
diff --git a/src/components/parameter-schema/form-mode/ParameterResourceInput.vue b/src/components/parameter-schema/form-mode/ParameterResourceInput.vue
new file mode 100644
index 0000000000000000000000000000000000000000..77a887ec3d48a53cfa2cc8d99e11d7043bdcd859
--- /dev/null
+++ b/src/components/parameter-schema/form-mode/ParameterResourceInput.vue
@@ -0,0 +1,227 @@
+<script setup lang="ts">
+import { Status } from "@/client/resource";
+import { computed, onMounted, reactive, watch } from "vue";
+import { useResourceStore } from "@/stores/resources";
+import type { ExtendedColors, SizeModifierType } from "@/types/PropTypes";
+
+const model = defineModel<string | undefined>({
+  required: true,
+});
+
+const resourceRegex = /CLDB-([\da-f]{32})\/(latest|[\da-f]{32})([/\S]*)/g;
+
+const props = defineProps<{
+  // eslint-disable-next-line @typescript-eslint/no-explicit-any
+  parameter: Record<string, any>;
+  required?: boolean;
+  sizeModifier?: SizeModifierType;
+  border?: ExtendedColors;
+  allowRaw?: boolean;
+}>();
+
+const emit = defineEmits<{
+  (e: "switch-to-raw"): void;
+}>();
+
+const resourceRepository = useResourceStore();
+const randomIDSuffix = Math.random().toString(16).substring(2, 8);
+
+type ResourcePath = {
+  resource_id: string;
+  resource_version_id: string;
+  suffix?: string;
+};
+
+const resource = reactive<ResourcePath>({
+  resource_id: "",
+  resource_version_id: "",
+  suffix: undefined,
+});
+
+const helpTextPresent = computed<boolean>(() => props.parameter["help_text"]);
+
+const baseDynamicClass = computed<string[]>(() =>
+  props.border ? ["border", `border-${props.border}`] : [],
+);
+
+const selectDynamicClass = computed<string[]>(() => {
+  const cssClasses = [...baseDynamicClass.value];
+  if (props.sizeModifier) {
+    cssClasses.push(`form-select-${props.sizeModifier}`);
+  }
+  return cssClasses;
+});
+const inputDynamicClass = computed<string[]>(() => {
+  const cssClasses = [...baseDynamicClass.value];
+  if (props.sizeModifier) {
+    cssClasses.push(`form-control-${props.sizeModifier}`);
+  }
+  if (!helpTextPresent.value && !props.allowRaw) {
+    cssClasses.push("rounded-end");
+  }
+  return cssClasses;
+});
+
+function updateResourceId(rid: string) {
+  resource.resource_id = rid;
+  resource.resource_version_id = "";
+  model.value = translateToModel();
+}
+
+function updateResourceVersionId(rvid: string) {
+  resource.resource_version_id = rvid;
+  model.value = translateToModel();
+  resourceRepository.fetchResourceTree(resource.resource_id, rvid);
+}
+
+watch(model, (newVal, oldVal) => {
+  if (newVal != oldVal && newVal !== translateToModel()) {
+    parseModel(newVal);
+  }
+});
+
+function parseModel(val?: string) {
+  if (val == undefined || val.length === 0) {
+    Object.assign(resource, {
+      resource_id: "",
+      resource_version_id: "",
+      suffix: undefined,
+    });
+  } else {
+    const match = resourceRegex.exec(val);
+    if (match) {
+      const tempResource: ResourcePath = {
+        resource_id: "",
+        resource_version_id: "",
+      };
+      tempResource.resource_id = hexToUUID(match[1]);
+      tempResource.suffix = match[3];
+      tempResource.resource_version_id =
+        match[2].length === 32
+          ? hexToUUID(match[2])
+          : resourceRepository.getLatestVersion(resource.resource_id);
+      if (
+        resourceRepository.resourceMapping[tempResource.resource_id] ==
+          undefined ||
+        resourceRepository.versionMapping[tempResource.resource_version_id] ==
+          undefined
+      ) {
+        // Missing resource
+        emit("switch-to-raw");
+        return;
+      }
+      Object.assign(resource, tempResource);
+    } else {
+      // Not resource path
+      emit("switch-to-raw");
+    }
+  }
+}
+
+function hexToUUID(hex?: string): string {
+  if (hex) {
+    return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
+  }
+  return "";
+}
+
+watch(
+  () => resource.suffix,
+  (newVal, oldVal) => {
+    if (newVal !== oldVal) {
+      model.value = translateToModel();
+    }
+  },
+);
+
+function translateToModel(): string {
+  if (resource.resource_version_id.length === 0) {
+    return "";
+  }
+  let val =
+    resourceRepository.versionMapping[resource.resource_version_id]
+      ?.cluster_path ?? "";
+  if (resource.suffix != undefined && val.length > 0) {
+    val = val + resource.suffix;
+  }
+  return val;
+}
+
+onMounted(() => {
+  parseModel(model.value);
+});
+</script>
+
+<template>
+  <select
+    class="form-select"
+    :class="selectDynamicClass"
+    :required="props.required"
+    :value="resource.resource_id"
+    @change="
+      (event) => updateResourceId((event.target as HTMLSelectElement)?.value)
+    "
+  >
+    >
+    <option selected disabled value="">Please select a resource</option>
+    <option
+      v-for="resource in resourceRepository.resources"
+      :key="resource.resource_id"
+      :value="resource.resource_id"
+    >
+      {{ resource.name }}
+    </option>
+  </select>
+  <select
+    class="form-select"
+    :class="selectDynamicClass"
+    :required="resource.resource_id.length > 0"
+    :value="resource.resource_version_id"
+    @change="
+      (event) =>
+        updateResourceVersionId((event.target as HTMLSelectElement)?.value)
+    "
+    :disabled="resource.resource_id.length === 0"
+  >
+    <option disabled selected value="">Please select a version</option>
+    <option
+      v-for="version in resourceRepository.resourceMapping[resource.resource_id]
+        ?.versions ?? []"
+      :key="version.resource_version_id"
+      :value="version.resource_version_id"
+    >
+      {{ version.release }}
+      {{ version.status === Status.LATEST ? "- Latest" : "" }}
+    </option>
+  </select>
+  <input
+    type="text"
+    class="form-control"
+    :class="inputDynamicClass"
+    placeholder="/optional/path/in/resource/..."
+    minlength="2"
+    maxlength="256"
+    pattern="\/\S*"
+    v-model="resource.suffix"
+    :list="'resource-tree-options-' + randomIDSuffix"
+  />
+  <datalist :id="'resource-tree-options-' + randomIDSuffix">
+    <option
+      v-for="file in resourceRepository.resourceTreeList[
+        resource.resource_version_id
+      ] ?? []"
+      :value="file"
+      :key="file"
+    />
+  </datalist>
+  <button
+    v-if="allowRaw"
+    type="button"
+    class="btn btn-outline-secondary"
+    @click="emit('switch-to-raw')"
+  >
+    Raw
+  </button>
+</template>
+
+<style scoped></style>
diff --git a/src/components/parameter-schema/form-mode/ParameterStringInput.vue b/src/components/parameter-schema/form-mode/ParameterStringInput.vue
index a41cc04f692ad9733e06bba04c1fa0ae2697c061..e1b8dae2b429132520ac7e6c8bedd4b8bdf6e391 100644
--- a/src/components/parameter-schema/form-mode/ParameterStringInput.vue
+++ b/src/components/parameter-schema/form-mode/ParameterStringInput.vue
@@ -1,291 +1,76 @@
 <script setup lang="ts">
-import { computed, watch, onMounted, reactive, ref } from "vue";
-import { useBucketStore } from "@/stores/buckets";
-import { useS3ObjectStore } from "@/stores/s3objects";
-import { useResourceStore } from "@/stores/resources";
-import { Status } from "@/client/resource";
-
-const bucketRepository = useBucketStore();
-const s3objectRepository = useS3ObjectStore();
-const resourceRepository = useResourceStore();
-const randomIDSuffix = Math.random().toString(16).substring(2, 8);
+import { computed, type PropType, ref } from "vue";
+import type { ExtendedColors, SizeModifierType } from "@/types/PropTypes";
 
+const model = defineModel<string | undefined>({ required: true });
 const props = defineProps({
   parameter: {
     type: Object,
     required: true,
     validator(value: Record<string, never>) {
-      return "string" === value["type"] && value["enum"];
+      return "string" === value["type"];
     },
   },
   required: Boolean,
-  parameterName: {
-    type: String,
-    required: true,
-  },
-  modelValue: {
-    type: String,
-  },
   helpId: {
     type: String,
   },
-  removeAdvanced: {
-    type: Boolean,
-    default: false,
-  },
-  clowmResource: {
-    type: Boolean,
-    default: false,
+  sizeModifier: {
+    type: String as PropType<SizeModifierType>,
   },
+  border: String as PropType<ExtendedColors>,
+  resourceParameter: Boolean,
+  allowSwitch: Boolean,
 });
 
 const emit = defineEmits<{
-  (e: "update:modelValue", value?: string): void;
+  (e: "disable-raw"): void;
 }>();
 
-const s3Path = reactive<{
-  bucket: string;
-  key?: string;
-}>({
-  bucket: "",
-  key: undefined,
+const fileOrResource = computed<boolean>(() => {
+  return (
+    (props.resourceParameter || props.parameter["format"]) && props.allowSwitch
+  );
 });
 
-const selectedResource = reactive<{
-  resourceId: string;
-  resourceVersionIndex: number;
-}>({
-  resourceId: "",
-  resourceVersionIndex: 0,
-});
-
-const formState = reactive<{
-  advancedInput: boolean;
-  stringVal?: string;
-}>({
-  advancedInput: false,
-  stringVal: undefined,
-});
-
-const stringInput = ref<HTMLInputElement | undefined>(undefined);
-const pattern = computed<string>(() => props.parameter["pattern"]);
-const dataFormat = computed<string | undefined>(
-  () => props.parameter["format"],
-);
-const dataPath = computed<boolean>(() => dataFormat.value != undefined);
-const clowmResource = computed<boolean>(() => props.clowmResource ?? false);
-const helpTextPresent = computed<boolean>(() => props.parameter["help_text"]);
-
-const filesInBucket = computed<string[]>(() =>
-  (s3objectRepository.objectMapping[s3Path.bucket ?? ""] ?? [])
-    .filter((obj) => !obj.Key?.endsWith("/"))
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    .map((obj) => obj.Key!),
-);
-
-const foldersInBucket = computed<string[]>(() =>
-  (s3objectRepository.objectMapping[s3Path.bucket ?? ""] ?? [])
-    .filter((obj) => obj.Key != undefined)
-    .map((obj) => {
-      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-      const parts = obj.Key!.split("/");
-      return parts
-        .slice(0, parts.length - 1)
-        .map((part, index) =>
-          parts.slice(0, index + 1).reduce((acc, val) => `${acc}/${val}`),
-        );
-    })
-    .flat()
-    .filter((val, index, array) => array.indexOf(val) === index),
-);
-
-const filesAndFoldersInBucket = computed<string[]>(() =>
-  filesInBucket.value.concat(foldersInBucket.value),
-);
-
-const keyDataList = computed<string[]>(() => {
-  switch (dataFormat.value) {
-    case "file-path":
-      return filesInBucket.value;
-    case "directory-path":
-      return foldersInBucket.value;
-    case "path":
-      return filesAndFoldersInBucket.value;
-    default:
-      return [];
+const dynamicCssClass = computed<string[]>(() => {
+  const cssClasses = [];
+  if (props.sizeModifier) {
+    cssClasses.push(`form-control-${props.sizeModifier}`);
   }
-});
-
-watch(s3Path, () => {
-  if (dataPath.value && !formState.advancedInput) {
-    updateStringFromS3();
+  if (!helpTextPresent.value && !fileOrResource.value) {
+    cssClasses.push("rounded-end");
   }
-});
-
-watch(
-  () => s3Path.bucket,
-  (newVal, oldVal) => {
-    if (newVal !== oldVal) {
-      updateKeysInBucket(newVal);
-    }
-  },
-);
-
-watch(() => formState.stringVal, updateValue);
-watch(selectedResource, () => {
-  if (clowmResource.value && !formState.advancedInput) {
-    updateStringFromResource();
+  if (props.border) {
+    cssClasses.push("border", `border-${props.border}`);
   }
+  return cssClasses;
 });
 
-watch(
-  () => props.modelValue,
-  (newVal) => {
-    if (formState.stringVal != newVal) {
-      formState.stringVal = newVal;
-      formState.advancedInput = true;
-    }
-  },
-);
-
-watch(
-  () => formState.advancedInput,
-  (newVal, oldValue) => {
-    if (newVal != oldValue && !newVal) {
-      if (clowmResource.value) {
-        updateStringFromResource();
-      } else if (dataPath.value) {
-        updateStringFromS3();
-      }
-    }
-  },
-);
-
-function updateValue() {
-  emit("update:modelValue", formState.stringVal);
-}
-
-function updateStringFromS3() {
-  formState.stringVal = !s3Path.bucket
-    ? undefined
-    : `s3://${s3Path.bucket}${s3Path.key ? "/" + s3Path.key : ""}`;
-}
-
-function updateStringFromResource() {
-  formState.stringVal =
-    resourceRepository.resourceMapping[selectedResource.resourceId]?.versions[
-      selectedResource.resourceVersionIndex
-    ]?.cluster_path ?? undefined;
-}
-
-function updateKeysInBucket(bucketName?: string) {
-  if (bucketName != null) {
-    s3objectRepository.fetchS3Objects(
-      bucketName,
-      bucketRepository.ownPermissions[bucketName]?.file_prefix ?? undefined,
-    );
-  }
-}
-
-onMounted(() => {
-  formState.stringVal = props.modelValue;
-  if (formState.stringVal) {
-    formState.advancedInput = true;
-  }
-});
+const stringInput = ref<HTMLInputElement | undefined>(undefined);
+const pattern = computed<string>(() => props.parameter["pattern"]);
+const helpTextPresent = computed<boolean>(() => props.parameter["help_text"]);
 </script>
 
 <template>
-  <template v-if="clowmResource && !formState.advancedInput">
-    <select
-      class="form-select border border-secondary"
-      :required="props.required"
-      v-model="selectedResource.resourceId"
-    >
-      <option selected disabled value="">Please select a resource</option>
-      <option
-        v-for="resource in resourceRepository.resources"
-        :key="resource.resource_id"
-        :value="resource.resource_id"
-      >
-        {{ resource.name }}
-      </option>
-    </select>
-    <select
-      class="form-select border border-secondary"
-      :class="{ 'rounded-end': props.removeAdvanced && !helpTextPresent }"
-      :required="props.required || selectedResource.resourceId != undefined"
-      v-model="selectedResource.resourceVersionIndex"
-      :disabled="selectedResource.resourceId.length === 0"
-    >
-      <option disabled>Please select a version</option>
-      <option
-        v-for="(version, index) in resourceRepository.resourceMapping[
-          selectedResource.resourceId
-        ]?.versions ?? []"
-        :key="version.resource_version_id"
-        :value="index"
-      >
-        {{ version.release }}
-        {{ version.status === Status.LATEST ? "- Latest" : "" }}
-      </option>
-    </select>
-  </template>
-  <template v-else-if="dataPath && !formState.advancedInput">
-    <select
-      class="form-select border border-secondary"
-      :required="props.required"
-      v-model="s3Path.bucket"
-    >
-      <option selected disabled value="">Please select a bucket</option>
-      <option
-        v-for="bucket in bucketRepository.ownBucketsAndFullPermissions"
-        :key="bucket"
-        :value="bucket"
-      >
-        {{ bucket }}
-      </option>
-    </select>
-    <input
-      class="form-control border-top border-secondary"
-      :list="'datalistOptions2' + randomIDSuffix"
-      :class="{ 'rounded-end': props.removeAdvanced && !helpTextPresent }"
-      placeholder="Type to search in bucket..."
-      :required="props.required && dataFormat === 'file-path'"
-      v-model="s3Path.key"
-      :pattern="pattern"
-    />
-    <datalist :id="'datalistOptions2' + randomIDSuffix">
-      <option v-for="obj in keyDataList" :value="obj" :key="obj" />
-    </datalist>
-  </template>
-  <template v-else>
-    <input
-      ref="stringInput"
-      class="form-control border border-secondary"
-      :class="{ 'rounded-end': props.removeAdvanced && !helpTextPresent }"
-      type="text"
-      v-model="formState.stringVal"
-      :required="props.required"
-      :aria-describedby="props.helpId"
-      :pattern="pattern"
-    />
-  </template>
-  <div v-if="(clowmResource || dataPath) && !props.removeAdvanced">
-    <input
-      type="checkbox"
-      class="btn-check"
-      :id="'flexCheckDefault' + randomIDSuffix"
-      autocomplete="off"
-      v-model="formState.advancedInput"
-    />
-    <label
-      class="btn btn-outline-secondary rounded-0"
-      :class="{ 'rounded-end': !helpTextPresent }"
-      :for="'flexCheckDefault' + randomIDSuffix"
-      >Advanced</label
-    >
-  </div>
+  <input
+    ref="stringInput"
+    class="form-control"
+    :class="dynamicCssClass"
+    type="text"
+    v-model="model"
+    :required="props.required"
+    :aria-describedby="props.helpId"
+    :pattern="pattern"
+  />
+  <button
+    v-if="fileOrResource"
+    type="button"
+    class="btn btn-secondary"
+    @click="emit('disable-raw')"
+  >
+    Raw
+  </button>
 </template>
 
 <style scoped></style>
diff --git a/src/components/resources/modals/UploadResourceInfoModal.vue b/src/components/resources/modals/UploadResourceInfoModal.vue
index 4ea9f5d9c1fed60beef7a773859a84811aa0b337..6e2cefdf4276442a614cff647cea39639b1905cc 100644
--- a/src/components/resources/modals/UploadResourceInfoModal.vue
+++ b/src/components/resources/modals/UploadResourceInfoModal.vue
@@ -137,7 +137,7 @@ onMounted(() => {
   <bootstrap-modal
     :modalId="props.modalId"
     modal-label="Upload Resource Info Modal"
-    sizeModifier="lg"
+    sizeModifierModal="lg"
     :track-modal-value="resourceVersion?.resource_version_id"
   >
     <template #header>How to upload a resource to the cluster</template>
diff --git a/src/components/workflows/WorkflowWithVersionsCard.vue b/src/components/workflows/WorkflowWithVersionsCard.vue
index 1afe153268f3556139471f3abe4cf5d277dcd90a..d69290f4af2202deca6798ce34d38e7ccf2932c6 100644
--- a/src/components/workflows/WorkflowWithVersionsCard.vue
+++ b/src/components/workflows/WorkflowWithVersionsCard.vue
@@ -128,7 +128,7 @@ onMounted(() => {
         <div class="btn-group">
           <button
             type="button"
-            class="btn btn-success"
+            class="btn btn-outline-success"
             :class="{ disabled: props.loading }"
             @click="emit('workflow-update-click', props.workflow)"
             data-bs-toggle="modal"
@@ -138,8 +138,7 @@ onMounted(() => {
           </button>
           <button
             type="button"
-            class="btn btn-success dropdown-toggle dropdown-toggle-split"
-            style="filter: brightness(85%)"
+            class="btn btn-outline-success dropdown-toggle dropdown-toggle-split"
             data-bs-toggle="dropdown"
             aria-expanded="false"
           >
@@ -325,6 +324,24 @@ onMounted(() => {
                         >Update icon</a
                       >
                     </li>
+                    <li>
+                      <router-link
+                        class="dropdown-item"
+                        :to="{
+                          name: 'workflow-parameter-translation',
+                          params: {
+                            workflowId: props.workflow.workflow_id,
+                            versionId: version.workflow_version_id,
+                          },
+                        }"
+                      >
+                        <template v-if="version.parameter_extension"
+                          >Update</template
+                        >
+                        <template v-else>Add</template>
+                        Parameter Translation
+                      </router-link>
+                    </li>
                   </ul>
                 </td>
               </tr>
diff --git a/src/router/workflowRoutes.ts b/src/router/workflowRoutes.ts
index 5eb83dbb0a380052ba031e92b649b32165b5f32a..a0e896ace2c23cd89da536367b10d41500e8536c 100644
--- a/src/router/workflowRoutes.ts
+++ b/src/router/workflowRoutes.ts
@@ -80,7 +80,6 @@ export const workflowRoutes: RouteRecordRaw[] = [
         props: (route) => ({
           versionId: route.params.versionId,
           workflowId: route.params.workflowId,
-          activeTab: route.query.tab ?? "description",
           workflowModeId: route.query.workflowModeId ?? undefined,
         }),
       },
@@ -97,4 +96,14 @@ export const workflowRoutes: RouteRecordRaw[] = [
       },
     ],
   },
+  {
+    path: "workflows/:workflowId/version/:versionId/parameters",
+    name: "workflow-parameter-translation",
+    component: () =>
+      import("../views/workflows/CreateParameterTranslationView.vue"),
+    props: (route) => ({
+      versionId: route.params.versionId,
+      workflowId: route.params.workflowId,
+    }),
+  },
 ];
diff --git a/src/stores/resources.ts b/src/stores/resources.ts
index 9cf76887aa3cb7021eef57a1bf56cbf0787a0c2c..61fb1e9f27fb68fc05f87587b2736712fe3a58cc 100644
--- a/src/stores/resources.ts
+++ b/src/stores/resources.ts
@@ -1,5 +1,6 @@
 import { defineStore } from "pinia";
 import type {
+  FileTree,
   ResourceIn,
   ResourceOut,
   ResourceVersionIn,
@@ -16,6 +17,21 @@ import {
 import { useAuthStore } from "@/stores/users";
 import { useNameStore } from "@/stores/names";
 
+function parseFileTree(parent: string, tree?: FileTree | null): string[] {
+  if (tree == undefined || tree.contents == undefined) {
+    return [];
+  }
+  let files: string[] = [];
+  const currentName = parent.length > 0 ? parent + tree.name + "/" : "/";
+  for (const dir of tree.contents) {
+    files.push(currentName + dir.name);
+    if (dir.type === "directory") {
+      files = files.concat(parseFileTree(currentName, dir));
+    }
+  }
+  return files;
+}
+
 export const useResourceStore = defineStore({
   id: "resources",
   state: () =>
@@ -24,18 +40,42 @@ export const useResourceStore = defineStore({
       ownResourceMapping: {},
       reviewableResourceMapping: {},
       syncRequestMapping: {},
+      resourceTree: {},
+      resourceTreeList: {},
       __syncRequestsFetched: false,
     }) as {
       resourceMapping: Record<string, ResourceOut>;
       ownResourceMapping: Record<string, ResourceOut>;
       reviewableResourceMapping: Record<string, ResourceOut>;
       syncRequestMapping: Record<string, UserSynchronizationRequestOut>;
+      resourceTree: Record<string, FileTree | null>;
+      resourceTreeList: Record<string, string[]>;
       __syncRequestsFetched: boolean;
     },
   getters: {
     resources(): ResourceOut[] {
       return Object.values(this.resourceMapping);
     },
+    versionMapping(): Record<string, ResourceVersionOut> {
+      const mapping: Record<string, ResourceVersionOut> = {};
+      for (const resource of this.resources) {
+        for (const version of resource.versions) {
+          mapping[version.resource_version_id] = version;
+        }
+      }
+      return mapping;
+    },
+    getLatestVersion(): (resource_id: string) => string {
+      return (resource_id) => {
+        for (const version of this.resourceMapping[resource_id]?.versions ??
+          []) {
+          if (version.status === Status.LATEST) {
+            return version.resource_version_id;
+          }
+        }
+        return "";
+      };
+    },
     ownResources(): ResourceOut[] {
       return Object.values(this.ownResourceMapping);
     },
@@ -109,6 +149,32 @@ export const useResourceStore = defineStore({
         return resources;
       });
     },
+    fetchResourceTree(
+      resource_id: string,
+      resource_version_id: string,
+      onFinally?: () => void,
+    ): Promise<FileTree> {
+      if (this.resourceTree[resource_version_id] === null) {
+        onFinally?.();
+      }
+      return ResourceVersionService.resourceVersionResourceFileTree(
+        resource_version_id,
+        resource_id,
+      )
+        .then((tree) => {
+          this.resourceTree[resource_version_id] = tree[0];
+          this.resourceTreeList[resource_version_id] = parseFileTree(
+            "",
+            tree[0],
+          );
+          return tree;
+        })
+        .catch((err) => {
+          this.resourceTree[resource_version_id] = null;
+          return err;
+        })
+        .finally(onFinally);
+    },
     fetchReviewableResources(onFinally?: () => void): Promise<ResourceOut[]> {
       if (Object.keys(this.reviewableResourceMapping).length > 0) {
         onFinally?.();
diff --git a/src/stores/workflows.ts b/src/stores/workflows.ts
index b094280840e4f9f43ae78d36e712c47d2e4b8e6e..d200f3ebe23b5a29c179ebce31d5e958c9ea92e1 100644
--- a/src/stores/workflows.ts
+++ b/src/stores/workflows.ts
@@ -2,6 +2,7 @@ import { defineStore } from "pinia";
 import type {
   Body_Workflow_Version_upload_workflow_version_icon,
   IconUpdateOut,
+  ParameterExtension,
   WorkflowCredentialsIn,
   WorkflowIn,
   WorkflowModeOut,
@@ -63,6 +64,15 @@ export const useWorkflowStore = defineStore({
       }
       return mapping;
     },
+    ownVersionMapping(): Record<string, WorkflowVersion> {
+      const mapping: Record<string, WorkflowVersion> = {};
+      for (const workflow of this.ownWorkflows) {
+        for (const version of workflow.versions) {
+          mapping[version.workflow_version_id] = version;
+        }
+      }
+      return mapping;
+    },
     getArbitraryWorkflow(): (wid: string) => Promise<WorkflowIn | undefined> {
       return (wid: string) => get(wid);
     },
@@ -71,6 +81,15 @@ export const useWorkflowStore = defineStore({
     __addNameToMapping(key: string, value: string) {
       useNameStore().addNameToMapping(key, value);
     },
+    fetchWorkflowVersion(wid: string, vid: string): Promise<WorkflowVersion> {
+      return WorkflowVersionService.workflowVersionGetWorkflowVersion(
+        vid,
+        wid,
+      ).then((version) => {
+        this.__addNameToMapping(version.workflow_version_id, version.version);
+        return version;
+      });
+    },
     fetchWorkflows(onFinally?: () => void): Promise<WorkflowOut[]> {
       if (Object.keys(this.workflowMapping).length > 0) {
         onFinally?.();
@@ -516,5 +535,88 @@ export const useWorkflowStore = defineStore({
         }
       });
     },
+    updateWorkflowExtension(
+      workflow_id: string,
+      version_id: string,
+      extension: ParameterExtension,
+    ): Promise<WorkflowVersion> {
+      return WorkflowVersionService.workflowVersionUpdateWorkflowVersionParameterExtension(
+        workflow_id,
+        version_id,
+        extension,
+      ).then((version) => {
+        // Update version in workflowMapping
+        if (this.workflowMapping[workflow_id] == undefined) {
+          this.fetchWorkflow(workflow_id, false);
+        } else {
+          const versionIndex1 = this.workflowMapping[
+            workflow_id
+          ].versions.findIndex(
+            (version) => version.workflow_version_id == version_id,
+          );
+          if (versionIndex1 > -1) {
+            this.workflowMapping[workflow_id].versions[versionIndex1] = version;
+          }
+        }
+
+        // Update version in comprehensiveWorkflowMapping
+        if (this.comprehensiveWorkflowMapping[workflow_id] == undefined) {
+          this.fetchWorkflow(workflow_id, true);
+        } else {
+          const versionIndex2 = this.comprehensiveWorkflowMapping[
+            workflow_id
+          ].versions.findIndex(
+            (version) => version.workflow_version_id == version_id,
+          );
+          if (versionIndex2 > -1) {
+            this.comprehensiveWorkflowMapping[workflow_id].versions[
+              versionIndex2
+            ] = version;
+          }
+        }
+        return version;
+      });
+    },
+    deleteWorkflowExtension(
+      workflow_id: string,
+      version_id: string,
+    ): Promise<void> {
+      return WorkflowVersionService.workflowVersionDeleteWorkflowVersionParameterExtension(
+        workflow_id,
+        version_id,
+      ).then(() => {
+        // Update version in workflowMapping
+        if (this.workflowMapping[workflow_id] == undefined) {
+          this.fetchWorkflow(workflow_id, false);
+        } else {
+          const versionIndex1 = this.workflowMapping[
+            workflow_id
+          ].versions.findIndex(
+            (version) => version.workflow_version_id == version_id,
+          );
+          if (versionIndex1 > -1) {
+            this.workflowMapping[workflow_id].versions[
+              versionIndex1
+            ].parameter_extension = undefined;
+          }
+        }
+
+        // Update version in comprehensiveWorkflowMapping
+        if (this.comprehensiveWorkflowMapping[workflow_id] == undefined) {
+          this.fetchWorkflow(workflow_id, true);
+        } else {
+          const versionIndex2 = this.comprehensiveWorkflowMapping[
+            workflow_id
+          ].versions.findIndex(
+            (version) => version.workflow_version_id == version_id,
+          );
+          if (versionIndex2 > -1) {
+            this.comprehensiveWorkflowMapping[workflow_id].versions[
+              versionIndex2
+            ].parameter_extension = undefined;
+          }
+        }
+      });
+    },
   },
 });
diff --git a/src/types/PropTypes.ts b/src/types/PropTypes.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0873c6240a53ef06c1e73f5a1a35e8cf7d82b673
--- /dev/null
+++ b/src/types/PropTypes.ts
@@ -0,0 +1,20 @@
+export type SizeModifierType = "sm" | "lg";
+
+export type Colors =
+  | "primary"
+  | "secondary"
+  | "success"
+  | "warning"
+  | "danger"
+  | "info"
+  | "black"
+  | "white";
+
+export type ExtendedColors =
+  | Colors
+  | "primary-subtle"
+  | "secondary-subtle"
+  | "success-subtle"
+  | "warning-subtle"
+  | "danger-subtle"
+  | "info-subtle";
diff --git a/src/types/WorkflowParameters.ts b/src/types/WorkflowParameters.ts
index 0fd1398d7ac811443f2966fdf3bc3f24098b492f..7201b000114dd8d46c704e8cf68a8526d61d3b0e 100644
--- a/src/types/WorkflowParameters.ts
+++ b/src/types/WorkflowParameters.ts
@@ -11,6 +11,6 @@ export type WorkflowMetaParameters = {
 };
 
 export type TemporaryParams = {
-  params: WorkflowParameters;
-  metaParams: WorkflowMetaParameters;
+  params?: WorkflowParameters;
+  metaParams?: WorkflowMetaParameters;
 };
diff --git a/src/views/workflows/CreateClowmInfoView.vue b/src/views/workflows/CreateClowmInfoView.vue
index 4c4261f4edd08479d4407c5c4ca52c3035185e38..a709e7d571208aa30a0fdf4a905f4eb4bec9dff2 100644
--- a/src/views/workflows/CreateClowmInfoView.vue
+++ b/src/views/workflows/CreateClowmInfoView.vue
@@ -7,6 +7,7 @@ import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
 import { useWorkflowStore } from "@/stores/workflows";
 import { DocumentationEnum } from "@/client/workflow";
 import DraggableLists from "@/components/DraggableLists.vue";
+import ParameterInput from "@/components/parameter-schema/form-mode/ParameterInput.vue";
 
 const props = defineProps<{
   workflow_id?: string;
@@ -362,21 +363,25 @@ onMounted(() => {
             on the user or execution environment.
           </p>
           <div
-            class="d-flex flex-wrap overflow-y-auto p-1 border rounded border-dashed mb-2"
+            class="d-flex flex-wrap overflow-y-auto p-1 border border-bottom-0 rounded-top border-dashed"
             style="max-height: 30vh"
-            v-if="parameterPools.examples.length > 0"
           >
             <b class="ms-1 w-100">Workflow parameters:</b>
-            <div
-              class="w-fit border px-2 rounded cursor-pointer m-1 parameter-container"
-              v-for="(param, index) in parameterPools.examples"
-              :key="param"
-              @click="addExampleParameter(param, index)"
-            >
-              {{ param }}
+            <template v-if="parameterPools.examples.length > 0">
+              <div
+                class="w-fit border px-2 rounded cursor-pointer m-1 parameter-container"
+                v-for="(param, index) in parameterPools.examples"
+                :key="param"
+                @click="addExampleParameter(param, index)"
+              >
+                {{ param }}
+              </div>
+            </template>
+            <div v-else class="px-2 text-secondary m-1">
+              <i>Empty</i>
             </div>
           </div>
-          <table class="table table-bordered">
+          <table class="table table-bordered align-middle">
             <thead>
               <tr>
                 <th scope="col"><b>Parameter</b></th>
@@ -390,73 +395,14 @@ onMounted(() => {
               >
                 <td style="width: 10%">{{ param }}</td>
                 <td class="d-flex justify-content-between align-items-center">
-                  <input
-                    v-if="
-                      getParameterType(param) === 'number' ||
-                      getParameterType(param) === 'integer'
-                    "
-                    type="number"
-                    class="form-control form-control-sm flex-grow"
-                    v-model="infoState.exampleParameters[param]"
-                    :step="getParameterType(param) === 'integer' ? 1 : 0.0001"
-                    :min="parameterSchema[param]['minimum']"
-                    :max="parameterSchema[param]['maximum']"
-                  />
-                  <div
-                    v-else-if="getParameterType(param) === 'boolean'"
-                    class="flex-grow"
-                  >
-                    <div class="form-check form-check-inline">
-                      <label
-                        class="form-check-label"
-                        :for="'trueOption' + param.replace(/\./g, '')"
-                        >True</label
-                      >
-                      <input
-                        class="form-check-input"
-                        type="radio"
-                        :name="'inlineRadioOptions' + param.replace(/\./g, '')"
-                        :id="'trueOption' + param.replace(/\./g, '')"
-                        :value="true"
-                        v-model="infoState.exampleParameters[param]"
-                      />
-                    </div>
-                    <div class="form-check form-check-inline">
-                      <input
-                        class="form-check-input"
-                        type="radio"
-                        :name="'inlineRadioOptions' + param.replace(/\./g, '')"
-                        :id="'falseOption' + param.replace(/\./g, '')"
-                        :value="false"
-                        v-model="infoState.exampleParameters[param]"
-                      />
-                      <label
-                        class="form-check-label"
-                        :for="'falseOption' + param.replace(/\./g, '')"
-                        >False</label
-                      >
-                    </div>
+                  <div class="flex-fill input-group">
+                    <parameter-input
+                      :parameter="parameterSchema[param]"
+                      v-model="infoState.exampleParameters[param]"
+                      size-modifier="sm"
+                      force-raw-file
+                    />
                   </div>
-                  <select
-                    v-else-if="parameterSchema[param]?.['enum']"
-                    class="form-select form-select-sm flex-grow"
-                    v-model="infoState.exampleParameters[param]"
-                  >
-                    <option
-                      v-for="option in parameterSchema[param]?.['enum']"
-                      :key="option"
-                      :value="option"
-                    >
-                      {{ option }}
-                    </option>
-                  </select>
-                  <input
-                    v-else
-                    type="text"
-                    class="form-control form-control-sm flex-grow"
-                    v-model="infoState.exampleParameters[param]"
-                    :pattern="parameterSchema[param]?.['pattern']"
-                  />
                   <button
                     type="button"
                     class="btn btn-outline-danger btn-sm ms-2"
diff --git a/src/views/workflows/CreateParameterTranslationView.vue b/src/views/workflows/CreateParameterTranslationView.vue
new file mode 100644
index 0000000000000000000000000000000000000000..fcc3083fe52935160a8539af1764baad5c96544b
--- /dev/null
+++ b/src/views/workflows/CreateParameterTranslationView.vue
@@ -0,0 +1,660 @@
+<script setup lang="ts">
+import { useNameStore } from "@/stores/names";
+import { useWorkflowStore } from "@/stores/workflows";
+import { computed, onMounted, reactive, ref, watch } from "vue";
+import { DocumentationEnum, type ParameterExtension } from "@/client/workflow";
+import type { ClowmInfo } from "@/types/ClowmInfo";
+import ParameterInput from "@/components/parameter-schema/form-mode/ParameterInput.vue";
+import BootstrapToast from "@/components/BootstrapToast.vue";
+import { Toast } from "bootstrap";
+import DeleteModal from "@/components/modals/DeleteModal.vue";
+
+// Props
+// =============================================================================
+const props = defineProps<{
+  versionId: string;
+  workflowId: string;
+}>();
+
+// HTML refs
+// =============================================================================
+const parameterExtensionForm = ref<HTMLFormElement | null>(null);
+let successToast: Toast | null = null;
+let deleteToast: Toast | null = null;
+
+// Repositories
+// =============================================================================
+const nameRepository = useNameStore();
+const workflowRepository = useWorkflowStore();
+
+// Reactive State
+// =============================================================================
+const parameterState = reactive<{
+  loading: boolean;
+  makingRequest: boolean;
+  extension: ParameterExtension;
+  resourceParametersDefault: Set<string>;
+  resourceParametersMapping: Set<string>;
+  mappingParameterValues: Record<string, string>;
+  formValidated: boolean;
+}>({
+  loading: true,
+  makingRequest: false,
+  extension: {},
+  resourceParametersDefault: new Set(),
+  resourceParametersMapping: new Set(),
+  mappingParameterValues: {},
+  formValidated: false,
+});
+
+const parameterPools = reactive<{
+  defaults: string[];
+  mapping: string[];
+}>({
+  defaults: [],
+  mapping: [],
+});
+
+// Watchers
+// =============================================================================
+watch(
+  () =>
+    workflowRepository.documentationFiles[props.versionId]?.parameter_schema,
+  (newVal, old) => {
+    if (newVal != old && newVal) {
+      updateParameterPools(newVal);
+    }
+  },
+);
+
+watch(
+  () => workflowRepository.documentationFiles[props.versionId]?.clowm_info,
+  (newVal, old) => {
+    if (newVal != old && newVal) {
+      updateResourceParameters(newVal);
+    }
+  },
+);
+
+// Computed States
+// =============================================================================
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+const parameterSchema = computed<Record<string, Record<string, any>>>(() => {
+  const schema =
+    workflowRepository.documentationFiles[props.versionId ?? ""]
+      ?.parameter_schema;
+  const a = schema?.["properties"] ?? {};
+  for (const group in schema?.["definitions"] ?? {}) {
+    for (const param in schema?.["definitions"]?.[group]?.["properties"] ??
+      {}) {
+      a[param] = schema["definitions"][group]["properties"][param];
+    }
+  }
+  return a;
+});
+
+// Functions
+// =============================================================================
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+function updateParameterPools(newVal?: object) {
+  if (newVal) {
+    const parameters = extractParameterList(newVal);
+    parameterPools.defaults = parameters.slice();
+    parameterPools.mapping = parameters.filter(
+      (param) =>
+        parameterSchema.value?.[param]?.["type"] !== "boolean" &&
+        !parameterSchema.value?.[param]?.["enum"],
+    );
+  }
+  if (
+    workflowRepository.ownVersionMapping[props.versionId]?.parameter_extension
+  ) {
+    parameterPools.defaults = parameterPools.defaults.filter(
+      (param) =>
+        workflowRepository.ownVersionMapping[props.versionId]
+          ?.parameter_extension?.defaults?.[param] == undefined,
+    );
+    parameterPools.mapping = parameterPools.mapping.filter(
+      (param) =>
+        workflowRepository.ownVersionMapping[props.versionId]
+          ?.parameter_extension?.defaults?.[param] == undefined,
+    );
+  }
+}
+
+function updateResourceParameters(newVal?: ClowmInfo) {
+  newVal?.resourceParameters?.forEach((param) => {
+    parameterState.resourceParametersDefault.add(param);
+    parameterState.resourceParametersMapping.add(param);
+  });
+}
+
+function submitForm() {
+  if (parameterState.extension?.mapping) {
+    for (const key of Object.keys(parameterState.extension.mapping)) {
+      if (Object.keys(parameterState.extension?.mapping[key]).length === 0) {
+        delete parameterState.extension?.mapping[key];
+        parameterPools.mapping.push(key);
+      }
+    }
+  }
+  parameterState.formValidated = true;
+  if (parameterExtensionForm.value?.checkValidity()) {
+    parameterState.makingRequest = true;
+    workflowRepository
+      .updateWorkflowExtension(
+        props.workflowId,
+        props.versionId,
+        parameterState.extension,
+      )
+      .then(() => {
+        successToast?.show();
+      })
+      .finally(() => {
+        parameterState.makingRequest = false;
+      });
+  }
+}
+
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+function extractParameterList(schema: Record<string, any>): string[] {
+  const groupedParameters = Object.keys(schema["definitions"] ?? {}).reduce(
+    (acc: string[], val) => [
+      ...acc,
+      ...Object.keys(schema["definitions"][val]["properties"]),
+    ],
+    [],
+  );
+  const singleParameters = Object.keys(schema["properties"] ?? {});
+  return [...groupedParameters, ...singleParameters];
+}
+
+function getParameterType(param: string): string | undefined {
+  return parameterSchema.value[param]?.["type"];
+}
+
+function getParameterSchemaDefault(
+  param: string,
+): string | boolean | number | undefined {
+  return parameterSchema.value[param]?.["default"];
+}
+
+function getParamDefault(param: string): string | boolean | number {
+  switch (getParameterType(param)) {
+    case "integer": {
+      return getParameterSchemaDefault(param) ?? 0;
+    }
+    case "number": {
+      return getParameterSchemaDefault(param) ?? 0;
+    }
+    case "boolean": {
+      return getParameterSchemaDefault(param) ?? true;
+    }
+    case "string": {
+      if (parameterState.resourceParametersDefault.has(param)) {
+        return "";
+      }
+      return (
+        getParameterSchemaDefault(param) ??
+        parameterSchema.value[param]?.["enum"]?.[0] ??
+        ""
+      );
+    }
+    default: {
+      return "";
+    }
+  }
+}
+
+function addDefaultParameter(param: string, index: number) {
+  parameterState.formValidated = false;
+  if (parameterState.extension.defaults == undefined) {
+    parameterState.extension.defaults = {};
+  }
+  parameterPools.defaults.splice(index, 1);
+  parameterState.extension.defaults[param] = getParamDefault(param);
+}
+
+function makeResourceParameterDefault(param: string) {
+  parameterState.formValidated = false;
+  parameterState.resourceParametersDefault.add(param);
+  parameterState.extension.defaults![param] = "";
+}
+
+function makeResourceParameterMapping(param: string, val: string) {
+  if (parameterState.extension.mapping?.[param]?.[val]) {
+    parameterState.formValidated = false;
+    parameterState.resourceParametersMapping.add(param);
+    parameterState.extension.mapping[param][val] = "";
+  }
+}
+
+function deleteDefaultParameter(param: string) {
+  if (
+    !workflowRepository.documentationFiles[
+      props.versionId
+    ]?.clowm_info?.resourceParameters?.includes(param)
+  ) {
+    parameterState.resourceParametersDefault.delete(param);
+  }
+  delete parameterState.extension.defaults?.[param];
+  parameterPools.defaults.push(param);
+  if (Object.keys(parameterState.extension.defaults ?? {}).length === 0) {
+    parameterState.extension.defaults = undefined;
+  }
+}
+
+function addMappingParameter(param: string, index: number) {
+  parameterState.formValidated = false;
+  if (parameterState.extension.mapping == undefined) {
+    parameterState.extension.mapping = {};
+  }
+  if (parameterState.extension.mapping[param] == undefined) {
+    parameterState.extension.mapping[param] = {};
+  }
+  parameterState.mappingParameterValues[param] = "";
+  if (index > -1) {
+    parameterPools.mapping.splice(index, 1);
+  }
+}
+
+function addMappingParameterValue(param: string, val: string) {
+  parameterState.formValidated = false;
+  if (parameterState.extension.mapping?.[param] != undefined) {
+    parameterState.extension.mapping[param][val] = getParamDefault(param) as
+      | string
+      | number;
+    parameterState.mappingParameterValues[param] = "";
+  }
+}
+
+function deleteMappingParameterValue(param: string, val: string) {
+  if (parameterState.extension.mapping?.[param]?.[val] != undefined) {
+    delete parameterState.extension.mapping[param][val];
+  }
+}
+
+function deleteMappingParameter(param: string) {
+  if (
+    !workflowRepository.documentationFiles[
+      props.versionId
+    ]?.clowm_info?.resourceParameters?.includes(param)
+  ) {
+    parameterState.resourceParametersMapping.delete(param);
+  }
+  delete parameterState.extension.mapping?.[param];
+  delete parameterState.mappingParameterValues[param];
+  parameterPools.mapping.push(param);
+  if (Object.keys(parameterState.extension.mapping ?? {}).length === 0) {
+    parameterState.extension.mapping = undefined;
+  }
+}
+
+function deleteParameterExtension() {
+  parameterState.makingRequest = true;
+  workflowRepository
+    .deleteWorkflowExtension(props.workflowId, props.versionId)
+    .then(() => {
+      parameterState.extension = {};
+      updateParameterPools(
+        workflowRepository.documentationFiles[props.versionId]
+          ?.parameter_schema,
+      );
+      updateResourceParameters(
+        workflowRepository.documentationFiles[props.versionId]?.clowm_info,
+      );
+      deleteToast?.show();
+    })
+    .finally(() => {
+      parameterState.makingRequest = false;
+    });
+}
+
+// Lifecycle Events
+// =============================================================================
+onMounted(() => {
+  successToast = new Toast("#save-parameter-extension-success-toast");
+  deleteToast = new Toast("#delete-parameter-extension-success-toast");
+  workflowRepository.fetchWorkflow(props.workflowId, true, () => {
+    parameterState.extension =
+      workflowRepository.ownVersionMapping[props.versionId]
+        ?.parameter_extension ?? {};
+    for (const param of Object.keys(parameterState.extension?.mapping ?? {})) {
+      for (const paramOption of Object.keys(
+        parameterState.extension?.mapping?.[param] ?? {},
+      )) {
+        if (
+          typeof parameterState.extension?.mapping?.[param]?.[paramOption] ===
+          "object"
+        ) {
+          parameterState.resourceParametersMapping.add(param);
+        }
+      }
+    }
+    workflowRepository
+      .fetchWorkflowDocumentation(
+        props.workflowId,
+        props.versionId,
+        DocumentationEnum.PARAMETER_SCHEMA,
+        workflowRepository.ownVersionMapping[props.versionId]?.modes?.[0],
+      )
+      .then(() =>
+        workflowRepository.fetchWorkflowDocumentation(
+          props.workflowId,
+          props.versionId,
+          DocumentationEnum.CLOWM_INFO,
+          workflowRepository.ownVersionMapping[props.versionId]?.modes?.[0],
+        ),
+      )
+      .finally(() => {
+        parameterState.loading = false;
+        updateParameterPools(
+          workflowRepository.documentationFiles[props.versionId]
+            ?.parameter_schema,
+        );
+        updateResourceParameters(
+          workflowRepository.documentationFiles[props.versionId]?.clowm_info,
+        );
+      });
+  });
+});
+</script>
+
+<template>
+  <bootstrap-toast
+    toast-id="save-parameter-extension-success-toast"
+    color-class="success"
+  >
+    <template #default>Successfully saved Parameter Extension</template>
+    <template #body>
+      <div class="d-grid gap-2">
+        <router-link
+          class="btn btn-info btn-sm"
+          role="button"
+          :to="{
+            name: 'workflow-start',
+            params: {
+              versionId: props.versionId,
+              workflowId: props.workflowId,
+            },
+            query: {
+              workflowModeId:
+                workflowRepository.ownVersionMapping[props.versionId]
+                  ?.modes?.[0],
+              viewMode: 'expert',
+            },
+          }"
+          >View
+        </router-link>
+      </div>
+    </template>
+  </bootstrap-toast>
+  <bootstrap-toast
+    toast-id="delete-parameter-extension-success-toast"
+    color-class="success"
+  >
+    Successfully deleted Parameter Extension
+  </bootstrap-toast>
+  <delete-modal
+    v-if="
+      workflowRepository.ownVersionMapping[props.versionId]?.parameter_extension
+    "
+    modal-id="delete-parameter-extension-modal"
+    :object-name-delete="`parameter extension of ${nameRepository.getName(props.workflowId)}@${nameRepository.getName(props.versionId)}`"
+    @confirm-delete="deleteParameterExtension"
+  />
+  <div class="d-flex justify-content-between border-bottom mb-4 pb-2">
+    <h2 class="w-fit">
+      Add parameter metadata to
+      {{ nameRepository.getName(props.workflowId) }}@{{
+        nameRepository.getName(props.versionId)
+      }}
+    </h2>
+    <div
+      v-if="
+        workflowRepository.ownVersionMapping[props.versionId]
+          ?.parameter_extension
+      "
+    >
+      <button
+        type="button"
+        class="btn btn-danger"
+        data-bs-toggle="modal"
+        data-bs-target="#delete-parameter-extension-modal"
+        :disabled="parameterState.loading || parameterState.makingRequest"
+      >
+        Delete
+      </button>
+    </div>
+  </div>
+  <div v-if="parameterState.loading" class="d-flex justify-content-center">
+    <div class="spinner-border" role="status">
+      <span class="visually-hidden">Loading...</span>
+    </div>
+  </div>
+  <form
+    v-else
+    ref="parameterExtensionForm"
+    id="parameter-extension-form"
+    class="mb-2"
+    :class="{ 'was-validated': parameterState.formValidated }"
+    novalidate
+    @submit.prevent="submitForm()"
+  >
+    <h3>CloWM instance specific default parameters</h3>
+    <div
+      class="d-flex flex-wrap overflow-y-auto p-1 border border-bottom-0 rounded-top border-dashed"
+      style="max-height: 30vh"
+    >
+      <b class="ms-1 w-100">Workflow parameters:</b>
+      <template v-if="parameterPools.defaults.length > 0">
+        <div
+          class="w-fit border px-2 rounded cursor-pointer m-1 parameter-container"
+          v-for="(param, index) in parameterPools.defaults"
+          :key="param"
+          @click="addDefaultParameter(param, index)"
+        >
+          {{ param }}
+        </div>
+      </template>
+      <div v-else class="px-2 text-secondary m-1">
+        <i>Empty</i>
+      </div>
+    </div>
+    <table class="table table-bordered align-middle">
+      <thead>
+        <tr>
+          <th scope="col"><b>Parameter</b></th>
+          <th scope="col"><b>Value</b></th>
+        </tr>
+      </thead>
+      <tbody v-if="parameterState.extension.defaults" id="defaultParamsTable">
+        <tr
+          v-for="param in Object.keys(parameterState.extension.defaults)"
+          :key="param"
+        >
+          <td style="width: 10%">{{ param }}</td>
+          <td class="d-flex justify-content-between align-items-center">
+            <div class="flex-fill input-group">
+              <parameter-input
+                :parameter="parameterSchema[param]"
+                v-model="parameterState.extension.defaults[param]"
+                size-modifier="sm"
+                :resource-parameter="
+                  parameterState.resourceParametersDefault.has(param)
+                "
+                force-raw-file
+              />
+            </div>
+            <button
+              v-if="
+                !parameterState.resourceParametersDefault.has(param) &&
+                getParameterType(param) === 'string'
+              "
+              class="btn btn-primary btn-sm ms-2"
+              type="button"
+              @click="makeResourceParameterDefault(param)"
+            >
+              Resource
+            </button>
+            <button
+              type="button"
+              class="btn btn-outline-danger btn-sm ms-2"
+              @click="deleteDefaultParameter(param)"
+            >
+              Remove
+            </button>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+    <h3>Parameter Translation</h3>
+    <div
+      class="d-flex flex-wrap overflow-y-auto p-1 border rounded-top border-dashed"
+      style="max-height: 30vh"
+    >
+      <b class="ms-1 w-100">Eligible workflow parameters:</b>
+      <template v-if="parameterPools.mapping.length > 0">
+        <div
+          class="w-fit border px-2 rounded cursor-pointer m-1 parameter-container"
+          v-for="(param, index) in parameterPools.mapping"
+          :key="param"
+          @click="addMappingParameter(param, index)"
+        >
+          {{ param }}
+        </div>
+      </template>
+      <div v-else class="px-2 text-secondary m-1">
+        <i>Empty</i>
+      </div>
+    </div>
+    <div v-if="parameterState.extension.mapping" class="p-0">
+      <div
+        v-for="param in Object.keys(parameterState.extension.mapping)"
+        :key="param"
+        class="p-2 border border-top-0"
+      >
+        <div class="d-flex justify-content-between mb-2">
+          <code class="fs-6 fw-bold bg-secondary-subtle rounded p-1"
+            >--{{ param }}</code
+          >
+          <button
+            type="button"
+            class="btn btn-outline-danger btn-sm"
+            @click="deleteMappingParameter(param)"
+          >
+            Remove
+          </button>
+        </div>
+        <div class="d-flex mb-5">
+          <div class="me-2">
+            <button
+              type="button"
+              class="btn btn-primary"
+              :disabled="
+                parameterState.mappingParameterValues[param]?.length === 0
+              "
+              @click="
+                addMappingParameterValue(
+                  param,
+                  parameterState.mappingParameterValues[param],
+                )
+              "
+            >
+              Add Option
+            </button>
+          </div>
+          <input
+            type="text"
+            class="form-control flex-fill w-fit"
+            v-model="parameterState.mappingParameterValues[param]"
+          />
+        </div>
+        <template v-if="parameterState.extension.mapping[param]">
+          <div
+            v-for="key in Object.keys(parameterState.extension.mapping[param])"
+            :key="key"
+            class="mb-5 position-relative"
+          >
+            <code
+              class="p-1 position-absolute top-0 start-0 pt-0 rounded-top border-bottom-0 border border-secondary-subtle bla"
+              >{{ key }}</code
+            >
+            <div class="position-absolute top-0 end-0 bla">
+              <span
+                v-if="!parameterState.resourceParametersMapping.has(param)"
+                class="p-1 me-2 rounded-top border-bottom-0 border pseudo-primary-btn border-primary-subtle cursor-pointer"
+                @click="makeResourceParameterMapping(param, key)"
+                >Resource</span
+              >
+              <span
+                class="p-1 rounded-top border-bottom-0 border pseudo-danger-btn border-danger-subtle cursor-pointer"
+                @click="deleteMappingParameterValue(param, key)"
+                >Remove</span
+              >
+            </div>
+            <div class="input-group">
+              <parameter-input
+                :parameter="parameterSchema[param]"
+                force-raw-file
+                required
+                size-modifier="sm"
+                border="secondary-subtle"
+                v-model="parameterState.extension.mapping[param][key]"
+                :resource-parameter="
+                  parameterState.resourceParametersMapping.has(param)
+                "
+              />
+            </div>
+          </div>
+        </template>
+      </div>
+    </div>
+  </form>
+  <div class="d-grid gap-2">
+    <button
+      type="submit"
+      class="btn btn-success btn-lh mt-3"
+      form="parameter-extension-form"
+      :disabled="
+        parameterState.loading ||
+        parameterState.makingRequest ||
+        Object.keys(parameterState.extension).length === 0
+      "
+    >
+      Save
+    </button>
+  </div>
+</template>
+
+<style scoped>
+.parameter-container:hover {
+  background: var(--bs-secondary-bg-subtle);
+}
+
+.pseudo-danger-btn {
+  color: var(--bs-danger);
+  background-color: var(--bs-white);
+}
+
+.pseudo-danger-btn:hover {
+  color: var(--bs-white);
+  background-color: var(--bs-danger);
+  border-color: var(--bs-danger);
+}
+
+.pseudo-primary-btn {
+  color: var(--bs-primary);
+  background-color: var(--bs-white);
+}
+
+.pseudo-primary-btn:hover {
+  color: var(--bs-white);
+  background-color: var(--bs-primary);
+  border-color: var(--bs-primary);
+}
+
+.bla {
+  transform: translateY(-90%) !important;
+}
+</style>
diff --git a/src/views/workflows/MyWorkflowsView.vue b/src/views/workflows/MyWorkflowsView.vue
index 34fb0c0f219fcbc87098098d20cfe6bc410e3764..513a18d61612882987b6f3cdf133fe6522bd26be 100644
--- a/src/views/workflows/MyWorkflowsView.vue
+++ b/src/views/workflows/MyWorkflowsView.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { onMounted, reactive } from "vue";
+import { computed, onMounted, reactive } from "vue";
 import type { WorkflowOut, WorkflowVersion } from "@/client/workflow";
 import { Status } from "@/client/workflow";
 import WorkflowWithVersionsCard from "@/components/workflows/WorkflowWithVersionsCard.vue";
@@ -53,6 +53,12 @@ const workflowsState = reactive<{
   },
 });
 
+const sortedWorkflows = computed<WorkflowOut[]>(() => {
+  const temp = [...workflowRepository.ownWorkflows];
+  temp.sort((a, b) => (a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1));
+  return temp;
+});
+
 function workflowUpdateClicked(workflow: WorkflowOut) {
   workflowsState.updateWorkflow = workflow;
 }
@@ -127,11 +133,11 @@ onMounted(() => {
   </div>
   <div v-if="!workflowsState.loading">
     <card-transition-group
-      v-if="workflowRepository.ownWorkflows.length > 0"
+      v-if="sortedWorkflows.length > 0"
       class="d-flex flex-wrap align-items-center justify-content-between mt-5"
     >
       <workflow-with-versions-card
-        v-for="workflow in workflowRepository.ownWorkflows"
+        v-for="workflow in sortedWorkflows"
         :key="workflow.workflow_id"
         :workflow="workflow"
         :loading="false"
diff --git a/src/views/workflows/StartWorkflowView.vue b/src/views/workflows/StartWorkflowView.vue
index 006784fdd60ff0dbfcae46b38de745fa242201f7..ee6c3cf5081199f6d24c019038c9f365e755bdd3 100644
--- a/src/views/workflows/StartWorkflowView.vue
+++ b/src/views/workflows/StartWorkflowView.vue
@@ -123,7 +123,6 @@ onMounted(() => {
     </template>
   </bootstrap-toast>
   <parameter-schema-form-component
-    :workflow-version-id="versionId"
     :schema="versionState.parameterSchema"
     :loading="versionState.loading"
     allow-notes
@@ -134,6 +133,10 @@ onMounted(() => {
         DocumentationEnum.CLOWM_INFO
       ]
     "
+    :parameter-extension="
+      workflowRepository.versionMapping[versionId]?.parameter_extension ??
+      undefined
+    "
   />
 </template>
 
diff --git a/tsconfig.json b/tsconfig.json
index 3714ea8b5910a518a1b1eb1ef16061ac986a45d4..508ccb807ef68c2ebafee5bfc71d6ab098825b00 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,6 +1,6 @@
 {
   "extends": [
-    "@tsconfig/node18/tsconfig.json",
+    "@tsconfig/node20/tsconfig.json",
     "@vue/tsconfig/tsconfig.json"
   ],
   "include": [