From c0d24a667b9f832576096e01d576d013b43069ed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Fri, 7 Feb 2025 15:54:03 +0000
Subject: [PATCH 01/25] Update openapi-ts to new parser

#191
---
 openapi-clowm.json                            |    2 +-
 openapi-ts.config.ts                          |    1 -
 package-lock.json                             |  770 +---
 package.json                                  |   10 +-
 src/App.vue                                   |    3 +-
 src/client/client.gen.ts                      |   28 +
 src/client/index.ts                           |    2 +-
 src/client/sdk.gen.ts                         | 2944 +++++++-------
 src/client/transformers.gen.ts                |   21 +
 src/client/types.gen.ts                       | 3448 +++++++++++++----
 src/components/AppHeader.vue                  |   23 +-
 .../ParameterSchemaFormComponent.vue          |    6 +-
 .../workflows/WorkflowDocumentationTabs.vue   |    4 +-
 src/router/userRoutes.ts                      |   12 +
 src/stores/buckets.ts                         |   12 -
 src/stores/news.ts                            |    4 +-
 src/stores/otrs.ts                            |    7 -
 src/stores/resources.ts                       |   15 +-
 src/stores/s3keys.ts                          |    3 -
 src/stores/users.ts                           |   11 +-
 src/stores/workflowExecutions.ts              |    8 +-
 src/stores/workflows.ts                       |   31 +-
 src/views/LoginView.vue                       |   62 +-
 src/views/user/ProfileView.vue                |    7 +
 .../CreateParameterTranslationView.vue        |    4 +-
 src/views/workflows/MyWorkflowsView.vue       |    4 +-
 src/views/workflows/StartWorkflowView.vue     |    2 +-
 .../UpdateWorkflowVersionMetadata.vue         |    2 +-
 vite.config.ts                                |    8 +
 29 files changed, 4516 insertions(+), 2938 deletions(-)
 create mode 100644 src/client/client.gen.ts
 create mode 100644 src/client/transformers.gen.ts
 create mode 100644 src/views/user/ProfileView.vue

diff --git a/openapi-clowm.json b/openapi-clowm.json
index 5ea3840..1dfafd3 100644
--- a/openapi-clowm.json
+++ b/openapi-clowm.json
@@ -1 +1 @@
-{"openapi":"3.1.0","info":{"title":"CloWM UI API","description":"This is the API for the CloWM UI. It is only for internal use and will change without prior notice.","version":"1.0"},"servers":[{"url":"/api"}],"paths":{"/ui/tokens":{"get":{"tags":["APIToken"],"summary":"List API token","description":"List meta information about all API token.\n\nPermissions `api_token:list_all` required. See parameter `uid` for exception.","operationId":"APIToken-list_token","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiTokenOut"},"title":"Response Apitoken-List Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["APIToken"],"summary":"Create new API token","description":"Create a new API token for the current user.\n\nPermission `api_token:create` required.","operationId":"APIToken-create_token","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenIn","description":"Meta-data for Api token to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenPrivateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/tokens/{tid}":{"get":{"tags":["APIToken"],"summary":"Get API token","description":"Get an API token by id.\n\nPermission `api_token:read` required if the current user is the owner of the API token,\notherwise `api_token:read_any` required.","operationId":"APIToken-get_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["APIToken"],"summary":"Delete API token","description":"Delete an API token by id.\n\nPermission `api_token:delete` required if the current user is the owner of the API token,\notherwise `api_token:delete_any` required.","operationId":"APIToken-delete_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users":{"post":{"tags":["User"],"summary":"Create User","description":"Create a new user in the system and notify him.\n\nPermission `user:create` required.","operationId":"User-create_user","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserIn","description":"Meta-data for user to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["User"],"summary":"List users and search by their name","description":"List all users in the system..\n\nPermission `user:list` required.","operationId":"User-list_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter users by a substring in their name.","examples":["Bilbo"],"title":"Name Substring"},"description":"Filter users by a substring in their name."},{"name":"filter_roles","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/RoleEnum"}},{"type":"null"}],"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression.","title":"Filter Roles"},"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOutExtended"},"title":"Response User-List Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/search":{"get":{"tags":["User"],"summary":"Search Users","description":"Search for users in the system by their name.\n\nPermission `user: search` required.","operationId":"User-search_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":30,"description":"Filter users by a substring in their name.","title":"Name Substring"},"description":"Filter users by a substring in their name."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOut"},"title":"Response User-Search Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/me":{"get":{"tags":["User"],"summary":"Get the logged in user","description":"Return the user associated with the used JWT.\n\nPermission `user:read` required.","operationId":"User-get_logged_in_user","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}}},"security":[{"Session Token":[]}]}},"/ui/users/{uid}":{"get":{"tags":["User"],"summary":"Get a user by its uid","description":"Return the user with the specific uid.\n\nPermission `user:read` required.","operationId":"User-get_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/roles":{"put":{"tags":["User"],"summary":"Update user roles","description":"Update the roles of a user.\n\nPermission `user:update` required.","operationId":"User-update_roles","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRoles","description":"The new roles of the user"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/invitation":{"patch":{"tags":["User"],"summary":"Resend Invitation","description":"Resend the invitation link for an user that has an open invitation.\n\nPermission `user:create` required.","operationId":"User-resend_invitation","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys":{"get":{"tags":["S3Key"],"summary":"Get the S3 Access keys from a user","description":"Get all the S3 Access keys for a specific user.\n\nPermission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required.","operationId":"S3Key-get_user_keys","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/S3Key"},"title":"Response S3Key-Get User Keys"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["S3Key"],"summary":"Create a Access key for a user","description":"Create a S3 Access key for a specific user.\n\nPermission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required.","operationId":"S3Key-create_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys/{access_id}":{"get":{"tags":["S3Key"],"summary":"Get a specific S3 Access key from a user","description":"Get a specific S3 Access Key for a specific user.\n\nPermission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required.","operationId":"S3Key-get_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["S3Key"],"summary":"Delete a specific S3 Access key from a user","description":"Delete a specific S3 Access key for a specific user.\n\nPermission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.","operationId":"S3Key-delete_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets":{"get":{"tags":["Bucket"],"summary":"List buckets","description":"List all the buckets in the system or of the desired user where the user has permissions for.\n\nPermission `bucket:list_all` required. See parameter `owner_id` for exception.","operationId":"Bucket-list_buckets","security":[{"Session Token":[]}],"parameters":[{"name":"owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Owner Id"},"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target."},{"name":"bucket_type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/BucketType","description":"Type of the bucket to get. Ignored when `user` parameter not set","default":"ALL"},"description":"Type of the bucket to get. Ignored when `user` parameter not set"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketOut"},"title":"Response Bucket-List Buckets"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket for the current user","description":"Create a bucket for the current user.\n\nThe name of the bucket has some constraints.\nFor more information see the\n[Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints)\n\nPermission `bucket:create` required.","operationId":"Bucket-create_bucket","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketIn","description":"Meta-data for bucket to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"List bucket OTRs","description":"Get the ownership transfer requests for buckets.\n\nPermission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `bucket:list_all`","operationId":"Bucket-list_bucket_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Bucket-List Bucket Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}":{"get":{"tags":["Bucket"],"summary":"Get a bucket by its name","description":"Get a bucket by its name if the current user has READ permissions for the bucket.\n\nPermission `bucket:read` required if the current user is the owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket","description":"Delete a bucket by its name. Only the owner of the bucket can delete the bucket.\n\nPermission `bucket:delete` required if the current user is the owner of the bucket,\notherwise `bucket:delete_any` required.","operationId":"Bucket-delete_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"force_delete","in":"query","required":false,"schema":{"type":"boolean","description":"Delete even non-empty bucket","default":false,"title":"Force Delete"},"description":"Delete even non-empty bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"Get a bucket OTR","description":"Get a specific bucket ownership transfer request.\n\nPermission `bucket:read` required if the current user is the current or new owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket OTR","description":"Create a ownership transfer request for a specific bucket.\n\nPermission `bucket:update` required if the current user is the current owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-create_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the bucket OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Bucket"],"summary":"Accept a bucket OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `bucket:update` required if the current user is the new owner of the workflow,\notherwise `bucket:update_any` required.","operationId":"Bucket-accept_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket OTR","description":"Delete/Reject a bucket ownership transfer request.\n\nPermission `bucket:update` required if the current user is the current or new owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-delete_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/public":{"patch":{"tags":["Bucket"],"summary":"Update public status","description":"Update the buckets public state.\n\nPermission `bucket:update` required if the current user is the owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-update_bucket_public_state","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_Bucket-update_bucket_public_state"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/limits":{"patch":{"tags":["Bucket"],"summary":"Update bucket limits","description":"Update the buckets size limits.\n\nPermission `bucket:update_any` required.","operationId":"Bucket-update_bucket_limits","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketSizeLimits","description":"New size limits for bucket"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions.","description":"List all the bucket permissions in the system.\n\nPermission `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions","security":[{"Session Token":[]}],"parameters":[{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["BucketPermission"],"summary":"Create a permission.","description":"Create a permission for a bucket and user.\n\nPermission `bucket_permission:create` required.","operationId":"BucketPermission-create_permission","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionIn","description":"Permission to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a user.","description":"List all the bucket permissions for the given user.\n\nPermission `bucket_permission:list` required if current user is the target the bucket permission,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a bucket.","description":"List all the bucket permissions for the given bucket.\n\nPermission `bucket_permission:list` required if current user is owner of the bucket,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per Bucket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get permission for bucket and user combination.","description":"Get the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:read` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:read_any` required.","operationId":"BucketPermission-get_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["BucketPermission"],"summary":"Update a bucket permission","description":"Update a permission for a bucket and user.\n\nPermission `bucket_permission:update` required.","operationId":"BucketPermission-update_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionParameters","description":"Permission to create"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["BucketPermission"],"summary":"Delete a bucket permission","description":"Delete the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:delete` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:delete_any` required.","operationId":"BucketPermission-delete_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows":{"post":{"tags":["Workflow"],"summary":"Create a new workflow","description":"Create a new workflow.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow-create_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowIn","description":"Meta-date for the workflow to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow"],"summary":"List workflows","description":"List all workflows.\n\nPermission `workflow:list` required.","operationId":"Workflow-list_workflows","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter workflows by a substring in their name.","examples":["blast"],"title":"Name Substring"},"description":"Filter workflows by a substring in their name."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`.","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`."},{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowOut"},"title":"Response Workflow-List Workflows"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"List workflow OTRs","description":"Get the ownership transfer requests for workflows.\n\nPermission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `workflow:list_all`","operationId":"Workflow-list_workflow_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Workflow-List Workflow Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/developer_statistics":{"get":{"tags":["Workflow"],"summary":"Get anonymized workflow execution","description":"Get the workflow executions with meta information and anonymized user IDs.\n\nPermission `workflow:read` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:read_any`.","operationId":"Workflow-get_developer_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter by the developer of the workflows","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter by the developer of the workflows"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"description":"Filter by workflow IDs","title":"Workflow Id"},"description":"Filter by workflow IDs"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions after this date","title":"Start"},"description":"Filter by workflow executions after this date"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions before this date","title":"End"},"description":"Filter by workflow executions before this date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnonymizedWorkflowExecution"},"title":"Response Workflow-Get Developer Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}":{"get":{"tags":["Workflow"],"summary":"Get a workflow","description":"Get a specific workflow.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow","description":"Delete a workflow.\n\nPermission `workflow:delete` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:delete_any`.","operationId":"Workflow-delete_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"Get a workflow OTR","description":"Get a specific workflow ownership transfer request.\n\nPermission `workflow:read` required if current user is the current or new owner of the workflow,\notherwise `workflow:read_any` required.","operationId":"Workflow-get_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workflow"],"summary":"Create a workflow OTR","description":"Create a ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the current owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-create_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for workflow OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Workflow"],"summary":"Accept a workflow OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-accept_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow OTR","description":"Delete/Reject a workflow ownership transfer request.\n\nPermission `workflow:update` required if current user is the current or new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-delete_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/statistics":{"get":{"tags":["Workflow"],"summary":"Get statistics for a workflow","description":"Get the number of started workflow per day.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowStatistic"},"title":"Response Workflow-Get Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/update":{"post":{"tags":["Workflow"],"summary":"Update a workflow","description":"Create a new workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow-update_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdate","description":"Meta-data for the workflow version to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions":{"get":{"tags":["Workflow Version"],"summary":"Get all versions of a workflow","description":"List all versions of a Workflow.\n\nPermission `workflow:list` required.","operationId":"Workflow Version-list_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"title":"Response Workflow Version-List Workflow Version"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}":{"get":{"tags":["Workflow Version"],"summary":"Get a workflow version","description":"Get a specific version of a workflow.\n\nPermission `workflow:read` required if the version is public or you are the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit `git_commit_hash` of specific version or `latest`.","examples":["latest","ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit `git_commit_hash` of specific version or `latest`."},{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/status":{"patch":{"tags":["Workflow Version"],"summary":"Update status of workflow version","description":"Update the status of a workflow version.\n\nPermission `workflow:update_status`","operationId":"Workflow Version-update_workflow_version_status","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionStatusSchema","description":"New Status of the workflow version"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/metadata":{"get":{"tags":["Workflow Version"],"summary":"Get metadata of workflow version","description":"Get the metadata of a workflow version.\n\nPermission `workflow:read` required if the current user is the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Version"],"summary":"Update metadata of workflow version","description":"Update the metadata of a workflow version.\n\nPermission `workflow:update` required if the current user is the developer of the workflow,\notherwise `workflow:update_any`","operationId":"Workflow Version-update_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate":{"patch":{"tags":["Workflow Version"],"summary":"Deprecate a workflow version","description":"Deprecate a workflow version.\n\nPermission `workflow:update` required if you are the developer of the workflow,\notherwise `workflow:update_status`","operationId":"Workflow Version-deprecate_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension":{"patch":{"tags":["Workflow Version"],"summary":"Update parameter extension of workflow version","description":"Update the parameter extension of a workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-update_workflow_version_parameter_extension","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParameterExtension-Input","description":"Parameter extension specific for this CloWM instance"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/documentation":{"get":{"tags":["Workflow Version"],"summary":"Fetch documentation for a workflow version","description":"Get the documentation for a specific workflow version.\nStreams the response directly from the right git repository.\n\nPermission `workflow:read` required.","operationId":"Workflow Version-download_workflow_documentation","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."},{"name":"document","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DocumentationEnum","description":"Specify which type of documentation the client wants to fetch","default":"usage.md"},"description":"Specify which type of documentation the client wants to fetch"},{"name":"mode_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Workflow Mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"Workflow Mode"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/icon":{"post":{"tags":["Workflow Version"],"summary":"Upload icon for workflow version","description":"Upload an icon for the workflow version and returns the new icon URL.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-upload_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_Workflow_Version-upload_workflow_version_icon"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Version"],"summary":"Delete icon of workflow version","description":"Delete the icon of the workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-delete_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions":{"post":{"tags":["Workflow Execution"],"summary":"Start a new workflow execution","description":"Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.\n\nPermission `workflow_execution:create` required if workflow versions status is `PUBLISHED`,\notherwise `workflow_execution:create_any` required.","operationId":"Workflow Execution-start_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow Execution"],"summary":"List all workflow executions","description":"Get all workflow executions.\n\nThis endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the\n`Link` header.\nA missing `Link` header indicates that you iterated over all workflow executions with the current filters.\n\nPermission `workflow_execution:list` required, if `executor_id` is the same as the current user,\notherwise `workflow_execution:list_all` required.","operationId":"Workflow Execution-list_workflow_executions","security":[{"Session Token":[]}],"parameters":[{"name":"executor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Executor Id"},"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required."},{"name":"execution_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionStatus"}},{"type":"null"}],"description":"Filter for status of workflow execution","title":"Execution Status"},"description":"Filter for status of workflow execution"},{"name":"workflow_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":40,"maxLength":40,"pattern":"^[0-9a-f]+$"},{"type":"null"}],"description":"Filter for workflow version","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Workflow Version Id"},"description":"Filter for workflow version"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Workflow Id"},"description":"Filter for workflow"},{"name":"start_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started after this UNIX timestamp","examples":[1640991600],"title":"Start After"},"description":"Filter for workflow executions that started after this UNIX timestamp"},{"name":"start_before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started before this UNIX timestamp","examples":[1640991600],"title":"Start Before"},"description":"Filter for workflow executions that started before this UNIX timestamp"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionOut"},"title":"Response Workflow Execution-List Workflow Executions"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<http://localhost:9999/api/workflow_executions?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/arbitrary":{"post":{"tags":["Workflow Execution"],"summary":"Start a workflow execution with arbitrary git repository","description":"Start a new workflow execution from an arbitrary git repository.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow Execution-start_arbitrary_workflow","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevWorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Session Token":[]}]}},"/ui/workflow_executions/{eid}":{"get":{"tags":["Workflow Execution"],"summary":"Get a workflow execution","description":"Get a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Execution"],"summary":"Delete a workflow execution","description":"Delete a specific workflow execution.\n\nPermission `workflow_execution:delete` required if the current user started the workflow execution,\notherwise `workflow_execution:delete_any` required.","operationId":"Workflow Execution-delete_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/params":{"get":{"tags":["Workflow Execution"],"summary":"Get the parameters of a workflow execution","description":"Get the parameters of a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution_params","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Workflow Execution-Get Workflow Execution Params"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/cancel":{"post":{"tags":["Workflow Execution"],"summary":"Cancel a workflow execution","description":"Cancel a running workflow execution.\n\nPermission `workflow_execution:cancel` required if the current user started the workflow execution,\notherwise `workflow_execution:cancel_any` required.","operationId":"Workflow Execution-cancel_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/credentials":{"get":{"tags":["Workflow Credentials"],"summary":"Get the credentials of a workflow","description":"Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-get_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Credentials"],"summary":"Update the credentials of a workflow","description":"Update the credentials for the repository of a workflow.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-update_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsIn","description":"Updated credentials for the workflow git repository"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Credentials"],"summary":"Delete the credentials of a workflow","description":"Delete the credentials for the repository of a workflow.\n\nPermission `workflow:delete` required if the developer of the workflow is the same as the current user,\nother `workflow:delete_any`.","operationId":"Workflow Credentials-delete_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_modes/{mode_id}":{"get":{"tags":["Workflow Mode"],"summary":"Get workflow mode","description":"Get a workflow mode.\n\nPermission `workflow:read` required","operationId":"Workflow Mode-get_workflow_mode","security":[{"Session Token":[]}],"parameters":[{"name":"mode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"ID of a workflow mode"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowModeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources":{"post":{"tags":["Resource"],"summary":"Request a new resource","description":"Request a new resources.\n\nPermission `resource:create` required.","operationId":"Resource-create_resource","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceIn","description":"Meta-data for the resource to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Resource"],"summary":"List resources","description":"List all resources.\n\nPermission `resource:list` required.","operationId":"Resource-list_resources","security":[{"Session Token":[]}],"parameters":[{"name":"maintainer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Maintainer Id"},"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required."},{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"Filter resources by a substring in their name.","examples":["gtdb"],"title":"Name Substring"},"description":"Filter resources by a substring in their name."},{"name":"public","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter resources to by the public flag","title":"Public"},"description":"Filter resources to by the public flag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceOut"},"title":"Response Resource-List Resources"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/sync_requests":{"get":{"tags":["Resource"],"summary":"List resource sync requests","description":"List all resource sync requests.\n\nPermission `resource:update_any` required.","operationId":"Resource-list_sync_requests","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserSynchronizationRequestOut"},"type":"array","title":"Response Resource-List Sync Requests"}}}}},"security":[{"Session Token":[]}]}},"/ui/resources/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"List resource OTRs","description":"Get the ownership transfer requests for resources.\n\nPermission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `resource:list_all`","operationId":"Resource-list_resource_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Resource-List Resource Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}":{"get":{"tags":["Resource"],"summary":"Get a resource","description":"Get a specific resource.\n\nPermission `resource:read` required.","operationId":"Resource-get_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource","description":"Delete a resources.\n\nPermission `resource:delete` required.","operationId":"Resource-delete_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"Get a resource OTR","description":"Get a specific resource ownership transfer request.\n\nPermission `resource:read` required if the current user is the current or new owner of the resource,\notherwise `resource:read_any` required.","operationId":"Resource-get_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Resource"],"summary":"Create a resource OTR","description":"Create a ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the current owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-create_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the resource OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Resource"],"summary":"Accept a resource OTR","description":"Accept an ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-accept_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource OTR","description":"Delete/Reject a resource ownership transfer request.\n\nPermission `resource:update` required if the current user is the current or new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-delete_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions":{"get":{"tags":["ResourceVersion"],"summary":"List versions of a resource","description":"List all the resource version for a specific resource.\n\nPermission 'resource:read' required.","operationId":"ResourceVersion-list_resource_versions","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionOut"},"title":"Response Resourceversion-List Resource Versions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ResourceVersion"],"summary":"Request new version of a resource","description":"Request a new resource version.\n\nPermission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise.","operationId":"ResourceVersion-request_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionIn","description":"Meta-data for the resource version to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}":{"get":{"tags":["ResourceVersion"],"summary":"Get version of a resource","description":"Get a specific resource version for a specific resource.\n\nPermission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and\nthe current user is not the maintainer, then the permission `resource:read_any` is required.","operationId":"ResourceVersion-get_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/tree":{"get":{"tags":["ResourceVersion"],"summary":"Download folder structure of resource","description":"Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster.\n\nPermission `resource:read` required.","operationId":"ResourceVersion-resource_file_tree","security":[{"Session Token":[]}],"parameters":[{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileTree"},"title":"Response Resourceversion-Resource File Tree"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_review":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version review","description":"Request the review of a resource version.\n\nPermission `resource:update` required.","operationId":"ResourceVersion-request_resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_sync":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version synchronization","description":"Request the synchronization of a resource version to the cluster.\n\nPermission `resource:request_sync` required.","operationId":"ResourceVersion-request_resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSynchronizationRequestIn","description":"Meta-data for the synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/review":{"put":{"tags":["ResourceVersion"],"summary":"Review resource version","description":"Review answer the resource version.\n\nPermission `resource:update_status` required.","operationId":"ResourceVersion-resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer for the resource version review"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/sync":{"put":{"tags":["ResourceVersion"],"summary":"Synchronize resource version with cluster","description":"Synchronize the resource version to the cluster.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer to the resource version synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/latest":{"put":{"tags":["ResourceVersion"],"summary":"Set resource version to latest","description":"Set the resource version as the latest version.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_latest","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/cluster":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version on cluster","description":"Delete the resource version on the cluster.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_cluster","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/s3":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version in S3","description":"Delete the resource version in the S3 bucket.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_s3","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news":{"post":{"tags":["News"],"summary":"Create news","description":"Create a news event.\n\nPermission `news:create` required.","operationId":"News-create_news","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsIn","description":"Meta-data for news event to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["News"],"summary":"List news","description":"List all news events with filters.\n\nThis endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header.\nA missing `Link` header indicates that you iterated over all news with the current filters.\n\nPermission `news:list` required.","operationId":"News-list_news","security":[{"Session Token":[]}],"parameters":[{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967296,"minimum":0},{"type":"null"}],"description":"Filter for news that are created after this UNIX timestamp","title":"Created After"},"description":"Filter for news that are created after this UNIX timestamp"},{"name":"creator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for news created by a specific user","title":"Creator Id"},"description":"Filter for news created by a specific user"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NewsOut"},"title":"Response News-List News"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<http://localhost:9999/api/news?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news/latest":{"get":{"tags":["News"],"summary":"Get latest news","description":"List the current news events.\n\nPermission `news:list` required.","operationId":"News-list_latest_news","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NewsOut"},"type":"array","title":"Response News-List Latest News"}}}}},"security":[{"Session Token":[]}]}},"/ui/news/{nid}":{"get":{"tags":["News"],"summary":"Get a specific news","description":"Get a specified news event.\n\nPermission `news:read` required.","operationId":"News-get_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["News"],"summary":"Delete a specific news","description":"Delete a specified news event.\n\nPermission `news:delete` required.","operationId":"News-delete_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/public/workflows":{"get":{"tags":["Public"],"summary":"Get available workflows","description":"Public route to fetch all available workflows.","operationId":"Public-get_public_workflows","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PublicWorkflowOut"},"type":"array","title":"Response Public-Get Public Workflows"}}}}}}}},"components":{"schemas":{"AnonymizedWorkflowExecution":{"properties":{"workflow_execution_id":{"type":"string","title":"Workflow Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"pseudo_uid":{"type":"string","title":"Pseudo Uid","description":"Anonymized user ID of the user who ran the workflow execution","examples":["7ed4249857b656e96f456449796e461e6001d3fb2481a44701f70ca437bd53a2"]},"workflow_mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Mode Id","description":"ID of the workflow mode this workflow execution ran in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"workflow_version_id":{"type":"string","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"started_at":{"type":"string","format":"date","title":"Started At","description":"Day of the workflow execution","examples":["2023-01-01"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"developer_id":{"type":"string","title":"Developer Id","description":"ID of developer of the workflow","examples":["28c5353b8bb34984a8bd4169ba94c606"]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"End status of the workflow execution","examples":["SUCCESS"]}},"type":"object","required":["workflow_execution_id","pseudo_uid","workflow_version_id","started_at","workflow_id","developer_id","status"],"title":"AnonymizedWorkflowExecution"},"ApiTokenIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"}},"type":"object","required":["name","scopes"],"title":"ApiTokenIn"},"ApiTokenOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]}},"type":"object","required":["name","scopes","token_id","uid","created_at"],"title":"ApiTokenOut"},"ApiTokenPrivateOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]},"token":{"type":"string","title":"Token","description":"The actual token used for authentication","examples":["J21NRKUYgyVUgvJ3cIdllS-MMa9ny1UDKFF18aetDvo"]}},"type":"object","required":["name","scopes","token_id","uid","created_at","token"],"title":"ApiTokenPrivateOut"},"Body_Bucket-update_bucket_public_state":{"properties":{"public":{"type":"boolean","title":"Public","description":"New public state"}},"type":"object","required":["public"],"title":"Body_Bucket-update_bucket_public_state"},"Body_Workflow_Version-upload_workflow_version_icon":{"properties":{"icon":{"type":"string","format":"binary","title":"Icon","description":"Icon for the Workflow."}},"type":"object","required":["icon"],"title":"Body_Workflow Version-upload_workflow_version_icon"},"BucketIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]}},"type":"object","required":["name","description"],"title":"BucketIn","description":"Schema for creating a new bucket."},"BucketOut":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]},"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]},"owner_id":{"type":"string","title":"Owner Id","description":"UID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"public":{"type":"boolean","title":"Public","description":"Flag if the bucket is anonymously readable"}},"type":"object","required":["name","description","created_at","owner_id","public"],"title":"BucketOut","description":"Schema for answering a request with a bucket."},"BucketPermissionIn":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","format":"uuid","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionIn"},"BucketPermissionOut":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionOut","description":"Schema for the bucket permissions."},"BucketPermissionParameters":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"}},"type":"object","required":["scopes"],"title":"BucketPermissionParameters","description":"Schema for the parameters of a bucket permission."},"BucketSizeLimits":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]}},"type":"object","title":"BucketSizeLimits","description":"Schema to represent bucket limits."},"BucketType":{"type":"string","enum":["OWN","ALL","PERMISSION"],"title":"BucketType","description":"Enumeration for the type of buckets to fetch from the DB\n\nOWN: Only fetch buckets that the user owns\nPERMISSION: Only fetch foreign buckets that the user has access to\nALL: Fetch all buckets that the user has access to"},"DevWorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"mode":{"anyOf":[{"$ref":"#/components/schemas/WorkflowModeIn"},{"type":"null"}],"description":"Mode of the workflow with an alternative entrypoint"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow execution requires"}},"type":"object","required":["parameters","git_commit_hash","repository_url","nextflow_version"],"title":"DevWorkflowExecutionIn"},"DocumentationEnum":{"type":"string","enum":["usage.md","input.md","output.md","changelog.md","parameter_schema.json","clowm_info.json","CITATIONS.md"],"title":"DocumentationEnum"},"FileTree":{"properties":{"type":{"type":"string","enum":["file","directory","link"],"title":"Type"},"name":{"type":"string","title":"Name"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"contents":{"anyOf":[{"items":{"$ref":"#/components/schemas/FileTree"},"type":"array"},{"type":"null"}],"title":"Contents"},"size":{"type":"integer","title":"Size"}},"type":"object","required":["type","name","size"],"title":"FileTree"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IconUpdateOut":{"properties":{"icon_url":{"type":"string","minLength":1,"format":"uri","title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["icon_url"],"title":"IconUpdateOut"},"InstanceSpecificDefaultParameters":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}]},"type":"object"},"NewsIn":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event","default":"system"}},"type":"object","required":["content","title"],"title":"NewsIn"},"NewsOut":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event"},"news_id":{"type":"string","title":"News Id","description":"ID of the news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"]},"creator_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Id","description":"ID of the creator","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]}},"type":"object","required":["content","title","category","news_id","created_at"],"title":"NewsOut"},"NextflowVersion":{"type":"string","enum":["22.10.0","22.10.1","22.10.2","22.10.3","22.10.4","22.10.5","22.10.6","22.10.7","22.10.8","23.04.0","23.04.1","23.04.2","23.04.3","23.04.4","23.04.5","23.10.0","23.10.1","23.10.2","23.10.3","23.10.4","24.04.1","24.04.2","24.04.3","24.04.4","24.10.0"],"title":"NextflowVersion"},"OwnershipTransferRequestIn":{"properties":{"new_owner_uid":{"type":"string","format":"uuid","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Comment","description":"An optional comment for the transfer request","examples":["This is an example comment"]}},"type":"object","required":["new_owner_uid"],"title":"OwnershipTransferRequestIn"},"OwnershipTransferRequestOut":{"properties":{"new_owner_uid":{"type":"string","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"type":"string","title":"Comment","description":"An optional comment for the transfer request","default":"","examples":["This is an example comment"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Time when the ownership transfer was requested as UNIX timestamp","examples":[1640991600]},"current_owner_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Owner Uid","description":"The current uid of the current owner if he exists","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"target_id":{"type":"string","title":"Target Id","description":"Id of the target that gets its ownership transferred"},"target_name":{"type":"string","title":"Target Name","description":"Name of the target","examples":["example-bucket","Example Workflow","Example Resource"]},"target_description":{"type":"string","title":"Target Description","description":"Description of then target","examples":["Some long description of a target"]},"target_type":{"$ref":"#/components/schemas/OwnershipTypeEnum","description":"Target type of the ownership transfer","examples":["bucket"]}},"type":"object","required":["new_owner_uid","created_at","target_id","target_name","target_description","target_type"],"title":"OwnershipTransferRequestOut"},"OwnershipTypeEnum":{"type":"string","enum":["bucket","workflow","resource"],"title":"OwnershipTypeEnum"},"ParameterExtension-Input":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterExtension-Output":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterVisibility":{"type":"integer","enum":[10,20,30,40],"title":"ParameterVisibility"},"ParameterVisibilityMapping":{"additionalProperties":{"$ref":"#/components/schemas/ParameterVisibility"},"type":"object"},"PermissionStatus":{"type":"string","enum":["ACTIVE","INACTIVE"],"title":"PermissionStatus","description":"Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the\npermission itself has a time limit and the current time is not in the timespan."},"PublicWorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"latest_git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Latest Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"latest_version_tag":{"type":"string","maxLength":10,"minLength":5,"title":"Latest Version Tag","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"developer":{"type":"string","title":"Developer","description":"Name of the developer","default":"","examples":["Bilbo Baggins"]},"latest_version_timestamp":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Latest Version Timestamp","description":"Timestamp when the last version was created as UNIX timestamp","examples":[1640991600]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the workflow icon","readOnly":true,"examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["name","short_description","repository_url","workflow_id","latest_git_commit_hash","latest_version_tag","latest_version_timestamp","icon_url"],"title":"PublicWorkflowOut"},"ResourceIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true}},"type":"object","required":["release","name","description","source"],"title":"ResourceIn"},"ResourceOut":{"properties":{"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"maintainer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maintainer Id","description":"ID of the maintainer","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"versions":{"items":{"$ref":"#/components/schemas/ResourceVersionOut"},"type":"array","title":"Versions","description":"Versions of the resource"}},"type":"object","required":["name","description","source","resource_id","maintainer_id","versions"],"title":"ResourceOut"},"ResourceVersionIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]}},"type":"object","required":["release"],"title":"ResourceVersionIn"},"ResourceVersionOut":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"status":{"$ref":"#/components/schemas/ResourceVersionStatus","description":"Status of the resource version"},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1672527600]},"compressed_size":{"type":"integer","maximum":1.8446744073709552e+19,"minimum":0.0,"title":"Compressed Size","description":"Size of the compressed resource in bytes","examples":[42097156608]},"cluster_path":{"type":"string","title":"Cluster Path","description":"Path to the resource on the cluster if the resource is synchronized","readOnly":true,"examples":["/vol/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4","/vol/resources/CLDB-0e240ccd/latest"]},"s3_path":{"type":"string","title":"S3 Path","description":"Path to the resource in the S3 Bucket. Not publicly available.","readOnly":true,"examples":["s3://clowm-data/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4/resource.tar.gz"]}},"type":"object","required":["release","status","resource_version_id","resource_id","created_at","compressed_size","cluster_path","s3_path"],"title":"ResourceVersionOut"},"ResourceVersionStatus":{"type":"string","enum":["RESOURCE_REQUESTED","WAIT_FOR_REVIEW","DENIED","APPROVED","SYNC_REQUESTED","SYNCHRONIZING","SYNC_ERROR","SYNCHRONIZED","SETTING_LATEST","LATEST","CLUSTER_DELETING","CLUSTER_DELETE_ERROR","S3_DELETING","S3_DELETE_ERROR","S3_DELETED"],"title":"ResourceVersionStatus","description":"Enumeration for the possible status of a resource version."},"RoleEnum":{"type":"string","enum":["administrator","user","reviewer","developer","db_maintainer"],"title":"RoleEnum"},"S3Key":{"properties":{"uid":{"type":"string","title":"Uid","description":"UID of the user of that access key","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"access_key":{"type":"string","title":"Access Key","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"]},"secret_key":{"type":"string","title":"Secret Key","description":"Secret of the S3 access key","examples":["2F5uNTI1qvt4oAroXV0wWct8rWclL2QvFXKqSqjS"]}},"type":"object","required":["uid","access_key","secret_key"],"title":"S3Key","description":"Schema for a S3 key associated with a user."},"UserIn":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","examples":[["user"]]},"email":{"type":"string","format":"email","title":"Email","description":"Email of the user","examples":["user@example.org"]}},"type":"object","required":["display_name","email"],"title":"UserIn"},"UserOut":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["display_name","uid"],"title":"UserOut","description":"Schema for a user."},"UserOutExtended":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]},"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"lifescience_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifescience Id","description":"Lifesicence ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456'"]},"invitation_token_created_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invitation Token Created At","description":"Timestamp when the invitation token was created as UNIX timestamp"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email","description":"Email of the user","examples":["user@example.org"]},"gravatar_url":{"type":"string","minLength":1,"format":"uri","title":"Gravatar Url","description":"URL to the gravatar avatar based on the users email","readOnly":true,"examples":["https://gravatar.com/avatar/87a8c45825eb709ee8e453d2c0f8154e1b9bf4b45bb9b81b7662177340aa9d38"]}},"type":"object","required":["roles","display_name","uid","gravatar_url"],"title":"UserOutExtended"},"UserRequestAnswer":{"properties":{"deny":{"type":"boolean","title":"Deny","description":"Flag to indicate if the request was denied.","default":false},"reason":{"anyOf":[{"type":"string","maxLength":512,"minLength":16},{"type":"null"}],"title":"Reason","description":"Reason why the request was denied or approved. Required if request is denied."}},"type":"object","title":"UserRequestAnswer"},"UserRoles":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]}},"type":"object","required":["roles"],"title":"UserRoles"},"UserSynchronizationRequestIn":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]}},"type":"object","required":["reason"],"title":"UserSynchronizationRequestIn"},"UserSynchronizationRequestOut":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"requester_id":{"type":"string","title":"Requester Id","description":"ID of the user that requested this resource synchronization","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["reason","resource_version_id","resource_id","requester_id"],"title":"UserSynchronizationRequestOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkflowCredentialsIn":{"properties":{"token":{"type":"string","maxLength":128,"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","required":["token"],"title":"WorkflowCredentialsIn"},"WorkflowCredentialsOut":{"properties":{"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","title":"WorkflowCredentialsOut"},"WorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["parameters","workflow_version_id"],"title":"WorkflowExecutionIn"},"WorkflowExecutionOut":{"properties":{"workflow_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"execution_id":{"type":"string","title":"Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"executor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executor Id","description":"UID of user who started the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"start_time":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Start Time","description":"Start time of the workflow execution as UNIX timestamp","examples":[1640991600]},"end_time":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"End Time","description":"End time of the workflow execution as UNIX timestamp","examples":[1640991600]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"Status of the workflow execution","examples":["RUNNING"]},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id","description":"Id of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"logs_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where logs and reports are saved.","examples":["s3://example-bucket/logs/run-591b6a6ea1f0420d8a20a7a60704f695"]},"provenance_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where provenance information is saved.","examples":["s3://example-bucket/provenance/run-591b6a6ea1f0420d8a20a7a60704f695"]},"debug_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where debug information from Nextflow is saved.","examples":["s3://example-bucket/debug/run-591b6a6ea1f0420d8a20a7a60704f695"]},"cpu_time":{"type":"string","format":"duration","title":"Cpu Time","description":"The consumed cpu time in ISO 8601 format","examples":["P4DT12H30M5S"]}},"type":"object","required":["execution_id","start_time","status","cpu_time"],"title":"WorkflowExecutionOut"},"WorkflowExecutionStatus":{"type":"string","enum":["PENDING","SCHEDULED","RUNNING","CANCELED","SUCCESS","ERROR"],"title":"WorkflowExecutionStatus","description":"Enumeration for the status on a workflow execution."},"WorkflowIn":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"initial_version":{"type":"string","maxLength":10,"minLength":5,"title":"Initial Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","maxItems":10,"title":"Modes","description":"List of modes with alternative entrypoint the new workflow has","default":[]},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["name","short_description","repository_url","git_commit_hash","initial_version","nextflow_version"],"title":"WorkflowIn"},"WorkflowModeIn":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]}},"type":"object","required":["schema_path","entrypoint","name"],"title":"WorkflowModeIn"},"WorkflowModeOut":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]},"mode_id":{"type":"string","title":"Mode Id","description":"ID of the workflow mode","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["schema_path","entrypoint","name","mode_id"],"title":"WorkflowModeOut"},"WorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"versions":{"items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"type":"array","title":"Versions","description":"Versions of the workflow"},"developer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Developer Id","description":"ID of developer of the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"private":{"type":"boolean","title":"Private","description":"Flag if the workflow is hosted in a private git repository","default":false}},"type":"object","required":["name","short_description","repository_url","workflow_id","versions"],"title":"WorkflowOut"},"WorkflowStatistic":{"properties":{"day":{"type":"string","format":"date","title":"Day","description":"Day of the datapoint","examples":["2023-01-01"]},"count":{"type":"integer","title":"Count","description":"Number of started workflows on that day","examples":[1]}},"type":"object","required":["day","count"],"title":"WorkflowStatistic"},"WorkflowUpdate":{"properties":{"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"append_modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","title":"Append Modes","description":"Add modes to the new workflow version"},"delete_modes":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Delete Modes","description":"Delete modes for the new workflow version.","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["version","git_commit_hash"],"title":"WorkflowUpdate"},"WorkflowVersionMetadataIn":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataIn"},"WorkflowVersionMetadataOut":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataOut"},"WorkflowVersionOut":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the corresponding workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1640991600]},"modes":{"items":{"type":"string"},"type":"array","title":"Modes","description":"Optional modes his workflow version has","default":[],"examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"parameter_extension":{"anyOf":[{"$ref":"#/components/schemas/ParameterExtension-Output"},{"type":"null"}],"description":"Parameter extension specific for this CloWM instance"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["status","workflow_id","version","workflow_version_id","created_at","nextflow_version"],"title":"WorkflowVersionOut"},"WorkflowVersionStatus":{"type":"string","enum":["CREATED","DENIED","PUBLISHED","DEPRECATED"],"title":"WorkflowVersionStatus","description":"Enumeration for the possible status of a workflow version."},"WorkflowVersionStatusSchema":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]}},"type":"object","required":["status"],"title":"WorkflowVersionStatusSchema"}},"securitySchemes":{"Session Token":{"type":"apiKey","description":"The JWT in this cookie is used by the website and should not be used when communicating directly with the API.","in":"cookie","name":"clowm-jwt"}}}}
\ No newline at end of file
+{"openapi":"3.1.0","info":{"title":"CloWM UI API","description":"This is the API for the CloWM UI. It is only for internal use and will change without prior notice.","version":"1.0"},"servers":[{"url":"/api"}],"paths":{"/auth/login/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the login flow","description":"Redirect route to OIDC provider to kickstart the login process.","operationId":"Auth-kickstart_login","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"},{"name":"invitation_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":43,"maxLength":43},{"type":"null"}],"description":"Unique token to validate an invitation","title":"Invitation Token"},"description":"Unique token to validate an invitation"},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Will be appended to redirect response in the callback route as URL query parameter `next`","title":"Next"},"description":"Will be appended to redirect response in the callback route as URL query parameter `next`"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the login process with an OIDC Provider.\n\nVisit the route login route to start the login process.\n\nIf the user is already known to the system, then a JWT token will be created and sent via the 'set-cookie' header.\nThe key for this Cookie is 'bearer'.\n\nIf the user is new, he will be created him and then a JWT token is issued.\n\nThis JWT has to be sent to all authorized endpoints via the HTTPBearer scheme.","operationId":"Auth-login_callback","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=fake-jwt-cookie; Domain=localhost; Max-Age=691200; Path=/; SameSite=strict; Secure"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/connect/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the account connection flow","description":"Redirect route to OIDC provider to connect the CloWM account with the AAI account.","operationId":"Auth-kickstart_account_connection","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the account connection process with an OIDC provider.","operationId":"Auth-account_connection_callback","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"get":{"tags":["Auth"],"summary":"Logout","description":"Logout the user from the system by deleting the bearer cookie.","operationId":"Auth-logout","responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=; Domain=localhost; Max-Age=0; Path=/; SameSite=strict; Secure"}}}}}}},"/ui/tokens":{"get":{"tags":["APIToken"],"summary":"List API token","description":"List meta information about all API token.\n\nPermissions `api_token:list_all` required. See parameter `uid` for exception.","operationId":"APIToken-list_token","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiTokenOut"},"title":"Response Apitoken-List Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["APIToken"],"summary":"Create new API token","description":"Create a new API token for the current user.\n\nPermission `api_token:create` required.","operationId":"APIToken-create_token","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenIn","description":"Meta-data for Api token to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenPrivateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/tokens/{tid}":{"get":{"tags":["APIToken"],"summary":"Get API token","description":"Get an API token by id.\n\nPermission `api_token:read` required if the current user is the owner of the API token,\notherwise `api_token:read_any` required.","operationId":"APIToken-get_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["APIToken"],"summary":"Delete API token","description":"Delete an API token by id.\n\nPermission `api_token:delete` required if the current user is the owner of the API token,\notherwise `api_token:delete_any` required.","operationId":"APIToken-delete_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users":{"post":{"tags":["User"],"summary":"Create User","description":"Create a new user in the system and notify him.\n\nPermission `user:create` required.","operationId":"User-create_user","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserIn","description":"Meta-data for user to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["User"],"summary":"List users and search by their name","description":"List all users in the system..\n\nPermission `user:list` required.","operationId":"User-list_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter users by a substring in their name.","examples":["Bilbo"],"title":"Name Substring"},"description":"Filter users by a substring in their name."},{"name":"filter_roles","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/RoleEnum"}},{"type":"null"}],"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression.","title":"Filter Roles"},"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOutExtended"},"title":"Response User-List Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/search":{"get":{"tags":["User"],"summary":"Search Users","description":"Search for users in the system by their name.\n\nPermission `user: search` required.","operationId":"User-search_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":30,"description":"Filter users by a substring in their name.","title":"Name Substring"},"description":"Filter users by a substring in their name."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOut"},"title":"Response User-Search Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/me":{"get":{"tags":["User"],"summary":"Get the logged in user","description":"Return the user associated with the used JWT.\n\nPermission `user:read` required.","operationId":"User-get_logged_in_user","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}}},"security":[{"Session Token":[]}]}},"/ui/users/{uid}":{"get":{"tags":["User"],"summary":"Get a user by its uid","description":"Return the user with the specific uid.\n\nPermission `user:read` required.","operationId":"User-get_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["User"],"summary":"Delete a user","description":"Delete a user and his S3 account.\n\nPermission `user:delete` required if the current user is the target user.","operationId":"User-delete_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/roles":{"put":{"tags":["User"],"summary":"Update user roles","description":"Update the roles of a user.\n\nPermission `user:update` required.","operationId":"User-update_roles","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRoles","description":"The new roles of the user"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/invitation":{"patch":{"tags":["User"],"summary":"Resend Invitation","description":"Resend the invitation link for an user that has an open invitation.\n\nPermission `user:create` required.","operationId":"User-resend_invitation","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys":{"get":{"tags":["S3Key"],"summary":"Get the S3 Access keys from a user","description":"Get all the S3 Access keys for a specific user.\n\nPermission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required.","operationId":"S3Key-get_user_keys","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/S3Key"},"title":"Response S3Key-Get User Keys"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["S3Key"],"summary":"Create a Access key for a user","description":"Create a S3 Access key for a specific user.\n\nPermission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required.","operationId":"S3Key-create_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys/{access_id}":{"get":{"tags":["S3Key"],"summary":"Get a specific S3 Access key from a user","description":"Get a specific S3 Access Key for a specific user.\n\nPermission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required.","operationId":"S3Key-get_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["S3Key"],"summary":"Delete a specific S3 Access key from a user","description":"Delete a specific S3 Access key for a specific user.\n\nPermission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.","operationId":"S3Key-delete_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets":{"get":{"tags":["Bucket"],"summary":"List buckets","description":"List all the buckets in the system or of the desired user where the user has permissions for.\n\nPermission `bucket:list_all` required. See parameter `owner_id` for exception.","operationId":"Bucket-list_buckets","security":[{"Session Token":[]}],"parameters":[{"name":"owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Owner Id"},"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target."},{"name":"bucket_type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/BucketType","description":"Type of the bucket to get. Ignored when `user` parameter not set","default":"ALL"},"description":"Type of the bucket to get. Ignored when `user` parameter not set"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketOut"},"title":"Response Bucket-List Buckets"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket for the current user","description":"Create a bucket for the current user.\n\nThe name of the bucket has some constraints.\nFor more information see the\n[Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints)\n\nPermission `bucket:create` required.","operationId":"Bucket-create_bucket","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketIn","description":"Meta-data for bucket to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"List bucket OTRs","description":"Get the ownership transfer requests for buckets.\n\nPermission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `bucket:list_all`","operationId":"Bucket-list_bucket_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Bucket-List Bucket Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}":{"get":{"tags":["Bucket"],"summary":"Get a bucket by its name","description":"Get a bucket by its name if the current user has READ permissions for the bucket.\n\nPermission `bucket:read` required if the current user is the owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket","description":"Delete a bucket by its name. Only the owner of the bucket can delete the bucket.\n\nPermission `bucket:delete` required if the current user is the owner of the bucket,\notherwise `bucket:delete_any` required.","operationId":"Bucket-delete_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"force_delete","in":"query","required":false,"schema":{"type":"boolean","description":"Delete even non-empty bucket","default":false,"title":"Force Delete"},"description":"Delete even non-empty bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"Get a bucket OTR","description":"Get a specific bucket ownership transfer request.\n\nPermission `bucket:read` required if the current user is the current or new owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket OTR","description":"Create a ownership transfer request for a specific bucket.\n\nPermission `bucket:update` required if the current user is the current owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-create_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the bucket OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Bucket"],"summary":"Accept a bucket OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `bucket:update` required if the current user is the new owner of the workflow,\notherwise `bucket:update_any` required.","operationId":"Bucket-accept_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket OTR","description":"Delete/Reject a bucket ownership transfer request.\n\nPermission `bucket:update` required if the current user is the current or new owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-delete_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/public":{"patch":{"tags":["Bucket"],"summary":"Update public status","description":"Update the buckets public state.\n\nPermission `bucket:update` required if the current user is the owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-update_bucket_public_state","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_Bucket-update_bucket_public_state"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/limits":{"patch":{"tags":["Bucket"],"summary":"Update bucket limits","description":"Update the buckets size limits.\n\nPermission `bucket:update_any` required.","operationId":"Bucket-update_bucket_limits","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketSizeLimits","description":"New size limits for bucket"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions.","description":"List all the bucket permissions in the system.\n\nPermission `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions","security":[{"Session Token":[]}],"parameters":[{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["BucketPermission"],"summary":"Create a permission.","description":"Create a permission for a bucket and user.\n\nPermission `bucket_permission:create` required.","operationId":"BucketPermission-create_permission","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionIn","description":"Permission to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a user.","description":"List all the bucket permissions for the given user.\n\nPermission `bucket_permission:list` required if current user is the target the bucket permission,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a bucket.","description":"List all the bucket permissions for the given bucket.\n\nPermission `bucket_permission:list` required if current user is owner of the bucket,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per Bucket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get permission for bucket and user combination.","description":"Get the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:read` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:read_any` required.","operationId":"BucketPermission-get_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["BucketPermission"],"summary":"Update a bucket permission","description":"Update a permission for a bucket and user.\n\nPermission `bucket_permission:update` required.","operationId":"BucketPermission-update_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionParameters","description":"Permission to create"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["BucketPermission"],"summary":"Delete a bucket permission","description":"Delete the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:delete` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:delete_any` required.","operationId":"BucketPermission-delete_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows":{"post":{"tags":["Workflow"],"summary":"Create a new workflow","description":"Create a new workflow.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow-create_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowIn","description":"Meta-date for the workflow to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow"],"summary":"List workflows","description":"List all workflows.\n\nPermission `workflow:list` required.","operationId":"Workflow-list_workflows","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter workflows by a substring in their name.","examples":["blast"],"title":"Name Substring"},"description":"Filter workflows by a substring in their name."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`.","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`."},{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowOut"},"title":"Response Workflow-List Workflows"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"List workflow OTRs","description":"Get the ownership transfer requests for workflows.\n\nPermission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `workflow:list_all`","operationId":"Workflow-list_workflow_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Workflow-List Workflow Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/developer_statistics":{"get":{"tags":["Workflow"],"summary":"Get anonymized workflow execution","description":"Get the workflow executions with meta information and anonymized user IDs.\n\nPermission `workflow:read` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:read_any`.","operationId":"Workflow-get_developer_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter by the developer of the workflows","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter by the developer of the workflows"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"description":"Filter by workflow IDs","title":"Workflow Id"},"description":"Filter by workflow IDs"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions after this date","title":"Start"},"description":"Filter by workflow executions after this date"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions before this date","title":"End"},"description":"Filter by workflow executions before this date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnonymizedWorkflowExecution"},"title":"Response Workflow-Get Developer Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}":{"get":{"tags":["Workflow"],"summary":"Get a workflow","description":"Get a specific workflow.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow","description":"Delete a workflow.\n\nPermission `workflow:delete` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:delete_any`.","operationId":"Workflow-delete_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"Get a workflow OTR","description":"Get a specific workflow ownership transfer request.\n\nPermission `workflow:read` required if current user is the current or new owner of the workflow,\notherwise `workflow:read_any` required.","operationId":"Workflow-get_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workflow"],"summary":"Create a workflow OTR","description":"Create a ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the current owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-create_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for workflow OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Workflow"],"summary":"Accept a workflow OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-accept_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow OTR","description":"Delete/Reject a workflow ownership transfer request.\n\nPermission `workflow:update` required if current user is the current or new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-delete_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/statistics":{"get":{"tags":["Workflow"],"summary":"Get statistics for a workflow","description":"Get the number of started workflow per day.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowStatistic"},"title":"Response Workflow-Get Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/update":{"post":{"tags":["Workflow"],"summary":"Update a workflow","description":"Create a new workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow-update_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdate","description":"Meta-data for the workflow version to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions":{"get":{"tags":["Workflow Version"],"summary":"Get all versions of a workflow","description":"List all versions of a Workflow.\n\nPermission `workflow:list` required.","operationId":"Workflow Version-list_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"title":"Response Workflow Version-List Workflow Version"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}":{"get":{"tags":["Workflow Version"],"summary":"Get a workflow version","description":"Get a specific version of a workflow.\n\nPermission `workflow:read` required if the version is public or you are the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit `git_commit_hash` of specific version or `latest`.","examples":["latest","ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit `git_commit_hash` of specific version or `latest`."},{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/status":{"patch":{"tags":["Workflow Version"],"summary":"Update status of workflow version","description":"Update the status of a workflow version.\n\nPermission `workflow:update_status`","operationId":"Workflow Version-update_workflow_version_status","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionStatusSchema","description":"New Status of the workflow version"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/metadata":{"get":{"tags":["Workflow Version"],"summary":"Get metadata of workflow version","description":"Get the metadata of a workflow version.\n\nPermission `workflow:read` required if the current user is the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Version"],"summary":"Update metadata of workflow version","description":"Update the metadata of a workflow version.\n\nPermission `workflow:update` required if the current user is the developer of the workflow,\notherwise `workflow:update_any`","operationId":"Workflow Version-update_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate":{"patch":{"tags":["Workflow Version"],"summary":"Deprecate a workflow version","description":"Deprecate a workflow version.\n\nPermission `workflow:update` required if you are the developer of the workflow,\notherwise `workflow:update_status`","operationId":"Workflow Version-deprecate_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension":{"patch":{"tags":["Workflow Version"],"summary":"Update parameter extension of workflow version","description":"Update the parameter extension of a workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-update_workflow_version_parameter_extension","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParameterExtension-Input","description":"Parameter extension specific for this CloWM instance"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/documentation":{"get":{"tags":["Workflow Version"],"summary":"Fetch documentation for a workflow version","description":"Get the documentation for a specific workflow version.\nStreams the response directly from the right git repository.\n\nPermission `workflow:read` required.","operationId":"Workflow Version-download_workflow_documentation","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."},{"name":"document","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DocumentationEnum","description":"Specify which type of documentation the client wants to fetch","default":"usage.md"},"description":"Specify which type of documentation the client wants to fetch"},{"name":"mode_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Workflow Mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"Workflow Mode"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/icon":{"post":{"tags":["Workflow Version"],"summary":"Upload icon for workflow version","description":"Upload an icon for the workflow version and returns the new icon URL.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-upload_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_Workflow_Version-upload_workflow_version_icon"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Version"],"summary":"Delete icon of workflow version","description":"Delete the icon of the workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-delete_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions":{"post":{"tags":["Workflow Execution"],"summary":"Start a new workflow execution","description":"Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.\n\nPermission `workflow_execution:create` required if workflow versions status is `PUBLISHED`,\notherwise `workflow_execution:create_any` required.","operationId":"Workflow Execution-start_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow Execution"],"summary":"List all workflow executions","description":"Get all workflow executions.\n\nThis endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the\n`Link` header.\nA missing `Link` header indicates that you iterated over all workflow executions with the current filters.\n\nPermission `workflow_execution:list` required, if `executor_id` is the same as the current user,\notherwise `workflow_execution:list_all` required.","operationId":"Workflow Execution-list_workflow_executions","security":[{"Session Token":[]}],"parameters":[{"name":"executor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Executor Id"},"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required."},{"name":"execution_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionStatus"}},{"type":"null"}],"description":"Filter for status of workflow execution","title":"Execution Status"},"description":"Filter for status of workflow execution"},{"name":"workflow_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":40,"maxLength":40,"pattern":"^[0-9a-f]+$"},{"type":"null"}],"description":"Filter for workflow version","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Workflow Version Id"},"description":"Filter for workflow version"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Workflow Id"},"description":"Filter for workflow"},{"name":"start_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started after this UNIX timestamp","examples":[1640991600],"title":"Start After"},"description":"Filter for workflow executions that started after this UNIX timestamp"},{"name":"start_before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started before this UNIX timestamp","examples":[1640991600],"title":"Start Before"},"description":"Filter for workflow executions that started before this UNIX timestamp"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionOut"},"title":"Response Workflow Execution-List Workflow Executions"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/workflow_executions?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/arbitrary":{"post":{"tags":["Workflow Execution"],"summary":"Start a workflow execution with arbitrary git repository","description":"Start a new workflow execution from an arbitrary git repository.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow Execution-start_arbitrary_workflow","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevWorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Session Token":[]}]}},"/ui/workflow_executions/{eid}":{"get":{"tags":["Workflow Execution"],"summary":"Get a workflow execution","description":"Get a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Execution"],"summary":"Delete a workflow execution","description":"Delete a specific workflow execution.\n\nPermission `workflow_execution:delete` required if the current user started the workflow execution,\notherwise `workflow_execution:delete_any` required.","operationId":"Workflow Execution-delete_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/params":{"get":{"tags":["Workflow Execution"],"summary":"Get the parameters of a workflow execution","description":"Get the parameters of a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution_params","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Workflow Execution-Get Workflow Execution Params"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/cancel":{"post":{"tags":["Workflow Execution"],"summary":"Cancel a workflow execution","description":"Cancel a running workflow execution.\n\nPermission `workflow_execution:cancel` required if the current user started the workflow execution,\notherwise `workflow_execution:cancel_any` required.","operationId":"Workflow Execution-cancel_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/credentials":{"get":{"tags":["Workflow Credentials"],"summary":"Get the credentials of a workflow","description":"Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-get_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Credentials"],"summary":"Update the credentials of a workflow","description":"Update the credentials for the repository of a workflow.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-update_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsIn","description":"Updated credentials for the workflow git repository"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Credentials"],"summary":"Delete the credentials of a workflow","description":"Delete the credentials for the repository of a workflow.\n\nPermission `workflow:delete` required if the developer of the workflow is the same as the current user,\nother `workflow:delete_any`.","operationId":"Workflow Credentials-delete_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_modes/{mode_id}":{"get":{"tags":["Workflow Mode"],"summary":"Get workflow mode","description":"Get a workflow mode.\n\nPermission `workflow:read` required","operationId":"Workflow Mode-get_workflow_mode","security":[{"Session Token":[]}],"parameters":[{"name":"mode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"ID of a workflow mode"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowModeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources":{"post":{"tags":["Resource"],"summary":"Request a new resource","description":"Request a new resources.\n\nPermission `resource:create` required.","operationId":"Resource-create_resource","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceIn","description":"Meta-data for the resource to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Resource"],"summary":"List resources","description":"List all resources.\n\nPermission `resource:list` required.","operationId":"Resource-list_resources","security":[{"Session Token":[]}],"parameters":[{"name":"maintainer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Maintainer Id"},"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required."},{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"Filter resources by a substring in their name.","examples":["gtdb"],"title":"Name Substring"},"description":"Filter resources by a substring in their name."},{"name":"public","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter resources to by the public flag","title":"Public"},"description":"Filter resources to by the public flag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceOut"},"title":"Response Resource-List Resources"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/sync_requests":{"get":{"tags":["Resource"],"summary":"List resource sync requests","description":"List all resource sync requests.\n\nPermission `resource:update_any` required.","operationId":"Resource-list_sync_requests","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserSynchronizationRequestOut"},"type":"array","title":"Response Resource-List Sync Requests"}}}}},"security":[{"Session Token":[]}]}},"/ui/resources/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"List resource OTRs","description":"Get the ownership transfer requests for resources.\n\nPermission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `resource:list_all`","operationId":"Resource-list_resource_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Resource-List Resource Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}":{"get":{"tags":["Resource"],"summary":"Get a resource","description":"Get a specific resource.\n\nPermission `resource:read` required.","operationId":"Resource-get_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource","description":"Delete a resources.\n\nPermission `resource:delete` required.","operationId":"Resource-delete_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"Get a resource OTR","description":"Get a specific resource ownership transfer request.\n\nPermission `resource:read` required if the current user is the current or new owner of the resource,\notherwise `resource:read_any` required.","operationId":"Resource-get_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Resource"],"summary":"Create a resource OTR","description":"Create a ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the current owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-create_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the resource OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Resource"],"summary":"Accept a resource OTR","description":"Accept an ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-accept_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource OTR","description":"Delete/Reject a resource ownership transfer request.\n\nPermission `resource:update` required if the current user is the current or new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-delete_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions":{"get":{"tags":["ResourceVersion"],"summary":"List versions of a resource","description":"List all the resource version for a specific resource.\n\nPermission 'resource:read' required.","operationId":"ResourceVersion-list_resource_versions","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionOut"},"title":"Response Resourceversion-List Resource Versions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ResourceVersion"],"summary":"Request new version of a resource","description":"Request a new resource version.\n\nPermission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise.","operationId":"ResourceVersion-request_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionIn","description":"Meta-data for the resource version to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}":{"get":{"tags":["ResourceVersion"],"summary":"Get version of a resource","description":"Get a specific resource version for a specific resource.\n\nPermission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and\nthe current user is not the maintainer, then the permission `resource:read_any` is required.","operationId":"ResourceVersion-get_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/tree":{"get":{"tags":["ResourceVersion"],"summary":"Download folder structure of resource","description":"Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster.\n\nPermission `resource:read` required.","operationId":"ResourceVersion-resource_file_tree","security":[{"Session Token":[]}],"parameters":[{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileTree"},"title":"Response Resourceversion-Resource File Tree"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_review":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version review","description":"Request the review of a resource version.\n\nPermission `resource:update` required.","operationId":"ResourceVersion-request_resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_sync":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version synchronization","description":"Request the synchronization of a resource version to the cluster.\n\nPermission `resource:request_sync` required.","operationId":"ResourceVersion-request_resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSynchronizationRequestIn","description":"Meta-data for the synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/review":{"put":{"tags":["ResourceVersion"],"summary":"Review resource version","description":"Review answer the resource version.\n\nPermission `resource:update_status` required.","operationId":"ResourceVersion-resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer for the resource version review"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/sync":{"put":{"tags":["ResourceVersion"],"summary":"Synchronize resource version with cluster","description":"Synchronize the resource version to the cluster.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer to the resource version synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/latest":{"put":{"tags":["ResourceVersion"],"summary":"Set resource version to latest","description":"Set the resource version as the latest version.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_latest","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/cluster":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version on cluster","description":"Delete the resource version on the cluster.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_cluster","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/s3":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version in S3","description":"Delete the resource version in the S3 bucket.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_s3","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news":{"post":{"tags":["News"],"summary":"Create news","description":"Create a news event.\n\nPermission `news:create` required.","operationId":"News-create_news","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsIn","description":"Meta-data for news event to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["News"],"summary":"List news","description":"List all news events with filters.\n\nThis endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header.\nA missing `Link` header indicates that you iterated over all news with the current filters.\n\nPermission `news:list` required.","operationId":"News-list_news","security":[{"Session Token":[]}],"parameters":[{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967296,"minimum":0},{"type":"null"}],"description":"Filter for news that are created after this UNIX timestamp","title":"Created After"},"description":"Filter for news that are created after this UNIX timestamp"},{"name":"creator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for news created by a specific user","title":"Creator Id"},"description":"Filter for news created by a specific user"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NewsOut"},"title":"Response News-List News"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/news?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news/latest":{"get":{"tags":["News"],"summary":"Get latest news","description":"List the current news events.\n\nPermission `news:list` required.","operationId":"News-list_latest_news","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NewsOut"},"type":"array","title":"Response News-List Latest News"}}}}},"security":[{"Session Token":[]}]}},"/ui/news/{nid}":{"get":{"tags":["News"],"summary":"Get a specific news","description":"Get a specified news event.\n\nPermission `news:read` required.","operationId":"News-get_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["News"],"summary":"Delete a specific news","description":"Delete a specified news event.\n\nPermission `news:delete` required.","operationId":"News-delete_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/public/workflows":{"get":{"tags":["Public"],"summary":"Get available workflows","description":"Public route to fetch all available workflows.","operationId":"Public-get_public_workflows","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PublicWorkflowOut"},"type":"array","title":"Response Public-Get Public Workflows"}}}}}}}},"components":{"schemas":{"AnonymizedWorkflowExecution":{"properties":{"workflow_execution_id":{"type":"string","title":"Workflow Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"pseudo_uid":{"type":"string","title":"Pseudo Uid","description":"Anonymized user ID of the user who ran the workflow execution","examples":["7ed4249857b656e96f456449796e461e6001d3fb2481a44701f70ca437bd53a2"]},"workflow_mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Mode Id","description":"ID of the workflow mode this workflow execution ran in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"workflow_version_id":{"type":"string","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"started_at":{"type":"string","format":"date","title":"Started At","description":"Day of the workflow execution","examples":["2023-01-01"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"developer_id":{"type":"string","title":"Developer Id","description":"ID of developer of the workflow","examples":["28c5353b8bb34984a8bd4169ba94c606"]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"End status of the workflow execution","examples":["SUCCESS"]}},"type":"object","required":["workflow_execution_id","pseudo_uid","workflow_version_id","started_at","workflow_id","developer_id","status"],"title":"AnonymizedWorkflowExecution"},"ApiTokenIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"}},"type":"object","required":["name","scopes"],"title":"ApiTokenIn"},"ApiTokenOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]}},"type":"object","required":["name","scopes","token_id","uid","created_at"],"title":"ApiTokenOut"},"ApiTokenPrivateOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]},"token":{"type":"string","title":"Token","description":"The actual token used for authentication","examples":["J21NRKUYgyVUgvJ3cIdllS-MMa9ny1UDKFF18aetDvo"]}},"type":"object","required":["name","scopes","token_id","uid","created_at","token"],"title":"ApiTokenPrivateOut"},"Body_Bucket-update_bucket_public_state":{"properties":{"public":{"type":"boolean","title":"Public","description":"New public state"}},"type":"object","required":["public"],"title":"Body_Bucket-update_bucket_public_state"},"Body_Workflow_Version-upload_workflow_version_icon":{"properties":{"icon":{"type":"string","format":"binary","title":"Icon","description":"Icon for the Workflow."}},"type":"object","required":["icon"],"title":"Body_Workflow Version-upload_workflow_version_icon"},"BucketIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]}},"type":"object","required":["name","description"],"title":"BucketIn","description":"Schema for creating a new bucket."},"BucketOut":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]},"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]},"owner_id":{"type":"string","title":"Owner Id","description":"UID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"public":{"type":"boolean","title":"Public","description":"Flag if the bucket is anonymously readable"}},"type":"object","required":["name","description","created_at","owner_id","public"],"title":"BucketOut","description":"Schema for answering a request with a bucket."},"BucketPermissionIn":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","format":"uuid","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionIn"},"BucketPermissionOut":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionOut","description":"Schema for the bucket permissions."},"BucketPermissionParameters":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"}},"type":"object","required":["scopes"],"title":"BucketPermissionParameters","description":"Schema for the parameters of a bucket permission."},"BucketSizeLimits":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]}},"type":"object","title":"BucketSizeLimits","description":"Schema to represent bucket limits."},"BucketType":{"type":"string","enum":["OWN","ALL","PERMISSION"],"title":"BucketType","description":"Enumeration for the type of buckets to fetch from the DB\n\nOWN: Only fetch buckets that the user owns\nPERMISSION: Only fetch foreign buckets that the user has access to\nALL: Fetch all buckets that the user has access to"},"DevWorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"mode":{"anyOf":[{"$ref":"#/components/schemas/WorkflowModeIn"},{"type":"null"}],"description":"Mode of the workflow with an alternative entrypoint"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow execution requires"}},"type":"object","required":["parameters","git_commit_hash","repository_url","nextflow_version"],"title":"DevWorkflowExecutionIn"},"DocumentationEnum":{"type":"string","enum":["usage.md","input.md","output.md","changelog.md","parameter_schema.json","clowm_info.json","CITATIONS.md"],"title":"DocumentationEnum"},"FileTree":{"properties":{"type":{"type":"string","enum":["file","directory","link"],"title":"Type"},"name":{"type":"string","title":"Name"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"contents":{"anyOf":[{"items":{"$ref":"#/components/schemas/FileTree"},"type":"array"},{"type":"null"}],"title":"Contents"},"size":{"type":"integer","title":"Size"}},"type":"object","required":["type","name","size"],"title":"FileTree"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IconUpdateOut":{"properties":{"icon_url":{"type":"string","minLength":1,"format":"uri","title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["icon_url"],"title":"IconUpdateOut"},"InstanceSpecificDefaultParameters":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}]},"type":"object"},"NewsIn":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event","default":"system"}},"type":"object","required":["content","title"],"title":"NewsIn"},"NewsOut":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event"},"news_id":{"type":"string","title":"News Id","description":"ID of the news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"]},"creator_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Id","description":"ID of the creator","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]}},"type":"object","required":["content","title","category","news_id","created_at"],"title":"NewsOut"},"NextflowVersion":{"type":"string","enum":["22.10.0","22.10.1","22.10.2","22.10.3","22.10.4","22.10.5","22.10.6","22.10.7","22.10.8","23.04.0","23.04.1","23.04.2","23.04.3","23.04.4","23.04.5","23.10.0","23.10.1","23.10.2","23.10.3","23.10.4","24.04.1","24.04.2","24.04.3","24.04.4","24.10.0"],"title":"NextflowVersion"},"OIDCProvider":{"type":"string","enum":["lifescience-aai","nfdi-aai"],"title":"OIDCProvider"},"OwnershipTransferRequestIn":{"properties":{"new_owner_uid":{"type":"string","format":"uuid","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Comment","description":"An optional comment for the transfer request","examples":["This is an example comment"]}},"type":"object","required":["new_owner_uid"],"title":"OwnershipTransferRequestIn"},"OwnershipTransferRequestOut":{"properties":{"new_owner_uid":{"type":"string","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"type":"string","title":"Comment","description":"An optional comment for the transfer request","default":"","examples":["This is an example comment"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Time when the ownership transfer was requested as UNIX timestamp","examples":[1640991600]},"current_owner_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Owner Uid","description":"The current uid of the current owner if he exists","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"target_id":{"type":"string","title":"Target Id","description":"Id of the target that gets its ownership transferred"},"target_name":{"type":"string","title":"Target Name","description":"Name of the target","examples":["example-bucket","Example Workflow","Example Resource"]},"target_description":{"type":"string","title":"Target Description","description":"Description of then target","examples":["Some long description of a target"]},"target_type":{"$ref":"#/components/schemas/OwnershipTypeEnum","description":"Target type of the ownership transfer","examples":["bucket"]}},"type":"object","required":["new_owner_uid","created_at","target_id","target_name","target_description","target_type"],"title":"OwnershipTransferRequestOut"},"OwnershipTypeEnum":{"type":"string","enum":["bucket","workflow","resource"],"title":"OwnershipTypeEnum"},"ParameterExtension-Input":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterExtension-Output":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterVisibility":{"type":"integer","enum":[10,20,30,40],"title":"ParameterVisibility"},"ParameterVisibilityMapping":{"additionalProperties":{"$ref":"#/components/schemas/ParameterVisibility"},"type":"object"},"PermissionStatus":{"type":"string","enum":["ACTIVE","INACTIVE"],"title":"PermissionStatus","description":"Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the\npermission itself has a time limit and the current time is not in the timespan."},"PublicWorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"latest_git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Latest Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"latest_version_tag":{"type":"string","maxLength":10,"minLength":5,"title":"Latest Version Tag","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"developer":{"type":"string","title":"Developer","description":"Name of the developer","default":"","examples":["Bilbo Baggins"]},"latest_version_timestamp":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Latest Version Timestamp","description":"Timestamp when the last version was created as UNIX timestamp","examples":[1640991600]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the workflow icon","readOnly":true,"examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["name","short_description","repository_url","workflow_id","latest_git_commit_hash","latest_version_tag","latest_version_timestamp","icon_url"],"title":"PublicWorkflowOut"},"ResourceIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true}},"type":"object","required":["release","name","description","source"],"title":"ResourceIn"},"ResourceOut":{"properties":{"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"maintainer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maintainer Id","description":"ID of the maintainer","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"versions":{"items":{"$ref":"#/components/schemas/ResourceVersionOut"},"type":"array","title":"Versions","description":"Versions of the resource"}},"type":"object","required":["name","description","source","resource_id","maintainer_id","versions"],"title":"ResourceOut"},"ResourceVersionIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]}},"type":"object","required":["release"],"title":"ResourceVersionIn"},"ResourceVersionOut":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"status":{"$ref":"#/components/schemas/ResourceVersionStatus","description":"Status of the resource version"},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1672527600]},"compressed_size":{"type":"integer","maximum":1.8446744073709552e+19,"minimum":0.0,"title":"Compressed Size","description":"Size of the compressed resource in bytes","examples":[42097156608]},"cluster_path":{"type":"string","title":"Cluster Path","description":"Path to the resource on the cluster if the resource is synchronized","readOnly":true,"examples":["/vol/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4","/vol/resources/CLDB-0e240ccd/latest"]},"s3_path":{"type":"string","title":"S3 Path","description":"Path to the resource in the S3 Bucket. Not publicly available.","readOnly":true,"examples":["s3://clowm-data/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4/resource.tar.gz"]}},"type":"object","required":["release","status","resource_version_id","resource_id","created_at","compressed_size","cluster_path","s3_path"],"title":"ResourceVersionOut"},"ResourceVersionStatus":{"type":"string","enum":["RESOURCE_REQUESTED","WAIT_FOR_REVIEW","DENIED","APPROVED","SYNC_REQUESTED","SYNCHRONIZING","SYNC_ERROR","SYNCHRONIZED","SETTING_LATEST","LATEST","CLUSTER_DELETING","CLUSTER_DELETE_ERROR","S3_DELETING","S3_DELETE_ERROR","S3_DELETED"],"title":"ResourceVersionStatus","description":"Enumeration for the possible status of a resource version."},"RoleEnum":{"type":"string","enum":["administrator","user","reviewer","developer","db_maintainer"],"title":"RoleEnum"},"S3Key":{"properties":{"uid":{"type":"string","title":"Uid","description":"UID of the user of that access key","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"access_key":{"type":"string","title":"Access Key","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"]},"secret_key":{"type":"string","title":"Secret Key","description":"Secret of the S3 access key","examples":["2F5uNTI1qvt4oAroXV0wWct8rWclL2QvFXKqSqjS"]}},"type":"object","required":["uid","access_key","secret_key"],"title":"S3Key","description":"Schema for a S3 key associated with a user."},"UserIn":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","examples":[["user"]]},"email":{"type":"string","format":"email","title":"Email","description":"Email of the user","examples":["user@example.org"]}},"type":"object","required":["display_name","email"],"title":"UserIn"},"UserOut":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["display_name","uid"],"title":"UserOut","description":"Schema for a user."},"UserOutExtended":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]},"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"lifescience_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifescience Id","description":"Lifesicence AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"nfdi_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nfdi Id","description":"NFDI AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"invitation_token_created_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invitation Token Created At","description":"Timestamp when the invitation token was created as UNIX timestamp"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email","description":"Email of the user","examples":["user@example.org"]},"gravatar_url":{"type":"string","minLength":1,"format":"uri","title":"Gravatar Url","description":"URL to the gravatar avatar based on the users email","readOnly":true,"examples":["https://gravatar.com/avatar/87a8c45825eb709ee8e453d2c0f8154e1b9bf4b45bb9b81b7662177340aa9d38"]}},"type":"object","required":["roles","display_name","uid","gravatar_url"],"title":"UserOutExtended"},"UserRequestAnswer":{"properties":{"deny":{"type":"boolean","title":"Deny","description":"Flag to indicate if the request was denied.","default":false},"reason":{"anyOf":[{"type":"string","maxLength":512,"minLength":16},{"type":"null"}],"title":"Reason","description":"Reason why the request was denied or approved. Required if request is denied."}},"type":"object","title":"UserRequestAnswer"},"UserRoles":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]}},"type":"object","required":["roles"],"title":"UserRoles"},"UserSynchronizationRequestIn":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]}},"type":"object","required":["reason"],"title":"UserSynchronizationRequestIn"},"UserSynchronizationRequestOut":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"requester_id":{"type":"string","title":"Requester Id","description":"ID of the user that requested this resource synchronization","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["reason","resource_version_id","resource_id","requester_id"],"title":"UserSynchronizationRequestOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkflowCredentialsIn":{"properties":{"token":{"type":"string","maxLength":128,"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","required":["token"],"title":"WorkflowCredentialsIn"},"WorkflowCredentialsOut":{"properties":{"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","title":"WorkflowCredentialsOut"},"WorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["parameters","workflow_version_id"],"title":"WorkflowExecutionIn"},"WorkflowExecutionOut":{"properties":{"workflow_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"execution_id":{"type":"string","title":"Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"executor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executor Id","description":"UID of user who started the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"start_time":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Start Time","description":"Start time of the workflow execution as UNIX timestamp","examples":[1640991600]},"end_time":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"End Time","description":"End time of the workflow execution as UNIX timestamp","examples":[1640991600]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"Status of the workflow execution","examples":["RUNNING"]},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id","description":"Id of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"logs_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where logs and reports are saved.","examples":["s3://example-bucket/logs/run-591b6a6ea1f0420d8a20a7a60704f695"]},"provenance_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where provenance information is saved.","examples":["s3://example-bucket/provenance/run-591b6a6ea1f0420d8a20a7a60704f695"]},"debug_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where debug information from Nextflow is saved.","examples":["s3://example-bucket/debug/run-591b6a6ea1f0420d8a20a7a60704f695"]},"cpu_time":{"type":"string","format":"duration","title":"Cpu Time","description":"The consumed cpu time in ISO 8601 format","examples":["P4DT12H30M5S"]}},"type":"object","required":["execution_id","start_time","status","cpu_time"],"title":"WorkflowExecutionOut"},"WorkflowExecutionStatus":{"type":"string","enum":["PENDING","SCHEDULED","RUNNING","CANCELED","SUCCESS","ERROR"],"title":"WorkflowExecutionStatus","description":"Enumeration for the status on a workflow execution."},"WorkflowIn":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"initial_version":{"type":"string","maxLength":10,"minLength":5,"title":"Initial Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","maxItems":10,"title":"Modes","description":"List of modes with alternative entrypoint the new workflow has","default":[]},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["name","short_description","repository_url","git_commit_hash","initial_version","nextflow_version"],"title":"WorkflowIn"},"WorkflowModeIn":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]}},"type":"object","required":["schema_path","entrypoint","name"],"title":"WorkflowModeIn"},"WorkflowModeOut":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]},"mode_id":{"type":"string","title":"Mode Id","description":"ID of the workflow mode","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["schema_path","entrypoint","name","mode_id"],"title":"WorkflowModeOut"},"WorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"versions":{"items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"type":"array","title":"Versions","description":"Versions of the workflow"},"developer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Developer Id","description":"ID of developer of the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"private":{"type":"boolean","title":"Private","description":"Flag if the workflow is hosted in a private git repository","default":false}},"type":"object","required":["name","short_description","repository_url","workflow_id","versions"],"title":"WorkflowOut"},"WorkflowStatistic":{"properties":{"day":{"type":"string","format":"date","title":"Day","description":"Day of the datapoint","examples":["2023-01-01"]},"count":{"type":"integer","title":"Count","description":"Number of started workflows on that day","examples":[1]}},"type":"object","required":["day","count"],"title":"WorkflowStatistic"},"WorkflowUpdate":{"properties":{"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"append_modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","title":"Append Modes","description":"Add modes to the new workflow version"},"delete_modes":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Delete Modes","description":"Delete modes for the new workflow version.","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["version","git_commit_hash"],"title":"WorkflowUpdate"},"WorkflowVersionMetadataIn":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataIn"},"WorkflowVersionMetadataOut":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataOut"},"WorkflowVersionOut":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the corresponding workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1640991600]},"modes":{"items":{"type":"string"},"type":"array","title":"Modes","description":"Optional modes his workflow version has","default":[],"examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"parameter_extension":{"anyOf":[{"$ref":"#/components/schemas/ParameterExtension-Output"},{"type":"null"}],"description":"Parameter extension specific for this CloWM instance"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["status","workflow_id","version","workflow_version_id","created_at","nextflow_version"],"title":"WorkflowVersionOut"},"WorkflowVersionStatus":{"type":"string","enum":["CREATED","DENIED","PUBLISHED","DEPRECATED"],"title":"WorkflowVersionStatus","description":"Enumeration for the possible status of a workflow version."},"WorkflowVersionStatusSchema":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]}},"type":"object","required":["status"],"title":"WorkflowVersionStatusSchema"}},"securitySchemes":{"Session Token":{"type":"apiKey","description":"The JWT in this cookie is used by the website and should not be used when communicating directly with the API.","in":"cookie","name":"clowm-jwt"}}}}
\ No newline at end of file
diff --git a/openapi-ts.config.ts b/openapi-ts.config.ts
index d9408aa..f5b45af 100644
--- a/openapi-ts.config.ts
+++ b/openapi-ts.config.ts
@@ -2,7 +2,6 @@ import { defineConfig } from "@hey-api/openapi-ts";
 
 export default defineConfig({
   input: "./openapi-clowm.json",
-  experimentalParser: false,
   output: {
     lint: "eslint",
     format: "prettier",
diff --git a/package-lock.json b/package-lock.json
index c09f06b..ea13ca0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,7 +13,7 @@
         "@aws-sdk/lib-storage": "<3.729.0",
         "@aws-sdk/s3-request-presigner": "<3.729.0",
         "@fortawesome/fontawesome-free": "~6.7.0",
-        "@hey-api/client-axios": "0.5.2",
+        "@hey-api/client-axios": "0.6.0",
         "@popperjs/core": "~2.11.8",
         "ajv": "~8.17.0",
         "bootstrap": "~5.3.0",
@@ -35,7 +35,7 @@
       },
       "devDependencies": {
         "@eslint/compat": "^1.2.0",
-        "@hey-api/openapi-ts": "^0.63.0",
+        "@hey-api/openapi-ts": "^0.64.0",
         "@rushstack/eslint-patch": "~1.10.0",
         "@tsconfig/node22": "^22.0.0",
         "@types/bootstrap": "~5.2.0",
@@ -55,7 +55,7 @@
         "prettier": "~3.4.0",
         "sass": "^1.66.0",
         "typescript": "~5.7.0",
-        "vite": "~6.0.0",
+        "vite": "~6.1.0",
         "vite-plugin-node-polyfills": "^0.23.0",
         "vue-tsc": "~2.2.0"
       }
@@ -331,19 +331,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/client-sso": {
       "version": "3.726.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.726.0.tgz",
@@ -446,32 +433,6 @@
         "@aws-sdk/client-sts": "^3.726.0"
       }
     },
-    "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
-    "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/client-sts": {
       "version": "3.726.1",
       "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.726.1.tgz",
@@ -523,19 +484,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/core": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.723.0.tgz",
@@ -558,19 +506,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/core/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/credential-provider-env": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.723.0.tgz",
@@ -587,19 +522,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/credential-provider-http": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.723.0.tgz",
@@ -621,19 +543,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/credential-provider-ini": {
       "version": "3.726.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.726.0.tgz",
@@ -660,19 +569,6 @@
         "@aws-sdk/client-sts": "^3.726.0"
       }
     },
-    "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/credential-provider-node": {
       "version": "3.726.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.726.0.tgz",
@@ -696,19 +592,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/credential-provider-process": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.723.0.tgz",
@@ -726,19 +609,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/credential-provider-sso": {
       "version": "3.726.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.726.0.tgz",
@@ -758,19 +628,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/credential-provider-web-identity": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.723.0.tgz",
@@ -790,19 +647,6 @@
         "@aws-sdk/client-sts": "^3.723.0"
       }
     },
-    "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/lib-storage": {
       "version": "3.726.1",
       "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.726.1.tgz",
@@ -842,19 +686,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/middleware-expect-continue": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.723.0.tgz",
@@ -870,19 +701,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/middleware-flexible-checksums": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.723.0.tgz",
@@ -907,19 +725,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/middleware-host-header": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.723.0.tgz",
@@ -935,19 +740,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/middleware-host-header/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/middleware-location-constraint": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.723.0.tgz",
@@ -962,19 +754,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/middleware-location-constraint/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/middleware-logger": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.723.0.tgz",
@@ -989,19 +768,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/middleware-logger/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/middleware-recursion-detection": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.723.0.tgz",
@@ -1017,19 +783,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/middleware-sdk-s3": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.723.0.tgz",
@@ -1055,19 +808,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/middleware-ssec": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.723.0.tgz",
@@ -1082,19 +822,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/middleware-ssec/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/middleware-user-agent": {
       "version": "3.726.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.726.0.tgz",
@@ -1113,19 +840,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/region-config-resolver": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.723.0.tgz",
@@ -1143,19 +857,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/region-config-resolver/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/s3-request-presigner": {
       "version": "3.726.1",
       "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.726.1.tgz",
@@ -1175,19 +876,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/s3-request-presigner/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/signature-v4-multi-region": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.723.0.tgz",
@@ -1205,19 +893,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/token-providers": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.723.0.tgz",
@@ -1237,7 +912,7 @@
         "@aws-sdk/client-sso-oidc": "^3.723.0"
       }
     },
-    "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": {
+    "node_modules/@aws-sdk/types": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
       "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
@@ -1250,19 +925,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/types": {
-      "version": "3.734.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.734.0.tgz",
-      "integrity": "sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.1.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/util-arn-parser": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.723.0.tgz",
@@ -1290,19 +952,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/util-format-url": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.723.0.tgz",
@@ -1318,19 +967,6 @@
         "node": ">=18.0.0"
       }
     },
-    "node_modules/@aws-sdk/util-format-url/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/util-locate-window": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz",
@@ -1355,19 +991,6 @@
         "tslib": "^2.6.2"
       }
     },
-    "node_modules/@aws-sdk/util-user-agent-browser/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/util-user-agent-node": {
       "version": "3.726.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.726.0.tgz",
@@ -1392,19 +1015,6 @@
         }
       }
     },
-    "node_modules/@aws-sdk/util-user-agent-node/node_modules/@aws-sdk/types": {
-      "version": "3.723.0",
-      "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz",
-      "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@smithy/types": "^4.0.0",
-        "tslib": "^2.6.2"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
     "node_modules/@aws-sdk/xml-builder": {
       "version": "3.723.0",
       "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.723.0.tgz",
@@ -1919,9 +1529,9 @@
       }
     },
     "node_modules/@eslint/compat": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.5.tgz",
-      "integrity": "sha512-5iuG/StT+7OfvhoBHPlmxkPA9om6aDUFgmD4+mWKAGsYt4vCe8rypneG03AuseyRHBmcCLXQtIH5S26tIoggLg==",
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.6.tgz",
+      "integrity": "sha512-k7HNCqApoDHM6XzT30zGoETj+D+uUcZUb+IVAJmar3u6bvHf7hhHJcWx09QHj4/a2qrKZMWU0E16tvkiAdv06Q==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -1937,13 +1547,13 @@
       }
     },
     "node_modules/@eslint/config-array": {
-      "version": "0.19.1",
-      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz",
-      "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==",
+      "version": "0.19.2",
+      "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz",
+      "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "@eslint/object-schema": "^2.1.5",
+        "@eslint/object-schema": "^2.1.6",
         "debug": "^4.3.1",
         "minimatch": "^3.1.2"
       },
@@ -2071,9 +1681,9 @@
       }
     },
     "node_modules/@eslint/object-schema": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz",
-      "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==",
+      "version": "2.1.6",
+      "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+      "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -2104,9 +1714,9 @@
       }
     },
     "node_modules/@hey-api/client-axios": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/@hey-api/client-axios/-/client-axios-0.5.2.tgz",
-      "integrity": "sha512-qgaNIjL3Vw2VWz5/J8BLUVkIA4Lb5f48syOtGfL6RK+9TS7Si0T44Z/53VWRhxmJdsrdQ6MCtfKyQEhD5yjh6w==",
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/@hey-api/client-axios/-/client-axios-0.6.0.tgz",
+      "integrity": "sha512-+wLcSx0K47168Xxx6EzNEWcJjFFAGDEjp9SqKgHg343uls41Ob6EACp/Ouozj4UMP5En+Anq70pDRNDVRY3MVQ==",
       "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/hey-api"
@@ -2116,9 +1726,9 @@
       }
     },
     "node_modules/@hey-api/json-schema-ref-parser": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@hey-api/json-schema-ref-parser/-/json-schema-ref-parser-1.0.1.tgz",
-      "integrity": "sha512-dBt0A7op9kf4BcK++x6HBYDmvCvnJUZEGe5QytghPFHnMXPyKwDKomwL/v5e9ERk6E0e1GzL/e/y6pWUso9zrQ==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@hey-api/json-schema-ref-parser/-/json-schema-ref-parser-1.0.2.tgz",
+      "integrity": "sha512-F6LSkttZcT/XiX3ydeDqTY3uRN3BLJMwyMTk4kg/ichZlKUp3+3Odv0WokSmXGSoZGTW/N66FROMYAm5NPdJlA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2134,13 +1744,13 @@
       }
     },
     "node_modules/@hey-api/openapi-ts": {
-      "version": "0.63.2",
-      "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.63.2.tgz",
-      "integrity": "sha512-HC5fR3+07P1AvDYrcZv0kbnhWogvMFot848PfpS3Gbncm47mDdO/uhNGIr2RF9CaRIvJNSJvAf1jL3XAQZ18RA==",
+      "version": "0.64.1",
+      "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.64.1.tgz",
+      "integrity": "sha512-d9FWyJKjyH4KeCjOoR5x8+zKER7h7EIRzk3Xo5a2ShAxNoq9HlAArLbWgJFnH7QypQ+f3q29mTp/z2Zw0XkP9g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@hey-api/json-schema-ref-parser": "1.0.1",
+        "@hey-api/json-schema-ref-parser": "1.0.2",
         "c12": "2.0.1",
         "commander": "13.0.0",
         "handlebars": "4.7.8"
@@ -2674,9 +2284,9 @@
       }
     },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.1.tgz",
-      "integrity": "sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.5.tgz",
+      "integrity": "sha512-JXmmQcKQtpf3Z6lvA8akkrHDZ5AEfgc2hLMix1/X5BhQbezBQ0AP5GYLdU8jsQRme8qr2sscCe3wizp7UT0L9g==",
       "cpu": [
         "arm"
       ],
@@ -2688,9 +2298,9 @@
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.1.tgz",
-      "integrity": "sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.5.tgz",
+      "integrity": "sha512-9/A8/ZBOprUjkrJoP9BBEq2vdSud6BPd3LChw09bJQiEZH5oN4kWIkHu90cA0Cj0cSF5cIaD76+0lA+d5KHmpQ==",
       "cpu": [
         "arm64"
       ],
@@ -2702,9 +2312,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.1.tgz",
-      "integrity": "sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.5.tgz",
+      "integrity": "sha512-b9oCfgHKfc1AJEQ5sEpE8Kf6s7aeygj5bZAsl1hTpZc1V9cfZASFSXzzNj7o/BQNPbjmVkVxpCCLRhBfLXhJ5g==",
       "cpu": [
         "arm64"
       ],
@@ -2716,9 +2326,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.1.tgz",
-      "integrity": "sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.5.tgz",
+      "integrity": "sha512-Gz42gKBQPoFdMYdsVqkcpttYOO/0aP7f+1CgMaeZEz0gss7dop1TsO3hT77Iroz/TV7PdPUG/RYlj9EA39L4dw==",
       "cpu": [
         "x64"
       ],
@@ -2730,9 +2340,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.1.tgz",
-      "integrity": "sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.5.tgz",
+      "integrity": "sha512-JPkafjkOFaupd8VQYsXfGFKC2pfMr7hwSYGkVGNwhbW0k0lHHyIdhCSNBendJ4O7YlT4yRyKXoms1TL7saO7SQ==",
       "cpu": [
         "arm64"
       ],
@@ -2744,9 +2354,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.1.tgz",
-      "integrity": "sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.5.tgz",
+      "integrity": "sha512-j6Q8VFqyI8hZM33h1JC6DZK2w8ejkXqEMozTrtIEGfRVMpVZL3GrLOOYEUkAgUSpJ9sb2w+FEpjGj7IHRcQfdw==",
       "cpu": [
         "x64"
       ],
@@ -2758,9 +2368,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.1.tgz",
-      "integrity": "sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.5.tgz",
+      "integrity": "sha512-6jyiXKF9Xq6x9yQjct5xrRT0VghJk5VzAfed3o0hgncwacZkzOdR0TXLRNjexsEXWN8tG7jWWwsVk7WeFi//gw==",
       "cpu": [
         "arm"
       ],
@@ -2772,9 +2382,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.1.tgz",
-      "integrity": "sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.5.tgz",
+      "integrity": "sha512-cOTYe5tLcGAvGztRLIqx87LE7j/qjaAqFrrHsPFlnuhhhFO5LSr2AzvdQYuxomJMzMBrXkMRNl9bQEpDZ5bjLQ==",
       "cpu": [
         "arm"
       ],
@@ -2786,9 +2396,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.1.tgz",
-      "integrity": "sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.5.tgz",
+      "integrity": "sha512-KHlrd+YqmS7rriW+LBb1kQNYmd5w1sAIG3z7HEpnQOrg/skeYYv9DAcclGL9gpFdpnzmiAEkzsTT74kZWUtChQ==",
       "cpu": [
         "arm64"
       ],
@@ -2800,9 +2410,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.1.tgz",
-      "integrity": "sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.5.tgz",
+      "integrity": "sha512-uOb6hzDqym4Sw+qw3+svS3SmwQGVUhyTdPKyHDdlYg1Z0aHjdNmjwRY7zw/90/UfBe/yD7Mv2mYKhQpOfy4RYA==",
       "cpu": [
         "arm64"
       ],
@@ -2814,9 +2424,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.1.tgz",
-      "integrity": "sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.5.tgz",
+      "integrity": "sha512-pARu8ZKANZH4wINLdHLKG69EPwJswM6A+Ox1a9LpiclRQoyjacFFTtXN3akKQ2ufJXDasO/pWvxKN9ZfCgEoFA==",
       "cpu": [
         "loong64"
       ],
@@ -2828,9 +2438,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.1.tgz",
-      "integrity": "sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.5.tgz",
+      "integrity": "sha512-crUWn12NRmCdao2YwS1GvlPCVypMBMJlexTaantaP2+dAMd2eZBErFcKG8hZYEHjSbbk2UoH1aTlyeA4iKLqSA==",
       "cpu": [
         "ppc64"
       ],
@@ -2842,9 +2452,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.1.tgz",
-      "integrity": "sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.5.tgz",
+      "integrity": "sha512-XtD/oMhCdixi3x8rCNyDRMUsLo1Z+1UQcK+oR7AsjglGov9ETiT3TNFhUPzaGC1jH+uaMtPhxrVRUub+pnAKTg==",
       "cpu": [
         "riscv64"
       ],
@@ -2856,9 +2466,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.1.tgz",
-      "integrity": "sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.5.tgz",
+      "integrity": "sha512-V3+BvgyHb21aF7lw0sc78Tv0+xLp4lm2OM7CKFVrBuppsMvtl/9O5y2OX4tdDT0EhIsDP/ObJPqDuEg1ZoTwSQ==",
       "cpu": [
         "s390x"
       ],
@@ -2870,9 +2480,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.1.tgz",
-      "integrity": "sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.5.tgz",
+      "integrity": "sha512-SkCIXLGk42yldTcH8UXh++m0snVxp9DLf4meb1mWm0lC8jzxjFBwSLGtUSeLgQDsC05iBaIhyjNX46DlByrApQ==",
       "cpu": [
         "x64"
       ],
@@ -2884,9 +2494,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.1.tgz",
-      "integrity": "sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.5.tgz",
+      "integrity": "sha512-iUcH3FBtBN2/Ce0rI84suRhD0+bB5BVEffqOwsGaX5py5TuYLOQa7S7oVBP0NKtB5rub3i9IvZtMXiD96l5v0A==",
       "cpu": [
         "x64"
       ],
@@ -2898,9 +2508,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.1.tgz",
-      "integrity": "sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.5.tgz",
+      "integrity": "sha512-PUbWd+h/h6rUowalDYIdc9S9LJXbQDMcJe0BjABl3oT3efYRgZ8aUe8ZZDSie7y+fz6Z+rueNfdorIbkWv5Eqg==",
       "cpu": [
         "arm64"
       ],
@@ -2912,9 +2522,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.1.tgz",
-      "integrity": "sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.5.tgz",
+      "integrity": "sha512-3vncGhOJiAUR85fnAXJyvSp2GaDWYByIQmW68ZAr+e8kIxgvJ1VaZbfHD5BO5X6hwRQdY6Um/XfA3l5c2lV+OQ==",
       "cpu": [
         "ia32"
       ],
@@ -2926,9 +2536,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.1.tgz",
-      "integrity": "sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.5.tgz",
+      "integrity": "sha512-Mi8yVUlQOoeBpY72n75VLATptPGvj2lHa47rQdK9kZ4MoG5Ve86aVIU+PO3tBklTCBtILtdRfXS0EvIbXgmCAg==",
       "cpu": [
         "x64"
       ],
@@ -3711,9 +3321,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.12.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.12.0.tgz",
-      "integrity": "sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==",
+      "version": "22.13.1",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz",
+      "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3756,21 +3366,21 @@
       "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.22.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.22.0.tgz",
-      "integrity": "sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==",
+      "version": "8.23.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz",
+      "integrity": "sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.22.0",
-        "@typescript-eslint/type-utils": "8.22.0",
-        "@typescript-eslint/utils": "8.22.0",
-        "@typescript-eslint/visitor-keys": "8.22.0",
+        "@typescript-eslint/scope-manager": "8.23.0",
+        "@typescript-eslint/type-utils": "8.23.0",
+        "@typescript-eslint/utils": "8.23.0",
+        "@typescript-eslint/visitor-keys": "8.23.0",
         "graphemer": "^1.4.0",
         "ignore": "^5.3.1",
         "natural-compare": "^1.4.0",
-        "ts-api-utils": "^2.0.0"
+        "ts-api-utils": "^2.0.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3786,16 +3396,16 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.22.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.22.0.tgz",
-      "integrity": "sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==",
+      "version": "8.23.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.23.0.tgz",
+      "integrity": "sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.22.0",
-        "@typescript-eslint/types": "8.22.0",
-        "@typescript-eslint/typescript-estree": "8.22.0",
-        "@typescript-eslint/visitor-keys": "8.22.0",
+        "@typescript-eslint/scope-manager": "8.23.0",
+        "@typescript-eslint/types": "8.23.0",
+        "@typescript-eslint/typescript-estree": "8.23.0",
+        "@typescript-eslint/visitor-keys": "8.23.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -3811,14 +3421,14 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.22.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz",
-      "integrity": "sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==",
+      "version": "8.23.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz",
+      "integrity": "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.22.0",
-        "@typescript-eslint/visitor-keys": "8.22.0"
+        "@typescript-eslint/types": "8.23.0",
+        "@typescript-eslint/visitor-keys": "8.23.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3829,16 +3439,16 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.22.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.22.0.tgz",
-      "integrity": "sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==",
+      "version": "8.23.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz",
+      "integrity": "sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.22.0",
-        "@typescript-eslint/utils": "8.22.0",
+        "@typescript-eslint/typescript-estree": "8.23.0",
+        "@typescript-eslint/utils": "8.23.0",
         "debug": "^4.3.4",
-        "ts-api-utils": "^2.0.0"
+        "ts-api-utils": "^2.0.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3853,9 +3463,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.22.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.22.0.tgz",
-      "integrity": "sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==",
+      "version": "8.23.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.23.0.tgz",
+      "integrity": "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3867,20 +3477,20 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.22.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz",
-      "integrity": "sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==",
+      "version": "8.23.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz",
+      "integrity": "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.22.0",
-        "@typescript-eslint/visitor-keys": "8.22.0",
+        "@typescript-eslint/types": "8.23.0",
+        "@typescript-eslint/visitor-keys": "8.23.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
         "minimatch": "^9.0.4",
         "semver": "^7.6.0",
-        "ts-api-utils": "^2.0.0"
+        "ts-api-utils": "^2.0.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3894,16 +3504,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.22.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.22.0.tgz",
-      "integrity": "sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==",
+      "version": "8.23.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.23.0.tgz",
+      "integrity": "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "8.22.0",
-        "@typescript-eslint/types": "8.22.0",
-        "@typescript-eslint/typescript-estree": "8.22.0"
+        "@typescript-eslint/scope-manager": "8.23.0",
+        "@typescript-eslint/types": "8.23.0",
+        "@typescript-eslint/typescript-estree": "8.23.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3918,13 +3528,13 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.22.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz",
-      "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==",
+      "version": "8.23.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz",
+      "integrity": "sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.22.0",
+        "@typescript-eslint/types": "8.23.0",
         "eslint-visitor-keys": "^4.2.0"
       },
       "engines": {
@@ -5711,9 +5321,9 @@
       }
     },
     "node_modules/fastq": {
-      "version": "1.18.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
-      "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==",
+      "version": "1.19.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz",
+      "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -6206,9 +5816,9 @@
       "license": "MIT"
     },
     "node_modules/import-fresh": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
-      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+      "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6779,9 +6389,9 @@
       "license": "MIT"
     },
     "node_modules/node-stdlib-browser": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.3.0.tgz",
-      "integrity": "sha512-g/koYzOr9Fb1Jc+tHUHlFd5gODjGn48tHexUK8q6iqOVriEgSnd3/1T7myBYc+0KBVze/7F7n65ec9rW6OD7xw==",
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.3.1.tgz",
+      "integrity": "sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6792,7 +6402,7 @@
         "console-browserify": "^1.1.0",
         "constants-browserify": "^1.0.0",
         "create-require": "^1.1.1",
-        "crypto-browserify": "^3.11.0",
+        "crypto-browserify": "^3.12.1",
         "domain-browser": "4.22.0",
         "events": "^3.0.0",
         "https-browserify": "^1.0.0",
@@ -6884,9 +6494,9 @@
       "license": "MIT"
     },
     "node_modules/object-inspect": {
-      "version": "1.13.3",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
-      "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
+      "version": "1.13.4",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
       "license": "MIT",
       "engines": {
         "node": ">= 0.4"
@@ -7184,9 +6794,9 @@
       "license": "MIT"
     },
     "node_modules/possible-typed-array-names": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
-      "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+      "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -7495,9 +7105,9 @@
       }
     },
     "node_modules/rollup": {
-      "version": "4.32.1",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.1.tgz",
-      "integrity": "sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==",
+      "version": "4.34.5",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.5.tgz",
+      "integrity": "sha512-GyVCmpo9z/HYqFD8QWoBUnz1Q9xC22t8tPAZm/AvAcUg2U2/+DkboEvSioMwv042zE4I9N3FEhx7fiCT2YHzKQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7511,25 +7121,25 @@
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.32.1",
-        "@rollup/rollup-android-arm64": "4.32.1",
-        "@rollup/rollup-darwin-arm64": "4.32.1",
-        "@rollup/rollup-darwin-x64": "4.32.1",
-        "@rollup/rollup-freebsd-arm64": "4.32.1",
-        "@rollup/rollup-freebsd-x64": "4.32.1",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.32.1",
-        "@rollup/rollup-linux-arm-musleabihf": "4.32.1",
-        "@rollup/rollup-linux-arm64-gnu": "4.32.1",
-        "@rollup/rollup-linux-arm64-musl": "4.32.1",
-        "@rollup/rollup-linux-loongarch64-gnu": "4.32.1",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.32.1",
-        "@rollup/rollup-linux-riscv64-gnu": "4.32.1",
-        "@rollup/rollup-linux-s390x-gnu": "4.32.1",
-        "@rollup/rollup-linux-x64-gnu": "4.32.1",
-        "@rollup/rollup-linux-x64-musl": "4.32.1",
-        "@rollup/rollup-win32-arm64-msvc": "4.32.1",
-        "@rollup/rollup-win32-ia32-msvc": "4.32.1",
-        "@rollup/rollup-win32-x64-msvc": "4.32.1",
+        "@rollup/rollup-android-arm-eabi": "4.34.5",
+        "@rollup/rollup-android-arm64": "4.34.5",
+        "@rollup/rollup-darwin-arm64": "4.34.5",
+        "@rollup/rollup-darwin-x64": "4.34.5",
+        "@rollup/rollup-freebsd-arm64": "4.34.5",
+        "@rollup/rollup-freebsd-x64": "4.34.5",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.34.5",
+        "@rollup/rollup-linux-arm-musleabihf": "4.34.5",
+        "@rollup/rollup-linux-arm64-gnu": "4.34.5",
+        "@rollup/rollup-linux-arm64-musl": "4.34.5",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.34.5",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.34.5",
+        "@rollup/rollup-linux-riscv64-gnu": "4.34.5",
+        "@rollup/rollup-linux-s390x-gnu": "4.34.5",
+        "@rollup/rollup-linux-x64-gnu": "4.34.5",
+        "@rollup/rollup-linux-x64-musl": "4.34.5",
+        "@rollup/rollup-win32-arm64-msvc": "4.34.5",
+        "@rollup/rollup-win32-ia32-msvc": "4.34.5",
+        "@rollup/rollup-win32-x64-msvc": "4.34.5",
         "fsevents": "~2.3.2"
       }
     },
@@ -7596,9 +7206,9 @@
       }
     },
     "node_modules/sass": {
-      "version": "1.83.4",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.4.tgz",
-      "integrity": "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==",
+      "version": "1.84.0",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.84.0.tgz",
+      "integrity": "sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7617,9 +7227,9 @@
       }
     },
     "node_modules/semver": {
-      "version": "7.7.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz",
-      "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==",
+      "version": "7.7.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+      "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
       "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
@@ -7958,9 +7568,9 @@
       }
     },
     "node_modules/ts-api-utils": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz",
-      "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz",
+      "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -8024,15 +7634,15 @@
       }
     },
     "node_modules/typescript-eslint": {
-      "version": "8.22.0",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.22.0.tgz",
-      "integrity": "sha512-Y2rj210FW1Wb6TWXzQc5+P+EWI9/zdS57hLEc0gnyuvdzWo8+Y8brKlbj0muejonhMI/xAZCnZZwjbIfv1CkOw==",
+      "version": "8.23.0",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.23.0.tgz",
+      "integrity": "sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.22.0",
-        "@typescript-eslint/parser": "8.22.0",
-        "@typescript-eslint/utils": "8.22.0"
+        "@typescript-eslint/eslint-plugin": "8.23.0",
+        "@typescript-eslint/parser": "8.23.0",
+        "@typescript-eslint/utils": "8.23.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -8142,15 +7752,15 @@
       }
     },
     "node_modules/vite": {
-      "version": "6.0.11",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz",
-      "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz",
+      "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "esbuild": "^0.24.2",
-        "postcss": "^8.4.49",
-        "rollup": "^4.23.0"
+        "postcss": "^8.5.1",
+        "rollup": "^4.30.1"
       },
       "bin": {
         "vite": "bin/vite.js"
@@ -8238,9 +7848,9 @@
       "license": "MIT"
     },
     "node_modules/vscode-uri": {
-      "version": "3.0.8",
-      "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz",
-      "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz",
+      "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==",
       "dev": true,
       "license": "MIT"
     },
diff --git a/package.json b/package.json
index ace26eb..a2f35af 100644
--- a/package.json
+++ b/package.json
@@ -4,8 +4,8 @@
   "type": "module",
   "license": "Apache-2.0",
   "scripts": {
-    "dev": "vite",
-    "preview": "vite preview --port 5173",
+    "dev": "vite --host",
+    "preview": "vite preview --port 5173 --host",
     "build": "vite build",
     "type-check": "vue-tsc --noEmit",
     "lint": "eslint --fix .",
@@ -16,7 +16,7 @@
     "@aws-sdk/lib-storage": "<3.729.0",
     "@aws-sdk/s3-request-presigner": "<3.729.0",
     "@fortawesome/fontawesome-free": "~6.7.0",
-    "@hey-api/client-axios": "0.5.2",
+    "@hey-api/client-axios": "0.6.0",
     "@popperjs/core": "~2.11.8",
     "ajv": "~8.17.0",
     "bootstrap": "~5.3.0",
@@ -38,7 +38,7 @@
   },
   "devDependencies": {
     "@eslint/compat": "^1.2.0",
-    "@hey-api/openapi-ts": "^0.63.0",
+    "@hey-api/openapi-ts": "^0.64.0",
     "@rushstack/eslint-patch": "~1.10.0",
     "@tsconfig/node22": "^22.0.0",
     "@types/bootstrap": "~5.2.0",
@@ -58,7 +58,7 @@
     "prettier": "~3.4.0",
     "sass": "^1.66.0",
     "typescript": "~5.7.0",
-    "vite": "~6.0.0",
+    "vite": "~6.1.0",
     "vite-plugin-node-polyfills": "^0.23.0",
     "vue-tsc": "~2.2.0"
   }
diff --git a/src/App.vue b/src/App.vue
index 79ae90c..e3158c4 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -2,7 +2,7 @@
 import { onBeforeMount, onMounted } from "vue";
 import { useCookies } from "vue3-cookies";
 import { useRoute, useRouter } from "vue-router";
-import { client } from "@/client/sdk.gen.ts";
+import { client } from "@/client/client.gen.ts";
 import { environment } from "@/environment";
 import AppHeader from "@/components/AppHeader.vue";
 import AppFooter from "@/components/AppFooter.vue";
@@ -37,6 +37,7 @@ const newsStore = useNewsStore();
 
 onBeforeMount(() => {
   client.setConfig({
+    throwOnError: true,
     baseURL: environment.API_BASE_URL,
     paramsSerializer: (params) =>
       param_stringify(params, { arrayFormat: "repeat" }),
diff --git a/src/client/client.gen.ts b/src/client/client.gen.ts
new file mode 100644
index 0000000..a246d32
--- /dev/null
+++ b/src/client/client.gen.ts
@@ -0,0 +1,28 @@
+// This file is auto-generated by @hey-api/openapi-ts
+
+import type { ClientOptions } from "./types.gen";
+import {
+  type Config,
+  type ClientOptions as DefaultClientOptions,
+  createClient,
+  createConfig,
+} from "@hey-api/client-axios";
+
+/**
+ * The `createClientConfig()` function will be called on client initialization
+ * and the returned object will become the client's initial configuration.
+ *
+ * You may want to initialize your client this way instead of calling
+ * `setConfig()`. This is useful for example if you're using Next.js
+ * to ensure your client always has the correct values.
+ */
+export type CreateClientConfig<T extends DefaultClientOptions = ClientOptions> =
+  (
+    override?: Config<DefaultClientOptions & T>,
+  ) => Config<Required<DefaultClientOptions> & T>;
+
+export const client = createClient(
+  createConfig<ClientOptions>({
+    throwOnError: true,
+  }),
+);
diff --git a/src/client/index.ts b/src/client/index.ts
index eae885d..da87079 100644
--- a/src/client/index.ts
+++ b/src/client/index.ts
@@ -1,3 +1,3 @@
 // This file is auto-generated by @hey-api/openapi-ts
-export * from "./sdk.gen";
 export * from "./types.gen";
+export * from "./sdk.gen";
diff --git a/src/client/sdk.gen.ts b/src/client/sdk.gen.ts
index edb2d35..cde07fd 100644
--- a/src/client/sdk.gen.ts
+++ b/src/client/sdk.gen.ts
@@ -1,1579 +1,1689 @@
 // This file is auto-generated by @hey-api/openapi-ts
 
 import {
-  createClient,
-  createConfig,
-  type OptionsLegacyParser,
+  type Options as ClientOptions,
+  type TDataShape,
+  type Client,
   formDataBodySerializer,
 } from "@hey-api/client-axios";
-import {
-  type ApiTokenListTokenData,
-  type ApiTokenListTokenError,
-  type ApiTokenListTokenResponse,
-  type ApiTokenCreateTokenData,
-  type ApiTokenCreateTokenError,
-  type ApiTokenCreateTokenResponse,
-  type ApiTokenGetTokenData,
-  type ApiTokenGetTokenError,
-  type ApiTokenGetTokenResponse,
-  type ApiTokenDeleteTokenData,
-  type ApiTokenDeleteTokenError,
-  type ApiTokenDeleteTokenResponse,
-  type BucketListBucketsData,
-  type BucketListBucketsError,
-  type BucketListBucketsResponse,
-  type BucketCreateBucketData,
-  type BucketCreateBucketError,
-  type BucketCreateBucketResponse,
-  type BucketListBucketOtrsData,
-  type BucketListBucketOtrsError,
-  type BucketListBucketOtrsResponse,
-  type BucketGetBucketData,
-  type BucketGetBucketError,
-  type BucketGetBucketResponse,
-  type BucketDeleteBucketData,
-  type BucketDeleteBucketError,
-  type BucketDeleteBucketResponse,
-  type BucketGetBucketOtrData,
-  type BucketGetBucketOtrError,
-  type BucketGetBucketOtrResponse,
-  type BucketCreateBucketOtrData,
-  type BucketCreateBucketOtrError,
-  type BucketCreateBucketOtrResponse,
-  type BucketAcceptBucketOtrData,
-  type BucketAcceptBucketOtrError,
-  type BucketAcceptBucketOtrResponse,
-  type BucketDeleteBucketOtrData,
-  type BucketDeleteBucketOtrError,
-  type BucketDeleteBucketOtrResponse,
-  type BucketUpdateBucketPublicStateData,
-  type BucketUpdateBucketPublicStateError,
-  type BucketUpdateBucketPublicStateResponse,
-  type BucketUpdateBucketLimitsData,
-  type BucketUpdateBucketLimitsError,
-  type BucketUpdateBucketLimitsResponse,
-  type BucketPermissionListPermissionsData,
-  type BucketPermissionListPermissionsError,
-  type BucketPermissionListPermissionsResponse,
-  type BucketPermissionCreatePermissionData,
-  type BucketPermissionCreatePermissionError,
-  type BucketPermissionCreatePermissionResponse,
-  type BucketPermissionListPermissionsPerUserData,
-  type BucketPermissionListPermissionsPerUserError,
-  type BucketPermissionListPermissionsPerUserResponse,
-  type BucketPermissionListPermissionsPerBucketData,
-  type BucketPermissionListPermissionsPerBucketError,
-  type BucketPermissionListPermissionsPerBucketResponse,
-  type BucketPermissionGetPermissionData,
-  type BucketPermissionGetPermissionError,
-  type BucketPermissionGetPermissionResponse,
-  type BucketPermissionUpdatePermissionData,
-  type BucketPermissionUpdatePermissionError,
-  type BucketPermissionUpdatePermissionResponse,
-  type BucketPermissionDeletePermissionData,
-  type BucketPermissionDeletePermissionError,
-  type BucketPermissionDeletePermissionResponse,
-  type NewsCreateNewsData,
-  type NewsCreateNewsError,
-  type NewsCreateNewsResponse,
-  type NewsListNewsData,
-  type NewsListNewsError,
-  type NewsListNewsResponse,
-  type NewsListLatestNewsError,
-  type NewsListLatestNewsResponse,
-  type NewsGetNewsData,
-  type NewsGetNewsError,
-  type NewsGetNewsResponse,
-  type NewsDeleteNewsData,
-  type NewsDeleteNewsError,
-  type NewsDeleteNewsResponse,
-  type PublicGetPublicWorkflowsError,
-  type PublicGetPublicWorkflowsResponse,
-  type ResourceCreateResourceData,
-  type ResourceCreateResourceError,
-  type ResourceCreateResourceResponse,
-  type ResourceListResourcesData,
-  type ResourceListResourcesError,
-  type ResourceListResourcesResponse,
-  type ResourceListSyncRequestsError,
-  type ResourceListSyncRequestsResponse,
-  type ResourceListResourceOtrsData,
-  type ResourceListResourceOtrsError,
-  type ResourceListResourceOtrsResponse,
-  type ResourceGetResourceData,
-  type ResourceGetResourceError,
-  type ResourceGetResourceResponse,
-  type ResourceDeleteResourceData,
-  type ResourceDeleteResourceError,
-  type ResourceDeleteResourceResponse,
-  type ResourceGetResourceOtrData,
-  type ResourceGetResourceOtrError,
-  type ResourceGetResourceOtrResponse,
-  type ResourceCreateResourceOtrData,
-  type ResourceCreateResourceOtrError,
-  type ResourceCreateResourceOtrResponse,
-  type ResourceAcceptResourceOtrData,
-  type ResourceAcceptResourceOtrError,
-  type ResourceAcceptResourceOtrResponse,
-  type ResourceDeleteResourceOtrData,
-  type ResourceDeleteResourceOtrError,
-  type ResourceDeleteResourceOtrResponse,
-  type ResourceVersionListResourceVersionsData,
-  type ResourceVersionListResourceVersionsError,
-  type ResourceVersionListResourceVersionsResponse,
-  type ResourceVersionRequestResourceVersionData,
-  type ResourceVersionRequestResourceVersionError,
-  type ResourceVersionRequestResourceVersionResponse,
-  type ResourceVersionGetResourceVersionData,
-  type ResourceVersionGetResourceVersionError,
-  type ResourceVersionGetResourceVersionResponse,
-  type ResourceVersionResourceFileTreeData,
-  type ResourceVersionResourceFileTreeError,
-  type ResourceVersionResourceFileTreeResponse,
-  type ResourceVersionRequestResourceVersionReviewData,
-  type ResourceVersionRequestResourceVersionReviewError,
-  type ResourceVersionRequestResourceVersionReviewResponse,
-  type ResourceVersionRequestResourceVersionSyncData,
-  type ResourceVersionRequestResourceVersionSyncError,
-  type ResourceVersionRequestResourceVersionSyncResponse,
-  type ResourceVersionResourceVersionReviewData,
-  type ResourceVersionResourceVersionReviewError,
-  type ResourceVersionResourceVersionReviewResponse,
-  type ResourceVersionResourceVersionSyncData,
-  type ResourceVersionResourceVersionSyncError,
-  type ResourceVersionResourceVersionSyncResponse,
-  type ResourceVersionResourceVersionLatestData,
-  type ResourceVersionResourceVersionLatestError,
-  type ResourceVersionResourceVersionLatestResponse,
-  type ResourceVersionDeleteResourceVersionClusterData,
-  type ResourceVersionDeleteResourceVersionClusterError,
-  type ResourceVersionDeleteResourceVersionClusterResponse,
-  type ResourceVersionDeleteResourceVersionS3Data,
-  type ResourceVersionDeleteResourceVersionS3Error,
-  type ResourceVersionDeleteResourceVersionS3Response,
-  type S3KeyGetUserKeysData,
-  type S3KeyGetUserKeysError,
-  type S3KeyGetUserKeysResponse,
-  type S3KeyCreateUserKeyData,
-  type S3KeyCreateUserKeyError,
-  type S3KeyCreateUserKeyResponse,
-  type S3KeyGetUserKeyData,
-  type S3KeyGetUserKeyError,
-  type S3KeyGetUserKeyResponse,
-  type S3KeyDeleteUserKeyData,
-  type S3KeyDeleteUserKeyError,
-  type S3KeyDeleteUserKeyResponse,
-  type UserCreateUserData,
-  type UserCreateUserError,
-  type UserCreateUserResponse,
-  type UserListUsersData,
-  type UserListUsersError,
-  type UserListUsersResponse,
-  type UserSearchUsersData,
-  type UserSearchUsersError,
-  type UserSearchUsersResponse,
-  type UserGetLoggedInUserError,
-  type UserGetLoggedInUserResponse,
-  type UserGetUserData,
-  type UserGetUserError,
-  type UserGetUserResponse,
-  type UserUpdateRolesData,
-  type UserUpdateRolesError,
-  type UserUpdateRolesResponse,
-  type UserResendInvitationData,
-  type UserResendInvitationError,
-  type UserResendInvitationResponse,
-  type WorkflowCreateWorkflowData,
-  type WorkflowCreateWorkflowError,
-  type WorkflowCreateWorkflowResponse,
-  type WorkflowListWorkflowsData,
-  type WorkflowListWorkflowsError,
-  type WorkflowListWorkflowsResponse,
-  type WorkflowListWorkflowOtrsData,
-  type WorkflowListWorkflowOtrsError,
-  type WorkflowListWorkflowOtrsResponse,
-  type WorkflowGetDeveloperWorkflowStatisticsData,
-  type WorkflowGetDeveloperWorkflowStatisticsError,
-  type WorkflowGetDeveloperWorkflowStatisticsResponse,
-  type WorkflowGetWorkflowData,
-  type WorkflowGetWorkflowError,
-  type WorkflowGetWorkflowResponse,
-  type WorkflowDeleteWorkflowData,
-  type WorkflowDeleteWorkflowError,
-  type WorkflowDeleteWorkflowResponse,
-  type WorkflowGetWorkflowOtrData,
-  type WorkflowGetWorkflowOtrError,
-  type WorkflowGetWorkflowOtrResponse,
-  type WorkflowCreateWorkflowOtrData,
-  type WorkflowCreateWorkflowOtrError,
-  type WorkflowCreateWorkflowOtrResponse,
-  type WorkflowAcceptWorkflowOtrData,
-  type WorkflowAcceptWorkflowOtrError,
-  type WorkflowAcceptWorkflowOtrResponse,
-  type WorkflowDeleteWorkflowOtrData,
-  type WorkflowDeleteWorkflowOtrError,
-  type WorkflowDeleteWorkflowOtrResponse,
-  type WorkflowGetWorkflowStatisticsData,
-  type WorkflowGetWorkflowStatisticsError,
-  type WorkflowGetWorkflowStatisticsResponse,
-  type WorkflowUpdateWorkflowData,
-  type WorkflowUpdateWorkflowError,
-  type WorkflowUpdateWorkflowResponse,
-  WorkflowGetDeveloperWorkflowStatisticsResponseTransformer,
-  WorkflowGetWorkflowStatisticsResponseTransformer,
-  type WorkflowCredentialsGetWorkflowCredentialsData,
-  type WorkflowCredentialsGetWorkflowCredentialsError,
-  type WorkflowCredentialsGetWorkflowCredentialsResponse,
-  type WorkflowCredentialsUpdateWorkflowCredentialsData,
-  type WorkflowCredentialsUpdateWorkflowCredentialsError,
-  type WorkflowCredentialsUpdateWorkflowCredentialsResponse,
-  type WorkflowCredentialsDeleteWorkflowCredentialsData,
-  type WorkflowCredentialsDeleteWorkflowCredentialsError,
-  type WorkflowCredentialsDeleteWorkflowCredentialsResponse,
-  type WorkflowExecutionStartWorkflowData,
-  type WorkflowExecutionStartWorkflowError,
-  type WorkflowExecutionStartWorkflowResponse,
-  type WorkflowExecutionListWorkflowExecutionsData,
-  type WorkflowExecutionListWorkflowExecutionsError,
-  type WorkflowExecutionListWorkflowExecutionsResponse,
-  type WorkflowExecutionStartArbitraryWorkflowData,
-  type WorkflowExecutionStartArbitraryWorkflowError,
-  type WorkflowExecutionStartArbitraryWorkflowResponse,
-  type WorkflowExecutionGetWorkflowExecutionData,
-  type WorkflowExecutionGetWorkflowExecutionError,
-  type WorkflowExecutionGetWorkflowExecutionResponse,
-  type WorkflowExecutionDeleteWorkflowExecutionData,
-  type WorkflowExecutionDeleteWorkflowExecutionError,
-  type WorkflowExecutionDeleteWorkflowExecutionResponse,
-  type WorkflowExecutionGetWorkflowExecutionParamsData,
-  type WorkflowExecutionGetWorkflowExecutionParamsError,
-  type WorkflowExecutionGetWorkflowExecutionParamsResponse,
-  type WorkflowExecutionCancelWorkflowExecutionData,
-  type WorkflowExecutionCancelWorkflowExecutionError,
-  type WorkflowExecutionCancelWorkflowExecutionResponse,
-  type WorkflowModeGetWorkflowModeData,
-  type WorkflowModeGetWorkflowModeError,
-  type WorkflowModeGetWorkflowModeResponse,
-  type WorkflowVersionListWorkflowVersionData,
-  type WorkflowVersionListWorkflowVersionError,
-  type WorkflowVersionListWorkflowVersionResponse,
-  type WorkflowVersionGetWorkflowVersionData,
-  type WorkflowVersionGetWorkflowVersionError,
-  type WorkflowVersionGetWorkflowVersionResponse,
-  type WorkflowVersionUpdateWorkflowVersionStatusData,
-  type WorkflowVersionUpdateWorkflowVersionStatusError,
-  type WorkflowVersionUpdateWorkflowVersionStatusResponse,
-  type WorkflowVersionGetWorkflowVersionMetadataData,
-  type WorkflowVersionGetWorkflowVersionMetadataError,
-  type WorkflowVersionGetWorkflowVersionMetadataResponse,
-  type WorkflowVersionUpdateWorkflowVersionMetadataData,
-  type WorkflowVersionUpdateWorkflowVersionMetadataError,
-  type WorkflowVersionUpdateWorkflowVersionMetadataResponse,
-  type WorkflowVersionDeprecateWorkflowVersionData,
-  type WorkflowVersionDeprecateWorkflowVersionError,
-  type WorkflowVersionDeprecateWorkflowVersionResponse,
-  type WorkflowVersionUpdateWorkflowVersionParameterExtensionData,
-  type WorkflowVersionUpdateWorkflowVersionParameterExtensionError,
-  type WorkflowVersionUpdateWorkflowVersionParameterExtensionResponse,
-  type WorkflowVersionDownloadWorkflowDocumentationData,
-  type WorkflowVersionDownloadWorkflowDocumentationError,
-  type WorkflowVersionDownloadWorkflowDocumentationResponse,
-  type WorkflowVersionUploadWorkflowVersionIconData,
-  type WorkflowVersionUploadWorkflowVersionIconError,
-  type WorkflowVersionUploadWorkflowVersionIconResponse,
-  type WorkflowVersionDeleteWorkflowVersionIconData,
-  type WorkflowVersionDeleteWorkflowVersionIconError,
-  type WorkflowVersionDeleteWorkflowVersionIconResponse,
+import type {
+  AuthKickstartLoginData,
+  AuthKickstartLoginError,
+  AuthLoginCallbackData,
+  AuthLoginCallbackError,
+  AuthKickstartAccountConnectionData,
+  AuthKickstartAccountConnectionError,
+  AuthAccountConnectionCallbackData,
+  AuthAccountConnectionCallbackError,
+  AuthLogoutData,
+  ApiTokenListTokenData,
+  ApiTokenListTokenResponse,
+  ApiTokenListTokenError,
+  ApiTokenCreateTokenData,
+  ApiTokenCreateTokenResponse,
+  ApiTokenCreateTokenError,
+  ApiTokenDeleteTokenData,
+  ApiTokenDeleteTokenResponse,
+  ApiTokenDeleteTokenError,
+  ApiTokenGetTokenData,
+  ApiTokenGetTokenResponse,
+  ApiTokenGetTokenError,
+  UserListUsersData,
+  UserListUsersResponse,
+  UserListUsersError,
+  UserCreateUserData,
+  UserCreateUserResponse,
+  UserCreateUserError,
+  UserSearchUsersData,
+  UserSearchUsersResponse,
+  UserSearchUsersError,
+  UserGetLoggedInUserData,
+  UserGetLoggedInUserResponse,
+  UserDeleteUserData,
+  UserDeleteUserResponse,
+  UserDeleteUserError,
+  UserGetUserData,
+  UserGetUserResponse,
+  UserGetUserError,
+  UserUpdateRolesData,
+  UserUpdateRolesResponse,
+  UserUpdateRolesError,
+  UserResendInvitationData,
+  UserResendInvitationResponse,
+  UserResendInvitationError,
+  S3KeyGetUserKeysData,
+  S3KeyGetUserKeysResponse,
+  S3KeyGetUserKeysError,
+  S3KeyCreateUserKeyData,
+  S3KeyCreateUserKeyResponse,
+  S3KeyCreateUserKeyError,
+  S3KeyDeleteUserKeyData,
+  S3KeyDeleteUserKeyResponse,
+  S3KeyDeleteUserKeyError,
+  S3KeyGetUserKeyData,
+  S3KeyGetUserKeyResponse,
+  S3KeyGetUserKeyError,
+  BucketListBucketsData,
+  BucketListBucketsResponse,
+  BucketListBucketsError,
+  BucketCreateBucketData,
+  BucketCreateBucketResponse,
+  BucketCreateBucketError,
+  BucketListBucketOtrsData,
+  BucketListBucketOtrsResponse,
+  BucketListBucketOtrsError,
+  BucketDeleteBucketData,
+  BucketDeleteBucketResponse,
+  BucketDeleteBucketError,
+  BucketGetBucketData,
+  BucketGetBucketResponse,
+  BucketGetBucketError,
+  BucketDeleteBucketOtrData,
+  BucketDeleteBucketOtrResponse,
+  BucketDeleteBucketOtrError,
+  BucketGetBucketOtrData,
+  BucketGetBucketOtrResponse,
+  BucketGetBucketOtrError,
+  BucketAcceptBucketOtrData,
+  BucketAcceptBucketOtrResponse,
+  BucketAcceptBucketOtrError,
+  BucketCreateBucketOtrData,
+  BucketCreateBucketOtrResponse,
+  BucketCreateBucketOtrError,
+  BucketUpdateBucketPublicStateData,
+  BucketUpdateBucketPublicStateResponse,
+  BucketUpdateBucketPublicStateError,
+  BucketUpdateBucketLimitsData,
+  BucketUpdateBucketLimitsResponse,
+  BucketUpdateBucketLimitsError,
+  BucketPermissionListPermissionsData,
+  BucketPermissionListPermissionsResponse,
+  BucketPermissionListPermissionsError,
+  BucketPermissionCreatePermissionData,
+  BucketPermissionCreatePermissionResponse,
+  BucketPermissionCreatePermissionError,
+  BucketPermissionListPermissionsPerUserData,
+  BucketPermissionListPermissionsPerUserResponse,
+  BucketPermissionListPermissionsPerUserError,
+  BucketPermissionListPermissionsPerBucketData,
+  BucketPermissionListPermissionsPerBucketResponse,
+  BucketPermissionListPermissionsPerBucketError,
+  BucketPermissionDeletePermissionData,
+  BucketPermissionDeletePermissionResponse,
+  BucketPermissionDeletePermissionError,
+  BucketPermissionGetPermissionData,
+  BucketPermissionGetPermissionResponse,
+  BucketPermissionGetPermissionError,
+  BucketPermissionUpdatePermissionData,
+  BucketPermissionUpdatePermissionResponse,
+  BucketPermissionUpdatePermissionError,
+  WorkflowListWorkflowsData,
+  WorkflowListWorkflowsResponse,
+  WorkflowListWorkflowsError,
+  WorkflowCreateWorkflowData,
+  WorkflowCreateWorkflowResponse,
+  WorkflowCreateWorkflowError,
+  WorkflowListWorkflowOtrsData,
+  WorkflowListWorkflowOtrsResponse,
+  WorkflowListWorkflowOtrsError,
+  WorkflowGetDeveloperWorkflowStatisticsData,
+  WorkflowGetDeveloperWorkflowStatisticsResponse,
+  WorkflowGetDeveloperWorkflowStatisticsError,
+  WorkflowDeleteWorkflowData,
+  WorkflowDeleteWorkflowResponse,
+  WorkflowDeleteWorkflowError,
+  WorkflowGetWorkflowData,
+  WorkflowGetWorkflowResponse,
+  WorkflowGetWorkflowError,
+  WorkflowDeleteWorkflowOtrData,
+  WorkflowDeleteWorkflowOtrResponse,
+  WorkflowDeleteWorkflowOtrError,
+  WorkflowGetWorkflowOtrData,
+  WorkflowGetWorkflowOtrResponse,
+  WorkflowGetWorkflowOtrError,
+  WorkflowAcceptWorkflowOtrData,
+  WorkflowAcceptWorkflowOtrResponse,
+  WorkflowAcceptWorkflowOtrError,
+  WorkflowCreateWorkflowOtrData,
+  WorkflowCreateWorkflowOtrResponse,
+  WorkflowCreateWorkflowOtrError,
+  WorkflowGetWorkflowStatisticsData,
+  WorkflowGetWorkflowStatisticsResponse,
+  WorkflowGetWorkflowStatisticsError,
+  WorkflowUpdateWorkflowData,
+  WorkflowUpdateWorkflowResponse,
+  WorkflowUpdateWorkflowError,
+  WorkflowVersionListWorkflowVersionData,
+  WorkflowVersionListWorkflowVersionResponse,
+  WorkflowVersionListWorkflowVersionError,
+  WorkflowVersionGetWorkflowVersionData,
+  WorkflowVersionGetWorkflowVersionResponse,
+  WorkflowVersionGetWorkflowVersionError,
+  WorkflowVersionUpdateWorkflowVersionStatusData,
+  WorkflowVersionUpdateWorkflowVersionStatusResponse,
+  WorkflowVersionUpdateWorkflowVersionStatusError,
+  WorkflowVersionGetWorkflowVersionMetadataData,
+  WorkflowVersionGetWorkflowVersionMetadataResponse,
+  WorkflowVersionGetWorkflowVersionMetadataError,
+  WorkflowVersionUpdateWorkflowVersionMetadataData,
+  WorkflowVersionUpdateWorkflowVersionMetadataResponse,
+  WorkflowVersionUpdateWorkflowVersionMetadataError,
+  WorkflowVersionDeprecateWorkflowVersionData,
+  WorkflowVersionDeprecateWorkflowVersionResponse,
+  WorkflowVersionDeprecateWorkflowVersionError,
+  WorkflowVersionUpdateWorkflowVersionParameterExtensionData,
+  WorkflowVersionUpdateWorkflowVersionParameterExtensionResponse,
+  WorkflowVersionUpdateWorkflowVersionParameterExtensionError,
+  WorkflowVersionDownloadWorkflowDocumentationData,
+  WorkflowVersionDownloadWorkflowDocumentationError,
+  WorkflowVersionDeleteWorkflowVersionIconData,
+  WorkflowVersionDeleteWorkflowVersionIconResponse,
+  WorkflowVersionDeleteWorkflowVersionIconError,
+  WorkflowVersionUploadWorkflowVersionIconData,
+  WorkflowVersionUploadWorkflowVersionIconResponse,
+  WorkflowVersionUploadWorkflowVersionIconError,
+  WorkflowExecutionListWorkflowExecutionsData,
+  WorkflowExecutionListWorkflowExecutionsResponse,
+  WorkflowExecutionListWorkflowExecutionsError,
+  WorkflowExecutionStartWorkflowData,
+  WorkflowExecutionStartWorkflowResponse,
+  WorkflowExecutionStartWorkflowError,
+  WorkflowExecutionStartArbitraryWorkflowData,
+  WorkflowExecutionStartArbitraryWorkflowResponse,
+  WorkflowExecutionStartArbitraryWorkflowError,
+  WorkflowExecutionDeleteWorkflowExecutionData,
+  WorkflowExecutionDeleteWorkflowExecutionResponse,
+  WorkflowExecutionDeleteWorkflowExecutionError,
+  WorkflowExecutionGetWorkflowExecutionData,
+  WorkflowExecutionGetWorkflowExecutionResponse,
+  WorkflowExecutionGetWorkflowExecutionError,
+  WorkflowExecutionGetWorkflowExecutionParamsData,
+  WorkflowExecutionGetWorkflowExecutionParamsResponse,
+  WorkflowExecutionGetWorkflowExecutionParamsError,
+  WorkflowExecutionCancelWorkflowExecutionData,
+  WorkflowExecutionCancelWorkflowExecutionResponse,
+  WorkflowExecutionCancelWorkflowExecutionError,
+  WorkflowCredentialsDeleteWorkflowCredentialsData,
+  WorkflowCredentialsDeleteWorkflowCredentialsResponse,
+  WorkflowCredentialsDeleteWorkflowCredentialsError,
+  WorkflowCredentialsGetWorkflowCredentialsData,
+  WorkflowCredentialsGetWorkflowCredentialsResponse,
+  WorkflowCredentialsGetWorkflowCredentialsError,
+  WorkflowCredentialsUpdateWorkflowCredentialsData,
+  WorkflowCredentialsUpdateWorkflowCredentialsError,
+  WorkflowModeGetWorkflowModeData,
+  WorkflowModeGetWorkflowModeResponse,
+  WorkflowModeGetWorkflowModeError,
+  ResourceListResourcesData,
+  ResourceListResourcesResponse,
+  ResourceListResourcesError,
+  ResourceCreateResourceData,
+  ResourceCreateResourceResponse,
+  ResourceCreateResourceError,
+  ResourceListSyncRequestsData,
+  ResourceListSyncRequestsResponse,
+  ResourceListResourceOtrsData,
+  ResourceListResourceOtrsResponse,
+  ResourceListResourceOtrsError,
+  ResourceDeleteResourceData,
+  ResourceDeleteResourceResponse,
+  ResourceDeleteResourceError,
+  ResourceGetResourceData,
+  ResourceGetResourceResponse,
+  ResourceGetResourceError,
+  ResourceDeleteResourceOtrData,
+  ResourceDeleteResourceOtrResponse,
+  ResourceDeleteResourceOtrError,
+  ResourceGetResourceOtrData,
+  ResourceGetResourceOtrResponse,
+  ResourceGetResourceOtrError,
+  ResourceAcceptResourceOtrData,
+  ResourceAcceptResourceOtrResponse,
+  ResourceAcceptResourceOtrError,
+  ResourceCreateResourceOtrData,
+  ResourceCreateResourceOtrResponse,
+  ResourceCreateResourceOtrError,
+  ResourceVersionListResourceVersionsData,
+  ResourceVersionListResourceVersionsResponse,
+  ResourceVersionListResourceVersionsError,
+  ResourceVersionRequestResourceVersionData,
+  ResourceVersionRequestResourceVersionResponse,
+  ResourceVersionRequestResourceVersionError,
+  ResourceVersionGetResourceVersionData,
+  ResourceVersionGetResourceVersionResponse,
+  ResourceVersionGetResourceVersionError,
+  ResourceVersionResourceFileTreeData,
+  ResourceVersionResourceFileTreeResponse,
+  ResourceVersionResourceFileTreeError,
+  ResourceVersionRequestResourceVersionReviewData,
+  ResourceVersionRequestResourceVersionReviewResponse,
+  ResourceVersionRequestResourceVersionReviewError,
+  ResourceVersionRequestResourceVersionSyncData,
+  ResourceVersionRequestResourceVersionSyncResponse,
+  ResourceVersionRequestResourceVersionSyncError,
+  ResourceVersionResourceVersionReviewData,
+  ResourceVersionResourceVersionReviewResponse,
+  ResourceVersionResourceVersionReviewError,
+  ResourceVersionResourceVersionSyncData,
+  ResourceVersionResourceVersionSyncResponse,
+  ResourceVersionResourceVersionSyncError,
+  ResourceVersionResourceVersionLatestData,
+  ResourceVersionResourceVersionLatestResponse,
+  ResourceVersionResourceVersionLatestError,
+  ResourceVersionDeleteResourceVersionClusterData,
+  ResourceVersionDeleteResourceVersionClusterResponse,
+  ResourceVersionDeleteResourceVersionClusterError,
+  ResourceVersionDeleteResourceVersionS3Data,
+  ResourceVersionDeleteResourceVersionS3Response,
+  ResourceVersionDeleteResourceVersionS3Error,
+  NewsListNewsData,
+  NewsListNewsResponse,
+  NewsListNewsError,
+  NewsCreateNewsData,
+  NewsCreateNewsResponse,
+  NewsCreateNewsError,
+  NewsListLatestNewsData,
+  NewsListLatestNewsResponse,
+  NewsDeleteNewsData,
+  NewsDeleteNewsResponse,
+  NewsDeleteNewsError,
+  NewsGetNewsData,
+  NewsGetNewsResponse,
+  NewsGetNewsError,
+  PublicGetPublicWorkflowsData,
+  PublicGetPublicWorkflowsResponse,
 } from "./types.gen";
+import { client as _heyApiClient } from "./client.gen";
+import { resourceVersionResourceFileTreeResponseTransformer } from "./transformers.gen";
 
-export const client = createClient(
-  createConfig({
-    throwOnError: true,
-  }),
-);
+export type Options<
+  TData extends TDataShape = TDataShape,
+  ThrowOnError extends boolean = boolean,
+> = ClientOptions<TData, ThrowOnError> & {
+  /**
+   * You can provide a client instance returned by `createClient()` instead of
+   * individual options. This might be also useful if you want to implement a
+   * custom client.
+   */
+  client?: Client;
+};
 
-export class ApiTokenService {
+export class AuthService {
   /**
-   * List API token
-   * List meta information about all API token.
-   *
-   * Permissions `api_token:list_all` required. See parameter `uid` for exception.
+   * Kickstart the login flow
+   * Redirect route to OIDC provider to kickstart the login process.
    */
-  public static apiTokenListToken<ThrowOnError extends boolean = true>(
-    options?: OptionsLegacyParser<ApiTokenListTokenData, ThrowOnError>,
+  public static authKickstartLogin<ThrowOnError extends boolean = true>(
+    options: Options<AuthKickstartLoginData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      ApiTokenListTokenResponse,
-      ApiTokenListTokenError,
+    return (options.client ?? _heyApiClient).get<
+      unknown,
+      AuthKickstartLoginError,
       ThrowOnError
     >({
+      url: "/auth/login/{provider}",
       ...options,
-      url: "/ui/tokens",
     });
   }
 
   /**
-   * Create new API token
-   * Create a new API token for the current user.
+   * LifeScience Login Callback
+   * Callback for the login process with an OIDC Provider.
    *
-   * Permission `api_token:create` required.
+   * Visit the route login route to start the login process.
+   *
+   * If the user is already known to the system, then a JWT token will be created and sent via the 'set-cookie' header.
+   * The key for this Cookie is 'bearer'.
+   *
+   * If the user is new, he will be created him and then a JWT token is issued.
+   *
+   * This JWT has to be sent to all authorized endpoints via the HTTPBearer scheme.
    */
-  public static apiTokenCreateToken<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<ApiTokenCreateTokenData, ThrowOnError>,
+  public static authLoginCallback<ThrowOnError extends boolean = true>(
+    options: Options<AuthLoginCallbackData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).post<
-      ApiTokenCreateTokenResponse,
-      ApiTokenCreateTokenError,
+    return (options.client ?? _heyApiClient).get<
+      unknown,
+      AuthLoginCallbackError,
       ThrowOnError
     >({
+      url: "/auth/login/callback/{provider}",
       ...options,
-      url: "/ui/tokens",
     });
   }
 
   /**
-   * Get API token
-   * Get an API token by id.
-   *
-   * Permission `api_token:read` required if the current user is the owner of the API token,
-   * otherwise `api_token:read_any` required.
+   * Kickstart the account connection flow
+   * Redirect route to OIDC provider to connect the CloWM account with the AAI account.
    */
-  public static apiTokenGetToken<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<ApiTokenGetTokenData, ThrowOnError>,
-  ) {
-    return (options?.client ?? client).get<
-      ApiTokenGetTokenResponse,
-      ApiTokenGetTokenError,
+  public static authKickstartAccountConnection<
+    ThrowOnError extends boolean = true,
+  >(options: Options<AuthKickstartAccountConnectionData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).get<
+      unknown,
+      AuthKickstartAccountConnectionError,
       ThrowOnError
     >({
+      url: "/auth/account/connect/{provider}",
       ...options,
-      url: "/ui/tokens/{tid}",
     });
   }
 
   /**
-   * Delete API token
-   * Delete an API token by id.
-   *
-   * Permission `api_token:delete` required if the current user is the owner of the API token,
-   * otherwise `api_token:delete_any` required.
+   * LifeScience Login Callback
+   * Callback for the account connection process with an OIDC provider.
    */
-  public static apiTokenDeleteToken<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<ApiTokenDeleteTokenData, ThrowOnError>,
-  ) {
-    return (options?.client ?? client).delete<
-      ApiTokenDeleteTokenResponse,
-      ApiTokenDeleteTokenError,
+  public static authAccountConnectionCallback<
+    ThrowOnError extends boolean = true,
+  >(options: Options<AuthAccountConnectionCallbackData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).get<
+      unknown,
+      AuthAccountConnectionCallbackError,
       ThrowOnError
     >({
+      url: "/auth/account/callback/{provider}",
       ...options,
-      url: "/ui/tokens/{tid}",
     });
   }
-}
 
-export class BucketService {
   /**
-   * List buckets
-   * List all the buckets in the system or of the desired user where the user has permissions for.
-   *
-   * Permission `bucket:list_all` required. See parameter `owner_id` for exception.
+   * Logout
+   * Logout the user from the system by deleting the bearer cookie.
    */
-  public static bucketListBuckets<ThrowOnError extends boolean = true>(
-    options?: OptionsLegacyParser<BucketListBucketsData, ThrowOnError>,
+  public static authLogout<ThrowOnError extends boolean = true>(
+    options?: Options<AuthLogoutData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      BucketListBucketsResponse,
-      BucketListBucketsError,
+    return (options?.client ?? _heyApiClient).get<
+      unknown,
+      unknown,
       ThrowOnError
     >({
+      url: "/auth/logout",
       ...options,
-      url: "/ui/buckets",
     });
   }
+}
 
+export class ApiTokenService {
   /**
-   * Create a bucket for the current user
-   * Create a bucket for the current user.
-   *
-   * The name of the bucket has some constraints.
-   * For more information see the
-   * [Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints)
+   * List API token
+   * List meta information about all API token.
    *
-   * Permission `bucket:create` required.
+   * Permissions `api_token:list_all` required. See parameter `uid` for exception.
    */
-  public static bucketCreateBucket<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<BucketCreateBucketData, ThrowOnError>,
+  public static apiTokenListToken<ThrowOnError extends boolean = true>(
+    options?: Options<ApiTokenListTokenData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).post<
-      BucketCreateBucketResponse,
-      BucketCreateBucketError,
+    return (options?.client ?? _heyApiClient).get<
+      ApiTokenListTokenResponse,
+      ApiTokenListTokenError,
       ThrowOnError
     >({
+      url: "/ui/tokens",
       ...options,
-      url: "/ui/buckets",
     });
   }
 
   /**
-   * List bucket OTRs
-   * Get the ownership transfer requests for buckets.
+   * Create new API token
+   * Create a new API token for the current user.
    *
-   * Permission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id,
-   * otherwise `bucket:list_all`
+   * Permission `api_token:create` required.
    */
-  public static bucketListBucketOtrs<ThrowOnError extends boolean = true>(
-    options?: OptionsLegacyParser<BucketListBucketOtrsData, ThrowOnError>,
+  public static apiTokenCreateToken<ThrowOnError extends boolean = true>(
+    options: Options<ApiTokenCreateTokenData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      BucketListBucketOtrsResponse,
-      BucketListBucketOtrsError,
+    return (options.client ?? _heyApiClient).post<
+      ApiTokenCreateTokenResponse,
+      ApiTokenCreateTokenError,
       ThrowOnError
     >({
+      url: "/ui/tokens",
       ...options,
-      url: "/ui/buckets/ownership_transfer_request",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * Get a bucket by its name
-   * Get a bucket by its name if the current user has READ permissions for the bucket.
+   * Delete API token
+   * Delete an API token by id.
    *
-   * Permission `bucket:read` required if the current user is the owner of the bucket,
-   * otherwise `bucket:read_any` required.
+   * Permission `api_token:delete` required if the current user is the owner of the API token,
+   * otherwise `api_token:delete_any` required.
    */
-  public static bucketGetBucket<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<BucketGetBucketData, ThrowOnError>,
+  public static apiTokenDeleteToken<ThrowOnError extends boolean = true>(
+    options: Options<ApiTokenDeleteTokenData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      BucketGetBucketResponse,
-      BucketGetBucketError,
+    return (options.client ?? _heyApiClient).delete<
+      ApiTokenDeleteTokenResponse,
+      ApiTokenDeleteTokenError,
       ThrowOnError
     >({
+      url: "/ui/tokens/{tid}",
       ...options,
-      url: "/ui/buckets/{bucket_name}",
     });
   }
 
   /**
-   * Delete a bucket
-   * Delete a bucket by its name. Only the owner of the bucket can delete the bucket.
+   * Get API token
+   * Get an API token by id.
    *
-   * Permission `bucket:delete` required if the current user is the owner of the bucket,
-   * otherwise `bucket:delete_any` required.
+   * Permission `api_token:read` required if the current user is the owner of the API token,
+   * otherwise `api_token:read_any` required.
    */
-  public static bucketDeleteBucket<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<BucketDeleteBucketData, ThrowOnError>,
+  public static apiTokenGetToken<ThrowOnError extends boolean = true>(
+    options: Options<ApiTokenGetTokenData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).delete<
-      BucketDeleteBucketResponse,
-      BucketDeleteBucketError,
+    return (options.client ?? _heyApiClient).get<
+      ApiTokenGetTokenResponse,
+      ApiTokenGetTokenError,
       ThrowOnError
     >({
+      url: "/ui/tokens/{tid}",
       ...options,
-      url: "/ui/buckets/{bucket_name}",
     });
   }
+}
 
+export class UserService {
   /**
-   * Get a bucket OTR
-   * Get a specific bucket ownership transfer request.
+   * List users and search by their name
+   * List all users in the system..
    *
-   * Permission `bucket:read` required if the current user is the current or new owner of the bucket,
-   * otherwise `bucket:read_any` required.
+   * Permission `user:list` required.
    */
-  public static bucketGetBucketOtr<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<BucketGetBucketOtrData, ThrowOnError>,
+  public static userListUsers<ThrowOnError extends boolean = true>(
+    options?: Options<UserListUsersData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      BucketGetBucketOtrResponse,
-      BucketGetBucketOtrError,
+    return (options?.client ?? _heyApiClient).get<
+      UserListUsersResponse,
+      UserListUsersError,
       ThrowOnError
     >({
+      url: "/ui/users",
       ...options,
-      url: "/ui/buckets/{bucket_name}/ownership_transfer_request",
     });
   }
 
   /**
-   * Create a bucket OTR
-   * Create a ownership transfer request for a specific bucket.
+   * Create User
+   * Create a new user in the system and notify him.
    *
-   * Permission `bucket:update` required if the current user is the current owner of the bucket,
-   * otherwise `bucket:update_any` required.
+   * Permission `user:create` required.
    */
-  public static bucketCreateBucketOtr<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<BucketCreateBucketOtrData, ThrowOnError>,
+  public static userCreateUser<ThrowOnError extends boolean = true>(
+    options: Options<UserCreateUserData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).post<
-      BucketCreateBucketOtrResponse,
-      BucketCreateBucketOtrError,
+    return (options.client ?? _heyApiClient).post<
+      UserCreateUserResponse,
+      UserCreateUserError,
       ThrowOnError
     >({
+      url: "/ui/users",
       ...options,
-      url: "/ui/buckets/{bucket_name}/ownership_transfer_request",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * Accept a bucket OTR
-   * Accept an ownership transfer request for a specific workflow.
+   * Search Users
+   * Search for users in the system by their name.
    *
-   * Permission `bucket:update` required if the current user is the new owner of the workflow,
-   * otherwise `bucket:update_any` required.
+   * Permission `user: search` required.
    */
-  public static bucketAcceptBucketOtr<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<BucketAcceptBucketOtrData, ThrowOnError>,
+  public static userSearchUsers<ThrowOnError extends boolean = true>(
+    options: Options<UserSearchUsersData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).patch<
-      BucketAcceptBucketOtrResponse,
-      BucketAcceptBucketOtrError,
+    return (options.client ?? _heyApiClient).get<
+      UserSearchUsersResponse,
+      UserSearchUsersError,
       ThrowOnError
     >({
+      url: "/ui/users/search",
       ...options,
-      url: "/ui/buckets/{bucket_name}/ownership_transfer_request",
     });
   }
 
   /**
-   * Delete a bucket OTR
-   * Delete/Reject a bucket ownership transfer request.
+   * Get the logged in user
+   * Return the user associated with the used JWT.
    *
-   * Permission `bucket:update` required if the current user is the current or new owner of the bucket,
-   * otherwise `bucket:update_any` required.
+   * Permission `user:read` required.
    */
-  public static bucketDeleteBucketOtr<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<BucketDeleteBucketOtrData, ThrowOnError>,
+  public static userGetLoggedInUser<ThrowOnError extends boolean = true>(
+    options?: Options<UserGetLoggedInUserData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).delete<
-      BucketDeleteBucketOtrResponse,
-      BucketDeleteBucketOtrError,
+    return (options?.client ?? _heyApiClient).get<
+      UserGetLoggedInUserResponse,
+      unknown,
       ThrowOnError
     >({
+      url: "/ui/users/me",
       ...options,
-      url: "/ui/buckets/{bucket_name}/ownership_transfer_request",
     });
   }
 
   /**
-   * Update public status
-   * Update the buckets public state.
+   * Delete a user
+   * Delete a user and his S3 account.
    *
-   * Permission `bucket:update` required if the current user is the owner of the bucket,
-   * otherwise `bucket:update_any` required.
+   * Permission `user:delete` required if the current user is the target user.
    */
-  public static bucketUpdateBucketPublicState<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      BucketUpdateBucketPublicStateData,
-      ThrowOnError
-    >,
+  public static userDeleteUser<ThrowOnError extends boolean = true>(
+    options: Options<UserDeleteUserData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).patch<
-      BucketUpdateBucketPublicStateResponse,
-      BucketUpdateBucketPublicStateError,
+    return (options.client ?? _heyApiClient).delete<
+      UserDeleteUserResponse,
+      UserDeleteUserError,
       ThrowOnError
     >({
+      url: "/ui/users/{uid}",
       ...options,
-      url: "/ui/buckets/{bucket_name}/public",
     });
   }
 
   /**
-   * Update bucket limits
-   * Update the buckets size limits.
+   * Get a user by its uid
+   * Return the user with the specific uid.
    *
-   * Permission `bucket:update_any` required.
+   * Permission `user:read` required.
    */
-  public static bucketUpdateBucketLimits<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<BucketUpdateBucketLimitsData, ThrowOnError>,
+  public static userGetUser<ThrowOnError extends boolean = true>(
+    options: Options<UserGetUserData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).patch<
-      BucketUpdateBucketLimitsResponse,
-      BucketUpdateBucketLimitsError,
+    return (options.client ?? _heyApiClient).get<
+      UserGetUserResponse,
+      UserGetUserError,
       ThrowOnError
     >({
+      url: "/ui/users/{uid}",
       ...options,
-      url: "/ui/buckets/{bucket_name}/limits",
     });
   }
-}
 
-export class BucketPermissionService {
   /**
-   * Get all permissions.
-   * List all the bucket permissions in the system.
+   * Update user roles
+   * Update the roles of a user.
    *
-   * Permission `bucket_permission:list_all` required.
+   * Permission `user:update` required.
    */
-  public static bucketPermissionListPermissions<
-    ThrowOnError extends boolean = true,
-  >(
-    options?: OptionsLegacyParser<
-      BucketPermissionListPermissionsData,
-      ThrowOnError
-    >,
+  public static userUpdateRoles<ThrowOnError extends boolean = true>(
+    options: Options<UserUpdateRolesData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      BucketPermissionListPermissionsResponse,
-      BucketPermissionListPermissionsError,
+    return (options.client ?? _heyApiClient).put<
+      UserUpdateRolesResponse,
+      UserUpdateRolesError,
       ThrowOnError
     >({
+      url: "/ui/users/{uid}/roles",
       ...options,
-      url: "/ui/permissions",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * Create a permission.
-   * Create a permission for a bucket and user.
+   * Resend Invitation
+   * Resend the invitation link for an user that has an open invitation.
    *
-   * Permission `bucket_permission:create` required.
+   * Permission `user:create` required.
    */
-  public static bucketPermissionCreatePermission<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      BucketPermissionCreatePermissionData,
-      ThrowOnError
-    >,
+  public static userResendInvitation<ThrowOnError extends boolean = true>(
+    options: Options<UserResendInvitationData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).post<
-      BucketPermissionCreatePermissionResponse,
-      BucketPermissionCreatePermissionError,
+    return (options.client ?? _heyApiClient).patch<
+      UserResendInvitationResponse,
+      UserResendInvitationError,
       ThrowOnError
     >({
+      url: "/ui/users/{uid}/invitation",
       ...options,
-      url: "/ui/permissions",
     });
   }
+}
 
+export class S3KeyService {
   /**
-   * Get all permissions for a user.
-   * List all the bucket permissions for the given user.
+   * Get the S3 Access keys from a user
+   * Get all the S3 Access keys for a specific user.
    *
-   * Permission `bucket_permission:list` required if current user is the target the bucket permission,
-   * otherwise `bucket_permission:list_all` required.
+   * Permission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required.
    */
-  public static bucketPermissionListPermissionsPerUser<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      BucketPermissionListPermissionsPerUserData,
-      ThrowOnError
-    >,
+  public static s3KeyGetUserKeys<ThrowOnError extends boolean = true>(
+    options: Options<S3KeyGetUserKeysData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      BucketPermissionListPermissionsPerUserResponse,
-      BucketPermissionListPermissionsPerUserError,
+    return (options.client ?? _heyApiClient).get<
+      S3KeyGetUserKeysResponse,
+      S3KeyGetUserKeysError,
       ThrowOnError
     >({
+      url: "/ui/users/{uid}/keys",
       ...options,
-      url: "/ui/permissions/user/{uid}",
     });
   }
 
   /**
-   * Get all permissions for a bucket.
-   * List all the bucket permissions for the given bucket.
+   * Create a Access key for a user
+   * Create a S3 Access key for a specific user.
    *
-   * Permission `bucket_permission:list` required if current user is owner of the bucket,
-   * otherwise `bucket_permission:list_all` required.
+   * Permission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required.
    */
-  public static bucketPermissionListPermissionsPerBucket<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      BucketPermissionListPermissionsPerBucketData,
-      ThrowOnError
-    >,
+  public static s3KeyCreateUserKey<ThrowOnError extends boolean = true>(
+    options: Options<S3KeyCreateUserKeyData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      BucketPermissionListPermissionsPerBucketResponse,
-      BucketPermissionListPermissionsPerBucketError,
+    return (options.client ?? _heyApiClient).post<
+      S3KeyCreateUserKeyResponse,
+      S3KeyCreateUserKeyError,
       ThrowOnError
     >({
+      url: "/ui/users/{uid}/keys",
       ...options,
-      url: "/ui/permissions/bucket/{bucket_name}",
     });
   }
 
   /**
-   * Get permission for bucket and user combination.
-   * Get the bucket permissions for the specific combination of bucket and user.
+   * Delete a specific S3 Access key from a user
+   * Delete a specific S3 Access key for a specific user.
    *
-   * Permission `bucket_permission:read` required if current user is the target or owner of the bucket permission,
-   * otherwise `bucket_permission:read_any` required.
+   * Permission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.
    */
-  public static bucketPermissionGetPermission<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      BucketPermissionGetPermissionData,
-      ThrowOnError
-    >,
+  public static s3KeyDeleteUserKey<ThrowOnError extends boolean = true>(
+    options: Options<S3KeyDeleteUserKeyData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      BucketPermissionGetPermissionResponse,
-      BucketPermissionGetPermissionError,
+    return (options.client ?? _heyApiClient).delete<
+      S3KeyDeleteUserKeyResponse,
+      S3KeyDeleteUserKeyError,
       ThrowOnError
     >({
+      url: "/ui/users/{uid}/keys/{access_id}",
       ...options,
-      url: "/ui/permissions/bucket/{bucket_name}/user/{uid}",
     });
   }
 
   /**
-   * Update a bucket permission
-   * Update a permission for a bucket and user.
+   * Get a specific S3 Access key from a user
+   * Get a specific S3 Access Key for a specific user.
    *
-   * Permission `bucket_permission:update` required.
+   * Permission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required.
    */
-  public static bucketPermissionUpdatePermission<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      BucketPermissionUpdatePermissionData,
-      ThrowOnError
-    >,
+  public static s3KeyGetUserKey<ThrowOnError extends boolean = true>(
+    options: Options<S3KeyGetUserKeyData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).put<
-      BucketPermissionUpdatePermissionResponse,
-      BucketPermissionUpdatePermissionError,
+    return (options.client ?? _heyApiClient).get<
+      S3KeyGetUserKeyResponse,
+      S3KeyGetUserKeyError,
       ThrowOnError
     >({
+      url: "/ui/users/{uid}/keys/{access_id}",
       ...options,
-      url: "/ui/permissions/bucket/{bucket_name}/user/{uid}",
     });
   }
+}
 
+export class BucketService {
   /**
-   * Delete a bucket permission
-   * Delete the bucket permissions for the specific combination of bucket and user.
+   * List buckets
+   * List all the buckets in the system or of the desired user where the user has permissions for.
    *
-   * Permission `bucket_permission:delete` required if current user is the target or owner of the bucket permission,
-   * otherwise `bucket_permission:delete_any` required.
+   * Permission `bucket:list_all` required. See parameter `owner_id` for exception.
    */
-  public static bucketPermissionDeletePermission<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      BucketPermissionDeletePermissionData,
-      ThrowOnError
-    >,
+  public static bucketListBuckets<ThrowOnError extends boolean = true>(
+    options?: Options<BucketListBucketsData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).delete<
-      BucketPermissionDeletePermissionResponse,
-      BucketPermissionDeletePermissionError,
+    return (options?.client ?? _heyApiClient).get<
+      BucketListBucketsResponse,
+      BucketListBucketsError,
       ThrowOnError
     >({
+      url: "/ui/buckets",
       ...options,
-      url: "/ui/permissions/bucket/{bucket_name}/user/{uid}",
     });
   }
-}
 
-export class NewsService {
   /**
-   * Create news
-   * Create a news event.
+   * Create a bucket for the current user
+   * Create a bucket for the current user.
    *
-   * Permission `news:create` required.
+   * The name of the bucket has some constraints.
+   * For more information see the
+   * [Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints)
+   *
+   * Permission `bucket:create` required.
    */
-  public static newsCreateNews<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<NewsCreateNewsData, ThrowOnError>,
+  public static bucketCreateBucket<ThrowOnError extends boolean = true>(
+    options: Options<BucketCreateBucketData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).post<
-      NewsCreateNewsResponse,
-      NewsCreateNewsError,
+    return (options.client ?? _heyApiClient).post<
+      BucketCreateBucketResponse,
+      BucketCreateBucketError,
       ThrowOnError
     >({
+      url: "/ui/buckets",
       ...options,
-      url: "/ui/news",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * List news
-   * List all news events with filters.
-   *
-   * This endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header.
-   * A missing `Link` header indicates that you iterated over all news with the current filters.
+   * List bucket OTRs
+   * Get the ownership transfer requests for buckets.
    *
-   * Permission `news:list` required.
+   * Permission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id,
+   * otherwise `bucket:list_all`
    */
-  public static newsListNews<ThrowOnError extends boolean = true>(
-    options?: OptionsLegacyParser<NewsListNewsData, ThrowOnError>,
+  public static bucketListBucketOtrs<ThrowOnError extends boolean = true>(
+    options?: Options<BucketListBucketOtrsData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      NewsListNewsResponse,
-      NewsListNewsError,
+    return (options?.client ?? _heyApiClient).get<
+      BucketListBucketOtrsResponse,
+      BucketListBucketOtrsError,
       ThrowOnError
     >({
+      url: "/ui/buckets/ownership_transfer_request",
       ...options,
-      url: "/ui/news",
     });
   }
 
   /**
-   * Get latest news
-   * List the current news events.
+   * Delete a bucket
+   * Delete a bucket by its name. Only the owner of the bucket can delete the bucket.
    *
-   * Permission `news:list` required.
+   * Permission `bucket:delete` required if the current user is the owner of the bucket,
+   * otherwise `bucket:delete_any` required.
    */
-  public static newsListLatestNews<ThrowOnError extends boolean = true>(
-    options?: OptionsLegacyParser<unknown, ThrowOnError>,
+  public static bucketDeleteBucket<ThrowOnError extends boolean = true>(
+    options: Options<BucketDeleteBucketData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      NewsListLatestNewsResponse,
-      NewsListLatestNewsError,
+    return (options.client ?? _heyApiClient).delete<
+      BucketDeleteBucketResponse,
+      BucketDeleteBucketError,
       ThrowOnError
     >({
+      url: "/ui/buckets/{bucket_name}",
       ...options,
-      url: "/ui/news/latest",
     });
   }
 
   /**
-   * Get a specific news
-   * Get a specified news event.
+   * Get a bucket by its name
+   * Get a bucket by its name if the current user has READ permissions for the bucket.
    *
-   * Permission `news:read` required.
+   * Permission `bucket:read` required if the current user is the owner of the bucket,
+   * otherwise `bucket:read_any` required.
    */
-  public static newsGetNews<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<NewsGetNewsData, ThrowOnError>,
+  public static bucketGetBucket<ThrowOnError extends boolean = true>(
+    options: Options<BucketGetBucketData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      NewsGetNewsResponse,
-      NewsGetNewsError,
+    return (options.client ?? _heyApiClient).get<
+      BucketGetBucketResponse,
+      BucketGetBucketError,
       ThrowOnError
     >({
+      url: "/ui/buckets/{bucket_name}",
       ...options,
-      url: "/ui/news/{nid}",
     });
   }
 
   /**
-   * Delete a specific news
-   * Delete a specified news event.
+   * Delete a bucket OTR
+   * Delete/Reject a bucket ownership transfer request.
    *
-   * Permission `news:delete` required.
+   * Permission `bucket:update` required if the current user is the current or new owner of the bucket,
+   * otherwise `bucket:update_any` required.
    */
-  public static newsDeleteNews<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<NewsDeleteNewsData, ThrowOnError>,
+  public static bucketDeleteBucketOtr<ThrowOnError extends boolean = true>(
+    options: Options<BucketDeleteBucketOtrData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).delete<
-      NewsDeleteNewsResponse,
-      NewsDeleteNewsError,
+    return (options.client ?? _heyApiClient).delete<
+      BucketDeleteBucketOtrResponse,
+      BucketDeleteBucketOtrError,
       ThrowOnError
     >({
+      url: "/ui/buckets/{bucket_name}/ownership_transfer_request",
       ...options,
-      url: "/ui/news/{nid}",
     });
   }
-}
 
-export class PublicService {
   /**
-   * Get available workflows
-   * Public route to fetch all available workflows.
+   * Get a bucket OTR
+   * Get a specific bucket ownership transfer request.
+   *
+   * Permission `bucket:read` required if the current user is the current or new owner of the bucket,
+   * otherwise `bucket:read_any` required.
    */
-  public static publicGetPublicWorkflows<ThrowOnError extends boolean = true>(
-    options?: OptionsLegacyParser<unknown, ThrowOnError>,
+  public static bucketGetBucketOtr<ThrowOnError extends boolean = true>(
+    options: Options<BucketGetBucketOtrData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      PublicGetPublicWorkflowsResponse,
-      PublicGetPublicWorkflowsError,
+    return (options.client ?? _heyApiClient).get<
+      BucketGetBucketOtrResponse,
+      BucketGetBucketOtrError,
       ThrowOnError
     >({
+      url: "/ui/buckets/{bucket_name}/ownership_transfer_request",
       ...options,
-      url: "/ui/public/workflows",
     });
   }
-}
 
-export class ResourceService {
   /**
-   * Request a new resource
-   * Request a new resources.
+   * Accept a bucket OTR
+   * Accept an ownership transfer request for a specific workflow.
    *
-   * Permission `resource:create` required.
+   * Permission `bucket:update` required if the current user is the new owner of the workflow,
+   * otherwise `bucket:update_any` required.
    */
-  public static resourceCreateResource<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<ResourceCreateResourceData, ThrowOnError>,
+  public static bucketAcceptBucketOtr<ThrowOnError extends boolean = true>(
+    options: Options<BucketAcceptBucketOtrData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).post<
-      ResourceCreateResourceResponse,
-      ResourceCreateResourceError,
+    return (options.client ?? _heyApiClient).patch<
+      BucketAcceptBucketOtrResponse,
+      BucketAcceptBucketOtrError,
       ThrowOnError
     >({
+      url: "/ui/buckets/{bucket_name}/ownership_transfer_request",
       ...options,
-      url: "/ui/resources",
     });
   }
 
   /**
-   * List resources
-   * List all resources.
+   * Create a bucket OTR
+   * Create a ownership transfer request for a specific bucket.
    *
-   * Permission `resource:list` required.
+   * Permission `bucket:update` required if the current user is the current owner of the bucket,
+   * otherwise `bucket:update_any` required.
    */
-  public static resourceListResources<ThrowOnError extends boolean = true>(
-    options?: OptionsLegacyParser<ResourceListResourcesData, ThrowOnError>,
+  public static bucketCreateBucketOtr<ThrowOnError extends boolean = true>(
+    options: Options<BucketCreateBucketOtrData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      ResourceListResourcesResponse,
-      ResourceListResourcesError,
+    return (options.client ?? _heyApiClient).post<
+      BucketCreateBucketOtrResponse,
+      BucketCreateBucketOtrError,
       ThrowOnError
     >({
+      url: "/ui/buckets/{bucket_name}/ownership_transfer_request",
       ...options,
-      url: "/ui/resources",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * List resource sync requests
-   * List all resource sync requests.
+   * Update public status
+   * Update the buckets public state.
    *
-   * Permission `resource:update_any` required.
+   * Permission `bucket:update` required if the current user is the owner of the bucket,
+   * otherwise `bucket:update_any` required.
    */
-  public static resourceListSyncRequests<ThrowOnError extends boolean = true>(
-    options?: OptionsLegacyParser<unknown, ThrowOnError>,
-  ) {
-    return (options?.client ?? client).get<
-      ResourceListSyncRequestsResponse,
-      ResourceListSyncRequestsError,
+  public static bucketUpdateBucketPublicState<
+    ThrowOnError extends boolean = true,
+  >(options: Options<BucketUpdateBucketPublicStateData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).patch<
+      BucketUpdateBucketPublicStateResponse,
+      BucketUpdateBucketPublicStateError,
       ThrowOnError
     >({
+      url: "/ui/buckets/{bucket_name}/public",
       ...options,
-      url: "/ui/resources/sync_requests",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * List resource OTRs
-   * Get the ownership transfer requests for resources.
+   * Update bucket limits
+   * Update the buckets size limits.
    *
-   * Permission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id,
-   * otherwise `resource:list_all`
+   * Permission `bucket:update_any` required.
    */
-  public static resourceListResourceOtrs<ThrowOnError extends boolean = true>(
-    options?: OptionsLegacyParser<ResourceListResourceOtrsData, ThrowOnError>,
+  public static bucketUpdateBucketLimits<ThrowOnError extends boolean = true>(
+    options: Options<BucketUpdateBucketLimitsData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      ResourceListResourceOtrsResponse,
-      ResourceListResourceOtrsError,
+    return (options.client ?? _heyApiClient).patch<
+      BucketUpdateBucketLimitsResponse,
+      BucketUpdateBucketLimitsError,
       ThrowOnError
     >({
+      url: "/ui/buckets/{bucket_name}/limits",
       ...options,
-      url: "/ui/resources/ownership_transfer_request",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
+}
 
+export class BucketPermissionService {
   /**
-   * Get a resource
-   * Get a specific resource.
+   * Get all permissions.
+   * List all the bucket permissions in the system.
    *
-   * Permission `resource:read` required.
+   * Permission `bucket_permission:list_all` required.
    */
-  public static resourceGetResource<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<ResourceGetResourceData, ThrowOnError>,
-  ) {
-    return (options?.client ?? client).get<
-      ResourceGetResourceResponse,
-      ResourceGetResourceError,
+  public static bucketPermissionListPermissions<
+    ThrowOnError extends boolean = true,
+  >(options?: Options<BucketPermissionListPermissionsData, ThrowOnError>) {
+    return (options?.client ?? _heyApiClient).get<
+      BucketPermissionListPermissionsResponse,
+      BucketPermissionListPermissionsError,
       ThrowOnError
     >({
+      url: "/ui/permissions",
       ...options,
-      url: "/ui/resources/{rid}",
     });
   }
 
   /**
-   * Delete a resource
-   * Delete a resources.
+   * Create a permission.
+   * Create a permission for a bucket and user.
    *
-   * Permission `resource:delete` required.
+   * Permission `bucket_permission:create` required.
    */
-  public static resourceDeleteResource<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<ResourceDeleteResourceData, ThrowOnError>,
-  ) {
-    return (options?.client ?? client).delete<
-      ResourceDeleteResourceResponse,
-      ResourceDeleteResourceError,
+  public static bucketPermissionCreatePermission<
+    ThrowOnError extends boolean = true,
+  >(options: Options<BucketPermissionCreatePermissionData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).post<
+      BucketPermissionCreatePermissionResponse,
+      BucketPermissionCreatePermissionError,
       ThrowOnError
     >({
+      url: "/ui/permissions",
       ...options,
-      url: "/ui/resources/{rid}",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * Get a resource OTR
-   * Get a specific resource ownership transfer request.
+   * Get all permissions for a user.
+   * List all the bucket permissions for the given user.
    *
-   * Permission `resource:read` required if the current user is the current or new owner of the resource,
-   * otherwise `resource:read_any` required.
+   * Permission `bucket_permission:list` required if current user is the target the bucket permission,
+   * otherwise `bucket_permission:list_all` required.
    */
-  public static resourceGetResourceOtr<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<ResourceGetResourceOtrData, ThrowOnError>,
+  public static bucketPermissionListPermissionsPerUser<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<BucketPermissionListPermissionsPerUserData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      ResourceGetResourceOtrResponse,
-      ResourceGetResourceOtrError,
+    return (options.client ?? _heyApiClient).get<
+      BucketPermissionListPermissionsPerUserResponse,
+      BucketPermissionListPermissionsPerUserError,
       ThrowOnError
     >({
+      url: "/ui/permissions/user/{uid}",
       ...options,
-      url: "/ui/resources/{rid}/ownership_transfer_request",
     });
   }
 
   /**
-   * Create a resource OTR
-   * Create a ownership transfer request for a specific resource.
+   * Get all permissions for a bucket.
+   * List all the bucket permissions for the given bucket.
    *
-   * Permission `resource:update` required if the current user is the current owner of the resource,
-   * otherwise `resource:update_any` required.
+   * Permission `bucket_permission:list` required if current user is owner of the bucket,
+   * otherwise `bucket_permission:list_all` required.
    */
-  public static resourceCreateResourceOtr<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<ResourceCreateResourceOtrData, ThrowOnError>,
+  public static bucketPermissionListPermissionsPerBucket<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<
+      BucketPermissionListPermissionsPerBucketData,
+      ThrowOnError
+    >,
   ) {
-    return (options?.client ?? client).post<
-      ResourceCreateResourceOtrResponse,
-      ResourceCreateResourceOtrError,
+    return (options.client ?? _heyApiClient).get<
+      BucketPermissionListPermissionsPerBucketResponse,
+      BucketPermissionListPermissionsPerBucketError,
       ThrowOnError
     >({
+      url: "/ui/permissions/bucket/{bucket_name}",
       ...options,
-      url: "/ui/resources/{rid}/ownership_transfer_request",
     });
   }
 
   /**
-   * Accept a resource OTR
-   * Accept an ownership transfer request for a specific resource.
+   * Delete a bucket permission
+   * Delete the bucket permissions for the specific combination of bucket and user.
    *
-   * Permission `resource:update` required if the current user is the new owner of the resource,
-   * otherwise `resource:update_any` required.
+   * Permission `bucket_permission:delete` required if current user is the target or owner of the bucket permission,
+   * otherwise `bucket_permission:delete_any` required.
    */
-  public static resourceAcceptResourceOtr<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<ResourceAcceptResourceOtrData, ThrowOnError>,
-  ) {
-    return (options?.client ?? client).patch<
-      ResourceAcceptResourceOtrResponse,
-      ResourceAcceptResourceOtrError,
+  public static bucketPermissionDeletePermission<
+    ThrowOnError extends boolean = true,
+  >(options: Options<BucketPermissionDeletePermissionData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).delete<
+      BucketPermissionDeletePermissionResponse,
+      BucketPermissionDeletePermissionError,
       ThrowOnError
     >({
+      url: "/ui/permissions/bucket/{bucket_name}/user/{uid}",
       ...options,
-      url: "/ui/resources/{rid}/ownership_transfer_request",
     });
   }
 
   /**
-   * Delete a resource OTR
-   * Delete/Reject a resource ownership transfer request.
+   * Get permission for bucket and user combination.
+   * Get the bucket permissions for the specific combination of bucket and user.
    *
-   * Permission `resource:update` required if the current user is the current or new owner of the resource,
-   * otherwise `resource:update_any` required.
+   * Permission `bucket_permission:read` required if current user is the target or owner of the bucket permission,
+   * otherwise `bucket_permission:read_any` required.
    */
-  public static resourceDeleteResourceOtr<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<ResourceDeleteResourceOtrData, ThrowOnError>,
-  ) {
-    return (options?.client ?? client).delete<
-      ResourceDeleteResourceOtrResponse,
-      ResourceDeleteResourceOtrError,
+  public static bucketPermissionGetPermission<
+    ThrowOnError extends boolean = true,
+  >(options: Options<BucketPermissionGetPermissionData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).get<
+      BucketPermissionGetPermissionResponse,
+      BucketPermissionGetPermissionError,
       ThrowOnError
     >({
+      url: "/ui/permissions/bucket/{bucket_name}/user/{uid}",
       ...options,
-      url: "/ui/resources/{rid}/ownership_transfer_request",
     });
   }
-}
 
-export class ResourceVersionService {
   /**
-   * List versions of a resource
-   * List all the resource version for a specific resource.
+   * Update a bucket permission
+   * Update a permission for a bucket and user.
    *
-   * Permission 'resource:read' required.
+   * Permission `bucket_permission:update` required.
    */
-  public static resourceVersionListResourceVersions<
+  public static bucketPermissionUpdatePermission<
     ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      ResourceVersionListResourceVersionsData,
-      ThrowOnError
-    >,
-  ) {
-    return (options?.client ?? client).get<
-      ResourceVersionListResourceVersionsResponse,
-      ResourceVersionListResourceVersionsError,
+  >(options: Options<BucketPermissionUpdatePermissionData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).put<
+      BucketPermissionUpdatePermissionResponse,
+      BucketPermissionUpdatePermissionError,
       ThrowOnError
     >({
+      url: "/ui/permissions/bucket/{bucket_name}/user/{uid}",
       ...options,
-      url: "/ui/resources/{rid}/versions",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
+}
 
+export class WorkflowService {
   /**
-   * Request new version of a resource
-   * Request a new resource version.
+   * List workflows
+   * List all workflows.
    *
-   * Permission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise.
+   * Permission `workflow:list` required.
    */
-  public static resourceVersionRequestResourceVersion<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      ResourceVersionRequestResourceVersionData,
-      ThrowOnError
-    >,
+  public static workflowListWorkflows<ThrowOnError extends boolean = true>(
+    options?: Options<WorkflowListWorkflowsData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).post<
-      ResourceVersionRequestResourceVersionResponse,
-      ResourceVersionRequestResourceVersionError,
+    return (options?.client ?? _heyApiClient).get<
+      WorkflowListWorkflowsResponse,
+      WorkflowListWorkflowsError,
       ThrowOnError
     >({
+      url: "/ui/workflows",
       ...options,
-      url: "/ui/resources/{rid}/versions",
     });
   }
 
   /**
-   * Get version of a resource
-   * Get a specific resource version for a specific resource.
+   * Create a new workflow
+   * Create a new workflow.
    *
-   * Permission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and
-   * the current user is not the maintainer, then the permission `resource:read_any` is required.
+   * For private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.
+   *
+   * For private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.
+   *
+   * Permission `workflow:create` required.
    */
-  public static resourceVersionGetResourceVersion<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      ResourceVersionGetResourceVersionData,
-      ThrowOnError
-    >,
+  public static workflowCreateWorkflow<ThrowOnError extends boolean = true>(
+    options: Options<WorkflowCreateWorkflowData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      ResourceVersionGetResourceVersionResponse,
-      ResourceVersionGetResourceVersionError,
+    return (options.client ?? _heyApiClient).post<
+      WorkflowCreateWorkflowResponse,
+      WorkflowCreateWorkflowError,
       ThrowOnError
     >({
+      url: "/ui/workflows",
       ...options,
-      url: "/ui/resources/{rid}/versions/{rvid}",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * Download folder structure of resource
-   * Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster.
+   * List workflow OTRs
+   * Get the ownership transfer requests for workflows.
    *
-   * Permission `resource:read` required.
+   * Permission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id,
+   * otherwise `workflow:list_all`
    */
-  public static resourceVersionResourceFileTree<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      ResourceVersionResourceFileTreeData,
-      ThrowOnError
-    >,
+  public static workflowListWorkflowOtrs<ThrowOnError extends boolean = true>(
+    options?: Options<WorkflowListWorkflowOtrsData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      ResourceVersionResourceFileTreeResponse,
-      ResourceVersionResourceFileTreeError,
+    return (options?.client ?? _heyApiClient).get<
+      WorkflowListWorkflowOtrsResponse,
+      WorkflowListWorkflowOtrsError,
       ThrowOnError
     >({
+      url: "/ui/workflows/ownership_transfer_request",
       ...options,
-      url: "/ui/resources/{rid}/versions/{rvid}/tree",
     });
   }
 
   /**
-   * Request resource version review
-   * Request the review of a resource version.
+   * Get anonymized workflow execution
+   * Get the workflow executions with meta information and anonymized user IDs.
    *
-   * Permission `resource:update` required.
+   * Permission `workflow:read` required if the `developer_id` is the same as the uid of the current user,
+   * other `workflow:read_any`.
    */
-  public static resourceVersionRequestResourceVersionReview<
+  public static workflowGetDeveloperWorkflowStatistics<
     ThrowOnError extends boolean = true,
   >(
-    options: OptionsLegacyParser<
-      ResourceVersionRequestResourceVersionReviewData,
-      ThrowOnError
-    >,
+    options?: Options<WorkflowGetDeveloperWorkflowStatisticsData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).put<
-      ResourceVersionRequestResourceVersionReviewResponse,
-      ResourceVersionRequestResourceVersionReviewError,
+    return (options?.client ?? _heyApiClient).get<
+      WorkflowGetDeveloperWorkflowStatisticsResponse,
+      WorkflowGetDeveloperWorkflowStatisticsError,
       ThrowOnError
     >({
+      url: "/ui/workflows/developer_statistics",
       ...options,
-      url: "/ui/resources/{rid}/versions/{rvid}/request_review",
     });
   }
 
   /**
-   * Request resource version synchronization
-   * Request the synchronization of a resource version to the cluster.
+   * Delete a workflow
+   * Delete a workflow.
    *
-   * Permission `resource:request_sync` required.
+   * Permission `workflow:delete` required if the `developer_id` is the same as the uid of the current user,
+   * other `workflow:delete_any`.
    */
-  public static resourceVersionRequestResourceVersionSync<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      ResourceVersionRequestResourceVersionSyncData,
-      ThrowOnError
-    >,
+  public static workflowDeleteWorkflow<ThrowOnError extends boolean = true>(
+    options: Options<WorkflowDeleteWorkflowData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).put<
-      ResourceVersionRequestResourceVersionSyncResponse,
-      ResourceVersionRequestResourceVersionSyncError,
+    return (options.client ?? _heyApiClient).delete<
+      WorkflowDeleteWorkflowResponse,
+      WorkflowDeleteWorkflowError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}",
       ...options,
-      url: "/ui/resources/{rid}/versions/{rvid}/request_sync",
     });
   }
 
   /**
-   * Review resource version
-   * Review answer the resource version.
+   * Get a workflow
+   * Get a specific workflow.
    *
-   * Permission `resource:update_status` required.
+   * Permission `workflow:read` required.
    */
-  public static resourceVersionResourceVersionReview<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      ResourceVersionResourceVersionReviewData,
-      ThrowOnError
-    >,
+  public static workflowGetWorkflow<ThrowOnError extends boolean = true>(
+    options: Options<WorkflowGetWorkflowData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).put<
-      ResourceVersionResourceVersionReviewResponse,
-      ResourceVersionResourceVersionReviewError,
+    return (options.client ?? _heyApiClient).get<
+      WorkflowGetWorkflowResponse,
+      WorkflowGetWorkflowError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}",
       ...options,
-      url: "/ui/resources/{rid}/versions/{rvid}/review",
     });
   }
 
   /**
-   * Synchronize resource version with cluster
-   * Synchronize the resource version to the cluster.
+   * Delete a workflow OTR
+   * Delete/Reject a workflow ownership transfer request.
    *
-   * Permission `resource:update_any` required.
+   * Permission `workflow:update` required if current user is the current or new owner of the workflow,
+   * otherwise `workflow:update_any` required.
    */
-  public static resourceVersionResourceVersionSync<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      ResourceVersionResourceVersionSyncData,
-      ThrowOnError
-    >,
+  public static workflowDeleteWorkflowOtr<ThrowOnError extends boolean = true>(
+    options: Options<WorkflowDeleteWorkflowOtrData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).put<
-      ResourceVersionResourceVersionSyncResponse,
-      ResourceVersionResourceVersionSyncError,
+    return (options.client ?? _heyApiClient).delete<
+      WorkflowDeleteWorkflowOtrResponse,
+      WorkflowDeleteWorkflowOtrError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/ownership_transfer_request",
       ...options,
-      url: "/ui/resources/{rid}/versions/{rvid}/sync",
     });
   }
 
   /**
-   * Set resource version to latest
-   * Set the resource version as the latest version.
+   * Get a workflow OTR
+   * Get a specific workflow ownership transfer request.
    *
-   * Permission `resource:update_any` required.
+   * Permission `workflow:read` required if current user is the current or new owner of the workflow,
+   * otherwise `workflow:read_any` required.
    */
-  public static resourceVersionResourceVersionLatest<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      ResourceVersionResourceVersionLatestData,
-      ThrowOnError
-    >,
+  public static workflowGetWorkflowOtr<ThrowOnError extends boolean = true>(
+    options: Options<WorkflowGetWorkflowOtrData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).put<
-      ResourceVersionResourceVersionLatestResponse,
-      ResourceVersionResourceVersionLatestError,
+    return (options.client ?? _heyApiClient).get<
+      WorkflowGetWorkflowOtrResponse,
+      WorkflowGetWorkflowOtrError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/ownership_transfer_request",
       ...options,
-      url: "/ui/resources/{rid}/versions/{rvid}/latest",
     });
   }
 
   /**
-   * Delete resource version on cluster
-   * Delete the resource version on the cluster.
+   * Accept a workflow OTR
+   * Accept an ownership transfer request for a specific workflow.
    *
-   * Permission `resource:delete_any` required.
+   * Permission `workflow:update` required if the current user is the new owner of the workflow,
+   * otherwise `workflow:update_any` required.
    */
-  public static resourceVersionDeleteResourceVersionCluster<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      ResourceVersionDeleteResourceVersionClusterData,
-      ThrowOnError
-    >,
+  public static workflowAcceptWorkflowOtr<ThrowOnError extends boolean = true>(
+    options: Options<WorkflowAcceptWorkflowOtrData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).delete<
-      ResourceVersionDeleteResourceVersionClusterResponse,
-      ResourceVersionDeleteResourceVersionClusterError,
+    return (options.client ?? _heyApiClient).patch<
+      WorkflowAcceptWorkflowOtrResponse,
+      WorkflowAcceptWorkflowOtrError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/ownership_transfer_request",
       ...options,
-      url: "/ui/resources/{rid}/versions/{rvid}/cluster",
     });
   }
 
   /**
-   * Delete resource version in S3
-   * Delete the resource version in the S3 bucket.
+   * Create a workflow OTR
+   * Create a ownership transfer request for a specific workflow.
    *
-   * Permission `resource:delete_any` required.
+   * Permission `workflow:update` required if the current user is the current owner of the workflow,
+   * otherwise `workflow:update_any` required.
    */
-  public static resourceVersionDeleteResourceVersionS3<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      ResourceVersionDeleteResourceVersionS3Data,
-      ThrowOnError
-    >,
+  public static workflowCreateWorkflowOtr<ThrowOnError extends boolean = true>(
+    options: Options<WorkflowCreateWorkflowOtrData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).delete<
-      ResourceVersionDeleteResourceVersionS3Response,
-      ResourceVersionDeleteResourceVersionS3Error,
+    return (options.client ?? _heyApiClient).post<
+      WorkflowCreateWorkflowOtrResponse,
+      WorkflowCreateWorkflowOtrError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/ownership_transfer_request",
       ...options,
-      url: "/ui/resources/{rid}/versions/{rvid}/s3",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
-}
 
-export class S3KeyService {
   /**
-   * Get the S3 Access keys from a user
-   * Get all the S3 Access keys for a specific user.
+   * Get statistics for a workflow
+   * Get the number of started workflow per day.
    *
-   * Permission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required.
+   * Permission `workflow:read` required.
    */
-  public static s3KeyGetUserKeys<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<S3KeyGetUserKeysData, ThrowOnError>,
-  ) {
-    return (options?.client ?? client).get<
-      S3KeyGetUserKeysResponse,
-      S3KeyGetUserKeysError,
+  public static workflowGetWorkflowStatistics<
+    ThrowOnError extends boolean = true,
+  >(options: Options<WorkflowGetWorkflowStatisticsData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).get<
+      WorkflowGetWorkflowStatisticsResponse,
+      WorkflowGetWorkflowStatisticsError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/statistics",
       ...options,
-      url: "/ui/users/{uid}/keys",
     });
   }
 
   /**
-   * Create a Access key for a user
-   * Create a S3 Access key for a specific user.
+   * Update a workflow
+   * Create a new workflow version.
    *
-   * Permission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required.
+   * Permission `workflow:update` required.
    */
-  public static s3KeyCreateUserKey<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<S3KeyCreateUserKeyData, ThrowOnError>,
+  public static workflowUpdateWorkflow<ThrowOnError extends boolean = true>(
+    options: Options<WorkflowUpdateWorkflowData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).post<
-      S3KeyCreateUserKeyResponse,
-      S3KeyCreateUserKeyError,
+    return (options.client ?? _heyApiClient).post<
+      WorkflowUpdateWorkflowResponse,
+      WorkflowUpdateWorkflowError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/update",
       ...options,
-      url: "/ui/users/{uid}/keys",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
+}
 
+export class WorkflowVersionService {
   /**
-   * Get a specific S3 Access key from a user
-   * Get a specific S3 Access Key for a specific user.
+   * Get all versions of a workflow
+   * List all versions of a Workflow.
    *
-   * Permission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required.
+   * Permission `workflow:list` required.
    */
-  public static s3KeyGetUserKey<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<S3KeyGetUserKeyData, ThrowOnError>,
-  ) {
-    return (options?.client ?? client).get<
-      S3KeyGetUserKeyResponse,
-      S3KeyGetUserKeyError,
+  public static workflowVersionListWorkflowVersion<
+    ThrowOnError extends boolean = true,
+  >(options: Options<WorkflowVersionListWorkflowVersionData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).get<
+      WorkflowVersionListWorkflowVersionResponse,
+      WorkflowVersionListWorkflowVersionError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/versions",
       ...options,
-      url: "/ui/users/{uid}/keys/{access_id}",
     });
   }
 
   /**
-   * Delete a specific S3 Access key from a user
-   * Delete a specific S3 Access key for a specific user.
+   * Get a workflow version
+   * Get a specific version of a workflow.
    *
-   * Permission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.
+   * Permission `workflow:read` required if the version is public or you are the developer of the workflow,
+   * otherwise `workflow:read_any`
    */
-  public static s3KeyDeleteUserKey<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<S3KeyDeleteUserKeyData, ThrowOnError>,
-  ) {
-    return (options?.client ?? client).delete<
-      S3KeyDeleteUserKeyResponse,
-      S3KeyDeleteUserKeyError,
+  public static workflowVersionGetWorkflowVersion<
+    ThrowOnError extends boolean = true,
+  >(options: Options<WorkflowVersionGetWorkflowVersionData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).get<
+      WorkflowVersionGetWorkflowVersionResponse,
+      WorkflowVersionGetWorkflowVersionError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/versions/{git_commit_hash}",
       ...options,
-      url: "/ui/users/{uid}/keys/{access_id}",
     });
   }
-}
 
-export class UserService {
   /**
-   * Create User
-   * Create a new user in the system and notify him.
+   * Update status of workflow version
+   * Update the status of a workflow version.
    *
-   * Permission `user:create` required.
+   * Permission `workflow:update_status`
    */
-  public static userCreateUser<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<UserCreateUserData, ThrowOnError>,
+  public static workflowVersionUpdateWorkflowVersionStatus<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<
+      WorkflowVersionUpdateWorkflowVersionStatusData,
+      ThrowOnError
+    >,
   ) {
-    return (options?.client ?? client).post<
-      UserCreateUserResponse,
-      UserCreateUserError,
+    return (options.client ?? _heyApiClient).patch<
+      WorkflowVersionUpdateWorkflowVersionStatusResponse,
+      WorkflowVersionUpdateWorkflowVersionStatusError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/status",
       ...options,
-      url: "/ui/users",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * List users and search by their name
-   * List all users in the system..
+   * Get metadata of workflow version
+   * Get the metadata of a workflow version.
    *
-   * Permission `user:list` required.
+   * Permission `workflow:read` required if the current user is the developer of the workflow,
+   * otherwise `workflow:read_any`
    */
-  public static userListUsers<ThrowOnError extends boolean = true>(
-    options?: OptionsLegacyParser<UserListUsersData, ThrowOnError>,
+  public static workflowVersionGetWorkflowVersionMetadata<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<
+      WorkflowVersionGetWorkflowVersionMetadataData,
+      ThrowOnError
+    >,
   ) {
-    return (options?.client ?? client).get<
-      UserListUsersResponse,
-      UserListUsersError,
+    return (options.client ?? _heyApiClient).get<
+      WorkflowVersionGetWorkflowVersionMetadataResponse,
+      WorkflowVersionGetWorkflowVersionMetadataError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/metadata",
       ...options,
-      url: "/ui/users",
     });
   }
 
   /**
-   * Search Users
-   * Search for users in the system by their name.
+   * Update metadata of workflow version
+   * Update the metadata of a workflow version.
    *
-   * Permission `user: search` required.
+   * Permission `workflow:update` required if the current user is the developer of the workflow,
+   * otherwise `workflow:update_any`
    */
-  public static userSearchUsers<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<UserSearchUsersData, ThrowOnError>,
+  public static workflowVersionUpdateWorkflowVersionMetadata<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<
+      WorkflowVersionUpdateWorkflowVersionMetadataData,
+      ThrowOnError
+    >,
   ) {
-    return (options?.client ?? client).get<
-      UserSearchUsersResponse,
-      UserSearchUsersError,
+    return (options.client ?? _heyApiClient).put<
+      WorkflowVersionUpdateWorkflowVersionMetadataResponse,
+      WorkflowVersionUpdateWorkflowVersionMetadataError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/metadata",
       ...options,
-      url: "/ui/users/search",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * Get the logged in user
-   * Return the user associated with the used JWT.
+   * Deprecate a workflow version
+   * Deprecate a workflow version.
    *
-   * Permission `user:read` required.
+   * Permission `workflow:update` required if you are the developer of the workflow,
+   * otherwise `workflow:update_status`
    */
-  public static userGetLoggedInUser<ThrowOnError extends boolean = true>(
-    options?: OptionsLegacyParser<unknown, ThrowOnError>,
+  public static workflowVersionDeprecateWorkflowVersion<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<WorkflowVersionDeprecateWorkflowVersionData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      UserGetLoggedInUserResponse,
-      UserGetLoggedInUserError,
+    return (options.client ?? _heyApiClient).patch<
+      WorkflowVersionDeprecateWorkflowVersionResponse,
+      WorkflowVersionDeprecateWorkflowVersionError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate",
       ...options,
-      url: "/ui/users/me",
     });
   }
 
   /**
-   * Get a user by its uid
-   * Return the user with the specific uid.
+   * Update parameter extension of workflow version
+   * Update the parameter extension of a workflow version.
    *
-   * Permission `user:read` required.
+   * Permission `workflow:update` required.
    */
-  public static userGetUser<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<UserGetUserData, ThrowOnError>,
+  public static workflowVersionUpdateWorkflowVersionParameterExtension<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<
+      WorkflowVersionUpdateWorkflowVersionParameterExtensionData,
+      ThrowOnError
+    >,
   ) {
-    return (options?.client ?? client).get<
-      UserGetUserResponse,
-      UserGetUserError,
+    return (options.client ?? _heyApiClient).patch<
+      WorkflowVersionUpdateWorkflowVersionParameterExtensionResponse,
+      WorkflowVersionUpdateWorkflowVersionParameterExtensionError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension",
       ...options,
-      url: "/ui/users/{uid}",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * Update user roles
-   * Update the roles of a user.
+   * Fetch documentation for a workflow version
+   * Get the documentation for a specific workflow version.
+   * Streams the response directly from the right git repository.
    *
-   * Permission `user:update` required.
+   * Permission `workflow:read` required.
    */
-  public static userUpdateRoles<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<UserUpdateRolesData, ThrowOnError>,
+  public static workflowVersionDownloadWorkflowDocumentation<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<
+      WorkflowVersionDownloadWorkflowDocumentationData,
+      ThrowOnError
+    >,
   ) {
-    return (options?.client ?? client).put<
-      UserUpdateRolesResponse,
-      UserUpdateRolesError,
+    return (options.client ?? _heyApiClient).get<
+      unknown,
+      WorkflowVersionDownloadWorkflowDocumentationError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/documentation",
       ...options,
-      url: "/ui/users/{uid}/roles",
     });
   }
 
   /**
-   * Resend Invitation
-   * Resend the invitation link for an user that has an open invitation.
+   * Delete icon of workflow version
+   * Delete the icon of the workflow version.
    *
-   * Permission `user:create` required.
+   * Permission `workflow:update` required.
    */
-  public static userResendInvitation<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<UserResendInvitationData, ThrowOnError>,
+  public static workflowVersionDeleteWorkflowVersionIcon<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<
+      WorkflowVersionDeleteWorkflowVersionIconData,
+      ThrowOnError
+    >,
   ) {
-    return (options?.client ?? client).patch<
-      UserResendInvitationResponse,
-      UserResendInvitationError,
+    return (options.client ?? _heyApiClient).delete<
+      WorkflowVersionDeleteWorkflowVersionIconResponse,
+      WorkflowVersionDeleteWorkflowVersionIconError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/icon",
       ...options,
-      url: "/ui/users/{uid}/invitation",
+    });
+  }
+
+  /**
+   * Upload icon for workflow version
+   * Upload an icon for the workflow version and returns the new icon URL.
+   *
+   * Permission `workflow:update` required.
+   */
+  public static workflowVersionUploadWorkflowVersionIcon<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<
+      WorkflowVersionUploadWorkflowVersionIconData,
+      ThrowOnError
+    >,
+  ) {
+    return (options.client ?? _heyApiClient).post<
+      WorkflowVersionUploadWorkflowVersionIconResponse,
+      WorkflowVersionUploadWorkflowVersionIconError,
+      ThrowOnError
+    >({
+      ...formDataBodySerializer,
+      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/icon",
+      ...options,
+      headers: {
+        "Content-Type": null,
+        ...options?.headers,
+      },
     });
   }
 }
 
-export class WorkflowService {
+export class WorkflowExecutionService {
   /**
-   * Create a new workflow
-   * Create a new workflow.
+   * List all workflow executions
+   * Get all workflow executions.
+   *
+   * This endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the
+   * `Link` header.
+   * A missing `Link` header indicates that you iterated over all workflow executions with the current filters.
+   *
+   * Permission `workflow_execution:list` required, if `executor_id` is the same as the current user,
+   * otherwise `workflow_execution:list_all` required.
+   */
+  public static workflowExecutionListWorkflowExecutions<
+    ThrowOnError extends boolean = true,
+  >(
+    options?: Options<
+      WorkflowExecutionListWorkflowExecutionsData,
+      ThrowOnError
+    >,
+  ) {
+    return (options?.client ?? _heyApiClient).get<
+      WorkflowExecutionListWorkflowExecutionsResponse,
+      WorkflowExecutionListWorkflowExecutionsError,
+      ThrowOnError
+    >({
+      url: "/ui/workflow_executions",
+      ...options,
+    });
+  }
+
+  /**
+   * Start a new workflow execution
+   * Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.
+   *
+   * Permission `workflow_execution:create` required if workflow versions status is `PUBLISHED`,
+   * otherwise `workflow_execution:create_any` required.
+   */
+  public static workflowExecutionStartWorkflow<
+    ThrowOnError extends boolean = true,
+  >(options: Options<WorkflowExecutionStartWorkflowData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).post<
+      WorkflowExecutionStartWorkflowResponse,
+      WorkflowExecutionStartWorkflowError,
+      ThrowOnError
+    >({
+      url: "/ui/workflow_executions",
+      ...options,
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
+    });
+  }
+
+  /**
+   * Start a workflow execution with arbitrary git repository
+   * Start a new workflow execution from an arbitrary git repository.
    *
    * For private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.
    *
@@ -1581,779 +1691,791 @@ export class WorkflowService {
    *
    * Permission `workflow:create` required.
    */
-  public static workflowCreateWorkflow<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<WorkflowCreateWorkflowData, ThrowOnError>,
+  public static workflowExecutionStartArbitraryWorkflow<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<WorkflowExecutionStartArbitraryWorkflowData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).post<
-      WorkflowCreateWorkflowResponse,
-      WorkflowCreateWorkflowError,
+    return (options.client ?? _heyApiClient).post<
+      WorkflowExecutionStartArbitraryWorkflowResponse,
+      WorkflowExecutionStartArbitraryWorkflowError,
       ThrowOnError
     >({
+      url: "/ui/workflow_executions/arbitrary",
       ...options,
-      url: "/ui/workflows",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * List workflows
-   * List all workflows.
+   * Delete a workflow execution
+   * Delete a specific workflow execution.
    *
-   * Permission `workflow:list` required.
+   * Permission `workflow_execution:delete` required if the current user started the workflow execution,
+   * otherwise `workflow_execution:delete_any` required.
    */
-  public static workflowListWorkflows<ThrowOnError extends boolean = true>(
-    options?: OptionsLegacyParser<WorkflowListWorkflowsData, ThrowOnError>,
+  public static workflowExecutionDeleteWorkflowExecution<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<
+      WorkflowExecutionDeleteWorkflowExecutionData,
+      ThrowOnError
+    >,
   ) {
-    return (options?.client ?? client).get<
-      WorkflowListWorkflowsResponse,
-      WorkflowListWorkflowsError,
+    return (options.client ?? _heyApiClient).delete<
+      WorkflowExecutionDeleteWorkflowExecutionResponse,
+      WorkflowExecutionDeleteWorkflowExecutionError,
       ThrowOnError
     >({
+      url: "/ui/workflow_executions/{eid}",
       ...options,
-      url: "/ui/workflows",
     });
   }
 
   /**
-   * List workflow OTRs
-   * Get the ownership transfer requests for workflows.
+   * Get a workflow execution
+   * Get a specific workflow execution.
    *
-   * Permission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id,
-   * otherwise `workflow:list_all`
+   * Permission `workflow_execution:read` required if the current user started the workflow execution,
+   * otherwise `workflow_execution:read_any` required.
    */
-  public static workflowListWorkflowOtrs<ThrowOnError extends boolean = true>(
-    options?: OptionsLegacyParser<WorkflowListWorkflowOtrsData, ThrowOnError>,
-  ) {
-    return (options?.client ?? client).get<
-      WorkflowListWorkflowOtrsResponse,
-      WorkflowListWorkflowOtrsError,
+  public static workflowExecutionGetWorkflowExecution<
+    ThrowOnError extends boolean = true,
+  >(options: Options<WorkflowExecutionGetWorkflowExecutionData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).get<
+      WorkflowExecutionGetWorkflowExecutionResponse,
+      WorkflowExecutionGetWorkflowExecutionError,
       ThrowOnError
     >({
+      url: "/ui/workflow_executions/{eid}",
       ...options,
-      url: "/ui/workflows/ownership_transfer_request",
     });
   }
 
   /**
-   * Get anonymized workflow execution
-   * Get the workflow executions with meta information and anonymized user IDs.
+   * Get the parameters of a workflow execution
+   * Get the parameters of a specific workflow execution.
    *
-   * Permission `workflow:read` required if the `developer_id` is the same as the uid of the current user,
-   * other `workflow:read_any`.
+   * Permission `workflow_execution:read` required if the current user started the workflow execution,
+   * otherwise `workflow_execution:read_any` required.
    */
-  public static workflowGetDeveloperWorkflowStatistics<
+  public static workflowExecutionGetWorkflowExecutionParams<
     ThrowOnError extends boolean = true,
   >(
-    options?: OptionsLegacyParser<
-      WorkflowGetDeveloperWorkflowStatisticsData,
+    options: Options<
+      WorkflowExecutionGetWorkflowExecutionParamsData,
       ThrowOnError
     >,
   ) {
-    return (options?.client ?? client).get<
-      WorkflowGetDeveloperWorkflowStatisticsResponse,
-      WorkflowGetDeveloperWorkflowStatisticsError,
+    return (options.client ?? _heyApiClient).get<
+      WorkflowExecutionGetWorkflowExecutionParamsResponse,
+      WorkflowExecutionGetWorkflowExecutionParamsError,
       ThrowOnError
     >({
+      url: "/ui/workflow_executions/{eid}/params",
       ...options,
-      url: "/ui/workflows/developer_statistics",
-      responseTransformer:
-        WorkflowGetDeveloperWorkflowStatisticsResponseTransformer,
     });
   }
 
   /**
-   * Get a workflow
-   * Get a specific workflow.
+   * Cancel a workflow execution
+   * Cancel a running workflow execution.
    *
-   * Permission `workflow:read` required.
+   * Permission `workflow_execution:cancel` required if the current user started the workflow execution,
+   * otherwise `workflow_execution:cancel_any` required.
    */
-  public static workflowGetWorkflow<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<WorkflowGetWorkflowData, ThrowOnError>,
+  public static workflowExecutionCancelWorkflowExecution<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<
+      WorkflowExecutionCancelWorkflowExecutionData,
+      ThrowOnError
+    >,
   ) {
-    return (options?.client ?? client).get<
-      WorkflowGetWorkflowResponse,
-      WorkflowGetWorkflowError,
+    return (options.client ?? _heyApiClient).post<
+      WorkflowExecutionCancelWorkflowExecutionResponse,
+      WorkflowExecutionCancelWorkflowExecutionError,
       ThrowOnError
     >({
+      url: "/ui/workflow_executions/{eid}/cancel",
       ...options,
-      url: "/ui/workflows/{wid}",
     });
   }
+}
 
+export class WorkflowCredentialsService {
   /**
-   * Delete a workflow
-   * Delete a workflow.
+   * Delete the credentials of a workflow
+   * Delete the credentials for the repository of a workflow.
    *
-   * Permission `workflow:delete` required if the `developer_id` is the same as the uid of the current user,
+   * Permission `workflow:delete` required if the developer of the workflow is the same as the current user,
    * other `workflow:delete_any`.
    */
-  public static workflowDeleteWorkflow<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<WorkflowDeleteWorkflowData, ThrowOnError>,
+  public static workflowCredentialsDeleteWorkflowCredentials<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<
+      WorkflowCredentialsDeleteWorkflowCredentialsData,
+      ThrowOnError
+    >,
   ) {
-    return (options?.client ?? client).delete<
-      WorkflowDeleteWorkflowResponse,
-      WorkflowDeleteWorkflowError,
+    return (options.client ?? _heyApiClient).delete<
+      WorkflowCredentialsDeleteWorkflowCredentialsResponse,
+      WorkflowCredentialsDeleteWorkflowCredentialsError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/credentials",
       ...options,
-      url: "/ui/workflows/{wid}",
     });
   }
 
   /**
-   * Get a workflow OTR
-   * Get a specific workflow ownership transfer request.
+   * Get the credentials of a workflow
+   * Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.
    *
-   * Permission `workflow:read` required if current user is the current or new owner of the workflow,
-   * otherwise `workflow:read_any` required.
+   * Permission `workflow:update` required.
    */
-  public static workflowGetWorkflowOtr<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<WorkflowGetWorkflowOtrData, ThrowOnError>,
+  public static workflowCredentialsGetWorkflowCredentials<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<
+      WorkflowCredentialsGetWorkflowCredentialsData,
+      ThrowOnError
+    >,
   ) {
-    return (options?.client ?? client).get<
-      WorkflowGetWorkflowOtrResponse,
-      WorkflowGetWorkflowOtrError,
+    return (options.client ?? _heyApiClient).get<
+      WorkflowCredentialsGetWorkflowCredentialsResponse,
+      WorkflowCredentialsGetWorkflowCredentialsError,
       ThrowOnError
     >({
+      url: "/ui/workflows/{wid}/credentials",
       ...options,
-      url: "/ui/workflows/{wid}/ownership_transfer_request",
     });
   }
 
   /**
-   * Create a workflow OTR
-   * Create a ownership transfer request for a specific workflow.
+   * Update the credentials of a workflow
+   * Update the credentials for the repository of a workflow.
    *
-   * Permission `workflow:update` required if the current user is the current owner of the workflow,
-   * otherwise `workflow:update_any` required.
+   * Permission `workflow:update` required.
    */
-  public static workflowCreateWorkflowOtr<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<WorkflowCreateWorkflowOtrData, ThrowOnError>,
+  public static workflowCredentialsUpdateWorkflowCredentials<
+    ThrowOnError extends boolean = true,
+  >(
+    options: Options<
+      WorkflowCredentialsUpdateWorkflowCredentialsData,
+      ThrowOnError
+    >,
+  ) {
+    return (options.client ?? _heyApiClient).put<
+      unknown,
+      WorkflowCredentialsUpdateWorkflowCredentialsError,
+      ThrowOnError
+    >({
+      url: "/ui/workflows/{wid}/credentials",
+      ...options,
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
+    });
+  }
+}
+
+export class WorkflowModeService {
+  /**
+   * Get workflow mode
+   * Get a workflow mode.
+   *
+   * Permission `workflow:read` required
+   */
+  public static workflowModeGetWorkflowMode<
+    ThrowOnError extends boolean = true,
+  >(options: Options<WorkflowModeGetWorkflowModeData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).get<
+      WorkflowModeGetWorkflowModeResponse,
+      WorkflowModeGetWorkflowModeError,
+      ThrowOnError
+    >({
+      url: "/ui/workflow_modes/{mode_id}",
+      ...options,
+    });
+  }
+}
+
+export class ResourceService {
+  /**
+   * List resources
+   * List all resources.
+   *
+   * Permission `resource:list` required.
+   */
+  public static resourceListResources<ThrowOnError extends boolean = true>(
+    options?: Options<ResourceListResourcesData, ThrowOnError>,
+  ) {
+    return (options?.client ?? _heyApiClient).get<
+      ResourceListResourcesResponse,
+      ResourceListResourcesError,
+      ThrowOnError
+    >({
+      url: "/ui/resources",
+      ...options,
+    });
+  }
+
+  /**
+   * Request a new resource
+   * Request a new resources.
+   *
+   * Permission `resource:create` required.
+   */
+  public static resourceCreateResource<ThrowOnError extends boolean = true>(
+    options: Options<ResourceCreateResourceData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).post<
-      WorkflowCreateWorkflowOtrResponse,
-      WorkflowCreateWorkflowOtrError,
+    return (options.client ?? _heyApiClient).post<
+      ResourceCreateResourceResponse,
+      ResourceCreateResourceError,
       ThrowOnError
     >({
+      url: "/ui/resources",
       ...options,
-      url: "/ui/workflows/{wid}/ownership_transfer_request",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * Accept a workflow OTR
-   * Accept an ownership transfer request for a specific workflow.
+   * List resource sync requests
+   * List all resource sync requests.
    *
-   * Permission `workflow:update` required if the current user is the new owner of the workflow,
-   * otherwise `workflow:update_any` required.
+   * Permission `resource:update_any` required.
    */
-  public static workflowAcceptWorkflowOtr<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<WorkflowAcceptWorkflowOtrData, ThrowOnError>,
+  public static resourceListSyncRequests<ThrowOnError extends boolean = true>(
+    options?: Options<ResourceListSyncRequestsData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).patch<
-      WorkflowAcceptWorkflowOtrResponse,
-      WorkflowAcceptWorkflowOtrError,
+    return (options?.client ?? _heyApiClient).get<
+      ResourceListSyncRequestsResponse,
+      unknown,
       ThrowOnError
     >({
+      url: "/ui/resources/sync_requests",
       ...options,
-      url: "/ui/workflows/{wid}/ownership_transfer_request",
     });
   }
 
   /**
-   * Delete a workflow OTR
-   * Delete/Reject a workflow ownership transfer request.
+   * List resource OTRs
+   * Get the ownership transfer requests for resources.
    *
-   * Permission `workflow:update` required if current user is the current or new owner of the workflow,
-   * otherwise `workflow:update_any` required.
+   * Permission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id,
+   * otherwise `resource:list_all`
    */
-  public static workflowDeleteWorkflowOtr<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<WorkflowDeleteWorkflowOtrData, ThrowOnError>,
+  public static resourceListResourceOtrs<ThrowOnError extends boolean = true>(
+    options?: Options<ResourceListResourceOtrsData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).delete<
-      WorkflowDeleteWorkflowOtrResponse,
-      WorkflowDeleteWorkflowOtrError,
+    return (options?.client ?? _heyApiClient).get<
+      ResourceListResourceOtrsResponse,
+      ResourceListResourceOtrsError,
       ThrowOnError
     >({
+      url: "/ui/resources/ownership_transfer_request",
       ...options,
-      url: "/ui/workflows/{wid}/ownership_transfer_request",
     });
   }
 
   /**
-   * Get statistics for a workflow
-   * Get the number of started workflow per day.
+   * Delete a resource
+   * Delete a resources.
    *
-   * Permission `workflow:read` required.
+   * Permission `resource:delete` required.
    */
-  public static workflowGetWorkflowStatistics<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowGetWorkflowStatisticsData,
-      ThrowOnError
-    >,
+  public static resourceDeleteResource<ThrowOnError extends boolean = true>(
+    options: Options<ResourceDeleteResourceData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      WorkflowGetWorkflowStatisticsResponse,
-      WorkflowGetWorkflowStatisticsError,
+    return (options.client ?? _heyApiClient).delete<
+      ResourceDeleteResourceResponse,
+      ResourceDeleteResourceError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}",
       ...options,
-      url: "/ui/workflows/{wid}/statistics",
-      responseTransformer: WorkflowGetWorkflowStatisticsResponseTransformer,
     });
   }
 
   /**
-   * Update a workflow
-   * Create a new workflow version.
+   * Get a resource
+   * Get a specific resource.
    *
-   * Permission `workflow:update` required.
+   * Permission `resource:read` required.
    */
-  public static workflowUpdateWorkflow<ThrowOnError extends boolean = true>(
-    options: OptionsLegacyParser<WorkflowUpdateWorkflowData, ThrowOnError>,
+  public static resourceGetResource<ThrowOnError extends boolean = true>(
+    options: Options<ResourceGetResourceData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).post<
-      WorkflowUpdateWorkflowResponse,
-      WorkflowUpdateWorkflowError,
+    return (options.client ?? _heyApiClient).get<
+      ResourceGetResourceResponse,
+      ResourceGetResourceError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}",
       ...options,
-      url: "/ui/workflows/{wid}/update",
     });
   }
-}
 
-export class WorkflowCredentialsService {
   /**
-   * Get the credentials of a workflow
-   * Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.
+   * Delete a resource OTR
+   * Delete/Reject a resource ownership transfer request.
    *
-   * Permission `workflow:update` required.
+   * Permission `resource:update` required if the current user is the current or new owner of the resource,
+   * otherwise `resource:update_any` required.
    */
-  public static workflowCredentialsGetWorkflowCredentials<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowCredentialsGetWorkflowCredentialsData,
-      ThrowOnError
-    >,
+  public static resourceDeleteResourceOtr<ThrowOnError extends boolean = true>(
+    options: Options<ResourceDeleteResourceOtrData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      WorkflowCredentialsGetWorkflowCredentialsResponse,
-      WorkflowCredentialsGetWorkflowCredentialsError,
+    return (options.client ?? _heyApiClient).delete<
+      ResourceDeleteResourceOtrResponse,
+      ResourceDeleteResourceOtrError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}/ownership_transfer_request",
       ...options,
-      url: "/ui/workflows/{wid}/credentials",
     });
   }
 
   /**
-   * Update the credentials of a workflow
-   * Update the credentials for the repository of a workflow.
+   * Get a resource OTR
+   * Get a specific resource ownership transfer request.
    *
-   * Permission `workflow:update` required.
+   * Permission `resource:read` required if the current user is the current or new owner of the resource,
+   * otherwise `resource:read_any` required.
    */
-  public static workflowCredentialsUpdateWorkflowCredentials<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowCredentialsUpdateWorkflowCredentialsData,
-      ThrowOnError
-    >,
+  public static resourceGetResourceOtr<ThrowOnError extends boolean = true>(
+    options: Options<ResourceGetResourceOtrData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).put<
-      WorkflowCredentialsUpdateWorkflowCredentialsResponse,
-      WorkflowCredentialsUpdateWorkflowCredentialsError,
+    return (options.client ?? _heyApiClient).get<
+      ResourceGetResourceOtrResponse,
+      ResourceGetResourceOtrError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}/ownership_transfer_request",
       ...options,
-      url: "/ui/workflows/{wid}/credentials",
     });
   }
 
   /**
-   * Delete the credentials of a workflow
-   * Delete the credentials for the repository of a workflow.
+   * Accept a resource OTR
+   * Accept an ownership transfer request for a specific resource.
    *
-   * Permission `workflow:delete` required if the developer of the workflow is the same as the current user,
-   * other `workflow:delete_any`.
+   * Permission `resource:update` required if the current user is the new owner of the resource,
+   * otherwise `resource:update_any` required.
    */
-  public static workflowCredentialsDeleteWorkflowCredentials<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowCredentialsDeleteWorkflowCredentialsData,
-      ThrowOnError
-    >,
+  public static resourceAcceptResourceOtr<ThrowOnError extends boolean = true>(
+    options: Options<ResourceAcceptResourceOtrData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).delete<
-      WorkflowCredentialsDeleteWorkflowCredentialsResponse,
-      WorkflowCredentialsDeleteWorkflowCredentialsError,
+    return (options.client ?? _heyApiClient).patch<
+      ResourceAcceptResourceOtrResponse,
+      ResourceAcceptResourceOtrError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}/ownership_transfer_request",
       ...options,
-      url: "/ui/workflows/{wid}/credentials",
     });
   }
-}
 
-export class WorkflowExecutionService {
   /**
-   * Start a new workflow execution
-   * Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.
+   * Create a resource OTR
+   * Create a ownership transfer request for a specific resource.
    *
-   * Permission `workflow_execution:create` required if workflow versions status is `PUBLISHED`,
-   * otherwise `workflow_execution:create_any` required.
+   * Permission `resource:update` required if the current user is the current owner of the resource,
+   * otherwise `resource:update_any` required.
    */
-  public static workflowExecutionStartWorkflow<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowExecutionStartWorkflowData,
-      ThrowOnError
-    >,
+  public static resourceCreateResourceOtr<ThrowOnError extends boolean = true>(
+    options: Options<ResourceCreateResourceOtrData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).post<
-      WorkflowExecutionStartWorkflowResponse,
-      WorkflowExecutionStartWorkflowError,
+    return (options.client ?? _heyApiClient).post<
+      ResourceCreateResourceOtrResponse,
+      ResourceCreateResourceOtrError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}/ownership_transfer_request",
       ...options,
-      url: "/ui/workflow_executions",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
+}
 
+export class ResourceVersionService {
   /**
-   * List all workflow executions
-   * Get all workflow executions.
-   *
-   * This endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the
-   * `Link` header.
-   * A missing `Link` header indicates that you iterated over all workflow executions with the current filters.
+   * List versions of a resource
+   * List all the resource version for a specific resource.
    *
-   * Permission `workflow_execution:list` required, if `executor_id` is the same as the current user,
-   * otherwise `workflow_execution:list_all` required.
+   * Permission 'resource:read' required.
    */
-  public static workflowExecutionListWorkflowExecutions<
+  public static resourceVersionListResourceVersions<
     ThrowOnError extends boolean = true,
-  >(
-    options?: OptionsLegacyParser<
-      WorkflowExecutionListWorkflowExecutionsData,
-      ThrowOnError
-    >,
-  ) {
-    return (options?.client ?? client).get<
-      WorkflowExecutionListWorkflowExecutionsResponse,
-      WorkflowExecutionListWorkflowExecutionsError,
+  >(options: Options<ResourceVersionListResourceVersionsData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).get<
+      ResourceVersionListResourceVersionsResponse,
+      ResourceVersionListResourceVersionsError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}/versions",
       ...options,
-      url: "/ui/workflow_executions",
     });
   }
 
   /**
-   * Start a workflow execution with arbitrary git repository
-   * Start a new workflow execution from an arbitrary git repository.
-   *
-   * For private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.
-   *
-   * For private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.
+   * Request new version of a resource
+   * Request a new resource version.
    *
-   * Permission `workflow:create` required.
+   * Permission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise.
    */
-  public static workflowExecutionStartArbitraryWorkflow<
+  public static resourceVersionRequestResourceVersion<
     ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowExecutionStartArbitraryWorkflowData,
-      ThrowOnError
-    >,
-  ) {
-    return (options?.client ?? client).post<
-      WorkflowExecutionStartArbitraryWorkflowResponse,
-      WorkflowExecutionStartArbitraryWorkflowError,
+  >(options: Options<ResourceVersionRequestResourceVersionData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).post<
+      ResourceVersionRequestResourceVersionResponse,
+      ResourceVersionRequestResourceVersionError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}/versions",
       ...options,
-      url: "/ui/workflow_executions/arbitrary",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * Get a workflow execution
-   * Get a specific workflow execution.
+   * Get version of a resource
+   * Get a specific resource version for a specific resource.
    *
-   * Permission `workflow_execution:read` required if the current user started the workflow execution,
-   * otherwise `workflow_execution:read_any` required.
+   * Permission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and
+   * the current user is not the maintainer, then the permission `resource:read_any` is required.
    */
-  public static workflowExecutionGetWorkflowExecution<
+  public static resourceVersionGetResourceVersion<
     ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowExecutionGetWorkflowExecutionData,
-      ThrowOnError
-    >,
-  ) {
-    return (options?.client ?? client).get<
-      WorkflowExecutionGetWorkflowExecutionResponse,
-      WorkflowExecutionGetWorkflowExecutionError,
+  >(options: Options<ResourceVersionGetResourceVersionData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).get<
+      ResourceVersionGetResourceVersionResponse,
+      ResourceVersionGetResourceVersionError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}/versions/{rvid}",
       ...options,
-      url: "/ui/workflow_executions/{eid}",
     });
   }
 
   /**
-   * Delete a workflow execution
-   * Delete a specific workflow execution.
+   * Download folder structure of resource
+   * Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster.
    *
-   * Permission `workflow_execution:delete` required if the current user started the workflow execution,
-   * otherwise `workflow_execution:delete_any` required.
+   * Permission `resource:read` required.
    */
-  public static workflowExecutionDeleteWorkflowExecution<
+  public static resourceVersionResourceFileTree<
     ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowExecutionDeleteWorkflowExecutionData,
-      ThrowOnError
-    >,
-  ) {
-    return (options?.client ?? client).delete<
-      WorkflowExecutionDeleteWorkflowExecutionResponse,
-      WorkflowExecutionDeleteWorkflowExecutionError,
+  >(options: Options<ResourceVersionResourceFileTreeData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).get<
+      ResourceVersionResourceFileTreeResponse,
+      ResourceVersionResourceFileTreeError,
       ThrowOnError
     >({
+      responseTransformer: resourceVersionResourceFileTreeResponseTransformer,
+      url: "/ui/resources/{rid}/versions/{rvid}/tree",
       ...options,
-      url: "/ui/workflow_executions/{eid}",
     });
   }
 
   /**
-   * Get the parameters of a workflow execution
-   * Get the parameters of a specific workflow execution.
+   * Request resource version review
+   * Request the review of a resource version.
    *
-   * Permission `workflow_execution:read` required if the current user started the workflow execution,
-   * otherwise `workflow_execution:read_any` required.
+   * Permission `resource:update` required.
    */
-  public static workflowExecutionGetWorkflowExecutionParams<
+  public static resourceVersionRequestResourceVersionReview<
     ThrowOnError extends boolean = true,
   >(
-    options: OptionsLegacyParser<
-      WorkflowExecutionGetWorkflowExecutionParamsData,
+    options: Options<
+      ResourceVersionRequestResourceVersionReviewData,
       ThrowOnError
     >,
   ) {
-    return (options?.client ?? client).get<
-      WorkflowExecutionGetWorkflowExecutionParamsResponse,
-      WorkflowExecutionGetWorkflowExecutionParamsError,
+    return (options.client ?? _heyApiClient).put<
+      ResourceVersionRequestResourceVersionReviewResponse,
+      ResourceVersionRequestResourceVersionReviewError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}/versions/{rvid}/request_review",
       ...options,
-      url: "/ui/workflow_executions/{eid}/params",
     });
   }
 
   /**
-   * Cancel a workflow execution
-   * Cancel a running workflow execution.
+   * Request resource version synchronization
+   * Request the synchronization of a resource version to the cluster.
    *
-   * Permission `workflow_execution:cancel` required if the current user started the workflow execution,
-   * otherwise `workflow_execution:cancel_any` required.
+   * Permission `resource:request_sync` required.
    */
-  public static workflowExecutionCancelWorkflowExecution<
+  public static resourceVersionRequestResourceVersionSync<
     ThrowOnError extends boolean = true,
   >(
-    options: OptionsLegacyParser<
-      WorkflowExecutionCancelWorkflowExecutionData,
+    options: Options<
+      ResourceVersionRequestResourceVersionSyncData,
       ThrowOnError
     >,
   ) {
-    return (options?.client ?? client).post<
-      WorkflowExecutionCancelWorkflowExecutionResponse,
-      WorkflowExecutionCancelWorkflowExecutionError,
+    return (options.client ?? _heyApiClient).put<
+      ResourceVersionRequestResourceVersionSyncResponse,
+      ResourceVersionRequestResourceVersionSyncError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}/versions/{rvid}/request_sync",
       ...options,
-      url: "/ui/workflow_executions/{eid}/cancel",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
-}
 
-export class WorkflowModeService {
   /**
-   * Get workflow mode
-   * Get a workflow mode.
+   * Review resource version
+   * Review answer the resource version.
    *
-   * Permission `workflow:read` required
+   * Permission `resource:update_status` required.
    */
-  public static workflowModeGetWorkflowMode<
+  public static resourceVersionResourceVersionReview<
     ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<WorkflowModeGetWorkflowModeData, ThrowOnError>,
-  ) {
-    return (options?.client ?? client).get<
-      WorkflowModeGetWorkflowModeResponse,
-      WorkflowModeGetWorkflowModeError,
+  >(options: Options<ResourceVersionResourceVersionReviewData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).put<
+      ResourceVersionResourceVersionReviewResponse,
+      ResourceVersionResourceVersionReviewError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}/versions/{rvid}/review",
       ...options,
-      url: "/ui/workflow_modes/{mode_id}",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
-}
 
-export class WorkflowVersionService {
   /**
-   * Get all versions of a workflow
-   * List all versions of a Workflow.
+   * Synchronize resource version with cluster
+   * Synchronize the resource version to the cluster.
    *
-   * Permission `workflow:list` required.
+   * Permission `resource:update_any` required.
    */
-  public static workflowVersionListWorkflowVersion<
+  public static resourceVersionResourceVersionSync<
     ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowVersionListWorkflowVersionData,
-      ThrowOnError
-    >,
-  ) {
-    return (options?.client ?? client).get<
-      WorkflowVersionListWorkflowVersionResponse,
-      WorkflowVersionListWorkflowVersionError,
+  >(options: Options<ResourceVersionResourceVersionSyncData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).put<
+      ResourceVersionResourceVersionSyncResponse,
+      ResourceVersionResourceVersionSyncError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}/versions/{rvid}/sync",
       ...options,
-      url: "/ui/workflows/{wid}/versions",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * Get a workflow version
-   * Get a specific version of a workflow.
+   * Set resource version to latest
+   * Set the resource version as the latest version.
    *
-   * Permission `workflow:read` required if the version is public or you are the developer of the workflow,
-   * otherwise `workflow:read_any`
+   * Permission `resource:update_any` required.
    */
-  public static workflowVersionGetWorkflowVersion<
+  public static resourceVersionResourceVersionLatest<
     ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowVersionGetWorkflowVersionData,
-      ThrowOnError
-    >,
-  ) {
-    return (options?.client ?? client).get<
-      WorkflowVersionGetWorkflowVersionResponse,
-      WorkflowVersionGetWorkflowVersionError,
+  >(options: Options<ResourceVersionResourceVersionLatestData, ThrowOnError>) {
+    return (options.client ?? _heyApiClient).put<
+      ResourceVersionResourceVersionLatestResponse,
+      ResourceVersionResourceVersionLatestError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}/versions/{rvid}/latest",
       ...options,
-      url: "/ui/workflows/{wid}/versions/{git_commit_hash}",
     });
   }
 
   /**
-   * Update status of workflow version
-   * Update the status of a workflow version.
+   * Delete resource version on cluster
+   * Delete the resource version on the cluster.
    *
-   * Permission `workflow:update_status`
+   * Permission `resource:delete_any` required.
    */
-  public static workflowVersionUpdateWorkflowVersionStatus<
+  public static resourceVersionDeleteResourceVersionCluster<
     ThrowOnError extends boolean = true,
   >(
-    options: OptionsLegacyParser<
-      WorkflowVersionUpdateWorkflowVersionStatusData,
+    options: Options<
+      ResourceVersionDeleteResourceVersionClusterData,
       ThrowOnError
     >,
   ) {
-    return (options?.client ?? client).patch<
-      WorkflowVersionUpdateWorkflowVersionStatusResponse,
-      WorkflowVersionUpdateWorkflowVersionStatusError,
+    return (options.client ?? _heyApiClient).delete<
+      ResourceVersionDeleteResourceVersionClusterResponse,
+      ResourceVersionDeleteResourceVersionClusterError,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}/versions/{rvid}/cluster",
       ...options,
-      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/status",
     });
   }
 
   /**
-   * Get metadata of workflow version
-   * Get the metadata of a workflow version.
+   * Delete resource version in S3
+   * Delete the resource version in the S3 bucket.
    *
-   * Permission `workflow:read` required if the current user is the developer of the workflow,
-   * otherwise `workflow:read_any`
+   * Permission `resource:delete_any` required.
    */
-  public static workflowVersionGetWorkflowVersionMetadata<
+  public static resourceVersionDeleteResourceVersionS3<
     ThrowOnError extends boolean = true,
   >(
-    options: OptionsLegacyParser<
-      WorkflowVersionGetWorkflowVersionMetadataData,
-      ThrowOnError
-    >,
+    options: Options<ResourceVersionDeleteResourceVersionS3Data, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      WorkflowVersionGetWorkflowVersionMetadataResponse,
-      WorkflowVersionGetWorkflowVersionMetadataError,
+    return (options.client ?? _heyApiClient).delete<
+      ResourceVersionDeleteResourceVersionS3Response,
+      ResourceVersionDeleteResourceVersionS3Error,
       ThrowOnError
     >({
+      url: "/ui/resources/{rid}/versions/{rvid}/s3",
       ...options,
-      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/metadata",
     });
   }
+}
 
+export class NewsService {
   /**
-   * Update metadata of workflow version
-   * Update the metadata of a workflow version.
+   * List news
+   * List all news events with filters.
    *
-   * Permission `workflow:update` required if the current user is the developer of the workflow,
-   * otherwise `workflow:update_any`
+   * This endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header.
+   * A missing `Link` header indicates that you iterated over all news with the current filters.
+   *
+   * Permission `news:list` required.
    */
-  public static workflowVersionUpdateWorkflowVersionMetadata<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowVersionUpdateWorkflowVersionMetadataData,
-      ThrowOnError
-    >,
+  public static newsListNews<ThrowOnError extends boolean = true>(
+    options?: Options<NewsListNewsData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).put<
-      WorkflowVersionUpdateWorkflowVersionMetadataResponse,
-      WorkflowVersionUpdateWorkflowVersionMetadataError,
+    return (options?.client ?? _heyApiClient).get<
+      NewsListNewsResponse,
+      NewsListNewsError,
       ThrowOnError
     >({
+      url: "/ui/news",
       ...options,
-      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/metadata",
     });
   }
 
   /**
-   * Deprecate a workflow version
-   * Deprecate a workflow version.
+   * Create news
+   * Create a news event.
    *
-   * Permission `workflow:update` required if you are the developer of the workflow,
-   * otherwise `workflow:update_status`
+   * Permission `news:create` required.
    */
-  public static workflowVersionDeprecateWorkflowVersion<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowVersionDeprecateWorkflowVersionData,
-      ThrowOnError
-    >,
+  public static newsCreateNews<ThrowOnError extends boolean = true>(
+    options: Options<NewsCreateNewsData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).patch<
-      WorkflowVersionDeprecateWorkflowVersionResponse,
-      WorkflowVersionDeprecateWorkflowVersionError,
+    return (options.client ?? _heyApiClient).post<
+      NewsCreateNewsResponse,
+      NewsCreateNewsError,
       ThrowOnError
     >({
+      url: "/ui/news",
       ...options,
-      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate",
+      headers: {
+        "Content-Type": "application/json",
+        ...options?.headers,
+      },
     });
   }
 
   /**
-   * Update parameter extension of workflow version
-   * Update the parameter extension of a workflow version.
+   * Get latest news
+   * List the current news events.
    *
-   * Permission `workflow:update` required.
+   * Permission `news:list` required.
    */
-  public static workflowVersionUpdateWorkflowVersionParameterExtension<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowVersionUpdateWorkflowVersionParameterExtensionData,
-      ThrowOnError
-    >,
+  public static newsListLatestNews<ThrowOnError extends boolean = true>(
+    options?: Options<NewsListLatestNewsData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).patch<
-      WorkflowVersionUpdateWorkflowVersionParameterExtensionResponse,
-      WorkflowVersionUpdateWorkflowVersionParameterExtensionError,
+    return (options?.client ?? _heyApiClient).get<
+      NewsListLatestNewsResponse,
+      unknown,
       ThrowOnError
     >({
+      url: "/ui/news/latest",
       ...options,
-      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension",
     });
   }
 
   /**
-   * Fetch documentation for a workflow version
-   * Get the documentation for a specific workflow version.
-   * Streams the response directly from the right git repository.
+   * Delete a specific news
+   * Delete a specified news event.
    *
-   * Permission `workflow:read` required.
+   * Permission `news:delete` required.
    */
-  public static workflowVersionDownloadWorkflowDocumentation<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowVersionDownloadWorkflowDocumentationData,
-      ThrowOnError
-    >,
+  public static newsDeleteNews<ThrowOnError extends boolean = true>(
+    options: Options<NewsDeleteNewsData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).get<
-      WorkflowVersionDownloadWorkflowDocumentationResponse,
-      WorkflowVersionDownloadWorkflowDocumentationError,
+    return (options.client ?? _heyApiClient).delete<
+      NewsDeleteNewsResponse,
+      NewsDeleteNewsError,
       ThrowOnError
     >({
+      url: "/ui/news/{nid}",
       ...options,
-      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/documentation",
     });
   }
 
   /**
-   * Upload icon for workflow version
-   * Upload an icon for the workflow version and returns the new icon URL.
+   * Get a specific news
+   * Get a specified news event.
    *
-   * Permission `workflow:update` required.
+   * Permission `news:read` required.
    */
-  public static workflowVersionUploadWorkflowVersionIcon<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowVersionUploadWorkflowVersionIconData,
-      ThrowOnError
-    >,
+  public static newsGetNews<ThrowOnError extends boolean = true>(
+    options: Options<NewsGetNewsData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).post<
-      WorkflowVersionUploadWorkflowVersionIconResponse,
-      WorkflowVersionUploadWorkflowVersionIconError,
+    return (options.client ?? _heyApiClient).get<
+      NewsGetNewsResponse,
+      NewsGetNewsError,
       ThrowOnError
     >({
+      url: "/ui/news/{nid}",
       ...options,
-      ...formDataBodySerializer,
-      headers: {
-        "Content-Type": null,
-        ...options?.headers,
-      },
-      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/icon",
     });
   }
+}
 
+export class PublicService {
   /**
-   * Delete icon of workflow version
-   * Delete the icon of the workflow version.
-   *
-   * Permission `workflow:update` required.
+   * Get available workflows
+   * Public route to fetch all available workflows.
    */
-  public static workflowVersionDeleteWorkflowVersionIcon<
-    ThrowOnError extends boolean = true,
-  >(
-    options: OptionsLegacyParser<
-      WorkflowVersionDeleteWorkflowVersionIconData,
-      ThrowOnError
-    >,
+  public static publicGetPublicWorkflows<ThrowOnError extends boolean = true>(
+    options?: Options<PublicGetPublicWorkflowsData, ThrowOnError>,
   ) {
-    return (options?.client ?? client).delete<
-      WorkflowVersionDeleteWorkflowVersionIconResponse,
-      WorkflowVersionDeleteWorkflowVersionIconError,
+    return (options?.client ?? _heyApiClient).get<
+      PublicGetPublicWorkflowsResponse,
+      unknown,
       ThrowOnError
     >({
+      url: "/ui/public/workflows",
       ...options,
-      url: "/ui/workflows/{wid}/versions/{git_commit_hash}/icon",
     });
   }
 }
diff --git a/src/client/transformers.gen.ts b/src/client/transformers.gen.ts
new file mode 100644
index 0000000..a699533
--- /dev/null
+++ b/src/client/transformers.gen.ts
@@ -0,0 +1,21 @@
+// This file is auto-generated by @hey-api/openapi-ts
+
+import type { ResourceVersionResourceFileTreeResponse } from "./types.gen";
+
+const fileTreeSchemaResponseTransformer = (data: any) => {
+  if (data.contents) {
+    data.contents = data.contents.map((item: any) => {
+      return fileTreeSchemaResponseTransformer(item);
+    });
+  }
+  return data;
+};
+
+export const resourceVersionResourceFileTreeResponseTransformer = async (
+  data: any,
+): Promise<ResourceVersionResourceFileTreeResponse> => {
+  data = data.map((item: any) => {
+    return fileTreeSchemaResponseTransformer(item);
+  });
+  return data;
+};
diff --git a/src/client/types.gen.ts b/src/client/types.gen.ts
index 920f22a..a795751 100644
--- a/src/client/types.gen.ts
+++ b/src/client/types.gen.ts
@@ -116,14 +116,14 @@ export type ApiTokenPrivateOut = {
   token: string;
 };
 
-export type Body_Bucket_update_bucket_public_state = {
+export type BodyBucketUpdateBucketPublicState = {
   /**
    * New public state
    */
   public: boolean;
 };
 
-export type Body_Workflow_Version_upload_workflow_version_icon = {
+export type BodyWorkflowVersionUploadWorkflowVersionIcon = {
   /**
    * Icon for the Workflow.
    */
@@ -343,13 +343,7 @@ export type FileTree = {
   size: number;
 };
 
-export enum type {
-  FILE = "file",
-  DIRECTORY = "directory",
-  LINK = "link",
-}
-
-export type HTTPValidationError = {
+export type HttpValidationError = {
   detail?: Array<ValidationError>;
 };
 
@@ -361,7 +355,7 @@ export type IconUpdateOut = {
 };
 
 export type InstanceSpecificDefaultParameters = {
-  [key: string]: string | number | boolean;
+  [key: string]: string | number | number | boolean;
 };
 
 export type NewsIn = {
@@ -383,15 +377,6 @@ export type NewsIn = {
   category?: "workflow" | "resource" | "system";
 };
 
-/**
- * Category of the news event
- */
-export enum category {
-  WORKFLOW = "workflow",
-  RESOURCE = "resource",
-  SYSTEM = "system",
-}
-
 export type NewsOut = {
   /**
    * Content of the news. Can contain Markdown.
@@ -424,31 +409,36 @@ export type NewsOut = {
 };
 
 export enum NextflowVersion {
-  _22_10_0 = "22.10.0",
-  _22_10_1 = "22.10.1",
-  _22_10_2 = "22.10.2",
-  _22_10_3 = "22.10.3",
-  _22_10_4 = "22.10.4",
-  _22_10_5 = "22.10.5",
-  _22_10_6 = "22.10.6",
-  _22_10_7 = "22.10.7",
-  _22_10_8 = "22.10.8",
-  _23_04_0 = "23.04.0",
-  _23_04_1 = "23.04.1",
-  _23_04_2 = "23.04.2",
-  _23_04_3 = "23.04.3",
-  _23_04_4 = "23.04.4",
-  _23_04_5 = "23.04.5",
-  _23_10_0 = "23.10.0",
-  _23_10_1 = "23.10.1",
-  _23_10_2 = "23.10.2",
-  _23_10_3 = "23.10.3",
-  _23_10_4 = "23.10.4",
-  _24_04_1 = "24.04.1",
-  _24_04_2 = "24.04.2",
-  _24_04_3 = "24.04.3",
-  _24_04_4 = "24.04.4",
-  _24_10_0 = "24.10.0",
+  "22_10_0" = "22.10.0",
+  "22_10_1" = "22.10.1",
+  "22_10_2" = "22.10.2",
+  "22_10_3" = "22.10.3",
+  "22_10_4" = "22.10.4",
+  "22_10_5" = "22.10.5",
+  "22_10_6" = "22.10.6",
+  "22_10_7" = "22.10.7",
+  "22_10_8" = "22.10.8",
+  "23_04_0" = "23.04.0",
+  "23_04_1" = "23.04.1",
+  "23_04_2" = "23.04.2",
+  "23_04_3" = "23.04.3",
+  "23_04_4" = "23.04.4",
+  "23_04_5" = "23.04.5",
+  "23_10_0" = "23.10.0",
+  "23_10_1" = "23.10.1",
+  "23_10_2" = "23.10.2",
+  "23_10_3" = "23.10.3",
+  "23_10_4" = "23.10.4",
+  "24_04_1" = "24.04.1",
+  "24_04_2" = "24.04.2",
+  "24_04_3" = "24.04.3",
+  "24_04_4" = "24.04.4",
+  "24_10_0" = "24.10.0",
+}
+
+export enum OidcProvider {
+  LIFESCIENCE_AAI = "lifescience-aai",
+  NFDI_AAI = "nfdi-aai",
 }
 
 export type OwnershipTransferRequestIn = {
@@ -503,13 +493,13 @@ export enum OwnershipTypeEnum {
   RESOURCE = "resource",
 }
 
-export type ParameterExtension_Input = {
+export type ParameterExtensionInput = {
   /**
    * 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?: {
     [key: string]: {
-      [key: string]: string | number;
+      [key: string]: string | number | number;
     };
   };
   /**
@@ -519,13 +509,13 @@ export type ParameterExtension_Input = {
   parameter_visibility?: ParameterVisibilityMapping;
 };
 
-export type ParameterExtension_Output = {
+export type ParameterExtensionOutput = {
   /**
    * 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?: {
     [key: string]: {
-      [key: string]: string | number;
+      [key: string]: string | number | number;
     };
   };
   /**
@@ -591,7 +581,7 @@ export type PublicWorkflowOut = {
   /**
    * URL to the workflow icon
    */
-  readonly icon_url: string | null;
+  icon_url: string | null;
 };
 
 export type ResourceIn = {
@@ -777,9 +767,13 @@ export type UserOutExtended = {
    */
   uid: string;
   /**
-   * Lifesicence ID of the user
+   * Lifesicence AAI ID of the user
    */
   lifescience_id?: string | null;
+  /**
+   * NFDI AAI ID of the user
+   */
+  nfdi_id?: string | null;
   /**
    * Timestamp when the invitation token was created as UNIX timestamp
    */
@@ -1150,7 +1144,7 @@ export type WorkflowVersionOut = {
   /**
    * Parameter extension specific for this CloWM instance
    */
-  parameter_extension?: ParameterExtension_Output | null;
+  parameter_extension?: ParameterExtensionOutput | null;
   /**
    * The version of Nextflow this workflow version requires.
    */
@@ -1174,444 +1168,679 @@ export type WorkflowVersionStatusSchema = {
   status: WorkflowVersionStatus;
 };
 
-export type ApiTokenListTokenData = {
+export type AuthKickstartLoginData = {
+  body?: never;
+  path: {
+    /**
+     * The OIDC provider to use for login
+     */
+    provider: OidcProvider;
+  };
   query?: {
     /**
-     * UID of the user to filter for. Permission `api_token:list` required if current users is the target.
+     * Unique token to validate an invitation
      */
-    uid?: string | null;
+    invitation_token?: string | null;
+    /**
+     * Will be appended to redirect response in the callback route as URL query parameter `next`
+     */
+    next?: string | null;
   };
+  url: "/auth/login/{provider}";
 };
 
-export type ApiTokenListTokenResponse = Array<ApiTokenOut>;
+export type AuthKickstartLoginErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type ApiTokenListTokenError = HTTPValidationError;
+export type AuthKickstartLoginError =
+  AuthKickstartLoginErrors[keyof AuthKickstartLoginErrors];
 
-export type ApiTokenCreateTokenData = {
-  body: ApiTokenIn;
+export type AuthLoginCallbackData = {
+  body?: never;
+  path: {
+    provider: OidcProvider;
+  };
+  query?: never;
+  url: "/auth/login/callback/{provider}";
 };
 
-export type ApiTokenCreateTokenResponse = ApiTokenPrivateOut;
+export type AuthLoginCallbackErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type ApiTokenCreateTokenError = HTTPValidationError;
+export type AuthLoginCallbackError =
+  AuthLoginCallbackErrors[keyof AuthLoginCallbackErrors];
 
-export type ApiTokenGetTokenData = {
+export type AuthKickstartAccountConnectionData = {
+  body?: never;
   path: {
     /**
-     * ID of an API token
+     * The OIDC provider to use for login
      */
-    tid: string;
+    provider: OidcProvider;
   };
+  query?: never;
+  url: "/auth/account/connect/{provider}";
 };
 
-export type ApiTokenGetTokenResponse = ApiTokenOut;
+export type AuthKickstartAccountConnectionErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type ApiTokenGetTokenError = HTTPValidationError;
+export type AuthKickstartAccountConnectionError =
+  AuthKickstartAccountConnectionErrors[keyof AuthKickstartAccountConnectionErrors];
 
-export type ApiTokenDeleteTokenData = {
+export type AuthAccountConnectionCallbackData = {
+  body?: never;
   path: {
-    /**
-     * ID of an API token
-     */
-    tid: string;
+    provider: OidcProvider;
   };
+  query?: never;
+  url: "/auth/account/callback/{provider}";
+};
+
+export type AuthAccountConnectionCallbackErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
-export type ApiTokenDeleteTokenResponse = void;
+export type AuthAccountConnectionCallbackError =
+  AuthAccountConnectionCallbackErrors[keyof AuthAccountConnectionCallbackErrors];
 
-export type ApiTokenDeleteTokenError = HTTPValidationError;
+export type AuthLogoutData = {
+  body?: never;
+  path?: never;
+  query?: never;
+  url: "/auth/logout";
+};
 
-export type BucketListBucketsData = {
+export type ApiTokenListTokenData = {
+  body?: never;
+  path?: never;
   query?: {
     /**
-     * Type of the bucket to get. Ignored when `user` parameter not set
-     */
-    bucket_type?: BucketType;
-    /**
-     * UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target.
+     * UID of the user to filter for. Permission `api_token:list` required if current users is the target.
      */
-    owner_id?: string | null;
+    uid?: string | null;
   };
+  url: "/ui/tokens";
 };
 
-export type BucketListBucketsResponse = Array<BucketOut>;
+export type ApiTokenListTokenErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type BucketListBucketsError = HTTPValidationError;
+export type ApiTokenListTokenError =
+  ApiTokenListTokenErrors[keyof ApiTokenListTokenErrors];
 
-export type BucketCreateBucketData = {
-  body: BucketIn;
+export type ApiTokenListTokenResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<ApiTokenOut>;
 };
 
-export type BucketCreateBucketResponse = BucketOut;
+export type ApiTokenListTokenResponse =
+  ApiTokenListTokenResponses[keyof ApiTokenListTokenResponses];
 
-export type BucketCreateBucketError = HTTPValidationError;
+export type ApiTokenCreateTokenData = {
+  /**
+   * Meta-data for Api token to create
+   */
+  body: ApiTokenIn;
+  path?: never;
+  query?: never;
+  url: "/ui/tokens";
+};
 
-export type BucketListBucketOtrsData = {
-  query?: {
-    /**
-     * UID of user who is the current owner.
-     */
-    current_owner_id?: string | null;
-    /**
-     * UID of user who will be the new owner.
-     */
-    new_owner_id?: string | null;
-  };
+export type ApiTokenCreateTokenErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
-export type BucketListBucketOtrsResponse = Array<OwnershipTransferRequestOut>;
+export type ApiTokenCreateTokenError =
+  ApiTokenCreateTokenErrors[keyof ApiTokenCreateTokenErrors];
+
+export type ApiTokenCreateTokenResponses = {
+  /**
+   * Successful Response
+   */
+  201: ApiTokenPrivateOut;
+};
 
-export type BucketListBucketOtrsError = HTTPValidationError;
+export type ApiTokenCreateTokenResponse =
+  ApiTokenCreateTokenResponses[keyof ApiTokenCreateTokenResponses];
 
-export type BucketGetBucketData = {
+export type ApiTokenDeleteTokenData = {
+  body?: never;
   path: {
     /**
-     * Name of a bucket
+     * ID of an API token
      */
-    bucket_name: string;
+    tid: string;
   };
+  query?: never;
+  url: "/ui/tokens/{tid}";
 };
 
-export type BucketGetBucketResponse = BucketOut;
+export type ApiTokenDeleteTokenErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type BucketGetBucketError = HTTPValidationError;
+export type ApiTokenDeleteTokenError =
+  ApiTokenDeleteTokenErrors[keyof ApiTokenDeleteTokenErrors];
 
-export type BucketDeleteBucketData = {
+export type ApiTokenDeleteTokenResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
+};
+
+export type ApiTokenDeleteTokenResponse =
+  ApiTokenDeleteTokenResponses[keyof ApiTokenDeleteTokenResponses];
+
+export type ApiTokenGetTokenData = {
+  body?: never;
   path: {
     /**
-     * Name of a bucket
+     * ID of an API token
      */
-    bucket_name: string;
+    tid: string;
   };
+  query?: never;
+  url: "/ui/tokens/{tid}";
+};
+
+export type ApiTokenGetTokenErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type ApiTokenGetTokenError =
+  ApiTokenGetTokenErrors[keyof ApiTokenGetTokenErrors];
+
+export type ApiTokenGetTokenResponses = {
+  /**
+   * Successful Response
+   */
+  200: ApiTokenOut;
+};
+
+export type ApiTokenGetTokenResponse =
+  ApiTokenGetTokenResponses[keyof ApiTokenGetTokenResponses];
+
+export type UserListUsersData = {
+  body?: never;
+  path?: never;
   query?: {
     /**
-     * Delete even non-empty bucket
+     * Filter users by a substring in their name.
      */
-    force_delete?: boolean;
+    name_substring?: string | null;
+    /**
+     * Filter users by their role. If multiple are selected, they are concatenating by an OR Expression.
+     */
+    filter_roles?: Array<RoleEnum> | null;
   };
+  url: "/ui/users";
 };
 
-export type BucketDeleteBucketResponse = void;
+export type UserListUsersErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type BucketDeleteBucketError = HTTPValidationError;
+export type UserListUsersError = UserListUsersErrors[keyof UserListUsersErrors];
 
-export type BucketGetBucketOtrData = {
-  path: {
-    /**
-     * Name of a bucket
-     */
-    bucket_name: string;
-  };
+export type UserListUsersResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<UserOutExtended>;
 };
 
-export type BucketGetBucketOtrResponse = OwnershipTransferRequestOut;
+export type UserListUsersResponse =
+  UserListUsersResponses[keyof UserListUsersResponses];
 
-export type BucketGetBucketOtrError = HTTPValidationError;
+export type UserCreateUserData = {
+  /**
+   * Meta-data for user to create
+   */
+  body: UserIn;
+  path?: never;
+  query?: never;
+  url: "/ui/users";
+};
 
-export type BucketCreateBucketOtrData = {
-  body: OwnershipTransferRequestIn;
-  path: {
-    /**
-     * Name of a bucket
-     */
-    bucket_name: string;
-  };
+export type UserCreateUserErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
-export type BucketCreateBucketOtrResponse = OwnershipTransferRequestOut;
+export type UserCreateUserError =
+  UserCreateUserErrors[keyof UserCreateUserErrors];
+
+export type UserCreateUserResponses = {
+  /**
+   * Successful Response
+   */
+  201: UserOutExtended;
+};
 
-export type BucketCreateBucketOtrError = HTTPValidationError;
+export type UserCreateUserResponse =
+  UserCreateUserResponses[keyof UserCreateUserResponses];
 
-export type BucketAcceptBucketOtrData = {
-  path: {
+export type UserSearchUsersData = {
+  body?: never;
+  path?: never;
+  query: {
     /**
-     * Name of a bucket
+     * Filter users by a substring in their name.
      */
-    bucket_name: string;
+    name_substring: string;
   };
+  url: "/ui/users/search";
 };
 
-export type BucketAcceptBucketOtrResponse = BucketOut;
+export type UserSearchUsersErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type BucketAcceptBucketOtrError = HTTPValidationError;
+export type UserSearchUsersError =
+  UserSearchUsersErrors[keyof UserSearchUsersErrors];
 
-export type BucketDeleteBucketOtrData = {
-  path: {
-    /**
-     * Name of a bucket
-     */
-    bucket_name: string;
-  };
+export type UserSearchUsersResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<UserOut>;
 };
 
-export type BucketDeleteBucketOtrResponse = void;
+export type UserSearchUsersResponse =
+  UserSearchUsersResponses[keyof UserSearchUsersResponses];
 
-export type BucketDeleteBucketOtrError = HTTPValidationError;
+export type UserGetLoggedInUserData = {
+  body?: never;
+  path?: never;
+  query?: never;
+  url: "/ui/users/me";
+};
 
-export type BucketUpdateBucketPublicStateData = {
-  body: Body_Bucket_update_bucket_public_state;
+export type UserGetLoggedInUserResponses = {
+  /**
+   * Successful Response
+   */
+  200: UserOutExtended;
+};
+
+export type UserGetLoggedInUserResponse =
+  UserGetLoggedInUserResponses[keyof UserGetLoggedInUserResponses];
+
+export type UserDeleteUserData = {
+  body?: never;
   path: {
     /**
-     * Name of a bucket
+     * UID of a user
      */
-    bucket_name: string;
+    uid: string;
   };
+  query?: never;
+  url: "/ui/users/{uid}";
+};
+
+export type UserDeleteUserErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
-export type BucketUpdateBucketPublicStateResponse = BucketOut;
+export type UserDeleteUserError =
+  UserDeleteUserErrors[keyof UserDeleteUserErrors];
+
+export type UserDeleteUserResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
+};
 
-export type BucketUpdateBucketPublicStateError = HTTPValidationError;
+export type UserDeleteUserResponse =
+  UserDeleteUserResponses[keyof UserDeleteUserResponses];
 
-export type BucketUpdateBucketLimitsData = {
-  body: BucketSizeLimits;
+export type UserGetUserData = {
+  body?: never;
   path: {
     /**
-     * Name of a bucket
+     * UID of a user
      */
-    bucket_name: string;
+    uid: string;
   };
+  query?: never;
+  url: "/ui/users/{uid}";
 };
 
-export type BucketUpdateBucketLimitsResponse = BucketOut;
+export type UserGetUserErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type BucketUpdateBucketLimitsError = HTTPValidationError;
+export type UserGetUserError = UserGetUserErrors[keyof UserGetUserErrors];
 
-export type BucketPermissionListPermissionsData = {
-  query?: {
-    /**
-     * Scopes of Bucket Permissions to fetch
-     */
-    permission_scopes?: Array<"read" | "write"> | null;
+export type UserGetUserResponses = {
+  /**
+   * Successful Response
+   */
+  200: UserOut;
+};
+
+export type UserGetUserResponse =
+  UserGetUserResponses[keyof UserGetUserResponses];
+
+export type UserUpdateRolesData = {
+  /**
+   * The new roles of the user
+   */
+  body: UserRoles;
+  path: {
     /**
-     * Status of Bucket Permissions to fetch
+     * UID of a user
      */
-    permission_status?: PermissionStatus | null;
+    uid: string;
   };
+  query?: never;
+  url: "/ui/users/{uid}/roles";
 };
 
-export type BucketPermissionListPermissionsResponse =
-  Array<BucketPermissionOut>;
+export type UserUpdateRolesErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type BucketPermissionListPermissionsError = HTTPValidationError;
+export type UserUpdateRolesError =
+  UserUpdateRolesErrors[keyof UserUpdateRolesErrors];
 
-export type BucketPermissionCreatePermissionData = {
-  body: BucketPermissionIn;
+export type UserUpdateRolesResponses = {
+  /**
+   * Successful Response
+   */
+  200: UserOutExtended;
 };
 
-export type BucketPermissionCreatePermissionResponse = BucketPermissionOut;
-
-export type BucketPermissionCreatePermissionError = HTTPValidationError;
+export type UserUpdateRolesResponse =
+  UserUpdateRolesResponses[keyof UserUpdateRolesResponses];
 
-export type BucketPermissionListPermissionsPerUserData = {
+export type UserResendInvitationData = {
+  body?: never;
   path: {
     /**
      * UID of a user
      */
     uid: string;
   };
-  query?: {
-    /**
-     * Scopes of Bucket Permissions to fetch
-     */
-    permission_scopes?: Array<"read" | "write"> | null;
-    /**
-     * Status of Bucket Permissions to fetch
-     */
-    permission_status?: PermissionStatus | null;
-  };
+  query?: never;
+  url: "/ui/users/{uid}/invitation";
 };
 
-export type BucketPermissionListPermissionsPerUserResponse =
-  Array<BucketPermissionOut>;
+export type UserResendInvitationErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type BucketPermissionListPermissionsPerUserError = HTTPValidationError;
+export type UserResendInvitationError =
+  UserResendInvitationErrors[keyof UserResendInvitationErrors];
 
-export type BucketPermissionListPermissionsPerBucketData = {
-  path: {
-    /**
-     * Name of a bucket
-     */
-    bucket_name: string;
-  };
-  query?: {
-    /**
-     * Scopes of Bucket Permissions to fetch
-     */
-    permission_scopes?: Array<"read" | "write"> | null;
-    /**
-     * Status of Bucket Permissions to fetch
-     */
-    permission_status?: PermissionStatus | null;
-  };
+export type UserResendInvitationResponses = {
+  /**
+   * Successful Response
+   */
+  200: UserOutExtended;
 };
 
-export type BucketPermissionListPermissionsPerBucketResponse =
-  Array<BucketPermissionOut>;
-
-export type BucketPermissionListPermissionsPerBucketError = HTTPValidationError;
+export type UserResendInvitationResponse =
+  UserResendInvitationResponses[keyof UserResendInvitationResponses];
 
-export type BucketPermissionGetPermissionData = {
+export type S3KeyGetUserKeysData = {
+  body?: never;
   path: {
-    /**
-     * Name of a bucket
-     */
-    bucket_name: string;
     /**
      * UID of a user
      */
     uid: string;
   };
+  query?: never;
+  url: "/ui/users/{uid}/keys";
+};
+
+export type S3KeyGetUserKeysErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
-export type BucketPermissionGetPermissionResponse = BucketPermissionOut;
+export type S3KeyGetUserKeysError =
+  S3KeyGetUserKeysErrors[keyof S3KeyGetUserKeysErrors];
 
-export type BucketPermissionGetPermissionError = HTTPValidationError;
+export type S3KeyGetUserKeysResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<S3Key>;
+};
 
-export type BucketPermissionUpdatePermissionData = {
-  body: BucketPermissionParameters;
+export type S3KeyGetUserKeysResponse =
+  S3KeyGetUserKeysResponses[keyof S3KeyGetUserKeysResponses];
+
+export type S3KeyCreateUserKeyData = {
+  body?: never;
   path: {
-    /**
-     * Name of a bucket
-     */
-    bucket_name: string;
     /**
      * UID of a user
      */
     uid: string;
   };
+  query?: never;
+  url: "/ui/users/{uid}/keys";
+};
+
+export type S3KeyCreateUserKeyErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
-export type BucketPermissionUpdatePermissionResponse = BucketPermissionOut;
+export type S3KeyCreateUserKeyError =
+  S3KeyCreateUserKeyErrors[keyof S3KeyCreateUserKeyErrors];
+
+export type S3KeyCreateUserKeyResponses = {
+  /**
+   * Successful Response
+   */
+  201: S3Key;
+};
 
-export type BucketPermissionUpdatePermissionError = HTTPValidationError;
+export type S3KeyCreateUserKeyResponse =
+  S3KeyCreateUserKeyResponses[keyof S3KeyCreateUserKeyResponses];
 
-export type BucketPermissionDeletePermissionData = {
+export type S3KeyDeleteUserKeyData = {
+  body?: never;
   path: {
     /**
-     * Name of a bucket
+     * ID of the S3 access key
      */
-    bucket_name: string;
+    access_id: string;
     /**
      * UID of a user
      */
     uid: string;
   };
+  query?: never;
+  url: "/ui/users/{uid}/keys/{access_id}";
 };
 
-export type BucketPermissionDeletePermissionResponse = void;
+export type S3KeyDeleteUserKeyErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type BucketPermissionDeletePermissionError = HTTPValidationError;
+export type S3KeyDeleteUserKeyError =
+  S3KeyDeleteUserKeyErrors[keyof S3KeyDeleteUserKeyErrors];
 
-export type NewsCreateNewsData = {
-  body: NewsIn;
+export type S3KeyDeleteUserKeyResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
 };
 
-export type NewsCreateNewsResponse = NewsOut;
-
-export type NewsCreateNewsError = HTTPValidationError;
+export type S3KeyDeleteUserKeyResponse =
+  S3KeyDeleteUserKeyResponses[keyof S3KeyDeleteUserKeyResponses];
 
-export type NewsListNewsData = {
-  query?: {
-    /**
-     * Filter for news that are created after this UNIX timestamp
-     */
-    created_after?: number | null;
-    /**
-     * Filter for news created by a specific user
-     */
-    creator_id?: string | null;
-    /**
-     * Id of the item to start the query from. DO NOT SET MANUALLY.
-     */
-    id_after?: string | null;
+export type S3KeyGetUserKeyData = {
+  body?: never;
+  path: {
     /**
-     * Number of items to list per page
+     * ID of the S3 access key
      */
-    per_page?: number;
+    access_id: string;
     /**
-     * Sort order of items with creation time
+     * UID of a user
      */
-    sort?: "asc" | "desc";
+    uid: string;
   };
+  query?: never;
+  url: "/ui/users/{uid}/keys/{access_id}";
 };
 
-export type NewsListNewsResponse = Array<NewsOut>;
+export type S3KeyGetUserKeyErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type NewsListNewsError = HTTPValidationError;
+export type S3KeyGetUserKeyError =
+  S3KeyGetUserKeyErrors[keyof S3KeyGetUserKeyErrors];
 
-export type NewsListLatestNewsResponse = Array<NewsOut>;
+export type S3KeyGetUserKeyResponses = {
+  /**
+   * Successful Response
+   */
+  200: S3Key;
+};
 
-export type NewsListLatestNewsError = unknown;
+export type S3KeyGetUserKeyResponse =
+  S3KeyGetUserKeyResponses[keyof S3KeyGetUserKeyResponses];
 
-export type NewsGetNewsData = {
-  path: {
+export type BucketListBucketsData = {
+  body?: never;
+  path?: never;
+  query?: {
     /**
-     * ID of a news event
+     * UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target.
      */
-    nid: string;
-  };
-};
-
-export type NewsGetNewsResponse = NewsOut;
-
-export type NewsGetNewsError = HTTPValidationError;
-
-export type NewsDeleteNewsData = {
-  path: {
+    owner_id?: string | null;
     /**
-     * ID of a news event
+     * Type of the bucket to get. Ignored when `user` parameter not set
      */
-    nid: string;
+    bucket_type?: BucketType;
   };
+  url: "/ui/buckets";
 };
 
-export type NewsDeleteNewsResponse = void;
-
-export type NewsDeleteNewsError = HTTPValidationError;
-
-export type PublicGetPublicWorkflowsResponse = Array<PublicWorkflowOut>;
+export type BucketListBucketsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type PublicGetPublicWorkflowsError = unknown;
+export type BucketListBucketsError =
+  BucketListBucketsErrors[keyof BucketListBucketsErrors];
 
-export type ResourceCreateResourceData = {
-  body: ResourceIn;
+export type BucketListBucketsResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<BucketOut>;
 };
 
-export type ResourceCreateResourceResponse = ResourceOut;
+export type BucketListBucketsResponse =
+  BucketListBucketsResponses[keyof BucketListBucketsResponses];
 
-export type ResourceCreateResourceError = HTTPValidationError;
-
-export type ResourceListResourcesData = {
-  query?: {
-    /**
-     * Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`.
-     */
-    maintainer_id?: string | null;
-    /**
-     * Filter resources by a substring in their name.
-     */
-    name_substring?: string | null;
-    /**
-     * Filter resources to by the public flag
-     */
-    public?: boolean | null;
-    /**
-     * Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required.
-     */
-    version_status?: Array<ResourceVersionStatus> | null;
-  };
+export type BucketCreateBucketData = {
+  /**
+   * Meta-data for bucket to create
+   */
+  body: BucketIn;
+  path?: never;
+  query?: never;
+  url: "/ui/buckets";
 };
 
-export type ResourceListResourcesResponse = Array<ResourceOut>;
+export type BucketCreateBucketErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type ResourceListResourcesError = HTTPValidationError;
+export type BucketCreateBucketError =
+  BucketCreateBucketErrors[keyof BucketCreateBucketErrors];
 
-export type ResourceListSyncRequestsResponse =
-  Array<UserSynchronizationRequestOut>;
+export type BucketCreateBucketResponses = {
+  /**
+   * Successful Response
+   */
+  201: BucketOut;
+};
 
-export type ResourceListSyncRequestsError = unknown;
+export type BucketCreateBucketResponse =
+  BucketCreateBucketResponses[keyof BucketCreateBucketResponses];
 
-export type ResourceListResourceOtrsData = {
+export type BucketListBucketOtrsData = {
+  body?: never;
+  path?: never;
   query?: {
     /**
      * UID of user who is the current owner.
@@ -1622,466 +1851,628 @@ export type ResourceListResourceOtrsData = {
      */
     new_owner_id?: string | null;
   };
+  url: "/ui/buckets/ownership_transfer_request";
 };
 
-export type ResourceListResourceOtrsResponse =
-  Array<OwnershipTransferRequestOut>;
+export type BucketListBucketOtrsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type ResourceListResourceOtrsError = HTTPValidationError;
+export type BucketListBucketOtrsError =
+  BucketListBucketOtrsErrors[keyof BucketListBucketOtrsErrors];
 
-export type ResourceGetResourceData = {
+export type BucketListBucketOtrsResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<OwnershipTransferRequestOut>;
+};
+
+export type BucketListBucketOtrsResponse =
+  BucketListBucketOtrsResponses[keyof BucketListBucketOtrsResponses];
+
+export type BucketDeleteBucketData = {
+  body?: never;
   path: {
     /**
-     * ID of a resource
+     * Name of a bucket
      */
-    rid: string;
+    bucket_name: string;
   };
   query?: {
     /**
-     * Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.
+     * Delete even non-empty bucket
      */
-    version_status?: Array<ResourceVersionStatus> | null;
+    force_delete?: boolean;
   };
+  url: "/ui/buckets/{bucket_name}";
 };
 
-export type ResourceGetResourceResponse = ResourceOut;
+export type BucketDeleteBucketErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type ResourceGetResourceError = HTTPValidationError;
+export type BucketDeleteBucketError =
+  BucketDeleteBucketErrors[keyof BucketDeleteBucketErrors];
 
-export type ResourceDeleteResourceData = {
+export type BucketDeleteBucketResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
+};
+
+export type BucketDeleteBucketResponse =
+  BucketDeleteBucketResponses[keyof BucketDeleteBucketResponses];
+
+export type BucketGetBucketData = {
+  body?: never;
   path: {
     /**
-     * ID of a resource
+     * Name of a bucket
      */
-    rid: string;
+    bucket_name: string;
   };
+  query?: never;
+  url: "/ui/buckets/{bucket_name}";
 };
 
-export type ResourceDeleteResourceResponse = void;
+export type BucketGetBucketErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type ResourceDeleteResourceError = HTTPValidationError;
+export type BucketGetBucketError =
+  BucketGetBucketErrors[keyof BucketGetBucketErrors];
 
-export type ResourceGetResourceOtrData = {
+export type BucketGetBucketResponses = {
+  /**
+   * Successful Response
+   */
+  200: BucketOut;
+};
+
+export type BucketGetBucketResponse =
+  BucketGetBucketResponses[keyof BucketGetBucketResponses];
+
+export type BucketDeleteBucketOtrData = {
+  body?: never;
   path: {
     /**
-     * ID of a resource
+     * Name of a bucket
      */
-    rid: string;
+    bucket_name: string;
   };
+  query?: never;
+  url: "/ui/buckets/{bucket_name}/ownership_transfer_request";
+};
+
+export type BucketDeleteBucketOtrErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
-export type ResourceGetResourceOtrResponse = OwnershipTransferRequestOut;
+export type BucketDeleteBucketOtrError =
+  BucketDeleteBucketOtrErrors[keyof BucketDeleteBucketOtrErrors];
+
+export type BucketDeleteBucketOtrResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
+};
 
-export type ResourceGetResourceOtrError = HTTPValidationError;
+export type BucketDeleteBucketOtrResponse =
+  BucketDeleteBucketOtrResponses[keyof BucketDeleteBucketOtrResponses];
 
-export type ResourceCreateResourceOtrData = {
-  body: OwnershipTransferRequestIn;
+export type BucketGetBucketOtrData = {
+  body?: never;
   path: {
     /**
-     * ID of a resource
+     * Name of a bucket
      */
-    rid: string;
+    bucket_name: string;
   };
+  query?: never;
+  url: "/ui/buckets/{bucket_name}/ownership_transfer_request";
+};
+
+export type BucketGetBucketOtrErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
-export type ResourceCreateResourceOtrResponse = OwnershipTransferRequestOut;
+export type BucketGetBucketOtrError =
+  BucketGetBucketOtrErrors[keyof BucketGetBucketOtrErrors];
+
+export type BucketGetBucketOtrResponses = {
+  /**
+   * Successful Response
+   */
+  200: OwnershipTransferRequestOut;
+};
 
-export type ResourceCreateResourceOtrError = HTTPValidationError;
+export type BucketGetBucketOtrResponse =
+  BucketGetBucketOtrResponses[keyof BucketGetBucketOtrResponses];
 
-export type ResourceAcceptResourceOtrData = {
+export type BucketAcceptBucketOtrData = {
+  body?: never;
   path: {
     /**
-     * ID of a resource
+     * Name of a bucket
      */
-    rid: string;
+    bucket_name: string;
   };
+  query?: never;
+  url: "/ui/buckets/{bucket_name}/ownership_transfer_request";
 };
 
-export type ResourceAcceptResourceOtrResponse = ResourceOut;
+export type BucketAcceptBucketOtrErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type ResourceAcceptResourceOtrError = HTTPValidationError;
+export type BucketAcceptBucketOtrError =
+  BucketAcceptBucketOtrErrors[keyof BucketAcceptBucketOtrErrors];
 
-export type ResourceDeleteResourceOtrData = {
+export type BucketAcceptBucketOtrResponses = {
+  /**
+   * Successful Response
+   */
+  200: BucketOut;
+};
+
+export type BucketAcceptBucketOtrResponse =
+  BucketAcceptBucketOtrResponses[keyof BucketAcceptBucketOtrResponses];
+
+export type BucketCreateBucketOtrData = {
+  /**
+   * Meta-data for the bucket OTR to create
+   */
+  body: OwnershipTransferRequestIn;
   path: {
     /**
-     * ID of a resource
+     * Name of a bucket
      */
-    rid: string;
+    bucket_name: string;
   };
+  query?: never;
+  url: "/ui/buckets/{bucket_name}/ownership_transfer_request";
 };
 
-export type ResourceDeleteResourceOtrResponse = void;
+export type BucketCreateBucketOtrErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type ResourceDeleteResourceOtrError = HTTPValidationError;
+export type BucketCreateBucketOtrError =
+  BucketCreateBucketOtrErrors[keyof BucketCreateBucketOtrErrors];
 
-export type ResourceVersionListResourceVersionsData = {
+export type BucketCreateBucketOtrResponses = {
+  /**
+   * Successful Response
+   */
+  201: OwnershipTransferRequestOut;
+};
+
+export type BucketCreateBucketOtrResponse =
+  BucketCreateBucketOtrResponses[keyof BucketCreateBucketOtrResponses];
+
+export type BucketUpdateBucketPublicStateData = {
+  body: BodyBucketUpdateBucketPublicState;
   path: {
     /**
-     * ID of a resource
+     * Name of a bucket
      */
-    rid: string;
-  };
-  query?: {
-    /**
-     * Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.
-     */
-    version_status?: Array<ResourceVersionStatus> | null;
+    bucket_name: string;
   };
+  query?: never;
+  url: "/ui/buckets/{bucket_name}/public";
 };
 
-export type ResourceVersionListResourceVersionsResponse =
-  Array<ResourceVersionOut>;
+export type BucketUpdateBucketPublicStateErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type ResourceVersionListResourceVersionsError = HTTPValidationError;
+export type BucketUpdateBucketPublicStateError =
+  BucketUpdateBucketPublicStateErrors[keyof BucketUpdateBucketPublicStateErrors];
 
-export type ResourceVersionRequestResourceVersionData = {
-  body: ResourceVersionIn;
-  path: {
-    /**
-     * ID of a resource
-     */
-    rid: string;
-  };
+export type BucketUpdateBucketPublicStateResponses = {
+  /**
+   * Successful Response
+   */
+  200: BucketOut;
 };
 
-export type ResourceVersionRequestResourceVersionResponse = ResourceVersionOut;
+export type BucketUpdateBucketPublicStateResponse =
+  BucketUpdateBucketPublicStateResponses[keyof BucketUpdateBucketPublicStateResponses];
 
-export type ResourceVersionRequestResourceVersionError = HTTPValidationError;
-
-export type ResourceVersionGetResourceVersionData = {
+export type BucketUpdateBucketLimitsData = {
+  /**
+   * New size limits for bucket
+   */
+  body: BucketSizeLimits;
   path: {
     /**
-     * ID of a resource
-     */
-    rid: string;
-    /**
-     * ID of a resource version
+     * Name of a bucket
      */
-    rvid: string;
+    bucket_name: string;
   };
+  query?: never;
+  url: "/ui/buckets/{bucket_name}/limits";
 };
 
-export type ResourceVersionGetResourceVersionResponse = ResourceVersionOut;
+export type BucketUpdateBucketLimitsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type ResourceVersionGetResourceVersionError = HTTPValidationError;
+export type BucketUpdateBucketLimitsError =
+  BucketUpdateBucketLimitsErrors[keyof BucketUpdateBucketLimitsErrors];
 
-export type ResourceVersionResourceFileTreeData = {
-  path: {
-    /**
-     * ID of a resource
-     */
-    rid: string;
-    /**
-     * ID of a resource version
-     */
-    rvid: string;
-  };
+export type BucketUpdateBucketLimitsResponses = {
+  /**
+   * Successful Response
+   */
+  200: BucketOut;
 };
 
-export type ResourceVersionResourceFileTreeResponse = Array<FileTree>;
+export type BucketUpdateBucketLimitsResponse =
+  BucketUpdateBucketLimitsResponses[keyof BucketUpdateBucketLimitsResponses];
 
-export type ResourceVersionResourceFileTreeError = HTTPValidationError;
-
-export type ResourceVersionRequestResourceVersionReviewData = {
-  path: {
+export type BucketPermissionListPermissionsData = {
+  body?: never;
+  path?: never;
+  query?: {
     /**
-     * ID of a resource
+     * Scopes of Bucket Permissions to fetch
      */
-    rid: string;
+    permission_scopes?: Array<"read" | "write"> | null;
     /**
-     * ID of a resource version
+     * Status of Bucket Permissions to fetch
      */
-    rvid: string;
+    permission_status?: PermissionStatus | null;
   };
+  url: "/ui/permissions";
 };
 
-export type ResourceVersionRequestResourceVersionReviewResponse =
-  ResourceVersionOut;
+export type BucketPermissionListPermissionsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type ResourceVersionRequestResourceVersionReviewError =
-  HTTPValidationError;
+export type BucketPermissionListPermissionsError =
+  BucketPermissionListPermissionsErrors[keyof BucketPermissionListPermissionsErrors];
 
-export type ResourceVersionRequestResourceVersionSyncData = {
-  body: UserSynchronizationRequestIn;
-  path: {
-    /**
-     * ID of a resource
-     */
-    rid: string;
-    /**
-     * ID of a resource version
-     */
-    rvid: string;
-  };
+export type BucketPermissionListPermissionsResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<BucketPermissionOut>;
 };
 
-export type ResourceVersionRequestResourceVersionSyncResponse =
-  ResourceVersionOut;
+export type BucketPermissionListPermissionsResponse =
+  BucketPermissionListPermissionsResponses[keyof BucketPermissionListPermissionsResponses];
 
-export type ResourceVersionRequestResourceVersionSyncError =
-  HTTPValidationError;
+export type BucketPermissionCreatePermissionData = {
+  /**
+   * Permission to create
+   */
+  body: BucketPermissionIn;
+  path?: never;
+  query?: never;
+  url: "/ui/permissions";
+};
 
-export type ResourceVersionResourceVersionReviewData = {
-  body: UserRequestAnswer;
-  path: {
-    /**
-     * ID of a resource
-     */
-    rid: string;
-    /**
-     * ID of a resource version
-     */
-    rvid: string;
-  };
+export type BucketPermissionCreatePermissionErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
-export type ResourceVersionResourceVersionReviewResponse = ResourceVersionOut;
+export type BucketPermissionCreatePermissionError =
+  BucketPermissionCreatePermissionErrors[keyof BucketPermissionCreatePermissionErrors];
+
+export type BucketPermissionCreatePermissionResponses = {
+  /**
+   * Successful Response
+   */
+  201: BucketPermissionOut;
+};
 
-export type ResourceVersionResourceVersionReviewError = HTTPValidationError;
+export type BucketPermissionCreatePermissionResponse =
+  BucketPermissionCreatePermissionResponses[keyof BucketPermissionCreatePermissionResponses];
 
-export type ResourceVersionResourceVersionSyncData = {
-  body: UserRequestAnswer;
+export type BucketPermissionListPermissionsPerUserData = {
+  body?: never;
   path: {
     /**
-     * ID of a resource
-     */
-    rid: string;
-    /**
-     * ID of a resource version
+     * UID of a user
      */
-    rvid: string;
+    uid: string;
   };
-};
-
-export type ResourceVersionResourceVersionSyncResponse = ResourceVersionOut;
-
-export type ResourceVersionResourceVersionSyncError = HTTPValidationError;
-
-export type ResourceVersionResourceVersionLatestData = {
-  path: {
+  query?: {
     /**
-     * ID of a resource
+     * Scopes of Bucket Permissions to fetch
      */
-    rid: string;
+    permission_scopes?: Array<"read" | "write"> | null;
     /**
-     * ID of a resource version
+     * Status of Bucket Permissions to fetch
      */
-    rvid: string;
+    permission_status?: PermissionStatus | null;
   };
+  url: "/ui/permissions/user/{uid}";
 };
 
-export type ResourceVersionResourceVersionLatestResponse = ResourceVersionOut;
+export type BucketPermissionListPermissionsPerUserErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type ResourceVersionResourceVersionLatestError = HTTPValidationError;
+export type BucketPermissionListPermissionsPerUserError =
+  BucketPermissionListPermissionsPerUserErrors[keyof BucketPermissionListPermissionsPerUserErrors];
 
-export type ResourceVersionDeleteResourceVersionClusterData = {
-  path: {
-    /**
-     * ID of a resource
-     */
-    rid: string;
-    /**
-     * ID of a resource version
-     */
-    rvid: string;
-  };
+export type BucketPermissionListPermissionsPerUserResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<BucketPermissionOut>;
 };
 
-export type ResourceVersionDeleteResourceVersionClusterResponse =
-  ResourceVersionOut;
-
-export type ResourceVersionDeleteResourceVersionClusterError =
-  HTTPValidationError;
+export type BucketPermissionListPermissionsPerUserResponse =
+  BucketPermissionListPermissionsPerUserResponses[keyof BucketPermissionListPermissionsPerUserResponses];
 
-export type ResourceVersionDeleteResourceVersionS3Data = {
+export type BucketPermissionListPermissionsPerBucketData = {
+  body?: never;
   path: {
     /**
-     * ID of a resource
+     * Name of a bucket
      */
-    rid: string;
+    bucket_name: string;
+  };
+  query?: {
     /**
-     * ID of a resource version
+     * Scopes of Bucket Permissions to fetch
      */
-    rvid: string;
+    permission_scopes?: Array<"read" | "write"> | null;
+    /**
+     * Status of Bucket Permissions to fetch
+     */
+    permission_status?: PermissionStatus | null;
   };
+  url: "/ui/permissions/bucket/{bucket_name}";
 };
 
-export type ResourceVersionDeleteResourceVersionS3Response = ResourceVersionOut;
+export type BucketPermissionListPermissionsPerBucketErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type ResourceVersionDeleteResourceVersionS3Error = HTTPValidationError;
+export type BucketPermissionListPermissionsPerBucketError =
+  BucketPermissionListPermissionsPerBucketErrors[keyof BucketPermissionListPermissionsPerBucketErrors];
 
-export type S3KeyGetUserKeysData = {
-  path: {
-    /**
-     * UID of a user
-     */
-    uid: string;
-  };
+export type BucketPermissionListPermissionsPerBucketResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<BucketPermissionOut>;
 };
 
-export type S3KeyGetUserKeysResponse = Array<S3Key>;
-
-export type S3KeyGetUserKeysError = HTTPValidationError;
+export type BucketPermissionListPermissionsPerBucketResponse =
+  BucketPermissionListPermissionsPerBucketResponses[keyof BucketPermissionListPermissionsPerBucketResponses];
 
-export type S3KeyCreateUserKeyData = {
+export type BucketPermissionDeletePermissionData = {
+  body?: never;
   path: {
+    /**
+     * Name of a bucket
+     */
+    bucket_name: string;
     /**
      * UID of a user
      */
     uid: string;
   };
+  query?: never;
+  url: "/ui/permissions/bucket/{bucket_name}/user/{uid}";
 };
 
-export type S3KeyCreateUserKeyResponse = S3Key;
+export type BucketPermissionDeletePermissionErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type S3KeyCreateUserKeyError = HTTPValidationError;
+export type BucketPermissionDeletePermissionError =
+  BucketPermissionDeletePermissionErrors[keyof BucketPermissionDeletePermissionErrors];
 
-export type S3KeyGetUserKeyData = {
+export type BucketPermissionDeletePermissionResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
+};
+
+export type BucketPermissionDeletePermissionResponse =
+  BucketPermissionDeletePermissionResponses[keyof BucketPermissionDeletePermissionResponses];
+
+export type BucketPermissionGetPermissionData = {
+  body?: never;
   path: {
     /**
-     * ID of the S3 access key
+     * Name of a bucket
      */
-    access_id: string;
+    bucket_name: string;
     /**
      * UID of a user
      */
     uid: string;
   };
+  query?: never;
+  url: "/ui/permissions/bucket/{bucket_name}/user/{uid}";
+};
+
+export type BucketPermissionGetPermissionErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
-export type S3KeyGetUserKeyResponse = S3Key;
+export type BucketPermissionGetPermissionError =
+  BucketPermissionGetPermissionErrors[keyof BucketPermissionGetPermissionErrors];
+
+export type BucketPermissionGetPermissionResponses = {
+  /**
+   * Successful Response
+   */
+  200: BucketPermissionOut;
+};
 
-export type S3KeyGetUserKeyError = HTTPValidationError;
+export type BucketPermissionGetPermissionResponse =
+  BucketPermissionGetPermissionResponses[keyof BucketPermissionGetPermissionResponses];
 
-export type S3KeyDeleteUserKeyData = {
+export type BucketPermissionUpdatePermissionData = {
+  /**
+   * Permission to create
+   */
+  body: BucketPermissionParameters;
   path: {
     /**
-     * ID of the S3 access key
+     * Name of a bucket
      */
-    access_id: string;
+    bucket_name: string;
     /**
      * UID of a user
      */
     uid: string;
   };
+  query?: never;
+  url: "/ui/permissions/bucket/{bucket_name}/user/{uid}";
 };
 
-export type S3KeyDeleteUserKeyResponse = void;
+export type BucketPermissionUpdatePermissionErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type S3KeyDeleteUserKeyError = HTTPValidationError;
+export type BucketPermissionUpdatePermissionError =
+  BucketPermissionUpdatePermissionErrors[keyof BucketPermissionUpdatePermissionErrors];
 
-export type UserCreateUserData = {
-  body: UserIn;
+export type BucketPermissionUpdatePermissionResponses = {
+  /**
+   * Successful Response
+   */
+  200: BucketPermissionOut;
 };
 
-export type UserCreateUserResponse = UserOutExtended;
+export type BucketPermissionUpdatePermissionResponse =
+  BucketPermissionUpdatePermissionResponses[keyof BucketPermissionUpdatePermissionResponses];
 
-export type UserCreateUserError = HTTPValidationError;
-
-export type UserListUsersData = {
+export type WorkflowListWorkflowsData = {
+  body?: never;
+  path?: never;
   query?: {
     /**
-     * Filter users by their role. If multiple are selected, they are concatenating by an OR Expression.
+     * Filter workflows by a substring in their name.
      */
-    filter_roles?: Array<RoleEnum> | null;
+    name_substring?: string | null;
     /**
-     * Filter users by a substring in their name.
+     * Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`.
      */
-    name_substring?: string | null;
-  };
-};
-
-export type UserListUsersResponse = Array<UserOutExtended>;
-
-export type UserListUsersError = HTTPValidationError;
-
-export type UserSearchUsersData = {
-  query: {
+    version_status?: Array<WorkflowVersionStatus> | null;
     /**
-     * Filter users by a substring in their name.
+     * Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`.
      */
-    name_substring: string;
+    developer_id?: string | null;
   };
+  url: "/ui/workflows";
 };
 
-export type UserSearchUsersResponse = Array<UserOut>;
-
-export type UserSearchUsersError = HTTPValidationError;
+export type WorkflowListWorkflowsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type UserGetLoggedInUserResponse = UserOutExtended;
+export type WorkflowListWorkflowsError =
+  WorkflowListWorkflowsErrors[keyof WorkflowListWorkflowsErrors];
 
-export type UserGetLoggedInUserError = unknown;
-
-export type UserGetUserData = {
-  path: {
-    /**
-     * UID of a user
-     */
-    uid: string;
-  };
-};
-
-export type UserGetUserResponse = UserOut;
-
-export type UserGetUserError = HTTPValidationError;
-
-export type UserUpdateRolesData = {
-  body: UserRoles;
-  path: {
-    /**
-     * UID of a user
-     */
-    uid: string;
-  };
-};
-
-export type UserUpdateRolesResponse = UserOutExtended;
-
-export type UserUpdateRolesError = HTTPValidationError;
-
-export type UserResendInvitationData = {
-  path: {
-    /**
-     * UID of a user
-     */
-    uid: string;
-  };
+export type WorkflowListWorkflowsResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<WorkflowOut>;
 };
 
-export type UserResendInvitationResponse = UserOutExtended;
-
-export type UserResendInvitationError = HTTPValidationError;
+export type WorkflowListWorkflowsResponse =
+  WorkflowListWorkflowsResponses[keyof WorkflowListWorkflowsResponses];
 
 export type WorkflowCreateWorkflowData = {
+  /**
+   * Meta-date for the workflow to create
+   */
   body: WorkflowIn;
+  path?: never;
+  query?: never;
+  url: "/ui/workflows";
 };
 
-export type WorkflowCreateWorkflowResponse = WorkflowOut;
+export type WorkflowCreateWorkflowErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowCreateWorkflowError = HTTPValidationError;
+export type WorkflowCreateWorkflowError =
+  WorkflowCreateWorkflowErrors[keyof WorkflowCreateWorkflowErrors];
 
-export type WorkflowListWorkflowsData = {
-  query?: {
-    /**
-     * Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`.
-     */
-    developer_id?: string | null;
-    /**
-     * Filter workflows by a substring in their name.
-     */
-    name_substring?: string | null;
-    /**
-     * Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`.
-     */
-    version_status?: Array<WorkflowVersionStatus> | null;
-  };
+export type WorkflowCreateWorkflowResponses = {
+  /**
+   * Successful Response
+   */
+  201: WorkflowOut;
 };
 
-export type WorkflowListWorkflowsResponse = Array<WorkflowOut>;
-
-export type WorkflowListWorkflowsError = HTTPValidationError;
+export type WorkflowCreateWorkflowResponse =
+  WorkflowCreateWorkflowResponses[keyof WorkflowCreateWorkflowResponses];
 
 export type WorkflowListWorkflowOtrsData = {
+  body?: never;
+  path?: never;
   query?: {
     /**
      * UID of user who is the current owner.
@@ -2092,40 +2483,107 @@ export type WorkflowListWorkflowOtrsData = {
      */
     new_owner_id?: string | null;
   };
+  url: "/ui/workflows/ownership_transfer_request";
 };
 
-export type WorkflowListWorkflowOtrsResponse =
-  Array<OwnershipTransferRequestOut>;
+export type WorkflowListWorkflowOtrsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowListWorkflowOtrsError =
+  WorkflowListWorkflowOtrsErrors[keyof WorkflowListWorkflowOtrsErrors];
+
+export type WorkflowListWorkflowOtrsResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<OwnershipTransferRequestOut>;
+};
 
-export type WorkflowListWorkflowOtrsError = HTTPValidationError;
+export type WorkflowListWorkflowOtrsResponse =
+  WorkflowListWorkflowOtrsResponses[keyof WorkflowListWorkflowOtrsResponses];
 
 export type WorkflowGetDeveloperWorkflowStatisticsData = {
+  body?: never;
+  path?: never;
   query?: {
     /**
      * Filter by the developer of the workflows
      */
     developer_id?: string | null;
     /**
-     * Filter by workflow executions before this date
+     * Filter by workflow IDs
      */
-    end?: string | null;
+    workflow_id?: Array<string> | null;
     /**
      * Filter by workflow executions after this date
      */
     start?: string | null;
     /**
-     * Filter by workflow IDs
+     * Filter by workflow executions before this date
      */
-    workflow_id?: Array<string> | null;
+    end?: string | null;
   };
+  url: "/ui/workflows/developer_statistics";
+};
+
+export type WorkflowGetDeveloperWorkflowStatisticsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowGetDeveloperWorkflowStatisticsError =
+  WorkflowGetDeveloperWorkflowStatisticsErrors[keyof WorkflowGetDeveloperWorkflowStatisticsErrors];
+
+export type WorkflowGetDeveloperWorkflowStatisticsResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<AnonymizedWorkflowExecution>;
 };
 
 export type WorkflowGetDeveloperWorkflowStatisticsResponse =
-  Array<AnonymizedWorkflowExecution>;
+  WorkflowGetDeveloperWorkflowStatisticsResponses[keyof WorkflowGetDeveloperWorkflowStatisticsResponses];
+
+export type WorkflowDeleteWorkflowData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a workflow
+     */
+    wid: string;
+  };
+  query?: never;
+  url: "/ui/workflows/{wid}";
+};
+
+export type WorkflowDeleteWorkflowErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowDeleteWorkflowError =
+  WorkflowDeleteWorkflowErrors[keyof WorkflowDeleteWorkflowErrors];
+
+export type WorkflowDeleteWorkflowResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
+};
 
-export type WorkflowGetDeveloperWorkflowStatisticsError = HTTPValidationError;
+export type WorkflowDeleteWorkflowResponse =
+  WorkflowDeleteWorkflowResponses[keyof WorkflowDeleteWorkflowResponses];
 
 export type WorkflowGetWorkflowData = {
+  body?: never;
   path: {
     /**
      * ID of a workflow
@@ -2138,179 +2596,620 @@ export type WorkflowGetWorkflowData = {
      */
     version_status?: Array<WorkflowVersionStatus> | null;
   };
+  url: "/ui/workflows/{wid}";
+};
+
+export type WorkflowGetWorkflowErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
-export type WorkflowGetWorkflowResponse = WorkflowOut;
+export type WorkflowGetWorkflowError =
+  WorkflowGetWorkflowErrors[keyof WorkflowGetWorkflowErrors];
+
+export type WorkflowGetWorkflowResponses = {
+  /**
+   * Successful Response
+   */
+  200: WorkflowOut;
+};
 
-export type WorkflowGetWorkflowError = HTTPValidationError;
+export type WorkflowGetWorkflowResponse =
+  WorkflowGetWorkflowResponses[keyof WorkflowGetWorkflowResponses];
 
-export type WorkflowDeleteWorkflowData = {
+export type WorkflowDeleteWorkflowOtrData = {
+  body?: never;
   path: {
     /**
      * ID of a workflow
      */
     wid: string;
   };
+  query?: never;
+  url: "/ui/workflows/{wid}/ownership_transfer_request";
 };
 
-export type WorkflowDeleteWorkflowResponse = void;
+export type WorkflowDeleteWorkflowOtrErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowDeleteWorkflowOtrError =
+  WorkflowDeleteWorkflowOtrErrors[keyof WorkflowDeleteWorkflowOtrErrors];
+
+export type WorkflowDeleteWorkflowOtrResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
+};
 
-export type WorkflowDeleteWorkflowError = HTTPValidationError;
+export type WorkflowDeleteWorkflowOtrResponse =
+  WorkflowDeleteWorkflowOtrResponses[keyof WorkflowDeleteWorkflowOtrResponses];
 
 export type WorkflowGetWorkflowOtrData = {
+  body?: never;
   path: {
     /**
      * ID of a workflow
      */
     wid: string;
   };
+  query?: never;
+  url: "/ui/workflows/{wid}/ownership_transfer_request";
 };
 
-export type WorkflowGetWorkflowOtrResponse = OwnershipTransferRequestOut;
+export type WorkflowGetWorkflowOtrErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowGetWorkflowOtrError = HTTPValidationError;
+export type WorkflowGetWorkflowOtrError =
+  WorkflowGetWorkflowOtrErrors[keyof WorkflowGetWorkflowOtrErrors];
 
-export type WorkflowCreateWorkflowOtrData = {
-  body: OwnershipTransferRequestIn;
+export type WorkflowGetWorkflowOtrResponses = {
+  /**
+   * Successful Response
+   */
+  200: OwnershipTransferRequestOut;
+};
+
+export type WorkflowGetWorkflowOtrResponse =
+  WorkflowGetWorkflowOtrResponses[keyof WorkflowGetWorkflowOtrResponses];
+
+export type WorkflowAcceptWorkflowOtrData = {
+  body?: never;
   path: {
     /**
      * ID of a workflow
      */
     wid: string;
   };
+  query?: never;
+  url: "/ui/workflows/{wid}/ownership_transfer_request";
 };
 
-export type WorkflowCreateWorkflowOtrResponse = OwnershipTransferRequestOut;
+export type WorkflowAcceptWorkflowOtrErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowCreateWorkflowOtrError = HTTPValidationError;
+export type WorkflowAcceptWorkflowOtrError =
+  WorkflowAcceptWorkflowOtrErrors[keyof WorkflowAcceptWorkflowOtrErrors];
 
-export type WorkflowAcceptWorkflowOtrData = {
+export type WorkflowAcceptWorkflowOtrResponses = {
+  /**
+   * Successful Response
+   */
+  200: WorkflowOut;
+};
+
+export type WorkflowAcceptWorkflowOtrResponse =
+  WorkflowAcceptWorkflowOtrResponses[keyof WorkflowAcceptWorkflowOtrResponses];
+
+export type WorkflowCreateWorkflowOtrData = {
+  /**
+   * Meta-data for workflow OTR to create
+   */
+  body: OwnershipTransferRequestIn;
   path: {
     /**
      * ID of a workflow
      */
     wid: string;
   };
+  query?: never;
+  url: "/ui/workflows/{wid}/ownership_transfer_request";
 };
 
-export type WorkflowAcceptWorkflowOtrResponse = WorkflowOut;
+export type WorkflowCreateWorkflowOtrErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowAcceptWorkflowOtrError = HTTPValidationError;
+export type WorkflowCreateWorkflowOtrError =
+  WorkflowCreateWorkflowOtrErrors[keyof WorkflowCreateWorkflowOtrErrors];
 
-export type WorkflowDeleteWorkflowOtrData = {
+export type WorkflowCreateWorkflowOtrResponses = {
+  /**
+   * Successful Response
+   */
+  201: OwnershipTransferRequestOut;
+};
+
+export type WorkflowCreateWorkflowOtrResponse =
+  WorkflowCreateWorkflowOtrResponses[keyof WorkflowCreateWorkflowOtrResponses];
+
+export type WorkflowGetWorkflowStatisticsData = {
+  body?: never;
   path: {
     /**
      * ID of a workflow
      */
     wid: string;
   };
+  query?: never;
+  url: "/ui/workflows/{wid}/statistics";
 };
 
-export type WorkflowDeleteWorkflowOtrResponse = void;
+export type WorkflowGetWorkflowStatisticsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowDeleteWorkflowOtrError = HTTPValidationError;
+export type WorkflowGetWorkflowStatisticsError =
+  WorkflowGetWorkflowStatisticsErrors[keyof WorkflowGetWorkflowStatisticsErrors];
 
-export type WorkflowGetWorkflowStatisticsData = {
+export type WorkflowGetWorkflowStatisticsResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<WorkflowStatistic>;
+};
+
+export type WorkflowGetWorkflowStatisticsResponse =
+  WorkflowGetWorkflowStatisticsResponses[keyof WorkflowGetWorkflowStatisticsResponses];
+
+export type WorkflowUpdateWorkflowData = {
+  /**
+   * Meta-data for the workflow version to create
+   */
+  body: WorkflowUpdate;
   path: {
     /**
      * ID of a workflow
      */
     wid: string;
   };
+  query?: never;
+  url: "/ui/workflows/{wid}/update";
+};
+
+export type WorkflowUpdateWorkflowErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
-export type WorkflowGetWorkflowStatisticsResponse = Array<WorkflowStatistic>;
+export type WorkflowUpdateWorkflowError =
+  WorkflowUpdateWorkflowErrors[keyof WorkflowUpdateWorkflowErrors];
 
-export type WorkflowGetWorkflowStatisticsError = HTTPValidationError;
+export type WorkflowUpdateWorkflowResponses = {
+  /**
+   * Successful Response
+   */
+  201: WorkflowVersionOut;
+};
 
-export type WorkflowUpdateWorkflowData = {
-  body: WorkflowUpdate;
+export type WorkflowUpdateWorkflowResponse =
+  WorkflowUpdateWorkflowResponses[keyof WorkflowUpdateWorkflowResponses];
+
+export type WorkflowVersionListWorkflowVersionData = {
+  body?: never;
   path: {
     /**
      * ID of a workflow
      */
     wid: string;
   };
+  query?: {
+    /**
+     * Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`
+     */
+    version_status?: Array<WorkflowVersionStatus> | null;
+  };
+  url: "/ui/workflows/{wid}/versions";
 };
 
-export type WorkflowUpdateWorkflowResponse = WorkflowVersionOut;
+export type WorkflowVersionListWorkflowVersionErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowUpdateWorkflowError = HTTPValidationError;
+export type WorkflowVersionListWorkflowVersionError =
+  WorkflowVersionListWorkflowVersionErrors[keyof WorkflowVersionListWorkflowVersionErrors];
 
-export type WorkflowCredentialsGetWorkflowCredentialsData = {
+export type WorkflowVersionListWorkflowVersionResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<WorkflowVersionOut>;
+};
+
+export type WorkflowVersionListWorkflowVersionResponse =
+  WorkflowVersionListWorkflowVersionResponses[keyof WorkflowVersionListWorkflowVersionResponses];
+
+export type WorkflowVersionGetWorkflowVersionData = {
+  body?: never;
   path: {
+    /**
+     * Git commit `git_commit_hash` of specific version or `latest`.
+     */
+    git_commit_hash: string;
     /**
      * ID of a workflow
      */
     wid: string;
   };
+  query?: never;
+  url: "/ui/workflows/{wid}/versions/{git_commit_hash}";
 };
 
-export type WorkflowCredentialsGetWorkflowCredentialsResponse =
-  WorkflowCredentialsOut;
+export type WorkflowVersionGetWorkflowVersionErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowCredentialsGetWorkflowCredentialsError =
-  HTTPValidationError;
+export type WorkflowVersionGetWorkflowVersionError =
+  WorkflowVersionGetWorkflowVersionErrors[keyof WorkflowVersionGetWorkflowVersionErrors];
 
-export type WorkflowCredentialsUpdateWorkflowCredentialsData = {
-  body: WorkflowCredentialsIn;
+export type WorkflowVersionGetWorkflowVersionResponses = {
+  /**
+   * Successful Response
+   */
+  200: WorkflowVersionOut;
+};
+
+export type WorkflowVersionGetWorkflowVersionResponse =
+  WorkflowVersionGetWorkflowVersionResponses[keyof WorkflowVersionGetWorkflowVersionResponses];
+
+export type WorkflowVersionUpdateWorkflowVersionStatusData = {
+  /**
+   * New Status of the workflow version
+   */
+  body: WorkflowVersionStatusSchema;
   path: {
     /**
      * ID of a workflow
      */
     wid: string;
+    /**
+     * Git commit git_commit_hash of specific version.
+     */
+    git_commit_hash: string;
   };
+  query?: never;
+  url: "/ui/workflows/{wid}/versions/{git_commit_hash}/status";
 };
 
-export type WorkflowCredentialsUpdateWorkflowCredentialsResponse = unknown;
+export type WorkflowVersionUpdateWorkflowVersionStatusErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowCredentialsUpdateWorkflowCredentialsError =
-  HTTPValidationError;
+export type WorkflowVersionUpdateWorkflowVersionStatusError =
+  WorkflowVersionUpdateWorkflowVersionStatusErrors[keyof WorkflowVersionUpdateWorkflowVersionStatusErrors];
 
-export type WorkflowCredentialsDeleteWorkflowCredentialsData = {
+export type WorkflowVersionUpdateWorkflowVersionStatusResponses = {
+  /**
+   * Successful Response
+   */
+  200: WorkflowVersionOut;
+};
+
+export type WorkflowVersionUpdateWorkflowVersionStatusResponse =
+  WorkflowVersionUpdateWorkflowVersionStatusResponses[keyof WorkflowVersionUpdateWorkflowVersionStatusResponses];
+
+export type WorkflowVersionGetWorkflowVersionMetadataData = {
+  body?: never;
   path: {
     /**
      * ID of a workflow
      */
     wid: string;
+    /**
+     * Git commit git_commit_hash of specific version.
+     */
+    git_commit_hash: string;
   };
+  query?: never;
+  url: "/ui/workflows/{wid}/versions/{git_commit_hash}/metadata";
 };
 
-export type WorkflowCredentialsDeleteWorkflowCredentialsResponse = void;
+export type WorkflowVersionGetWorkflowVersionMetadataErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowCredentialsDeleteWorkflowCredentialsError =
-  HTTPValidationError;
+export type WorkflowVersionGetWorkflowVersionMetadataError =
+  WorkflowVersionGetWorkflowVersionMetadataErrors[keyof WorkflowVersionGetWorkflowVersionMetadataErrors];
 
-export type WorkflowExecutionStartWorkflowData = {
-  body: WorkflowExecutionIn;
+export type WorkflowVersionGetWorkflowVersionMetadataResponses = {
+  /**
+   * Successful Response
+   */
+  200: WorkflowVersionMetadataOut;
 };
 
-export type WorkflowExecutionStartWorkflowResponse = WorkflowExecutionOut;
-
-export type WorkflowExecutionStartWorkflowError = HTTPValidationError;
+export type WorkflowVersionGetWorkflowVersionMetadataResponse =
+  WorkflowVersionGetWorkflowVersionMetadataResponses[keyof WorkflowVersionGetWorkflowVersionMetadataResponses];
 
-export type WorkflowExecutionListWorkflowExecutionsData = {
-  query?: {
+export type WorkflowVersionUpdateWorkflowVersionMetadataData = {
+  body: WorkflowVersionMetadataIn;
+  path: {
     /**
-     * Filter for status of workflow execution
+     * ID of a workflow
      */
-    execution_status?: Array<WorkflowExecutionStatus> | null;
+    wid: string;
+    /**
+     * Git commit git_commit_hash of specific version.
+     */
+    git_commit_hash: string;
+  };
+  query?: never;
+  url: "/ui/workflows/{wid}/versions/{git_commit_hash}/metadata";
+};
+
+export type WorkflowVersionUpdateWorkflowVersionMetadataErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowVersionUpdateWorkflowVersionMetadataError =
+  WorkflowVersionUpdateWorkflowVersionMetadataErrors[keyof WorkflowVersionUpdateWorkflowVersionMetadataErrors];
+
+export type WorkflowVersionUpdateWorkflowVersionMetadataResponses = {
+  /**
+   * Successful Response
+   */
+  200: WorkflowVersionMetadataOut;
+};
+
+export type WorkflowVersionUpdateWorkflowVersionMetadataResponse =
+  WorkflowVersionUpdateWorkflowVersionMetadataResponses[keyof WorkflowVersionUpdateWorkflowVersionMetadataResponses];
+
+export type WorkflowVersionDeprecateWorkflowVersionData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a workflow
+     */
+    wid: string;
+    /**
+     * Git commit git_commit_hash of specific version.
+     */
+    git_commit_hash: string;
+  };
+  query?: never;
+  url: "/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate";
+};
+
+export type WorkflowVersionDeprecateWorkflowVersionErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowVersionDeprecateWorkflowVersionError =
+  WorkflowVersionDeprecateWorkflowVersionErrors[keyof WorkflowVersionDeprecateWorkflowVersionErrors];
+
+export type WorkflowVersionDeprecateWorkflowVersionResponses = {
+  /**
+   * Successful Response
+   */
+  200: WorkflowVersionOut;
+};
+
+export type WorkflowVersionDeprecateWorkflowVersionResponse =
+  WorkflowVersionDeprecateWorkflowVersionResponses[keyof WorkflowVersionDeprecateWorkflowVersionResponses];
+
+export type WorkflowVersionUpdateWorkflowVersionParameterExtensionData = {
+  /**
+   * Parameter extension specific for this CloWM instance
+   */
+  body: ParameterExtensionInput;
+  path: {
+    /**
+     * ID of a workflow
+     */
+    wid: string;
+    /**
+     * Git commit git_commit_hash of specific version.
+     */
+    git_commit_hash: string;
+  };
+  query?: never;
+  url: "/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension";
+};
+
+export type WorkflowVersionUpdateWorkflowVersionParameterExtensionErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowVersionUpdateWorkflowVersionParameterExtensionError =
+  WorkflowVersionUpdateWorkflowVersionParameterExtensionErrors[keyof WorkflowVersionUpdateWorkflowVersionParameterExtensionErrors];
+
+export type WorkflowVersionUpdateWorkflowVersionParameterExtensionResponses = {
+  /**
+   * Successful Response
+   */
+  200: WorkflowVersionOut;
+};
+
+export type WorkflowVersionUpdateWorkflowVersionParameterExtensionResponse =
+  WorkflowVersionUpdateWorkflowVersionParameterExtensionResponses[keyof WorkflowVersionUpdateWorkflowVersionParameterExtensionResponses];
+
+export type WorkflowVersionDownloadWorkflowDocumentationData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a workflow
+     */
+    wid: string;
+    /**
+     * Git commit git_commit_hash of specific version.
+     */
+    git_commit_hash: string;
+  };
+  query?: {
+    /**
+     * Specify which type of documentation the client wants to fetch
+     */
+    document?: DocumentationEnum;
+    /**
+     * Workflow Mode
+     */
+    mode_id?: string | null;
+  };
+  url: "/ui/workflows/{wid}/versions/{git_commit_hash}/documentation";
+};
+
+export type WorkflowVersionDownloadWorkflowDocumentationErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowVersionDownloadWorkflowDocumentationError =
+  WorkflowVersionDownloadWorkflowDocumentationErrors[keyof WorkflowVersionDownloadWorkflowDocumentationErrors];
+
+export type WorkflowVersionDownloadWorkflowDocumentationResponses = {
+  /**
+   * Successful Response
+   */
+  200: unknown;
+};
+
+export type WorkflowVersionDeleteWorkflowVersionIconData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a workflow
+     */
+    wid: string;
+    /**
+     * Git commit git_commit_hash of specific version.
+     */
+    git_commit_hash: string;
+  };
+  query?: never;
+  url: "/ui/workflows/{wid}/versions/{git_commit_hash}/icon";
+};
+
+export type WorkflowVersionDeleteWorkflowVersionIconErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowVersionDeleteWorkflowVersionIconError =
+  WorkflowVersionDeleteWorkflowVersionIconErrors[keyof WorkflowVersionDeleteWorkflowVersionIconErrors];
+
+export type WorkflowVersionDeleteWorkflowVersionIconResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
+};
+
+export type WorkflowVersionDeleteWorkflowVersionIconResponse =
+  WorkflowVersionDeleteWorkflowVersionIconResponses[keyof WorkflowVersionDeleteWorkflowVersionIconResponses];
+
+export type WorkflowVersionUploadWorkflowVersionIconData = {
+  body: BodyWorkflowVersionUploadWorkflowVersionIcon;
+  path: {
+    /**
+     * ID of a workflow
+     */
+    wid: string;
+    /**
+     * Git commit git_commit_hash of specific version.
+     */
+    git_commit_hash: string;
+  };
+  query?: never;
+  url: "/ui/workflows/{wid}/versions/{git_commit_hash}/icon";
+};
+
+export type WorkflowVersionUploadWorkflowVersionIconErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowVersionUploadWorkflowVersionIconError =
+  WorkflowVersionUploadWorkflowVersionIconErrors[keyof WorkflowVersionUploadWorkflowVersionIconErrors];
+
+export type WorkflowVersionUploadWorkflowVersionIconResponses = {
+  /**
+   * Successful Response
+   */
+  201: IconUpdateOut;
+};
+
+export type WorkflowVersionUploadWorkflowVersionIconResponse =
+  WorkflowVersionUploadWorkflowVersionIconResponses[keyof WorkflowVersionUploadWorkflowVersionIconResponses];
+
+export type WorkflowExecutionListWorkflowExecutionsData = {
+  body?: never;
+  path?: never;
+  query?: {
     /**
      * Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required.
      */
     executor_id?: string | null;
     /**
-     * Id of the item to start the query from. DO NOT SET MANUALLY.
+     * Filter for status of workflow execution
      */
-    id_after?: string | null;
+    execution_status?: Array<WorkflowExecutionStatus> | null;
     /**
-     * Number of items to list per page
+     * Filter for workflow version
      */
-    per_page?: number;
+    workflow_version_id?: string | null;
     /**
-     * Sort order of items with creation time
+     * Filter for workflow
      */
-    sort?: "asc" | "desc";
+    workflow_id?: string | null;
     /**
      * Filter for workflow executions that started after this UNIX timestamp
      */
@@ -2320,340 +3219,1265 @@ export type WorkflowExecutionListWorkflowExecutionsData = {
      */
     start_before?: number | null;
     /**
-     * Filter for workflow
+     * Id of the item to start the query from. DO NOT SET MANUALLY.
      */
-    workflow_id?: string | null;
+    id_after?: string | null;
     /**
-     * Filter for workflow version
+     * Number of items to list per page
      */
-    workflow_version_id?: string | null;
+    per_page?: number;
+    /**
+     * Sort order of items with creation time
+     */
+    sort?: "asc" | "desc";
   };
+  url: "/ui/workflow_executions";
+};
+
+export type WorkflowExecutionListWorkflowExecutionsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowExecutionListWorkflowExecutionsError =
+  WorkflowExecutionListWorkflowExecutionsErrors[keyof WorkflowExecutionListWorkflowExecutionsErrors];
+
+export type WorkflowExecutionListWorkflowExecutionsResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<WorkflowExecutionOut>;
 };
 
 export type WorkflowExecutionListWorkflowExecutionsResponse =
-  Array<WorkflowExecutionOut>;
+  WorkflowExecutionListWorkflowExecutionsResponses[keyof WorkflowExecutionListWorkflowExecutionsResponses];
+
+export type WorkflowExecutionStartWorkflowData = {
+  /**
+   * Meta-data and parameters for the workflow to start
+   */
+  body: WorkflowExecutionIn;
+  path?: never;
+  query?: never;
+  url: "/ui/workflow_executions";
+};
+
+export type WorkflowExecutionStartWorkflowErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowExecutionStartWorkflowError =
+  WorkflowExecutionStartWorkflowErrors[keyof WorkflowExecutionStartWorkflowErrors];
+
+export type WorkflowExecutionStartWorkflowResponses = {
+  /**
+   * Successful Response
+   */
+  201: WorkflowExecutionOut;
+};
 
-export type WorkflowExecutionListWorkflowExecutionsError = HTTPValidationError;
+export type WorkflowExecutionStartWorkflowResponse =
+  WorkflowExecutionStartWorkflowResponses[keyof WorkflowExecutionStartWorkflowResponses];
 
 export type WorkflowExecutionStartArbitraryWorkflowData = {
+  /**
+   * Meta-data and parameters for the workflow to start
+   */
   body: DevWorkflowExecutionIn;
+  path?: never;
+  query?: never;
+  url: "/ui/workflow_executions/arbitrary";
 };
 
-export type WorkflowExecutionStartArbitraryWorkflowResponse =
-  WorkflowExecutionOut;
+export type WorkflowExecutionStartArbitraryWorkflowErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowExecutionStartArbitraryWorkflowError = HTTPValidationError;
+export type WorkflowExecutionStartArbitraryWorkflowError =
+  WorkflowExecutionStartArbitraryWorkflowErrors[keyof WorkflowExecutionStartArbitraryWorkflowErrors];
 
-export type WorkflowExecutionGetWorkflowExecutionData = {
+export type WorkflowExecutionStartArbitraryWorkflowResponses = {
+  /**
+   * Successful Response
+   */
+  201: WorkflowExecutionOut;
+};
+
+export type WorkflowExecutionStartArbitraryWorkflowResponse =
+  WorkflowExecutionStartArbitraryWorkflowResponses[keyof WorkflowExecutionStartArbitraryWorkflowResponses];
+
+export type WorkflowExecutionDeleteWorkflowExecutionData = {
+  body?: never;
   path: {
     /**
      * ID of a workflow execution.
      */
     eid: string;
   };
+  query?: never;
+  url: "/ui/workflow_executions/{eid}";
 };
 
-export type WorkflowExecutionGetWorkflowExecutionResponse =
-  WorkflowExecutionOut;
+export type WorkflowExecutionDeleteWorkflowExecutionErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowExecutionGetWorkflowExecutionError = HTTPValidationError;
+export type WorkflowExecutionDeleteWorkflowExecutionError =
+  WorkflowExecutionDeleteWorkflowExecutionErrors[keyof WorkflowExecutionDeleteWorkflowExecutionErrors];
 
-export type WorkflowExecutionDeleteWorkflowExecutionData = {
+export type WorkflowExecutionDeleteWorkflowExecutionResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
+};
+
+export type WorkflowExecutionDeleteWorkflowExecutionResponse =
+  WorkflowExecutionDeleteWorkflowExecutionResponses[keyof WorkflowExecutionDeleteWorkflowExecutionResponses];
+
+export type WorkflowExecutionGetWorkflowExecutionData = {
+  body?: never;
   path: {
     /**
      * ID of a workflow execution.
      */
     eid: string;
   };
+  query?: never;
+  url: "/ui/workflow_executions/{eid}";
+};
+
+export type WorkflowExecutionGetWorkflowExecutionErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
-export type WorkflowExecutionDeleteWorkflowExecutionResponse = void;
+export type WorkflowExecutionGetWorkflowExecutionError =
+  WorkflowExecutionGetWorkflowExecutionErrors[keyof WorkflowExecutionGetWorkflowExecutionErrors];
+
+export type WorkflowExecutionGetWorkflowExecutionResponses = {
+  /**
+   * Successful Response
+   */
+  200: WorkflowExecutionOut;
+};
 
-export type WorkflowExecutionDeleteWorkflowExecutionError = HTTPValidationError;
+export type WorkflowExecutionGetWorkflowExecutionResponse =
+  WorkflowExecutionGetWorkflowExecutionResponses[keyof WorkflowExecutionGetWorkflowExecutionResponses];
 
 export type WorkflowExecutionGetWorkflowExecutionParamsData = {
+  body?: never;
   path: {
     /**
      * ID of a workflow execution.
      */
     eid: string;
   };
+  query?: never;
+  url: "/ui/workflow_executions/{eid}/params";
 };
 
-export type WorkflowExecutionGetWorkflowExecutionParamsResponse = {
-  [key: string]: unknown;
+export type WorkflowExecutionGetWorkflowExecutionParamsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
 export type WorkflowExecutionGetWorkflowExecutionParamsError =
-  HTTPValidationError;
+  WorkflowExecutionGetWorkflowExecutionParamsErrors[keyof WorkflowExecutionGetWorkflowExecutionParamsErrors];
+
+export type WorkflowExecutionGetWorkflowExecutionParamsResponses = {
+  /**
+   * Successful Response
+   */
+  200: {
+    [key: string]: unknown;
+  };
+};
+
+export type WorkflowExecutionGetWorkflowExecutionParamsResponse =
+  WorkflowExecutionGetWorkflowExecutionParamsResponses[keyof WorkflowExecutionGetWorkflowExecutionParamsResponses];
 
 export type WorkflowExecutionCancelWorkflowExecutionData = {
+  body?: never;
   path: {
     /**
      * ID of a workflow execution.
      */
     eid: string;
   };
+  query?: never;
+  url: "/ui/workflow_executions/{eid}/cancel";
 };
 
-export type WorkflowExecutionCancelWorkflowExecutionResponse = void;
+export type WorkflowExecutionCancelWorkflowExecutionErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowExecutionCancelWorkflowExecutionError = HTTPValidationError;
+export type WorkflowExecutionCancelWorkflowExecutionError =
+  WorkflowExecutionCancelWorkflowExecutionErrors[keyof WorkflowExecutionCancelWorkflowExecutionErrors];
 
-export type WorkflowModeGetWorkflowModeData = {
-  path: {
-    /**
-     * ID of a workflow mode
-     */
-    mode_id: string;
-  };
+export type WorkflowExecutionCancelWorkflowExecutionResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
 };
 
-export type WorkflowModeGetWorkflowModeResponse = WorkflowModeOut;
-
-export type WorkflowModeGetWorkflowModeError = HTTPValidationError;
+export type WorkflowExecutionCancelWorkflowExecutionResponse =
+  WorkflowExecutionCancelWorkflowExecutionResponses[keyof WorkflowExecutionCancelWorkflowExecutionResponses];
 
-export type WorkflowVersionListWorkflowVersionData = {
+export type WorkflowCredentialsDeleteWorkflowCredentialsData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a workflow
+     */
+    wid: string;
+  };
+  query?: never;
+  url: "/ui/workflows/{wid}/credentials";
+};
+
+export type WorkflowCredentialsDeleteWorkflowCredentialsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowCredentialsDeleteWorkflowCredentialsError =
+  WorkflowCredentialsDeleteWorkflowCredentialsErrors[keyof WorkflowCredentialsDeleteWorkflowCredentialsErrors];
+
+export type WorkflowCredentialsDeleteWorkflowCredentialsResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
+};
+
+export type WorkflowCredentialsDeleteWorkflowCredentialsResponse =
+  WorkflowCredentialsDeleteWorkflowCredentialsResponses[keyof WorkflowCredentialsDeleteWorkflowCredentialsResponses];
+
+export type WorkflowCredentialsGetWorkflowCredentialsData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a workflow
+     */
+    wid: string;
+  };
+  query?: never;
+  url: "/ui/workflows/{wid}/credentials";
+};
+
+export type WorkflowCredentialsGetWorkflowCredentialsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowCredentialsGetWorkflowCredentialsError =
+  WorkflowCredentialsGetWorkflowCredentialsErrors[keyof WorkflowCredentialsGetWorkflowCredentialsErrors];
+
+export type WorkflowCredentialsGetWorkflowCredentialsResponses = {
+  /**
+   * Successful Response
+   */
+  200: WorkflowCredentialsOut;
+};
+
+export type WorkflowCredentialsGetWorkflowCredentialsResponse =
+  WorkflowCredentialsGetWorkflowCredentialsResponses[keyof WorkflowCredentialsGetWorkflowCredentialsResponses];
+
+export type WorkflowCredentialsUpdateWorkflowCredentialsData = {
+  /**
+   * Updated credentials for the workflow git repository
+   */
+  body: WorkflowCredentialsIn;
+  path: {
+    /**
+     * ID of a workflow
+     */
+    wid: string;
+  };
+  query?: never;
+  url: "/ui/workflows/{wid}/credentials";
+};
+
+export type WorkflowCredentialsUpdateWorkflowCredentialsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowCredentialsUpdateWorkflowCredentialsError =
+  WorkflowCredentialsUpdateWorkflowCredentialsErrors[keyof WorkflowCredentialsUpdateWorkflowCredentialsErrors];
+
+export type WorkflowCredentialsUpdateWorkflowCredentialsResponses = {
+  /**
+   * Successful Response
+   */
+  200: unknown;
+};
+
+export type WorkflowModeGetWorkflowModeData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a workflow mode
+     */
+    mode_id: string;
+  };
+  query?: never;
+  url: "/ui/workflow_modes/{mode_id}";
+};
+
+export type WorkflowModeGetWorkflowModeErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type WorkflowModeGetWorkflowModeError =
+  WorkflowModeGetWorkflowModeErrors[keyof WorkflowModeGetWorkflowModeErrors];
+
+export type WorkflowModeGetWorkflowModeResponses = {
+  /**
+   * Successful Response
+   */
+  200: WorkflowModeOut;
+};
+
+export type WorkflowModeGetWorkflowModeResponse =
+  WorkflowModeGetWorkflowModeResponses[keyof WorkflowModeGetWorkflowModeResponses];
+
+export type ResourceListResourcesData = {
+  body?: never;
+  path?: never;
+  query?: {
+    /**
+     * Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`.
+     */
+    maintainer_id?: string | null;
+    /**
+     * Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required.
+     */
+    version_status?: Array<ResourceVersionStatus> | null;
+    /**
+     * Filter resources by a substring in their name.
+     */
+    name_substring?: string | null;
+    /**
+     * Filter resources to by the public flag
+     */
+    public?: boolean | null;
+  };
+  url: "/ui/resources";
+};
+
+export type ResourceListResourcesErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type ResourceListResourcesError =
+  ResourceListResourcesErrors[keyof ResourceListResourcesErrors];
+
+export type ResourceListResourcesResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<ResourceOut>;
+};
+
+export type ResourceListResourcesResponse =
+  ResourceListResourcesResponses[keyof ResourceListResourcesResponses];
+
+export type ResourceCreateResourceData = {
+  /**
+   * Meta-data for the resource to request
+   */
+  body: ResourceIn;
+  path?: never;
+  query?: never;
+  url: "/ui/resources";
+};
+
+export type ResourceCreateResourceErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type ResourceCreateResourceError =
+  ResourceCreateResourceErrors[keyof ResourceCreateResourceErrors];
+
+export type ResourceCreateResourceResponses = {
+  /**
+   * Successful Response
+   */
+  201: ResourceOut;
+};
+
+export type ResourceCreateResourceResponse =
+  ResourceCreateResourceResponses[keyof ResourceCreateResourceResponses];
+
+export type ResourceListSyncRequestsData = {
+  body?: never;
+  path?: never;
+  query?: never;
+  url: "/ui/resources/sync_requests";
+};
+
+export type ResourceListSyncRequestsResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<UserSynchronizationRequestOut>;
+};
+
+export type ResourceListSyncRequestsResponse =
+  ResourceListSyncRequestsResponses[keyof ResourceListSyncRequestsResponses];
+
+export type ResourceListResourceOtrsData = {
+  body?: never;
+  path?: never;
+  query?: {
+    /**
+     * UID of user who is the current owner.
+     */
+    current_owner_id?: string | null;
+    /**
+     * UID of user who will be the new owner.
+     */
+    new_owner_id?: string | null;
+  };
+  url: "/ui/resources/ownership_transfer_request";
+};
+
+export type ResourceListResourceOtrsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type ResourceListResourceOtrsError =
+  ResourceListResourceOtrsErrors[keyof ResourceListResourceOtrsErrors];
+
+export type ResourceListResourceOtrsResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<OwnershipTransferRequestOut>;
+};
+
+export type ResourceListResourceOtrsResponse =
+  ResourceListResourceOtrsResponses[keyof ResourceListResourceOtrsResponses];
+
+export type ResourceDeleteResourceData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a resource
+     */
+    rid: string;
+  };
+  query?: never;
+  url: "/ui/resources/{rid}";
+};
+
+export type ResourceDeleteResourceErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type ResourceDeleteResourceError =
+  ResourceDeleteResourceErrors[keyof ResourceDeleteResourceErrors];
+
+export type ResourceDeleteResourceResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
+};
+
+export type ResourceDeleteResourceResponse =
+  ResourceDeleteResourceResponses[keyof ResourceDeleteResourceResponses];
+
+export type ResourceGetResourceData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a resource
+     */
+    rid: string;
+  };
+  query?: {
+    /**
+     * Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.
+     */
+    version_status?: Array<ResourceVersionStatus> | null;
+  };
+  url: "/ui/resources/{rid}";
+};
+
+export type ResourceGetResourceErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type ResourceGetResourceError =
+  ResourceGetResourceErrors[keyof ResourceGetResourceErrors];
+
+export type ResourceGetResourceResponses = {
+  /**
+   * Successful Response
+   */
+  200: ResourceOut;
+};
+
+export type ResourceGetResourceResponse =
+  ResourceGetResourceResponses[keyof ResourceGetResourceResponses];
+
+export type ResourceDeleteResourceOtrData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a resource
+     */
+    rid: string;
+  };
+  query?: never;
+  url: "/ui/resources/{rid}/ownership_transfer_request";
+};
+
+export type ResourceDeleteResourceOtrErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type ResourceDeleteResourceOtrError =
+  ResourceDeleteResourceOtrErrors[keyof ResourceDeleteResourceOtrErrors];
+
+export type ResourceDeleteResourceOtrResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
+};
+
+export type ResourceDeleteResourceOtrResponse =
+  ResourceDeleteResourceOtrResponses[keyof ResourceDeleteResourceOtrResponses];
+
+export type ResourceGetResourceOtrData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a resource
+     */
+    rid: string;
+  };
+  query?: never;
+  url: "/ui/resources/{rid}/ownership_transfer_request";
+};
+
+export type ResourceGetResourceOtrErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type ResourceGetResourceOtrError =
+  ResourceGetResourceOtrErrors[keyof ResourceGetResourceOtrErrors];
+
+export type ResourceGetResourceOtrResponses = {
+  /**
+   * Successful Response
+   */
+  200: OwnershipTransferRequestOut;
+};
+
+export type ResourceGetResourceOtrResponse =
+  ResourceGetResourceOtrResponses[keyof ResourceGetResourceOtrResponses];
+
+export type ResourceAcceptResourceOtrData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a resource
+     */
+    rid: string;
+  };
+  query?: never;
+  url: "/ui/resources/{rid}/ownership_transfer_request";
+};
+
+export type ResourceAcceptResourceOtrErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type ResourceAcceptResourceOtrError =
+  ResourceAcceptResourceOtrErrors[keyof ResourceAcceptResourceOtrErrors];
+
+export type ResourceAcceptResourceOtrResponses = {
+  /**
+   * Successful Response
+   */
+  200: ResourceOut;
+};
+
+export type ResourceAcceptResourceOtrResponse =
+  ResourceAcceptResourceOtrResponses[keyof ResourceAcceptResourceOtrResponses];
+
+export type ResourceCreateResourceOtrData = {
+  /**
+   * Meta-data for the resource OTR to create
+   */
+  body: OwnershipTransferRequestIn;
+  path: {
+    /**
+     * ID of a resource
+     */
+    rid: string;
+  };
+  query?: never;
+  url: "/ui/resources/{rid}/ownership_transfer_request";
+};
+
+export type ResourceCreateResourceOtrErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type ResourceCreateResourceOtrError =
+  ResourceCreateResourceOtrErrors[keyof ResourceCreateResourceOtrErrors];
+
+export type ResourceCreateResourceOtrResponses = {
+  /**
+   * Successful Response
+   */
+  201: OwnershipTransferRequestOut;
+};
+
+export type ResourceCreateResourceOtrResponse =
+  ResourceCreateResourceOtrResponses[keyof ResourceCreateResourceOtrResponses];
+
+export type ResourceVersionListResourceVersionsData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a resource
+     */
+    rid: string;
+  };
+  query?: {
+    /**
+     * Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.
+     */
+    version_status?: Array<ResourceVersionStatus> | null;
+  };
+  url: "/ui/resources/{rid}/versions";
+};
+
+export type ResourceVersionListResourceVersionsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type ResourceVersionListResourceVersionsError =
+  ResourceVersionListResourceVersionsErrors[keyof ResourceVersionListResourceVersionsErrors];
+
+export type ResourceVersionListResourceVersionsResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<ResourceVersionOut>;
+};
+
+export type ResourceVersionListResourceVersionsResponse =
+  ResourceVersionListResourceVersionsResponses[keyof ResourceVersionListResourceVersionsResponses];
+
+export type ResourceVersionRequestResourceVersionData = {
+  /**
+   * Meta-data for the resource version to request
+   */
+  body: ResourceVersionIn;
+  path: {
+    /**
+     * ID of a resource
+     */
+    rid: string;
+  };
+  query?: never;
+  url: "/ui/resources/{rid}/versions";
+};
+
+export type ResourceVersionRequestResourceVersionErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type ResourceVersionRequestResourceVersionError =
+  ResourceVersionRequestResourceVersionErrors[keyof ResourceVersionRequestResourceVersionErrors];
+
+export type ResourceVersionRequestResourceVersionResponses = {
+  /**
+   * Successful Response
+   */
+  201: ResourceVersionOut;
+};
+
+export type ResourceVersionRequestResourceVersionResponse =
+  ResourceVersionRequestResourceVersionResponses[keyof ResourceVersionRequestResourceVersionResponses];
+
+export type ResourceVersionGetResourceVersionData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a resource
+     */
+    rid: string;
+    /**
+     * ID of a resource version
+     */
+    rvid: string;
+  };
+  query?: never;
+  url: "/ui/resources/{rid}/versions/{rvid}";
+};
+
+export type ResourceVersionGetResourceVersionErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type ResourceVersionGetResourceVersionError =
+  ResourceVersionGetResourceVersionErrors[keyof ResourceVersionGetResourceVersionErrors];
+
+export type ResourceVersionGetResourceVersionResponses = {
+  /**
+   * Successful Response
+   */
+  200: ResourceVersionOut;
+};
+
+export type ResourceVersionGetResourceVersionResponse =
+  ResourceVersionGetResourceVersionResponses[keyof ResourceVersionGetResourceVersionResponses];
+
+export type ResourceVersionResourceFileTreeData = {
+  body?: never;
+  path: {
+    /**
+     * ID of a resource version
+     */
+    rvid: string;
+    /**
+     * ID of a resource
+     */
+    rid: string;
+  };
+  query?: never;
+  url: "/ui/resources/{rid}/versions/{rvid}/tree";
+};
+
+export type ResourceVersionResourceFileTreeErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type ResourceVersionResourceFileTreeError =
+  ResourceVersionResourceFileTreeErrors[keyof ResourceVersionResourceFileTreeErrors];
+
+export type ResourceVersionResourceFileTreeResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<FileTree>;
+};
+
+export type ResourceVersionResourceFileTreeResponse =
+  ResourceVersionResourceFileTreeResponses[keyof ResourceVersionResourceFileTreeResponses];
+
+export type ResourceVersionRequestResourceVersionReviewData = {
+  body?: never;
   path: {
     /**
-     * ID of a workflow
+     * ID of a resource
      */
-    wid: string;
-  };
-  query?: {
+    rid: string;
     /**
-     * Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`
+     * ID of a resource version
      */
-    version_status?: Array<WorkflowVersionStatus> | null;
+    rvid: string;
   };
+  query?: never;
+  url: "/ui/resources/{rid}/versions/{rvid}/request_review";
 };
 
-export type WorkflowVersionListWorkflowVersionResponse =
-  Array<WorkflowVersionOut>;
+export type ResourceVersionRequestResourceVersionReviewErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowVersionListWorkflowVersionError = HTTPValidationError;
+export type ResourceVersionRequestResourceVersionReviewError =
+  ResourceVersionRequestResourceVersionReviewErrors[keyof ResourceVersionRequestResourceVersionReviewErrors];
 
-export type WorkflowVersionGetWorkflowVersionData = {
+export type ResourceVersionRequestResourceVersionReviewResponses = {
+  /**
+   * Successful Response
+   */
+  200: ResourceVersionOut;
+};
+
+export type ResourceVersionRequestResourceVersionReviewResponse =
+  ResourceVersionRequestResourceVersionReviewResponses[keyof ResourceVersionRequestResourceVersionReviewResponses];
+
+export type ResourceVersionRequestResourceVersionSyncData = {
+  /**
+   * Meta-data for the synchronization request
+   */
+  body: UserSynchronizationRequestIn;
   path: {
     /**
-     * Git commit `git_commit_hash` of specific version or `latest`.
+     * ID of a resource
      */
-    git_commit_hash: string;
+    rid: string;
     /**
-     * ID of a workflow
+     * ID of a resource version
      */
-    wid: string;
+    rvid: string;
   };
+  query?: never;
+  url: "/ui/resources/{rid}/versions/{rvid}/request_sync";
 };
 
-export type WorkflowVersionGetWorkflowVersionResponse = WorkflowVersionOut;
+export type ResourceVersionRequestResourceVersionSyncErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowVersionGetWorkflowVersionError = HTTPValidationError;
+export type ResourceVersionRequestResourceVersionSyncError =
+  ResourceVersionRequestResourceVersionSyncErrors[keyof ResourceVersionRequestResourceVersionSyncErrors];
 
-export type WorkflowVersionUpdateWorkflowVersionStatusData = {
-  body: WorkflowVersionStatusSchema;
+export type ResourceVersionRequestResourceVersionSyncResponses = {
+  /**
+   * Successful Response
+   */
+  200: ResourceVersionOut;
+};
+
+export type ResourceVersionRequestResourceVersionSyncResponse =
+  ResourceVersionRequestResourceVersionSyncResponses[keyof ResourceVersionRequestResourceVersionSyncResponses];
+
+export type ResourceVersionResourceVersionReviewData = {
+  /**
+   * Answer for the resource version review
+   */
+  body: UserRequestAnswer;
   path: {
     /**
-     * Git commit git_commit_hash of specific version.
+     * ID of a resource
      */
-    git_commit_hash: string;
+    rid: string;
     /**
-     * ID of a workflow
+     * ID of a resource version
      */
-    wid: string;
+    rvid: string;
   };
+  query?: never;
+  url: "/ui/resources/{rid}/versions/{rvid}/review";
 };
 
-export type WorkflowVersionUpdateWorkflowVersionStatusResponse =
-  WorkflowVersionOut;
+export type ResourceVersionResourceVersionReviewErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowVersionUpdateWorkflowVersionStatusError =
-  HTTPValidationError;
+export type ResourceVersionResourceVersionReviewError =
+  ResourceVersionResourceVersionReviewErrors[keyof ResourceVersionResourceVersionReviewErrors];
 
-export type WorkflowVersionGetWorkflowVersionMetadataData = {
+export type ResourceVersionResourceVersionReviewResponses = {
+  /**
+   * Successful Response
+   */
+  200: ResourceVersionOut;
+};
+
+export type ResourceVersionResourceVersionReviewResponse =
+  ResourceVersionResourceVersionReviewResponses[keyof ResourceVersionResourceVersionReviewResponses];
+
+export type ResourceVersionResourceVersionSyncData = {
+  /**
+   * Answer to the resource version synchronization request
+   */
+  body: UserRequestAnswer;
   path: {
     /**
-     * Git commit git_commit_hash of specific version.
+     * ID of a resource
      */
-    git_commit_hash: string;
+    rid: string;
     /**
-     * ID of a workflow
+     * ID of a resource version
      */
-    wid: string;
+    rvid: string;
   };
+  query?: never;
+  url: "/ui/resources/{rid}/versions/{rvid}/sync";
 };
 
-export type WorkflowVersionGetWorkflowVersionMetadataResponse =
-  WorkflowVersionMetadataOut;
+export type ResourceVersionResourceVersionSyncErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowVersionGetWorkflowVersionMetadataError =
-  HTTPValidationError;
+export type ResourceVersionResourceVersionSyncError =
+  ResourceVersionResourceVersionSyncErrors[keyof ResourceVersionResourceVersionSyncErrors];
 
-export type WorkflowVersionUpdateWorkflowVersionMetadataData = {
-  body: WorkflowVersionMetadataIn;
+export type ResourceVersionResourceVersionSyncResponses = {
+  /**
+   * Successful Response
+   */
+  200: ResourceVersionOut;
+};
+
+export type ResourceVersionResourceVersionSyncResponse =
+  ResourceVersionResourceVersionSyncResponses[keyof ResourceVersionResourceVersionSyncResponses];
+
+export type ResourceVersionResourceVersionLatestData = {
+  body?: never;
   path: {
     /**
-     * Git commit git_commit_hash of specific version.
+     * ID of a resource
      */
-    git_commit_hash: string;
+    rid: string;
     /**
-     * ID of a workflow
+     * ID of a resource version
      */
-    wid: string;
+    rvid: string;
   };
+  query?: never;
+  url: "/ui/resources/{rid}/versions/{rvid}/latest";
 };
 
-export type WorkflowVersionUpdateWorkflowVersionMetadataResponse =
-  WorkflowVersionMetadataOut;
+export type ResourceVersionResourceVersionLatestErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowVersionUpdateWorkflowVersionMetadataError =
-  HTTPValidationError;
+export type ResourceVersionResourceVersionLatestError =
+  ResourceVersionResourceVersionLatestErrors[keyof ResourceVersionResourceVersionLatestErrors];
 
-export type WorkflowVersionDeprecateWorkflowVersionData = {
+export type ResourceVersionResourceVersionLatestResponses = {
+  /**
+   * Successful Response
+   */
+  200: ResourceVersionOut;
+};
+
+export type ResourceVersionResourceVersionLatestResponse =
+  ResourceVersionResourceVersionLatestResponses[keyof ResourceVersionResourceVersionLatestResponses];
+
+export type ResourceVersionDeleteResourceVersionClusterData = {
+  body?: never;
   path: {
     /**
-     * Git commit git_commit_hash of specific version.
+     * ID of a resource
      */
-    git_commit_hash: string;
+    rid: string;
     /**
-     * ID of a workflow
+     * ID of a resource version
      */
-    wid: string;
+    rvid: string;
   };
+  query?: never;
+  url: "/ui/resources/{rid}/versions/{rvid}/cluster";
 };
 
-export type WorkflowVersionDeprecateWorkflowVersionResponse =
-  WorkflowVersionOut;
+export type ResourceVersionDeleteResourceVersionClusterErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowVersionDeprecateWorkflowVersionError = HTTPValidationError;
+export type ResourceVersionDeleteResourceVersionClusterError =
+  ResourceVersionDeleteResourceVersionClusterErrors[keyof ResourceVersionDeleteResourceVersionClusterErrors];
 
-export type WorkflowVersionUpdateWorkflowVersionParameterExtensionData = {
-  body: ParameterExtension_Input;
+export type ResourceVersionDeleteResourceVersionClusterResponses = {
+  /**
+   * Successful Response
+   */
+  200: ResourceVersionOut;
+};
+
+export type ResourceVersionDeleteResourceVersionClusterResponse =
+  ResourceVersionDeleteResourceVersionClusterResponses[keyof ResourceVersionDeleteResourceVersionClusterResponses];
+
+export type ResourceVersionDeleteResourceVersionS3Data = {
+  body?: never;
   path: {
     /**
-     * Git commit git_commit_hash of specific version.
+     * ID of a resource
      */
-    git_commit_hash: string;
+    rid: string;
     /**
-     * ID of a workflow
+     * ID of a resource version
      */
-    wid: string;
+    rvid: string;
   };
+  query?: never;
+  url: "/ui/resources/{rid}/versions/{rvid}/s3";
 };
 
-export type WorkflowVersionUpdateWorkflowVersionParameterExtensionResponse =
-  WorkflowVersionOut;
+export type ResourceVersionDeleteResourceVersionS3Errors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowVersionUpdateWorkflowVersionParameterExtensionError =
-  HTTPValidationError;
+export type ResourceVersionDeleteResourceVersionS3Error =
+  ResourceVersionDeleteResourceVersionS3Errors[keyof ResourceVersionDeleteResourceVersionS3Errors];
 
-export type WorkflowVersionDownloadWorkflowDocumentationData = {
-  path: {
+export type ResourceVersionDeleteResourceVersionS3Responses = {
+  /**
+   * Successful Response
+   */
+  200: ResourceVersionOut;
+};
+
+export type ResourceVersionDeleteResourceVersionS3Response =
+  ResourceVersionDeleteResourceVersionS3Responses[keyof ResourceVersionDeleteResourceVersionS3Responses];
+
+export type NewsListNewsData = {
+  body?: never;
+  path?: never;
+  query?: {
     /**
-     * Git commit git_commit_hash of specific version.
+     * Filter for news that are created after this UNIX timestamp
      */
-    git_commit_hash: string;
+    created_after?: number | null;
     /**
-     * ID of a workflow
+     * Filter for news created by a specific user
      */
-    wid: string;
-  };
-  query?: {
+    creator_id?: string | null;
     /**
-     * Specify which type of documentation the client wants to fetch
+     * Id of the item to start the query from. DO NOT SET MANUALLY.
      */
-    document?: DocumentationEnum;
+    id_after?: string | null;
     /**
-     * Workflow Mode
+     * Number of items to list per page
      */
-    mode_id?: string | null;
+    per_page?: number;
+    /**
+     * Sort order of items with creation time
+     */
+    sort?: "asc" | "desc";
   };
+  url: "/ui/news";
 };
 
-export type WorkflowVersionDownloadWorkflowDocumentationResponse = unknown;
+export type NewsListNewsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type WorkflowVersionDownloadWorkflowDocumentationError =
-  HTTPValidationError;
+export type NewsListNewsError = NewsListNewsErrors[keyof NewsListNewsErrors];
 
-export type WorkflowVersionUploadWorkflowVersionIconData = {
-  body: Body_Workflow_Version_upload_workflow_version_icon;
+export type NewsListNewsResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<NewsOut>;
+};
+
+export type NewsListNewsResponse =
+  NewsListNewsResponses[keyof NewsListNewsResponses];
+
+export type NewsCreateNewsData = {
+  /**
+   * Meta-data for news event to create
+   */
+  body: NewsIn;
+  path?: never;
+  query?: never;
+  url: "/ui/news";
+};
+
+export type NewsCreateNewsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
+
+export type NewsCreateNewsError =
+  NewsCreateNewsErrors[keyof NewsCreateNewsErrors];
+
+export type NewsCreateNewsResponses = {
+  /**
+   * Successful Response
+   */
+  201: NewsOut;
+};
+
+export type NewsCreateNewsResponse =
+  NewsCreateNewsResponses[keyof NewsCreateNewsResponses];
+
+export type NewsListLatestNewsData = {
+  body?: never;
+  path?: never;
+  query?: never;
+  url: "/ui/news/latest";
+};
+
+export type NewsListLatestNewsResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<NewsOut>;
+};
+
+export type NewsListLatestNewsResponse =
+  NewsListLatestNewsResponses[keyof NewsListLatestNewsResponses];
+
+export type NewsDeleteNewsData = {
+  body?: never;
   path: {
     /**
-     * Git commit git_commit_hash of specific version.
-     */
-    git_commit_hash: string;
-    /**
-     * ID of a workflow
+     * ID of a news event
      */
-    wid: string;
+    nid: string;
   };
+  query?: never;
+  url: "/ui/news/{nid}";
+};
+
+export type NewsDeleteNewsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
 };
 
-export type WorkflowVersionUploadWorkflowVersionIconResponse = IconUpdateOut;
+export type NewsDeleteNewsError =
+  NewsDeleteNewsErrors[keyof NewsDeleteNewsErrors];
+
+export type NewsDeleteNewsResponses = {
+  /**
+   * Successful Response
+   */
+  204: void;
+};
 
-export type WorkflowVersionUploadWorkflowVersionIconError = HTTPValidationError;
+export type NewsDeleteNewsResponse =
+  NewsDeleteNewsResponses[keyof NewsDeleteNewsResponses];
 
-export type WorkflowVersionDeleteWorkflowVersionIconData = {
+export type NewsGetNewsData = {
+  body?: never;
   path: {
     /**
-     * Git commit git_commit_hash of specific version.
-     */
-    git_commit_hash: string;
-    /**
-     * ID of a workflow
+     * ID of a news event
      */
-    wid: string;
+    nid: string;
   };
+  query?: never;
+  url: "/ui/news/{nid}";
 };
 
-export type WorkflowVersionDeleteWorkflowVersionIconResponse = void;
-
-export type WorkflowVersionDeleteWorkflowVersionIconError = HTTPValidationError;
-
-export type WorkflowGetDeveloperWorkflowStatisticsResponseTransformer = (
-  data: any,
-) => Promise<WorkflowGetDeveloperWorkflowStatisticsResponse>;
+export type NewsGetNewsErrors = {
+  /**
+   * Validation Error
+   */
+  422: HttpValidationError;
+};
 
-export type AnonymizedWorkflowExecutionModelResponseTransformer = (
-  data: any,
-) => AnonymizedWorkflowExecution;
+export type NewsGetNewsError = NewsGetNewsErrors[keyof NewsGetNewsErrors];
 
-export const AnonymizedWorkflowExecutionModelResponseTransformer: AnonymizedWorkflowExecutionModelResponseTransformer =
-  (data) => {
-    if (data?.started_at) {
-      data.started_at = new Date(data.started_at);
-    }
-    return data;
-  };
+export type NewsGetNewsResponses = {
+  /**
+   * Successful Response
+   */
+  200: NewsOut;
+};
 
-export const WorkflowGetDeveloperWorkflowStatisticsResponseTransformer: WorkflowGetDeveloperWorkflowStatisticsResponseTransformer =
-  async (data) => {
-    if (Array.isArray(data)) {
-      data.forEach(AnonymizedWorkflowExecutionModelResponseTransformer);
-    }
-    return data;
-  };
+export type NewsGetNewsResponse =
+  NewsGetNewsResponses[keyof NewsGetNewsResponses];
 
-export type WorkflowGetWorkflowStatisticsResponseTransformer = (
-  data: any,
-) => Promise<WorkflowGetWorkflowStatisticsResponse>;
+export type PublicGetPublicWorkflowsData = {
+  body?: never;
+  path?: never;
+  query?: never;
+  url: "/ui/public/workflows";
+};
 
-export type WorkflowStatisticModelResponseTransformer = (
-  data: any,
-) => WorkflowStatistic;
+export type PublicGetPublicWorkflowsResponses = {
+  /**
+   * Successful Response
+   */
+  200: Array<PublicWorkflowOut>;
+};
 
-export const WorkflowStatisticModelResponseTransformer: WorkflowStatisticModelResponseTransformer =
-  (data) => {
-    if (data?.day) {
-      data.day = new Date(data.day);
-    }
-    return data;
-  };
+export type PublicGetPublicWorkflowsResponse =
+  PublicGetPublicWorkflowsResponses[keyof PublicGetPublicWorkflowsResponses];
 
-export const WorkflowGetWorkflowStatisticsResponseTransformer: WorkflowGetWorkflowStatisticsResponseTransformer =
-  async (data) => {
-    if (Array.isArray(data)) {
-      data.forEach(WorkflowStatisticModelResponseTransformer);
-    }
-    return data;
-  };
+export type ClientOptions = {
+  baseURL: `${string}://${string}/api` | (string & {});
+};
diff --git a/src/components/AppHeader.vue b/src/components/AppHeader.vue
index e69143a..a9f8509 100644
--- a/src/components/AppHeader.vue
+++ b/src/components/AppHeader.vue
@@ -341,24 +341,16 @@ watch(
             style="z-index: 1025 !important"
           >
             <li>
-              <router-link class="dropdown-item" :to="{ name: 'api-tokens' }"
-                >API tokens
+              <router-link class="dropdown-item" :to="{ name: 'profile' }">
+                My Profile
               </router-link>
             </li>
             <li>
-              <hr class="dropdown-divider" />
-            </li>
-            <li v-if="userRepository.user.email" class="dropdown-item disabled">
-              {{ userRepository.user.email }}
-            </li>
-            <li><h6 class="dropdown-header">Roles</h6></li>
-            <li
-              v-for="role in userRepository.roles"
-              :key="role"
-              class="dropdown-item text-capitalize disabled"
-            >
-              {{ role }}
+              <router-link class="dropdown-item" :to="{ name: 'api-tokens' }">
+                My API tokens
+              </router-link>
             </li>
+
             <li>
               <hr class="dropdown-divider" />
             </li>
@@ -378,8 +370,9 @@ watch(
         class="btn btn-info btn-sm ms-2"
         role="button"
         :to="{ name: 'login' }"
-        >Login</router-link
       >
+        Login
+      </router-link>
     </nav>
   </header>
 </template>
diff --git a/src/components/parameter-schema/ParameterSchemaFormComponent.vue b/src/components/parameter-schema/ParameterSchemaFormComponent.vue
index e65fcd4..7922022 100644
--- a/src/components/parameter-schema/ParameterSchemaFormComponent.vue
+++ b/src/components/parameter-schema/ParameterSchemaFormComponent.vue
@@ -22,7 +22,7 @@ import {
 import { useWorkflowExecutionStore } from "@/stores/workflowExecutions";
 import { NextflowVersion, ParameterVisibility } from "@/client/types.gen";
 import type {
-  ParameterExtension_Output,
+  ParameterExtensionOutput,
   ParameterVisibilityMapping,
 } from "@/client/types.gen";
 import { flattenParameters, nestParameters } from "@/utils/Workflow";
@@ -44,7 +44,7 @@ const props = defineProps({
     required: false,
   },
   parameterExtension: {
-    type: Object as PropType<ParameterExtension_Output>,
+    type: Object as PropType<ParameterExtensionOutput>,
     required: false,
   },
   loading: {
@@ -394,7 +394,7 @@ onMounted(() => {
               Directory in bucket where to save Nextflow log and reports
             </div>
           </div>
-          <div v-if="props.nextflowVersion >= NextflowVersion._23_04_0">
+          <div v-if="props.nextflowVersion >= NextflowVersion['23_04_0']">
             <code
               class="bg-secondary-subtle p-2 rounded-top border border-secondary"
               >--provenance_s3_path</code
diff --git a/src/components/workflows/WorkflowDocumentationTabs.vue b/src/components/workflows/WorkflowDocumentationTabs.vue
index e375fb8..35ecf6f 100644
--- a/src/components/workflows/WorkflowDocumentationTabs.vue
+++ b/src/components/workflows/WorkflowDocumentationTabs.vue
@@ -4,7 +4,7 @@ import MarkdownRenderer from "@/components/MarkdownRenderer.vue";
 import ParameterSchemaDescriptionComponent from "@/components/parameter-schema/ParameterSchemaDescriptionComponent.vue";
 import { useRoute } from "vue-router";
 import type { ClowmInfo } from "@/types/ClowmInfo";
-import type { ParameterExtension_Output } from "@/client";
+import type { ParameterExtensionOutput } from "@/client/types.gen.ts";
 
 const route = useRoute();
 
@@ -16,7 +16,7 @@ const props = defineProps<{
   outputMarkdown?: string;
   citationsMarkdown?: string;
   parameterSchema?: Record<string, never>;
-  parameterExtension?: ParameterExtension_Output | null;
+  parameterExtension?: ParameterExtensionOutput | null;
   clowmInfo?: ClowmInfo;
 }>();
 
diff --git a/src/router/userRoutes.ts b/src/router/userRoutes.ts
index 5dee8da..b23b237 100644
--- a/src/router/userRoutes.ts
+++ b/src/router/userRoutes.ts
@@ -9,4 +9,16 @@ export const userRoutes: RouteRecordRaw[] = [
       title: "API Tokens",
     },
   },
+  {
+    path: "/profile",
+    name: "profile",
+    component: () => import("../views/user/ProfileView.vue"),
+    meta: {
+      title: "Profile",
+    },
+    props: (route) => ({
+      linkSuccess: route.query["link_success"],
+      linkError: route.query["link_error"],
+    }),
+  },
 ];
diff --git a/src/stores/buckets.ts b/src/stores/buckets.ts
index 9be03fc..5de6896 100644
--- a/src/stores/buckets.ts
+++ b/src/stores/buckets.ts
@@ -79,7 +79,6 @@ export const useBucketStore = defineStore("buckets", {
     ): Promise<BucketOut[]> {
       return BucketService.bucketListBuckets({
         query: { owner_id: ownerId, bucket_type: bucketType },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((buckets) => {
@@ -99,7 +98,6 @@ export const useBucketStore = defineStore("buckets", {
       }
       return BucketPermissionService.bucketPermissionListPermissionsPerUser({
         path: { uid: authStore.currentUID },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((permissions) => {
@@ -146,7 +144,6 @@ export const useBucketStore = defineStore("buckets", {
       }
       return BucketService.bucketGetBucket({
         path: { bucket_name: bucketName },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((bucket) => {
@@ -159,7 +156,6 @@ export const useBucketStore = defineStore("buckets", {
       return BucketService.bucketDeleteBucket({
         path: { bucket_name: bucketName },
         query: { force_delete: true },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then(() => {
@@ -169,7 +165,6 @@ export const useBucketStore = defineStore("buckets", {
     createBucket(bucket: BucketIn): Promise<BucketOut> {
       return BucketService.bucketCreateBucket({
         body: bucket,
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((createdBucket) => {
@@ -190,7 +185,6 @@ export const useBucketStore = defineStore("buckets", {
       }
       return BucketPermissionService.bucketPermissionListPermissionsPerBucket({
         path: { bucket_name: bucketName },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((permissions) => {
@@ -205,7 +199,6 @@ export const useBucketStore = defineStore("buckets", {
           bucket_name: bucketName,
           uid: uid,
         },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then(() => {
@@ -228,7 +221,6 @@ export const useBucketStore = defineStore("buckets", {
     ): Promise<BucketPermissionOut> {
       return BucketPermissionService.bucketPermissionCreatePermission({
         body: permissionIn,
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((permission) => {
@@ -255,7 +247,6 @@ export const useBucketStore = defineStore("buckets", {
           uid: uid,
         },
         body: permissionParams,
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((permissionOut) => {
@@ -284,7 +275,6 @@ export const useBucketStore = defineStore("buckets", {
           body: {
             public: public_,
           },
-          throwOnError: true,
         })
       ).data!;
       this.bucketMapping[bucketName] = bucket;
@@ -301,13 +291,11 @@ export const useBucketStore = defineStore("buckets", {
           size_limit: size_limit,
           object_limit: object_limit,
         },
-        throwOnError: true,
       }).then((response) => response.data!);
     },
     acceptBucketOtr(otr: OwnershipTransferRequestOut): Promise<BucketOut> {
       return BucketService.bucketAcceptBucketOtr({
         path: { bucket_name: otr.target_id },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((bucket) => {
diff --git a/src/stores/news.ts b/src/stores/news.ts
index df2758f..ccd8fed 100644
--- a/src/stores/news.ts
+++ b/src/stores/news.ts
@@ -21,7 +21,6 @@ export const useNewsStore = defineStore("news", {
   actions: {
     createNewsEvent(newsIn: NewsIn): Promise<NewsOut> {
       return NewsService.newsCreateNews({
-        throwOnError: true,
         body: newsIn,
       })
         .then((resp) => resp.data!)
@@ -35,7 +34,6 @@ export const useNewsStore = defineStore("news", {
         return Promise.resolve(this.newsMapping[newsId]);
       }
       return NewsService.newsGetNews({
-        throwOnError: true,
         path: { nid: newsId },
       })
         .then((resp) => resp.data!)
@@ -49,7 +47,7 @@ export const useNewsStore = defineStore("news", {
       if (this.__loaded) {
         onFinally?.();
       }
-      return NewsService.newsListLatestNews({ throwOnError: true })
+      return NewsService.newsListLatestNews({})
         .then((resp) => resp.data!)
         .then((news) => {
           useUserStore().fetchUsernames(news.map((event) => event.creator_id));
diff --git a/src/stores/otrs.ts b/src/stores/otrs.ts
index f45f20d..6b6bfaf 100644
--- a/src/stores/otrs.ts
+++ b/src/stores/otrs.ts
@@ -63,7 +63,6 @@ export const useOTRStore = defineStore("otrs", {
           current_owner_id: currentOwnerId,
           new_owner_id: newOwnerId,
         },
-        throwOnError: true,
       };
       switch (targetType) {
         case OwnershipTypeEnum.BUCKET:
@@ -144,17 +143,14 @@ export const useOTRStore = defineStore("otrs", {
           case OwnershipTypeEnum.BUCKET:
             return BucketService.bucketDeleteBucketOtr({
               path: { bucket_name: otr.target_id },
-              throwOnError: true,
             });
           case OwnershipTypeEnum.WORKFLOW:
             return WorkflowService.workflowDeleteWorkflowOtr({
               path: { wid: otr.target_id },
-              throwOnError: true,
             });
           case OwnershipTypeEnum.RESOURCE:
             return ResourceService.resourceDeleteResourceOtr({
               path: { rid: otr.target_id },
-              throwOnError: true,
             });
         }
       })();
@@ -176,19 +172,16 @@ export const useOTRStore = defineStore("otrs", {
             return BucketService.bucketCreateBucketOtr({
               path: { bucket_name: targetId },
               body: otr,
-              throwOnError: true,
             });
           case OwnershipTypeEnum.WORKFLOW:
             return WorkflowService.workflowCreateWorkflowOtr({
               path: { wid: targetId },
               body: otr,
-              throwOnError: true,
             });
           case OwnershipTypeEnum.RESOURCE:
             return ResourceService.resourceCreateResourceOtr({
               path: { rid: targetId },
               body: otr,
-              throwOnError: true,
             });
         }
       })();
diff --git a/src/stores/resources.ts b/src/stores/resources.ts
index 56e6ecb..cb903a9 100644
--- a/src/stores/resources.ts
+++ b/src/stores/resources.ts
@@ -92,7 +92,6 @@ export const useResourceStore = defineStore("resources", {
       return ResourceService.resourceGetResource({
         path: { rid: resource_id },
         query: { version_status: versionStatus },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((resource) => {
@@ -113,7 +112,7 @@ export const useResourceStore = defineStore("resources", {
       if (this.__syncRequestsFetched) {
         onFinally?.();
       }
-      return ResourceService.resourceListSyncRequests({ throwOnError: true })
+      return ResourceService.resourceListSyncRequests({})
         .then((response) => response.data!)
         .then((requests) => {
           this.__syncRequestsFetched = true;
@@ -143,7 +142,6 @@ export const useResourceStore = defineStore("resources", {
           name_substring: searchString,
           public: _public,
         },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((resources) => {
@@ -177,7 +175,6 @@ export const useResourceStore = defineStore("resources", {
           rvid: resource_version_id,
           rid: resource_id,
         },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((tree) => {
@@ -269,7 +266,6 @@ export const useResourceStore = defineStore("resources", {
       const createdResource = (
         await ResourceService.resourceCreateResource({
           body: resource,
-          throwOnError: true,
         })
       ).data!;
       this.ownResourceMapping[createdResource.resource_id] = createdResource;
@@ -295,7 +291,6 @@ export const useResourceStore = defineStore("resources", {
           rvid: resourceVersion.resource_version_id,
         },
         body: request,
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((changedResourceVersion) => {
@@ -338,7 +333,6 @@ export const useResourceStore = defineStore("resources", {
             rid: resourceVersion.resource_id,
             rvid: resourceVersion.resource_version_id,
           },
-          throwOnError: true,
         },
       )
         .then((response) => response.data!)
@@ -378,7 +372,6 @@ export const useResourceStore = defineStore("resources", {
           rid: resource_id,
         },
         body: version,
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((versionOut) => {
@@ -406,7 +399,6 @@ export const useResourceStore = defineStore("resources", {
           rvid: resourceVersion.resource_version_id,
         },
         body: requestAnswer,
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then(this._updateReviewableResourceVersion);
@@ -421,7 +413,6 @@ export const useResourceStore = defineStore("resources", {
           rvid: resourceVersion.resource_version_id,
         },
         body: requestAnswer,
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((version) => {
@@ -459,7 +450,6 @@ export const useResourceStore = defineStore("resources", {
           rid: resourceVersion.resource_id,
           rvid: resourceVersion.resource_version_id,
         },
-        throwOnError: true,
       }).then((response) => response.data!);
     },
     deleteOnCluster(
@@ -471,7 +461,6 @@ export const useResourceStore = defineStore("resources", {
             rid: resourceVersion.resource_id,
             rvid: resourceVersion.resource_version_id,
           },
-          throwOnError: true,
         },
       ).then((response) => response.data!);
     },
@@ -483,13 +472,11 @@ export const useResourceStore = defineStore("resources", {
           rid: resourceVersion.resource_id,
           rvid: resourceVersion.resource_version_id,
         },
-        throwOnError: true,
       }).then((response) => response.data!);
     },
     acceptResourceOtr(otr: OwnershipTransferRequestOut): Promise<ResourceOut> {
       return ResourceService.resourceAcceptResourceOtr({
         path: { rid: otr.target_id },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((resource) => {
diff --git a/src/stores/s3keys.ts b/src/stores/s3keys.ts
index 83c8049..cbf9aab 100644
--- a/src/stores/s3keys.ts
+++ b/src/stores/s3keys.ts
@@ -28,7 +28,6 @@ export const useS3KeyStore = defineStore("s3keys", {
       }
       return S3KeyService.s3KeyGetUserKeys({
         path: { uid: useUserStore().currentUID },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((keys) => {
@@ -50,7 +49,6 @@ export const useS3KeyStore = defineStore("s3keys", {
           access_id: access_id,
           uid: userRepository.currentUID,
         },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then(() => {
@@ -63,7 +61,6 @@ export const useS3KeyStore = defineStore("s3keys", {
       const userRepository = useUserStore();
       return S3KeyService.s3KeyCreateUserKey({
         path: { uid: userRepository.currentUID },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((key) => {
diff --git a/src/stores/users.ts b/src/stores/users.ts
index 67eb1ca..c05c2e5 100644
--- a/src/stores/users.ts
+++ b/src/stores/users.ts
@@ -88,7 +88,7 @@ export const useUserStore = defineStore("user", {
   },
   actions: {
     getCurrentUser(): Promise<UserOutExtended> {
-      return UserService.userGetLoggedInUser({ throwOnError: true })
+      return UserService.userGetLoggedInUser({})
         .then((response) => response.data!)
         .then((user) => {
           this.updateUser(user);
@@ -128,7 +128,6 @@ export const useUserStore = defineStore("user", {
           name_substring: searchString,
           filter_roles: filterRoles,
         },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((users) => {
@@ -148,7 +147,6 @@ export const useUserStore = defineStore("user", {
       }
       return ApiTokenService.apiTokenListToken({
         query: { uid: uid },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((tokens) => {
@@ -162,7 +160,6 @@ export const useUserStore = defineStore("user", {
     createApiToken(tokenIn: ApiTokenIn): Promise<ApiTokenPrivateOut> {
       return ApiTokenService.apiTokenCreateToken({
         body: tokenIn,
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((token) => {
@@ -173,7 +170,6 @@ export const useUserStore = defineStore("user", {
     deleteApiToken(tokenId: string): Promise<void> {
       return ApiTokenService.apiTokenDeleteToken({
         path: { tid: tokenId },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then(() => {
@@ -186,11 +182,10 @@ export const useUserStore = defineStore("user", {
         body: {
           roles: roles,
         },
-        throwOnError: true,
       }).then((response) => response.data!);
     },
     inviteUser(userIn: UserIn): Promise<UserOutExtended> {
-      return UserService.userCreateUser({ body: userIn, throwOnError: true })
+      return UserService.userCreateUser({ body: userIn })
         .then((response) => response.data!)
         .then((user) => {
           useNameStore().addNameToMapping(user.uid, user.display_name);
@@ -200,7 +195,6 @@ export const useUserStore = defineStore("user", {
     resendInvitationEmail(uid: string): Promise<UserOutExtended> {
       return UserService.userResendInvitation({
         path: { uid: uid },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((user) => {
@@ -211,7 +205,6 @@ export const useUserStore = defineStore("user", {
     searchUser(searchString: string): Promise<UserOut[]> {
       return UserService.userSearchUsers({
         query: { name_substring: searchString },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((users) => {
diff --git a/src/stores/workflowExecutions.ts b/src/stores/workflowExecutions.ts
index 81444bb..112295d 100644
--- a/src/stores/workflowExecutions.ts
+++ b/src/stores/workflowExecutions.ts
@@ -124,7 +124,6 @@ export const useWorkflowExecutionStore = defineStore("executions", {
       const userStore = useUserStore();
       return WorkflowService.workflowGetDeveloperWorkflowStatistics({
         query: { developer_id: userStore.currentUID },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((executions) => {
@@ -173,7 +172,6 @@ export const useWorkflowExecutionStore = defineStore("executions", {
       }
       return WorkflowExecutionService.workflowExecutionGetWorkflowExecution({
         path: { eid: executionId },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((execution) => {
@@ -196,7 +194,7 @@ export const useWorkflowExecutionStore = defineStore("executions", {
             return parameters;
           }
           return WorkflowExecutionService.workflowExecutionGetWorkflowExecutionParams(
-            { path: { eid: executionId }, throwOnError: true },
+            { path: { eid: executionId } },
           )
             .then((response) => response.data!)
             .then((parameters) => {
@@ -212,7 +210,6 @@ export const useWorkflowExecutionStore = defineStore("executions", {
     deleteExecution(executionId: string): Promise<void> {
       return WorkflowExecutionService.workflowExecutionDeleteWorkflowExecution({
         path: { eid: executionId },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then(() => {
@@ -222,7 +219,6 @@ export const useWorkflowExecutionStore = defineStore("executions", {
     cancelExecution(executionId: string): Promise<void> {
       return WorkflowExecutionService.workflowExecutionCancelWorkflowExecution({
         path: { eid: executionId },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then(() => {
@@ -240,7 +236,6 @@ export const useWorkflowExecutionStore = defineStore("executions", {
     ): Promise<WorkflowExecutionOut> {
       return WorkflowExecutionService.workflowExecutionStartWorkflow({
         body: executionIn,
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((execution) => {
@@ -253,7 +248,6 @@ export const useWorkflowExecutionStore = defineStore("executions", {
     ): Promise<WorkflowExecutionOut> {
       return WorkflowExecutionService.workflowExecutionStartArbitraryWorkflow({
         body: executionIn,
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((execution) => {
diff --git a/src/stores/workflows.ts b/src/stores/workflows.ts
index 58e8d9a..2097d7b 100644
--- a/src/stores/workflows.ts
+++ b/src/stores/workflows.ts
@@ -1,9 +1,9 @@
 import { defineStore } from "pinia";
 import type {
-  Body_Workflow_Version_upload_workflow_version_icon,
+  BodyWorkflowVersionUploadWorkflowVersionIcon,
   IconUpdateOut,
   OwnershipTransferRequestOut,
-  ParameterExtension_Output,
+  ParameterExtensionOutput,
   WorkflowCredentialsIn,
   WorkflowIn,
   WorkflowModeOut,
@@ -101,7 +101,6 @@ export const useWorkflowStore = defineStore("workflows", {
           wid: workflowId,
           git_commit_hash: versionId,
         },
-        throwOnError: true,
       }).then((response) => response.data!);
     },
     updateVersionMetadata(
@@ -116,7 +115,6 @@ export const useWorkflowStore = defineStore("workflows", {
             git_commit_hash: versionId,
           },
           body: metadata,
-          throwOnError: true,
         },
       ).then((response) => response.data!);
     },
@@ -124,7 +122,7 @@ export const useWorkflowStore = defineStore("workflows", {
       if (Object.keys(this.publicWorkflowMapping).length > 0) {
         onFinally?.();
       }
-      return PublicService.publicGetPublicWorkflows({ throwOnError: true })
+      return PublicService.publicGetPublicWorkflows({})
         .then((response) => response.data!)
         .then((workflows) => {
           const tempMapping: IdMapping<PublicWorkflowOut> = {};
@@ -140,7 +138,7 @@ export const useWorkflowStore = defineStore("workflows", {
       if (Object.keys(this.workflowMapping).length > 0) {
         onFinally?.();
       }
-      return WorkflowService.workflowListWorkflows({ throwOnError: true })
+      return WorkflowService.workflowListWorkflows({})
         .then((response) => response.data!)
         .then((workflows) => {
           for (const workflow of workflows) {
@@ -174,7 +172,6 @@ export const useWorkflowStore = defineStore("workflows", {
           version_status: Object.values(WorkflowVersionStatus),
           developer_id: authStore.currentUID,
         },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((workflows) => {
@@ -235,7 +232,6 @@ export const useWorkflowStore = defineStore("workflows", {
             document: document,
             mode_id: mode_id,
           },
-          throwOnError: true,
         },
       )
         .then((response) => response.data!)
@@ -260,7 +256,6 @@ export const useWorkflowStore = defineStore("workflows", {
         query: {
           version_status: [WorkflowVersionStatus.CREATED],
         },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((workflows) => {
@@ -325,7 +320,6 @@ export const useWorkflowStore = defineStore("workflows", {
             ? Object.values(WorkflowVersionStatus)
             : undefined,
         },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((workflow) => {
@@ -393,7 +387,6 @@ export const useWorkflowStore = defineStore("workflows", {
           wid: workflow_id,
           git_commit_hash: version_id,
         },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((version) => {
@@ -443,7 +436,6 @@ export const useWorkflowStore = defineStore("workflows", {
       return WorkflowService.workflowUpdateWorkflow({
         path: { wid: workflow_id },
         body: version,
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((updatedVersion) => {
@@ -464,7 +456,6 @@ export const useWorkflowStore = defineStore("workflows", {
     deleteWorkflow(workflow_id: string): Promise<void> {
       return WorkflowService.workflowDeleteWorkflow({
         path: { wid: workflow_id },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then(() => {
@@ -476,7 +467,6 @@ export const useWorkflowStore = defineStore("workflows", {
     createWorkflow(workflow: WorkflowIn): Promise<WorkflowOut> {
       return WorkflowService.workflowCreateWorkflow({
         body: workflow,
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((workflowOut) => {
@@ -498,7 +488,6 @@ export const useWorkflowStore = defineStore("workflows", {
         {
           path: { wid: workflow_id },
           body: credentials,
-          throwOnError: true,
         },
       )
         .then((response) => response.data!)
@@ -517,7 +506,7 @@ export const useWorkflowStore = defineStore("workflows", {
     },
     deleteWorkflowCredentials(workflow_id: string): Promise<void> {
       return WorkflowCredentialsService.workflowCredentialsDeleteWorkflowCredentials(
-        { path: { wid: workflow_id }, throwOnError: true },
+        { path: { wid: workflow_id } },
       )
         .then((response) => response.data!)
         .then(() => {
@@ -536,7 +525,7 @@ export const useWorkflowStore = defineStore("workflows", {
     updateVersionIcon(
       workflow_id: string,
       version_id: string,
-      icon: Body_Workflow_Version_upload_workflow_version_icon,
+      icon: BodyWorkflowVersionUploadWorkflowVersionIcon,
     ): Promise<IconUpdateOut> {
       return WorkflowVersionService.workflowVersionUploadWorkflowVersionIcon({
         path: {
@@ -544,7 +533,6 @@ export const useWorkflowStore = defineStore("workflows", {
           git_commit_hash: version_id,
         },
         body: icon,
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((response) => {
@@ -590,7 +578,6 @@ export const useWorkflowStore = defineStore("workflows", {
           wid: workflow_id,
           git_commit_hash: version_id,
         },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then(() => {
@@ -638,7 +625,6 @@ export const useWorkflowStore = defineStore("workflows", {
           git_commit_hash: version_id,
         },
         body: { status: status },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then(() => {
@@ -661,7 +647,7 @@ export const useWorkflowStore = defineStore("workflows", {
     updateWorkflowExtension(
       workflow_id: string,
       version_id: string,
-      extension: ParameterExtension_Output,
+      extension: ParameterExtensionOutput,
     ): Promise<WorkflowVersionOut> {
       return WorkflowVersionService.workflowVersionUpdateWorkflowVersionParameterExtension(
         {
@@ -670,7 +656,6 @@ export const useWorkflowStore = defineStore("workflows", {
             git_commit_hash: version_id,
           },
           body: extension,
-          throwOnError: true,
         },
       )
         .then((response) => response.data!)
@@ -723,7 +708,6 @@ export const useWorkflowStore = defineStore("workflows", {
               this.versionMapping[version_id]?.parameter_extension
                 ?.parameter_visibility,
           },
-          throwOnError: true,
         },
       )
         .then((response) => response.data!)
@@ -763,7 +747,6 @@ export const useWorkflowStore = defineStore("workflows", {
     acceptWorkflowOtr(otr: OwnershipTransferRequestOut): Promise<WorkflowOut> {
       return WorkflowService.workflowAcceptWorkflowOtr({
         path: { wid: otr.target_id },
-        throwOnError: true,
       })
         .then((response) => response.data!)
         .then((workflow) => {
diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue
index 6126a77..cf841ae 100644
--- a/src/views/LoginView.vue
+++ b/src/views/LoginView.vue
@@ -1,10 +1,15 @@
 <script setup lang="ts">
-import { onBeforeMount, onMounted, computed } from "vue";
+import { onBeforeMount, onMounted } from "vue";
 import { useUserStore } from "@/stores/users";
 import { useRouter } from "vue-router";
 import { Toast } from "bootstrap";
 import BootstrapToast from "@/components/BootstrapToast.vue";
-import { environment } from "@/environment";
+import {
+  type AuthKickstartLoginData,
+  OidcProvider,
+} from "@/client/types.gen.ts";
+import { client } from "@/client/client.gen.ts";
+import { environment } from "@/environment.ts";
 
 const router = useRouter();
 
@@ -25,18 +30,23 @@ onBeforeMount(() => {
   }
 });
 
-const loginPath = computed<string>(() => {
-  const loginUrl = new URL(
-    `${environment.API_BASE_URL}/auth/login?provider=lifescience`,
+function loginPath(provider: OidcProvider): string {
+  const config: AuthKickstartLoginData = {
+    url: "/auth/login/{provider}",
+    path: {
+      provider: provider,
+    },
+    query: {
+      next:
+        props.returnPath != undefined ? encodeURI(props.returnPath) : undefined,
+      invitation_token:
+        props.invitationToken != undefined ? props.invitationToken : undefined,
+    },
+  };
+  return (
+    environment.API_BASE_URL + client.buildUrl<AuthKickstartLoginData>(config)
   );
-  if (props.returnPath) {
-    loginUrl.searchParams.append("next", encodeURI(props.returnPath));
-  }
-  if (props.invitationToken) {
-    loginUrl.searchParams.append("invitation_token", props.invitationToken);
-  }
-  return loginUrl.href;
-});
+}
 
 onMounted(() => {
   errorToast = new Toast("#loginErrorToast");
@@ -90,14 +100,24 @@ onMounted(() => {
           ><span class="clowm-red fw-bold">W</span
           ><span class="clowm-green fw-bold">M</span> with LifeScience
         </p>
-        <a :href="loginPath" class="my-2">
-          <img
-            src="/src/assets/images/ls-login.png"
-            alt="[LS Login]"
-            class="img-fluid"
-            style="max-height: 90px"
-          />
-        </a>
+        <div>
+          <a :href="loginPath(OidcProvider.LIFESCIENCE_AAI)" class="my-2">
+            <img
+              src="/src/assets/images/ls-login.png"
+              alt="[LS Login]"
+              class="img-fluid"
+              style="max-height: 90px"
+            />
+          </a>
+        </div>
+        <div>
+          <a
+            :href="loginPath(OidcProvider.NFDI_AAI)"
+            class="my-2 btn btn-lg btn-primary"
+          >
+            NFDI AAI
+          </a>
+        </div>
         <div v-if="invitationToken == undefined" class="mt-2">
           Don't have an account?
           <router-link :to="{ name: 'signup' }">
diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue
new file mode 100644
index 0000000..2fc7156
--- /dev/null
+++ b/src/views/user/ProfileView.vue
@@ -0,0 +1,7 @@
+<script setup lang="ts"></script>
+
+<template>
+  <div>My Profile</div>
+</template>
+
+<style scoped></style>
diff --git a/src/views/workflows/CreateParameterTranslationView.vue b/src/views/workflows/CreateParameterTranslationView.vue
index 62d306f..e22bc1a 100644
--- a/src/views/workflows/CreateParameterTranslationView.vue
+++ b/src/views/workflows/CreateParameterTranslationView.vue
@@ -4,7 +4,7 @@ import { useWorkflowStore } from "@/stores/workflows";
 import { computed, onMounted, reactive, ref, watch } from "vue";
 import {
   DocumentationEnum,
-  type ParameterExtension_Output,
+  type ParameterExtensionOutput,
 } from "@/client/types.gen";
 import type { ClowmInfo } from "@/types/ClowmInfo";
 import ParameterInput from "@/components/parameter-schema/form-mode/ParameterInput.vue";
@@ -35,7 +35,7 @@ const workflowRepository = useWorkflowStore();
 const parameterState = reactive<{
   loading: boolean;
   makingRequest: boolean;
-  extension: ParameterExtension_Output;
+  extension: ParameterExtensionOutput;
   resourceParametersDefault: Set<string>;
   resourceParametersMapping: Set<string>;
   mappingParameterValues: Record<string, string>;
diff --git a/src/views/workflows/MyWorkflowsView.vue b/src/views/workflows/MyWorkflowsView.vue
index c5fccc7..bf20bdc 100644
--- a/src/views/workflows/MyWorkflowsView.vue
+++ b/src/views/workflows/MyWorkflowsView.vue
@@ -70,7 +70,7 @@ const workflowsState = reactive<{
         workflow_id: "",
         icon_url: "",
         modes: [],
-        nextflow_version: NextflowVersion._24_04_2,
+        nextflow_version: NextflowVersion["24_04_2"],
       },
     ],
     repository_url: "",
@@ -86,7 +86,7 @@ const workflowsState = reactive<{
     icon_url: null,
     created_at: 0,
     status: WorkflowVersionStatus.CREATED,
-    nextflow_version: NextflowVersion._24_04_2,
+    nextflow_version: NextflowVersion["24_04_2"],
   },
 });
 
diff --git a/src/views/workflows/StartWorkflowView.vue b/src/views/workflows/StartWorkflowView.vue
index fa0d782..4c04457 100644
--- a/src/views/workflows/StartWorkflowView.vue
+++ b/src/views/workflows/StartWorkflowView.vue
@@ -124,7 +124,7 @@ onMounted(() => {
     allow-notes
     :nextflow-version="
       workflowRepository.versionMapping[versionId]?.nextflow_version ??
-      NextflowVersion._24_04_2
+      NextflowVersion['24_04_2']
     "
     :clowm-info="
       workflowRepository.documentationFiles[versionId]?.[
diff --git a/src/views/workflows/UpdateWorkflowVersionMetadata.vue b/src/views/workflows/UpdateWorkflowVersionMetadata.vue
index 6cfff7b..ebfd333 100644
--- a/src/views/workflows/UpdateWorkflowVersionMetadata.vue
+++ b/src/views/workflows/UpdateWorkflowVersionMetadata.vue
@@ -17,7 +17,7 @@ const props = defineProps<{
 
 const metadata = reactive<WorkflowVersionMetadataIn>({
   default_container: undefined,
-  nextflow_version: NextflowVersion._22_10_0,
+  nextflow_version: NextflowVersion["22_10_0"],
   nextflow_config: undefined,
 });
 
diff --git a/vite.config.ts b/vite.config.ts
index 805d563..0f089af 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -6,6 +6,14 @@ import vue from "@vitejs/plugin-vue";
 
 // https://vitejs.dev/config/
 export default defineConfig({
+  server: {
+    allowedHosts: [".clowm.de"],
+    strictPort: true,
+  },
+  preview: {
+    allowedHosts: [".clowm.de"],
+    strictPort: true,
+  },
   plugins: [
     vue(),
     nodePolyfills({
-- 
GitLab


From 198000ce5c869e3894a3eae0ffa88ae4cfe0f49e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Mon, 10 Feb 2025 10:17:06 +0000
Subject: [PATCH 02/25] Add profile page

 * Add button to delete current user account
 * Fix bug when downloading multiple files

#191
---
 openapi-clowm.json                            |   2 +-
 package-lock.json                             | 237 +++++++++---------
 package.json                                  |   8 +-
 src/client/sdk.gen.ts                         |   5 +
 src/client/types.gen.ts                       |   2 +-
 src/components/modals/DeleteUserModal.vue     | 109 ++++++++
 .../modals/DownloadObjectsModal.vue           |   8 +-
 src/stores/users.ts                           |   6 +
 src/views/user/ProfileView.vue                |  65 ++++-
 9 files changed, 320 insertions(+), 122 deletions(-)
 create mode 100644 src/components/modals/DeleteUserModal.vue

diff --git a/openapi-clowm.json b/openapi-clowm.json
index 1dfafd3..262eef4 100644
--- a/openapi-clowm.json
+++ b/openapi-clowm.json
@@ -1 +1 @@
-{"openapi":"3.1.0","info":{"title":"CloWM UI API","description":"This is the API for the CloWM UI. It is only for internal use and will change without prior notice.","version":"1.0"},"servers":[{"url":"/api"}],"paths":{"/auth/login/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the login flow","description":"Redirect route to OIDC provider to kickstart the login process.","operationId":"Auth-kickstart_login","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"},{"name":"invitation_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":43,"maxLength":43},{"type":"null"}],"description":"Unique token to validate an invitation","title":"Invitation Token"},"description":"Unique token to validate an invitation"},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Will be appended to redirect response in the callback route as URL query parameter `next`","title":"Next"},"description":"Will be appended to redirect response in the callback route as URL query parameter `next`"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the login process with an OIDC Provider.\n\nVisit the route login route to start the login process.\n\nIf the user is already known to the system, then a JWT token will be created and sent via the 'set-cookie' header.\nThe key for this Cookie is 'bearer'.\n\nIf the user is new, he will be created him and then a JWT token is issued.\n\nThis JWT has to be sent to all authorized endpoints via the HTTPBearer scheme.","operationId":"Auth-login_callback","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=fake-jwt-cookie; Domain=localhost; Max-Age=691200; Path=/; SameSite=strict; Secure"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/connect/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the account connection flow","description":"Redirect route to OIDC provider to connect the CloWM account with the AAI account.","operationId":"Auth-kickstart_account_connection","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the account connection process with an OIDC provider.","operationId":"Auth-account_connection_callback","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"get":{"tags":["Auth"],"summary":"Logout","description":"Logout the user from the system by deleting the bearer cookie.","operationId":"Auth-logout","responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=; Domain=localhost; Max-Age=0; Path=/; SameSite=strict; Secure"}}}}}}},"/ui/tokens":{"get":{"tags":["APIToken"],"summary":"List API token","description":"List meta information about all API token.\n\nPermissions `api_token:list_all` required. See parameter `uid` for exception.","operationId":"APIToken-list_token","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiTokenOut"},"title":"Response Apitoken-List Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["APIToken"],"summary":"Create new API token","description":"Create a new API token for the current user.\n\nPermission `api_token:create` required.","operationId":"APIToken-create_token","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenIn","description":"Meta-data for Api token to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenPrivateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/tokens/{tid}":{"get":{"tags":["APIToken"],"summary":"Get API token","description":"Get an API token by id.\n\nPermission `api_token:read` required if the current user is the owner of the API token,\notherwise `api_token:read_any` required.","operationId":"APIToken-get_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["APIToken"],"summary":"Delete API token","description":"Delete an API token by id.\n\nPermission `api_token:delete` required if the current user is the owner of the API token,\notherwise `api_token:delete_any` required.","operationId":"APIToken-delete_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users":{"post":{"tags":["User"],"summary":"Create User","description":"Create a new user in the system and notify him.\n\nPermission `user:create` required.","operationId":"User-create_user","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserIn","description":"Meta-data for user to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["User"],"summary":"List users and search by their name","description":"List all users in the system..\n\nPermission `user:list` required.","operationId":"User-list_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter users by a substring in their name.","examples":["Bilbo"],"title":"Name Substring"},"description":"Filter users by a substring in their name."},{"name":"filter_roles","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/RoleEnum"}},{"type":"null"}],"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression.","title":"Filter Roles"},"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOutExtended"},"title":"Response User-List Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/search":{"get":{"tags":["User"],"summary":"Search Users","description":"Search for users in the system by their name.\n\nPermission `user: search` required.","operationId":"User-search_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":30,"description":"Filter users by a substring in their name.","title":"Name Substring"},"description":"Filter users by a substring in their name."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOut"},"title":"Response User-Search Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/me":{"get":{"tags":["User"],"summary":"Get the logged in user","description":"Return the user associated with the used JWT.\n\nPermission `user:read` required.","operationId":"User-get_logged_in_user","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}}},"security":[{"Session Token":[]}]}},"/ui/users/{uid}":{"get":{"tags":["User"],"summary":"Get a user by its uid","description":"Return the user with the specific uid.\n\nPermission `user:read` required.","operationId":"User-get_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["User"],"summary":"Delete a user","description":"Delete a user and his S3 account.\n\nPermission `user:delete` required if the current user is the target user.","operationId":"User-delete_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/roles":{"put":{"tags":["User"],"summary":"Update user roles","description":"Update the roles of a user.\n\nPermission `user:update` required.","operationId":"User-update_roles","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRoles","description":"The new roles of the user"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/invitation":{"patch":{"tags":["User"],"summary":"Resend Invitation","description":"Resend the invitation link for an user that has an open invitation.\n\nPermission `user:create` required.","operationId":"User-resend_invitation","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys":{"get":{"tags":["S3Key"],"summary":"Get the S3 Access keys from a user","description":"Get all the S3 Access keys for a specific user.\n\nPermission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required.","operationId":"S3Key-get_user_keys","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/S3Key"},"title":"Response S3Key-Get User Keys"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["S3Key"],"summary":"Create a Access key for a user","description":"Create a S3 Access key for a specific user.\n\nPermission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required.","operationId":"S3Key-create_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys/{access_id}":{"get":{"tags":["S3Key"],"summary":"Get a specific S3 Access key from a user","description":"Get a specific S3 Access Key for a specific user.\n\nPermission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required.","operationId":"S3Key-get_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["S3Key"],"summary":"Delete a specific S3 Access key from a user","description":"Delete a specific S3 Access key for a specific user.\n\nPermission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.","operationId":"S3Key-delete_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets":{"get":{"tags":["Bucket"],"summary":"List buckets","description":"List all the buckets in the system or of the desired user where the user has permissions for.\n\nPermission `bucket:list_all` required. See parameter `owner_id` for exception.","operationId":"Bucket-list_buckets","security":[{"Session Token":[]}],"parameters":[{"name":"owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Owner Id"},"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target."},{"name":"bucket_type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/BucketType","description":"Type of the bucket to get. Ignored when `user` parameter not set","default":"ALL"},"description":"Type of the bucket to get. Ignored when `user` parameter not set"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketOut"},"title":"Response Bucket-List Buckets"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket for the current user","description":"Create a bucket for the current user.\n\nThe name of the bucket has some constraints.\nFor more information see the\n[Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints)\n\nPermission `bucket:create` required.","operationId":"Bucket-create_bucket","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketIn","description":"Meta-data for bucket to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"List bucket OTRs","description":"Get the ownership transfer requests for buckets.\n\nPermission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `bucket:list_all`","operationId":"Bucket-list_bucket_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Bucket-List Bucket Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}":{"get":{"tags":["Bucket"],"summary":"Get a bucket by its name","description":"Get a bucket by its name if the current user has READ permissions for the bucket.\n\nPermission `bucket:read` required if the current user is the owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket","description":"Delete a bucket by its name. Only the owner of the bucket can delete the bucket.\n\nPermission `bucket:delete` required if the current user is the owner of the bucket,\notherwise `bucket:delete_any` required.","operationId":"Bucket-delete_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"force_delete","in":"query","required":false,"schema":{"type":"boolean","description":"Delete even non-empty bucket","default":false,"title":"Force Delete"},"description":"Delete even non-empty bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"Get a bucket OTR","description":"Get a specific bucket ownership transfer request.\n\nPermission `bucket:read` required if the current user is the current or new owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket OTR","description":"Create a ownership transfer request for a specific bucket.\n\nPermission `bucket:update` required if the current user is the current owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-create_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the bucket OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Bucket"],"summary":"Accept a bucket OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `bucket:update` required if the current user is the new owner of the workflow,\notherwise `bucket:update_any` required.","operationId":"Bucket-accept_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket OTR","description":"Delete/Reject a bucket ownership transfer request.\n\nPermission `bucket:update` required if the current user is the current or new owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-delete_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/public":{"patch":{"tags":["Bucket"],"summary":"Update public status","description":"Update the buckets public state.\n\nPermission `bucket:update` required if the current user is the owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-update_bucket_public_state","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_Bucket-update_bucket_public_state"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/limits":{"patch":{"tags":["Bucket"],"summary":"Update bucket limits","description":"Update the buckets size limits.\n\nPermission `bucket:update_any` required.","operationId":"Bucket-update_bucket_limits","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketSizeLimits","description":"New size limits for bucket"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions.","description":"List all the bucket permissions in the system.\n\nPermission `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions","security":[{"Session Token":[]}],"parameters":[{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["BucketPermission"],"summary":"Create a permission.","description":"Create a permission for a bucket and user.\n\nPermission `bucket_permission:create` required.","operationId":"BucketPermission-create_permission","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionIn","description":"Permission to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a user.","description":"List all the bucket permissions for the given user.\n\nPermission `bucket_permission:list` required if current user is the target the bucket permission,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a bucket.","description":"List all the bucket permissions for the given bucket.\n\nPermission `bucket_permission:list` required if current user is owner of the bucket,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per Bucket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get permission for bucket and user combination.","description":"Get the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:read` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:read_any` required.","operationId":"BucketPermission-get_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["BucketPermission"],"summary":"Update a bucket permission","description":"Update a permission for a bucket and user.\n\nPermission `bucket_permission:update` required.","operationId":"BucketPermission-update_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionParameters","description":"Permission to create"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["BucketPermission"],"summary":"Delete a bucket permission","description":"Delete the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:delete` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:delete_any` required.","operationId":"BucketPermission-delete_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows":{"post":{"tags":["Workflow"],"summary":"Create a new workflow","description":"Create a new workflow.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow-create_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowIn","description":"Meta-date for the workflow to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow"],"summary":"List workflows","description":"List all workflows.\n\nPermission `workflow:list` required.","operationId":"Workflow-list_workflows","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter workflows by a substring in their name.","examples":["blast"],"title":"Name Substring"},"description":"Filter workflows by a substring in their name."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`.","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`."},{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowOut"},"title":"Response Workflow-List Workflows"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"List workflow OTRs","description":"Get the ownership transfer requests for workflows.\n\nPermission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `workflow:list_all`","operationId":"Workflow-list_workflow_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Workflow-List Workflow Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/developer_statistics":{"get":{"tags":["Workflow"],"summary":"Get anonymized workflow execution","description":"Get the workflow executions with meta information and anonymized user IDs.\n\nPermission `workflow:read` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:read_any`.","operationId":"Workflow-get_developer_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter by the developer of the workflows","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter by the developer of the workflows"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"description":"Filter by workflow IDs","title":"Workflow Id"},"description":"Filter by workflow IDs"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions after this date","title":"Start"},"description":"Filter by workflow executions after this date"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions before this date","title":"End"},"description":"Filter by workflow executions before this date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnonymizedWorkflowExecution"},"title":"Response Workflow-Get Developer Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}":{"get":{"tags":["Workflow"],"summary":"Get a workflow","description":"Get a specific workflow.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow","description":"Delete a workflow.\n\nPermission `workflow:delete` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:delete_any`.","operationId":"Workflow-delete_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"Get a workflow OTR","description":"Get a specific workflow ownership transfer request.\n\nPermission `workflow:read` required if current user is the current or new owner of the workflow,\notherwise `workflow:read_any` required.","operationId":"Workflow-get_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workflow"],"summary":"Create a workflow OTR","description":"Create a ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the current owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-create_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for workflow OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Workflow"],"summary":"Accept a workflow OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-accept_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow OTR","description":"Delete/Reject a workflow ownership transfer request.\n\nPermission `workflow:update` required if current user is the current or new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-delete_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/statistics":{"get":{"tags":["Workflow"],"summary":"Get statistics for a workflow","description":"Get the number of started workflow per day.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowStatistic"},"title":"Response Workflow-Get Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/update":{"post":{"tags":["Workflow"],"summary":"Update a workflow","description":"Create a new workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow-update_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdate","description":"Meta-data for the workflow version to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions":{"get":{"tags":["Workflow Version"],"summary":"Get all versions of a workflow","description":"List all versions of a Workflow.\n\nPermission `workflow:list` required.","operationId":"Workflow Version-list_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"title":"Response Workflow Version-List Workflow Version"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}":{"get":{"tags":["Workflow Version"],"summary":"Get a workflow version","description":"Get a specific version of a workflow.\n\nPermission `workflow:read` required if the version is public or you are the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit `git_commit_hash` of specific version or `latest`.","examples":["latest","ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit `git_commit_hash` of specific version or `latest`."},{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/status":{"patch":{"tags":["Workflow Version"],"summary":"Update status of workflow version","description":"Update the status of a workflow version.\n\nPermission `workflow:update_status`","operationId":"Workflow Version-update_workflow_version_status","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionStatusSchema","description":"New Status of the workflow version"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/metadata":{"get":{"tags":["Workflow Version"],"summary":"Get metadata of workflow version","description":"Get the metadata of a workflow version.\n\nPermission `workflow:read` required if the current user is the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Version"],"summary":"Update metadata of workflow version","description":"Update the metadata of a workflow version.\n\nPermission `workflow:update` required if the current user is the developer of the workflow,\notherwise `workflow:update_any`","operationId":"Workflow Version-update_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate":{"patch":{"tags":["Workflow Version"],"summary":"Deprecate a workflow version","description":"Deprecate a workflow version.\n\nPermission `workflow:update` required if you are the developer of the workflow,\notherwise `workflow:update_status`","operationId":"Workflow Version-deprecate_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension":{"patch":{"tags":["Workflow Version"],"summary":"Update parameter extension of workflow version","description":"Update the parameter extension of a workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-update_workflow_version_parameter_extension","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParameterExtension-Input","description":"Parameter extension specific for this CloWM instance"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/documentation":{"get":{"tags":["Workflow Version"],"summary":"Fetch documentation for a workflow version","description":"Get the documentation for a specific workflow version.\nStreams the response directly from the right git repository.\n\nPermission `workflow:read` required.","operationId":"Workflow Version-download_workflow_documentation","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."},{"name":"document","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DocumentationEnum","description":"Specify which type of documentation the client wants to fetch","default":"usage.md"},"description":"Specify which type of documentation the client wants to fetch"},{"name":"mode_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Workflow Mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"Workflow Mode"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/icon":{"post":{"tags":["Workflow Version"],"summary":"Upload icon for workflow version","description":"Upload an icon for the workflow version and returns the new icon URL.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-upload_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_Workflow_Version-upload_workflow_version_icon"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Version"],"summary":"Delete icon of workflow version","description":"Delete the icon of the workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-delete_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions":{"post":{"tags":["Workflow Execution"],"summary":"Start a new workflow execution","description":"Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.\n\nPermission `workflow_execution:create` required if workflow versions status is `PUBLISHED`,\notherwise `workflow_execution:create_any` required.","operationId":"Workflow Execution-start_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow Execution"],"summary":"List all workflow executions","description":"Get all workflow executions.\n\nThis endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the\n`Link` header.\nA missing `Link` header indicates that you iterated over all workflow executions with the current filters.\n\nPermission `workflow_execution:list` required, if `executor_id` is the same as the current user,\notherwise `workflow_execution:list_all` required.","operationId":"Workflow Execution-list_workflow_executions","security":[{"Session Token":[]}],"parameters":[{"name":"executor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Executor Id"},"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required."},{"name":"execution_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionStatus"}},{"type":"null"}],"description":"Filter for status of workflow execution","title":"Execution Status"},"description":"Filter for status of workflow execution"},{"name":"workflow_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":40,"maxLength":40,"pattern":"^[0-9a-f]+$"},{"type":"null"}],"description":"Filter for workflow version","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Workflow Version Id"},"description":"Filter for workflow version"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Workflow Id"},"description":"Filter for workflow"},{"name":"start_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started after this UNIX timestamp","examples":[1640991600],"title":"Start After"},"description":"Filter for workflow executions that started after this UNIX timestamp"},{"name":"start_before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started before this UNIX timestamp","examples":[1640991600],"title":"Start Before"},"description":"Filter for workflow executions that started before this UNIX timestamp"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionOut"},"title":"Response Workflow Execution-List Workflow Executions"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/workflow_executions?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/arbitrary":{"post":{"tags":["Workflow Execution"],"summary":"Start a workflow execution with arbitrary git repository","description":"Start a new workflow execution from an arbitrary git repository.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow Execution-start_arbitrary_workflow","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevWorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Session Token":[]}]}},"/ui/workflow_executions/{eid}":{"get":{"tags":["Workflow Execution"],"summary":"Get a workflow execution","description":"Get a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Execution"],"summary":"Delete a workflow execution","description":"Delete a specific workflow execution.\n\nPermission `workflow_execution:delete` required if the current user started the workflow execution,\notherwise `workflow_execution:delete_any` required.","operationId":"Workflow Execution-delete_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/params":{"get":{"tags":["Workflow Execution"],"summary":"Get the parameters of a workflow execution","description":"Get the parameters of a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution_params","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Workflow Execution-Get Workflow Execution Params"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/cancel":{"post":{"tags":["Workflow Execution"],"summary":"Cancel a workflow execution","description":"Cancel a running workflow execution.\n\nPermission `workflow_execution:cancel` required if the current user started the workflow execution,\notherwise `workflow_execution:cancel_any` required.","operationId":"Workflow Execution-cancel_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/credentials":{"get":{"tags":["Workflow Credentials"],"summary":"Get the credentials of a workflow","description":"Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-get_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Credentials"],"summary":"Update the credentials of a workflow","description":"Update the credentials for the repository of a workflow.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-update_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsIn","description":"Updated credentials for the workflow git repository"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Credentials"],"summary":"Delete the credentials of a workflow","description":"Delete the credentials for the repository of a workflow.\n\nPermission `workflow:delete` required if the developer of the workflow is the same as the current user,\nother `workflow:delete_any`.","operationId":"Workflow Credentials-delete_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_modes/{mode_id}":{"get":{"tags":["Workflow Mode"],"summary":"Get workflow mode","description":"Get a workflow mode.\n\nPermission `workflow:read` required","operationId":"Workflow Mode-get_workflow_mode","security":[{"Session Token":[]}],"parameters":[{"name":"mode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"ID of a workflow mode"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowModeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources":{"post":{"tags":["Resource"],"summary":"Request a new resource","description":"Request a new resources.\n\nPermission `resource:create` required.","operationId":"Resource-create_resource","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceIn","description":"Meta-data for the resource to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Resource"],"summary":"List resources","description":"List all resources.\n\nPermission `resource:list` required.","operationId":"Resource-list_resources","security":[{"Session Token":[]}],"parameters":[{"name":"maintainer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Maintainer Id"},"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required."},{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"Filter resources by a substring in their name.","examples":["gtdb"],"title":"Name Substring"},"description":"Filter resources by a substring in their name."},{"name":"public","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter resources to by the public flag","title":"Public"},"description":"Filter resources to by the public flag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceOut"},"title":"Response Resource-List Resources"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/sync_requests":{"get":{"tags":["Resource"],"summary":"List resource sync requests","description":"List all resource sync requests.\n\nPermission `resource:update_any` required.","operationId":"Resource-list_sync_requests","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserSynchronizationRequestOut"},"type":"array","title":"Response Resource-List Sync Requests"}}}}},"security":[{"Session Token":[]}]}},"/ui/resources/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"List resource OTRs","description":"Get the ownership transfer requests for resources.\n\nPermission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `resource:list_all`","operationId":"Resource-list_resource_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Resource-List Resource Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}":{"get":{"tags":["Resource"],"summary":"Get a resource","description":"Get a specific resource.\n\nPermission `resource:read` required.","operationId":"Resource-get_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource","description":"Delete a resources.\n\nPermission `resource:delete` required.","operationId":"Resource-delete_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"Get a resource OTR","description":"Get a specific resource ownership transfer request.\n\nPermission `resource:read` required if the current user is the current or new owner of the resource,\notherwise `resource:read_any` required.","operationId":"Resource-get_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Resource"],"summary":"Create a resource OTR","description":"Create a ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the current owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-create_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the resource OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Resource"],"summary":"Accept a resource OTR","description":"Accept an ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-accept_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource OTR","description":"Delete/Reject a resource ownership transfer request.\n\nPermission `resource:update` required if the current user is the current or new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-delete_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions":{"get":{"tags":["ResourceVersion"],"summary":"List versions of a resource","description":"List all the resource version for a specific resource.\n\nPermission 'resource:read' required.","operationId":"ResourceVersion-list_resource_versions","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionOut"},"title":"Response Resourceversion-List Resource Versions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ResourceVersion"],"summary":"Request new version of a resource","description":"Request a new resource version.\n\nPermission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise.","operationId":"ResourceVersion-request_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionIn","description":"Meta-data for the resource version to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}":{"get":{"tags":["ResourceVersion"],"summary":"Get version of a resource","description":"Get a specific resource version for a specific resource.\n\nPermission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and\nthe current user is not the maintainer, then the permission `resource:read_any` is required.","operationId":"ResourceVersion-get_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/tree":{"get":{"tags":["ResourceVersion"],"summary":"Download folder structure of resource","description":"Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster.\n\nPermission `resource:read` required.","operationId":"ResourceVersion-resource_file_tree","security":[{"Session Token":[]}],"parameters":[{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileTree"},"title":"Response Resourceversion-Resource File Tree"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_review":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version review","description":"Request the review of a resource version.\n\nPermission `resource:update` required.","operationId":"ResourceVersion-request_resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_sync":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version synchronization","description":"Request the synchronization of a resource version to the cluster.\n\nPermission `resource:request_sync` required.","operationId":"ResourceVersion-request_resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSynchronizationRequestIn","description":"Meta-data for the synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/review":{"put":{"tags":["ResourceVersion"],"summary":"Review resource version","description":"Review answer the resource version.\n\nPermission `resource:update_status` required.","operationId":"ResourceVersion-resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer for the resource version review"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/sync":{"put":{"tags":["ResourceVersion"],"summary":"Synchronize resource version with cluster","description":"Synchronize the resource version to the cluster.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer to the resource version synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/latest":{"put":{"tags":["ResourceVersion"],"summary":"Set resource version to latest","description":"Set the resource version as the latest version.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_latest","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/cluster":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version on cluster","description":"Delete the resource version on the cluster.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_cluster","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/s3":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version in S3","description":"Delete the resource version in the S3 bucket.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_s3","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news":{"post":{"tags":["News"],"summary":"Create news","description":"Create a news event.\n\nPermission `news:create` required.","operationId":"News-create_news","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsIn","description":"Meta-data for news event to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["News"],"summary":"List news","description":"List all news events with filters.\n\nThis endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header.\nA missing `Link` header indicates that you iterated over all news with the current filters.\n\nPermission `news:list` required.","operationId":"News-list_news","security":[{"Session Token":[]}],"parameters":[{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967296,"minimum":0},{"type":"null"}],"description":"Filter for news that are created after this UNIX timestamp","title":"Created After"},"description":"Filter for news that are created after this UNIX timestamp"},{"name":"creator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for news created by a specific user","title":"Creator Id"},"description":"Filter for news created by a specific user"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NewsOut"},"title":"Response News-List News"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/news?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news/latest":{"get":{"tags":["News"],"summary":"Get latest news","description":"List the current news events.\n\nPermission `news:list` required.","operationId":"News-list_latest_news","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NewsOut"},"type":"array","title":"Response News-List Latest News"}}}}},"security":[{"Session Token":[]}]}},"/ui/news/{nid}":{"get":{"tags":["News"],"summary":"Get a specific news","description":"Get a specified news event.\n\nPermission `news:read` required.","operationId":"News-get_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["News"],"summary":"Delete a specific news","description":"Delete a specified news event.\n\nPermission `news:delete` required.","operationId":"News-delete_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/public/workflows":{"get":{"tags":["Public"],"summary":"Get available workflows","description":"Public route to fetch all available workflows.","operationId":"Public-get_public_workflows","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PublicWorkflowOut"},"type":"array","title":"Response Public-Get Public Workflows"}}}}}}}},"components":{"schemas":{"AnonymizedWorkflowExecution":{"properties":{"workflow_execution_id":{"type":"string","title":"Workflow Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"pseudo_uid":{"type":"string","title":"Pseudo Uid","description":"Anonymized user ID of the user who ran the workflow execution","examples":["7ed4249857b656e96f456449796e461e6001d3fb2481a44701f70ca437bd53a2"]},"workflow_mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Mode Id","description":"ID of the workflow mode this workflow execution ran in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"workflow_version_id":{"type":"string","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"started_at":{"type":"string","format":"date","title":"Started At","description":"Day of the workflow execution","examples":["2023-01-01"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"developer_id":{"type":"string","title":"Developer Id","description":"ID of developer of the workflow","examples":["28c5353b8bb34984a8bd4169ba94c606"]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"End status of the workflow execution","examples":["SUCCESS"]}},"type":"object","required":["workflow_execution_id","pseudo_uid","workflow_version_id","started_at","workflow_id","developer_id","status"],"title":"AnonymizedWorkflowExecution"},"ApiTokenIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"}},"type":"object","required":["name","scopes"],"title":"ApiTokenIn"},"ApiTokenOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]}},"type":"object","required":["name","scopes","token_id","uid","created_at"],"title":"ApiTokenOut"},"ApiTokenPrivateOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]},"token":{"type":"string","title":"Token","description":"The actual token used for authentication","examples":["J21NRKUYgyVUgvJ3cIdllS-MMa9ny1UDKFF18aetDvo"]}},"type":"object","required":["name","scopes","token_id","uid","created_at","token"],"title":"ApiTokenPrivateOut"},"Body_Bucket-update_bucket_public_state":{"properties":{"public":{"type":"boolean","title":"Public","description":"New public state"}},"type":"object","required":["public"],"title":"Body_Bucket-update_bucket_public_state"},"Body_Workflow_Version-upload_workflow_version_icon":{"properties":{"icon":{"type":"string","format":"binary","title":"Icon","description":"Icon for the Workflow."}},"type":"object","required":["icon"],"title":"Body_Workflow Version-upload_workflow_version_icon"},"BucketIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]}},"type":"object","required":["name","description"],"title":"BucketIn","description":"Schema for creating a new bucket."},"BucketOut":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]},"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]},"owner_id":{"type":"string","title":"Owner Id","description":"UID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"public":{"type":"boolean","title":"Public","description":"Flag if the bucket is anonymously readable"}},"type":"object","required":["name","description","created_at","owner_id","public"],"title":"BucketOut","description":"Schema for answering a request with a bucket."},"BucketPermissionIn":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","format":"uuid","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionIn"},"BucketPermissionOut":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionOut","description":"Schema for the bucket permissions."},"BucketPermissionParameters":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"}},"type":"object","required":["scopes"],"title":"BucketPermissionParameters","description":"Schema for the parameters of a bucket permission."},"BucketSizeLimits":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]}},"type":"object","title":"BucketSizeLimits","description":"Schema to represent bucket limits."},"BucketType":{"type":"string","enum":["OWN","ALL","PERMISSION"],"title":"BucketType","description":"Enumeration for the type of buckets to fetch from the DB\n\nOWN: Only fetch buckets that the user owns\nPERMISSION: Only fetch foreign buckets that the user has access to\nALL: Fetch all buckets that the user has access to"},"DevWorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"mode":{"anyOf":[{"$ref":"#/components/schemas/WorkflowModeIn"},{"type":"null"}],"description":"Mode of the workflow with an alternative entrypoint"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow execution requires"}},"type":"object","required":["parameters","git_commit_hash","repository_url","nextflow_version"],"title":"DevWorkflowExecutionIn"},"DocumentationEnum":{"type":"string","enum":["usage.md","input.md","output.md","changelog.md","parameter_schema.json","clowm_info.json","CITATIONS.md"],"title":"DocumentationEnum"},"FileTree":{"properties":{"type":{"type":"string","enum":["file","directory","link"],"title":"Type"},"name":{"type":"string","title":"Name"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"contents":{"anyOf":[{"items":{"$ref":"#/components/schemas/FileTree"},"type":"array"},{"type":"null"}],"title":"Contents"},"size":{"type":"integer","title":"Size"}},"type":"object","required":["type","name","size"],"title":"FileTree"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IconUpdateOut":{"properties":{"icon_url":{"type":"string","minLength":1,"format":"uri","title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["icon_url"],"title":"IconUpdateOut"},"InstanceSpecificDefaultParameters":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}]},"type":"object"},"NewsIn":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event","default":"system"}},"type":"object","required":["content","title"],"title":"NewsIn"},"NewsOut":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event"},"news_id":{"type":"string","title":"News Id","description":"ID of the news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"]},"creator_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Id","description":"ID of the creator","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]}},"type":"object","required":["content","title","category","news_id","created_at"],"title":"NewsOut"},"NextflowVersion":{"type":"string","enum":["22.10.0","22.10.1","22.10.2","22.10.3","22.10.4","22.10.5","22.10.6","22.10.7","22.10.8","23.04.0","23.04.1","23.04.2","23.04.3","23.04.4","23.04.5","23.10.0","23.10.1","23.10.2","23.10.3","23.10.4","24.04.1","24.04.2","24.04.3","24.04.4","24.10.0"],"title":"NextflowVersion"},"OIDCProvider":{"type":"string","enum":["lifescience-aai","nfdi-aai"],"title":"OIDCProvider"},"OwnershipTransferRequestIn":{"properties":{"new_owner_uid":{"type":"string","format":"uuid","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Comment","description":"An optional comment for the transfer request","examples":["This is an example comment"]}},"type":"object","required":["new_owner_uid"],"title":"OwnershipTransferRequestIn"},"OwnershipTransferRequestOut":{"properties":{"new_owner_uid":{"type":"string","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"type":"string","title":"Comment","description":"An optional comment for the transfer request","default":"","examples":["This is an example comment"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Time when the ownership transfer was requested as UNIX timestamp","examples":[1640991600]},"current_owner_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Owner Uid","description":"The current uid of the current owner if he exists","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"target_id":{"type":"string","title":"Target Id","description":"Id of the target that gets its ownership transferred"},"target_name":{"type":"string","title":"Target Name","description":"Name of the target","examples":["example-bucket","Example Workflow","Example Resource"]},"target_description":{"type":"string","title":"Target Description","description":"Description of then target","examples":["Some long description of a target"]},"target_type":{"$ref":"#/components/schemas/OwnershipTypeEnum","description":"Target type of the ownership transfer","examples":["bucket"]}},"type":"object","required":["new_owner_uid","created_at","target_id","target_name","target_description","target_type"],"title":"OwnershipTransferRequestOut"},"OwnershipTypeEnum":{"type":"string","enum":["bucket","workflow","resource"],"title":"OwnershipTypeEnum"},"ParameterExtension-Input":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterExtension-Output":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterVisibility":{"type":"integer","enum":[10,20,30,40],"title":"ParameterVisibility"},"ParameterVisibilityMapping":{"additionalProperties":{"$ref":"#/components/schemas/ParameterVisibility"},"type":"object"},"PermissionStatus":{"type":"string","enum":["ACTIVE","INACTIVE"],"title":"PermissionStatus","description":"Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the\npermission itself has a time limit and the current time is not in the timespan."},"PublicWorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"latest_git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Latest Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"latest_version_tag":{"type":"string","maxLength":10,"minLength":5,"title":"Latest Version Tag","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"developer":{"type":"string","title":"Developer","description":"Name of the developer","default":"","examples":["Bilbo Baggins"]},"latest_version_timestamp":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Latest Version Timestamp","description":"Timestamp when the last version was created as UNIX timestamp","examples":[1640991600]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the workflow icon","readOnly":true,"examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["name","short_description","repository_url","workflow_id","latest_git_commit_hash","latest_version_tag","latest_version_timestamp","icon_url"],"title":"PublicWorkflowOut"},"ResourceIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true}},"type":"object","required":["release","name","description","source"],"title":"ResourceIn"},"ResourceOut":{"properties":{"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"maintainer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maintainer Id","description":"ID of the maintainer","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"versions":{"items":{"$ref":"#/components/schemas/ResourceVersionOut"},"type":"array","title":"Versions","description":"Versions of the resource"}},"type":"object","required":["name","description","source","resource_id","maintainer_id","versions"],"title":"ResourceOut"},"ResourceVersionIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]}},"type":"object","required":["release"],"title":"ResourceVersionIn"},"ResourceVersionOut":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"status":{"$ref":"#/components/schemas/ResourceVersionStatus","description":"Status of the resource version"},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1672527600]},"compressed_size":{"type":"integer","maximum":1.8446744073709552e+19,"minimum":0.0,"title":"Compressed Size","description":"Size of the compressed resource in bytes","examples":[42097156608]},"cluster_path":{"type":"string","title":"Cluster Path","description":"Path to the resource on the cluster if the resource is synchronized","readOnly":true,"examples":["/vol/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4","/vol/resources/CLDB-0e240ccd/latest"]},"s3_path":{"type":"string","title":"S3 Path","description":"Path to the resource in the S3 Bucket. Not publicly available.","readOnly":true,"examples":["s3://clowm-data/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4/resource.tar.gz"]}},"type":"object","required":["release","status","resource_version_id","resource_id","created_at","compressed_size","cluster_path","s3_path"],"title":"ResourceVersionOut"},"ResourceVersionStatus":{"type":"string","enum":["RESOURCE_REQUESTED","WAIT_FOR_REVIEW","DENIED","APPROVED","SYNC_REQUESTED","SYNCHRONIZING","SYNC_ERROR","SYNCHRONIZED","SETTING_LATEST","LATEST","CLUSTER_DELETING","CLUSTER_DELETE_ERROR","S3_DELETING","S3_DELETE_ERROR","S3_DELETED"],"title":"ResourceVersionStatus","description":"Enumeration for the possible status of a resource version."},"RoleEnum":{"type":"string","enum":["administrator","user","reviewer","developer","db_maintainer"],"title":"RoleEnum"},"S3Key":{"properties":{"uid":{"type":"string","title":"Uid","description":"UID of the user of that access key","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"access_key":{"type":"string","title":"Access Key","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"]},"secret_key":{"type":"string","title":"Secret Key","description":"Secret of the S3 access key","examples":["2F5uNTI1qvt4oAroXV0wWct8rWclL2QvFXKqSqjS"]}},"type":"object","required":["uid","access_key","secret_key"],"title":"S3Key","description":"Schema for a S3 key associated with a user."},"UserIn":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","examples":[["user"]]},"email":{"type":"string","format":"email","title":"Email","description":"Email of the user","examples":["user@example.org"]}},"type":"object","required":["display_name","email"],"title":"UserIn"},"UserOut":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["display_name","uid"],"title":"UserOut","description":"Schema for a user."},"UserOutExtended":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]},"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"lifescience_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifescience Id","description":"Lifesicence AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"nfdi_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nfdi Id","description":"NFDI AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"invitation_token_created_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invitation Token Created At","description":"Timestamp when the invitation token was created as UNIX timestamp"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email","description":"Email of the user","examples":["user@example.org"]},"gravatar_url":{"type":"string","minLength":1,"format":"uri","title":"Gravatar Url","description":"URL to the gravatar avatar based on the users email","readOnly":true,"examples":["https://gravatar.com/avatar/87a8c45825eb709ee8e453d2c0f8154e1b9bf4b45bb9b81b7662177340aa9d38"]}},"type":"object","required":["roles","display_name","uid","gravatar_url"],"title":"UserOutExtended"},"UserRequestAnswer":{"properties":{"deny":{"type":"boolean","title":"Deny","description":"Flag to indicate if the request was denied.","default":false},"reason":{"anyOf":[{"type":"string","maxLength":512,"minLength":16},{"type":"null"}],"title":"Reason","description":"Reason why the request was denied or approved. Required if request is denied."}},"type":"object","title":"UserRequestAnswer"},"UserRoles":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]}},"type":"object","required":["roles"],"title":"UserRoles"},"UserSynchronizationRequestIn":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]}},"type":"object","required":["reason"],"title":"UserSynchronizationRequestIn"},"UserSynchronizationRequestOut":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"requester_id":{"type":"string","title":"Requester Id","description":"ID of the user that requested this resource synchronization","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["reason","resource_version_id","resource_id","requester_id"],"title":"UserSynchronizationRequestOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkflowCredentialsIn":{"properties":{"token":{"type":"string","maxLength":128,"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","required":["token"],"title":"WorkflowCredentialsIn"},"WorkflowCredentialsOut":{"properties":{"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","title":"WorkflowCredentialsOut"},"WorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["parameters","workflow_version_id"],"title":"WorkflowExecutionIn"},"WorkflowExecutionOut":{"properties":{"workflow_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"execution_id":{"type":"string","title":"Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"executor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executor Id","description":"UID of user who started the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"start_time":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Start Time","description":"Start time of the workflow execution as UNIX timestamp","examples":[1640991600]},"end_time":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"End Time","description":"End time of the workflow execution as UNIX timestamp","examples":[1640991600]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"Status of the workflow execution","examples":["RUNNING"]},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id","description":"Id of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"logs_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where logs and reports are saved.","examples":["s3://example-bucket/logs/run-591b6a6ea1f0420d8a20a7a60704f695"]},"provenance_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where provenance information is saved.","examples":["s3://example-bucket/provenance/run-591b6a6ea1f0420d8a20a7a60704f695"]},"debug_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where debug information from Nextflow is saved.","examples":["s3://example-bucket/debug/run-591b6a6ea1f0420d8a20a7a60704f695"]},"cpu_time":{"type":"string","format":"duration","title":"Cpu Time","description":"The consumed cpu time in ISO 8601 format","examples":["P4DT12H30M5S"]}},"type":"object","required":["execution_id","start_time","status","cpu_time"],"title":"WorkflowExecutionOut"},"WorkflowExecutionStatus":{"type":"string","enum":["PENDING","SCHEDULED","RUNNING","CANCELED","SUCCESS","ERROR"],"title":"WorkflowExecutionStatus","description":"Enumeration for the status on a workflow execution."},"WorkflowIn":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"initial_version":{"type":"string","maxLength":10,"minLength":5,"title":"Initial Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","maxItems":10,"title":"Modes","description":"List of modes with alternative entrypoint the new workflow has","default":[]},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["name","short_description","repository_url","git_commit_hash","initial_version","nextflow_version"],"title":"WorkflowIn"},"WorkflowModeIn":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]}},"type":"object","required":["schema_path","entrypoint","name"],"title":"WorkflowModeIn"},"WorkflowModeOut":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]},"mode_id":{"type":"string","title":"Mode Id","description":"ID of the workflow mode","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["schema_path","entrypoint","name","mode_id"],"title":"WorkflowModeOut"},"WorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"versions":{"items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"type":"array","title":"Versions","description":"Versions of the workflow"},"developer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Developer Id","description":"ID of developer of the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"private":{"type":"boolean","title":"Private","description":"Flag if the workflow is hosted in a private git repository","default":false}},"type":"object","required":["name","short_description","repository_url","workflow_id","versions"],"title":"WorkflowOut"},"WorkflowStatistic":{"properties":{"day":{"type":"string","format":"date","title":"Day","description":"Day of the datapoint","examples":["2023-01-01"]},"count":{"type":"integer","title":"Count","description":"Number of started workflows on that day","examples":[1]}},"type":"object","required":["day","count"],"title":"WorkflowStatistic"},"WorkflowUpdate":{"properties":{"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"append_modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","title":"Append Modes","description":"Add modes to the new workflow version"},"delete_modes":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Delete Modes","description":"Delete modes for the new workflow version.","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["version","git_commit_hash"],"title":"WorkflowUpdate"},"WorkflowVersionMetadataIn":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataIn"},"WorkflowVersionMetadataOut":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataOut"},"WorkflowVersionOut":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the corresponding workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1640991600]},"modes":{"items":{"type":"string"},"type":"array","title":"Modes","description":"Optional modes his workflow version has","default":[],"examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"parameter_extension":{"anyOf":[{"$ref":"#/components/schemas/ParameterExtension-Output"},{"type":"null"}],"description":"Parameter extension specific for this CloWM instance"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["status","workflow_id","version","workflow_version_id","created_at","nextflow_version"],"title":"WorkflowVersionOut"},"WorkflowVersionStatus":{"type":"string","enum":["CREATED","DENIED","PUBLISHED","DEPRECATED"],"title":"WorkflowVersionStatus","description":"Enumeration for the possible status of a workflow version."},"WorkflowVersionStatusSchema":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]}},"type":"object","required":["status"],"title":"WorkflowVersionStatusSchema"}},"securitySchemes":{"Session Token":{"type":"apiKey","description":"The JWT in this cookie is used by the website and should not be used when communicating directly with the API.","in":"cookie","name":"clowm-jwt"}}}}
\ No newline at end of file
+{"openapi":"3.1.0","info":{"title":"CloWM UI API","description":"This is the API for the CloWM UI. It is only for internal use and will change without prior notice.","version":"1.0"},"servers":[{"url":"/api"}],"paths":{"/auth/login/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the login flow","description":"Redirect route to OIDC provider to kickstart the login process.","operationId":"Auth-kickstart_login","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"},{"name":"invitation_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":43,"maxLength":43},{"type":"null"}],"description":"Unique token to validate an invitation","title":"Invitation Token"},"description":"Unique token to validate an invitation"},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Will be appended to redirect response in the callback route as URL query parameter `next`","title":"Next"},"description":"Will be appended to redirect response in the callback route as URL query parameter `next`"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the login process with an OIDC Provider.\n\nVisit the route login route to start the login process.\n\nIf the user is already known to the system, then a JWT token will be created and sent via the 'set-cookie' header.\nThe key for this Cookie is 'bearer'.\n\nIf the user is new, he will be created him and then a JWT token is issued.\n\nThis JWT has to be sent to all authorized endpoints via the HTTPBearer scheme.","operationId":"Auth-login_callback","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=fake-jwt-cookie; Domain=localhost; Max-Age=691200; Path=/; SameSite=strict; Secure"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/connect/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the account connection flow","description":"Redirect route to OIDC provider to connect the CloWM account with the AAI account.","operationId":"Auth-kickstart_account_connection","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the account connection process with an OIDC provider.","operationId":"Auth-account_connection_callback","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"get":{"tags":["Auth"],"summary":"Logout","description":"Logout the user from the system by deleting the bearer cookie.","operationId":"Auth-logout","responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=; Domain=localhost; Max-Age=0; Path=/; SameSite=strict; Secure"}}}}}}},"/ui/tokens":{"get":{"tags":["APIToken"],"summary":"List API token","description":"List meta information about all API token.\n\nPermissions `api_token:list_all` required. See parameter `uid` for exception.","operationId":"APIToken-list_token","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiTokenOut"},"title":"Response Apitoken-List Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["APIToken"],"summary":"Create new API token","description":"Create a new API token for the current user.\n\nPermission `api_token:create` required.","operationId":"APIToken-create_token","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenIn","description":"Meta-data for Api token to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenPrivateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/tokens/{tid}":{"get":{"tags":["APIToken"],"summary":"Get API token","description":"Get an API token by id.\n\nPermission `api_token:read` required if the current user is the owner of the API token,\notherwise `api_token:read_any` required.","operationId":"APIToken-get_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["APIToken"],"summary":"Delete API token","description":"Delete an API token by id.\n\nPermission `api_token:delete` required if the current user is the owner of the API token,\notherwise `api_token:delete_any` required.","operationId":"APIToken-delete_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users":{"post":{"tags":["User"],"summary":"Create User","description":"Create a new user in the system and notify him.\n\nPermission `user:create` required.","operationId":"User-create_user","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserIn","description":"Meta-data for user to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["User"],"summary":"List users and search by their name","description":"List all users in the system..\n\nPermission `user:list` required.","operationId":"User-list_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter users by a substring in their name.","examples":["Bilbo"],"title":"Name Substring"},"description":"Filter users by a substring in their name."},{"name":"filter_roles","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/RoleEnum"}},{"type":"null"}],"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression.","title":"Filter Roles"},"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOutExtended"},"title":"Response User-List Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/search":{"get":{"tags":["User"],"summary":"Search Users","description":"Search for users in the system by their name.\n\nPermission `user: search` required.","operationId":"User-search_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":30,"description":"Filter users by a substring in their name.","title":"Name Substring"},"description":"Filter users by a substring in their name."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOut"},"title":"Response User-Search Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/me":{"get":{"tags":["User"],"summary":"Get the logged in user","description":"Return the user associated with the used JWT.\n\nPermission `user:read` required.","operationId":"User-get_logged_in_user","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}}},"security":[{"Session Token":[]}]}},"/ui/users/{uid}":{"get":{"tags":["User"],"summary":"Get a user by its uid","description":"Return the user with the specific uid.\n\nPermission `user:read` required.","operationId":"User-get_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["User"],"summary":"Delete a user","description":"Delete a user and his S3 account.\n\nPermission `user:delete` required if the current user is the target user.","operationId":"User-delete_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/roles":{"put":{"tags":["User"],"summary":"Update user roles","description":"Update the roles of a user.\n\nPermission `user:update` required.","operationId":"User-update_roles","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRoles","description":"The new roles of the user"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/invitation":{"patch":{"tags":["User"],"summary":"Resend Invitation","description":"Resend the invitation link for an user that has an open invitation.\n\nPermission `user:create` required.","operationId":"User-resend_invitation","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys":{"get":{"tags":["S3Key"],"summary":"Get the S3 Access keys from a user","description":"Get all the S3 Access keys for a specific user.\n\nPermission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required.","operationId":"S3Key-get_user_keys","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/S3Key"},"title":"Response S3Key-Get User Keys"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["S3Key"],"summary":"Create a Access key for a user","description":"Create a S3 Access key for a specific user.\n\nPermission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required.","operationId":"S3Key-create_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys/{access_id}":{"get":{"tags":["S3Key"],"summary":"Get a specific S3 Access key from a user","description":"Get a specific S3 Access Key for a specific user.\n\nPermission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required.","operationId":"S3Key-get_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["S3Key"],"summary":"Delete a specific S3 Access key from a user","description":"Delete a specific S3 Access key for a specific user.\n\nPermission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.","operationId":"S3Key-delete_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets":{"get":{"tags":["Bucket"],"summary":"List buckets","description":"List all the buckets in the system or of the desired user where the user has permissions for.\n\nPermission `bucket:list_all` required. See parameter `owner_id` for exception.","operationId":"Bucket-list_buckets","security":[{"Session Token":[]}],"parameters":[{"name":"owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Owner Id"},"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target."},{"name":"bucket_type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/BucketType","description":"Type of the bucket to get. Ignored when `user` parameter not set","default":"ALL"},"description":"Type of the bucket to get. Ignored when `user` parameter not set"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketOut"},"title":"Response Bucket-List Buckets"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket for the current user","description":"Create a bucket for the current user.\n\nThe name of the bucket has some constraints.\nFor more information see the\n[Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints)\n\nPermission `bucket:create` required.","operationId":"Bucket-create_bucket","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketIn","description":"Meta-data for bucket to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"List bucket OTRs","description":"Get the ownership transfer requests for buckets.\n\nPermission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `bucket:list_all`","operationId":"Bucket-list_bucket_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Bucket-List Bucket Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}":{"get":{"tags":["Bucket"],"summary":"Get a bucket by its name","description":"Get a bucket by its name if the current user has READ permissions for the bucket.\n\nPermission `bucket:read` required if the current user is the owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket","description":"Delete a bucket by its name. Only the owner of the bucket can delete the bucket.\n\nPermission `bucket:delete` required if the current user is the owner of the bucket,\notherwise `bucket:delete_any` required.","operationId":"Bucket-delete_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"force_delete","in":"query","required":false,"schema":{"type":"boolean","description":"Delete even non-empty bucket","default":false,"title":"Force Delete"},"description":"Delete even non-empty bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"Get a bucket OTR","description":"Get a specific bucket ownership transfer request.\n\nPermission `bucket:read` required if the current user is the current or new owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket OTR","description":"Create a ownership transfer request for a specific bucket.\n\nPermission `bucket:update` required if the current user is the current owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-create_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the bucket OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Bucket"],"summary":"Accept a bucket OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `bucket:update` required if the current user is the new owner of the workflow,\notherwise `bucket:update_any` required.","operationId":"Bucket-accept_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket OTR","description":"Delete/Reject a bucket ownership transfer request.\n\nPermission `bucket:update` required if the current user is the current or new owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-delete_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/public":{"patch":{"tags":["Bucket"],"summary":"Update public status","description":"Update the buckets public state.\n\nPermission `bucket:update` required if the current user is the owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-update_bucket_public_state","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_Bucket-update_bucket_public_state"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/limits":{"patch":{"tags":["Bucket"],"summary":"Update bucket limits","description":"Update the buckets size limits.\n\nPermission `bucket:update_any` required.","operationId":"Bucket-update_bucket_limits","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketSizeLimits","description":"New size limits for bucket"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions.","description":"List all the bucket permissions in the system.\n\nPermission `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions","security":[{"Session Token":[]}],"parameters":[{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["BucketPermission"],"summary":"Create a permission.","description":"Create a permission for a bucket and user.\n\nPermission `bucket_permission:create` required.","operationId":"BucketPermission-create_permission","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionIn","description":"Permission to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a user.","description":"List all the bucket permissions for the given user.\n\nPermission `bucket_permission:list` required if current user is the target the bucket permission,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a bucket.","description":"List all the bucket permissions for the given bucket.\n\nPermission `bucket_permission:list` required if current user is owner of the bucket,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per Bucket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get permission for bucket and user combination.","description":"Get the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:read` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:read_any` required.","operationId":"BucketPermission-get_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["BucketPermission"],"summary":"Update a bucket permission","description":"Update a permission for a bucket and user.\n\nPermission `bucket_permission:update` required.","operationId":"BucketPermission-update_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionParameters","description":"Permission to create"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["BucketPermission"],"summary":"Delete a bucket permission","description":"Delete the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:delete` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:delete_any` required.","operationId":"BucketPermission-delete_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows":{"post":{"tags":["Workflow"],"summary":"Create a new workflow","description":"Create a new workflow.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow-create_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowIn","description":"Meta-date for the workflow to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow"],"summary":"List workflows","description":"List all workflows.\n\nPermission `workflow:list` required.","operationId":"Workflow-list_workflows","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter workflows by a substring in their name.","examples":["blast"],"title":"Name Substring"},"description":"Filter workflows by a substring in their name."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`.","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`."},{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowOut"},"title":"Response Workflow-List Workflows"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"List workflow OTRs","description":"Get the ownership transfer requests for workflows.\n\nPermission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `workflow:list_all`","operationId":"Workflow-list_workflow_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Workflow-List Workflow Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/developer_statistics":{"get":{"tags":["Workflow"],"summary":"Get anonymized workflow execution","description":"Get the workflow executions with meta information and anonymized user IDs.\n\nPermission `workflow:read` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:read_any`.","operationId":"Workflow-get_developer_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter by the developer of the workflows","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter by the developer of the workflows"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"description":"Filter by workflow IDs","title":"Workflow Id"},"description":"Filter by workflow IDs"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions after this date","title":"Start"},"description":"Filter by workflow executions after this date"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions before this date","title":"End"},"description":"Filter by workflow executions before this date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnonymizedWorkflowExecution"},"title":"Response Workflow-Get Developer Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}":{"get":{"tags":["Workflow"],"summary":"Get a workflow","description":"Get a specific workflow.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow","description":"Delete a workflow.\n\nPermission `workflow:delete` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:delete_any`.","operationId":"Workflow-delete_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"Get a workflow OTR","description":"Get a specific workflow ownership transfer request.\n\nPermission `workflow:read` required if current user is the current or new owner of the workflow,\notherwise `workflow:read_any` required.","operationId":"Workflow-get_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workflow"],"summary":"Create a workflow OTR","description":"Create a ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the current owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-create_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for workflow OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Workflow"],"summary":"Accept a workflow OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-accept_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow OTR","description":"Delete/Reject a workflow ownership transfer request.\n\nPermission `workflow:update` required if current user is the current or new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-delete_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/statistics":{"get":{"tags":["Workflow"],"summary":"Get statistics for a workflow","description":"Get the number of started workflow per day.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowStatistic"},"title":"Response Workflow-Get Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/update":{"post":{"tags":["Workflow"],"summary":"Update a workflow","description":"Create a new workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow-update_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdate","description":"Meta-data for the workflow version to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions":{"get":{"tags":["Workflow Version"],"summary":"Get all versions of a workflow","description":"List all versions of a Workflow.\n\nPermission `workflow:list` required.","operationId":"Workflow Version-list_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"title":"Response Workflow Version-List Workflow Version"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}":{"get":{"tags":["Workflow Version"],"summary":"Get a workflow version","description":"Get a specific version of a workflow.\n\nPermission `workflow:read` required if the version is public or you are the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit `git_commit_hash` of specific version or `latest`.","examples":["latest","ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit `git_commit_hash` of specific version or `latest`."},{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/status":{"patch":{"tags":["Workflow Version"],"summary":"Update status of workflow version","description":"Update the status of a workflow version.\n\nPermission `workflow:update_status`","operationId":"Workflow Version-update_workflow_version_status","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionStatusSchema","description":"New Status of the workflow version"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/metadata":{"get":{"tags":["Workflow Version"],"summary":"Get metadata of workflow version","description":"Get the metadata of a workflow version.\n\nPermission `workflow:read` required if the current user is the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Version"],"summary":"Update metadata of workflow version","description":"Update the metadata of a workflow version.\n\nPermission `workflow:update` required if the current user is the developer of the workflow,\notherwise `workflow:update_any`","operationId":"Workflow Version-update_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate":{"patch":{"tags":["Workflow Version"],"summary":"Deprecate a workflow version","description":"Deprecate a workflow version.\n\nPermission `workflow:update` required if you are the developer of the workflow,\notherwise `workflow:update_status`","operationId":"Workflow Version-deprecate_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension":{"patch":{"tags":["Workflow Version"],"summary":"Update parameter extension of workflow version","description":"Update the parameter extension of a workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-update_workflow_version_parameter_extension","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParameterExtension-Input","description":"Parameter extension specific for this CloWM instance"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/documentation":{"get":{"tags":["Workflow Version"],"summary":"Fetch documentation for a workflow version","description":"Get the documentation for a specific workflow version.\nStreams the response directly from the right git repository.\n\nPermission `workflow:read` required.","operationId":"Workflow Version-download_workflow_documentation","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."},{"name":"document","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DocumentationEnum","description":"Specify which type of documentation the client wants to fetch","default":"usage.md"},"description":"Specify which type of documentation the client wants to fetch"},{"name":"mode_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Workflow Mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"Workflow Mode"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/icon":{"post":{"tags":["Workflow Version"],"summary":"Upload icon for workflow version","description":"Upload an icon for the workflow version and returns the new icon URL.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-upload_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_Workflow_Version-upload_workflow_version_icon"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Version"],"summary":"Delete icon of workflow version","description":"Delete the icon of the workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-delete_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions":{"post":{"tags":["Workflow Execution"],"summary":"Start a new workflow execution","description":"Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.\n\nPermission `workflow_execution:create` required if workflow versions status is `PUBLISHED`,\notherwise `workflow_execution:create_any` required.","operationId":"Workflow Execution-start_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow Execution"],"summary":"List all workflow executions","description":"Get all workflow executions.\n\nThis endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the\n`Link` header.\nA missing `Link` header indicates that you iterated over all workflow executions with the current filters.\n\nPermission `workflow_execution:list` required, if `executor_id` is the same as the current user,\notherwise `workflow_execution:list_all` required.","operationId":"Workflow Execution-list_workflow_executions","security":[{"Session Token":[]}],"parameters":[{"name":"executor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Executor Id"},"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required."},{"name":"execution_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionStatus"}},{"type":"null"}],"description":"Filter for status of workflow execution","title":"Execution Status"},"description":"Filter for status of workflow execution"},{"name":"workflow_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":40,"maxLength":40,"pattern":"^[0-9a-f]+$"},{"type":"null"}],"description":"Filter for workflow version","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Workflow Version Id"},"description":"Filter for workflow version"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Workflow Id"},"description":"Filter for workflow"},{"name":"start_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started after this UNIX timestamp","examples":[1640991600],"title":"Start After"},"description":"Filter for workflow executions that started after this UNIX timestamp"},{"name":"start_before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started before this UNIX timestamp","examples":[1640991600],"title":"Start Before"},"description":"Filter for workflow executions that started before this UNIX timestamp"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionOut"},"title":"Response Workflow Execution-List Workflow Executions"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/workflow_executions?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/arbitrary":{"post":{"tags":["Workflow Execution"],"summary":"Start a workflow execution with arbitrary git repository","description":"Start a new workflow execution from an arbitrary git repository.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow Execution-start_arbitrary_workflow","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevWorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Session Token":[]}]}},"/ui/workflow_executions/{eid}":{"get":{"tags":["Workflow Execution"],"summary":"Get a workflow execution","description":"Get a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Execution"],"summary":"Delete a workflow execution","description":"Delete a specific workflow execution.\n\nPermission `workflow_execution:delete` required if the current user started the workflow execution,\notherwise `workflow_execution:delete_any` required.","operationId":"Workflow Execution-delete_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/params":{"get":{"tags":["Workflow Execution"],"summary":"Get the parameters of a workflow execution","description":"Get the parameters of a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution_params","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Workflow Execution-Get Workflow Execution Params"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/cancel":{"post":{"tags":["Workflow Execution"],"summary":"Cancel a workflow execution","description":"Cancel a running workflow execution.\n\nPermission `workflow_execution:cancel` required if the current user started the workflow execution,\notherwise `workflow_execution:cancel_any` required.","operationId":"Workflow Execution-cancel_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/credentials":{"get":{"tags":["Workflow Credentials"],"summary":"Get the credentials of a workflow","description":"Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-get_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Credentials"],"summary":"Update the credentials of a workflow","description":"Update the credentials for the repository of a workflow.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-update_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsIn","description":"Updated credentials for the workflow git repository"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Credentials"],"summary":"Delete the credentials of a workflow","description":"Delete the credentials for the repository of a workflow.\n\nPermission `workflow:delete` required if the developer of the workflow is the same as the current user,\nother `workflow:delete_any`.","operationId":"Workflow Credentials-delete_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_modes/{mode_id}":{"get":{"tags":["Workflow Mode"],"summary":"Get workflow mode","description":"Get a workflow mode.\n\nPermission `workflow:read` required","operationId":"Workflow Mode-get_workflow_mode","security":[{"Session Token":[]}],"parameters":[{"name":"mode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"ID of a workflow mode"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowModeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources":{"post":{"tags":["Resource"],"summary":"Request a new resource","description":"Request a new resources.\n\nPermission `resource:create` required.","operationId":"Resource-create_resource","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceIn","description":"Meta-data for the resource to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Resource"],"summary":"List resources","description":"List all resources.\n\nPermission `resource:list` required.","operationId":"Resource-list_resources","security":[{"Session Token":[]}],"parameters":[{"name":"maintainer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Maintainer Id"},"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required."},{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"Filter resources by a substring in their name.","examples":["gtdb"],"title":"Name Substring"},"description":"Filter resources by a substring in their name."},{"name":"public","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter resources to by the public flag","title":"Public"},"description":"Filter resources to by the public flag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceOut"},"title":"Response Resource-List Resources"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/sync_requests":{"get":{"tags":["Resource"],"summary":"List resource sync requests","description":"List all resource sync requests.\n\nPermission `resource:update_any` required.","operationId":"Resource-list_sync_requests","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserSynchronizationRequestOut"},"type":"array","title":"Response Resource-List Sync Requests"}}}}},"security":[{"Session Token":[]}]}},"/ui/resources/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"List resource OTRs","description":"Get the ownership transfer requests for resources.\n\nPermission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `resource:list_all`","operationId":"Resource-list_resource_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Resource-List Resource Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}":{"get":{"tags":["Resource"],"summary":"Get a resource","description":"Get a specific resource.\n\nPermission `resource:read` required.","operationId":"Resource-get_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource","description":"Delete a resources.\n\nPermission `resource:delete` required.","operationId":"Resource-delete_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"Get a resource OTR","description":"Get a specific resource ownership transfer request.\n\nPermission `resource:read` required if the current user is the current or new owner of the resource,\notherwise `resource:read_any` required.","operationId":"Resource-get_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Resource"],"summary":"Create a resource OTR","description":"Create a ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the current owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-create_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the resource OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Resource"],"summary":"Accept a resource OTR","description":"Accept an ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-accept_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource OTR","description":"Delete/Reject a resource ownership transfer request.\n\nPermission `resource:update` required if the current user is the current or new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-delete_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions":{"get":{"tags":["ResourceVersion"],"summary":"List versions of a resource","description":"List all the resource version for a specific resource.\n\nPermission 'resource:read' required.","operationId":"ResourceVersion-list_resource_versions","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionOut"},"title":"Response Resourceversion-List Resource Versions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ResourceVersion"],"summary":"Request new version of a resource","description":"Request a new resource version.\n\nPermission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise.","operationId":"ResourceVersion-request_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionIn","description":"Meta-data for the resource version to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}":{"get":{"tags":["ResourceVersion"],"summary":"Get version of a resource","description":"Get a specific resource version for a specific resource.\n\nPermission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and\nthe current user is not the maintainer, then the permission `resource:read_any` is required.","operationId":"ResourceVersion-get_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/tree":{"get":{"tags":["ResourceVersion"],"summary":"Download folder structure of resource","description":"Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster.\n\nPermission `resource:read` required.","operationId":"ResourceVersion-resource_file_tree","security":[{"Session Token":[]}],"parameters":[{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileTree"},"title":"Response Resourceversion-Resource File Tree"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_review":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version review","description":"Request the review of a resource version.\n\nPermission `resource:update` required.","operationId":"ResourceVersion-request_resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_sync":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version synchronization","description":"Request the synchronization of a resource version to the cluster.\n\nPermission `resource:request_sync` required.","operationId":"ResourceVersion-request_resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSynchronizationRequestIn","description":"Meta-data for the synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/review":{"put":{"tags":["ResourceVersion"],"summary":"Review resource version","description":"Review answer the resource version.\n\nPermission `resource:update_status` required.","operationId":"ResourceVersion-resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer for the resource version review"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/sync":{"put":{"tags":["ResourceVersion"],"summary":"Synchronize resource version with cluster","description":"Synchronize the resource version to the cluster.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer to the resource version synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/latest":{"put":{"tags":["ResourceVersion"],"summary":"Set resource version to latest","description":"Set the resource version as the latest version.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_latest","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/cluster":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version on cluster","description":"Delete the resource version on the cluster.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_cluster","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/s3":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version in S3","description":"Delete the resource version in the S3 bucket.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_s3","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news":{"post":{"tags":["News"],"summary":"Create news","description":"Create a news event.\n\nPermission `news:create` required.","operationId":"News-create_news","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsIn","description":"Meta-data for news event to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["News"],"summary":"List news","description":"List all news events with filters.\n\nThis endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header.\nA missing `Link` header indicates that you iterated over all news with the current filters.\n\nPermission `news:list` required.","operationId":"News-list_news","security":[{"Session Token":[]}],"parameters":[{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967296,"minimum":0},{"type":"null"}],"description":"Filter for news that are created after this UNIX timestamp","title":"Created After"},"description":"Filter for news that are created after this UNIX timestamp"},{"name":"creator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for news created by a specific user","title":"Creator Id"},"description":"Filter for news created by a specific user"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NewsOut"},"title":"Response News-List News"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/news?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news/latest":{"get":{"tags":["News"],"summary":"Get latest news","description":"List the current news events.\n\nPermission `news:list` required.","operationId":"News-list_latest_news","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NewsOut"},"type":"array","title":"Response News-List Latest News"}}}}},"security":[{"Session Token":[]}]}},"/ui/news/{nid}":{"get":{"tags":["News"],"summary":"Get a specific news","description":"Get a specified news event.\n\nPermission `news:read` required.","operationId":"News-get_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["News"],"summary":"Delete a specific news","description":"Delete a specified news event.\n\nPermission `news:delete` required.","operationId":"News-delete_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/public/workflows":{"get":{"tags":["Public"],"summary":"Get available workflows","description":"Public route to fetch all available workflows.","operationId":"Public-get_public_workflows","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PublicWorkflowOut"},"type":"array","title":"Response Public-Get Public Workflows"}}}}}}}},"components":{"schemas":{"AnonymizedWorkflowExecution":{"properties":{"workflow_execution_id":{"type":"string","title":"Workflow Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"pseudo_uid":{"type":"string","title":"Pseudo Uid","description":"Anonymized user ID of the user who ran the workflow execution","examples":["7ed4249857b656e96f456449796e461e6001d3fb2481a44701f70ca437bd53a2"]},"workflow_mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Mode Id","description":"ID of the workflow mode this workflow execution ran in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"workflow_version_id":{"type":"string","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"started_at":{"type":"string","format":"date","title":"Started At","description":"Day of the workflow execution","examples":["2023-01-01"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"developer_id":{"type":"string","title":"Developer Id","description":"ID of developer of the workflow","examples":["28c5353b8bb34984a8bd4169ba94c606"]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"End status of the workflow execution","examples":["SUCCESS"]}},"type":"object","required":["workflow_execution_id","pseudo_uid","workflow_version_id","started_at","workflow_id","developer_id","status"],"title":"AnonymizedWorkflowExecution"},"ApiTokenIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"}},"type":"object","required":["name","scopes"],"title":"ApiTokenIn"},"ApiTokenOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]}},"type":"object","required":["name","scopes","token_id","uid","created_at"],"title":"ApiTokenOut"},"ApiTokenPrivateOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]},"token":{"type":"string","title":"Token","description":"The actual token used for authentication","examples":["J21NRKUYgyVUgvJ3cIdllS-MMa9ny1UDKFF18aetDvo"]}},"type":"object","required":["name","scopes","token_id","uid","created_at","token"],"title":"ApiTokenPrivateOut"},"Body_Bucket-update_bucket_public_state":{"properties":{"public":{"type":"boolean","title":"Public","description":"New public state"}},"type":"object","required":["public"],"title":"Body_Bucket-update_bucket_public_state"},"Body_Workflow_Version-upload_workflow_version_icon":{"properties":{"icon":{"type":"string","format":"binary","title":"Icon","description":"Icon for the Workflow."}},"type":"object","required":["icon"],"title":"Body_Workflow Version-upload_workflow_version_icon"},"BucketIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]}},"type":"object","required":["name","description"],"title":"BucketIn","description":"Schema for creating a new bucket."},"BucketOut":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]},"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]},"owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id","description":"UID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"public":{"type":"boolean","title":"Public","description":"Flag if the bucket is anonymously readable"}},"type":"object","required":["name","description","created_at","owner_id","public"],"title":"BucketOut","description":"Schema for answering a request with a bucket."},"BucketPermissionIn":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","format":"uuid","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionIn"},"BucketPermissionOut":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionOut","description":"Schema for the bucket permissions."},"BucketPermissionParameters":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"}},"type":"object","required":["scopes"],"title":"BucketPermissionParameters","description":"Schema for the parameters of a bucket permission."},"BucketSizeLimits":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]}},"type":"object","title":"BucketSizeLimits","description":"Schema to represent bucket limits."},"BucketType":{"type":"string","enum":["OWN","ALL","PERMISSION"],"title":"BucketType","description":"Enumeration for the type of buckets to fetch from the DB\n\nOWN: Only fetch buckets that the user owns\nPERMISSION: Only fetch foreign buckets that the user has access to\nALL: Fetch all buckets that the user has access to"},"DevWorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"mode":{"anyOf":[{"$ref":"#/components/schemas/WorkflowModeIn"},{"type":"null"}],"description":"Mode of the workflow with an alternative entrypoint"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow execution requires"}},"type":"object","required":["parameters","git_commit_hash","repository_url","nextflow_version"],"title":"DevWorkflowExecutionIn"},"DocumentationEnum":{"type":"string","enum":["usage.md","input.md","output.md","changelog.md","parameter_schema.json","clowm_info.json","CITATIONS.md"],"title":"DocumentationEnum"},"FileTree":{"properties":{"type":{"type":"string","enum":["file","directory","link"],"title":"Type"},"name":{"type":"string","title":"Name"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"contents":{"anyOf":[{"items":{"$ref":"#/components/schemas/FileTree"},"type":"array"},{"type":"null"}],"title":"Contents"},"size":{"type":"integer","title":"Size"}},"type":"object","required":["type","name","size"],"title":"FileTree"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IconUpdateOut":{"properties":{"icon_url":{"type":"string","minLength":1,"format":"uri","title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["icon_url"],"title":"IconUpdateOut"},"InstanceSpecificDefaultParameters":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}]},"type":"object"},"NewsIn":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event","default":"system"}},"type":"object","required":["content","title"],"title":"NewsIn"},"NewsOut":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event"},"news_id":{"type":"string","title":"News Id","description":"ID of the news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"]},"creator_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Id","description":"ID of the creator","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]}},"type":"object","required":["content","title","category","news_id","created_at"],"title":"NewsOut"},"NextflowVersion":{"type":"string","enum":["22.10.0","22.10.1","22.10.2","22.10.3","22.10.4","22.10.5","22.10.6","22.10.7","22.10.8","23.04.0","23.04.1","23.04.2","23.04.3","23.04.4","23.04.5","23.10.0","23.10.1","23.10.2","23.10.3","23.10.4","24.04.1","24.04.2","24.04.3","24.04.4","24.10.0"],"title":"NextflowVersion"},"OIDCProvider":{"type":"string","enum":["lifescience-aai","nfdi-aai"],"title":"OIDCProvider"},"OwnershipTransferRequestIn":{"properties":{"new_owner_uid":{"type":"string","format":"uuid","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Comment","description":"An optional comment for the transfer request","examples":["This is an example comment"]}},"type":"object","required":["new_owner_uid"],"title":"OwnershipTransferRequestIn"},"OwnershipTransferRequestOut":{"properties":{"new_owner_uid":{"type":"string","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"type":"string","title":"Comment","description":"An optional comment for the transfer request","default":"","examples":["This is an example comment"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Time when the ownership transfer was requested as UNIX timestamp","examples":[1640991600]},"current_owner_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Owner Uid","description":"The current uid of the current owner if he exists","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"target_id":{"type":"string","title":"Target Id","description":"Id of the target that gets its ownership transferred"},"target_name":{"type":"string","title":"Target Name","description":"Name of the target","examples":["example-bucket","Example Workflow","Example Resource"]},"target_description":{"type":"string","title":"Target Description","description":"Description of then target","examples":["Some long description of a target"]},"target_type":{"$ref":"#/components/schemas/OwnershipTypeEnum","description":"Target type of the ownership transfer","examples":["bucket"]}},"type":"object","required":["new_owner_uid","created_at","target_id","target_name","target_description","target_type"],"title":"OwnershipTransferRequestOut"},"OwnershipTypeEnum":{"type":"string","enum":["bucket","workflow","resource"],"title":"OwnershipTypeEnum"},"ParameterExtension-Input":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterExtension-Output":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterVisibility":{"type":"integer","enum":[10,20,30,40],"title":"ParameterVisibility"},"ParameterVisibilityMapping":{"additionalProperties":{"$ref":"#/components/schemas/ParameterVisibility"},"type":"object"},"PermissionStatus":{"type":"string","enum":["ACTIVE","INACTIVE"],"title":"PermissionStatus","description":"Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the\npermission itself has a time limit and the current time is not in the timespan."},"PublicWorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"latest_git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Latest Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"latest_version_tag":{"type":"string","maxLength":10,"minLength":5,"title":"Latest Version Tag","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"developer":{"type":"string","title":"Developer","description":"Name of the developer","default":"","examples":["Bilbo Baggins"]},"latest_version_timestamp":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Latest Version Timestamp","description":"Timestamp when the last version was created as UNIX timestamp","examples":[1640991600]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the workflow icon","readOnly":true,"examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["name","short_description","repository_url","workflow_id","latest_git_commit_hash","latest_version_tag","latest_version_timestamp","icon_url"],"title":"PublicWorkflowOut"},"ResourceIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true}},"type":"object","required":["release","name","description","source"],"title":"ResourceIn"},"ResourceOut":{"properties":{"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"maintainer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maintainer Id","description":"ID of the maintainer","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"versions":{"items":{"$ref":"#/components/schemas/ResourceVersionOut"},"type":"array","title":"Versions","description":"Versions of the resource"}},"type":"object","required":["name","description","source","resource_id","maintainer_id","versions"],"title":"ResourceOut"},"ResourceVersionIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]}},"type":"object","required":["release"],"title":"ResourceVersionIn"},"ResourceVersionOut":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"status":{"$ref":"#/components/schemas/ResourceVersionStatus","description":"Status of the resource version"},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1672527600]},"compressed_size":{"type":"integer","maximum":1.8446744073709552e+19,"minimum":0.0,"title":"Compressed Size","description":"Size of the compressed resource in bytes","examples":[42097156608]},"cluster_path":{"type":"string","title":"Cluster Path","description":"Path to the resource on the cluster if the resource is synchronized","readOnly":true,"examples":["/vol/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4","/vol/resources/CLDB-0e240ccd/latest"]},"s3_path":{"type":"string","title":"S3 Path","description":"Path to the resource in the S3 Bucket. Not publicly available.","readOnly":true,"examples":["s3://clowm-data/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4/resource.tar.gz"]}},"type":"object","required":["release","status","resource_version_id","resource_id","created_at","compressed_size","cluster_path","s3_path"],"title":"ResourceVersionOut"},"ResourceVersionStatus":{"type":"string","enum":["RESOURCE_REQUESTED","WAIT_FOR_REVIEW","DENIED","APPROVED","SYNC_REQUESTED","SYNCHRONIZING","SYNC_ERROR","SYNCHRONIZED","SETTING_LATEST","LATEST","CLUSTER_DELETING","CLUSTER_DELETE_ERROR","S3_DELETING","S3_DELETE_ERROR","S3_DELETED"],"title":"ResourceVersionStatus","description":"Enumeration for the possible status of a resource version."},"RoleEnum":{"type":"string","enum":["administrator","user","reviewer","developer","db_maintainer"],"title":"RoleEnum"},"S3Key":{"properties":{"uid":{"type":"string","title":"Uid","description":"UID of the user of that access key","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"access_key":{"type":"string","title":"Access Key","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"]},"secret_key":{"type":"string","title":"Secret Key","description":"Secret of the S3 access key","examples":["2F5uNTI1qvt4oAroXV0wWct8rWclL2QvFXKqSqjS"]}},"type":"object","required":["uid","access_key","secret_key"],"title":"S3Key","description":"Schema for a S3 key associated with a user."},"UserIn":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","examples":[["user"]]},"email":{"type":"string","format":"email","title":"Email","description":"Email of the user","examples":["user@example.org"]}},"type":"object","required":["display_name","email"],"title":"UserIn"},"UserOut":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["display_name","uid"],"title":"UserOut","description":"Schema for a user."},"UserOutExtended":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]},"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"lifescience_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifescience Id","description":"Lifesicence AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"nfdi_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nfdi Id","description":"NFDI AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"invitation_token_created_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invitation Token Created At","description":"Timestamp when the invitation token was created as UNIX timestamp"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email","description":"Email of the user","examples":["user@example.org"]},"gravatar_url":{"type":"string","minLength":1,"format":"uri","title":"Gravatar Url","description":"URL to the gravatar avatar based on the users email","readOnly":true,"examples":["https://gravatar.com/avatar/87a8c45825eb709ee8e453d2c0f8154e1b9bf4b45bb9b81b7662177340aa9d38"]}},"type":"object","required":["roles","display_name","uid","gravatar_url"],"title":"UserOutExtended"},"UserRequestAnswer":{"properties":{"deny":{"type":"boolean","title":"Deny","description":"Flag to indicate if the request was denied.","default":false},"reason":{"anyOf":[{"type":"string","maxLength":512,"minLength":16},{"type":"null"}],"title":"Reason","description":"Reason why the request was denied or approved. Required if request is denied."}},"type":"object","title":"UserRequestAnswer"},"UserRoles":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]}},"type":"object","required":["roles"],"title":"UserRoles"},"UserSynchronizationRequestIn":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]}},"type":"object","required":["reason"],"title":"UserSynchronizationRequestIn"},"UserSynchronizationRequestOut":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"requester_id":{"type":"string","title":"Requester Id","description":"ID of the user that requested this resource synchronization","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["reason","resource_version_id","resource_id","requester_id"],"title":"UserSynchronizationRequestOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkflowCredentialsIn":{"properties":{"token":{"type":"string","maxLength":128,"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","required":["token"],"title":"WorkflowCredentialsIn"},"WorkflowCredentialsOut":{"properties":{"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","title":"WorkflowCredentialsOut"},"WorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["parameters","workflow_version_id"],"title":"WorkflowExecutionIn"},"WorkflowExecutionOut":{"properties":{"workflow_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"execution_id":{"type":"string","title":"Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"executor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executor Id","description":"UID of user who started the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"start_time":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Start Time","description":"Start time of the workflow execution as UNIX timestamp","examples":[1640991600]},"end_time":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"End Time","description":"End time of the workflow execution as UNIX timestamp","examples":[1640991600]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"Status of the workflow execution","examples":["RUNNING"]},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id","description":"Id of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"logs_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where logs and reports are saved.","examples":["s3://example-bucket/logs/run-591b6a6ea1f0420d8a20a7a60704f695"]},"provenance_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where provenance information is saved.","examples":["s3://example-bucket/provenance/run-591b6a6ea1f0420d8a20a7a60704f695"]},"debug_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where debug information from Nextflow is saved.","examples":["s3://example-bucket/debug/run-591b6a6ea1f0420d8a20a7a60704f695"]},"cpu_time":{"type":"string","format":"duration","title":"Cpu Time","description":"The consumed cpu time in ISO 8601 format","examples":["P4DT12H30M5S"]}},"type":"object","required":["execution_id","start_time","status","cpu_time"],"title":"WorkflowExecutionOut"},"WorkflowExecutionStatus":{"type":"string","enum":["PENDING","SCHEDULED","RUNNING","CANCELED","SUCCESS","ERROR"],"title":"WorkflowExecutionStatus","description":"Enumeration for the status on a workflow execution."},"WorkflowIn":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"initial_version":{"type":"string","maxLength":10,"minLength":5,"title":"Initial Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","maxItems":10,"title":"Modes","description":"List of modes with alternative entrypoint the new workflow has","default":[]},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["name","short_description","repository_url","git_commit_hash","initial_version","nextflow_version"],"title":"WorkflowIn"},"WorkflowModeIn":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]}},"type":"object","required":["schema_path","entrypoint","name"],"title":"WorkflowModeIn"},"WorkflowModeOut":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]},"mode_id":{"type":"string","title":"Mode Id","description":"ID of the workflow mode","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["schema_path","entrypoint","name","mode_id"],"title":"WorkflowModeOut"},"WorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"versions":{"items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"type":"array","title":"Versions","description":"Versions of the workflow"},"developer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Developer Id","description":"ID of developer of the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"private":{"type":"boolean","title":"Private","description":"Flag if the workflow is hosted in a private git repository","default":false}},"type":"object","required":["name","short_description","repository_url","workflow_id","versions"],"title":"WorkflowOut"},"WorkflowStatistic":{"properties":{"day":{"type":"string","format":"date","title":"Day","description":"Day of the datapoint","examples":["2023-01-01"]},"count":{"type":"integer","title":"Count","description":"Number of started workflows on that day","examples":[1]}},"type":"object","required":["day","count"],"title":"WorkflowStatistic"},"WorkflowUpdate":{"properties":{"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"append_modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","title":"Append Modes","description":"Add modes to the new workflow version"},"delete_modes":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Delete Modes","description":"Delete modes for the new workflow version.","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["version","git_commit_hash"],"title":"WorkflowUpdate"},"WorkflowVersionMetadataIn":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataIn"},"WorkflowVersionMetadataOut":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataOut"},"WorkflowVersionOut":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the corresponding workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1640991600]},"modes":{"items":{"type":"string"},"type":"array","title":"Modes","description":"Optional modes his workflow version has","default":[],"examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"parameter_extension":{"anyOf":[{"$ref":"#/components/schemas/ParameterExtension-Output"},{"type":"null"}],"description":"Parameter extension specific for this CloWM instance"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["status","workflow_id","version","workflow_version_id","created_at","nextflow_version"],"title":"WorkflowVersionOut"},"WorkflowVersionStatus":{"type":"string","enum":["CREATED","DENIED","PUBLISHED","DEPRECATED"],"title":"WorkflowVersionStatus","description":"Enumeration for the possible status of a workflow version."},"WorkflowVersionStatusSchema":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]}},"type":"object","required":["status"],"title":"WorkflowVersionStatusSchema"}},"securitySchemes":{"Session Token":{"type":"apiKey","description":"The JWT in this cookie is used by the website and should not be used when communicating directly with the API.","in":"cookie","name":"clowm-jwt"}}}}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index ea13ca0..3533530 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,7 +13,7 @@
         "@aws-sdk/lib-storage": "<3.729.0",
         "@aws-sdk/s3-request-presigner": "<3.729.0",
         "@fortawesome/fontawesome-free": "~6.7.0",
-        "@hey-api/client-axios": "0.6.0",
+        "@hey-api/client-axios": "^0.6.0",
         "@popperjs/core": "~2.11.8",
         "ajv": "~8.17.0",
         "bootstrap": "~5.3.0",
@@ -47,12 +47,12 @@
         "@types/sortablejs": "^1.15.7",
         "@vitejs/plugin-vue": "~5.2.0",
         "@vue/eslint-config-prettier": "~10.2.0",
-        "@vue/eslint-config-typescript": "~14.3.0",
+        "@vue/eslint-config-typescript": "~14.4.0",
         "@vue/tsconfig": "~0.7.0",
-        "eslint": "~9.19.0",
+        "eslint": "~9.20.0",
         "eslint-plugin-vue": "~9.32.0",
         "highlight.js": "^11.9.0",
-        "prettier": "~3.4.0",
+        "prettier": "~3.5.0",
         "sass": "^1.66.0",
         "typescript": "~5.7.0",
         "vite": "~6.1.0",
@@ -1047,12 +1047,12 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.26.7",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz",
-      "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==",
+      "version": "7.26.8",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz",
+      "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==",
       "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.26.7"
+        "@babel/types": "^7.26.8"
       },
       "bin": {
         "parser": "bin/babel-parser.js"
@@ -1062,9 +1062,9 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.26.7",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz",
-      "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==",
+      "version": "7.26.8",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz",
+      "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-string-parser": "^7.25.9",
@@ -1671,9 +1671,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "9.19.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz",
-      "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==",
+      "version": "9.20.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz",
+      "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -1714,9 +1714,9 @@
       }
     },
     "node_modules/@hey-api/client-axios": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/@hey-api/client-axios/-/client-axios-0.6.0.tgz",
-      "integrity": "sha512-+wLcSx0K47168Xxx6EzNEWcJjFFAGDEjp9SqKgHg343uls41Ob6EACp/Ouozj4UMP5En+Anq70pDRNDVRY3MVQ==",
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/@hey-api/client-axios/-/client-axios-0.6.1.tgz",
+      "integrity": "sha512-1rvO7L5l4fHCqJJlvr1bOFWR1XcjGgdPnqzTODRuOHdrighyCjt9lP2MR7wVQbGO+EjYM0qNIs5E1qxt12rwqA==",
       "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/hey-api"
@@ -1744,9 +1744,9 @@
       }
     },
     "node_modules/@hey-api/openapi-ts": {
-      "version": "0.64.1",
-      "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.64.1.tgz",
-      "integrity": "sha512-d9FWyJKjyH4KeCjOoR5x8+zKER7h7EIRzk3Xo5a2ShAxNoq9HlAArLbWgJFnH7QypQ+f3q29mTp/z2Zw0XkP9g==",
+      "version": "0.64.3",
+      "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.64.3.tgz",
+      "integrity": "sha512-V/7KUq59T9uu4QXMminBlqWqoVqLggDSakRdHuJX+QRSkMUhso1d4QuMEzQcvaKt0uMQdHktPd1bdc2k5puH+g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2284,9 +2284,9 @@
       }
     },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.5.tgz",
-      "integrity": "sha512-JXmmQcKQtpf3Z6lvA8akkrHDZ5AEfgc2hLMix1/X5BhQbezBQ0AP5GYLdU8jsQRme8qr2sscCe3wizp7UT0L9g==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz",
+      "integrity": "sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==",
       "cpu": [
         "arm"
       ],
@@ -2298,9 +2298,9 @@
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.5.tgz",
-      "integrity": "sha512-9/A8/ZBOprUjkrJoP9BBEq2vdSud6BPd3LChw09bJQiEZH5oN4kWIkHu90cA0Cj0cSF5cIaD76+0lA+d5KHmpQ==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz",
+      "integrity": "sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==",
       "cpu": [
         "arm64"
       ],
@@ -2312,9 +2312,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.5.tgz",
-      "integrity": "sha512-b9oCfgHKfc1AJEQ5sEpE8Kf6s7aeygj5bZAsl1hTpZc1V9cfZASFSXzzNj7o/BQNPbjmVkVxpCCLRhBfLXhJ5g==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz",
+      "integrity": "sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==",
       "cpu": [
         "arm64"
       ],
@@ -2326,9 +2326,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.5.tgz",
-      "integrity": "sha512-Gz42gKBQPoFdMYdsVqkcpttYOO/0aP7f+1CgMaeZEz0gss7dop1TsO3hT77Iroz/TV7PdPUG/RYlj9EA39L4dw==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz",
+      "integrity": "sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==",
       "cpu": [
         "x64"
       ],
@@ -2340,9 +2340,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.5.tgz",
-      "integrity": "sha512-JPkafjkOFaupd8VQYsXfGFKC2pfMr7hwSYGkVGNwhbW0k0lHHyIdhCSNBendJ4O7YlT4yRyKXoms1TL7saO7SQ==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz",
+      "integrity": "sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==",
       "cpu": [
         "arm64"
       ],
@@ -2354,9 +2354,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.5.tgz",
-      "integrity": "sha512-j6Q8VFqyI8hZM33h1JC6DZK2w8ejkXqEMozTrtIEGfRVMpVZL3GrLOOYEUkAgUSpJ9sb2w+FEpjGj7IHRcQfdw==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz",
+      "integrity": "sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==",
       "cpu": [
         "x64"
       ],
@@ -2368,9 +2368,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.5.tgz",
-      "integrity": "sha512-6jyiXKF9Xq6x9yQjct5xrRT0VghJk5VzAfed3o0hgncwacZkzOdR0TXLRNjexsEXWN8tG7jWWwsVk7WeFi//gw==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz",
+      "integrity": "sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==",
       "cpu": [
         "arm"
       ],
@@ -2382,9 +2382,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.5.tgz",
-      "integrity": "sha512-cOTYe5tLcGAvGztRLIqx87LE7j/qjaAqFrrHsPFlnuhhhFO5LSr2AzvdQYuxomJMzMBrXkMRNl9bQEpDZ5bjLQ==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz",
+      "integrity": "sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==",
       "cpu": [
         "arm"
       ],
@@ -2396,9 +2396,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.5.tgz",
-      "integrity": "sha512-KHlrd+YqmS7rriW+LBb1kQNYmd5w1sAIG3z7HEpnQOrg/skeYYv9DAcclGL9gpFdpnzmiAEkzsTT74kZWUtChQ==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz",
+      "integrity": "sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==",
       "cpu": [
         "arm64"
       ],
@@ -2410,9 +2410,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.5.tgz",
-      "integrity": "sha512-uOb6hzDqym4Sw+qw3+svS3SmwQGVUhyTdPKyHDdlYg1Z0aHjdNmjwRY7zw/90/UfBe/yD7Mv2mYKhQpOfy4RYA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz",
+      "integrity": "sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==",
       "cpu": [
         "arm64"
       ],
@@ -2424,9 +2424,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.5.tgz",
-      "integrity": "sha512-pARu8ZKANZH4wINLdHLKG69EPwJswM6A+Ox1a9LpiclRQoyjacFFTtXN3akKQ2ufJXDasO/pWvxKN9ZfCgEoFA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz",
+      "integrity": "sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==",
       "cpu": [
         "loong64"
       ],
@@ -2438,9 +2438,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.5.tgz",
-      "integrity": "sha512-crUWn12NRmCdao2YwS1GvlPCVypMBMJlexTaantaP2+dAMd2eZBErFcKG8hZYEHjSbbk2UoH1aTlyeA4iKLqSA==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz",
+      "integrity": "sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==",
       "cpu": [
         "ppc64"
       ],
@@ -2452,9 +2452,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.5.tgz",
-      "integrity": "sha512-XtD/oMhCdixi3x8rCNyDRMUsLo1Z+1UQcK+oR7AsjglGov9ETiT3TNFhUPzaGC1jH+uaMtPhxrVRUub+pnAKTg==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz",
+      "integrity": "sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==",
       "cpu": [
         "riscv64"
       ],
@@ -2466,9 +2466,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.5.tgz",
-      "integrity": "sha512-V3+BvgyHb21aF7lw0sc78Tv0+xLp4lm2OM7CKFVrBuppsMvtl/9O5y2OX4tdDT0EhIsDP/ObJPqDuEg1ZoTwSQ==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz",
+      "integrity": "sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==",
       "cpu": [
         "s390x"
       ],
@@ -2480,9 +2480,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.5.tgz",
-      "integrity": "sha512-SkCIXLGk42yldTcH8UXh++m0snVxp9DLf4meb1mWm0lC8jzxjFBwSLGtUSeLgQDsC05iBaIhyjNX46DlByrApQ==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz",
+      "integrity": "sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==",
       "cpu": [
         "x64"
       ],
@@ -2494,9 +2494,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.5.tgz",
-      "integrity": "sha512-iUcH3FBtBN2/Ce0rI84suRhD0+bB5BVEffqOwsGaX5py5TuYLOQa7S7oVBP0NKtB5rub3i9IvZtMXiD96l5v0A==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz",
+      "integrity": "sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==",
       "cpu": [
         "x64"
       ],
@@ -2508,9 +2508,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.5.tgz",
-      "integrity": "sha512-PUbWd+h/h6rUowalDYIdc9S9LJXbQDMcJe0BjABl3oT3efYRgZ8aUe8ZZDSie7y+fz6Z+rueNfdorIbkWv5Eqg==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz",
+      "integrity": "sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==",
       "cpu": [
         "arm64"
       ],
@@ -2522,9 +2522,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.5.tgz",
-      "integrity": "sha512-3vncGhOJiAUR85fnAXJyvSp2GaDWYByIQmW68ZAr+e8kIxgvJ1VaZbfHD5BO5X6hwRQdY6Um/XfA3l5c2lV+OQ==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz",
+      "integrity": "sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==",
       "cpu": [
         "ia32"
       ],
@@ -2536,9 +2536,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.5.tgz",
-      "integrity": "sha512-Mi8yVUlQOoeBpY72n75VLATptPGvj2lHa47rQdK9kZ4MoG5Ve86aVIU+PO3tBklTCBtILtdRfXS0EvIbXgmCAg==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz",
+      "integrity": "sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==",
       "cpu": [
         "x64"
       ],
@@ -3684,15 +3684,15 @@
       }
     },
     "node_modules/@vue/eslint-config-typescript": {
-      "version": "14.3.0",
-      "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.3.0.tgz",
-      "integrity": "sha512-bOreIxlSC/xsUdhDdKIHb1grwJah+IokNeJ50LqA1StdOHeSPUxSIPNxyKgRx4YdjhyzC6TKtrCf6yYK99x3Uw==",
+      "version": "14.4.0",
+      "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-14.4.0.tgz",
+      "integrity": "sha512-daU+eAekEeVz3CReE4PRW25fe+OJDKwE28jHN6LimDEnuFMbJ6H4WGogEpNof276wVP6UvzOeJQfLFjB5mW29A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/utils": "^8.20.0",
+        "@typescript-eslint/utils": "^8.23.0",
         "fast-glob": "^3.3.3",
-        "typescript-eslint": "^8.20.0",
+        "typescript-eslint": "^8.23.0",
         "vue-eslint-parser": "^9.4.3"
       },
       "engines": {
@@ -4889,18 +4889,18 @@
       }
     },
     "node_modules/eslint": {
-      "version": "9.19.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz",
-      "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==",
+      "version": "9.20.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.0.tgz",
+      "integrity": "sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.12.1",
         "@eslint/config-array": "^0.19.0",
-        "@eslint/core": "^0.10.0",
+        "@eslint/core": "^0.11.0",
         "@eslint/eslintrc": "^3.2.0",
-        "@eslint/js": "9.19.0",
+        "@eslint/js": "9.20.0",
         "@eslint/plugin-kit": "^0.2.5",
         "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
@@ -5061,6 +5061,19 @@
         "url": "https://opencollective.com/eslint"
       }
     },
+    "node_modules/eslint/node_modules/@eslint/core": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz",
+      "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@types/json-schema": "^7.0.15"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
     "node_modules/eslint/node_modules/ajv": {
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -6856,9 +6869,9 @@
       }
     },
     "node_modules/prettier": {
-      "version": "3.4.2",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
-      "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.0.tgz",
+      "integrity": "sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -7105,9 +7118,9 @@
       }
     },
     "node_modules/rollup": {
-      "version": "4.34.5",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.5.tgz",
-      "integrity": "sha512-GyVCmpo9z/HYqFD8QWoBUnz1Q9xC22t8tPAZm/AvAcUg2U2/+DkboEvSioMwv042zE4I9N3FEhx7fiCT2YHzKQ==",
+      "version": "4.34.6",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.6.tgz",
+      "integrity": "sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7121,25 +7134,25 @@
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.34.5",
-        "@rollup/rollup-android-arm64": "4.34.5",
-        "@rollup/rollup-darwin-arm64": "4.34.5",
-        "@rollup/rollup-darwin-x64": "4.34.5",
-        "@rollup/rollup-freebsd-arm64": "4.34.5",
-        "@rollup/rollup-freebsd-x64": "4.34.5",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.34.5",
-        "@rollup/rollup-linux-arm-musleabihf": "4.34.5",
-        "@rollup/rollup-linux-arm64-gnu": "4.34.5",
-        "@rollup/rollup-linux-arm64-musl": "4.34.5",
-        "@rollup/rollup-linux-loongarch64-gnu": "4.34.5",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.34.5",
-        "@rollup/rollup-linux-riscv64-gnu": "4.34.5",
-        "@rollup/rollup-linux-s390x-gnu": "4.34.5",
-        "@rollup/rollup-linux-x64-gnu": "4.34.5",
-        "@rollup/rollup-linux-x64-musl": "4.34.5",
-        "@rollup/rollup-win32-arm64-msvc": "4.34.5",
-        "@rollup/rollup-win32-ia32-msvc": "4.34.5",
-        "@rollup/rollup-win32-x64-msvc": "4.34.5",
+        "@rollup/rollup-android-arm-eabi": "4.34.6",
+        "@rollup/rollup-android-arm64": "4.34.6",
+        "@rollup/rollup-darwin-arm64": "4.34.6",
+        "@rollup/rollup-darwin-x64": "4.34.6",
+        "@rollup/rollup-freebsd-arm64": "4.34.6",
+        "@rollup/rollup-freebsd-x64": "4.34.6",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.34.6",
+        "@rollup/rollup-linux-arm-musleabihf": "4.34.6",
+        "@rollup/rollup-linux-arm64-gnu": "4.34.6",
+        "@rollup/rollup-linux-arm64-musl": "4.34.6",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.34.6",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.34.6",
+        "@rollup/rollup-linux-riscv64-gnu": "4.34.6",
+        "@rollup/rollup-linux-s390x-gnu": "4.34.6",
+        "@rollup/rollup-linux-x64-gnu": "4.34.6",
+        "@rollup/rollup-linux-x64-musl": "4.34.6",
+        "@rollup/rollup-win32-arm64-msvc": "4.34.6",
+        "@rollup/rollup-win32-ia32-msvc": "4.34.6",
+        "@rollup/rollup-win32-x64-msvc": "4.34.6",
         "fsevents": "~2.3.2"
       }
     },
diff --git a/package.json b/package.json
index a2f35af..ea363e1 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,7 @@
     "@aws-sdk/lib-storage": "<3.729.0",
     "@aws-sdk/s3-request-presigner": "<3.729.0",
     "@fortawesome/fontawesome-free": "~6.7.0",
-    "@hey-api/client-axios": "0.6.0",
+    "@hey-api/client-axios": "^0.6.0",
     "@popperjs/core": "~2.11.8",
     "ajv": "~8.17.0",
     "bootstrap": "~5.3.0",
@@ -50,12 +50,12 @@
     "@types/sortablejs": "^1.15.7",
     "@vitejs/plugin-vue": "~5.2.0",
     "@vue/eslint-config-prettier": "~10.2.0",
-    "@vue/eslint-config-typescript": "~14.3.0",
+    "@vue/eslint-config-typescript": "~14.4.0",
     "@vue/tsconfig": "~0.7.0",
-    "eslint": "~9.19.0",
+    "eslint": "~9.20.0",
     "eslint-plugin-vue": "~9.32.0",
     "highlight.js": "^11.9.0",
-    "prettier": "~3.4.0",
+    "prettier": "~3.5.0",
     "sass": "^1.66.0",
     "typescript": "~5.7.0",
     "vite": "~6.1.0",
diff --git a/src/client/sdk.gen.ts b/src/client/sdk.gen.ts
index cde07fd..7d7ab82 100644
--- a/src/client/sdk.gen.ts
+++ b/src/client/sdk.gen.ts
@@ -306,6 +306,11 @@ export type Options<
    * custom client.
    */
   client?: Client;
+  /**
+   * You can pass arbitrary values through the `meta` object. This can be
+   * used to access values that aren't defined as part of the SDK function.
+   */
+  meta?: Record<string, unknown>;
 };
 
 export class AuthService {
diff --git a/src/client/types.gen.ts b/src/client/types.gen.ts
index a795751..c9c0003 100644
--- a/src/client/types.gen.ts
+++ b/src/client/types.gen.ts
@@ -171,7 +171,7 @@ export type BucketOut = {
   /**
    * UID of the owner
    */
-  owner_id: string;
+  owner_id: string | null;
   /**
    * Flag if the bucket is anonymously readable
    */
diff --git a/src/components/modals/DeleteUserModal.vue b/src/components/modals/DeleteUserModal.vue
new file mode 100644
index 0000000..3a3acaf
--- /dev/null
+++ b/src/components/modals/DeleteUserModal.vue
@@ -0,0 +1,109 @@
+<script setup lang="ts">
+import { computed, onMounted, ref } from "vue";
+import { Modal } from "bootstrap";
+import BootstrapModal from "@/components/modals/BootstrapModal.vue";
+import type { UserOut } from "@/client";
+import { useSettingsStore, useUserStore } from "@/stores";
+import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
+
+const props = defineProps<{
+  modalId: string;
+  user: UserOut;
+}>();
+
+const confirmDelete = ref<string>("");
+const emit = defineEmits<{
+  (e: "confirm-delete", uid: string): void;
+}>();
+
+const userRepository = useUserStore();
+const settings = useSettingsStore();
+
+let deleteModal: Modal | null = null;
+const randomIDSuffix = Math.random().toString(16).substring(2, 8);
+
+function modalClosed() {
+  confirmDelete.value = "";
+}
+
+function deleteUser() {
+  emit("confirm-delete", props.user.uid);
+  deleteModal?.hide();
+  confirmDelete.value = "";
+}
+
+const confirmDeleteString = computed<string>(
+  () =>
+    props.user.display_name
+      .replace(/([a-z])([A-Z])/g, "$1-$2")
+      .replace(/[\s_]+/g, "-")
+      .toLowerCase() +
+    "_" +
+    randomIDSuffix,
+);
+
+const deleteCurrentUser = computed<boolean>(
+  () => props.user.uid === userRepository.currentUID,
+);
+
+onMounted(() => {
+  deleteModal = Modal.getOrCreateInstance("#" + props.modalId);
+});
+</script>
+
+<template>
+  <bootstrap-modal
+    :modal-id="props.modalId"
+    :static-backdrop="true"
+    size-modifier-modal="lg"
+    modal-label="Confirm Delete User Modal"
+    v-on="{ 'hidden.bs.modal': modalClosed }"
+  >
+    <template #header>Are you absolutely sure?</template>
+    <template #body>
+      <div v-if="deleteCurrentUser">
+        <div class="text-danger">
+          <font-awesome-icon icon="fa-solid fa-circle-exclamation" />
+          You are about to delete your account. You won't have access anymore
+          to:
+        </div>
+        <ul>
+          <li>Your data buckets and their content</li>
+          <li>Your workflow executions and their parameterization</li>
+          <li v-if="userRepository.workflowDev">
+            Your workflows and their KPIs
+          </li>
+          <li v-if="userRepository.resourceMaintainer">Your CloWM resources</li>
+        </ul>
+      </div>
+      <p>
+        Enter the following to confirm: <br /><code
+          class="rounded p-1"
+          :class="{
+            'bg-light': settings.lightThemeActive,
+            'text-bg-secondary': !settings.lightThemeActive,
+          }"
+          >{{ confirmDeleteString }}</code
+        >
+      </p>
+      <div>
+        <input v-model="confirmDelete" type="text" class="form-control" />
+      </div>
+    </template>
+    <template #footer>
+      <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
+        Cancel
+      </button>
+      <button
+        type="button"
+        class="btn btn-danger"
+        :disabled="confirmDelete !== confirmDeleteString"
+        @click="deleteUser"
+      >
+        Yes, delete account
+      </button>
+    </template>
+  </bootstrap-modal>
+</template>
+
+<style scoped></style>
diff --git a/src/components/object-storage/modals/DownloadObjectsModal.vue b/src/components/object-storage/modals/DownloadObjectsModal.vue
index f2a5d42..4e0ba36 100644
--- a/src/components/object-storage/modals/DownloadObjectsModal.vue
+++ b/src/components/object-storage/modals/DownloadObjectsModal.vue
@@ -212,6 +212,7 @@ async function downloadFiles() {
   downloadState.controller = new AbortController();
   downloadState.downloadedFiles = new Set<string>();
   downloadState.errorFiles = new Set<string>();
+  let downloadError = false;
   outer: for (const file of objKeys.value) {
     let subHandle = dirHandle;
     const subFolders = file.fileName.split("/");
@@ -245,11 +246,10 @@ async function downloadFiles() {
         downloadState.controller,
       );
       downloadState.downloadedFiles.add(file.fileName);
-      downloadModal?.hide();
-      successToast?.show();
       // eslint-disable-next-line @typescript-eslint/ban-ts-comment
       // @ts-ignore
     } catch (caught: Error) {
+      downloadError = true;
       downloadState.errorFiles.add(file.fileName);
       await writeStream.truncate(0);
       if (caught.name === "AbortError") {
@@ -260,6 +260,10 @@ async function downloadFiles() {
       await writeStream.close();
     }
   }
+  if (!downloadError) {
+    successToast?.show();
+    downloadModal?.hide();
+  }
   downloadState.controller = undefined;
   downloadState.downloading = false;
 }
diff --git a/src/stores/users.ts b/src/stores/users.ts
index c05c2e5..7eab462 100644
--- a/src/stores/users.ts
+++ b/src/stores/users.ts
@@ -258,5 +258,11 @@ export const useUserStore = defineStore("user", {
 
       return uids.map((uid) => nameStore.getName(uid)!);
     },
+    deleteUser(uid: string): Promise<void> {
+      // return Promise.resolve();
+      return UserService.userDeleteUser({
+        path: { uid: uid },
+      }).then((response) => response.data!);
+    },
   },
 });
diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue
index 2fc7156..4a3295c 100644
--- a/src/views/user/ProfileView.vue
+++ b/src/views/user/ProfileView.vue
@@ -1,7 +1,68 @@
-<script setup lang="ts"></script>
+<script setup lang="ts">
+import { useUserStore } from "@/stores";
+import BootstrapToast from "@/components/BootstrapToast.vue";
+import DeleteUserModal from "@/components/modals/DeleteUserModal.vue";
+import { environment } from "@/environment.ts";
+import { onMounted } from "vue";
+import { Toast } from "bootstrap";
+
+const userRepository = useUserStore();
+const props = defineProps<{
+  linkSuccess?: boolean;
+  linkError?: string;
+}>();
+let successToast: Toast;
+let errorToast: Toast;
+
+function deleteCurrentUser(uid: string) {
+  userRepository.deleteUser(uid).then(() => {
+    alert("Your account was deleted. You will be redirect to the home page.");
+    window.location.replace(`${environment.API_BASE_URL}/auth/logout`);
+  });
+}
+
+onMounted(() => {
+  successToast = Toast.getOrCreateInstance("#profile-success-toast");
+  if (props.linkSuccess) {
+    successToast?.show();
+  }
+  errorToast = Toast.getOrCreateInstance("#profile-error-toast");
+  if (props.linkError) {
+    errorToast?.show();
+  }
+});
+</script>
 
 <template>
-  <div>My Profile</div>
+  <bootstrap-toast toast-id="profile-success-toast" color-class="success"
+    >Success
+  </bootstrap-toast>
+  <bootstrap-toast toast-id="profile-error-toast" color-class="danger"
+    >Error: {{ props.linkError }}
+  </bootstrap-toast>
+  <delete-user-modal
+    modal-id="profile-delete-user-modal"
+    :user="userRepository.user ?? { display_name: '', uid: '' }"
+    @confirm-delete="deleteCurrentUser"
+  />
+  <div class="row border-bottom mb-4">
+    <h2 class="mb-2">My Profile</h2>
+  </div>
+  <div class="row border-bottom mb-4">
+    <h3 class="mb-2 text-danger">Delete my profile</h3>
+  </div>
+  <p>
+    This action deletes your account and you lose access to everything in CloWM
+    that is connected to your account. <b>There is no going back.</b>
+  </p>
+  <button
+    role="button"
+    class="btn btn-danger"
+    data-bs-toggle="modal"
+    data-bs-target="#profile-delete-user-modal"
+  >
+    Delete account
+  </button>
 </template>
 
 <style scoped></style>
-- 
GitLab


From 38d82d694dfdcf64b6d06d13bd1ee53519c9b0d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Mon, 10 Feb 2025 13:53:09 +0000
Subject: [PATCH 03/25] Add roles section on profile page

 * Add iam4nfdi logo

#191
---
 src/assets/images/nfdi-aai.png            | Bin 0 -> 71321 bytes
 src/components/modals/DeleteUserModal.vue |  18 ++-
 src/views/LoginView.vue                   |  18 +--
 src/views/user/ProfileView.vue            | 142 +++++++++++++++++++---
 4 files changed, 152 insertions(+), 26 deletions(-)
 create mode 100644 src/assets/images/nfdi-aai.png

diff --git a/src/assets/images/nfdi-aai.png b/src/assets/images/nfdi-aai.png
new file mode 100644
index 0000000000000000000000000000000000000000..32533fd2c625f6140307b030c2fe3d78e92e9305
GIT binary patch
literal 71321
zcmeFZcT`l{vNzf^P0mrGG*KjWlY``pM9C^SXC#B<jG!a~A|Oe!WC@a*B!VD_B*`ck
z$tXFz)zIyBpL_2)cZ~17@BOpq7)r0zHLGgYtg2ttTrA>sv{Z=j>F_}y5Rsay;x!Nm
zR~iHYv*2O_cevs+UV}hF0@jxD#>k&eKCV{4?Tf%q8*2d%OAr}|Gz<hP1&KYmg?V-Z
zpdv(3shm@}{+-Il(@nz1$I(W@QWPdEC@LV#YbPQI=M@sL65tgVwzTFIv$PemwiXk$
zv=OreWMLGd*j+wnXX*7{gz{N>dD(h;JG#4h0TV#|s0kcr6Rg}l|C<Tczo|2=0g7CE
z%kw+o`F7`@oRO>Hv$b*bwzYBfa<}vLv-Gr;v$u8gc9pYnx3YyQJ9^sMxdhy@akO{z
zwsg^R_wls0)erEn^;dTA_V$qA=ePFdbM)}G=5zP7=XbO9^RjlgvGw9d(R-cIdjs_R
z-kz3@ZnidZF81!8j@}Ngj@FuhT;$rzP%Gj5pI72w>E*y@W9f|~2i-=l<(ZSMzqN~x
z7t$QzdA45OmY&`;%yureZuZ^|v_jH0ZkDdLZb;5{P*+PgM>~MT+S0||&db44Kv={E
z$<Y{^+TKnaPm$%Az>vz$?mt<RF4v#>EOp*K{q|_Vme+$xYY$5sRiw=G0meb8%66uz
zfVIniHM+HnrK2lAjxmi?v)IALTEg4W+r`#h#n#Q%(-JT=RL#}W-qsQL!p_~()zaJ1
z5qZt;;b!mT=mspr&DvH?(VxfP)kDG&@E|KOTTyF4VQXG-OEEiMAv?Gouehy^H7`s|
zT+mX?Mnpi!R>=KKsyVQ6ND=Oy{vv1FXRhV~m<X^uaEo6+j1LC2MDD6Na@YA`e4>0J
zP~=BmPcPs~K$uU!`(OB&JG$Aqhqs>@^VYdX{K3-R*VYrc0X9h1r;c8Z_HLHmKAyJz
zv|hF@cC2T{mpb#X-(NZX<-`$r);^vt{+Irh_Ad(lv$-grMeW#+a=S&R$frRTncu{J
zos6@}MHHEGcc+q*D*t4$8RqUdXL|WRG5zgOD7MR8*H!3a0?j$ZNMtgNc9P767A~eG
z7blvh$?Di#zgPQ*>wrKoQj{B<d#r%<e-o^~R}8oU{{qq#Mxsmz*YhyM*l3s|Ot7V3
z5!m9e2ncfyCKv+@CZ)Q2da0asq>=rqmbK_b#%vf7HXc`uYRoPX1_l8Z2<8JPfZ<_d
z8bGiqzy^A7Rv0t#0-u8Jd{^`Wyu58)y`XAt*6yAj?q_}mXN1usi3lht&x!Os0cU{f
z*?RgqTHAWTSzu7)*O(Nv=U?l1y4(0z|3v^*5rkd5KqMdphrxwmXX83>DU7@n5EK>{
z7QYS)FN0IS$j;ah;-9lo5YUl>bHX^zL=!S8xVw1+`2;HG<Lv<abhLK#4gl12^mYV1
z-`5sB9Una%SOFiL3`T;Sjzfs6XXyr2clY{Dhf9dBVCmurM2?%I<=<@rg<bq@Gdv7x
zGHXjmUUv^KSxcnP^I5yQ!XhwO{<JFw76>x}g9HTJ#|KAXV1T+vJHm&9r98jEy*55a
zT3E>$5^n!;ytEoS`r%5XR^1YNOqTmcrd&a4Luzr_S#sT%QQ;NcsTR~xA<zLXZkCg-
z>PFpuEc4Sx*VkvcK2`9@3VX7b!n2qYvm9PUJD)hT+&q1fl&UAia4Ye9*N+iQ$&^0k
zqC&hDI)@Wg`J4QkaZD2Tf4vZxnPwThTWswvkQ7|zrcmk+8WGIWDvnTp7>+?{R6X#f
z=<Ne(ZfAnh3&koOYVZQ@Als=E{FJw}ED&RlYve;$rzQ4bMMK*9Hho5}@7m+8<<Bbg
z=!kuf)!?PZ5u6VDan0~y;AL0NK)!wpm6u%GZPqdGZd{Z4eoGvTi2=gMkHAO-ED{GJ
z1h#;Y0t4d|0)~NL#K<cW<P`)Hj1vaf8n|YMT!2xbjLwgNL5PjZjg5hYg@Xx!h2KLG
zKq28Vu<%G&c-U_$Fec0kb_-1j2E%L#txep0paAkf-Q2yQ9=4vYj^4;T>Fo~n@v?<_
zJ2-klH2{}&11=Ph5NPLU4J1-1fB?20-cU=gKjv5k0Q9y{7Zkary{D}$00iEAFjJ&H
zOb|nuKI~eKPL5WL1`5GEoE>?sJze;`0$eQtCq;S+zqO^gsHL#Ape4*&R1gjq6@rOa
z+StIw1>pi#)^ICp0YN){4L}DkZ-r|be86m&D0)R07!YpQW!NS3H4Gz${trp+)?OZe
zih?mA^<st4z^KD0jV=cYXbzk#32Pyk*u36)>6Ohp{pqnlCcumUV}MGV0x9dHy+$S-
zk69ww7RYO_{t76J|C%-zr%v^wZ-(M_iX$z_%`dJuMa_Kn>mhVpm0|JFXWlc$q^0-w
z>00?(U(z_RV?l*#H&&)Jq$iu~wVYT%9<ejrV@i$641rTMv_&C=92fLQQl1s8%qT`T
z2Y2AJkoFO%;Uq5dfty!vf4$l5$6xzac1g)8TXl)}B)8s#-r;16YhDf<T6RD^Udwh@
z-uO-~q{4xNi(I&71@D@rQ|suhN`;9V`2i0a(;SBI`?f3CK2tw4e=)oCfqhh-ctft6
z!E`H}W$bao!0J<Zn%vAj=bOQgCfsl4;I&L+=1cPteIMDDaUN)f$RE9#V4c>=mOd>>
z)4(dv%~{P*ws_)mQoTE5?z0Uuc{&jO(ef9o^W%PQyOo8LU-jIfW7<6=E~XDNKd67#
zEoQ|YTBZo_yuwl&V9RuJp?{>tMpk|DO9bI5LNc=hvCLjCc1&J6Lx)I+m`bn34aJx7
zso7tKEknQDX1MfO9s7xw!M)+)k25dY4IU5u(rvlUj=k^nTvRU^ifu=w@X*H_o3~h+
zRWHL{$B0ePg@b)2(&m*AWt8+iF|f*)p94KK<>AX$%V2XvOzO{^9Gs(yAH4s3IAgpy
zA53z5u!-%mxilp!PobVV5ON{$*HwhT_}w%}Jexnp4U#J@p_{jwxlOR20r-&%;72?P
zKM0HK^>4?29>I?H8BBN*|M6eE2IlhjT>1Y7e$c`$0Imz*2kCj@zvd1^uYw#@MF0sK
za1l6MK>Rms2*H6%F*I!a|Ab}{;QyNc!N~j%2J$};Rt-#it*v;qH&tCu2qP<8Fuv>h
zvloO(#}`%C#Mw;k#QTQt?=x;cIPy=wn|^O-X^p`^n#k+A-`i^PVk&=IjfYz}wCmlB
zo#C%GF-<?{-Mk3kG1DXM5xS7R?>{Ftx;$Nf=IuU8CQ^9(Yp>I(G6`ZlvixXH#O32D
zTZjNcC^4_tq;y1)S&5QPp9<?K7`%0JrCP#gSezg$iNgAubDg<7#zbfwlc}Lc5jC0Z
zz(;A;*y5{i+~xglaq7E%?ddVg><A@&jX5>;sW(#JRZwnXPin6_P?T6BCfnwOXsYfV
z9FxZNC8$l?J5rr8iv3We^lP4y+^V^^rFiFyTD|yiX_u*?Tl9RP%~XyaU^;HAJi-U#
z^9-6>K0_Irnrb)NpU|5-W$bDFjCZ3OU6mCrrKH&jA%5yi&t&jRo1~dnv|uAAY&m%$
zYLQHu<?_*!pxwaYcEj$^H8xH-RFO)h_n4$aNHZWLRDJY*dHc$*S+ayp@ALb9`Mj%C
zEiPGFQnF)LFl0W`WH8wsd%$1WqU4qF!Y4yot-|wT_n6>Y|C5o?IW?_t`PxDDNvWs?
zI?|gKDW5vqZwZrq5e^L|$@Pw`&AWSvI^@v$6{DY{<SCOJMf>H9*u<yA4@_ex@Ry?^
zq)XN$Ztx}Q2t+61-CT}reW*XFMy+49m~#~THhXXpjekM_{=s16$i#exf4DGg0Qdk0
zfeD|32p^0G#+AdF!x6)VZi4^-`CVx6pMCNK;=x|v3>^Ljo*39LN+cV02oa3nH!Nb{
zz>JW0p%5LI7EI&!eE=?HU{Yu>0b@|ZkrKUt&dblw?+=l#j$YRM0F?220A-xHm#;NY
z=6iVYIe5Fez}S$C$sj;ISO5eqoC-z(+yDZXP|rkDfmaA7F2XA)2xCN25ksgU|2+)-
ziBp9Pi>~@?8pTPfp6zZWiDOGE@X>$CIA=I@>+Ld5V&M$$%<Bb7TQg8<_=6u0plp>-
z9mP!hf;Jnco@s(?CD}V@Zf3WcG|bRrOPWNo9|$(HY-zhUGv73%{?*hMNp*Pth44Zy
z+><twXIwa7EiQ`O*Sc%lrd$8=r2u>-GHD_bNOk_uR?3kC6BAR+$J+O}i}#cg&8!-{
z$BkG%Q{8GQVrYq%gh{vBidF@ujR>w%XZMJPD%<%rTDa2b_t{^hSBa&5q|aITfyzN8
zQCNPupAp|HX#0suR_CKO7G7>;{cA}GmPsWpV@0#R@4v1c2N^E3tc%(m=*!>p+_Dq(
zTr48fedJ3s=$_RX#Ot;={>{oZLv-Gy>4hM951nr7a!&2M!BLk)y2zX9-8EU$H%EMC
zt#vOxOX@wZPTEC84C<)+>(}d11aUnHIEw1)e2|{U%^`oaW{*NG;z3IY7G)xn--G<(
zh1NCU<E;iNOfgwj)zp;o72{9*{3Uh#@o(5mZyml>t~NNb&cR7n*mJXpdW8GzYYxf2
zN)?-N)#s)vBPT^w4`!>+YR;M+TOYi$W|J>T_R-nRVL$s`V6LTnxkvC;cX{RICOS3=
zxXSeE^{R%rsbRk{_io<zX4ADfzTaQkmxd#_0)9pBtd(aGlm0ZhF!&=LT<fO3{W=C@
zZ8!;K(hzEMUruMEiQ}J~u*@d7uwZp<ceXjt4(NmQy}WZBy}i8k-JO9FE<D%T*V4s=
zSOOM7ECK_XA0Yh_^P=3H2m=S46G40txJ3uXz=V?^oysCc6~h)20tU);Sa<|B0je#+
zBgKH^ctLK#+`$+a=TtGrE;tx4_`ghoK-s#ZES$-C{p6{aA92XO{ubV@zFzSJW8PS=
z-ZR~NHw#QE8Q4QNH9}E1)~54BoS7klhC~1cG(K<v0k{xMP+0If7!NdMn6(nTA)cNS
zL4bfoVBrI>v4uuo0{-4W|Dl(wwubs08ElyU5(_ZvzoRd*Xa)ihpMqEsI9EZIv^>bp
zjSnsf6F-kk0rVHpv!)FwhE;^1*YxC&u?p2wl>?42p!$xkwtC){t{#qV_5kjpdNsJf
zIp)HEUQJL0CIA;lgYJ#LD}m~<@F{T7vf$!C6?>K#U`h%KfC%$*N#;mNz`=y8hxs*I
zFAt#MxAinX!+disZ9{XUrC=sNPQd|o=B*SM0~`13111IzraTBTd~`8-FFd`FD_OQh
zE2M<-@zQ5Cs>ef=5e=AErd~fh=9q96=T%{*egdYdT_@oXGx*8Jq?6SEwYgP&)F;?y
z2J|BdKt7KBFCEC=`x9zp_F_l&CxkG3bh^aEJ?n9SqzdFc7%n!peK;Wo(9Qs97wJ{!
z{_<yHdrAGlRWq93>#}bKzfYnQG%5SF`yYvM<sE~2(3c#|CAds12zT`PXs}2#>^f31
z6GRWD3)9Zg%()t)_7^4y^4S18Yz^%2SzCd&G-^{-giu?0Zs$KYR6*_xIKq?BO99%7
zvpxz)=BOqMXe?+@lFpinKPAD8e^Y^fH#*jqNJYH<k5uyh7uP;Z^LZ;B(5(P|-m(PN
z22hf#LWCEjf{`P8`1#^n-fDMGc5G9-WBUzF)27cg?s+Wsed$hiuQTfAnyyvRJtJop
z(Tg{BrJ~p!Bt0fhvDwq`m(lcQ=2kgg`1KI{($#3nT9tpWlT7xw6Os5GD;ctFBrY3i
zEj=Xcxph_STGnyT;lNi1`Gf7a;jM`WMB0zmbT8D0aDjvg$b=&c4LlelZTeTf@mk14
zF>M@$I~`_vGb^U?kz`|wh&|4H|HU%s;DY}l_G*Tqaak)y7`T6Yy5@TfiA}Xzh(mkM
z?!IRU9pQ7Ukv9>Ma^<U6n3A~qE_$r$u8#M)6OTd+Z1?P5IjV^D=C144YVxP6+++C>
zIxIGHq3OfAN$LIjYqD#r(`07*ZH+YpX7HY?OrJ*HsCv;3Ghrqy5bG*0<BSCfcS%LW
zIlpF@;IwMu3Q<1L>WtTGS|!d`r!4gQG>t)CH*1dNz&s~-b(iXh*je&g)pEYpsW1ip
zD4S~+bi3!(^*j#8__&MY{EWH6Sr@d8IqKx;Hru!^%G`7OboAYC%h{mTCFg1s7Mto7
z#uG!9sT>ol$M^O9k2WqRY-u$FMz$6jzVnx^pKj;1DQ4%WP9C5x*_{#c7VQ=+)%aNH
zyB0JP_gOnY`T3yft9jwD&7H!a2w26!yVa|tjBI7F!FG#;;w>tm7pVYxk%y>kh$AA}
zz@{HGsZxH-X~$)D<6m3`X7%?(gephyDG1TwflP*QRC_@{L5eJN{&a3Q^I6jj6fiWu
zXQ0#MSreinbe0SSV1fdIzdH~?QQ%Sloecl4WaR(UZ@h{T##XECkn&X1HRxr>?A}Td
zEqSDyJ3bQmE?XndHK%GIa{u}cS*{|Lym>*~w!=a2c4j<5Xckj8i6D~>1p$ZGL)Sf{
zVsP-WLS57p*``-@?HYGj)EyR@`5#kK-4{a3Xt|~3XYB8N*Ol5BHyr)K$@}Ad^$VXb
zOxU(}?_YlZVa0L&LvpM#==QXtT>MOslTqM?Xuwm`@;6_jZ0fFU`Ks(%M$*oj*Xa{5
zJGhB5H_Mir*UYI0zx^dnZof|a%-UtCu!nI_gy`njXZqp}8*kYnglEr7EvD)h#+m^q
z6G>ia<vijapQ(;-RKY1qj4nUC#P=(<FiFdo%7DWoog*}dP6ev)Nx?eowvXE-_T+R4
zF|yj7o$Sw&H&(*uSSUY4aP_9P=gfVQ&ht9>!gSr`{?@ezWZcHyvYcgJ3UBAta~Yh)
zdM<DGmp=58cX(Q_T$?44KZd!`zL9sOUw(#0HI!0lXhfrI{fX2Gaia~_fe$B}+^T##
zR;HcWHJzWj+ahY33D6N9BjEt<;%z017S_AQyEB$^X(!@{{TkRajfrpR>c-OVG2>2Z
zlir(M^(EI$>q{h*ym5!6xPt?CpOTauGuWK9+2)h=LgAwHPN#Q`%tbukl`>OhpN|&#
z#&{T<AmS+fwYT3)Uz@?mTa~k4y!UMyA$ERDI3id#SdH#COaXi|`EUD;ziRUT7McEp
zu9b;T5hJ%uZ8YZj>}9^ZOs`-d(f&JTV#J&k{y^jLcZl>uV+DXQ&M?RSCBn#|XTiWR
z!f3?%Umy%JLREwSbn}KOoFnHIm;_8LM<homMgYyn)8*eI=Wix1{|kWs`%(HCVg;Mr
zL!{Nar<W+QV1(F>Pcq9dR?+a0YElfr^xn499QNv%e!P15(BlqK>1D?w$BrRJoNv+=
zuO|tXZ{C=2jXj8hvJ1iO2kXfnx_9enSTPdfMif)GmKY9EdELceVSoF;QAWk@(9@f8
z;<QZr4o_fN^q_+IszrUNc8Xm#Pxiu{^5x^i78{OOm(<p*pkWXEp!MPwAMKadcS}fX
zOuwCS>c?-4-MQs!J2kN3na_HFxD=sS@%R#b8QVpUj)pm|A3NFA0guD;4P(mimHOtp
z@8*0-KRhhV@~rIc?dWj2_2Cso7+!b%)4|wSwr1^owI)BiluggfZ&$(BibO-w^vWd}
zan(rf4~hrQp0Zm%zQiLX<6N|9*CjWoT`&8DnOSzYfr4#thS6VQDf{`d(5=)74(BB?
zud+f6?N%8{|K}Rd54#`SUd1;T6pxkj4;1^Bxj4&u%*gq^cmL~Vy7?jZWXP6smJiRx
zOFSIY?o_ug(k6&Brj35yy71Vf-(y3xJsmU;rPjW5XkkyCYxi>203mTXrYb#$d-Z`_
zgTxqBI=s#bj|9Ip`~$^Fd%?SHqYo{RgNQkSc}V;QXwbBCf0#8CM6l!w=J>E->nmS)
zITlZa`*SE=K{Uxx`okRqeQu_(1H=|F_wx8*3BMwh`WFgf#%WP8x?Jv^)$yPscmzfh
z5Ognq)&b`Cf2BMJlM?<nO~N0&O-}eb7~Sta2oDoZ^tV<A#_-p7Sa6cF=Q4k_Cot|m
zh{1$#1{fU-I8laB?oxpDZRj)Kj_C4Q^|U{|9F=&q2jl;X6$H)#fo}Mm?&0gYHO{=^
z?D=^yp5lkkO>3V{=%p7*@&`H;pYVaU;IFO=%#VD!17m{$6Pp4#92jZ7H3eBq@2QI0
z82CJTIHjYY$di;fxO`~=RD!I;&w2sinE^x<rVM5V9na8q3;z_yIQkB=bA$|!v(Idc
zD>0}AePp^HEORmV7C_RlHgtSJ*VnBk@DW{F(q|h&*1WzYYV#!!E16$7gOD-usjLY_
zB=BVIpYe|c{;|M67Wl^k|5)H33;bh&e=P8i1^%(XKNk4M0{>Xx9}E0rfqyLUj|Kj*
z!2fp^*fGHXg;4uxZ{PGd&Nzw^x$w})Q<SbxSLl<IF!1DhM!D6x$|7r$2rGA!A1YbO
zNasi=VHS4d3v>Uv9%y-+14{$v<okyI+@#W7fl<<UFl&2hM;nFL{12D8iN)6t5~Jsb
zUKH)d>(|)TZbNWsrW&vGOn*t#@j7_fbHtfan>PJwvBhDYx`xlUXhnBKGBc;Co08qN
zt`qVlg`x1R=;?b~kQkWFAz<ssI}O8BrLu^hXEUSd-gwL!L&4qn+*7+~?|$8e{+Dec
z!ym4)_6~-6JpEOT7t(0aox9^Nb=5`qaM>rd|D_ox{cb6Jd*9-!P1v;2qlo)TCp!%S
zww_Te#MFMBZ|jjS5#f2LngB26I2R%RVRYg#gFzrDNKH{r-#>Gu1A_>7YXCF%N$9&^
z#;aisyr?Y+Ti3?{flg0X-eKT@K!lK7>thA}-bllZatstjTIo5#6u<!l>de{Ib|n^l
z9lnS98WdCt2nQJa^Zh^e`FH;D4o(!NLx_bCg@SOP7<d}02uL6-93sL1#lnMZ;b0qb
ztfdyZW_UYrSAH6VY5Am9Bp#$zw(<EqDY$jz+}Rear>&2(mpE@t{18~bxM8iP1>8rv
zo*Yq_EFlE(5prom9?YRd!jX(1xSX?uTfm`epK5nHy-wV^`<?NAeYxuZSy$%%oPO&C
z6i1`AxJFOH&E;zMq6^fdWF+SdXW&4z;3~;6j9z=j`rHxBvEXKDe-aQwlAzzSXxNmy
z{^110z@l6x?lqlafkd|~+2(I;Ku}W54v9_)YL8bqsqZ~R(?(_Ixq}?aqliPD4=$aH
zM)-f}A-#e7PBxX`Y!NfncpxaDQiq1U>oPfCC4C&}RUDnQ1^(m%vc)cY^&f``3WIoz
z=W{`8pW~qdQ8aG9(&K;^29Y+Hfs-MiAWVc<3H@iSbOhzY?>W~3XL57sH`;B6G7}cN
zu+?36gS=@1vgUwzMh=9wcB-@rX(joE<RwfL4<e8(E+#_4KVi>klYrb9*H4Ye+s$dO
zN?%4&|BLB5K!zL^>15s5YQXD@=Yokq%#?~9{8+-kmJUAd=r&MEknqH#!(|gBub;cp
z8=J6n?R}}lm44#0$so}5&r=9|Zs+k4j0_HB89@12IU-=~kPfdn;qs4R$)gI)1FDUF
zwLW_rVS%={`iVd7qVpBq^HNz2s<^9cAJEdt&Wx=pOGOR~mtcV2{VcW7QxRP!N+vBN
zJaLgq(%%my_UjjY&@I<(-PH4Z_FHDyDbqub?ji>V3Olx&?N9XgU>dEp{vBNh!ANfa
zM%bbj7U^^@9a|G{aqe#C8{C6$IE2S6hq>697!}go8LN`HV97z-?v6^G!#b-&Mxa|J
zsaWUJkO>qQflQzTvkXhJL1G*zzXr9i$hx4?=nTpfX*vdgIZsX@6t41i-Y$lFFq>69
zcRv>YGnGJ~y;M-10?Ku!0Cxq<hmb&U*#RNN!LtyTJPPKSVdr0XU+uoPVN86{sW8ak
z;`!7CnIA{7D(>%B`QzdMjgaPt69K*hLHI>HQU5w%CM6sm<t8SF?|2QbfWVLV<cs#)
z#-d7Zz}WhDo(l!tIhQaa?Q2hcNnCmE+W<IozJ~}XDFl(Gk8_l)Ls2XX;YbeSViVFl
z_^fmQ6(rtiYwn|!K7!6KAIx1Z_|yf=LXN6y^C$j4MNAzd<B&^3GU`AE0w%&`#i?S6
zgT*_XC1lAha><k~mV{)iyk~y{)<y(i6>`W<l<p^#G+k8_0WQuL0)kR1bf{YcX#f_D
z#c&e+AUbMQOXa=&-i8`eExSn#_1Q!a=;lgV`^L!zm)f}pA|oDz3#r~+r^ex-34_&3
z@LdY>|Gb5wM#yU(Eu46y6riYqO#%@{!H&wZW8Y*yCyv-yOnHL}4iM{Ztdh^UKGQ(X
zlLbLKh(0>BcR}ntqNoajB0=(4eTflN9t}tQ`%lJQWlG<FMLA5^1!bSv*xT8q9Ou)K
zN+CmQ9akTUK`~*md`B=GGWsqPL{6t_$KX;QdWYnRdhnKcfT|G*ip2uu`d9PqR}pdP
zzgdLAkXswZ{aI^Z<!ed2dU1k;EPjXV1?r3$@x7yifUa1Qolg>JE!rg0HO#2>?&YTx
z{4{i5)nE%a=L5LNnTwVF7|^GP>m*NAC4wba&8qF~Z?Av<s5`#$Aokf$)MNzCu|!qv
zXVNt#MF#Y23<QvzI#gv1*e$>m&v7-N;dqWTUpqU!FD+uRQ8N)sy?DU(<^>QaXX8<j
z*H5DrCiJ$>Fw+9lquwRdQ7Yzi6WZd2v4czEV1nUUj|2HTznw}hcHummo1mBSM{0{4
z3)-w|H)`F>m{O4;hV+bFK!3n9w0d!kH&)jBv=N_Re$I7$X)pap4>Gh+kq!zHaH^Gl
z0Ip!8NBa|CJy3^VRDwD}@dCpb-8Eb_tg7mnZ+lD8But53W@F@1X97W>jr{zVyU)Xn
zew_;h_72#3g?H<qtD?+{8qm)?&<D}ShU9a4!v)TIU9oq)%=}(RGm@Xr4r>>i`x2YG
zSsHjgdkP5#q>zrvx8xea4XQV8L#(YA?YYDny`xD;L<4E&i6Q3`bMh!;R>miIPD2#g
z&ZnN|HB1CEm2SE$m_PGwGSmvs58o-r_00en?iBEp^KdZgd@@MZAb9ZB)#K1RaVP+g
zBLkwKt7=~~+~C9uk@EHH*k*1VDsO<qY|NfArShOOgd<5ox$94-#_+R~F*hw!e$#z*
z4=F|!g?~}?ke^Yhp-s)OBPgSPE_Mod^AQl6^Gn;6ghZT_sQ`sgppeNoBxAsLzy|)E
zCOwH{1RZZlF3YjsQA&jaKXDONhwr1(Ra_ZvGclF^rPY#lNHGxoNM1;12Ha7?+S;xY
zQkbm1fskF$l6$}3PR!)QB&gP8fqYFLIWp@$#qJ#Ct0A)na-tkr7!2^DQCh81d<s=r
zrRVw`U#<}mD)><?&Au=Fjwv|TphXhg;C40{1geLpG3@%>o5#L{3ZpZSC&ffC_1QjO
zW$bWdSSGtEN80)XT0p$-xmU$6HHD>%n!8XS9KxADv2XK+EahDKEU-IJQm`zY0~f1t
zr>AmD(&d&}>?2wSKcCIQEBDdn|7yY3<otBscAO1`J7?1{t0llx0HPEo2lCNilVcsa
zw@XMTHU*{z%l%&LNcL=h8YOC}05n4hyAejc{V{k0P^@?!1G#ku8|^2XxoZz@hypds
z+3*(Vo%+%|#|G>wU>{_{0t{Ov-a$m(xG%nON~SNHV^FnXw)6f|*F~xO1fHmA2)x?*
zcTb(9`_8drN*DM82O!0cgo1Dxvimynkdz*aNzDzrwcR!`={jk<)WE-#th>&%{1_|M
z1>gio90p217?2`+Ote*t@qSu>@oo<5ToT)JSdazVD0fU}m43&f9eR8?lFAS|i*_r~
zyKJuW<J;T4>?lM(iy5F~Q%B(OC5Pc1o%Uhr-?U@XN7ValTCNJ7^q>>d#sHU0-6Tuj
zxn*b1q7*=?1;cT}dg6tX*2W%gKMKeQ_SWH852I8aSRA$9oYb)|7l%Ysm(I05b3i0c
zb>K}u3d5sjW2T~)U88I%aBi299!=*~YlosGy45)k?EDl^Ll#fKdS`Wk#6XFOP!fnH
z<FTaSrZI5Yyx$CoJSN^*-pEb*kXjB#J5WyPVNTUkw@ZEJ0fby52p6+jysMpC+5s9~
zN4?e_Y#JoSgzO!WgL?D|*UWts!p&kJ^F6YN#RBT8c(vYF%7A`h9LH{ZRYT9&%6{*M
zhK@Bq|L-h|meDK0qzH1P(m<r%_6bVwR^m-Z!9B=mM$?SV5fF!5%vrht%N?{Qx)9y+
zrML;+tKWm+pehVdj^>wTB~<bB4jp-T_ilGW$aTiJ_HKR;!}PW@k`t&j7$dQ3X#oG6
z4Lw^3P}-{4rG9FATdf&}bWF4;<a*BQ#8Vl)3%s>uP<&7GE7B`oM#3s|8i19MBdmlg
z0A5y?yo9nEkid||ylTEYm=_F-Tyocu#i`|9WP!HdG+hxqp92DUxbIX?2_C1Sf(Kc|
zfpEdH8B^`iObW%#R}ub#Z%LR6H?EVS_f@)a`yd%@Y&aEQY=sW7QUW$u?WfRQ#YbCf
zY(W@(Bnc#Zd?*<?+RuZB;<D9{VUBcsIFO1+l{%O%!8Nlk;^|`H-^0ez?;WU!5Ovo#
zh)i^!d-o%06*YHwGRtOdyYada2RaV{feIr;RKYmMHrti0R4#oW1w-4Jm}byPWTCa>
z?Lo!Zxt{~Q1=0vr>Ie)sAUvp#w0YwE8x`f6cMn!J7TctL{`R>AmD>Yj>bvU5I0uxR
zK^`gq`4}j9@#QQDYKA^VuA=M=+L<wDDm^#yA7li&lb)IFgnubw(X;wPLHNICSNSKq
zS+oC<9l;;$#%BLuhuo#}g1m?xviNDw;x@`)VN!k*u}=R*Dj`)p!<WiVoCb6zF}}5Z
zpaXC@b1@)fkl=Z>yPYnA0Qx+VezKB^$?!A=#S@{Y7hLS~K2_+P9Ke#Z2oviB^Rod(
zk!s~#ffcUCqwN7?%1KMazKoi;kw5L`m3p2iXMjmCpiK3O5I!pVTEt?ZN?9H;>mBqJ
zDf?`A7#urxFrd9;3hlmfMC1-+vXQ6XU9WUiL|lD(=^lw!R*H?ND%$Oz&KgdmbN{*f
zLUNoPPDMgia@<Ix`2V!@*b<f~I)tYHm;ez*A}isTU@3BXiy)L9AZcH^5L6jF3upl%
z1j92&+u!iT0Xjn$*3(It4oEyP^-$zt&o-F*&_xK+j(~Kl(}(BMN&b+&R;)(2!;VTI
zD91!bwJ;UO#=KrzG-WfsmMq6uS8VXSx+nfMH2ZhAtp4h9&$VF~ZJ#zPx{g#Q>~QB}
zSJuTs3-rEjNU&fdK_Bp8;BWy5mF_BQ9m7Z%`KMF<#22ZWtRG;~=!MpfHm!%g*B$|`
zkvR>yRv^tvbhpz}i$D;`oW)`7Kc+V<-T1zDAkzbKSTvI`q5a^@*yp`O;%xp4xz4T4
zj^9Dzd+c|Ns%_9lEEsDqrTc0Yqu4>PaPRYC7bVi4&PKy&a{?RcFyU-lx^ni6q)2Wb
zgpnqqt1iTZh;T80CCK1J`UcQvi6N-So$^lnh%pAd_l%O?WWIU5*j3TiQ;vZ~lCXyM
zB5X7Q%>b-nxZMap`7wQY&4tiPLYg&7MY;Nme*{_k%gP~R+tj~`0uW(W)s~7B{^3;D
zD>7T*pyEoPtUeoIkLG5eD2SRt<v~>dhPiS%HriRkQ;7ZW+rnBB>816bKCmG{yDMn!
zB#R#1kN=TAfB>b71#)^Lx++I7-Og%90t#{`(VB-nC@qf4K%AP95%Tzv3-s=xbOC9M
z1_vABbL{^`kMiv}#^67FyG`VIyTmyW(uzpmW*BR4zW&wlY+D={q&4Kw<*CQ+_Fl3L
zD$xPHBnyPEL2Q&@_^FJ5SgK*KO&dPb_ZQP>@|ju+X*OCk@ADe$Q5eNdeK25;PvPML
zGiq^RN4`N01gOXb-F)(5$3L4NWkY0IK`9+?Y93GYm!C5245F1r)*r~ctk%`er9oO@
z*ttf_gt9>x!M0iTb+iG_eObK&<775BJla~7^2lec;gf=l1Bx27^F64R?XS4~V{v@1
zQ|cr*wl(*3DrbMAO2sh{=BUM;fqz#OvL4a!K(MChU>th~i2;CdJ`#(6C8_~ChxF9H
zn+?TTZ*SrE#>I~PnEfV~dTwQ8(gP7<=I&O$<OqB$i}Mj}+YMWKrqXj|&uD-!RY$a6
zzXJ1MB*)@kc=9Ut^6!PMh4jXvg9#9i>h|N8&46zI(;p0_QRnAqh7ySO8~=$Rk`_jY
z3D4(_O2s{uVhd~|CXal&%72gKi<T6!WkwGFissWxCcp=j0gz6{HqbuR1idjL(I~Un
z|0!}2t;dn*SOiL0WZ{NHA<52m$(vV_>+nBYJTgQbR)P@jde60M&Uv1l*AsTa3TE3&
zr^5;iU>MG{Ocgn3uQE<WRX{UHhUjyD+=xvy!Ja;FAJ7eXG61COYNJ?)#zJT>#L~&<
zre`NQkuGTbIx_vMX+-h@WU|e)PyIWYXx-Rm+h6`Wy0gWib>ocqjxI9My8RzNllV7r
za&_CV79A&ln&_WLBfq2a|JI|SchzU-m(~2ZY==qsb+V6`lUqB!-SI&XwKY5&|H5zL
zT$J>U7w}?W%<!NSr6h4A3>0Zurl_CHNmM*@8paFGAiZc?+>P~8;Aq~836U=@4Qfox
zYb+rm@flJ!r5}Y<iuebtQ?{hlzHl+^`=GvCb07YB<<w=mV*QrG+k|l+qyB`E%wO?p
zaNE0jqcEk`1G)8(D_$m|G3cNH&K<J~kf|04M{@YGI+W3if=%nZa%3zur?Z?(RL|I)
zhik!@JqxGb*A{%0Wfn2Rw8aE{G)wCFM#q~<S@g0w1a5~uZ1LOe@%UImBNJu&UWlKr
zt26|6Dk;tWFEJ;IBj>gI6dXTNmNa^?L4~w7ohtI`O8Lmr3Gi;iI~$Um0wGBK2Da6m
z(?}f5_Zpl1i<=mT+(fwNn9|AT(S7CJ`aZAV7XiDKE+$J?n2tjhYeFc$6u{VtEXQfg
z@!#K=-g%~YW>e&U2wJw|^L5R3;LFN_q86K&H>vrW*>Cut*1q9l*x_3y^U%F9Crf<L
zo*|n4X%rR&+IY#MIVxT@XY%51ydPDl4t0~0UeA?#+aqE)L?J0pBgS2ebp8@x#5Ri(
zpo<+Q3m7h6mzOn_nd9A?l~9~#<oQ@^QwnzV!wRFPx8~QIhGMS*tFg9CDRZX(^|tU@
z*mG{$wBwIe@Mfl)8Julh=?$iz$c3KE^#-)IvHljaVUmhGyFsS4YP?7bO2`6tCREi|
z)tcfyDK0KX!@av%Yb+ljTlP^x82i$VCk950SGsT(F4;~3FQwBSsARjQm0r8l^P+9(
z_<P&se#yikA^XgS<<lp-hvzaD^i$DiqRhk*AR4TNM^JI8u<${fck+vrzAUlP@*^KP
zIbMCfJkuDaJk#cW`*^;L|LCFmg1xOt`8s#TLFz%^Tg!I6xeG<#8w;J?1GFj$Kd~PB
z54E(228*5xIf`aO`PeKoekTZoHB7Qi*jaTQTQbZQR`opYL*w>y6HV@`)LnN(ALBM7
zfEVPC2#$^x>7_wWh?k`&Dh8XxpHC1UxfxNGlzqxL@$GXCv2T<S&>G@-qmq9vV<U;p
z{M=GAaC})1CH8_JRv#7*cG<g+AJzLTJV3V9SKXj?tO;$ECzvgvC%0or5cxcsYeU4E
zrb;GD>VY4|zCCc2$)hiHID~(;Js!J@;@cD_2DmXYK5~g7b%3|`4=Iwd!=a{NBZX^s
zSxZ(ueSY!i>P5>!CkyZ@+R{I_E@3ym|FQ=P5^vC4YhXTpcJ*?P7*3hC!K=lW_9hKi
zvh~c?_bVmOp%O8~hA!@M$s#O3F^l|1w@C@v8d;6mrf7PIR(O=QG=%&Xa3M+7SVmQ}
zLD^(;M|4bK_pf=1H_%oDzbq8Fa-<quDlq46GR`}+|KJ<^ODj|82NdwMrJ|pt0p0@w
zj@{>(p@pOk)z!GZR+gU}9_}z3^si9d0#*BBbTpG?^FI|03Zs|ACho265^A|dO=8d(
z_cG9~eCnrZ+R*N!fPgRUZhlFq6N9&@E9dqG&W1ZJfYWeia-S$!#O1m>Y)6`^tZ$vz
z4KEAEL&c(O4RM!R$)qc;^x{nBzTZstY@Tep3Y<!x|1Q81oJhRkE}o0NsX<dxu)5#i
zZL_VQ!Tq4n+e4^Dl(B{Su1&_UfWq>=I!8aC<cd~QEE7&20m-!MP2s+vQOFeREHkh8
zgc&rT=bv6Ax45WOTJw5R_}jF^sq0Y9iD%}-1S%7SvGoCf5A5YkJ8_2xWzVJ{W$yE*
z^=1l$gda6q!p1%suU_o3*`{G}ymO*yz_Mx~8Yk5D^c#<8lYM&=gET0VWg}7K#{=qG
zwIBHQ0lC}k`ZTkYrt5do^lznJ))IVXQc)UM%EQ#3@KMUz<l%~3d!OCc;)&JQJ}Vrz
zUl}ai723HQG;~z;!T!6}FPymLpwd;h%C61Pj9I|L&PP~f@=svh$bgr^@06v9TI?9D
zVSdv6>kC(X2@g+e*rlo+q55&NE_pe~H0fPu)gs@{IXT<|Y1o*Nw&(^t2o!SD<>2}N
z!QdT7|Eyu9p@|!|2C@30m0N+2+^>(drG(Zkp7839>XFlb=ypgpX&P|)dhM=hMIR?g
zWJ-maYxysyl270A27QZ;7d7twR%_!aTQF+3rHC<fX`&as=-E1ng<iSak+)v6#iY(L
zm<-1%9;LQmr^|}c@Ju6PPT^D(QWUPx8F>=lqP=Bc?xht<16Z(p+R=G<{qm#1g3=}D
z(JFk_=c~%OvreI6{o;>QABu&1^=@k!Qf{sctxkSqzDp@|<;77(>2hi!Jl^J*Qiz)_
zDJFyeVTOkN%el3Z*XYA55a=ke;L^E*K=^m+kVY+j8@(DQttv#8;4L!OF*nln!SRys
zL&x$J!uVuw<^o*^6=td*E>r($$3=^xS<B0SYQ<6`l@AFtm0#_9CVjd3Maamr&$Sxb
zhyTFfSTNVz-LI!NEz7WSI>r6~za<wOnlmiAQx<b|+oZrjVmz>R!q;!O*>NTYeS8T5
z1tk=qPy4FzBLH_>6f6|RSsa0iy--YGYn&wKlM2gE8d;<G$;XRF96>BjDYi#B#)97(
z5t=-Y<0mt-@4?@LW1;Ng45z;MQP1KhSBH+TKjnk9fRY-wpZh0vwM&bu%Ev)>x4$&q
zh(0kpvAkqoE0XH`qV7J&g{=JiiVvFW^@6GAnFi@z>GunO&gTqF@FOgc?!QMYCq$r2
zDo<RYr8!t3rBFGHDbyfRN2T>r0-v1h8f2bSRbhRDD32sJ=agwiv@!GBnM$CH)GiLf
zx`g^xQ>NmO(B<80J)fR^nSOm;GGpu@-CeS1+o1NF;*YVLZ4Jo{-pgXMuUzz6#4hgK
zNz-_AqyG?nSP#_RPYO^i6&z`y-pzR{YemRMyqn-GIzq6VhnMp@Wbo};cFt7@QMj0@
zo0%MGDrHOb67vZ(NM_^n?!}hPUe-NO`AkTIL125I%*$67_G9V$weyX1%T@!m)JEJh
z9|pFSEfXj(V5@&jU^ujJiMeb0EkjY_=@r|3g;_t?IPhc*HDKx^gy-1-<wD}}xY%sZ
z?nax|=_>XSt-SwCDjsp6>cxv1((<UByDT)g-CVt}D2L1IzYOJd_GBh8S8A4F5T-C0
z+v^uQzp37;)9LlOexoyraqD);C-L{ohQ$GG{<$O?)1AIgr)YoP&d`p@xQj_|=omTw
ztL{37L}tZxci%w$U+av&yH3zvOaT%_k(<VhABi*((}~oZkq9|Lib$GnCkDxm(o0ph
z!Da8DJiNHCvJh1tF%-vz@#ZWnF_#a+%|jP^de?95fmV`T6Kf7Nbr+6Z_X5m*u9%fF
zJ%9DBYbvNDl;lQ#sqWY2mxY@<4?j*MR^L~=ApRw7E3e@Acld*PSsc&HH=qmwqU+UW
zQbV*-G9`7T8uMiO+kVEHuop_o9^oz)`|5I}5#h<Q^7W)qb$2kY1PH2vJ5L)Bvp7Z<
z{dj;NdsSh@Nb>mMJFADUn1*y4O5eBA{tOJIdBhZ*Kx;c&=7jT{qU_kM%scHhjiBS~
zhEu-SvP5&)%(MHuAu)C6odO}c*@6M>&aD!KtXlPMhR5AVw}a7YDqq5%8vV|)Qh^|%
z88mzo)?q_ISfP*-aNA#QPo`0_@zN|oY%k7&QmWWB;4i;29KM@P((4j)JbBL0$J<zO
z<IT&*n^HzTo5I30BFDRh1A5UNDy|bxxR4J#&d0(S8}c{@DV!HS3Iyb6yb}iN{2mLq
zTa6p#;rR25a`_el8RY~Vce4>z<dK&7ael@>iSauR?~5aF(y*n0(t~L7VabrBgc)_F
zBa_(AuHu*9?sW@4^wG<B6c}_Px>B~|{UggvqoM2{oZ42lO3xfmZrP&6gJvET$e`r6
z0<caB6b<yaFB2b3#uX47x><0jK6_A)Zzyt^oweZItGBN@IbJ|!<QY0;{GZ}Uuig7`
zuQ_Wmb($d0FxAVSbRml8z0N_P+sTyG!BBtM^{zc@LgM<JD?u~M%{ztsu<_%kRPMs2
zp(*{p#V@d=t`{Zx#dA5LcAy$x4udjw^VH|ox{?_JN*&o_vkA7#kG^2B3@^8<ew}x}
zqw}*;fe!A3&t=<sPWj;WeV#8@5c_+3pra}mj^}o*2dd0L{Z>uafN-=CIqfTmcEqMk
zQlh#m=E-p5o@-xCCqC9-(e}wNj-lq)Qnw|V>>0Hyd=I<KmnFuZJior09rLNA|5+aX
z{>&%hbvv3Ex)*n@^+ib>rv#lItRkP+o{z8z)t5jrMD809;K(M#51b;~X~h<8UsYRE
zU0=5a9-l)@Q5fHOV0@<tulOAe-gk@vmgX0>-IS*jn!>QvD|WyiNhcC!_!<1QgSRL&
zx3qkGx>cmPYhD4vtz;ga8>m)Z;7s}C^@J`Br$d9&H(hD7myfiWe!kw4|FTl})7!x8
ze$Dv!NWR;*&5!05ji7-bkzax(PntR5v`P27l@pfL*Grw2c+d)i!Ya|QJ1dDqwdh4m
zH5Ww!GC6(1m!wzq@T}M?dgqAZp0!F=Ro7lnBxf>e<g9>3vst)4NLV=KU63x!>LM)T
z3u8(X&MW$qYnP_lX09RP*gWn0V(zQkQ!SaN(PDJJG7c<nw7OljEP9N?SQ8U+88@?S
znN{<B3$c+km3iXF+IN?m#486y+rBtb5^dp;j;S{#OA_}gZueZ<+2mUKeZUSnBJwNa
zV{1iw1yB_Nu37m&k<>eeQVyOI5&irDh4Hf*in<z4%<2K~Jqmdi`EDx32s}RM5i8r$
zrJh5?m>-T&hzF2D?}@L}Pn8=zCo~A+HqCo7()(s=BzWQ-%LY}V)L>DYa##3^InDcH
z+P5A)QD4*E7Re{LSyc31del?I(KchZXm~S7xB*o^0@fV0;opOPJ3s!N<;DkF0@#-p
zq%6l1k<%GQLX(C)8)2H?vw}achH$CV7MN19Nq)RRWdxH@;uWY^+>Sn-2NUn^yg`<L
z<}6R&IEgTp&HFqjx!=OSA#&sScy^xG(MYu5xBD4d25xV3n{|zzUkhog*|SySR&>ys
zI?VNrmF*q=8rU4_l3yThJ^aH#fUZ=Z$9O1-uljSsvm=D@(C?}NVeUV_7<u*^2dAfW
zrh71a<qjw)$C>bYSq&|r&sfPC&2S$U@39vxpJ}tEUXoK8H{4(1M&t!I56`OiqZQ%U
z=4~N3<`-(L=ixC={FsQ-on?z;C~do8lj-z2vo6DU7nU{Cut!7lEhrNsbdl^iX|Vp?
z#cS{ZZ;*wB1qc|wRRUoSkC7Pct1ak}7Zdre$-ISmy_1OHH*ePkM3i8D=h|9`CLXuL
zCcO5Mg;n6PRLDW<;_DKEg=o@UCMj#0IDxUTxlCqOX_}ztxWXNk^X;_P4?YWIirs#^
z7DD%L)%inf1-fDPMNDA)O*62g8axJ%w}<ek<%+&f_b!tRZD0|<rI_~-!<ZC~L{{fq
ze>(HP`~x{%tvla8lh|&o^f<>D(EAClOonDI&bNnp|H6}DB2mx_z>X{|Wic4U;teTw
z%2MB^Q239wLMvAV{&`~$fj|I?{b4f<Utf_JyulvAetZFaAJA92n5lb?ghuXj`K3)c
zSS0sEI0$v+E-qlv=YvH3k9VZHMuexowSgiM(js#O_)|J&jAKhbpX}`?<mME{F3xoo
z=?nXzCH_yFh%E^+6?d^MC3$r)RZ2K>Gn0l7`)-z5OJKs{<hKOE3zhfWSm?2k`w!;K
zneW8G#y)dJWRlD!$IzvGwaGu@2D7$N+5p>8y1?x2B5)(}{K1-}QsH%js&{Hw(=}Di
zdafU0f9|i7<X$;_q$P1_b|=dV55RhhhV6+r(LjQ!UEJYSdDI+ntUJW!Gv1)jQ#|2T
zy8c4{`TeY4gOOrtK6l*khbFYMunw{M{D;SaB<{msedty>8gZ&+KSJ6N7*J6=3Uk)>
zZQ+%Tgx2h4$tVaE1bwp*i7t<3nDN1KG(DRWqfmSn?8rP^`j#jQa>58d9hZmSoIlvq
z-!XVsr`(zd^^c@7w5fnHMOK~8W6T9<9DRmUGKC?Ix_*k7In(^oB$->)etC1<E}*SP
z;z^>=(|ZP&9}RdWa1O~x6p1q4E2&vwT*A(iGoo+MZ#5Kt^HWBq{AOP7w(Uc7(RNxm
z=ECVq@JnL#>80(%!1e~5Fff5pQ1Z{S66!prF&Hs$B<U4gb@3xhaz(~?u(H;M1zq7?
zj}s<Jtg@@1G752(f{~9B2ERt&aA6J$vpw-;fQb6bgq+BG9oiIh({g!I(2U++F1Gtz
zd!dq6o$gYYcG$m<W581uv1KRpc7-UDz56lwsty<MV%AC$RNlWnbDn~~#km!orXAoF
z!z4?EQF=b_x`0$dbBCTo$MzlOSGGGIp`tNLdKokk!I>%-q=rFZTJPfUcPxyrJb&CV
zl(pmBntkPVpN`J^uBw0u%hJb}*_r!c)z2U;vUdN;Ut=ghcNZVp_38qGa2uy?z-&08
z5(`t#6IG7zzvLkdMv#N9T;NU8#uNo!kHvn?n1K=Bm?Hf~Ujz{4mUB@OF-s1i*oKA=
z-?7PAgCzD@FNr5wD*I7IMpyG`@*ZyQ@^>wXbJN)In)S*)rwCDu#-csQxI@#e7*%XF
z_dmrHIt>tFlhS|JeD{lb67*HwG1ztN-5w*>Stwlx{}D&16VF&2TsbzDiyW>J>lRd!
z&j}qUc+1OqTjXDkip$}1Yg^xeHAPgA?zLmCh+s<cB+*8YAc#}n?29T{a<4lY&JvYP
zuuo>!oR}5&>-D^gzc%?;cvv&Q;P#s(CK4_F&@1Ln2fA;zJ}k9x66#ZxTuHKroP`Yt
zaaw!oNpQK*A{-wSrjXhO+y%0DRyB}i!(M^BUnqHcgT{D1)bDaCm`)JJn74<fxnfHK
zzNwfa+4ZwR9otlsDkHXo6G1X?*BenJ1M!y_{@HyuzlcvjXlKA`Z|4}tVBo#JflV>5
zx}}9BtrWY>f7s(Xxtr-124^aZp7rOHLj^PB&+Qpz7#1FmEY{E<gFzIYmr1E$?MR0y
zNzZM-W76Ow)75SAhW6y-Sf!qp+^UoCSW}5mEhS{(uwS`j0R%p3AvB54B{cQf7m_+&
z9NjM?WGAAaX$v~mqS`JW{7Gx2;5fnjpP~dD2;$ZY&Y1f6S+=#TN(BXvIT(NJXfA#y
zvVGn**d>gKud=9p%tQC0X^n!1q`RJzh8hAd=jGu!<iU(2+3FMBz#1jUJ2h|rHtw~?
zz6YYg%Z<1)9a2tY-e8nfsyui2=yR6WR5`T-lP_Jb!uZKEjy}~#pV~+$qTVo2znnG=
z&}}>BTE1+`FZ@(9)C1kDp2+!okrBBhMBD_*FNIX(^US}j1`-scPzY9&h>R$wG$1r@
zbtLI(v8C@DCy~(1X{b(S78XgiOZ%1|76=+eV9)N48$9Yo4D~9cCAS8A!BCLX<Ts#}
z2^+bsWcKlEM8<!p5RxI}R`NoAJ6}6vQ6b9wJ468l0XkOF-c57ww&*yRu7_pS5=D8%
z+e@$~buSw&jE5W7^x`cht^{Fyktv?nZvTX1lq5;b1j5WtYR*I4c(xhzE%&58;YVdk
zW$6HAwyAO}yzNVIz=b>R7g#%*Lv&6K95PQrZ^QXzY#dn*ZJwtBXM1O3r~9W89!N|`
z4c#U&lb=1=s0Aqt_~zg~WPU#oClsGTN;&Js_AZr_$Yk5>5cm^#O$1_Id_6dbDlz;A
z_VFphKGUJRQcI3`O_fx8JJY3AU0#fLU7wYz&ik<!O1&YOt@|ogIo~(b**AROa19l0
zfP87Sm**ugfJjkiC2*y(<))a`O`e*L;yzB?hggw4oXYP-_$_M!;;<qo_9Fcwu#SP>
zcYbOa6E8>@OA@AZ@?Ot$%H&9EJI{?qyXWGYE$x)cnk=twQ>=69>n(d`#r}#3`B7MZ
z+E3#pKCx-Z7J_B?`&lChbdp+!YIAalBhKvaNA7cPA6p1a-*YL4g4eK5NFtm|d!g2t
zupf%Bwm7M!y{vJhH@W-Xy?NTSdHP-#4kGUddworMh-lWGEk5gkq3XB3`B$!b;|E`F
z76@Pe_OQs4MDj<pRQA~Jp5@ztyIG%9Rs7r~l~DFKRy^H5W!$)LG&^zyWPAtxTV=@e
z3x=Leqq?L;MjpB-DtDV&+Ipxl^$JV*lpjvopj|RN(rEa~5tAiXT#yWoe>*`7Q_@Gw
zsuWv8mW`P)OViV_PbNpdf|=%m9_-I*5HDnA{!j{_d!qK>`Iu&z(J!+sryCDz*aX;-
zPc)E2?Bx*5DPxych6gx8kxcn{W)&3vQiVNyNp4W_VDD&|TjA>b&6xH1(B$%ouD(0D
zxk6cT#>t^V>apUWo?Awy7bCNtk&Q{c419kvhVk&8t_$(ksYi`4_tHkk|B&hM9f<B_
zwW;dS^O-S9ZCajFJ7Ck$&>+=2Yeb1VbQrKVDp$+uRd11`MJw@0q|iwERtb24E+kJf
zAh0yD*vL~<39~Z8hB?Uw@;-v<vJQ?58(Q4=PWs-^n{7d++3zUhhKEet%k&Dp0%y=%
zc*-xcnr2Ju+Z$osAl^rr!iE=_9U1YscgFP9mQv4zzl1`GL*DhvD*cYaKa5?kxU`yP
zC@Uz!1E2adm0!f>x&t<S-}&O9Zf@yQ=W@%hlT2E;6{3dPisvKL>w>fK-Rmq^7muNv
zu~dqRCD;ppmNn5(@%|(^6S){Gufl;FJsyX1tf{})754-bA&qyHKLNi+r6x0+N6$x0
z9P@zQPnQ=2<nrEOK_7V6KsFaPGrkt7rJbEsF`ufH>T74nQ#*mP{v-obhq!~$G8uL^
zJPosEBkWNuL1r&4Vyi_bz!00*CV+!uqZ2E{EG|UnaZeAPNjK<vIp`&IY)T4-QudPs
ziUI7BNM08xc1yr+cy3jF(&F-uhWrv2<aWpkf?m35XkUF`_c`+3*xkX3XK!XZe}bD0
zHJ?ou_LMcidCXdUbPkfn9j!PqhrwTC)*cIOcUTbI9#+IIX9VY&w*=zYnZNWU$ShJx
zdQr%rBlvc<vj%5ekQI{n>cd$9!3iFYC(Q9B1WE*_$ZrJWiG}f~RLTB3Ric~{OV<3x
z1LoJ$@gJc#TLVbCPFU?#M=&KE!F69F=ysAKa*4=UgFDvDUpR`6X@%_V?Gq>jY}>@N
z70P3qU39A%#Q3IpZ^u3z=JmmW3n=PAcwroSa%m@ti5eR{pw~q-2x_2G`?dHniig7j
zv#+));=`30(tzQQn3GlzLqo$2D=;Z2K71+p7wenIZduQ$pCnXJ7B<AN$&)ua^TKJ1
zi)ml-)m+cqm<^+Nh2*CvU0vD{Q1K*#mH!{MzB``E|NZ|y)-evp-s6yrvR5*XO(il4
z*_)8c$~^X7X)1M)RaUaHkC9mj**YX-9xE&S?nCe1@5kr+>mNO+<9=PQYd){%b=_m?
zjn(<o%xb`fdI{4D;+yP{bbUxaT8!0#TKsR32~z^IT$+}df={@2EUu_Ys9wU$Uw>-Q
zauOH}#9vSC0tC$U!DghDfr{|+u!U=5Zv@>gft&lC<6RRfqYz=FVY!}ERh4FAtZWei
zt_vD7jdKQR&g$L`Iy4$}h`9E9G=V@&=FgFt+h1j6Y88deMK@?(L}~aGg-sK#uRmxZ
z7V4aX9{I^y73YuNwdKe&6NyWgJ@(UCo&aXB2bIsr2o$p%kQA2o_b(A!&Wov5TNvB-
zUv2tQqgnQXwwrx%T9c3}Gty9ep++-~UBS#jH=Or@_B93x&I2uXag;Op9=mR|qU%n(
zSHqO&Hh?`pR787!X+^I>sVPL2V&JV9`}%L_Z;W!R7*Um)_0(;U=G*(-Y5lV`Px`F~
zq{^P*t<H0{AV+H|F=q8dAgmlgTwuO-1*loNta0se7M75bME7aM3;Uqeq{p!7qvGsq
z7s&O2g|W2uUP~0)z#u^YRfer+xwwN^|1j^kdLQpS8#8(}O;fgA)<jVIOrAbtsm|nQ
zL|tVBEHVLtx;k_lQA(SAtL3Yv&!0awVW|3h2_HK-THD&%W527IjUeZ?$+E2%Ao^y`
z=en&siWY7C4vxM%!;<h2LKHhNWO_Y!AFGiK>H^F`tOghA2bhsUOkt3V90Y@}2!+FB
z{TIJD%bxu6lXQ=e2$?4l3MLvd5rUnU(^g3Pbl}<XoPScmtN*5g9EbRm!w_fAeolGB
zta`2Q@L(r7^Y%xBs8`A%sjqw6J||=foJpTa<I}|82+`ncLE;Tq(*2zz*_G8Y+TiH7
zl4E>54o?TKe?*)S)U3R?QT71V;Nb&ftK?$Vy)Q*nx<rS}qi$lPLs*#tHvvGd0;n`W
z^=*?O?wO$Tn5iG|dj%0(2?pz9GXfeLNR*4kBbaxFB(ulVeKFRr_-sFn8)~aouf?PU
z{td2K;)&owt<poM6LzVi0^qMCmgPJHy=YqhEhYe<Y&VlDkb`5vUdG^R2w-ssWO&$Z
zN#*@<3upe<EyM!lSTxUt&>6d8#*(Rzo<|$H54KP~p$Q`X%*4BZbMprtQM_YgQqb0<
z1mvdNzbrF=N$`F8XN(*(ou&7V??kOB2UB&+66r34U*)w1*5sU`MTG#1XMkMj$x#nW
z4at%5G}aVQzv>UnPoF)*-0AM76c5?jj{qMEN2n5P8I_dI9`)s8Z1%9_32p>lI!EN%
zoV9q(t_?lRMa<uV!W(b~8EX(C((vL|;1NZ(L(AVoBb5Qy0nnE+fXB{HEY8dMh%PCL
z^Y#Fw7z5T9g`@29M3Y4P{-oxiz<)gf7$L!KzGVNPJhQfTU5u%1-zQK&D~<~h@74jK
znjv1BGBaLU#@lB?CeJ&i3M7_y9-qyX8*(1t`@C-Db1B9^bw)MY^6=-a+KJV&*qs7b
zvrp+nN4V`?*DT*Yu~&NhGf*4H7I?K|_KHf~)q|xVYnQNfG=Kb${qL->J);SyaIQ}w
zF#4F-_wA)XWvwHC%wt}lCm8%5Bo~RyV;@;D3C7&H<aqpJc2hlve!;F^kficu%m%Tt
zs<q;0)9MEUdtL9<)FYb*q30x|76b!)bP}#Lo?l;mI&tPHfr`5N78f(BX_HBmho?)B
z=Kdf5R|0|=VCL*{*OPOHggiPVtZlfuQ0K~XH`jM=jM?Ul#PQBjyJBI}oU`hVskgFx
zZDoH4TMslx3A4>rNgC;g5|r;=WNo#wFnv6Ec9eaRG*s_r@@;wP`=LyJT52Rdj`n3H
z44iozU8|mtgG<g#UVp#E!pdGVWiXtH=8)!vEz*)Sj1OSLj+dRW_bU`k0KnmAt;@XT
z<E5hKPbdLnm0_q6OWW?ZFP`&$%(Xf9T6Xfl$xQIsv1_q03a2is-Z=m?8d{`L3N-v-
zH8{O2bLZFHDE?kc+M<_FqS@-~7`&YJ1WeHWw*PPen2BElEP{8UzIF+baC&qVJE)MP
z%@^D6ZqCCs9PQ6WNxc3@Br$T6H8eRY?a3n|I}qq230C41<Fwd1i6Ll4;1Rf@wE*_=
z^Yv^Sxs#}40C+9p)liM5&Trd8YHESVd_|a<QP160;8T(VH4_6TO)w|%i5Z`o->D7~
z6yiM)x<3*Q{)n0k!~>YK!W9L{i|;-05L+JcP2g3$*lB|ePz38k1QeB|>Mqm`SZyLH
z@flCl*;`e~AKOlpUmK#&Vv@qxMveU`#(L+}T@YI5fxhCJ*dW*z)6@K(@EIrvY&Ct)
z`eEp$nHrMuF7+RX;SWTc0{LqZe^P~1#9(h^R_FI`jmKg==H-uh6%q0rMY@{V&h+|3
zUed<QGtGhdj4|ggEZfT7Ti<tneQLDy*7o*9uVe}382wMP(I|3eJjfiyv%9}C?p#L+
zpe#bg>)*y<x{N|v_d-tp(SM(&8S)R{if^NwaJepq#yp{>NJW0OcK=ECfNtcrO9sWr
z>+)Zm;A;WHG?G$A3OoD=Fp>71$3rbL0}VlHIEXBQJbZv*w6`+NC79!7<LmWcD!?;S
z=<Wx{*tDubi=1GojU%CD5|r;2|7#M26e$E~ygFXHCB=+Q3uYc2W^%ciP~c(vMt%j~
zVF!+)W86-Z?vy44wjFK*i4MpY7!h5~ca)^p&Enk4!suR?QVT5;Jku!cARudWX>mu`
zX3hrf*Up_^tF~K*JjIak{yGy_U=vud^6LFt!fzn8O+9>Q1XXfQB(C}UIpJ?ydAR}9
z)F_LxCrnimhMqW5>ZZBTX2wz`kNpQjnlJR;t!_VBI(?q-Kcu=pmjyxdihi<oa#6n~
zCT#v8a=Q0hqj~|cuKqB6j+l0Ae1hgD0rWXw<yWU(B04>FscOXugntj6c@s~fE3cUJ
zpkuzMj-9oW6I)`_iFTk#vhg~UNwliuC&6kJPKqjS1Tv2F(>dh*_y2Xfe-+7(@GpE}
z%aS;Qck1DY+x&5=3tN%5VEmsg`OFlZnHCqC<^<3TeZ$x7VyJ%Eo7DKox5@n8KYX4U
zuxK0gd2FKp%=Z&OM2&XASwQlNvxuYf!plzF#&&JLHap&mU}k_Em|zZ(Wz$F{U}lEK
zqax>{W}2a{5%pzZus|CK`~s67VVgBU@h?UY1}}qcTcBln$5nn*{$HgRK$HJ(B;*9-
z2*xpEPnQt{y0D#I^Df-+aY)u+JSl}3ujYQDW~TsJFb2M3BO9_u(o%7AN3e3P`O$M&
zd#^bOSN5qx06hVU@7&m}yDa3c{!PQXe=N+JsML@Pd<~Hzt8xoHKIwlA#h@T&k&4dT
zMEM!qBIjTq(F(Ac@T)e=q<~q1cy{fB%-1%}3!Uu$$9IHHL;q9ZaZ`Xap6GSup4eAN
z>fh>>4DU5{DQv|?iA))5F^=>!;SM|_zuC!2=HJvkxgued#N8{(HF0O}!_Mv^fnN(x
zge!A!pvIELo9^xF&P6MBXR2-`OhiEsJ#Ici>~?B)59NAJ5CRT^ZiCXVk}mDY(E*kk
zMQeQh5ZuzsA0pSsR+B}FOR<PW*dW{0hdqpPFFtp1ei)WC^-4{!W3mQ~257QM-2%~z
zzxWXqAQyxg=!{#&?j7uKwRBO|##~>Uw`oTg3n{a5WTQlox~56o=SITMU7xHwNSSVW
z_dc8E!imTF0vN6Ne*Gb?eK{^sbN0ml=@ayk-9%e_Kao-<B{EMK#i)iV9wQKr09B_A
z4?@=nhcR3H{;R70x}3-VW`QS-FbEZP)w;8(qeI&VCuG$aKD}~~tX{ytIO{|T_hd_q
zyN0|$&9Z<&X9-+pIPWBE){Z-D@9if&RZN$r-tHE$ocaV6tDEjpJSS=#PTLxJKT)#>
ze9{&eyL?dUiJp%vo8fe*!CqGO2dEa4@*f2`In5uR$?;b&@fa64@EJKBA0YT#r*xD!
z{?3r&jw$0OlC)2G*8(9Q2(u9aYVF5AFwNFKI6s2`pt%5NxnkkChzIlSSGV0)qJ@##
zA9=qR{WyQYwZkc$X$s!7_7j0#EBuxR2dvVZ1dHIv*Iv?5GAa?|$QRSlBYOOuU87F@
zFPOmy`j%FN$T@YNKDR0FnCYE0W%YvXdsR+g_RpRebxjNbJp6_HnZat^Qb`CqK00Je
z>^QNv6sTKaA<TVf6n0f6H#_y>$t`+WZw=znyeMUqFv_IPpH26W-0XLs$z!GTtbZZ_
zOb1<}SYz`C($Iv^{*}ldm&ZuWFstHI`up%8*=Do21-vHOStspe3Rb*NL!%MGaiL&a
z%a&ike?QEoH?!Z6>*S+b2vLm64;|aZtL4p-J}#W9Q0SkZUbJ3cEP_3ASOL*p6&=fT
zZb@!?DdQ6-iT}^EsOaZum`|86oAp7*sMUP}lJka#{V}KAt*~przcF-qvIMkBdMJ+R
z#Ssfh_$MA_sTfic>D}yIQD$MsG>x~%D48^k1etgj3~v}F1mo`OadnD=O+a8KEbN<}
z|FTCw={U15`)%<Fa#X-iBLm&v$`vL>LnR_p{VqlwVmQ`j-}Q)03(>b475TZFXBjq4
zFSSx8oC6eokm?jK6*zKV{A&E*wU>^i$ho;L9o5CB;~%(cErZJ3`0KVt%Q|<$N63?J
zR+7H$8%fe<qvP6~{DD)TRh`E+1SWlsz9a+S0;(5VoF!U1fZw4l>*|w7DIdcvUsuH4
zNFSnoR;%b<$;T-OuH?|ETdy)cU!V&&e<z^d;ea~?JK~8ke+k9pVMt~uZjC0)KPrmk
ziF0QTy1>^H{vs&SGP5G5$oVZdX*z6-H6S8JTd^0>y!-j`8CC+0gri1{el;pMeEr~F
z)(kl=_qm<vEs?KR9J@=#zP@2t+_^FlEI@qJCv8<Y6ymTc`||Vb>aRiZ=gcN3T5MJj
zqD&0M72(4DjVY6yCWQ*75KgM9>7}Peb|J1<rvs%%X0Wz--$P68A$6DAYPFxL`*&GB
zQR<&}R-vjy0IuXZNcSkn6bLNp_e(#Rqy&Nqm6r&ew3FN!<et>c+`9P-vPljA56Mdw
znrxzdx_3u}v#+(IAOJG#WNQG3xJ?v+L<-O!`&J=h+7Nz(n(=M<8X%L3M^p6UGNm7x
z%sU}}E?cph?B_gdHqhJ->WrS`d1yGM%Vgpx03<Myy`0y{whY)$E&RRRB1*=W-SEko
z@D=hc{JV-)?)$xN-}ff_FfJTj`8jM9<N#61wechOIy(FU2T{IQ+${4AvaOnn)vB1$
zuh5APY_!_HX~%W0lYt!fI4y!<?+9FQ5h5oB06M-o)^-Q}?sJ!x6!d}Yau#oGB&~-Z
zDatQbtmK1z90iw2m3AushjEdE^8HIgmqr;M06@r9brH}v;9*4!1;(1WeSO|4<+XZI
z`2&U@*x7~I+umN&C^ju9zmwpF`h1Nmy<=aO&{5pmhcBw?Z^<h)?(EP80zxZ~`6B~Y
zf9OfP=rORkaW5lU&=`Bee==zc3ci%M@^(GO_5=B=Ya$GLPqa0lyX)v9RwCPkNm|c`
zm+6(n4%BFsN^g>tyJOiSAyNv|(U8F7hY^tF>jaccBf_NebR2s09TsXJK5pvb?;(4o
z=dMYCaiggect%my;C#79$?O4{x~OdM?HM!xcFD`|`owBqeyyHx$qqFb=3-(d{u~gb
z3+gjBt*@ykiu8Y_$+|d}C5Qvo0F?~%yUC)8^Xlr<8Hg-`AWDbUJW)R)m9t^k;|uaJ
z4Jun}JEUBIUM<7#po>)PX@yk>B}qfk;^;Up_s?_JG9?G#1O2vwEx}I$%vD&Kot+UL
zW}y}LJw3adfvQBznMWg$5IJweFP_kNCaxFtNN(^|oO+wo7=P}tkI<4%C@Z(~Q^f6e
zpl|j@bJ5;-KG`dJSGm9O{j+^w(9oGrLMGc_CR(NBOy;vPaO^2(pp)toI@SHgwOM`@
zN<Q$x03IH_KPRjQ>t5!M>%Lm*6NwdRBZ<Wrj?(uv5W@?aLYnU}v#S2-F<tleGh>M|
zd8Usq*LYo2Q%>8Q4FU;D&ot}jLLOK$h+JrM#44^_9|*fZz}Up^9i9{!zdg?O<?YI6
zlEarF#lew$B-OGRyl89Gz5CvnitETVl!AiwC@+DsCV~Q(#Q;q0K5{wIByTi3)Ck^O
z(Pzf27CPnl6BXTPxPEOm?kB0-E8h9%6%e3lN8q&>3+4HnuL|HzAzvhwpM7$d<J_k<
zdPM*E%fs};>5fTaApc>5=$o9r%+i)@)_A9Dz7PP{vwXsJ{u46jpR&0~mX<wuau!LK
zApeWw%q4fDQhq{y=z()-a+nI)?*02<!x<?Lt-3Z_2ZBH1?26v0n3hi05p}5r`uJz@
zUnvQm{5M+XLq-JQ=-AeOg3BO)?&RoO{raHL<W01bTmFTXwznr~^l9#i;6PoylR`~L
zFo1xWr69QZuA~{prC=7knf^)fz_ji!a*szSL3YFdhpN$~!FFdCGPB97qIUPYagWiN
z1zG|rV(DfxoOQZ3Xe!6!Z_Az+vv+F0aqj{~jGLz4uZ>Vx-r%s}*X1#F=vGOXXy9x#
zr?6PRHgTz_Ii$gNA$g0xa6Zw2mgGUJp?i(?ckKjmMOno~x3AAEH=gWhy}kIOwgnvq
zZy)#o%>&h?G3hH5uo#^Sa4&W<gddR=!2z6=n=Ci1;Q}dfL&-Ne5iG(OoB5U`n$H9j
zJ2lPye>htBGmv1<NZC{OQ%Fe}sga&lFR$LVEh^duwn=r1D%90zHLlUBKiAeMzx=y7
zgS@K{v#;!VZ~f(x#;Rg_ODmLzec)EQQNql)n)u5R(aGWR#RuB0n-!ZuR$o6`=DyGA
zxsl}N8;!m3+h)PvfPC-8Q%xP$p^ah5pr4A`X75;YVNu!IXPiZ4?lzd8eXi54MC&XV
zx_E_$hbJq)VSO0twlxDhj5*S)9Zw6++g^Xnl>fqEhLA=v%Zwr4HJJTr^u;aB{)etQ
zDDRKkNtib2`S;XM4oq@_eUuqD;k~gR)Yri&z;d-~ozhPmdmFsX*XUchmg3C}M~)&E
zdSg0Hh5`O)A0c6Q>PwQ{n2@`G^Nrto-4{p~iG+(iD=u&uU?^*vzqdZ?2I~k*$7;_#
zzLxf0D*=f$Fg*qdG*blM?{{AaWqVB`w}_n-<l8s1x0041&xb3p3kzEA0%k&`4#V6y
z@d7mth2UQgrVo-|Wec8y=%;1AJt4TPWl(7wGB|bmESL@=^nfMO;gV(`sqx{O>upS_
z^H60!*=xL>Lj0O($~$N!Xms|Pb^B(|_ON?xBIDIm=pMCSwPLp*RUtvOr8QKJ#Y}iQ
zy63i+dMpLMc{V(tk9;HruQBi|wb0cn_%_j8R<Ov~r^?YGczyPjJ+bL;o`@OIKGpLk
z_a(-x@B}O(;BUdmn&AMZ&|of(>HPR`*?PoxR;s1fs*&u?d$F$$DUa#dXfcPgqnD#{
zZuyF_%iT%JKd;b1j5dBMzrzK!>x=uYugnyM6xAZ3@{utMxI<43yt#B2#`=aFcELj#
zEs$Tia<Pk=Zid)$SMnhyBOqBT4WEzyV{-W<`9X_>&M0`fe1MnOZ7=~(B}1kugj!xT
zQnr0DMyGvRSP&xPIgsuYeZ0JiC89t@B9d83iS&7?g8w4zQ%>R$h;t^PP;q|Hey={E
z2i4>3ZN?11Ig>!Tc#JT|N}nxiY}f|_2<V|0?}d3fs*+YW5?wlzO(Bmj5_12i2vGns
zB#=67H6Xt(YfyuzhH@X>;J?Y)vZ!0jay6q-b3>Z(VHj9Ei1%1EkhwKh#S5#Uo)CtE
zlpc#oF>-yC>P9v-yI!F<)gNH>g7wPD&Qy4<w(~js6l(g%eW67F%Ia&krU_dX3h)qA
zf*(*bT$d@8_yz-{$1rCg@poho=_B$_sTx4b3Iq3>Y0K}E4}LanbmubWyBRG9=*or9
z#4*NCMM(fT<NZq_3!sd$1ui}!F2_O!LoyvhVyJ;ff@lq6L|yQBFiwy?`$y+VAq2i4
z5OgYk3ql28#f{%rdii^vD9fs1;3fSGkd*;4<7Uv5iy*m9@`_by`gBwOd%{&leLK4!
zA1z=@l`D4IF*pa(ZEqIO3yDV7?zz1P9-$`O+zK>K726YeOD%Z1Wu>3)H0M9PY9u$3
zi=Al2oQQJ9@K&k+X$hh!13u!Qf=(2~tQgf*+<)*6e<f3ZR4i3G629TXUd~T~>dGF`
z7ZsZd!nMZK$2keK4k5$)2jWOB02Swv{GxsLFoZII*>7M`-doQ?!9VMy+9UgWNL$v#
zzH4G%AZH&f|D?DPYv5$(AuFJ^2SPNk=RTbF9Re;K^zoc2kcGI!(fDCW`$xWF<{yHc
zaI$U@kelaTPYy5@Q~pFA93LyU9BM@{$^I=z@G6WYoG>?ME*orEVk*DodQv^!g$Oe$
zh4K-fmOD(Sjoq!{bGWduOo>z~IS3vGtezw^BNa0M1d2hJlGEUhG&SHg*(QKi1TqT2
zJvTp$`@*7sT0A0bSb&fq_ej0WuB*B1$DF&2|HQ9<wG||%Q-LJssOgIoB%v6aYH}u|
z3X*40jDa+)C6hGW4xvv<ON&G!klLxUx60BRRV&AL`WZgC-IN@-%^ZlFHtxzvzFcZj
zY*|xm`PTo&9PfvlCCX*fe(8KlyRP-4ru?iU_A+{GeY>JLN`aT1{1h_o1>7A!#E1+(
zhx&qHT{W98$AGJB#()c;H~jjIzW=iyFnw)6BFXHlyUg7W=Ts;!Qv%M;YN>nN16&)c
zh0K0_pNndnZr2;yDYp3EcvOZxQ>2odEz<%=lJ+d01gul<C<Q{8_I(Ct*2v>PvXZ3v
zhdWQua{6|cRj%LFCzf1@nH-$Cp2g$=lLCbOOv+u)t69v$qLN=V!pJVbnb0}KL=CH9
zv_M>AczZA9DD}mVA9D!LQ>^w+buX7f-J(>0Tmef`d{5_^SQ(^3F9^_$NxF)_-)<eS
zkWSPWOBU`hEPWO*()1o?Lis*`x9eQiH>b?y*a+u96$hrj^Q3GUzWq(pUmwN_Ty6;u
z3T1Gnf_i0<JEwj;@o%L6LUMl&rf>Mb4*O%8?>y;etA<Y8$^krVQQ<{l6NL~7g>2vk
zftvTYQPhpw`Lz@goY>h9=V2^o-LZ5;nvfuXLQ>M0q&Iq_Il6n;gD&$_)&8K!fO3=c
z9qkp4F?8tqbi?Ky{4r5%eKR!_eL+7@-6tGLL5S3<acYf*)us_5<vUg6E2Fz#pS^3I
zNH77E_t~s3y2B_Z-!q5NUS__;$|qJhUh`_Ydw4B7Q_~K4#q#{8Bn|@?W+RcXt2bB_
z_wcX)H|%e+1R{=&*Tf!#g7I~<LD_$iM@1T~W2eQIrb5@eRJm&R^n>$cN`u4<=n!F%
z74<M<Vjb9HzU*+(EkLBw5!OAt@>*chywRI0(1M6d^gcx*39WgxTn+9Y^a0d+;&NiN
zAs4cp$&doITG!y`-RxY5zbgVv_wa4J+ajO(pe>Bf%OQEGjdz{&Fbg34wa}-eY}Zk-
z5uoEX_B=Outcf6;y;N}&q&lLU<tL9<;Odu(n=nz!dctAfY-=pg&;}`ulvi7SP1`XO
zts3<p>ZqSs3jbjm|HJi_68kd1JAMG-jy(CA78)-@Up;ZsCt6?B4PbT@HB}}xSG~Bq
zw{$`6*0Dm=*Eh@klWtysgux8#?iX4Z{FMU#xI|wTS>Fuwo?Qm_>^+hwIOt~sk2bui
ztN%-`Yhgk8IEOQy*Iyzv87Y7>X)$@?8>~E-V#4-<nwGoe-xNU==p#YLdi8~&rhU3V
zN4Rlj!Q}9zOT5cn0;(d6XTn>s1wqZggw~nMth07_4dL_<DO4g6_6LO7nY$=_kseTs
zR|AUP>j=+Jc&$b8{?AE;tQ{O|`iu+_-3J%el<aqRe^RJ;KYSseqFd_Tn`-kO^ijcw
zN0bd^*$q;Om_g(%Pgz%HLNyETI7TH@)AqR9?P)x>lqB>#-hBlFM$q@~--R8v_4M>K
zVLnqizAqD#EPel8rR^DZ22J-+Ru(aXUdpbPr3putT9BY`=A=NQ5pJ6F(uk(EPE1oP
z5e@Viyey<M-5sBrvFf_u6`UZQK(!r{^m6|MWJEK9&1hO<CMDFEF<QdSOBHV|nb5*3
z+nDxG$q^dx4&ZAp>!o<Es3ii18vzu!PL%<sLK|71bR1b%wzV_hM!^=<k_BZ3a&GDe
zxJrG(3%wQi+ZM@agkzBGZH?s`ZwJq%J{6)3c`(#;$+ld_%~mXS)bV{frR_p<2v+Mi
z<;I&K9nwdx2TB7uA1uF2STsE8UJ9UBN@+DHdU!V5g)8XD@mAvyJi4ZIbTr^u597NR
zjxk(O-#=W@I?Q|4$;%8<tA%bXm3$1tal5_{!TfNiqh+Kf_Y;@ABqvNfko-c>^yT?$
zmkP7i^o^u8AKYz&<YvadId_$9%@$_Oe6fG<;2Q0v5K__?^ZviCS@pNya*{IkQrz)f
z0zQj)zUGcdvD#duWn<dheJ_yT?NOsd{lMJ%I7q>Y@Lnp-@OEf3R5gqE*9v<0(sH4O
z&Tnep8&rd53N_SkAOVa&tzONFpGG-S>gzH)^L-WVht#Qf^5Q=zvygtuBi`{PC(%hn
zK1sQqv6@COGMve)#3^V;D5^2!m@;49nG7Uue$*e6O|?<IOctI3d@J3aM-nRPGT>$f
z7rMyrVloc&n)X%ZVBj}K-=?zu$Og!fKOa4(kTC7-=pa%O21ru$Xt1-^PS#-}qyVK+
z(}Rmps63%0outtV!k0%EM@F&nWFsRcEGDMtc)}5|O-EiDwg<zeQJXN2j3D?q5w9Mj
zmUxLA`97+A=&%+GE7-gd&h+I^gtrFJ@>_Ol_4#uT{uG!W057PVa}`eokZE}9B)*4J
zpf-dSk`7a;knvo|wB_*oSsYT8V3$T~Qv+_*7z7oKiHvLq!-VG>;v6my5fR)B3+Z!z
zihC+IQo$w!W#AadAsPe9X=utv9zbfeo4Sl{o3sfCOeS02$Fpjv3IC@rD5U@J%<XM%
z=ex5XSD-{gKW`N@Cogf50_oNylTJH$FqW$g^k)uFWkRIYbZs_3v&IpjGqA3g?qY9Q
zb`Za640Q0r?OqJedNG(nmJQ~2aDp2NLV(;epi&m~JS{ww!RIc(4-KRNoW&vXUf>rD
zgbn{i90Dz$Ahxgp?B17_HZh5!7}-#AYhp6+@=dCm>kuDWf|$gm;%0pKbS|C8f=z>W
zrwth?>%+<*n95X=5r?@ZXUYj$pTG{JPh_n&Lr41uCGqEkpld=9;96AoCIWYTf(m)d
zI#op#L)9y!%Oa$?Q!Y}ifWFB?sVmIo@m$UyE_0TTK)hy%Nz-ORMq+K^Z>a5}+u$Bl
zjM%q^`7|Nu$cC?u`(WouQfs_GjTyBeEpUW%2~T&YB6+<*^w1+!&m8S*O0Y4UWjwAq
z@Dp@<YQ%rj#nVtNl#=!s(Y=J9W!c?H#*vXbYK{@ImK)9&Iac30UPsl0zQp2UH(?-(
zVTbc9V-*k1y#VC6Tw+ubL-}${a!OEe9sS;G0Y^`kRIs!&kPSfsbR<Nm?-r?ko9Xn7
z06!EjL%Py3u@)u|?pFeU+y|h10R^d%MbUMUWOxBJQveAf{Con|5S{`xL&h^bMGx~g
zF>;9^OEgg#kMVV)BIZqEtyT-zga>JEH;@a9WPNB(Fp-I&*kql|kpiVkN;KFo=P1iz
zfe#a&B<KM`*6uGq%ND@NkjvNs2kSi26au6>PagvY-Fe&Wi72`h$jI0K(x<$TR0tLJ
z%V`t2-xmh$dqg`}Ge=0@h}c9jm+x|m^gN&OBmDWQ-{N9EQ%(XwGf*x-;&qN72h1a;
z7YgEW5|PaKeEi&Hq|1ZHdAbR|^6<8ziVD5;;a9{zT!4R?@2vzbg5qU$N7#PJtiflj
zu!-jAdrxkQxsBcTY+B|b1>~k}@obl<nnkQ;uK-#J47@~K8d_x4cMqw;8>0_XVmKTf
z9d~&ZWq_I}6rJ2C+_t3{2?+BcUx+jjaJgAK+S+2LRj&M^z^$WP`XZFMwq8R>Uem#m
zPm`ZOHC~W`ihF^7cae}}VVkTp5_S?!W+2Ws1EKu`r*x%oYW;)3=zfb!_@7+?x;D|V
zqOMni!}u;}@}C@S0+52}bVm|_RUu)OF_Lcap%4$C>lP-qP(#=!%jw)MD?P5f0MPS=
zuXOn9KTD_4+lvsF8wtV@`Gpb`G2RC|Q#1)G>%=wJ6CcPD{v@^tg2+`oHH(+hgd75H
z>$KqdxrdgWD{oO-%W^oz7e2@zqyotUwh$s`8)Eo{m5srZ$Q}2e(x3zc!RbkGo7Cac
zOG0B;a&1gD^$g!n@{5_a<qx@vk5N)IpjbINe67V=5w%+N!$FO<wH-DIn7!4D%MbO>
zWM(pJZEJGZzu)9K^X2B9t@mGKwn>)i1?=lbI|Y{fakr1)*DbKWlo!p11(l(OOm+OZ
zEicWBFIYSWObYa`UPNS-3g5U%`H6;RFUpWBrh{CS+~mF;u`V$QSIqD2*gKnNm&gc=
zoh^BQP^3m)#?xRz<4l=@mTS*{DV0{AJzjneAqXtVdihjrhP9Gq$MDc$ms?20=IoQE
zmh-YsGFHyoHWJ#pYDTgY^Ba4-<fuQ4l+%?8_=*VS?9LsA)u_|Dnlfg9Ve{i;!|-MB
z*k-!NgfPYA)Ir=MtCx!B0uT-`Zt^?x<1E{c9&6h65Z9J1b?7~*a-xJzJ6dgQG>meD
zStyscNxZMCmicuQG;?8K&0D!f^-hDS>6BgL5R)pE(5m-X(W3r>%B-^6j@C_wTZ+0g
zv5XYQ^vvcqnN}A4>gny?+M$!3JhXZ99!^{W`g}iI1NxJ3{E!&ljO*@eL1;vmY)T(#
zK{YIQeM<J_r$)=CIU_x!G)%qmIKnoEJr3_?Vz0#M+DiiCT3T|hXA<=8>{)faNonu+
zIUgIt@A&H^=7J3Y$}s%EYf-bG#8?I+>a6G2w~R;|RyP%~(WhE7_ca{Nn~$uBBZSzW
zwzGx71-|$+<9>b3jb5zPeL4B0x0vgz;=|w2Tf>dbdt*J=OOIV#!)`il9%)zQ0;ng<
zcCr?%W1N8fy8AA6VBcB?#2>qC74=O@f^U5$!s=y0lci}~sryhHuNc<+eOKQ4lbV|h
zC~lC)BxEwsJRba*ImCT&!ObL+i~b6?eU-U?F1&s0u<+b&0WSP(5Zx;^XL6(}>GXfV
zI$nhD@IJ_VVSd@jtKf<3Y$m_dROT(uJQcJnh46v%dHx)8j{>Wcge_|{8JKBgjhOV+
z@8iuA%+&O;ee0Xp0jHAyoo$T(1oK1^{z(n#^$%L3`z7#MHim4g!nh!~L@}T8f$3Kz
zv{r36qj`@>b=2Zq*qAz6j1Bb4D=Ov>{V6&@R-O!23m49)?4@U+erKGaTr5XQKFM{J
zl{g%V+K^CWx)wTyMAxb4f)$9&X%}_*KjtV-)hq^!w6Thy@LA0?Ns((pQM27pc}VUJ
zse~<%k;r7V3WWatHYKAwaMs6-maC7qqDK1;J3j??VBOtRzhm~{@yY8;iWK_}@8yle
zlS0z=*XramM2qy!pu!%vJpKs<+fjlGli_A;E5Mle)%Q!a4|ajUg0(=xHge0Q@^aq|
zBXZ-Wea($<-?m7D-mlZ570?2VWZw&A#*9MIy&$aKBfGk{qiucuMz<(M&(h@r>Jsmv
z|H<ZfK@{*z_c&Ok@L$S!Q7$_f?)@!Q64n?(XZcXv0B}y(1rgITip=>`_OCm-<vXx@
zZ~uY2LLt#fud+ui-kshKlA_d^!P{4m_`ZA+XFoncASD=VSPV;-e|XZdAA}4lDWV|$
z?#<RFTL2-N%+S>;ATy6x?yTCYH;%M~NV>ei1kpaKeGC!ujz(ha+=zZjf16JW5sFa}
zHXF-3XwEF<PuY!+>A>HZ4icHD!t|*%`pJs&DOJAT75eEWF#1rM!jstNVPWf4x|@+7
zuh^=p*~}6*-0h{BQzNjMf)R0vU9Q#LFdlsZziwA@<DKyLwuSb^PwZZty&pdte~OK9
zA85^T9?AahUkf#1L4^#L7jbmc4YM@qt>@-!s5O?rmFxpN2&^?9rX>N**)J2|(^X_a
z3JIB1@0j*>ZxTNoulmh#jl<JWUphTr;du=`Ov-x!Gu4uMj`Jx2wX9^oe-IIN?98k+
zc6JugJ+AkX#&Q>pIIppT2-=?GXc>CGv*5924ZZ2Z;kdiA_Dvg3@`k|CkuR>K)^Bt5
zJ9={%9~-Q9!@*oyEb#Z1gH-N`oYkoQngo%4fPvfA(|HhlCV``Wxxmqp#Nj{2h`=O-
zpfF&O=S@0UjX~&?1FN*&Gqev|su>{FPgx@pX@GUTE$+YALQN8G(@#kFd%x+jk>qVD
zU3|6F@&6-{wQ3ruufcsPADnZLqoBZOQWMdriIm#Jd1aMSb;ce00{sOM_v^TKQ3J7}
zsXP2TEj~Ez+LfE+2i3|ig?5<|2849SiFYiuo~$bPiZ@O<adD%#?tRv=e3-z|^lgub
z${D}H=5paUXJI(;*R9`CG6p7PFQ-{46&FIDM(U4qHWV^Wv5vH@M|@>B97-I0UrgrI
zh(gD9fSP_XszDwu2F{nhK;KdsJ4hymX2xq{a%8Lhps9>PE09YMKS$2)rGjlnC=r<o
z?Ix$PlC>`tjWm7o{BPf$53=cvUvgJ^UOkHs?h6{R_Kth;y=2EJ_5~C;|6_aZqu``2
zH*i2RMsazO5T!4;y+zo!9=*_24h>0p+2Vhvz*Q%`DLJ{gss>YZ<%#oJ4cqcf{UHj0
zw<^{xdFNk0X3sVs*A4_|=U*J0G}Qhw^FE+_$Y!1y=9TH5cPYFVMX!p8Kxtf}(L)U6
zia(t%>puDh(KNC5HRY5f;!4RV8{rJZQ4!pFV>i-r`-LM&UPgbrqI2x`qk-tIxA$)C
ztSC1RppUDJ`t+mAj6i#g(}K%Sn`8s)%bimM5dq8=?<stJNA@jH?^f;ea>x8)g04eD
z2BDGe`jAWK4l*9mT>go>b20B;V1}L1aW=@%pK)@;uYx(9g9#I3j+*`~#?r#T&OBmL
zSIL&G<!RkSttN}QHiJsr%Yadk1%BmOyNCMnm_DlVTQ3G$cvWHDaiBh+F1xIK_h`@9
z`}_9&%l8_}Z@nV;U|;)ea(4SG@dXj!_@_R*#W&^qwE&}DJ-5mS3c#@ST5BCd*|9+P
zKq1YWXRC}%ZE+BKxfh4|a+dyTjtAY&bECtaFBbV~t<alk*G05~um&1?p8#sH`H9ng
zwv)A#C<Ms*kw@j+IVM|n6G}*9W|QX<f7jAn8k!tVv)2gWh0r3f9~1(ScgvnfZ>`ME
z<X6)-WGzMC7?1x{S19xOHH84f-sVLmaX!EjJK^Cl)HehKt7PnBzrWJ~6&0bhxP3DN
zO`YCoQgn0WrGQs@;>JN&<FJ~+BPPT;H&sJj+mr4e`uh~x5zjbIgb1Q+OCXR9F!9Tq
zDjjLIHbbvpXRP`5=wNp5a?RKUddw$zIE#7@k*2?xJ|!vHhN0Wwlag;Fi6JL}u!TwJ
zW>xq!2=Zr(D}ZiSfLR8R>R5BttM5!2(ZBuXDtiLK21Gz4iX0GbX3@Q%22G&a!c$d$
zqn?MK9r{fqmmVzem=4{>8frOMn?+Fm)P6rq+DH=4p?|N=FTa(k!sp0v>2<<2q&y%u
zX_qgIK84{7|Kdr1w{nD<<liWzu8X=*TD9fH`1q?OKebUQ&8W2vk`p6G%_m-a5E6ut
z7ZUWb0@raM<jMKBXcm3v4b$aiDwhs1e5?A`FN}}Lx-Z==HScl1PXEg#ed=vcgX*dS
zk(ikG!Nm;Ghb%~gt>{-&jP+Eg5DTvA)}zLjV5U#CuJAIa85&pBdE_N2Ti^GVABqIN
zQr#z?7A&7Orbw)1me|E!EarZ^R^x<J!=x4@>33Mj&&<f~oh$zyNZJo{O1>BUtIj6@
zeJy6{nDL5`kl3TpSb3xTF2Fc1f?M?(T))8NnmIUqp4IW0u{$}RqWZmbvP97ECZ;>u
z)BTmp98C$cW#-QV(?Je+$fVrI*$OY<+{KKN2lsL(0H3_V)FFG90q{3Xxs)8Pap}Eh
zsGnGMbsCDP?Xx|*sCp0Ca_P3hxt7vyeU<T#xL;G}nxHg$e>%S0R46dhn7*WqJz~Oe
zUxeEbgcTs@2F~B4li3LIw|$nsI0bTH#SDg)F?R&s_UF^Y;69Hf_w7<1Na}gV!}Bub
zNPsw}9`Eilk2)@t)ujTsrNJU0VA5AX6?mSH&M!8WOz}8t#}cq^fUKpqLePRd8-HYy
z3BDNtOhF}c$lM~^yp@Dro)vRbU8EM4g*8N&U%GUBJEHr;uc`0f3EvD<tQoK*NoMT!
zF{cH+;LbfS>sn>_7X5kbcP$m5mpCAlYR>{F=YqBp_0k&xpn>${&2BS~vG56F^5?^~
zGhYj{!QaV6o%+XE6{%1NSk$yks!IK_@e6jv(D3lLcd)=!Yg<{!5t=6G)w9sY6@d;o
zNMrV!yi31=6JLtw`juzE6qmo7D-;p7o9kXMeM&;&ndVaYrJQ4h80S)8$kiO|7JQKa
zz<F@5HWqi;`z}X|A28{e5-x!Ry^a_E;Uj~u0weBQM$G7ceSFo~WyzWRE*&XtpXXX4
zPUneU)-Difx?nhTUy&&mm>T(|=7D4?D^V)!cJl<V?PZtaMoV}a`ihn8UDg_N?+Cmi
z1H8`j{KMb^C8`h8=y$S#!@>@U=Po;PM=*?pN`=Db3-t~AC*%TANr^4>RU80L<KT{?
z`}0wPMtzGQlR2Gj2w+)Qrmg=$O`%`|$NdHl^i}aP{kf-lGVqB>`fk+;6JbV$SK7M1
z7^_cAKPI)U+u`fbV{4ENM72%@7o{2(sjZy>7MjaEXdO_+%k3;<#e+~_xA;D5i)-!b
zJk#@}t3{sR?$y{w2H=h_yqBMNM~*^(%cJgzysPJ40GBI$v^+x^7lRg_Um$a>zO;E9
z04Tztm}GFH*MxlnS(&j+FF`(!TjcwKDunFkySE_=tRGF&E3@AM5AKq1f!mVgB@DR$
z^Sy2-LF(+9b3<>wzI=$w34S{06LN01G@zvNy3lQDRbBu!9NY0n|KCv|@oddvvvBRY
zV{3Z0xAQcT7^Amjsb>m)9dn{TRIT{vnT5f%Ki903nEA-`+&;^U`1ZDoXNz`#&N+p&
zDWqc3x^CwM0yR6RE9(C22Keh)_$@}ro9-=g-@Sr~zTY27e)mb|S2@Ggs`u9`zdm{B
z{n5(`0&q!u#80K-LtQ;61o|kOJl7}Wi$^8dIYn%-=ps_WGh<^BgSh#iVx%&A>pj^o
zyQpR7prDDe5BhHh_X1u#$ZELuO**thOldsWr0B!Bc!h96Y+GHSEi->JamraPL#{Ei
zyH5dtG-fF*@RIHok;YoTRTZU?hV1$_2_4K2d-5ls51{3XsQyP1WFT)fV!A2<K^m4A
z85u5%%DFc>CXd!(rGQfR(CBQ0P((yflPau&%|LIF9qIMy!|-*j62D=Y&f%U<eM?!u
zI*waCgD4yha!bEU&3~Ud3v@h_+qSvMv`VN?O7aXP(K8@039XQJ5u~GVeOse{{TTp|
zJ30Qd&a58Hr>L9OyY;=CgTh6^*7`mbluYH^B%z2C*rI&sC1NUHp2eR#cl=zfnn+?&
zOCS*GHOJ>RFpInQiE$|JisbHR<}(_>R2N$tr4l@@jg0<eUYUgSZ9B_-m=vxeN4Sm|
zauxrGv==O;t8)NeP294Y+^l?KymRwyY14JNG{N6Sao}3izL|K=Tq&BX{l9wAz2u<u
zV(L!iGogal)yU~lGZSj<cF&>Q^HsMdbI397TBL5)<wt8kST;p;YI{5M_tno1vG9z5
z;6hU=s-o8Crq5b<&#3u$&p)yhzPQ`a6$Ekat>k*a3Z(3VT<bg+s_)VRP;0{-?^xp-
zFAvB8F>anyiP*AG?t$^UscKERV?+D`&3Ttj>F2cQHv$w&L)hcvW3Q?J0l=FfGL@6a
z2+E~wSh)Zp(qziUm$c;h5F{a@z4zZ?N?4yE7dVuLp$I8}AoG-j%qrZs1l;5xRi(=`
z)4kWkwlE7sC$Nw;eF_w$y?>%!_@Vu%k5D)es5m4!?|HBEb$WNwOV*Xmf5uS|wEwA>
z8u7%T_I1g;v$X11YFPo^>WZzWMfFI%nJ<IkMlo}9XGI3T7!3B;?H=|#Ihdc=#>w+4
zS$n<NuZ=l+2Bu;kna>QDEmpiX{FWw^7@#<Cc2M)%p21PwyaFt0M-2Epx&r@F8I??k
zf`aYiIx`Wk^vstYx@w7#_Cq_P+fUroLURK%yzY+A_!(TLnDW@bBuSLHz}L?ijCLp8
z%_d_4aN;x{{=<-F-`$F=y9!nn6okrL(-w;*-|F%LQshk71|~me5`b%!wEU^{IqHHh
z-)CiFpkenqI!#W5J@=cXqn4`Hl0S}})JgORh$~gTBvLPkxiEb36bo!}=EM&W`2mVW
z{cj1Q2!V>Bd}5L%f+3_R|C?tTpKvFig})|(e|toeMc{xJebjWCxpX{2NWc$nD;9$}
zC}Znk16N20>@um_XEUZT3(4GhW<AQ5GKz4f`KqGzE6CadD^J%8PlRh{2wbXMS2@o(
zrFZFf76te#+Y(v)uKQeG4>!%+Urv_4s=4t&$aqg8C~Nkv@m+-shbrZcb0b}T?@}9-
z(_YSB&RgoVmen)n+r6FrGo75Ei9!)`(Ue5f&gH^VD-6qRbfFnQMO=BA*GKtgDDIZA
z;8rEHKCzkpc`rDjCdA9*d*aMkGXyz^&rqTGjys4S%<#af))brH9{h|S_JSL5dR!&3
zQ>2UnC%F11S23{PiYuUy`-t>wa4PEB)_wc#0-^1CRubmb{uFg@H^-~iU{;OC*1P-L
z@-3hV;J0>s1o``VVw4ZSEpE^j&;rQzS3zVN#;93?rw^S`^wYv1pkSBJw%RMPru`Yd
zu*3t|5O9FTj&#Gv9y>SlIxZRM7}~?`(Qb=ZWCNgrzfCil9ULjew*@yK3uaXMR*%j2
z{qUS~`-hd3>CBy1NORIn(Vnb|8UHj}Av%A-8rG9Jep%e~cc&=jkfW3z?quT4TIyjw
zMsOnL`c(o36k~X`ya^Q_KP4LuY=*|w@d$M&e+f@HhrZRN8r6C4x>(Q6%2b=SC=1wg
zUrt**n`&1o`uv5}F!^Y7EwxG-eXEc^07<FQcv}hcZ%htLr93)3fGXugjCkR3dQcC~
zP=bInw2y$?mDBVjS4WGYzw!uBqvwp}{(xKt;Ox!Kg1LKV@4H0xM5L(DJV5xOCe(z*
z{Kx*84kCE)pCbH^Grq|l|CmRPG>C}*$;`~+99!)IqFQz+GrSKf2$hTH%gQ|d#(6jN
z%7<kAT~y=i&L+i|I(0Q&Qi65E=P#ed-8Nq^O?8^N539J?yd_=xefoRwQ1(T&+R64_
zFYW3>+~eHua1HYtlfUv9SO`$(y;Q?L5#?MB>T9+IJYt)-=Mse%>WG1R-Gk7ZZ^~p3
zZ%IsAeJ|DcwkjA10B(Fdr`tSE8!)_ns&f&sFA{iFq<y)RI8qQlz&2kD**ZIQE%XfT
z-g~y6Do8rq=DcWJvJ3+g18eya+d1n)nZ>EeL>RJm;lN3R*y<U+gJw<iR%Vqm@yUtm
z2p|AW(6sT&A%@Z`dhPM;)>hZ^(;uO!o;Fxh8mpD@p7&`2=a!d=NA+}(D>#-DRRVQO
z^<V48@1VuQt)ud!v@z;9Dj5h{(Oq5n0n-svvM`#$!WAO%>tw%dM9|gp=|smRRIn@W
zh<>e{0cARSU?3HH=FaE(-<qOPYw$+RSp882=_2~2w{33cIv0YpiC@)DbzzG%S|HEi
z=#oOJyv-X<M%#whZ;3qVR~)zCe)5<g3h29F;T(kRAsLfqY0uqs0maAW|59W#@u!S*
zAo}=L<Lk{rHTYQ6JLNCx<NyxA1464{YVt?2)yE4grc-m)PIlBZw21uGpZB`>qdOr&
zLP9VN7I7jbCzw-HXQ#OHY9(6|inYD_^5vMME$i2$Am1%^8r-5GRpoT}^$-S59Or&e
z%tloLmCS3u>a}1_B9=}g_ZH~=pt!mp&zbpp%s=+^DW=)9H`uB1FgAo7W5n#H$5gNn
zPUX$aiek)DN~uZ1feeo90tXP0g@FC4#jq~}$0t?*UJ{}S)N&SZ#fJJ2b!QCRX2C@O
z?Z1}{Hd}4jE)8IQU86%Wf(f0)6~n53!Wi?%e@(d_0OuREaSNRkW%a_sf**1FD*<(`
zoJ#jUTj#%3La4mW6>7)2-6DTE!5WL0=zSFWBsxHSKZ6r^SSd(s@W8f3;h{4W$*=fA
zF65DjPtfstTBh%qZPZ*`4|mnm#fcm?JO#m)nvTZS+9AinP)i?`3^E|%9p~%_(Qng>
zC+naMakJx9T(DP-!FJ#xCHa;oqTiSs4tL2od4caG)cf-#--tdDt>lVH4mwiP&gQ+f
z(k8z5*d5QZ=tlc|KMhGR8F1u|TV^ocwV1%dSLIV1{fTcIBXE7S3r^zyA<5)Z_~#1S
zf&zNINY>zQ_68<da~|U^qkl6ceV9I!Q2{j;j!xr5#@iN9BI8vwm;NsPvHxG15-)nz
zPxGP+Sro+$j~U}ltoV<#mWQa<+96SD?Y)w}_jUc6Z^=T)#BHLiU-j2UyO6CK`k9M^
z8};xleCwS#G!Zy}WcO4lMA{;Q#LWKA;)F2?p69}FHO*1f$?w+&<);-}@Q;Z^(X;$C
zR6a3ZuPMg!Na9E?#t2{~8m(IrQwywyPySXp=eMzZw&k%!G_>g8k4lsh=(99}Gi4+<
z0v0Fsghb8}DQ(*fhtg%=Q38#f8W^<P^;}<E>39AU0nQQV-z<8a`Dzht&&Sgu<E>OE
z=#j&kAhSF+Yv~L~31I>EMm0$Zg8~BbKgrcJ`JD6+!1k)fzj|~soW=_XlLAGYXXi&m
z@0;p`xvna*j|7NnL=ZD~-JM}J<L|NC1w$CBCejj>7M_vWz?&GFk>Res>x*s*B4^rm
zE)b-2Sc3}y93k4toq=AZo<oczhHAn%-eY|L<PqiGlnrGxEu1Qk_84B80O#%&<2kK?
z@_a;JcWP*|ujk9B@BKGl(ipxvWhX!?FktsOzY+%_`e!%6H8CQ<xh_0C%@FKEvL*id
z<JKVPp&2O20s*PMJoQ&bqKsWqvsMyTrgq;l0_SP=3rtMm4VCA1iO9^t@yiTAvZtfe
z{XYx{0W|DyPWY!U?zjJ2+LVHe{>N+5H;|P$=p?4MN5PXW(&w=z_Fy8qYjWjb*i(Jc
zH*1b8#QDG=O~C$d293-tkOa&6#y*U491e@A_gz(X94X(VRzu~rphoo0jg&oa$Rj{?
zne-7+FH~!pg|7r8ed)nd`cO<CX8EEACb(V`^lcl|!e6j^fi0Jl5SU4T3?C!(UL>?f
zX8a2Oabglzfb_yFKJ@Ht5B}_sAApqjl_H(>{&mUU*rlr5UR7z2<GE5G&NPIIj1pk$
z+l6h`*VVG~@A{I6f491^vW{N>fpRp&Z#SYYV+kDzk65jRP8I}%bGwk_%JLB;34_Kc
z#1~o=TJ!<pm$xB+7RC>yw#gTJOB-w2#lk=}6vp?cU{4P>pWJ4p^%a_`If$7Cy@prC
zCdd(oZQgLp`k=_A6zn(>vMi*#GEzBDI_iB!7y~Y>V>$YLD8DcveVPxbk)f^zq4@ye
z{WBzWe$q8+fuNFx5)8f^VLwq#OcO{*F1Wy=mmGPpMbzSu$>cnvoLx>?XYKtO)vs~F
zFUIFi`Q(2odw;I;Bo<ggIcPL{y2c0QOQ`(%Hazc%dwrb?D`{XZMp|fuX1+l@3ypks
ze`NnoDGJ<0XgEs?t}6r=fVK!~FOYzX^_0==zr*=<K&(;P`WGFAqbSQ$&#}5q>J|`d
zba8Ee1M;Rp=dWTYkK|`48m)Vh>ytuWJY~4E4vsdQz9XQn-E(I7hsuxKKan90@L43R
z0G3at6g4qe;{7pKBk%E?TUDBNCv*of@&%wK?_@Z+4YxgxvxJG&Ed0Y3gbd;H9%MEJ
z$UcrCe#kyrl2fd%|0(i(xSc+@S?D>qO(Y5{$bcUc{?dJKhGgqfYAVrZi(EJU`WNM`
zrB|ZML8gSA$F~3}?CMCs0`CcZZGxj3aGr)N*e8Ii7wVSS%W?Kgt7p8{M>D_AHw|0D
z7)ukQh67G&HBF2*A;|Uz*ZjChQQ|F08_YuWT)7@m)zE=!M!;`)qSEuk9^BhrvnB!Q
z!$#hd*0R%c_-&o<Mk`<-%b(S=s*k|D#wWn5|8Ft}5)?@OZ0=;u5N0Pn1MYSSMEE+D
zJ`0smk-o61V7<Gww}d9OqzlrGdK`BJ=fcoJ979Sbh9BZiNu}kI31;oVf@2RL-SOJj
z&aXzs?5h}cI&gg8NM)L;k3p$^;0bJ@lWw<Z&LWy*@CaOl)nC}sFpt&2%|QKu6h%p<
z;+%Mk2#^TWo%y}Ie#-8TqohUuDuAPPj8(NR!&^B<PYiL9>wqf#4*)ELp4+~LPJ13j
zhyFFB6z(9wIhzD-S%T#x(lJ{$a4HQ)3tQGFp3GWj{n;_cOgsqvU)~cinYe=$zwi5u
zZQ%_#L{x?~CQN6qyK9GCoz;ToMvcLY_hMUSE|K;za0)*%HCh`<Aeg{zcy|qy<)$|~
zlctec*58Ltg({l>3pHt&>TxVM;sFCE7`XH=pswneRNs}<?U|~HR?1UsYI>=bN79zm
z@RQ<tIMc+RI~724;t%>RbIR`rv?Zw%uc|zy5<_`!O0@I>@F^u0BCQu_&Fq+`g!44K
zojq)AZVj9Zm+T&Ex}gSh0LX9l@g#v8r>I;){`pAe*8hnyQnGq;{fEnLg)q$;R-z%w
zN(`iLCVDEjnY+GhTw5>P##QU$Q1S{p@h(KVn7YsCOrS=O0FwAUV+ofRzYt0;Kjip`
zjYvcVm2<0dU`3rM5b)w?18ugzb*}UM4HA1#yNwqNu#ltQnYHy|z#HXW^ExGKaPQQK
z-FXtDb?970YzGGna`r!O;J*iP0GTb$4sW!E^ock=;3KR6vk7t~5>9K|GCv4)^+?F_
zku@Yl{k~BD)>S(>GVJPoKzNGTLi==F9Hf)}?{tNftZ!^xBphMwuIUGDyC}hQy^j`E
z%(ig*9Or|?AAlYdTtj0{qH`xz1)H8qEYNu#hNY?y3m<f@OC>_e^Fjw);9@{}gjJ)v
zr+FiU0Pj6bs@%UJJjn=KUNwfW$gIl#Kla``p6dVoAAcSP$2ey8CW**ina3t0Dk&i=
zq!JO5acnZ9Y2;*-?8?f>3K3;gHb+sig);MdJdeZc^?rZ8-|z2tyZ!$CK5ws~JjY{P
z*Y&vO{n9s=`5``}Z@wHwmhkwEZGX^82ezMvBwv1xN3xm_{LHeg3|&24q(GTYOc<4b
z!=4~rk5{!8)<ZR*+;qCgUXi>{Dz)|{#vRqi&PuMxGNA{Iui!3!v41sFpX#DpTu!hf
zz+PfJ_hTHpVpX=%cTT>kcx-|@>#AMB`}&Spb!t_=Um@ddAiq#N3f38fD(*>ztyfD+
zN=ws{u#Te|L$=VLL0a@9O8(G+M@=kn);nDO&UEwRhaQ(~)WJ6F;DM=6q|_Ey?R@|K
z>cqLfj}K^N3*6zUOs4Dt3BiZiMr$@P%&#yOF)F@Wu_+%8QWgMVJ3gkqkui@r;`za<
zQrG7ear)U%7gkMfVW!n*x@pQ0&VXA%;S8i*Lx?F)T#)P~v}Kg`QOUHTD%|%>Y=hTV
zt;C9hS_WstkP57;MZa(;DCbmvNF>0QMNNuu5RPO(F%csFRVOYB8n&|zgnGcxokwn8
z_x+5G&mHren!us$LG&u(?i3VZa5V?rlVl%SuhSp==!rZ5lk}G8H~ts;4vHajw-U@|
zMNy*P?(oD4BDzG#H)%6?O6QUH(%*lXV{`Yxw)Y>cPC!>GCn9n~)q~cZ@*bAm_*lO&
z_czNKAI`Nxic?INz157X{t9m_JVH*~?~(ROlK{4n0YIe);Jy<$P|6maf}awZwoZVP
z5rNuc>ZvjAerzdt(87)8zD_Ex^8)*l)@3Bylu{YUt!B4>by<&9WuJ}N{%ik1MUB`Y
zR<@sc2R^;_9P?OQ`Vq>UEBao>XinH!|Mo9udPY2_Y|&}6yBA%Ajh$VdcaTU(vy&l_
zZ+6z&+$Sb(-kv2dtU)#Z5a#3Quz49g+v_q#_M1no(|u+>3vr|AH`sU}%@lBM_2d}p
zQDD!Q++qJ{Q{$xQ@tdkJO<xwWE?b(MQK%a5nR>g9P@S|VifSrc^K-hUOF!VUdo5-F
zjbQe95~ov}b(l~E;S0$fo_t=b?}~%USl!VP;dHp<TO_qy09e%Zo1E82l8mawUvhIT
zMi`4HA+yi`^WC$Jz`#3DbJN~yd}h~H0XEz}8LPnIxeXki4U?CB*fayI-%*jBLLQBn
zobmZ;j;s>EPsiOleIeM$7|!daXTZ1Mzq!6I@!zJ6Fjl6O-rACrOfJG*R_w74VdE;$
zJ3+yQ#sl36-%NKGatJ77;JKY046ueml;cCWx7L><pLn*DL=4o*p^c1IF6dEOvPlQ6
zKh<DAj_aku^l39Ww<KO|$uvLTV5icB2Z{;)lpN*;scL<S@h$S<k3{l42~B;91h@iu
z>nyV4RD&atv>4>P)~d}kOgD`9@$ZfVfgkfTV1tlW0jWbrt+E|8xwx?`H0agK&sR!6
z<vOv*v4$s6V<r`+{HU)ZTvRB(@Pr<<LLN0CYnDTYPE*qx&oXnAxFd3yyF_UDIKuQ;
z756F0>%R^Jl}hg!o+daG>fs}UjLKe9b6fn6Njn%B(B_8T32U}b)V#LPr$ys9N=J&{
z9!~wY)|i^2Wgf5>jn?QbD~}GGJ;xpkP<7JgI@k(~SJ}><)s1=DKtg-UcMys69S{BP
zPDxvZ?X0GyW3NyH818mMqgi;JQ!C`C_{U@?+Ud@?<EPjorfg4;Q%d#t)T!P4d)scO
zTPC!{nX`h|cJWV%Gf2OF_FNU@_&8MF{KIcNw<i>_5Wri>E&JB{c{IeXJMSu6D@W)W
zK_>%+P82KGGdENhL2U?c+-tD7<P5mq0%TohCrvM`VLF%2m=3w{AzZA=WmC6w=y2ZL
zzjbo2HTbTOW`KJMhF}xVKZZ%|G@x(a#h=R-5ixykcbL&QN<RyfXUH^dhN61*yeP{0
zCPIlU3n1g#{e9~fk!wo_&KHKfp)5fO8XK1vUb@r-DEQi(?y1a34FFpg$ffT2NB|Yg
zQuZ)b+@FsFd*=N@zt5GZN*0p)MFSreHx;%|2=%|b<t{;wn9Mk4sF0ZBvpJd-n)d-p
zw<`4?p-mY?C^b0z8ono6wx=Z_grM{d4Dcs8{3giYw}>vcQNC-_b0p4K6I|TrNBD5X
zlO$4JnYOmZboMfmlO$euMM&WpAAM{3L~`hyhvO#7OO9bGj|eUaue0{Qbwaz{8cw?%
zkeCIu2S>8-XUTF+gGV<PO-=?2#ew|vS+TeXEB8<q6~VAg>9>*Vk}3gzZ;u1tEB-Sc
zw>bk+!<!bTJ8y-wzVN($T{4PdNk-o=N=o>hfmH61c4?QqBO%3QY-FLVv%^8L<DfQ{
z>Gekd!u`GaZR7z^heh3N5!1zqZLb(G{2~Luym~sFx|qd42`HPG2KE5fMABV3&@Hhl
zUKSdh`!Q*+^@Wn<Ef$D(n&|^7MB~1ar0auj*LDYvtnCxjZxVnliELH<3YZgpCh-xy
z<|@d?Eq)D8+?}LrLM8W24msdQWQMfl>0&W=Pn?OOB!-n1WPt&}C5l<n5QkO=^ok$v
zQKaP8eShfgF^%xLened^q@b7FF{hdRG}A?Pp!A1XjNGQFj+kgfvB7m{KyyYpSloIm
z!ipo~T~PP8_uW~NIgaG?x<MhKz#5tx#fM})+**IkpDB?H)0bK>sK0K#iTk#shw#96
zR@1>Hh8#&x%Ir1~?x+!rUb^`2PRp8j@!zo|q)__1l0Z<HiBl>=<no-WzPRAxLR7_|
z;2Y=vn0Y;rRRUCl_3!u<WASO|5h0zvo)ou<7kMPsM2=BzCtwnqNh&sUpLzg%0l^5%
z2=wPI+Uv??^_UAtgwkBF6=YfZB5>#p;>OONgf^2D-uGk@7XrwF$W<ViK?91m)Y4aF
zl7f|s;~%zL(V%hxmEk3s2Dxa2CGx4WC4`J4KUmd#Se&N082Sl@T6Ar{t|e}S;cj6q
zo(jsIDX-OQpf-s(GL`z`E{wz8$*L6GBjn;dEsRr#teY68e>Cz5Xpi*zeYrBA%y-j`
zcrqbKu|mqgk-`2}Cp?!?0PH<s*Sg3}{diTxF>{yQ2_*6f`ROr^H;<YZ(`RLxKi3FZ
zn@XEPUW3R(fry;wy?kwg2?DI8e+;HwbRj0#k2f1m_xrvsdinlU!Cbc=Z@x9TjRPC&
zvF(pH4osWx8`^#KBRYYW&c;#Y4A2J9N1>ET^7OL|40zpBKGz21WKT4+(L$yA?k$aF
zXu0sV)61Q}kYHme<lsKL>v9SSCdV0=xIW&1l>9j4JvLT{DhROgSX~?d9-g+aA_npB
zC}8Pj4jM@Cd4fqt4u>@JUDL~ZL^cS?Bpy~X^}C3gI{tM}-hn9rfwwR701O&cqa=v5
zH#yV4MY)%RiqEUPO7`@Sr2V47+Mq#?vWU?N*Ie(imb4gZ-%)tbV<nUQdL~DY3;UpC
zB#1kD9Cz*2&$Vwiek#4X^_TCfi(J5L#4P=4)HJE|g3GwpIq!-Y&E8K(&bN+!n!H{+
zAavbL;KPyGSzo1U9gi1Ag~E?(m?4*kNomKu{mi5_gEBc&moQg9{j^Jp9lmy=0)^YI
ziAh$8p$OEt92=zcUBFwcpbRt^mU%_B8zF}~-@$3x;e5UvqAz+s#0*5I<Kztvxd7Z~
zZT+Jm_w2KD&#u>h(oCbb7<*>&!l?13W8nQp6#in6;-I)_MhE+f^0f>zvL#t-#_Rra
zaY7%KTlEZ2^PA=mME%mq&*z>@`@qT>|Kpy{HCY2;qvz)+8k~N%Ut|Djv`NiMUtK_7
z;w2;RJY;R()#Y%A+03Wp2lq~Rr@X@;k{)qrdNrXt=J(x9TPboS2Vaxw=bmG|_qa!s
zZvn)e^G?4BP+Eiyz@V|?HIbow;<Rc}uTmwxd`7unKVUU&%3$fDgA!pnLh;r1r<+EI
zp~8zecNEwK`s-X=vVyW|(9s#={?}Z+ZD)0x8u}Kzn6_T!i72OK(_n^1p7^-Ntal6{
z1Lfk7=hj4H84XUbE^o#B656cXbmZxe{+cz>T;`)<&Ctwq5^`^?d#X0f>n(-wpT9rp
zno@52I<pabSS;wv=BJX}Yt-*4nKyp7eRzGY=E9|KAX+LZAaD(Ww*Y8n?*VDi+rnAA
zz~n&Js0=%X-v)_ZO|ju?C@PGe-?b6XFyM5)B|D+lfJ5TKkKwpS?m{;%-Xy<zBZr^!
zwR&JIPxT3rvnAK5n@G8D<fXj6$vSz-lgSi?H5tjBd-#D*^r*?5n-7Xc*yD)Z9oQTJ
zRwJ@Z=(Jt3a8~PgAnP!ypwK0R<*+KYe&gz<UV<UaLKLv@lOgppyN1AA$z}Com>AOF
zroefecYT~F*)_-HVP<!`v#a+cXIC>PQE>xjC+;8gr`-@9iQwYGn0iFkvv+lUodaL)
z1_Q4wuBz}>ytM!3UkBMKFfEd6V?mDn0g1o3kvt}6w3O_FcGguXtfWdC%2NO2R&A1c
zg|`G}IqNyu(w<zLZ#ukKPj$%GiyzJ|h7Tn*Og<6S>Mp`m%~ja=*+3@B^bN0dHe7tu
zMS>%vf>}H-RU;;!Tn2#d<+vWBs1kQnv|2z`<?Y2D;ea1-cKnyW1Hqx_yTvu2(fF~o
z2|weeXUaX57Xut%3FO<tY^QBUUm7#<Dt`o;Gv4vCQue{$eZ?T*`V&Ne(*(+)d50yy
zkTzeC*zH$AFz^v>;J8uC3#WC_6LOK{@w)gKo(EP1QX;Q?_9PJiLMAxz_jjp!u28)M
z#1X-Vb4u@o)Q(~9<@M>Cf=CPYo@2AwXQQs?>`jQM7%G}U-#zFp;E(&qwMfYGlLXKy
zK9Hf#+uq9O$yJ{RKKD|F-~~e5thuzSd=U&a8dSe-cnRmk$;0C5BxBN(n>TsQSnD}Q
zGyx7g*9})1V`<I-zgv<Ie&l?->aBOaqxDPN!KYARwff_7^_)0$2PO71(|(N7Kid1m
z^UMkozS5I#+k9g%{Ai)e4Phm^JN24>t-Bs9tc>XzazZ}ou{^!Ge&VFnVFuRvYdz{6
zhTfu7EdJ+?CV#DcGDm&HuM1HpQDrq=?VfF%qQG3Tt%U-qWv()>c5|kPrz8gqRO&mf
zX`jt|P6KKA4)5Y{e6bx1iqu1Wq@FdC$H8Zmd&!j%+S>`~KgPe?N1<2Pe%)FB_M=z>
ze|sF^HXI1G{6n$AY)X)<3+*7nps?*smmrzk;Un-1Kn7UaEhkOk(4-n!;{a-o3N~@&
z$FR=$+!iEUqI;{4JfGft96<uAlPN=;mXK3aw5}O`NUDkk_nuC0UgtWU0akkDU!al=
zO=b4(ogfDf{Oj}p;Y-2>q3-bLRG8GBxW-rMJx^Ix%@k%t#=5{yL3^_5oWi;^YpJ~D
z)t$NnVXXQQH8miQ5!d8)VW6<K&N{`SHRj&DZC{lgwParJx_yxnt&JvQvCy6Ig71eR
z2z#uTPT&41b|L0I^-leRt33${s=^^c@2S1n*F0TKe1EU!Nf-y5Tn^3jZh0yr72T&{
z@nm_yLg-+ao48rwZU32>r<GD8q7c*(@ko^*v4}h^26<_30+wV~NiTdy#ber9|Dh*p
zylctR_w)AFYU&eb5S}Z~yFxDXwEKpB7WOYB+ctLWCV%rY)sh!4rAhs05;jSLwzgm<
z2Q2!JM&yni+=XlfSjb&(PlNs?pAY|WM|5RhFwoj@DS+)WBWP-c1T+rGvp&^~EnP#D
zVy1!1){9QKt0ko)j6UUV3@9RgTJ>mx#4<e(L8WlEKbYlJ<1E73K~oges~jz919h34
zsvdjBctia^2rT=lvB$!FIjKc8O1dly#7a#Tti_HNoW5d|L&_A>PmvjAqiw@yOGPs+
z6t)(WsO0#dGi(;LJEg0qj`_SX^A^RvqQo*wYi1bZ^LxDespr^Wr_!n5;iKF2CJ%-_
zR$P^HJyUr1V2sMuPLM;sg)|Q^J*4~~RTxV0;;?w|{_obMui23TcYRU#h%c{_ct1_o
z9|}Om)&#DMT~~QD`Fpf0So&IjXZEkS$A{i`?wq(}q%hQVQ#8RjrB(5RBj>dw%2&4)
ze$1#Iuj+cpnsb8+!oB?uR0jmD`|<~^2+_U;$tjn-L}qQxkS%=p0Ztz-!Cdc#+nwm|
zx=LtJBA?YQMKwjP7Vx*d#B0v`cHsel{uo8cu2zi*N)Y!a2;O~bS#=fo{7E>VE?TFq
zqAOk8v!6!OjnQnoXu*qQxO`5`B-K%&E{((fAsysL196kg45ccQ2vQr+LhW~xEfRM?
z&gJ!@9S*qmsVJ%kwYVUqn<Nu`p!W^UI}w3>R)zk{sf7R#nj1miGjE`ihu*)V&4jxp
z6;>xmZmn;!7Atk#WA(i6W(!<9ym9en7zN2oAE+Wg?Y!v~>%@cuFx*v1w4!O?ZXGN^
zG7|`qKz|q!=%_n1XBA<4E@jq6h-FsIm!#&PKOqiq+qN(7d6WDojP2ue=3}W2I_8;t
zZ}un)D>F%kFazf_jg1P>R-c}^Npj?%#vF~M1jXg4$H#=<W4i1ayFwDiM@LE4>AcBM
zR~X*Hm9NFkd#i~7KJR+KX8Sn;2p;$4d96h=D_jHBb!=1#q-FI`p$SCwDW=r|ze_hY
zI5@M<7RKsjIWl!|aVZ7T#)^>H3uvO%#O0fgGzRYcmHBT5TinH*WQ1H86F8uo!`R0b
z7W7ECu1eVF7;N?QAf`x3TuDr8X;Ow4iX?F7-ZipdBqiU56uUsiHlan5e3Kl=t~Od+
zGi~Al_fJzVg$tYqziI@0CdrNc5JksMD*l8HV?*izD#J>4P`%88d%G7QyuW)em?r=S
zj2Kt160<L(7!Bzxy&~g_bdu0ou2*@bU@POtE8t6+GSMtR9{%E6i*JTX3m#3bJhsCf
zO4mbYbj+Ma%~tB;H(#aJNxw}$ZkhwBnXzrYOidbN7tN$)IcD3nj#gYKzJKRpt;x|Z
z+kagePU$BJmLX3?k@J4KXdPJhD0hVAmS}U%{o_(UKYW);-70q1wB-7@7^scp?B}yx
z94Nqa1=k~YR47ku9f(s9Ntnt-YV`WcUoB<N6$vAwoLT(4*!dEnnRNP`whCfbmsX}C
zkpc;?$s=daRnp!%f8Gao4;O+9kD{P*b(lPPrND{3DxA-`UP+RJJ$+~9)Wu&9hbL^r
z0nTCHc{8{ET8(0XFkE19{=oFZD{~LNr#9*Ij^nPN{4Hb6mRAk_v~C^}-|`%~RPnbc
z;bhJwKq4t`BR|rzP2^S3@X?XzW40$bGH8EoGW1pS&0CbGDqXDgI79U@yw0|!|8fPF
zT>0CFb*anVn)d}D%#EbS1QN67pm_sMrNvMH0}#B>kWJcuj)Or}!+(0qJOXHbaV_n_
zILiJPJBpRPdVn1|3~vA8y?<u~IK#myx_6urcDDhE`6EFvnImW+V~%^EK75z=`A{Ip
z^(T+o5lWdw9kt?W!-HmeXw_a8nnwT=X#n?<)64RsJ~=M=p_7-zomxr)WD4wBqWGsr
z1@X{lfJ#q&1sKXqWab7=Vn}rfIy2WFVk7nLlPx3Nx$I=8$r3W&I6kcQI%pni1Tc|6
z;W*oUhLwe}o&PynA}lx+fG#rrb@6^#!u(xWKZ}C8C|{M59=y4P%vBM)G}T&p-Jt|&
zngTTs>0j7_s(xiXdxC}Wy6G$T+pGOA0K;u3BdnRo?!nyZi{&(P)p%wEsukZZF83{T
zPl16V#)7sSb6r#07uVlg+>Vp^WbPb=_Ima%wqZD!^JhA25bPg`Bv*(SvE&las-2UV
zRa2tbpzd<?C-^4BYCX_1TzFCrdMqK|)oFQjBVlk|kCh3~U2yRpFHO!Rv>R<!U*TRF
z!M{>ViK}`Cwghs=4Ja3vOB_rs?jLRs`ynwVDeL{wacz6^qYG0U$!$0eo_oFHc_PHC
zb<RXZ$4LcvAIIOdQHLs?)I0H?M*#*!#Q9T12w!M%>XQceH9@iw@O<pCHq`fEbOsB2
zEGg`8DG7?4CV+d;m=4f#B=G#ifs8M&rTs|j*Z=m8P}+Vim_&otd;-ev`hi1r`uIuq
z{(*t0lR@9V-T<g*6$!fC!Z->z+yanpPo1WGTj|bAZl@7=y8}vp{OdA3Xmj&Pxphw<
z5f-_Wgg9Vd$gx3dq~swU)}^ya{JvXvF)OO}Ml3K>@dX8MDFig6Xy7@fA=3>geG9nT
zV?c8opQZ*w$I$NP{lI<{$-emjOuOe`lcG={Kg+4V<f^(BDOu}Q3>CGspw0%v2>pdJ
z4+Xe!SZHY3l8aFsNm2ud_p$@fniKc1G73F*i|(b_?_xn<RAyGyKSd+%UGfQA$ZL*z
zY9$$DF-ZYeJIenCa7{b}wv*%*@B;d)OpFEXu)hgi=krM1x)8yu9;CUt9g&J)M7Hs#
zE&=>*_ejR<|LS9Divr$Zt2sRsL9?w`y|IrAAPlvK;&k*sDR#qHa3EH0%jf-TLCHM?
zfQ}ELL2qyL@n1bnLcbRP<j)&v-%6WRq*5?jn8tw}jZu@PBlG$Q00n`oqPrVGjCBDG
zp#b)(6S4jiDb8H!Z^qBLHr2mxGWPBw^Hq|BaVB$3KEUzA!NZ--^vn#7U1uyf;)={L
zvWho<Q?1>mc7@>HAbDHb<U&Hf=%`4J9+^scNm1htMs*$yB!KPO<^pdM$aiJ?yR+H4
z`18HRqGs5~3vZ;h{w||xEP1`8NnL^)|4}#ztOmkt<GV0NBpW2AV-&J>lvN+>y&4Fl
zh-HM1Xh|O*VuRgcAvN6Wm9G^eulR<v>zcl%Q0lZ7giKYTM$l;#4LY-+0pP_!HwJC3
zOG;Y0mo{Cj6^XnIDes?tMAie%MwDxOHW(u|l4Qwsb#-5c&}A1tm3+isk(Zhq!QrCd
zHxzagJ+iuvKFOGwWhPHWLDF^P&*Psl&lyc|D=8U_Z6G^P<Ib`3f4E>I5%z}xQ)|ca
zD*p|52q?Xa6}usUBO3;pXj%N~KxV`tgo_)5stCm2M2%i4y3u8iFdayGMBiw8F;8Kl
z@izgK!b|TfsiI2<U6_W)yQWS`8;U2Ol?Z_9gwe0j&6=V0IiFCtaHX7q7kE+3KjI4g
z-wF&n^r>>R{D<(`1nPP)q%NUl<4Ov{Yh@b2jaRii0@R!C#$N|a`nTJKlT5Jz1j*Tt
za~_uVU*Cv363hg`QMPUcT6frSqQbiER9pX+jUnT-n7OL?jgW3%kQa_6hrAp&0U#55
z{NpOws;nD;YVFV%3vXIk=$;hKhzvWZGH*DHL5J(a;mGW8-tVSvpy;8ha%Lu$6$(02
zB@H+S1h2zdLdLpsT%GS0rY|s7oN7-y#3J@nc3>kR1a7eAlPVl_dy27}!?>GFNmI*#
zUi)&9reRlq&!^zbZ0fg$u@MpaJ9Z#5KT|k!@y~i7Xtyk(vt*O*bkqW=RXoz=+iy{$
z>|eUQp5*c-w)CO#PStJNamPRUW=|sB@{8JB5-;<*iJiMzUL{nK_>2}<bG%Dml>kh+
zl-1|?fw_T5(MDQ~+*-o+OZ^P>nO40k33bBX^z*-oaQ`{=bmolQLL+lvQ0*@YT9hD{
z5yfloxu=Z0Lk)Bg^jL6&ptKMP@e!Vo1$F-#$%S(olu%)A;O5^0P35Y3QPPv&(^2@5
zEmayav=x($DsV=y!XdA<+=^!(FPJr7P#LyDA3FB}#QKbw9(itc9Eu2S{XkoR|IbDr
z-NZBO9TKObRpQWY=Sz?%zv^w%O33c%jhtc)Elz}tZM7EbtwRyY0N>_SkXOhp7pTjg
zl%70?AK-I!RVo}U8i9`Hfru4{s`Y+y;F164Dl!5b3~2T103=7|yR@`y(};Y9d1)2@
zUunXtaK_tI#_QN8ReYCZH*^tfSQB#~KcZY?c-Yw4+4HE9a<3P*|GJ_4{Oev06gUkC
zqxG%d1&Fjo;i8rLDg8@EUI3q(z3<ZW$kZiT_$CrXwvL#`m>4uBh6eL6GWEcl7_gxC
zVE}cf-yqAL*2*USF;+$e5~B$=VL%+k;(k-o<HDJDgK-2K0QZk6YENo>pGMZ5`n?)p
zDO+_8<t$raLSLkx>G#lE{whqbd1Mt&_H>=-p>nz<>JX9C!A9=wUEW<P6M~p>`BWag
z%x;oVcf1S(U}&5`!ggkV8kwlP3|xGA#BIM);vY?8-vC0QFx31Q3wvxyWv=8ya>Pj%
z%|@1}U>12SOL&|(E$3h8?im1I^ZboFxz~uq#*Ka7A33+naG9$s(%Pzd&x)BH;in~Z
zF7XkxGN;29T?)~W(<sd&=_WN))G$Ak;>ni+&`EIybR~u<{30oiW|KQxCem)NZpyrG
zLGg7h{+%*YXzy__<*#02?(1a=Tnx1GYI#G)R%;Px@QgCxN`j|}&JByr*)uZ%buo9j
zzT%aNiw>^<?G{{%hp*VqRNO(FZPz^d`@8k%hx`cMD>KLj6jX221N=#Fi5NdsIEG1g
zyqY6se6B_8%(&c(vsa3#LfXhG5vc~~Q*ZIQ{%2*|<oYi@jruWzY%)?^9HOZ}Dwd7#
zIi(fyY8{sODqMNvsY0@2-SPW7?ano^x(Wt1ig7$@Zw~)dD5bqre)Yjix3m%9!-B7R
znM<-+OQ9wym6->`AjnF40{kUm7%+fj__*`^Y(9!{75yYCuA=*#IC@co%k;(uc^sti
zNON01)Jg3aS8tlCpH-lkTxfv(n8Yg}P@v)P2-%=Dot4v(+a_&NJm$>-9=5MeTJJcd
z$t+!}1O1ir#*9l)*Ay-fEE`Ze2=yJwd!TMjK^PANiEp`!W;AS+Sn7uH0$lSXII(Rn
zKOJ$e9&YKq;Vga;B-E-mlM8`pCFp>DC;P|ukw^fESeT{P83#d@vx(=vd{~_NNu77|
z%yFwQ03s#@tLM#5bE^Kg?fx_zIPI|uen8-({{_XtH9cMZt2viHan^kS{$ykJJr#}b
zzryec=7yiteQfuOhYXmJ%O?fc#f(?<dzNP>IU`;^jYflBY#ec4?5Hr$ZedOQa4kOt
zB;hV=rsvbz!LeoZ;@q{-0NaO3*O<%F<o}oB_-BN=a0`Uf%due(yIgwq?DPNVY{0*}
zX{@f4wHPwWs=SD0_u!{hG*y&SXK)m`DI6xj&%X+JC5P~bzP)4pc`IW~D$D!Tazp|h
z#`eej)6K<2aSk2od(9?8V%sxmhfKIqV@&#NdS{GpIX7;&J_yNklOwab#8`Y^Y1Z@V
zmuR2DA5(8cEyT*fIY77q&w-So#v0xTwh0obBP<)pbpkB`xNNv(F48G<onBl+cI~7F
z9ldxkeqxZRwDjk9MjB&P!!A5hKg5LBZXBuYBl5QnrTBjPe!{JBP(#Yb$?~aM>-qQY
zKyH=QfSlBOUniZdFMc>?{$u7c<;V@ygMU4m^lVcX%ull>AGz24cKPn1%SXT8F&KTJ
z^3%K6_$6^{TZi+jzPqz5YC_O8qOl3rq=rBsQnsMVMPkk2S5Qvge3Z&Eo8Nuej1=`m
z$6Yk{i6%XFnvNgIi^qJG5np$1VMD*URgTY}^@rZzcpqEpMYm0EmTr}d6{!8)!u0`Q
zdv;wV>-oFudLwzd4f0>sHzbX1H&)#H*DX6#lYKAQ2rJ(gda*a6;;K2L>z>ZE)+CT`
zvMg}C!F&gXWD1ZbLRZ{-gkMu==F3)8{^((`60{U}K<;sQj)9A+QNzWB>W+;@m>;wx
zPq8zG^tTcp^Hm&+Er$MP1-`k<<5_4iKDA!=J<`{~>lWIuNq$ZbcosK2$sUWg@-N6T
zH&5nmKQ9^lg<DVq9nZ@(=_YG?=H1Jsi6Y@)-ruw<rB<<i+g}|06pktbAwi#{MA%B=
z=}gn`SnDvmW6oPP0g@4sa#HVKT4O6Y=*{>vAp;4Qum0V6h4_PSf1MOy1Hp5>tN?ms
zSLUN|(F(~l6`%0wcqUL3;UZ>;@@dRPJg)U`0xdw7+$lHyLy!9JKfEJX8BP<ta6Xn+
z@NF0onst|5vj0iUhP9ww(N03i)7o>S0szVvl61FdmPlR{Pn7pY6qYArj$dO8v8Sc~
zO>u`=>~C?#Bl|%G^s}-02rE3^dqK8FS3=8bjb9-;-lH^cwDyhui88-U$2sNCY6UO9
zzBHKPS0Qyh{_W_Bq{M~v{QS|3Hbb~FY4^fkO9})(!Mi9*+h_`;r>75O{9NlUy?zyk
z|3!wgUB0q-3R1IfdPYYdtfpNG7V11Gh80p^lkYO6_`1X5?({a7K?byS4z!g%G4Yv;
z?C8!n`xZ7Dzb7gcdA{i^fuXjApS@o6cvn~`%;x^=V-HqO<TgoZ=DgUtY>`4aNJF!E
z$LiV1<D)Vk<v1j6)T$qE1Cc%W!U~8hcqc<x1p^82Cm>D<m24zRSWpfib64Snz3<w@
zvCm>LluP!x?+k5i?VN-RcU~JRu>H!bVrMBB?pWOXlhN%ci6NxM_I@vR5-ym@0wJw~
zpvv#}G*=!B8d`oSRgx}^U|5swNy~jTeE%$`U;N5Ed0@%U(zQuVR-^BxDKgfEa<|nh
z=vqqqFO`;`io^_XCml;!6uD|N8>vSB5jG>;1UwCC10M%z7T?42OQW_u0xZS+Ld~VW
zSRDV5H_m1*?yMRtgrk-_Rpiy6W6_xvLNR6EzulRZOC>KIbIY?7xm-Rtz2qNYz3}yH
zgZQVP{>Gt9>1VVa>+u|+`*4gqo|SCVwBnXL-O9-qxN+RGz&-`#z6qWa4^oZZe1%sM
zTz?<w92`BuwD`WDk-M#)AA&>-z)1zKYWg^wXcLbIxt#d)ZD8#_Ny!2EHt1J=dF-Gp
z;+_1rrQQel%hXgee(XFdfx3N??9q4t)`%WpPDcmG-0!*4jpP&+)p9sTt`$`*W6t`@
zD6Mwa!%OzRUr||-rtP<=i)8HN9%j>G^Oc|k#=K*{G!4D)ve*s20T-tPD$$P=)o@Vp
zIO?#1#P}Jmv@4O~<yy*>&kgC!P3apnPn`TqYhse3^lp=jFVTqqrU3;nmiN`PLfZ+O
z%bz?XPd;)hv+9^k+w|qCP8^$+=8k7hZ9!NqoXBa`F|*3O6iIF5)EoU_^3BfIM%G(T
z8Z%M1a)5Y)ulif7b4#Dw&obG1)Yn-SYhIK2hUSD81)dWMcHshf4G++~Wb8<*V767H
znDo1={Wn;sLWS=dJ!3m-jU8}2sT3pTY-*EaB4UA^t3++z@Y)Cz$N#D6IHAg=2JtJ}
zxVh3j^LsPea{F*WrKPudR{T*>o=v606eL%NYhCAFq-;ljuu#9ttrHy-l&kzWzuR+S
zz9z%ujQICS^mO~hUR_V;n4B{+h22KG1Lkuzs;QQ|$+dVw`g!(|oRAmsHBBN^ml4oI
zzMsS~H&7wWm?D>Un);2N50os4IbP(y;=*_+^@XIeS#mgPkqdYg`lAICq!dPOl1%Ea
z1=6`!JMY|}9Y-$mKYMTd&G8b4x^IqTmstF1G?hf%<jllxzHaxIT~4<WJwHq&?C`y}
z3S_jGHU2!+GB}rTEq$<6yw=Hl+eB5})2{iN-^1cB+VDvWuKELF<@Bf9?RY4+QgY2@
zQm6cDQ{BwTA^&3ryJzvP0B?XoVl1vnF@0W@g4-hJ#V6ilah|#?<`_lw3)e5!MM)3W
z>$%LQchV<YQ$L1K#?uKTvrwt2?VpBZ^mCm~bQyOqyUF8P5?U=w67xgHBF=&2O3;n=
zbOo7LPt*7G$o*Q3|H=O_9g_$^ax7}@o*vSULSg89Jir_VLHnGPo46ON`;z}(vcNuj
zHH=HD{;1d{Am-3*mk!VgfJz&rN~gS+xpduU2qfjOKmBmNc@e)PllO?S>P%BxOIX8b
zPn3qCb#!p_CCB0?8_Rzrn&50xleF3nci@(Y0ENaq%{C^q-VyW{oFgRFEr6{epO>-?
z3P%?+BjIM>pNIDcvukkur-Bxte6|jUs__jz33oD!0O`(={w~2Rs;0}gsp+FSi?Z6w
z_Txk@R2)8qDT9~?d``Bu@K(Wz7ICm&m7J&M=4SAd%$w3$*G}<=rj?SKk7N}WwoAS)
zyleL*X%!9NyPmfHM8fE-{gvPN*bEJ#q}M73r7M*l$}BGbGHveEBCFY4jJ9hXbwCgO
z=DFw#z`v}m;i5*<3rX!TAlQvp8ke#?K?(A~!xE+=v;Qx%g0AYmlK!04|DdE9z>b3`
zvfpS@fnr`5nKWeGt@5v88mfOR-Q5o78l-Rw*^SiOY!ep`UHX~}EN|(R&a>@sEq7jO
z=ZBVd+e>+^_;JT(+w6Re8_OV)e(%w<4;RQX!rXrin=gK5Ss^zme~J$O*^QTcCJ$LV
z^c=g0XaYgq$g5n$67T==lacMpMT{Z-yKRGM60@NkCqVpemkeldT@1PXgal&;RTYJD
z9KL`H?P;OZIwD4-NK)iR`r3bah8p;gnk4?{d+X6?P*o)B(GQ#u>?}q79VG!{Qh8~A
zu{2ndK*=sMhpyf;;NR0v1~h5?AXB!HpcQn@?X|{x=h3kJz4mK$6I)5<#eDqaUG>oC
z!7RodJHNM4TCLe+cv0p5HAn0pj}wS40~83}oeJpT^;&HP$@}DU+3N4caAb6#?*;m6
zrl#x*q^!yL9?4)KCt^yVFir_K)(9NzdqqIIm0x_Mv9Yn}i^n|BAIhC%J%<6>Hyfyo
zA}MBhDu@5^4IwcB*Op2GUq3xF3)iQ%c^HG8wRo5$V-{+>@FtMc^bbJamU<iRCqsHu
zSxQnyru%I?2v$nol{2=7%P);Ph-q#A8-fxH?wLKiX3qSH949qmjfxLt#b8@*q8PFA
zmxGJW1G6e?;~q;t#_8N9cJn6D&Ovlz1F3ocr3FY)BkZ`y7oW|aG5evI&gM^%s?+9s
z5$DetW8J2I4t?7|Bqvra_$5WUzPz(-*G{`j;;6#U_0Kd4wF|duM^;w0*!}r7%%0le
zrtg^+-?dA5nq)k>K-a-yh;BK>74LkNSHP_~@%_^#p{UrIdgDWQC3*YqsB+bJbteWT
z99f1()$M-pz8KiBt8V(~Z}uf(iIV-Inb?Hc@^N>@`!8>tnW0H3Ec&91(I#FiACt<%
z1FN5Gh4tZC$PqUDQJ3k3FNGz_qbQHPdp&WdB(x@<?c&l07iqm`3ZKe(7#ISKFDxSJ
z59}(AaQYh)DgJq!#yL%<Zsq;~U;6XZ4dVCWP>bRrarZ-P9e#>vo1K>ASUemzi)_%9
zZ5E2@Kn*RtaZ0u038mA%e_4Kd3U$?C95u(#%4Y1u7XPerbp8>I;KGDy{$101-<nR5
zU5Z>h%}_M+jw(*D(KBq3(IB;9+&2l+<W$}2TAPduwVAUO9Z6*HvXrJy{vMMP#&czj
zI%@Cw8{PIL^1_r;)F1it+_7urEfuq(l=3y%+-_^ybvZ+vj)8On0>=ew@klI4_8=(3
zs<av~+{MBul_8%(pgoyVoJrxQBj!q!qNe>=8xaov*EHdcPTF_BI%|K|J=}ihk#7b~
z+9{Kz@91$PJ=XGdb~o<X@snOvvrArIj*N(oaKE&z*9-SI@!+cE9qMk4kazNB%Zh0=
zYf|_flYHjY6SrrDesUg4Gk(>V-}Jk@26@QOde6Z!7aWl4FA)t_lzt0vQ9P=3?dCOk
zIa3Q^aa-d4i7NyHjCeo-%xTJ<luRaaP%)RH%vL(>v%bL%OJbg`1AMxS&`8h&7S6YP
zhxm_sUI<m9f_s9C15LUoG~gd|o$P;TY$PcmAdfR5b}g|RBXj`UB5lYaggueJXUa=X
zK-&N$danZuh)B}{yE$UKxTGzP9<7^nP?Awn;b{Yg-<{bjv$K<$Zzvnzf_5Xn9X;f+
zWr5{X{~0hpUg|mOP@GO@Yj&y)mshOx^vUgIjd+J^{?CH0UVJQ~-aKu?TlTTSAlmL+
zQMDP<+VRZV=Y9otYw=aX9LpPf)`ImPz2cECGLa|N=nUx~?111lSUX_X3@cNG!gkH6
zOHpSu-}#Y>Qop!PQ-0~>;eay?4Vn!f63w$INqZ~r#th3*u=4Iy1V6HW=)~ji51n~O
z+qTem^2ezOvGtEWU9WzwZYJFAFtT$$edkbn?^)ECCu1*LR$jpK`B6*FF%-O25cIo|
zCq>nb)w%V=`T8CtbS0!Zfi6i1{DNR7Qvwv@@bRY52d6dq^!ZtIwdn<QTyLGXaEBBU
zOU3a_XD*Sj*xMb{yiFR$_lW<Y(A7Lt@XmR>`}qCHTOw-ELAi8NrCFcj<)Z8kX*5eB
z$46dPzubDV(O05|Tz~x8p6AG@SXsQ&uYw!*tphISJjj1sT=9yi6GE!(bWPjEbi5~i
z%pa10Y(EV%^9q72R>Hu532I6oHhxTt{#s&7BQnaIFWi^HFtxPdOEtx%5Mw@EVS0El
zhVOwH#pP>u%aUtBhtGOnIMxAhueOfm>x+sHY+Vg8{KD5&r{-6h9`Waab7}n_+T$Nz
zB%P9tG`D)md9JCc&`s8)_xF9`Zp}u8^R{0ul2p9@o9v6_`H_s&G#aQRr5eB2h?tPt
zfZ+mKwQBH{PQF-XJ4>dtOBc<O?K;gbv=o?^YzR>oU9lbTG)f)DoPF_FvMz&FasFeo
z`WS$NV}r&xf0m4i7@tvp9eY%r>0;qm8z1xF-|HJg&KG0NB-ur6I?8N5Fd1t-(}|}$
z|6TEdTOLo`@+;uYhcEvJ&gUlwA}Ck;+nbiWCNEP%Y%D%8bV;M&cY9vF21%0dElTK{
zA`Ixv#t`Ipk*>^0P=+JLrRdF4!$#sYUGI(psU1gdzeKZu`@mraho6w&9ZVn5S~Ax<
zc9z@m&i@Z)+domkZ_wtT<9s`)6HxkE{Kgls@>*D=HOd4{(zll{gp>Y{6BJN7Ey4_#
zO2vv!R#Xh>n$r9s9YRc}4D<yHO!A+e9K>q!yS0&;O|?axagxV<t*rS-^=7&68m!Yh
zSRKyMP%y1KAUvmZhL=^3erCkxz461lRYQxp@8vc&LOC5K?isp%QCVNTy`^j3tU0<-
zv~Hg>?vmN`^GX2G34{INH+SY2Qd>NAJ^ylZLzAzPVMyeZ_YPJE!m|2aSmXQouW(6&
zBpIx?Ts*df*7f5EZ3)HwB9|2jn(v{3t6rq6YCRG_zm{vE^%vI=GBO7MzP~Ie?B@s#
zj^_w1dP)UXDd0TDU}fiN2Y_2xn+OLLmj9bGeeakS*=xAU-}OFP!|Jrl*~k$P?rw<T
z);-}%lxPfysfxv55ML#1HZhTntSboW*3^<0ByCVT!w?;QFRm=dqO?~iJc=(Q2Stw-
zx*~s0MFZ1wzSwSifmG&{(dr|+#o%}LbJP)n@g*Y#QtYVo%cUdgCoeflL>DB!qYlq3
z;5UyuUe_(_H0FrjP^ECD7>~!_q9ysLGesR1ytcj?du>o~MNQSgN72&5Aaw5}n;JW`
z#1wNb?DKWEPC=fJTt9!_em@ugvWGht+<}&2^@kP-Ydkwr$QXiQBE$DGd9aZ>dbM1U
zTqD&@ZE#!3DexX^(iC_&`<IU|h+5bA4;fnwvT41&Fx9R9n5Q^6j=A}e^r@><n<Hm(
zB8M>ZpojSQZ{KltZHh)VyR@(A+3#W)&+(g{;dOkC8R1EuLtEBGK2bA0EP~dGba>=m
zz|c}29evqB{>Brz+~y~so1P-q35u-j0lGt=OCI6M%xDW5p0qF0q`zMNoKo{H^VWN2
z=Z_Z2b|`_&4;!#zK@2NAfib7T#}62Bn6u0Zg`OzsAI_$8WlEK&5uga+yJ9N8Mtj*K
zQO2&p={);iI@)CtpTS4U+~3jq88L{|Ih)8{otT?N7o}o`X#PHW&yjV7emSNp@F({h
zYI<?ywba|E!|1(KE|gg=c!}~3Tfv+U3i!=Ne@}nKIt-NXR%|HswkbZYb=yoBwz^(v
z@llA08-fZGSBNVtMFsF7wYx9bGtgbkzjxM8@;n_rnu%eB{^@<P<PXQ`1$X2OPe$bB
z9*Et;1vnZ>8ApeS5IZ{TQ#SbY<T#h;BJ#br3)|t&na7)_b_W1eo}<WIQ46?nMW+1k
z8yda0rdp0q$Q^u~DSo1%`p^XqUO{W%1f~qNWeV@E(CE4(R%q4p#il{Cgt0)3kwPS`
zg^x<!gm3Fd?4s}F<SBnFDfi{^s!Lg%PhUZ1_jD!(-ixYqly5t%Z)NiS@D1ww^bw|X
zXxQpoXg(SN8QhKnlLUv=APCMvQ24kH;`xDNWX5GTR6Xvba9v*_KWfaaK~H+8h~5VG
zxnV)M@mpNoBEtKM&70@*A7!s*%)IWHyWYNJTKTr+3x0g{Z+4&;d&{N1^SiUFzhJQE
zZhS%$Y72#RFNdd>;M#A$`>LOu^7l3=Xdq6L>-rFi^t%?;`@lb*4io?Ffyc)8Q}<V_
zlbwgMi+Cbl4?N;IvYax$`k{OVPZ&H@pCcFqJ^&A!pO!G}2NUAta*8eAJ>p`&yO_$h
z@efl74xnAjZ<2`2Z@MkkZE^8pi+{|dJB&O%wtDRD(CJO%_7NqW7t%c;Zr|?yRmrZl
z^33238lv1CxB7z#qT}QVCDxW6+s%pDV(61f8UF0TNSZ}W!P07)<x+NAV>FZ#FV5@F
z!;6i)s-DUF?AFQ0BkZwHi!#NM9BL=p&smMsmUG(Me7P_S$}Zq5BPMEBiv|!(7+VMg
z!%5qi#i*!}hvif1tPMnxn)#=a=VXLYrt;G}$_+D}#jSup4p#I2q1HC%JY<$DeZt)F
z1<6=e<%2Y3xsI3=x6?x>EEP8Mw|3tT{#*Y;zY6>hUYsX1jSv%Qm*-sr)2OQBOw?bb
zA<olsax@WqrrDX9r=a*Qg#IDpQA5zqYukAZ68jY}I5wYfZ1rc_^}6><rkz?*S6_I%
z<&E$--fPpd+NW}1p>B@2Lix$W6&f_7!eF4V@wUfW2HIEeZt~h+68TNecpd3MdgAMj
z>*%waJn?i8k4IpYXFAW7J9*EKf0nnn|5jRPV>NdsFqboAQ0?8i+49R;9P|DZ7B!Mg
zcBcTm<pi#K{z-F*D@0h>a^i0eUkH6E#aZ9jC_#%7hHbj17s_p%jsZ!i?;`n-h4a8&
zouU`{7bA27&Wji(f0XFoH1zgK={x%7g?sCI$n*VgV0jb0h<j{Ig)s%OADL$Iy9s@U
zvq5f-PIQbq?WRmw56*@n)_0~muKD;YKWIWh36@`sFPe|NPT{@6@%&w^5!aE5=z?gb
zwNd8>^J%@3ovzhpSJg+aiKV!8z2TL3xEFK+l{f4LL{kIkrvTUz$Pq8<5PM8G(|piT
zfu#f8paJ(o-O}qw&D*zZH&DH_3FAoYm`Vn{Ze8vAkr<=G!ZD4otFcFtMU9h$WBL<L
zxmn6}<SYI7Oczr`FHnj8XIg?IyDJ9>3}ja7bob>`wuRyU`q*9ksj2<8?QPgw5iU-T
zFMReMbXyzO@E+`H(Aw+e$@0;0U&{+Y?eq=Gb6FPXP<wZdn$P%xG&yM}(dr@pGNvUf
zo9Tcvw>plLJuff1n}1UL_^EEiksI7Hhlr{$_$)rdz>m15@GJphy=Wj+(B@d`d($jR
z5yAT*WfXtvXHZWAI?e)P=Jj><Osg}(!IL-Ao)$fN7JNzU=g+G99#hZp;(99S&H_)h
zKRi<9DmZUDl(5OI7u(ism?UVh`%e%GmftXmH&8;7=(i<9LH(v1Zn(swB#ge)oV-{$
z8=vW6BB}BjsO{eTL5cx_D4-|mo00ONsYpRv9xm_;!Zn{qw);K=j5XGX`*Y$dt-`xt
z01vx+`R4(@1^m7L`}_a9KL02BkOK5WQD3rd5h-XyUv#E%o*j<6z!%nV`OGUz@B>Un
z`?tlA{-199|4D5l2*3hhG=Q3^83wL%1s?K0yM2o=8t@;w(?nkV|8^J5JZR*TKgCr-
zevj%Y@`zRdgzt3=$OV!POlyQNEz%c%>KsTYbDK!*TyI!iZ`_j)_ztgaYu+R=;u64f
zLpMrp<yVysVYAI85trF{i*UOKJOrIhngBn7cMfa7OpBG=sCaefkjjPgq$K!#uC#j8
zm-Lz769KouuOpG#%71*Dfu}I;U;&ypPXVrfg0K1*x1AH$!4Jf>mqe4k_)!<B&CjI6
zPo|wC92$p*hHo#8KlY=RCOiPPOa0Y1EjY6So)<g@bSN0><7n#((ex$o0ZX{vTxmjm
zCJvOaKwt#bd9VDYx*YVGYM}V1<4sJmdpG;kCD0kL5NEYN-01K{7w+MV5?TM;R<I$2
ztGEi>xx1!=d#}wexSKNN!Oe*J*zxR}mMRbNRz<nb$CCHf6x=I`MoKM@8D`Rlhzt6?
zp=Ausn9GQ#TlFR0j!%F6ta|$}>}w*f1%X_BA`kvI9a1mbydaY6@cw(XGU=6=Efu}q
zT}-4`fin8gyz>D3dT-ckGC{tH*?ap&17RqT4I37b;hvg_^*<UNbQ_+M`2Ae6t3iUv
z6RvujfH5%xA{oLvNP&E@ZV^Y3)R1-0ec{liyuV^J@m8o{HG?M!KIq_a|L2C#NWv1H
zaPj``tWyF%5hlj~@zImMSRMn^xIm85$B@dX=m^-&Y+v<vdA%1C$BO2E@Ber}=-BQ<
z!!QY>n@Se-ROyvB`eg;0m-a|<ZE)r9^zL0F@TP#VZh&=TAuVZ06wbxg&EzlIO(*zC
zf|G=B^;h5Y)$iGTVE7*%Lo=6iL|#x<o7f=U2QAE&{&n5GZ%_&Wb`X4iN6()Ab`hKR
z#YpX@zaIX%)_laf>#JWs>)qJjaegp5n8UB>$Y}COo)4Sh+?O{oH}fry5?{;D43<K>
zVQxVrSTmVC#fnt$uoL4}h2Ic2?{BWdZC4Wk7ZI+S!fTv|M0TGV0fT`kno2e-;>gq#
z87Y}d0<8R}l&FZemU#b}HHCK)=8%6=$nDJ2jX2394b4T!|3_gH%4d%aOD>F^x>g|F
z1|$M_2Bs>)B92J~lYZhyM!aqLvvGY*(wb*)3i!IAHyMsZdfL0&Csd0T(IF{FWrHcc
zz{{(v>Ove3<XzDeDF_C%_ilnX$SZBf@|!J^DBh2xv)OyG?U4CQlFIJT2f-2o6{7yn
z$IJFtyz-9N@f<%sFG$+DFJ+8|eex{cA6nnNeRtF(n2m~;k7800UTY`nr95l6)r^j<
z^6jt82rq}=rGMWKNW~)fbUZs^cib8OG4Ars@qI}HlOIHoG;!R8w2Y%osOmjIyXN`g
zbuP#5TSs01$&MzG+}U}`>n*ZE7CAxU!BW7ZW@T`Sevkfqx#?*4#LfQp7z)rg=Akv4
zLbbmw03=WPzCG!j`^(2h@BN;T{11+A&qH6oIIf{-3k4O?@y<WG5M2`jlL&lax`(v(
zMEb6%Cehfai@id_<-^H^s9ao2EbrdE6T-iEZg2w5bt3R4AV{=U!`j$o63Q!z8dUOw
zt?8i|$4<r573vbj3HC&K?R2@piC?>qj1c6*?!xnGP1P9I`@Zt9Uz5!F93o8o!s0+t
zYs4M}fZJis@Y{|=v<6$glyGcWQryAz``@&z_NV}#?{lJ)iZ=-s&@jyap~8noHmvRR
zkxGnKHc-kB+F3MEzH{tY94{C&a0>;U6A0IuSzS|zAc$7O5B(Qo2PyrFu`kcdZ4wz9
zmMeVp$oh>jhWgv2r-P9pF^7jmT>d;Qrs18x*dm^|Cqn~!ez@dYjR_KYqyg+R5H#`g
zQ-Nt3Oi2v$)*G&Ck_@$b0<XSEX+W7ML5DRcAq+eLi*q7+PdM6{odhSie_Jl`d-|IO
z5XX+?w!W1sQDH({)PD`1+N}S2S{*g-{_@y<9vIU444xxQ6VN3^J**c~KjS1F|F)L6
z3iy(6ok<(zA*#p!<8|nNy{`G^zg`DVi=dcLY1mP}EdHkTWseZg-Uz(4N9Mz3@O@eh
zI^{bLC?ZTN4NIVJwW?}YR>!wq5iM$nCxu=kJtKYZ*a1&S!i2Sx*L+MQJbJ1nJ%oZ{
zVe)HJ8t>B$cNQb!sIeKJXc%Yj?>!X^f2XNrJE)9;XPobKR;iM|B6B$SOTu-xAJGs`
z@z+oq{0UwRz)fH;8}wUAg>rL$y8o8<b%F^cdm9kS>*Qh7N#b*ORMvaI9x&bf`>|#w
zRXN5f_ZEDJvp2I9dLptlGGDce_zd)UPHt296@S~V*c%LH0^cHQNJ!J9HwdFQ7Jk;f
z>O{d}TgS%x!A7CYpKp)bl{gCrlZjs%=>`umX*ZbD2}ILp>hmWDhD_aXq7ZMGmx!Tz
zy(6$0yl0u_=5}^lJfA00+X#``=GDt6#PO#Lz6;kXG)4Z5(YGNEuHJ^1W@Wtor~#04
zM5=%}=6JeX8sAlZ4bp=?R7Y^@8Mo<vY?UMzpq}nMCU_$h`D#xh!i+45Cc$j&2;HDf
z5n}E>>O)13!RLQ%nyR}~EwH!fvp!BPcva$;;E}=4=ym9G*D@(-GtLXqZ&4L-s%?=S
zmy6mvyhdtcVr0s5;8r1Ebg=ddw4nz5g0f>g=<iR!XEOQfmX^j3OPGX;5Qo-v&e+&W
z#XubV5j-*os0ThL^W7*6*&3Jzr|8ih?M5Nt+W{9M==wxXdPg53K4*F&HLLhpP;?X^
zLwF@LXs{T--kFf7ekCiTWH65r-*}+#`4BQjMm`y;L8>WJbBU;>*qi5`3HEI^t+fUc
z-{aof{iiS>utxCk?g&OS2!pO)^Er>oGNs%u7&dsPEck$xSGx0Vah*Q#Dcf_a&CSuK
z$$Li_EL@nh8jfpoP?Ma!gFPZBY5O%2h?kz#0B*I3W;)e2v3<4Vh|8_G<>mwXQ-+^~
zz#g`c2uKE#3W?#P$mr;=Kg0LF9^>VWPjXZ>+gsj0pSp*(oOT2`cb8WROqmI!O+uo%
zij)sAbVB`SKMo(3e3g{={ub5XY0R^{4UO1^vK!}<hQD=Y`49;e%j&ESpvA>`_67he
z*BBt;j;prmS80%3&=)+7`P2SQ>#&6DsjNLFC$CCc{6ce|=yQU_0${+dd{<$xO{WJj
zw8~Law<ufQw7y|id&{Ff@lEUX{$ZRZy)2BYP<nh>MF8mDgk1*w%MYfk-!$>3OJMvn
zUpNUJ8d*&x{e0p1BEM*0uE8K;&pm4!`RmU$t97p=K$h@6gVh3$)?4a)O0{*+X*Luf
zr4b~ZXOc}%Ra5YP$D!V_8SjnRJ1F{}uWW4h$)`CI_ZAQ&L_zu@!F7j8;Gt#(7wV6+
z|JgD+;1MKTl`ff)uLXwh5rxw3f%mo~Il?^cmj+p>(*4=1Yb6UwjOxVu-A#j{c#`&B
zu0c}|s2%g5fi2dUKlbffoeY^y{yc5)y^6`$yg|MerRAH&f~qqfJFCE`AzWNJhIHFx
z<Nka8kr8-VA*}}1?!QN`@I}#VG1LHo>#(^#ZLj>EE-QuZ?Vj-Dyl{^vkGPufF!?|M
z6HxR8d74NE(&L4!dDUc>nr;qJFYTRbb(XBEr>((PVJ0JJa?q27jKOBc$BD=#yEbBO
z7{v8kTJ<zhrTo`zpQ#A9-Pt?16{oKH?Hv(=;PV);sH+RKdVdbt;u$T;4%)`jX{GW`
z=SvbN+HZ1#&VYF0b!#xdoZ5hg4p(AGgx1oSc^+a&B+`z`mrqwQ8yzw<mwPwmto}i+
z?SW(JUZ@MQtQ!5nbLv9!#O|>SkBtva+EBq^w(?0I!%chAIl`K{@A1+TyFJFX&8>2t
zTlgk;b8phSY?h}*B1&?$Bp#_50_kebGkHy|HAYhB{0_MPd&`tK+(3n7ba&GoN8$+p
z_)HSg?oMtwP5E#Ndruq;_sEgx#M78Q`2~^6i7yiV4^Mv>OtLbJC9;^UUeJnr&Bu{i
zWkI6S3LEBtVd}|s&T2}>pM5wA(GzI4)cVd>#3t*-t<k-W((4c$nR=rCa(C3j{0vwK
zB5k;gVLnNZh&xPo$o(wSohWQ8|Dyq8cbSE;Z%ul=HSwR#Y3itm=QqAM-u2j@xpKVW
zDskrE9j1_W18cCZqJSxh&H?lxQ<t7QQ0S&iHRWi>fT#bO-MNbARrxn7_l#8Cm+E~t
z&(3PC?%MWXwd;Y1s?VM2IDG(Z9vXdo>a?Na)MtpAdU#v;-601qULh{$?baJtfn*|F
zSo2lE$=5^qPl5$ungK*N!Vh+giLBuPZCoa4POj#wYl{?#)yLevhtVYrK2&Xc`G)u?
zJ~<#0bvY(g5G*GA9N1~tq}Dp2aaWt4)LO*xov_B*fRDWYS^Nf3Fk%lq8#^i$ndHCw
zslgWv7<ke0O(^YOYabRc7S>?)$|jf5we?o6Oc+}l*J)Ce_`H$INBrWO>*l>Lu03n!
z&2`&-0obj2KH#@spg7HkIAC4U^F$~St91VeUrFL0uHnuHY2!^!Icn>5Z}ct5i2H`W
z>$6gP$wx!mX!jMcJA@xiTCY^k%qZFLqr>*A;4t;2Y?jJJei>TtUguXlytK~?f2`>9
zIK7tM8%WS(d((2QgX{HE+G51lz$*`Ayad_dEBf`?#-<Ga&rE?`wT&T+GTh(iHK&|A
z`r+Y%p!r|++ds*6h6culN3wsjXWbSN1eR)`0&^iK?pO}4*OL<MT`o7vgR}5uOHh(V
z<G~HlhhEPXx63KGyY>vjq2ExC9Jskp<!kLPi`ov=Nq^wM0ZzQrf%RGflVHRlA-{+^
z2ZqFl=NzrgS3W$fy!Gp(>*9~Q4*->ez?`sqQ9f&9L<FJr6u5k1K45i3D(rcJ;z6dG
zvgZrln*lYZfB%=H9=W&)YW10r<;rE*A3dOhKEQ$noa(HS^;Hs*w4O<Dwy<!gaNhCE
z_`T-wVgIb^`6|UXo}Pl($-r>#``XLS*T1THf=X9VDF?C^SkC<VuiWt7(}6dLL+ONS
z$}y+;u@9Y%8KL#sf%0d68^e2ZZylc`1J%Ze+|YjFP-EfL0JWmRzv4z1v~UEqZ4?9!
z9Qf*==qhcqEa0Ku@q|O|$2k<BYWHnAe{NA!Q#<!6SRn#wvQBT3Qn{eSaMi+riI<h{
zhh&+m%3DtPNvm?F2s?baza6UEBO~tM;i3!5f*aww8ytWY=Hv$EI|_}n<~>{5=qzRP
z!T61r$1PzypS;`Wms+g~Tw8x1mKu}4OIyeE&2WGg0pKbE7#6D@*XsKuaIJjeBjAx%
zViJA0y}xItmgh<bsJ$^)OWWU`d*lcj`T{2&Xc$@@;tHDBpepmhl3PU}P36sQVB|Hw
zVqJ8d+vWFOXt{HMQTybIjfX{k1bLc4bVCX~mV=Xleh#>t%-3nMpyAbIN!i(JJ}lf}
z7q(mQh=?Q9;+o2hhqrCgP&x_mFL1sU7`iM6UmuvJb2sdb3k$Pxaw*%o#{TKzb~Y)$
zSq#G`Pr08DP4ER5!rxpt!YA$p?;U{ZL)U{=&77Pw4yXi8aPpAYz;H*^^uzP%T=H^Z
zS*NWVBBs~D!YZM@^o9EygPx*|9W$W5230Pg?!_S;V7~7<F38I&m2lnZ)@%-WyP{Ts
zv&zuK^PzL<62CVA#b1p6I8Vxf=mjTQ0oQ~2tn8(YEwc`!EKOi!=jCMA*>Xl@_M6J@
zzgqa&SC?yho)U9D^VjMxsM!ky2h@8-EzZ2uE~?n`>G`BRKoM}s2Wn8b9^_vr;IvDH
zYhliz0|JY@<dj4m+VAO}dvNykWTl!1soYBQBp$u^{=zms4QvzxL;MU`lO>PaZauG^
z`&7$*3bYmj1u1A;?N5E_^}NPQfx8Yz{5WuvO9iUwo~2oUswBi>LUSw^LCq*0mW9cG
zo%N45hkdvLj5IKqyb4-7gYpo*L3%pLXB+$ncApt{db&7<U`{9<TPF+Z^C|FD{lD_8
tpjoB^)(ASV96Dw|C?H1VX&TSW3_qV|EIB7F0*pik22WQ%mvv4FO#sqtMo$0$

literal 0
HcmV?d00001

diff --git a/src/components/modals/DeleteUserModal.vue b/src/components/modals/DeleteUserModal.vue
index 3a3acaf..b327b23 100644
--- a/src/components/modals/DeleteUserModal.vue
+++ b/src/components/modals/DeleteUserModal.vue
@@ -15,6 +15,7 @@ const confirmDelete = ref<string>("");
 const emit = defineEmits<{
   (e: "confirm-delete", uid: string): void;
 }>();
+const textInputElement = ref<HTMLInputElement | undefined>(undefined);
 
 const userRepository = useUserStore();
 const settings = useSettingsStore();
@@ -26,6 +27,10 @@ function modalClosed() {
   confirmDelete.value = "";
 }
 
+function modalShown() {
+  textInputElement.value?.focus();
+}
+
 function deleteUser() {
   emit("confirm-delete", props.user.uid);
   deleteModal?.hide();
@@ -38,7 +43,7 @@ const confirmDeleteString = computed<string>(
       .replace(/([a-z])([A-Z])/g, "$1-$2")
       .replace(/[\s_]+/g, "-")
       .toLowerCase() +
-    "_" +
+    "/" +
     randomIDSuffix,
 );
 
@@ -57,7 +62,7 @@ onMounted(() => {
     :static-backdrop="true"
     size-modifier-modal="lg"
     modal-label="Confirm Delete User Modal"
-    v-on="{ 'hidden.bs.modal': modalClosed }"
+    v-on="{ 'hidden.bs.modal': modalClosed, 'shown.bs.modal': modalShown }"
   >
     <template #header>Are you absolutely sure?</template>
     <template #body>
@@ -78,7 +83,7 @@ onMounted(() => {
       </div>
       <p>
         Enter the following to confirm: <br /><code
-          class="rounded p-1"
+          class="rounded p-1 user-select-none"
           :class="{
             'bg-light': settings.lightThemeActive,
             'text-bg-secondary': !settings.lightThemeActive,
@@ -87,7 +92,12 @@ onMounted(() => {
         >
       </p>
       <div>
-        <input v-model="confirmDelete" type="text" class="form-control" />
+        <input
+          ref="textInputElement"
+          v-model="confirmDelete"
+          type="text"
+          class="form-control"
+        />
       </div>
     </template>
     <template #footer>
diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue
index cf841ae..60a8e5e 100644
--- a/src/views/LoginView.vue
+++ b/src/views/LoginView.vue
@@ -100,8 +100,8 @@ onMounted(() => {
           ><span class="clowm-red fw-bold">W</span
           ><span class="clowm-green fw-bold">M</span> with LifeScience
         </p>
-        <div>
-          <a :href="loginPath(OidcProvider.LIFESCIENCE_AAI)" class="my-2">
+        <div class="my-2">
+          <a :href="loginPath(OidcProvider.LIFESCIENCE_AAI)">
             <img
               src="/src/assets/images/ls-login.png"
               alt="[LS Login]"
@@ -110,12 +110,14 @@ onMounted(() => {
             />
           </a>
         </div>
-        <div>
-          <a
-            :href="loginPath(OidcProvider.NFDI_AAI)"
-            class="my-2 btn btn-lg btn-primary"
-          >
-            NFDI AAI
+        <div class="my-2">
+          <a :href="loginPath(OidcProvider.NFDI_AAI)">
+            <img
+              src="/src/assets/images/nfdi-aai.png"
+              alt="[NFDi AAI]"
+              class="img-fluid"
+              style="max-height: 90px"
+            />
           </a>
         </div>
         <div v-if="invitationToken == undefined" class="mt-2">
diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue
index 4a3295c..0fb0a46 100644
--- a/src/views/user/ProfileView.vue
+++ b/src/views/user/ProfileView.vue
@@ -48,21 +48,135 @@ onMounted(() => {
   <div class="row border-bottom mb-4">
     <h2 class="mb-2">My Profile</h2>
   </div>
-  <div class="row border-bottom mb-4">
-    <h3 class="mb-2 text-danger">Delete my profile</h3>
+  <div class="px-1">
+    <div class="row border-bottom mb-2">
+      <h3>My roles</h3>
+    </div>
+    <p>
+      CloWM uses
+      <a href="https://en.wikipedia.org/wiki/Role-based_access_control"
+        >role-based access control (RBAC)</a
+      >
+      to authorize each request from a user. For each role that a user has, he
+      is allowed to do certain actions on the platform.<br />
+      Write an email to
+      <a href="mailto:support@clowm.bi.denbi.de">support@clowm.bi.denbi.de</a>
+      to request additional roles.
+    </p>
+    <div>Your roles:</div>
+    <div class="ms-3">
+      <div class="form-check">
+        <input
+          id="profile-user-role-checkbox"
+          class="form-check-input"
+          type="checkbox"
+          disabled
+          checked
+        />
+        <label
+          class="form-check-label opacity-100"
+          for="profile-user-role-checkbox"
+        >
+          <b>Base User</b>: Upload & download data to your bucket and start
+          workflow executions.
+        </label>
+      </div>
+      <div class="form-check">
+        <input
+          id="profile-user-role-checkbox"
+          class="form-check-input"
+          type="checkbox"
+          disabled
+          :checked="userRepository.normalUser"
+        />
+        <label
+          class="form-check-label opacity-100"
+          for="profile-user-role-checkbox"
+        >
+          <b>Verified User</b>: Create additional buckets with increased quotas
+          and share them with other users.
+        </label>
+      </div>
+      <div class="form-check">
+        <input
+          id="profile-user-role-checkbox"
+          class="form-check-input"
+          type="checkbox"
+          disabled
+          :checked="userRepository.workflowDev"
+        />
+        <label
+          class="form-check-label opacity-100"
+          for="profile-user-role-checkbox"
+        >
+          <b>Workflow Developer</b>: Register workflows, manage them and track
+          their KPIs
+        </label>
+      </div>
+      <div class="form-check">
+        <input
+          id="profile-user-role-checkbox"
+          class="form-check-input"
+          type="checkbox"
+          disabled
+          :checked="userRepository.resourceMaintainer"
+        />
+        <label
+          class="form-check-label opacity-100"
+          for="profile-user-role-checkbox"
+        >
+          <b>Resource Maintainer</b>: Register resources and make them available
+          to workflow executions
+        </label>
+      </div>
+      <div class="form-check">
+        <input
+          id="profile-user-role-checkbox"
+          class="form-check-input"
+          type="checkbox"
+          disabled
+          :checked="userRepository.reviewer"
+        />
+        <label
+          class="form-check-label opacity-100"
+          for="profile-user-role-checkbox"
+        >
+          <b>Reviewer</b>: Review registered workflows and resources before
+          their publication.
+        </label>
+      </div>
+      <div class="form-check">
+        <input
+          id="profile-user-role-checkbox"
+          class="form-check-input"
+          type="checkbox"
+          disabled
+          :checked="userRepository.admin"
+        />
+        <label
+          class="form-check-label opacity-100"
+          for="profile-user-role-checkbox"
+        >
+          <b>Administrator</b>: Administer this CloWM instance.
+        </label>
+      </div>
+    </div>
+    <div class="row border-bottom mb-2 mt-4">
+      <h3 class="text-danger">Delete my account</h3>
+    </div>
+    <p>
+      This action deletes your account and you lose access to everything in
+      CloWM that is connected to your it. <b>There is no going back.</b>
+    </p>
+    <button
+      role="button"
+      class="btn btn-danger"
+      data-bs-toggle="modal"
+      data-bs-target="#profile-delete-user-modal"
+    >
+      Delete account
+    </button>
   </div>
-  <p>
-    This action deletes your account and you lose access to everything in CloWM
-    that is connected to your account. <b>There is no going back.</b>
-  </p>
-  <button
-    role="button"
-    class="btn btn-danger"
-    data-bs-toggle="modal"
-    data-bs-target="#profile-delete-user-modal"
-  >
-    Delete account
-  </button>
 </template>
 
 <style scoped></style>
-- 
GitLab


From 144b8df8f4d18bf2523e717e2435516005211d2a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Mon, 10 Feb 2025 15:07:48 +0000
Subject: [PATCH 04/25] Add account linking to profile page

#191
---
 src/views/user/ProfileView.vue | 352 ++++++++++++++++++++++-----------
 1 file changed, 232 insertions(+), 120 deletions(-)

diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue
index 0fb0a46..aefd1be 100644
--- a/src/views/user/ProfileView.vue
+++ b/src/views/user/ProfileView.vue
@@ -5,6 +5,11 @@ import DeleteUserModal from "@/components/modals/DeleteUserModal.vue";
 import { environment } from "@/environment.ts";
 import { onMounted } from "vue";
 import { Toast } from "bootstrap";
+import {
+  type AuthKickstartAccountConnectionData,
+  OidcProvider,
+} from "@/client/types.gen.ts";
+import { client } from "@/client/client.gen.ts";
 
 const userRepository = useUserStore();
 const props = defineProps<{
@@ -21,6 +26,19 @@ function deleteCurrentUser(uid: string) {
   });
 }
 
+function linkAccountPath(provider: OidcProvider): string {
+  const config: AuthKickstartAccountConnectionData = {
+    url: "/auth/account/connect/{provider}",
+    path: {
+      provider: provider,
+    },
+  };
+  return (
+    environment.API_BASE_URL +
+    client.buildUrl<AuthKickstartAccountConnectionData>(config)
+  );
+}
+
 onMounted(() => {
   successToast = Toast.getOrCreateInstance("#profile-success-toast");
   if (props.linkSuccess) {
@@ -35,10 +53,17 @@ onMounted(() => {
 
 <template>
   <bootstrap-toast toast-id="profile-success-toast" color-class="success"
-    >Success
+    >Successfully linked your account with a new AAI provider
   </bootstrap-toast>
-  <bootstrap-toast toast-id="profile-error-toast" color-class="danger"
-    >Error: {{ props.linkError }}
+  <bootstrap-toast toast-id="profile-error-toast" color-class="danger">
+    <template #default>Error linking your accounts</template>
+    <template #body>
+      <p>
+        There has been some kind of error during the account linking.<br />
+        Please try again later or contact the support.
+      </p>
+      <p>Error Code: {{ props.linkError }}</p>
+    </template>
   </bootstrap-toast>
   <delete-user-modal
     modal-id="profile-delete-user-modal"
@@ -49,133 +74,220 @@ onMounted(() => {
     <h2 class="mb-2">My Profile</h2>
   </div>
   <div class="px-1">
-    <div class="row border-bottom mb-2">
-      <h3>My roles</h3>
-    </div>
-    <p>
-      CloWM uses
-      <a href="https://en.wikipedia.org/wiki/Role-based_access_control"
-        >role-based access control (RBAC)</a
-      >
-      to authorize each request from a user. For each role that a user has, he
-      is allowed to do certain actions on the platform.<br />
-      Write an email to
-      <a href="mailto:support@clowm.bi.denbi.de">support@clowm.bi.denbi.de</a>
-      to request additional roles.
-    </p>
-    <div>Your roles:</div>
-    <div class="ms-3">
-      <div class="form-check">
-        <input
-          id="profile-user-role-checkbox"
-          class="form-check-input"
-          type="checkbox"
-          disabled
-          checked
+    <div class="d-flex justify-content-start column-gap-4">
+      <div class="text-center w-fit">
+        <img
+          v-if="userRepository.user"
+          :src="userRepository.user.gravatar_url + '?d=mp&s=128'"
+          class="rounded-circle img-fluid"
+          height="128"
+          width="128"
+          alt="profile picture"
         />
-        <label
-          class="form-check-label opacity-100"
-          for="profile-user-role-checkbox"
-        >
-          <b>Base User</b>: Upload & download data to your bucket and start
-          workflow executions.
-        </label>
+        <div><a href="https://gravatar.com">Change</a></div>
       </div>
-      <div class="form-check">
-        <input
-          id="profile-user-role-checkbox"
-          class="form-check-input"
-          type="checkbox"
-          disabled
-          :checked="userRepository.normalUser"
-        />
-        <label
-          class="form-check-label opacity-100"
-          for="profile-user-role-checkbox"
-        >
-          <b>Verified User</b>: Create additional buckets with increased quotas
-          and share them with other users.
-        </label>
+      <div>
+        Name: {{ userRepository.user?.display_name }}<br />
+        Email: {{ userRepository.user?.email }}<br />
+        CloWM ID: {{ userRepository.currentUID }}<br />
       </div>
-      <div class="form-check">
-        <input
-          id="profile-user-role-checkbox"
-          class="form-check-input"
-          type="checkbox"
-          disabled
-          :checked="userRepository.workflowDev"
-        />
-        <label
-          class="form-check-label opacity-100"
-          for="profile-user-role-checkbox"
-        >
-          <b>Workflow Developer</b>: Register workflows, manage them and track
-          their KPIs
-        </label>
+    </div>
+    <div>
+      <div class="row border-bottom mb-2 mt-4">
+        <h3>My linked accounts</h3>
       </div>
-      <div class="form-check">
-        <input
-          id="profile-user-role-checkbox"
-          class="form-check-input"
-          type="checkbox"
-          disabled
-          :checked="userRepository.resourceMaintainer"
-        />
-        <label
-          class="form-check-label opacity-100"
-          for="profile-user-role-checkbox"
-        >
-          <b>Resource Maintainer</b>: Register resources and make them available
-          to workflow executions
-        </label>
+      <div>
+        <h5>
+          <a href="https://lifescience-ri.eu/ls-login/">Life Science Login</a>
+        </h5>
+        <p>
+          The Life Science Login enables researchers to use their home
+          organisation credentials or community or other identities (e.g.
+          Google, Linkedin, LS ID) to sign in and access data and services they
+          need. It also allows service providers (both in academia and industry)
+          to control and manage access rights of their users and create
+          different access levels for research groups or international projects.
+        </p>
+        <div v-if="userRepository.user?.lifescience_id">
+          <b>Linked account: </b>
+          <a href="https://profile.aai.lifescience-ri.eu/profile"
+            >{{ userRepository.user?.lifescience_id }}@lifescience.eu</a
+          >
+        </div>
+        <div v-else>
+          <div>Connect with LifeScience</div>
+          <div class="my-2">
+            <a :href="linkAccountPath(OidcProvider.LIFESCIENCE_AAI)">
+              <img
+                src="/src/assets/images/ls-login.png"
+                alt="[LS Login]"
+                class="img-fluid"
+                style="max-height: 60px"
+              />
+            </a>
+          </div>
+        </div>
       </div>
-      <div class="form-check">
-        <input
-          id="profile-user-role-checkbox"
-          class="form-check-input"
-          type="checkbox"
-          disabled
-          :checked="userRepository.reviewer"
-        />
-        <label
-          class="form-check-label opacity-100"
-          for="profile-user-role-checkbox"
-        >
-          <b>Reviewer</b>: Review registered workflows and resources before
-          their publication.
-        </label>
+      <div>
+        <h5 class="mt-2">
+          <a href="https://base4nfdi.de/projects/iam4nfdi">NFDI AAI</a>
+        </h5>
+        <p>
+          By connecting and expanding Identity and Access Management (IAM)
+          systems, the IAM4NFDI initiative enables researchers across Germany
+          and worldwide to seamlessly access tools, data, and services within
+          the National Research Data Infrastructure (NFDI)
+        </p>
+        <div v-if="userRepository.user?.nfdi_id">
+          <b>Linked account: </b
+          >{{ userRepository.user?.nfdi_id }}@lifescience.eu
+        </div>
+        <div v-else>
+          <div>Link your account with NFDI AAI</div>
+          <div class="my-2">
+            <a :href="linkAccountPath(OidcProvider.NFDI_AAI)">
+              <img
+                src="/src/assets/images/nfdi-aai.png"
+                alt="[NFDi AAI]"
+                class="img-fluid"
+                style="max-height: 60px"
+              />
+            </a>
+          </div>
+        </div>
       </div>
-      <div class="form-check">
-        <input
-          id="profile-user-role-checkbox"
-          class="form-check-input"
-          type="checkbox"
-          disabled
-          :checked="userRepository.admin"
-        />
-        <label
-          class="form-check-label opacity-100"
-          for="profile-user-role-checkbox"
+    </div>
+    <div>
+      <div class="row border-bottom mb-2 mt-4">
+        <h3>My roles</h3>
+      </div>
+      <p>
+        CloWM uses
+        <a href="https://en.wikipedia.org/wiki/Role-based_access_control"
+          >role-based access control (RBAC)</a
         >
-          <b>Administrator</b>: Administer this CloWM instance.
-        </label>
+        to authorize each request from a user. For each role that a user has, he
+        is allowed to do certain actions on the platform.<br />
+        Write an email to
+        <a href="mailto:support@clowm.bi.denbi.de">support@clowm.bi.denbi.de</a>
+        to request additional roles.
+      </p>
+      <div>Your roles:</div>
+      <div class="ms-3">
+        <div class="form-check">
+          <input
+            id="profile-user-role-checkbox"
+            class="form-check-input"
+            type="checkbox"
+            disabled
+            checked
+          />
+          <label
+            class="form-check-label opacity-100"
+            for="profile-user-role-checkbox"
+          >
+            <b>Base User</b>: Upload & download data to your bucket and start
+            workflow executions.
+          </label>
+        </div>
+        <div class="form-check">
+          <input
+            id="profile-user-role-checkbox"
+            class="form-check-input"
+            type="checkbox"
+            disabled
+            :checked="userRepository.normalUser"
+          />
+          <label
+            class="form-check-label opacity-100"
+            for="profile-user-role-checkbox"
+          >
+            <b>Verified User</b>: Create additional buckets with increased
+            quotas and share them with other users.
+          </label>
+        </div>
+        <div class="form-check">
+          <input
+            id="profile-user-role-checkbox"
+            class="form-check-input"
+            type="checkbox"
+            disabled
+            :checked="userRepository.workflowDev"
+          />
+          <label
+            class="form-check-label opacity-100"
+            for="profile-user-role-checkbox"
+          >
+            <b>Workflow Developer</b>: Register workflows, manage them and track
+            their KPIs
+          </label>
+        </div>
+        <div class="form-check">
+          <input
+            id="profile-user-role-checkbox"
+            class="form-check-input"
+            type="checkbox"
+            disabled
+            :checked="userRepository.resourceMaintainer"
+          />
+          <label
+            class="form-check-label opacity-100"
+            for="profile-user-role-checkbox"
+          >
+            <b>Resource Maintainer</b>: Register resources and make them
+            available to workflow executions
+          </label>
+        </div>
+        <div class="form-check">
+          <input
+            id="profile-user-role-checkbox"
+            class="form-check-input"
+            type="checkbox"
+            disabled
+            :checked="userRepository.reviewer"
+          />
+          <label
+            class="form-check-label opacity-100"
+            for="profile-user-role-checkbox"
+          >
+            <b>Reviewer</b>: Review registered workflows and resources before
+            their publication.
+          </label>
+        </div>
+        <div class="form-check">
+          <input
+            id="profile-user-role-checkbox"
+            class="form-check-input"
+            type="checkbox"
+            disabled
+            :checked="userRepository.admin"
+          />
+          <label
+            class="form-check-label opacity-100"
+            for="profile-user-role-checkbox"
+          >
+            <b>Administrator</b>: Administer this CloWM instance.
+          </label>
+        </div>
       </div>
     </div>
-    <div class="row border-bottom mb-2 mt-4">
-      <h3 class="text-danger">Delete my account</h3>
+    <div>
+      <div class="row border-bottom mb-2 mt-4">
+        <h3 class="text-danger">Delete my account</h3>
+      </div>
+      <p>
+        This action deletes your account and you lose access to everything in
+        CloWM that is connected to your it. <b>There is no going back.</b>
+      </p>
+      <button
+        role="button"
+        class="btn btn-danger"
+        data-bs-toggle="modal"
+        data-bs-target="#profile-delete-user-modal"
+      >
+        Delete account
+      </button>
     </div>
-    <p>
-      This action deletes your account and you lose access to everything in
-      CloWM that is connected to your it. <b>There is no going back.</b>
-    </p>
-    <button
-      role="button"
-      class="btn btn-danger"
-      data-bs-toggle="modal"
-      data-bs-target="#profile-delete-user-modal"
-    >
-      Delete account
-    </button>
   </div>
 </template>
 
-- 
GitLab


From 149c3b03bb83063d0a8003409bfee282955eed6f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Mon, 10 Feb 2025 15:37:45 +0000
Subject: [PATCH 05/25] Fix bug when visiting workflow page without specifing
 version

#191
---
 src/views/workflows/WorkflowVersionView.vue |  2 +-
 src/views/workflows/WorkflowView.vue        | 17 ++++++++++++-----
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/views/workflows/WorkflowVersionView.vue b/src/views/workflows/WorkflowVersionView.vue
index 8007ea0..111a142 100644
--- a/src/views/workflows/WorkflowVersionView.vue
+++ b/src/views/workflows/WorkflowVersionView.vue
@@ -144,7 +144,7 @@ onMounted(() => {
       ]
     "
     :parameter-extension="
-      workflowRepository.versionMapping[props.versionId].parameter_extension
+      workflowRepository.versionMapping[props.versionId]?.parameter_extension
     "
   />
 </template>
diff --git a/src/views/workflows/WorkflowView.vue b/src/views/workflows/WorkflowView.vue
index 22ba4c8..4de6049 100644
--- a/src/views/workflows/WorkflowView.vue
+++ b/src/views/workflows/WorkflowView.vue
@@ -144,7 +144,13 @@ function updateWorkflow(workflowId: string) {
     .then((workflow) => {
       document.title = workflow.name + " - CloWM";
       if (props.versionId == undefined) {
-        updateVersion(workflow.versions[0]?.workflow_version_id);
+        updateVersion(
+          calculateLatestVersion(
+            workflow.versions.filter(
+              (version) => version.status == WorkflowVersionStatus.PUBLISHED,
+            ) || [],
+          )?.workflow_version_id,
+        );
       }
     });
 
@@ -156,7 +162,7 @@ function updateWorkflow(workflowId: string) {
 }
 
 function updateVersion(workflowVersionId?: string) {
-  if (workflowVersionId) {
+  if (workflowVersionId != undefined) {
     const possibleModes = getModesForVersion(workflowVersionId);
     let modeId: string | undefined = undefined;
     if (
@@ -174,7 +180,8 @@ function updateVersion(workflowVersionId?: string) {
     ) {
       modeId = props.workflowModeId;
     }
-    router.push({
+    router.replace({
+      name: "workflow-version",
       params: {
         ...route.params,
         versionId: workflowVersionId,
@@ -297,10 +304,10 @@ onMounted(() => {
           >Try the latest version {{ latestVersion.version }}.
         </router-link>
       </div>
-      <div class="row align-items-center">
+      <div v-if="props.versionId" class="row align-items-center">
         <div class="w-fit position-absolute start-0">
           <button
-            v-if="props.versionId && allowVersionDeprecation"
+            v-if="allowVersionDeprecation"
             type="button"
             class="btn btn-warning"
             @click="deprecateCurrentWorkflowVersion"
-- 
GitLab


From 0a64a9070dbc80d9df6d1db0d9cb20bdff270f1d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Mon, 10 Feb 2025 16:15:34 +0000
Subject: [PATCH 06/25] Make login page responsive

#191
---
 src/components/AppHeader.vue                  |  2 +-
 src/views/LoginView.vue                       | 31 ++++++++++++++-----
 src/views/admin/AdminUsersView.vue            | 11 ++++++-
 .../workflows/ListWorkflowExecutionsView.vue  |  7 +++--
 4 files changed, 39 insertions(+), 12 deletions(-)

diff --git a/src/components/AppHeader.vue b/src/components/AppHeader.vue
index a9f8509..71a3320 100644
--- a/src/components/AppHeader.vue
+++ b/src/components/AppHeader.vue
@@ -277,7 +277,7 @@ watch(
             :icon="`fa-solid fa-${settingsStore.lightThemeActive ? 'sun' : 'moon'}`"
           />
         </button>
-        <ul class="dropdown-menu w-fit">
+        <ul class="dropdown-menu w-fit dropdown-menu-end">
           <li>
             <button
               class="dropdown-item d-flex align-items-center"
diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue
index 60a8e5e..47721fd 100644
--- a/src/views/LoginView.vue
+++ b/src/views/LoginView.vue
@@ -69,10 +69,10 @@ onMounted(() => {
     </template>
   </bootstrap-toast>
   <div
-    class="position-absolute top-40 start-50 translate-middle text-center"
+    class="position-absolute middle-screen start-50 translate-middle text-center"
     style="min-width: 300px"
   >
-    <div class="fs-3 mb-3">
+    <div class="fs-3 mb-3 hide-sm">
       <img
         src="/src/assets/images/clowm.svg"
         class="mb-3 img-fluid"
@@ -92,15 +92,15 @@ onMounted(() => {
         <p v-if="invitationToken" class="card-text text-secondary">
           Connect your newly created <span class="clowm-blue fw-bold">Clo</span
           ><span class="clowm-red fw-bold">W</span
-          ><span class="clowm-green fw-bold">M</span> account with your
-          LifeScience account
+          ><span class="clowm-green fw-bold">M</span> account with with
         </p>
         <p v-else class="card-text text-secondary">
           Login to <span class="clowm-blue fw-bold">Clo</span
           ><span class="clowm-red fw-bold">W</span
-          ><span class="clowm-green fw-bold">M</span> with LifeScience
+          ><span class="clowm-green fw-bold">M</span> via
         </p>
-        <div class="my-2">
+        <div class="my-2 text-center">
+          <div class="fs-5">LifeScience Login</div>
           <a :href="loginPath(OidcProvider.LIFESCIENCE_AAI)">
             <img
               src="/src/assets/images/ls-login.png"
@@ -110,7 +110,8 @@ onMounted(() => {
             />
           </a>
         </div>
-        <div class="my-2">
+        <div class="my-2 mt-4 text-center">
+          <div class="fs-5">NFDI AAI</div>
           <a :href="loginPath(OidcProvider.NFDI_AAI)">
             <img
               src="/src/assets/images/nfdi-aai.png"
@@ -140,7 +141,21 @@ onMounted(() => {
 </template>
 
 <style scoped>
-.top-40 {
+.middle-screen {
   top: 40% !important;
 }
+@media (max-height: 750px) {
+  .hide-sm {
+    display: none !important;
+  }
+  .middle-screen {
+    top: 50% !important;
+  }
+}
+
+@media (min-height: 750px) and (max-height: 900px) {
+  .middle-screen {
+    top: 50% !important;
+  }
+}
 </style>
diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue
index 6e5a022..4969d38 100644
--- a/src/views/admin/AdminUsersView.vue
+++ b/src/views/admin/AdminUsersView.vue
@@ -275,7 +275,6 @@ onMounted(() => {
               Edit Roles
             </button>
             <button
-              v-if="user.invitation_token_created_at"
               type="button"
               class="btn btn-secondary btn-sm dropdown-toggle dropdown-toggle-split"
               data-bs-toggle="dropdown"
@@ -286,6 +285,7 @@ onMounted(() => {
             <ul class="dropdown-menu">
               <li>
                 <a
+                  v-if="user.invitation_token_created_at"
                   class="dropdown-item"
                   :class="{ disabled: userState.loading }"
                   :aria-disabled="userState.loading"
@@ -293,6 +293,15 @@ onMounted(() => {
                   >Resend invitation email</a
                 >
               </li>
+              <li>
+                <a
+                  class="dropdown-item text-danger disabled"
+                  aria-disabled="true"
+                >
+                  <font-awesome-icon icon="fa-solid fa-trash" class="me-1" />
+                  Delete</a
+                >
+              </li>
             </ul>
           </div>
         </td>
diff --git a/src/views/workflows/ListWorkflowExecutionsView.vue b/src/views/workflows/ListWorkflowExecutionsView.vue
index a8e6108..3678bf5 100644
--- a/src/views/workflows/ListWorkflowExecutionsView.vue
+++ b/src/views/workflows/ListWorkflowExecutionsView.vue
@@ -355,8 +355,11 @@ onUnmounted(() => {
                       data-bs-target="#deleteWorkflowExecutionModal"
                       @click="executionsState.executionToDelete = execution"
                     >
-                      <font-awesome-icon icon="fa-solid fa-trash" />
-                      <span class="ms-1">Delete</span>
+                      <font-awesome-icon
+                        icon="fa-solid fa-trash"
+                        class="me-1"
+                      />
+                      <span>Delete</span>
                     </button>
                   </li>
                 </ul>
-- 
GitLab


From 2765a99dd29267222a49ca23f4d2eaf552236d96 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Tue, 11 Feb 2025 10:59:36 +0000
Subject: [PATCH 07/25] Refactor Delete modals and support deleting resources

#191
---
 src/components/modals/DeleteBucketModal.vue   | 43 +++++++++++
 src/components/modals/DeleteModal.vue         | 71 ++++++++++++-------
 src/components/modals/DeleteObjectsModal.vue  | 44 ++++++++++++
 src/components/modals/DeleteResourceModal.vue | 48 +++++++++++++
 src/components/modals/DeleteUserModal.vue     | 49 ++++++-------
 src/components/modals/DeleteWorkflowModal.vue | 48 +++++++++++++
 src/components/resources/ResourceCard.vue     | 11 +++
 src/stores/resources.ts                       | 12 ++++
 src/views/LoginView.vue                       |  2 +-
 src/views/object-storage/BucketView.vue       | 14 ++--
 src/views/object-storage/BucketsView.vue      | 11 ++-
 src/views/resources/MyResourcesView.vue       | 28 +++++++-
 src/views/workflows/MyWorkflowsView.vue       | 12 ++--
 13 files changed, 310 insertions(+), 83 deletions(-)
 create mode 100644 src/components/modals/DeleteBucketModal.vue
 create mode 100644 src/components/modals/DeleteObjectsModal.vue
 create mode 100644 src/components/modals/DeleteResourceModal.vue
 create mode 100644 src/components/modals/DeleteWorkflowModal.vue

diff --git a/src/components/modals/DeleteBucketModal.vue b/src/components/modals/DeleteBucketModal.vue
new file mode 100644
index 0000000..6903e74
--- /dev/null
+++ b/src/components/modals/DeleteBucketModal.vue
@@ -0,0 +1,43 @@
+<script setup lang="ts">
+import DeleteModal from "./DeleteModal.vue";
+import type { BucketOut } from "@/client/types.gen.ts";
+
+const props = defineProps<{
+  modalId: string;
+  bucket?: BucketOut;
+  backModalId?: string;
+}>();
+
+const emit = defineEmits<{
+  (e: "confirm-delete", bucketName: string): void;
+}>();
+
+function deleteBucket() {
+  if (props.bucket != undefined) {
+    emit("confirm-delete", props.bucket.name);
+    window._paq?.push(["trackEvent", "delete", "bucket", props.bucket.name]);
+  }
+}
+</script>
+
+<template>
+  <delete-modal
+    :modal-id="props.modalId"
+    :back-modal-id="props.backModalId"
+    delete-type="Bucket"
+    :disabled="props.bucket == undefined"
+    @confirm-delete="deleteBucket"
+  >
+    <template #body>
+      <p>
+        Are you sure you want to delete the bucket
+        <strong v-if="props.bucket">{{ props.bucket.name }}</strong
+        >?<br />
+        All files inside this bucket will be deleted to and won't be accessible
+        anymore
+      </p>
+    </template>
+  </delete-modal>
+</template>
+
+<style scoped></style>
diff --git a/src/components/modals/DeleteModal.vue b/src/components/modals/DeleteModal.vue
index a87f103..7b4418f 100644
--- a/src/components/modals/DeleteModal.vue
+++ b/src/components/modals/DeleteModal.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { onMounted, ref } from "vue";
+import { computed, onMounted, ref, useSlots } from "vue";
 import { Modal } from "bootstrap";
 import BootstrapModal from "@/components/modals/BootstrapModal.vue";
 
@@ -7,12 +7,15 @@ const props = defineProps<{
   modalId: string;
   objectNameDelete?: string;
   backModalId?: string;
+  disabled?: boolean;
+  deleteType?: string;
 }>();
 
 const confirmDelete = ref<boolean>(false);
 const emit = defineEmits<{
   (e: "confirm-delete"): void;
 }>();
+const slots = useSlots();
 
 let deleteModal: Modal | null = null;
 const randomIDSuffix = Math.random().toString(16).substring(2, 8);
@@ -21,12 +24,19 @@ function modalClosed() {
   confirmDelete.value = false;
 }
 
-function deleteObject() {
+function deleteStuff() {
   emit("confirm-delete");
   deleteModal?.hide();
   confirmDelete.value = false;
 }
 
+const deleteButtonDisabled = computed<boolean>(() => {
+  if (slots.confirmDelete != undefined) {
+    return props.disabled;
+  }
+  return !confirmDelete.value || props.disabled;
+});
+
 onMounted(() => {
   deleteModal = Modal.getOrCreateInstance("#" + props.modalId);
 });
@@ -36,31 +46,35 @@ onMounted(() => {
   <bootstrap-modal
     :modal-id="props.modalId"
     :static-backdrop="true"
-    modal-label="Confirm Delete Modal"
+    :modal-label="`Confirm Delete ${props.deleteType != undefined ? props.deleteType + ' ' : ''}Modal`"
     v-on="{ 'hidden.bs.modal': modalClosed }"
   >
-    <template #header> Delete {{ props.objectNameDelete }}</template>
+    <template #header>Are you absolutely sure?</template>
     <template #body>
-      <p>
-        Are you sure you want to delete
-        <strong v-if="props.objectNameDelete">{{
-          props.objectNameDelete
-        }}</strong>
-      </p>
-      <div class="form-check">
-        <input
-          :id="'checkConfirmDelete' + randomIDSuffix"
-          v-model="confirmDelete"
-          class="form-check-input"
-          type="checkbox"
-        />
-        <label
-          class="form-check-label"
-          :for="'checkConfirmDelete' + randomIDSuffix"
-        >
-          <strong>Yes</strong>, I am sure.
-        </label>
-      </div>
+      <slot name="body">
+        <p>
+          Are you sure you want to delete
+          <span v-if="props.objectNameDelete">{{
+            props.objectNameDelete
+          }}</span>
+        </p>
+      </slot>
+      <slot name="confirmDelete">
+        <div class="form-check">
+          <input
+            :id="'checkConfirmDelete' + randomIDSuffix"
+            v-model="confirmDelete"
+            class="form-check-input"
+            type="checkbox"
+          />
+          <label
+            class="form-check-label"
+            :for="'checkConfirmDelete' + randomIDSuffix"
+          >
+            <strong>Yes</strong>, I am sure.
+          </label>
+        </div>
+      </slot>
     </template>
     <template #footer>
       <button
@@ -83,10 +97,13 @@ onMounted(() => {
       <button
         type="button"
         class="btn btn-danger"
-        :disabled="!confirmDelete"
-        @click="deleteObject"
+        :disabled="deleteButtonDisabled"
+        @click="deleteStuff"
       >
-        Delete
+        Yes, delete
+        <span v-if="props.deleteType" class="text-lowercase">{{
+          props.deleteType
+        }}</span>
       </button>
     </template>
   </bootstrap-modal>
diff --git a/src/components/modals/DeleteObjectsModal.vue b/src/components/modals/DeleteObjectsModal.vue
new file mode 100644
index 0000000..8c08a63
--- /dev/null
+++ b/src/components/modals/DeleteObjectsModal.vue
@@ -0,0 +1,44 @@
+<script setup lang="ts">
+import DeleteModal from "./DeleteModal.vue";
+
+const props = defineProps<{
+  modalId: string;
+  objectKeys: string[];
+  backModalId?: string;
+}>();
+
+const emit = defineEmits<{
+  (e: "confirm-delete", keys: string[]): void;
+}>();
+
+function deleteObjects() {
+  if (props.objectKeys.length > 0) {
+    emit("confirm-delete", props.objectKeys);
+    window._paq?.push(["trackEvent", "delete", "objects"]);
+  }
+}
+</script>
+
+<template>
+  <delete-modal
+    :modal-id="props.modalId"
+    :back-modal-id="props.backModalId"
+    delete-type="Objects"
+    :disabled="props.objectKeys.length === 0"
+    @confirm-delete="deleteObjects"
+  >
+    <template #body>
+      <div>
+        Are you sure you want to delete {{ props.objectKeys.length }} objects?
+      </div>
+      <ul>
+        <li v-for="key in objectKeys.slice(0, 6)" :key="key">
+          {{ key }}
+        </li>
+        <li v-if="objectKeys.length > 6">...</li>
+      </ul>
+    </template>
+  </delete-modal>
+</template>
+
+<style scoped></style>
diff --git a/src/components/modals/DeleteResourceModal.vue b/src/components/modals/DeleteResourceModal.vue
new file mode 100644
index 0000000..1d28112
--- /dev/null
+++ b/src/components/modals/DeleteResourceModal.vue
@@ -0,0 +1,48 @@
+<script setup lang="ts">
+import type { ResourceOut } from "@/client/types.gen.ts";
+import DeleteModal from "./DeleteModal.vue";
+
+const props = defineProps<{
+  modalId: string;
+  resource?: ResourceOut;
+  backModalId?: string;
+}>();
+
+const emit = defineEmits<{
+  (e: "confirm-delete", resourceId: string): void;
+}>();
+
+function deleteResource() {
+  if (props.resource != undefined) {
+    emit("confirm-delete", props.resource.resource_id);
+    window._paq?.push([
+      "trackEvent",
+      "delete",
+      "resource",
+      props.resource.resource_id,
+    ]);
+  }
+}
+</script>
+
+<template>
+  <delete-modal
+    :modal-id="props.modalId"
+    :back-modal-id="props.backModalId"
+    delete-type="Resource"
+    :disabled="props.resource == undefined"
+    @confirm-delete="deleteResource"
+  >
+    <template #body>
+      <p>
+        Are you sure you want to delete the workflow
+        <strong v-if="props.resource">{{ props.resource.name }}</strong> and its
+        {{ props.resource?.versions.length }} versions?<br />
+        This is not reversible and all data will be delete on the cluster and in
+        S3.
+      </p>
+    </template>
+  </delete-modal>
+</template>
+
+<style scoped></style>
diff --git a/src/components/modals/DeleteUserModal.vue b/src/components/modals/DeleteUserModal.vue
index b327b23..5125808 100644
--- a/src/components/modals/DeleteUserModal.vue
+++ b/src/components/modals/DeleteUserModal.vue
@@ -1,10 +1,9 @@
 <script setup lang="ts">
-import { computed, onMounted, ref } from "vue";
-import { Modal } from "bootstrap";
-import BootstrapModal from "@/components/modals/BootstrapModal.vue";
+import { computed, ref } from "vue";
 import type { UserOut } from "@/client";
 import { useSettingsStore, useUserStore } from "@/stores";
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
+import DeleteModal from "./DeleteModal.vue";
 
 const props = defineProps<{
   modalId: string;
@@ -20,7 +19,6 @@ const textInputElement = ref<HTMLInputElement | undefined>(undefined);
 const userRepository = useUserStore();
 const settings = useSettingsStore();
 
-let deleteModal: Modal | null = null;
 const randomIDSuffix = Math.random().toString(16).substring(2, 8);
 
 function modalClosed() {
@@ -33,7 +31,7 @@ function modalShown() {
 
 function deleteUser() {
   emit("confirm-delete", props.user.uid);
-  deleteModal?.hide();
+  window._paq?.push(["trackEvent", "delete", "user", props.user.uid]);
   confirmDelete.value = "";
 }
 
@@ -50,21 +48,16 @@ const confirmDeleteString = computed<string>(
 const deleteCurrentUser = computed<boolean>(
   () => props.user.uid === userRepository.currentUID,
 );
-
-onMounted(() => {
-  deleteModal = Modal.getOrCreateInstance("#" + props.modalId);
-});
 </script>
 
 <template>
-  <bootstrap-modal
+  <delete-modal
     :modal-id="props.modalId"
-    :static-backdrop="true"
-    size-modifier-modal="lg"
-    modal-label="Confirm Delete User Modal"
-    v-on="{ 'hidden.bs.modal': modalClosed, 'shown.bs.modal': modalShown }"
+    delete-type="Account"
+    :disabled="confirmDelete !== confirmDeleteString"
+    @confirm-delete="deleteUser"
+    v-on="{ 'shown.bs.modal': modalShown, 'hidden.bs.modal': modalClosed }"
   >
-    <template #header>Are you absolutely sure?</template>
     <template #body>
       <div v-if="deleteCurrentUser">
         <div class="text-danger">
@@ -81,6 +74,17 @@ onMounted(() => {
           <li v-if="userRepository.resourceMaintainer">Your CloWM resources</li>
         </ul>
       </div>
+      <div v-else>
+        <div class="text-danger">
+          <font-awesome-icon icon="fa-solid fa-circle-exclamation" />
+          You are about to delete the account of
+          <strong>{{ user.display_name }}</strong
+          >. You won't be able to log in to CloWM anymore and won't have access
+          to his data etc.
+        </div>
+      </div>
+    </template>
+    <template #confirmDelete>
       <p>
         Enter the following to confirm: <br /><code
           class="rounded p-1 user-select-none"
@@ -100,20 +104,7 @@ onMounted(() => {
         />
       </div>
     </template>
-    <template #footer>
-      <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
-        Cancel
-      </button>
-      <button
-        type="button"
-        class="btn btn-danger"
-        :disabled="confirmDelete !== confirmDeleteString"
-        @click="deleteUser"
-      >
-        Yes, delete account
-      </button>
-    </template>
-  </bootstrap-modal>
+  </delete-modal>
 </template>
 
 <style scoped></style>
diff --git a/src/components/modals/DeleteWorkflowModal.vue b/src/components/modals/DeleteWorkflowModal.vue
new file mode 100644
index 0000000..535ef7c
--- /dev/null
+++ b/src/components/modals/DeleteWorkflowModal.vue
@@ -0,0 +1,48 @@
+<script setup lang="ts">
+import type { WorkflowOut } from "@/client/types.gen.ts";
+import DeleteModal from "./DeleteModal.vue";
+
+const props = defineProps<{
+  modalId: string;
+  workflow?: WorkflowOut;
+  backModalId?: string;
+}>();
+
+const emit = defineEmits<{
+  (e: "confirm-delete", workflowId: string): void;
+}>();
+
+function deleteWorkflow() {
+  if (props.workflow != undefined) {
+    emit("confirm-delete", props.workflow.workflow_id);
+    window._paq?.push([
+      "trackEvent",
+      "delete",
+      "workflow",
+      props.workflow.workflow_id,
+    ]);
+  }
+}
+</script>
+
+<template>
+  <delete-modal
+    :modal-id="props.modalId"
+    :back-modal-id="props.backModalId"
+    delete-type="Workflow"
+    :disabled="props.workflow == undefined"
+    @confirm-delete="deleteWorkflow"
+  >
+    <template #body>
+      <p>
+        Are you sure you want to delete the workflow
+        <strong v-if="props.workflow">{{ props.workflow.name }}</strong> and its
+        {{ props.workflow?.versions.length }} versions?<br />
+        This is not reversible and all KPIs related to this workflow will be
+        lost.
+      </p>
+    </template>
+  </delete-modal>
+</template>
+
+<style scoped></style>
diff --git a/src/components/resources/ResourceCard.vue b/src/components/resources/ResourceCard.vue
index 1ed4c71..b362c32 100644
--- a/src/components/resources/ResourceCard.vue
+++ b/src/components/resources/ResourceCard.vue
@@ -57,6 +57,7 @@ const emit = defineEmits<{
   (e: "click-request-sync", resourceVersion: ResourceVersionOut): void;
   (e: "click-show-otr", resourceId: string): void;
   (e: "click-create-otr", resource: ResourceOut): void;
+  (e: "click-delete", resource: ResourceOut): void;
 }>();
 
 const resourceVersionS3Ready = ref<Record<string, boolean>>({});
@@ -219,6 +220,16 @@ onMounted(() => {
                 Transfer ownership
               </button>
             </li>
+            <li>
+              <button
+                type="button"
+                class="dropdown-item text-danger"
+                @click="emit('click-delete', resource)"
+              >
+                <font-awesome-icon icon="fa-solid fa-trash" class="=me-2" />
+                Delete
+              </button>
+            </li>
           </ul>
         </div>
       </div>
diff --git a/src/stores/resources.ts b/src/stores/resources.ts
index cb903a9..5549f8c 100644
--- a/src/stores/resources.ts
+++ b/src/stores/resources.ts
@@ -484,5 +484,17 @@ export const useResourceStore = defineStore("resources", {
           return resource;
         });
     },
+    delete(resourceId: string): Promise<void> {
+      return ResourceService.resourceDeleteResource({
+        path: {
+          rid: resourceId,
+        },
+      }).then(() => {
+        delete this.resourceMapping[resourceId];
+        delete this.ownResourceMapping[resourceId];
+        delete this.reviewableResourceMapping[resourceId];
+        delete this.syncRequestMapping[resourceId];
+      });
+    },
   },
 });
diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue
index 47721fd..c24cab0 100644
--- a/src/views/LoginView.vue
+++ b/src/views/LoginView.vue
@@ -92,7 +92,7 @@ onMounted(() => {
         <p v-if="invitationToken" class="card-text text-secondary">
           Connect your newly created <span class="clowm-blue fw-bold">Clo</span
           ><span class="clowm-red fw-bold">W</span
-          ><span class="clowm-green fw-bold">M</span> account with with
+          ><span class="clowm-green fw-bold">M</span> account with
         </p>
         <p v-else class="card-text text-secondary">
           Login to <span class="clowm-blue fw-bold">Clo</span
diff --git a/src/views/object-storage/BucketView.vue b/src/views/object-storage/BucketView.vue
index 6ae8d44..29d3f77 100644
--- a/src/views/object-storage/BucketView.vue
+++ b/src/views/object-storage/BucketView.vue
@@ -15,7 +15,6 @@ import CopyObjectModal from "@/components/object-storage/modals/CopyObjectModal.
 import PermissionModal from "@/components/object-storage/modals/PermissionModal.vue";
 import ObjectDetailModal from "@/components/object-storage/modals/ObjectDetailModal.vue";
 import CreateFolderModal from "@/components/object-storage/modals/CreateFolderModal.vue";
-import DeleteModal from "@/components/modals/DeleteModal.vue";
 import type { _Object as S3Object } from "@aws-sdk/client-s3";
 import { useUserStore } from "@/stores/users";
 import { useBucketStore } from "@/stores/buckets";
@@ -25,6 +24,7 @@ import BootstrapToast from "@/components/BootstrapToast.vue";
 import { useSettingsStore } from "@/stores/settings";
 import { md5 } from "@/utils/md5";
 import DownloadObjectsModal from "@/components/object-storage/modals/DownloadObjectsModal.vue";
+import DeleteObjectsModal from "@/components/modals/DeleteObjectsModal.vue";
 
 const authStore = useUserStore();
 const bucketRepository = useBucketStore();
@@ -493,16 +493,10 @@ function clickBox() {
     :keys="objectState.selectedObjs"
     :ignore-prefix="currentSubFolders.join('/') + '/'"
   />
-  <delete-modal
+  <delete-objects-modal
     modal-id="delete-object-modal"
-    :object-name-delete="
-      deleteObjectsState.potentialObjectsToDelete.length === 1
-        ? deleteObjectsState.potentialObjectsToDelete[0]
-        : 'selected items'
-    "
-    @confirm-delete="
-      confirmedDeleteKeys(deleteObjectsState.potentialObjectsToDelete)
-    "
+    :object-keys="deleteObjectsState.potentialObjectsToDelete"
+    @confirm-delete="confirmedDeleteKeys"
   />
   <!-- Navbar Breadcrumb -->
   <nav aria-label="breadcrumb" class="fs-2">
diff --git a/src/views/object-storage/BucketsView.vue b/src/views/object-storage/BucketsView.vue
index 06aacba..208b713 100644
--- a/src/views/object-storage/BucketsView.vue
+++ b/src/views/object-storage/BucketsView.vue
@@ -8,7 +8,6 @@ import { OwnershipTypeEnum } from "@/client/types.gen";
 import { useRouter } from "vue-router";
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
 import CreateBucketModal from "@/components/object-storage/modals/CreateBucketModal.vue";
-import DeleteModal from "@/components/modals/DeleteModal.vue";
 import BucketListItem from "@/components/object-storage/BucketListItem.vue";
 import { useBucketStore } from "@/stores/buckets";
 import { Modal, Tooltip } from "bootstrap";
@@ -18,6 +17,7 @@ import { useOTRStore } from "@/stores/otrs";
 import BucketDetailModal from "@/components/object-storage/modals/BucketDetailModal.vue";
 import ListOtrsModal from "@/components/modals/ListOtrsModal.vue";
 import OtrModal from "@/components/modals/ShowOtrModal.vue";
+import DeleteBucketModal from "@/components/modals/DeleteBucketModal.vue";
 
 const router = useRouter();
 const bucketRepository = useBucketStore();
@@ -123,13 +123,12 @@ onMounted(() => {
 </script>
 
 <template>
-  <DeleteModal
+  <delete-bucket-modal
     modal-id="delete-bucket-modal"
-    :object-name-delete="bucketsState.potentialDeleteBucketName"
-    :back-modal-id="undefined"
-    @confirm-delete="
-      confirmedDeleteBucket(bucketsState.potentialDeleteBucketName)
+    :bucket="
+      bucketRepository.bucketMapping[bucketsState.potentialDeleteBucketName]
     "
+    @confirm-delete="confirmedDeleteBucket"
   />
   <CreateBucketModal
     v-if="!authStore.foreignUser"
diff --git a/src/views/resources/MyResourcesView.vue b/src/views/resources/MyResourcesView.vue
index 02436e4..d5d12c0 100644
--- a/src/views/resources/MyResourcesView.vue
+++ b/src/views/resources/MyResourcesView.vue
@@ -23,6 +23,7 @@ import ListOtrsModal from "@/components/modals/ListOtrsModal.vue";
 import { useOTRStore } from "@/stores/otrs";
 import { useUserStore } from "@/stores/users";
 import { useSettingsStore } from "@/stores/settings";
+import DeleteResourceModal from "@/components/modals/DeleteResourceModal.vue";
 
 const resourceRepository = useResourceStore();
 const s3KeyRepository = useS3KeyStore();
@@ -33,6 +34,7 @@ const settingsStore = useSettingsStore();
 let showOtrModalInstance: Modal | null = null;
 let createOtrModalInstance: Modal | null = null;
 let requestReasonModal: Modal | null = null;
+let deleteModal: Modal | null = null;
 let syncRequestSuccessToast: Toast | null = null;
 
 const resourceState = reactive<{
@@ -40,12 +42,14 @@ const resourceState = reactive<{
   resourceVersionInfo?: ResourceVersionOut;
   updateResource: ResourceOut;
   syncResourceVersion?: ResourceVersionOut;
+  deleteResource: string;
   showOtrTarget: string;
   createOtrTarget: ResourceOut;
 }>({
   loading: true,
   resourceVersionInfo: undefined,
   syncResourceVersion: undefined,
+  deleteResource: "",
   showOtrTarget: "",
   createOtrTarget: {
     name: "",
@@ -93,6 +97,15 @@ function showCreateOtrModal(resource: ResourceOut) {
   createOtrModalInstance?.show();
 }
 
+function showDeleteResourceModal(resource: ResourceOut) {
+  resourceState.deleteResource = resource.resource_id;
+  deleteModal?.show();
+}
+
+function deleteResource(resource_id: string) {
+  resourceRepository.delete(resource_id);
+}
+
 function requestResourceSync(
   reason: string,
   resourceVersion?: ResourceVersionOut,
@@ -112,12 +125,15 @@ function requestResourceSync(
 onMounted(() => {
   new Tooltip("#showResourceOtrsButtons");
   let fetchedResources = false;
-  requestReasonModal = new Modal("#request-synchronization-modal");
-  syncRequestSuccessToast = new Toast("#request-sync-toast");
+  requestReasonModal = Modal.getOrCreateInstance(
+    "#request-synchronization-modal",
+  );
+  syncRequestSuccessToast = Toast.getOrCreateInstance("#request-sync-toast");
   showOtrModalInstance = Modal.getOrCreateInstance("#view-resource-otr-modal");
   createOtrModalInstance = Modal.getOrCreateInstance(
     "#create-resource-otr-modal",
   );
+  deleteModal = Modal.getOrCreateInstance("#delete-resource-modal");
   otrRepository.fetchOwnOtrs(OwnershipTypeEnum.RESOURCE);
   s3KeyRepository.fetchS3Keys(() => {
     if (!fetchedResources) {
@@ -131,6 +147,13 @@ onMounted(() => {
 </script>
 
 <template>
+  <delete-resource-modal
+    modal-id="delete-resource-modal"
+    :resource="
+      resourceRepository.ownResourceMapping[resourceState.deleteResource]
+    "
+    @confirm-delete="deleteResource"
+  />
   <otr-modal
     :otr-target-id="resourceState.showOtrTarget"
     modal-id="view-resource-otr-modal"
@@ -241,6 +264,7 @@ onMounted(() => {
         @click-request-sync="setResourceSync"
         @click-show-otr="showOtrModal"
         @click-create-otr="showCreateOtrModal"
+        @click-delete="showDeleteResourceModal"
       />
     </CardTransitionGroup>
   </div>
diff --git a/src/views/workflows/MyWorkflowsView.vue b/src/views/workflows/MyWorkflowsView.vue
index bf20bdc..9ea093c 100644
--- a/src/views/workflows/MyWorkflowsView.vue
+++ b/src/views/workflows/MyWorkflowsView.vue
@@ -14,7 +14,6 @@ import WorkflowWithVersionsCard from "@/components/workflows/WorkflowWithVersion
 import CreateWorkflowModal from "@/components/workflows/modals/CreateWorkflowModal.vue";
 import CardTransitionGroup from "@/components/transitions/CardTransitionGroup.vue";
 import UpdateWorkflowModal from "@/components/workflows/modals/UpdateWorkflowModal.vue";
-import DeleteModal from "@/components/modals/DeleteModal.vue";
 import UpdateWorkflowVersionIconModal from "@/components/workflows/modals/UpdateWorkflowVersionIconModal.vue";
 import UpdateWorkflowCredentialsModal from "@/components/workflows/modals/UpdateWorkflowCredentialsModal.vue";
 import { useWorkflowStore } from "@/stores/workflows";
@@ -28,6 +27,7 @@ import { useUserStore } from "@/stores/users";
 import { Modal, Tooltip } from "bootstrap";
 import { useSettingsStore } from "@/stores/settings";
 import CreateOtrModal from "@/components/modals/CreateOtrModal.vue";
+import DeleteWorkflowModal from "@/components/modals/DeleteWorkflowModal.vue";
 
 const workflowRepository = useWorkflowStore();
 const workflowExecutionRepository = useWorkflowExecutionStore();
@@ -169,14 +169,10 @@ onMounted(() => {
     :workflow="workflowsState.updateWorkflow"
     modal-id="updateWorkflowModal"
   />
-  <delete-modal
+  <delete-workflow-modal
     modal-id="deleteWorkflowModal"
-    :object-name-delete="workflowsState.potentialWorkflowDelete?.name"
-    @confirm-delete="
-      confirmedWorkflowDelete(
-        workflowsState.potentialWorkflowDelete?.workflow_id,
-      )
-    "
+    :workflow="workflowsState.potentialWorkflowDelete"
+    @confirm-delete="confirmedWorkflowDelete"
   />
   <update-workflow-version-icon-modal
     modal-id="updateWorkflowVersionIconModal"
-- 
GitLab


From a6fd658bcef6c2476476b42d09e8ba0c4449ce43 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Tue, 11 Feb 2025 14:43:13 +0000
Subject: [PATCH 08/25] Add S3 key delete modal

#191
---
 src/components/modals/DeleteS3KeyModal.vue |  41 +++++++++
 src/views/object-storage/S3KeyView.vue     | 102 +++++++++++++++------
 2 files changed, 117 insertions(+), 26 deletions(-)
 create mode 100644 src/components/modals/DeleteS3KeyModal.vue

diff --git a/src/components/modals/DeleteS3KeyModal.vue b/src/components/modals/DeleteS3KeyModal.vue
new file mode 100644
index 0000000..57a2dbb
--- /dev/null
+++ b/src/components/modals/DeleteS3KeyModal.vue
@@ -0,0 +1,41 @@
+<script setup lang="ts">
+import DeleteModal from "./DeleteModal.vue";
+
+const props = defineProps<{
+  modalId: string;
+  accessKey?: string;
+  backModalId?: string;
+}>();
+
+const emit = defineEmits<{
+  (e: "confirm-delete", keyId: string): void;
+}>();
+
+function deleteKey() {
+  if (props.accessKey != undefined) {
+    emit("confirm-delete", props.accessKey);
+    window._paq?.push(["trackEvent", "delete", "s3key", props.accessKey]);
+  }
+}
+</script>
+
+<template>
+  <delete-modal
+    :modal-id="props.modalId"
+    :back-modal-id="props.backModalId"
+    delete-type="S3 Key"
+    :disabled="props.accessKey == undefined"
+    @confirm-delete="deleteKey"
+  >
+    <template #body>
+      <p>
+        Are you sure you want to delete the S3 key with the ID
+        <strong v-if="props.accessKey">{{ props.accessKey }}</strong
+        >?<br />
+        You can't access your buckets with this key anymore.
+      </p>
+    </template>
+  </delete-modal>
+</template>
+
+<style scoped></style>
diff --git a/src/views/object-storage/S3KeyView.vue b/src/views/object-storage/S3KeyView.vue
index 66af943..8c29c38 100644
--- a/src/views/object-storage/S3KeyView.vue
+++ b/src/views/object-storage/S3KeyView.vue
@@ -1,10 +1,10 @@
 <script setup lang="ts">
 import type { S3Key } from "@/client";
-import { reactive, watch } from "vue";
+import { ref, watch } from "vue";
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
-import DeleteModal from "@/components/modals/DeleteModal.vue";
 import { environment } from "@/environment";
 import CopyToClipboardIcon from "@/components/CopyToClipboardIcon.vue";
+import DeleteS3KeyModal from "@/components/modals/DeleteS3KeyModal.vue";
 
 const props = defineProps<{
   s3key: S3Key;
@@ -19,28 +19,22 @@ const emit = defineEmits<{
 watch(
   () => props.s3key.access_key,
   () => {
-    visibleKeys.secret = false;
+    visibleSecretKey.value = false;
   },
 );
-const visibleKeys = reactive<{
-  secret: boolean;
-  access: boolean;
-}>({
-  secret: false,
-  access: true,
-});
+const visibleSecretKey = ref<boolean>(false);
 
-function deleteKeyTrigger() {
+function deleteKeyTrigger(keyId: string) {
   if (props.deletable) {
-    emit("delete-key", props.s3key.access_key);
+    emit("delete-key", keyId);
   }
 }
 </script>
 
 <template>
-  <delete-modal
+  <delete-s3-key-modal
     modal-id="delete-key-modal"
-    :object-name-delete="'S3 Key ' + props.s3key.access_key"
+    :access-key="props.s3key.access_key"
     @confirm-delete="deleteKeyTrigger"
   />
   <h3>S3 Endpoint:</h3>
@@ -62,18 +56,10 @@ function deleteKeyTrigger() {
     <span class="placeholder col-5 mt-3 mb-2 fs-4"></span><br />
   </div>
   <div v-else class="input-group mb-2">
-    <span
-      class="input-group-text cursor-pointer"
-      @click="visibleKeys.access = !visibleKeys.access"
-    >
-      <font-awesome-icon
-        :icon="visibleKeys.access ? 'fa-solid fa-eye' : 'fa-solid fa-eye-slash'"
-      />
-    </span>
     <input
       id="s3-access-key"
       class="form-control"
-      :type="visibleKeys.access ? 'text' : 'password'"
+      type="text"
       :value="props.s3key.access_key"
       aria-label="S3 Access Key"
       readonly
@@ -89,16 +75,16 @@ function deleteKeyTrigger() {
   <div v-else class="input-group fs-4 mb-3">
     <span
       class="input-group-text cursor-pointer"
-      @click="visibleKeys.secret = !visibleKeys.secret"
+      @click="visibleSecretKey = !visibleSecretKey"
     >
       <font-awesome-icon
-        :icon="visibleKeys.secret ? 'fa-solid fa-eye' : 'fa-solid fa-eye-slash'"
+        :icon="visibleSecretKey ? 'fa-solid fa-eye' : 'fa-solid fa-eye-slash'"
       />
     </span>
     <input
       id="s3-secret-key"
       class="form-control"
-      :type="visibleKeys.secret ? 'text' : 'password'"
+      :type="visibleSecretKey ? 'text' : 'password'"
       :value="props.s3key.secret_key"
       aria-label="S3 Access Key"
       readonly
@@ -142,6 +128,70 @@ function deleteKeyTrigger() {
     </li>
     <li><a target="_blank" href="https://rclone.org/s3/#ceph">Rclone</a></li>
   </ul>
+  <div class="alert alert-warning" role="alert">
+    <h5 class="alert-heading">Incompatible S3 SDKs</h5>
+    <p>
+      Since January 16, 2025 the AWS S3 SDKs adopts new
+      <a
+        href="https://docs.aws.amazon.com/sdkref/latest/guide/feature-dataintegrity.html"
+        >default integrity protections</a
+      >
+      that are not compatible with our Ceph version yet. If you are using an AWS
+      S3 SDK to communicate with our storage you have to pin the version of your
+      SDK to be compatible.
+    </p>
+    <div>
+      Here is a list of programming languages and the supported SDK version:
+    </div>
+    <ul>
+      <li>
+        <a href="https://aws.amazon.com/sdk-for-cpp/">C++</a>
+        <code>&lt;v1.11.486</code>
+      </li>
+      <li>
+        <a href="https://aws.amazon.com/sdk-for-go/">Go</a>
+        <code>&lt;v1.73.0</code>
+      </li>
+      <li>
+        <a href="https://aws.amazon.com/sdk-for-java/">Java</a>
+        <code>&lt;v2.30.0</code>
+      </li>
+      <li>
+        <a href="https://aws.amazon.com/sdk-for-javascript/"
+          >Javascript/Typescript</a
+        >
+        <code>&lt;v3.729.0</code>
+      </li>
+      <li>
+        <a href="https://aws.amazon.com/sdk-for-kotlin/">Kotlin</a>
+        <code>&lt;v1.4.0</code>
+      </li>
+      <li>
+        <a href="https://aws.amazon.com/sdk-for-net/">.NET</a>
+        <code>&lt;v3.7.412.0</code>
+      </li>
+      <li>
+        <a href="https://aws.amazon.com/sdk-for-php/">PHP</a>
+        <code>&lt;v3.337.0</code>
+      </li>
+      <li>
+        <a href="https://aws.amazon.com/sdk-for-python/">Python</a>
+        <code>&lt;v1.36.0</code>
+      </li>
+      <li>
+        <a href="https://aws.amazon.com/sdk-for-ruby/">Ruby</a>
+        <code>&lt;v1.178.0</code>
+      </li>
+      <li>
+        <a href="https://aws.amazon.com/sdk-for-rust/">Rust</a>
+        <code>&lt;v1.69.0</code>
+      </li>
+      <li>
+        <a href="https://aws.amazon.com/sdk-for-swift/">Swift</a>
+        <code>&lt;v1.1.0</code>
+      </li>
+    </ul>
+  </div>
 </template>
 
 <style scoped></style>
-- 
GitLab


From 191f192f92d4e32132a0b147ea90285829b024d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Tue, 11 Feb 2025 15:25:03 +0000
Subject: [PATCH 09/25] Add remaining delete modals

#191
---
 src/components/modals/DeleteApiTokenModal.vue | 47 +++++++++++++
 .../modals/DeleteExecutionModal.vue           | 59 ++++++++++++++++
 src/components/modals/DeleteOtrModal.vue      | 68 +++++++++++++++++++
 .../modals/DeletePermissionModal.vue          | 50 ++++++++++++++
 src/components/modals/ShowOtrModal.vue        | 14 ++--
 .../object-storage/modals/PermissionModal.vue | 17 ++---
 src/views/user/ListApiTokenView.vue           | 12 ++--
 .../CreateParameterTranslationView.vue        |  1 +
 .../workflows/ListWorkflowExecutionsView.vue  | 35 ++--------
 9 files changed, 250 insertions(+), 53 deletions(-)
 create mode 100644 src/components/modals/DeleteApiTokenModal.vue
 create mode 100644 src/components/modals/DeleteExecutionModal.vue
 create mode 100644 src/components/modals/DeleteOtrModal.vue
 create mode 100644 src/components/modals/DeletePermissionModal.vue

diff --git a/src/components/modals/DeleteApiTokenModal.vue b/src/components/modals/DeleteApiTokenModal.vue
new file mode 100644
index 0000000..1d1f4b9
--- /dev/null
+++ b/src/components/modals/DeleteApiTokenModal.vue
@@ -0,0 +1,47 @@
+<script setup lang="ts">
+import DeleteModal from "./DeleteModal.vue";
+import type { ApiTokenOut } from "@/client/types.gen.ts";
+
+const props = defineProps<{
+  modalId: string;
+  token?: ApiTokenOut;
+  backModalId?: string;
+}>();
+
+const emit = defineEmits<{
+  (e: "confirm-delete", tokenId: string): void;
+}>();
+
+function deleteToken() {
+  if (props.token != undefined) {
+    emit("confirm-delete", props.token.token_id);
+    window._paq?.push([
+      "trackEvent",
+      "delete",
+      "api token",
+      props.token.token_id,
+    ]);
+  }
+}
+</script>
+
+<template>
+  <delete-modal
+    :modal-id="props.modalId"
+    :back-modal-id="props.backModalId"
+    delete-type="Api Token"
+    :disabled="props.token == undefined"
+    @confirm-delete="deleteToken"
+  >
+    <template #body>
+      <p>
+        Are you sure you want to delete the API token
+        <strong v-if="props.token">{{ props.token.name }}</strong
+        >?<br />
+        You can't access the API with this token anymore.
+      </p>
+    </template>
+  </delete-modal>
+</template>
+
+<style scoped></style>
diff --git a/src/components/modals/DeleteExecutionModal.vue b/src/components/modals/DeleteExecutionModal.vue
new file mode 100644
index 0000000..e189d0b
--- /dev/null
+++ b/src/components/modals/DeleteExecutionModal.vue
@@ -0,0 +1,59 @@
+<script setup lang="ts">
+import DeleteModal from "./DeleteModal.vue";
+import type { WorkflowExecutionOut } from "@/client/types.gen.ts";
+import dayjs from "dayjs";
+import { useNameStore } from "@/stores";
+
+const props = defineProps<{
+  modalId: string;
+  execution?: WorkflowExecutionOut;
+  backModalId?: string;
+}>();
+
+const nameRepository = useNameStore();
+
+const emit = defineEmits<{
+  (e: "confirm-delete", executionId: string): void;
+}>();
+
+function deleteExecution() {
+  if (props.execution != undefined) {
+    emit("confirm-delete", props.execution.execution_id);
+    window._paq?.push([
+      "trackEvent",
+      "delete",
+      "execution",
+      props.execution.execution_id,
+    ]);
+  }
+}
+</script>
+
+<template>
+  <delete-modal
+    :modal-id="props.modalId"
+    :back-modal-id="props.backModalId"
+    delete-type="Workflow Execution"
+    :disabled="props.execution == undefined"
+    @confirm-delete="deleteExecution"
+  >
+    <template #body>
+      <p>
+        Are you sure you want to delete the workflow execution from
+        {{
+          dayjs.unix(execution?.start_time ?? 0).format("DD.MM.YYYY HH:mm:ss")
+        }}
+        <template v-if="execution?.workflow_id && execution.workflow_version_id"
+          >with the workflow
+          <strong
+            >{{ nameRepository.getName(execution.workflow_id) }}@{{
+              nameRepository.getName(execution.workflow_version_id)
+            }}</strong
+          >
+        </template>
+      </p>
+    </template>
+  </delete-modal>
+</template>
+
+<style scoped></style>
diff --git a/src/components/modals/DeleteOtrModal.vue b/src/components/modals/DeleteOtrModal.vue
new file mode 100644
index 0000000..00383e9
--- /dev/null
+++ b/src/components/modals/DeleteOtrModal.vue
@@ -0,0 +1,68 @@
+<script setup lang="ts">
+import DeleteModal from "./DeleteModal.vue";
+import {
+  type OwnershipTransferRequestOut,
+  OwnershipTypeEnum,
+} from "@/client/types.gen.ts";
+import { useNameStore } from "@/stores";
+
+const props = defineProps<{
+  modalId: string;
+  otr?: OwnershipTransferRequestOut;
+  backModalId?: string;
+  otrType: OwnershipTypeEnum;
+}>();
+
+const nameRepository = useNameStore();
+
+const emit = defineEmits<{
+  (e: "confirm-delete", otr: OwnershipTransferRequestOut): void;
+}>();
+
+function deleteOtr() {
+  if (props.otr != undefined) {
+    emit("confirm-delete", props.otr);
+    window._paq?.push([
+      "trackEvent",
+      "delete",
+      `${props.otrType} OTR`,
+      props.otr.target_id,
+    ]);
+  }
+}
+</script>
+
+<template>
+  <delete-modal
+    :modal-id="props.modalId"
+    :back-modal-id="props.backModalId"
+    :delete-type="`${otrType} transfer request`"
+    :disabled="props.otr == undefined"
+    @confirm-delete="deleteOtr"
+  >
+    <template #body>
+      <p>
+        Are you sure you want to delete the {{ props.otrType }} transfer request
+        for
+        <strong v-if="props.otr">{{
+          props.otrType === OwnershipTypeEnum.BUCKET
+            ? props.otr.target_id
+            : nameRepository.getName(props.otr.target_id)
+        }}</strong>
+        <template v-if="props.otr && props.otr.current_owner_uid">
+          from the user
+          <strong>{{
+            nameRepository.getName(props.otr.current_owner_uid)
+          }}</strong></template
+        >
+        to the user
+        <strong v-if="props.otr">{{
+          nameRepository.getName(props.otr.new_owner_uid)
+        }}</strong
+        >?
+      </p>
+    </template>
+  </delete-modal>
+</template>
+
+<style scoped></style>
diff --git a/src/components/modals/DeletePermissionModal.vue b/src/components/modals/DeletePermissionModal.vue
new file mode 100644
index 0000000..dbd7f6d
--- /dev/null
+++ b/src/components/modals/DeletePermissionModal.vue
@@ -0,0 +1,50 @@
+<script setup lang="ts">
+import DeleteModal from "./DeleteModal.vue";
+import type { BucketPermissionOut } from "@/client/types.gen.ts";
+import { useNameStore } from "@/stores";
+
+const props = defineProps<{
+  modalId: string;
+  permission?: BucketPermissionOut;
+  backModalId?: string;
+}>();
+
+const nameRepository = useNameStore();
+
+const emit = defineEmits<{
+  (e: "confirm-delete", permission: BucketPermissionOut): void;
+}>();
+
+function deletePermission() {
+  if (props.permission != undefined) {
+    emit("confirm-delete", props.permission);
+    window._paq?.push(["trackEvent", "delete", "permission"]);
+  }
+}
+</script>
+
+<template>
+  <delete-modal
+    :modal-id="props.modalId"
+    :back-modal-id="props.backModalId"
+    delete-type="Bucket Permission"
+    :disabled="props.permission == undefined"
+    @confirm-delete="deletePermission"
+  >
+    <template #body>
+      <p>
+        Are you sure you want to delete the bucket permission for
+        <strong v-if="props.permission">{{
+          nameRepository.getName(props.permission.uid)
+        }}</strong>
+        to the bucket
+        <strong v-if="props.permission">{{
+          props.permission.bucket_name
+        }}</strong
+        >?
+      </p>
+    </template>
+  </delete-modal>
+</template>
+
+<style scoped></style>
diff --git a/src/components/modals/ShowOtrModal.vue b/src/components/modals/ShowOtrModal.vue
index a4ab386..f14ab2b 100644
--- a/src/components/modals/ShowOtrModal.vue
+++ b/src/components/modals/ShowOtrModal.vue
@@ -2,14 +2,17 @@
 import BootstrapModal from "@/components/modals/BootstrapModal.vue";
 import { useOTRStore } from "@/stores/otrs";
 import { computed, onMounted, ref } from "vue";
-import type { OwnershipTransferRequestOut } from "@/client/types.gen";
+import {
+  type OwnershipTransferRequestOut,
+  OwnershipTypeEnum,
+} from "@/client/types.gen";
 import { useNameStore } from "@/stores/names";
 import dayjs from "dayjs";
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
-import DeleteModal from "@/components/modals/DeleteModal.vue";
 import { useUserStore } from "@/stores/users";
 import BootstrapToast from "@/components/BootstrapToast.vue";
 import { Toast } from "bootstrap";
+import DeleteOtrModal from "@/components/modals/DeleteOtrModal.vue";
 
 const otrRepository = useOTRStore();
 const nameRepository = useNameStore();
@@ -69,11 +72,12 @@ onMounted(() => {
     </template>
     <template v-else #default> Successfully deleted request </template>
   </bootstrap-toast>
-  <delete-modal
+  <delete-otr-modal
     :modal-id="`delete-otr-modal-${randomIDSuffix}`"
-    :object-name-delete="`ownership transfer request for ${otr?.target_type} ${otr?.target_name}`"
+    :otr-type="otr != undefined ? otr.target_type : OwnershipTypeEnum.BUCKET"
+    :otr="otr"
     :back-modal-id="modalId"
-    @confirm-delete="deleteOtr(otr)"
+    @confirm-delete="deleteOtr"
   />
   <bootstrap-modal
     :modal-id="props.modalId"
diff --git a/src/components/object-storage/modals/PermissionModal.vue b/src/components/object-storage/modals/PermissionModal.vue
index deae08a..62d5d3e 100644
--- a/src/components/object-storage/modals/PermissionModal.vue
+++ b/src/components/object-storage/modals/PermissionModal.vue
@@ -1,7 +1,6 @@
 <script setup lang="ts">
 import { onMounted, reactive, watch, ref, computed } from "vue";
 import BootstrapModal from "@/components/modals/BootstrapModal.vue";
-import DeleteModal from "@/components/modals/DeleteModal.vue";
 import SearchUserModal from "@/components/modals/SearchUserModal.vue";
 import { Modal } from "bootstrap";
 import dayjs from "dayjs";
@@ -17,6 +16,7 @@ import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
 import { useBucketStore } from "@/stores/buckets";
 import BootstrapToast from "@/components/BootstrapToast.vue";
 import { useNameStore } from "@/stores/names";
+import DeletePermissionModal from "@/components/modals/DeletePermissionModal.vue";
 
 // Props
 // -----------------------------------------------------------------------------
@@ -229,14 +229,13 @@ function formSubmit() {
 
 /**
  * Delete a permission for a bucket user combination
- * @param bucketName Bucket to delete
- * @param uid ID of grantee of the permission
+ * @param permission Bucket permission to delete
  */
-function confirmedDeletePermission(bucketName: string, uid: string) {
+function confirmedDeletePermission(permission: BucketPermissionOut) {
   if (!formState.loading) {
     formState.loading = true;
     bucketRepository
-      .deleteBucketPermission(bucketName, uid)
+      .deleteBucketPermission(permission.bucket_name, permission.uid)
       .then(() => {
         permissionDeleted.value = true;
         emit("permission-deleted");
@@ -278,13 +277,11 @@ function toTimestampChanged(target?: HTMLInputElement | null) {
 </script>
 
 <template>
-  <delete-modal
+  <delete-permission-modal
     :modal-id="'delete-permission-modal' + randomIDSuffix"
-    object-name-delete="permission"
+    :permission="editUserPermission"
     :back-modal-id="modalId"
-    @confirm-delete="
-      confirmedDeletePermission(permission.bucket_name, permission.uid)
-    "
+    @confirm-delete="confirmedDeletePermission"
   />
   <search-user-modal
     :modal-id="'search-user-modal' + randomIDSuffix"
diff --git a/src/views/user/ListApiTokenView.vue b/src/views/user/ListApiTokenView.vue
index 5ad8678..87e69e2 100644
--- a/src/views/user/ListApiTokenView.vue
+++ b/src/views/user/ListApiTokenView.vue
@@ -2,12 +2,12 @@
 import { onMounted, reactive } from "vue";
 import { useUserStore } from "@/stores/users";
 import dayjs from "dayjs";
-import DeleteModal from "@/components/modals/DeleteModal.vue";
 import CreateApiTokenModal from "@/components/user/CreateApiTokenModal.vue";
 import type { ApiTokenPrivateOut } from "@/client/types.gen";
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
 import CopyToClipboardIcon from "@/components/CopyToClipboardIcon.vue";
 import { environment } from "@/environment";
+import DeleteApiTokenModal from "@/components/modals/DeleteApiTokenModal.vue";
 
 const userRepository = useUserStore();
 
@@ -34,8 +34,8 @@ function deleteApiToken(tokenId: string) {
   state.deleteTokenId = tokenId;
 }
 
-function confirmedDeleteApiToken() {
-  userRepository.deleteApiToken(state.deleteTokenId).finally(() => {
+function confirmedDeleteApiToken(tokenId: string) {
+  userRepository.deleteApiToken(tokenId).finally(() => {
     state.deleteTokenId = "";
   });
 }
@@ -59,11 +59,9 @@ onMounted(() => {
     modal-id="create-personal-api-token-modal"
     @token-created="apiTokenCreated"
   />
-  <delete-modal
+  <delete-api-token-modal
     modal-id="delete-personal-api-token-modal"
-    :object-name-delete="
-      userRepository.apiTokensMapping[state.deleteTokenId]?.name ?? ''
-    "
+    :token="userRepository.apiTokensMapping[state.deleteTokenId]"
     @confirm-delete="confirmedDeleteApiToken"
   />
   <div
diff --git a/src/views/workflows/CreateParameterTranslationView.vue b/src/views/workflows/CreateParameterTranslationView.vue
index e22bc1a..4f4b134 100644
--- a/src/views/workflows/CreateParameterTranslationView.vue
+++ b/src/views/workflows/CreateParameterTranslationView.vue
@@ -411,6 +411,7 @@ onMounted(() => {
       workflowRepository.versionMapping[props.versionId]?.parameter_extension
     "
     modal-id="delete-parameter-extension-modal"
+    delete-type="Parameter Extension"
     :object-name-delete="`parameter extension of ${nameRepository.getName(props.workflowId)}@${nameRepository.getName(props.versionId)}`"
     @confirm-delete="deleteParameterExtension"
   />
diff --git a/src/views/workflows/ListWorkflowExecutionsView.vue b/src/views/workflows/ListWorkflowExecutionsView.vue
index 3678bf5..1dbe0ee 100644
--- a/src/views/workflows/ListWorkflowExecutionsView.vue
+++ b/src/views/workflows/ListWorkflowExecutionsView.vue
@@ -4,7 +4,6 @@ import { onMounted, reactive, computed, onUnmounted } from "vue";
 import type { WorkflowExecutionOut } from "@/client/types.gen";
 import dayjs from "dayjs";
 import { Tooltip } from "bootstrap";
-import DeleteModal from "@/components/modals/DeleteModal.vue";
 import { useWorkflowStore } from "@/stores/workflows";
 import { useWorkflowExecutionStore } from "@/stores/workflowExecutions";
 import ParameterModal from "@/components/workflows/modals/ParameterModal.vue";
@@ -12,6 +11,7 @@ import { ExponentialBackoff } from "@/utils/BackoffStrategy";
 import { useNameStore } from "@/stores/names";
 import MarkdownRenderer from "@/components/MarkdownRenderer.vue";
 import { useSettingsStore } from "@/stores/settings";
+import DeleteExecutionModal from "@/components/modals/DeleteExecutionModal.vue";
 
 const workflowRepository = useWorkflowStore();
 const nameRepository = useNameStore();
@@ -59,31 +59,6 @@ const sortedExecutions = computed<WorkflowExecutionOut[]>(() => {
   return tempList;
 });
 
-const deleteModalString = computed<string>(() => {
-  if (executionsState.executionToDelete === undefined) {
-    return "";
-  } else if (
-    !executionsState.executionToDelete.workflow_version_id ||
-    !executionsState.executionToDelete.workflow_id
-  ) {
-    return `Workflow Execution from ${dayjs
-      .unix(executionsState.executionToDelete.start_time)
-      .format("DD.MM.YYYY HH:mm")}`;
-  } else {
-    return `Workflow Execution ${
-      workflowRepository.workflowMapping[
-        executionsState.executionToDelete.workflow_id
-      ].name
-    }@${
-      workflowRepository.versionMapping[
-        executionsState.executionToDelete.workflow_version_id
-      ].version
-    } from ${dayjs
-      .unix(executionsState.executionToDelete.start_time)
-      .format("DD.MM.YYYY HH:mm")}`;
-  }
-});
-
 // Functions
 // -----------------------------------------------------------------------------
 function updateExecutions() {
@@ -156,12 +131,10 @@ onUnmounted(() => {
 </script>
 
 <template>
-  <delete-modal
+  <delete-execution-modal
     modal-id="deleteWorkflowExecutionModal"
-    :object-name-delete="deleteModalString"
-    @confirm-delete="
-      deleteWorkflowExecution(executionsState.executionToDelete?.execution_id)
-    "
+    :execution="executionsState.executionToDelete"
+    @confirm-delete="deleteWorkflowExecution"
   />
   <parameter-modal
     modal-id="workflowExecutionParameterModal"
-- 
GitLab


From 65e9b393123195f0307ef98a1e32d2098ffbc3d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Tue, 11 Feb 2025 16:27:56 +0000
Subject: [PATCH 10/25] Delete bucket and create bucket OTR in admin interface

#191
---
 src/components/modals/CreateOtrModal.vue      | 46 +++++++---
 src/components/modals/DeleteBucketModal.vue   | 17 +++-
 .../modals/DeleteExecutionModal.vue           | 48 ++++++----
 src/stores/otrs.ts                            | 43 ++++++++-
 src/views/admin/AdminBucketsView.vue          | 87 +++++++++++++++++--
 .../admin/AdminWorkflowExecutionView.vue      | 33 +++++++
 6 files changed, 236 insertions(+), 38 deletions(-)

diff --git a/src/components/modals/CreateOtrModal.vue b/src/components/modals/CreateOtrModal.vue
index ff839fb..3d06528 100644
--- a/src/components/modals/CreateOtrModal.vue
+++ b/src/components/modals/CreateOtrModal.vue
@@ -35,12 +35,14 @@ const otrCreateForm = ref<HTMLFormElement | undefined>(undefined);
 const formState = reactive<{
   validated: boolean;
   requestIn: OwnershipTransferRequestIn;
+  otrExists: boolean;
 }>({
   validated: false,
   requestIn: {
     new_owner_uid: "",
     comment: undefined,
   },
+  otrExists: false,
 });
 
 const targetType = computed<OwnershipTypeEnum>(() => {
@@ -67,20 +69,23 @@ const targetId = computed<string>(() => {
 watch(targetId, (newId, oldId) => {
   if (newId !== oldId) {
     resetForm();
+    checkOtrExists();
   }
 });
 
 function saveOtr() {
-  formState.validated = true;
-  formState.requestIn.comment = formState.requestIn.comment?.trim();
-  if (otrCreateForm.value?.checkValidity()) {
-    otrRepository
-      .createOtr(targetId.value, formState.requestIn, targetType.value)
-      .then(() => {
-        createOtrModal?.hide();
-        successToast?.show();
-        resetForm();
-      });
+  if (!formState.otrExists) {
+    formState.validated = true;
+    formState.requestIn.comment = formState.requestIn.comment?.trim();
+    if (otrCreateForm.value?.checkValidity()) {
+      otrRepository
+        .createOtr(targetId.value, formState.requestIn, targetType.value)
+        .then(() => {
+          createOtrModal?.hide();
+          successToast?.show();
+          resetForm();
+        });
+    }
   }
 }
 
@@ -106,9 +111,25 @@ function resetForm() {
   formState.requestIn.comment = undefined;
 }
 
+function checkOtrExists() {
+  if (targetId.value.length > 0) {
+    otrRepository
+      .fetchOtr(targetType.value, targetId.value)
+      .then(() => {
+        formState.otrExists = true;
+      })
+      .catch(() => {
+        formState.otrExists = false;
+      });
+  } else {
+    formState.otrExists = true;
+  }
+}
+
 onMounted(() => {
   createOtrModal = Modal.getOrCreateInstance(`#${props.modalId}`);
   successToast = Toast.getOrCreateInstance("#create-otr-success-toast");
+  checkOtrExists();
 });
 </script>
 
@@ -133,10 +154,14 @@ onMounted(() => {
       <b>{{ targetName }}</b></template
     >
     <template #body>
+      <div v-if="formState.otrExists" class="text-center">
+        <i>A transfer request already exists for this {{ targetType }}.</i>
+      </div>
       <form
         id="create-otr-form"
         ref="otrCreateForm"
         :class="{ 'was-validated': formState.validated }"
+        :hidden="formState.otrExists"
         @submit.prevent="saveOtr"
       >
         <div class="m-1">
@@ -176,6 +201,7 @@ onMounted(() => {
     </template>
     <template #footer>
       <button
+        v-if="!formState.otrExists"
         type="submit"
         form="create-otr-form"
         class="btn btn-success"
diff --git a/src/components/modals/DeleteBucketModal.vue b/src/components/modals/DeleteBucketModal.vue
index 6903e74..855c9f7 100644
--- a/src/components/modals/DeleteBucketModal.vue
+++ b/src/components/modals/DeleteBucketModal.vue
@@ -1,6 +1,7 @@
 <script setup lang="ts">
 import DeleteModal from "./DeleteModal.vue";
 import type { BucketOut } from "@/client/types.gen.ts";
+import { useNameStore, useUserStore } from "@/stores";
 
 const props = defineProps<{
   modalId: string;
@@ -11,6 +12,8 @@ const props = defineProps<{
 const emit = defineEmits<{
   (e: "confirm-delete", bucketName: string): void;
 }>();
+const userRepository = useUserStore();
+const nameRepository = useNameStore();
 
 function deleteBucket() {
   if (props.bucket != undefined) {
@@ -31,10 +34,20 @@ function deleteBucket() {
     <template #body>
       <p>
         Are you sure you want to delete the bucket
-        <strong v-if="props.bucket">{{ props.bucket.name }}</strong
+        <strong v-if="props.bucket">{{ props.bucket.name }}</strong>
+        <template
+          v-if="
+            props.bucket?.owner_id &&
+            props.bucket.owner_id !== userRepository.currentUID
+          "
+        >
+          from the user
+          <strong>{{
+            nameRepository.getName(props.bucket.owner_id)
+          }}</strong> </template
         >?<br />
         All files inside this bucket will be deleted to and won't be accessible
-        anymore
+        anymore.
       </p>
     </template>
   </delete-modal>
diff --git a/src/components/modals/DeleteExecutionModal.vue b/src/components/modals/DeleteExecutionModal.vue
index e189d0b..5583509 100644
--- a/src/components/modals/DeleteExecutionModal.vue
+++ b/src/components/modals/DeleteExecutionModal.vue
@@ -2,7 +2,7 @@
 import DeleteModal from "./DeleteModal.vue";
 import type { WorkflowExecutionOut } from "@/client/types.gen.ts";
 import dayjs from "dayjs";
-import { useNameStore } from "@/stores";
+import { useNameStore, useUserStore } from "@/stores";
 
 const props = defineProps<{
   modalId: string;
@@ -11,6 +11,7 @@ const props = defineProps<{
 }>();
 
 const nameRepository = useNameStore();
+const userRepository = useUserStore();
 
 const emit = defineEmits<{
   (e: "confirm-delete", executionId: string): void;
@@ -38,20 +39,37 @@ function deleteExecution() {
     @confirm-delete="deleteExecution"
   >
     <template #body>
-      <p>
-        Are you sure you want to delete the workflow execution from
-        {{
-          dayjs.unix(execution?.start_time ?? 0).format("DD.MM.YYYY HH:mm:ss")
-        }}
-        <template v-if="execution?.workflow_id && execution.workflow_version_id"
-          >with the workflow
-          <strong
-            >{{ nameRepository.getName(execution.workflow_id) }}@{{
-              nameRepository.getName(execution.workflow_version_id)
-            }}</strong
-          >
-        </template>
-      </p>
+      <div class="mb-4">
+        Are you sure you want to delete this workflow execution?
+        <table v-if="props.execution" class="table table-hover mt-2">
+          <tbody>
+            <tr v-if="execution?.workflow_id && execution.workflow_version_id">
+              <th scope="row" class="text-end"><b>Workflow</b></th>
+              <th>
+                {{ nameRepository.getName(execution.workflow_id) }}@{{
+                  nameRepository.getName(execution.workflow_version_id)
+                }}
+              </th>
+            </tr>
+            <tr>
+              <th scope="row" class="text-end"><b>Start time</b></th>
+              <th>
+                {{
+                  dayjs
+                    .unix(execution?.start_time ?? 0)
+                    .format("DD.MM.YYYY HH:mm:ss")
+                }}
+              </th>
+            </tr>
+            <tr v-if="userRepository.currentUID !== execution?.executor_id">
+              <th scope="row" class="text-end"><b>User</b></th>
+              <th>
+                {{ nameRepository.getName(execution?.executor_id) }}
+              </th>
+            </tr>
+          </tbody>
+        </table>
+      </div>
     </template>
   </delete-modal>
 </template>
diff --git a/src/stores/otrs.ts b/src/stores/otrs.ts
index 6b6bfaf..abbc564 100644
--- a/src/stores/otrs.ts
+++ b/src/stores/otrs.ts
@@ -30,18 +30,30 @@ export const useOTRStore = defineStore("otrs", {
     },
   getters: {
     bucketOtrs(): OwnershipTransferRequestOut[] {
+      const currentUID = useUserStore().currentUID;
       return Object.values(this.otrMapping).filter(
-        (otr) => otr.target_type === OwnershipTypeEnum.BUCKET,
+        (otr) =>
+          otr.target_type === OwnershipTypeEnum.BUCKET &&
+          (otr.current_owner_uid === currentUID ||
+            otr.new_owner_uid === currentUID),
       );
     },
     workflowOtrs(): OwnershipTransferRequestOut[] {
+      const currentUID = useUserStore().currentUID;
       return Object.values(this.otrMapping).filter(
-        (otr) => otr.target_type === OwnershipTypeEnum.WORKFLOW,
+        (otr) =>
+          otr.target_type === OwnershipTypeEnum.WORKFLOW &&
+          (otr.current_owner_uid === currentUID ||
+            otr.new_owner_uid === currentUID),
       );
     },
     resourceOtrs(): OwnershipTransferRequestOut[] {
+      const currentUID = useUserStore().currentUID;
       return Object.values(this.otrMapping).filter(
-        (otr) => otr.target_type === OwnershipTypeEnum.RESOURCE,
+        (otr) =>
+          otr.target_type === OwnershipTypeEnum.RESOURCE &&
+          (otr.current_owner_uid === currentUID ||
+            otr.new_owner_uid === currentUID),
       );
     },
   },
@@ -53,6 +65,31 @@ export const useOTRStore = defineStore("otrs", {
         }
       }
     },
+    fetchOtr(
+      targetType: OwnershipTypeEnum,
+      otr_id: string,
+    ): Promise<OwnershipTransferRequestOut> {
+      switch (targetType) {
+        case OwnershipTypeEnum.BUCKET:
+          return BucketService.bucketGetBucketOtr({
+            path: {
+              bucket_name: otr_id,
+            },
+          }).then((response) => response.data!);
+        case OwnershipTypeEnum.WORKFLOW:
+          return WorkflowService.workflowGetWorkflowOtr({
+            path: {
+              wid: otr_id,
+            },
+          }).then((response) => response.data!);
+        case OwnershipTypeEnum.RESOURCE:
+          return ResourceService.resourceGetResourceOtr({
+            path: {
+              rid: otr_id,
+            },
+          }).then((response) => response.data!);
+      }
+    },
     fetchOtrs(
       targetType: OwnershipTypeEnum,
       currentOwnerId?: string,
diff --git a/src/views/admin/AdminBucketsView.vue b/src/views/admin/AdminBucketsView.vue
index 61fed0d..1bf9519 100644
--- a/src/views/admin/AdminBucketsView.vue
+++ b/src/views/admin/AdminBucketsView.vue
@@ -9,9 +9,12 @@ import { useNameStore } from "@/stores/names";
 import { filesize } from "filesize";
 import dayjs from "dayjs";
 import UpdateBucketLimitsModal from "@/components/admin/UpdateBucketLimitsModal.vue";
+import DeleteBucketModal from "@/components/modals/DeleteBucketModal.vue";
+import CreateOtrModal from "@/components/modals/CreateOtrModal.vue";
 
 const bucketState = reactive<{
   buckets: BucketOut[];
+  selectBucket?: BucketOut;
   ownerId: string;
   loading: boolean;
   searched: boolean;
@@ -19,6 +22,7 @@ const bucketState = reactive<{
   updateLimitsBucket: BucketOut;
 }>({
   buckets: [],
+  selectBucket: undefined,
   ownerId: "",
   loading: false,
   searched: false,
@@ -70,6 +74,19 @@ function searchBuckets() {
     });
 }
 
+function deleteBucket(bucketName: string) {
+  bucketRepository
+    .deleteBucket(bucketName)
+    .then(() => {
+      bucketState.buckets = bucketState.buckets.filter(
+        (bucket) => bucket.name !== bucketName,
+      );
+    })
+    .finally(() => {
+      bucketState.selectBucket = undefined;
+    });
+}
+
 function limitsUpdated(bucket: BucketOut) {
   const bucketIndex = bucketState.buckets.findIndex(
     (b) => b.name == bucket.name,
@@ -81,6 +98,23 @@ function limitsUpdated(bucket: BucketOut) {
 </script>
 
 <template>
+  <delete-bucket-modal
+    modal-id="delete-bucket-modal"
+    :bucket="bucketState.selectBucket"
+    @confirm-delete="deleteBucket"
+  />
+  <create-otr-modal
+    modal-id="create-bucket-otr-modal"
+    :target="
+      bucketState.selectBucket ?? {
+        owner_id: '',
+        created_at: 0,
+        name: '',
+        description: '',
+        public: false,
+      }
+    "
+  />
   <search-user-modal
     modal-id="admin-bucket-search-user-modal"
     @user-found="updateUser"
@@ -193,15 +227,52 @@ function limitsUpdated(bucket: BucketOut) {
         </td>
         <td>{{ nameRepository.getName(bucket.owner_id) }}</td>
         <td>
-          <button
-            type="button"
-            class="btn btn-secondary btn-sm"
-            data-bs-toggle="modal"
-            :data-bs-target="'#' + updateLimitsModalId"
-            @click="bucketState.updateLimitsBucket = bucket"
+          <div
+            class="btn-group btn-group-sm dropdown-center dropdown-menu-start"
           >
-            Edit quotas
-          </button>
+            <button
+              type="button"
+              class="btn btn-secondary btn-sm"
+              data-bs-toggle="modal"
+              :data-bs-target="'#' + updateLimitsModalId"
+              @click="bucketState.updateLimitsBucket = bucket"
+            >
+              Edit quotas
+            </button>
+            <button
+              type="button"
+              class="btn btn-secondary dropdown-toggle dropdown-toggle-split"
+              data-bs-toggle="dropdown"
+              aria-expanded="false"
+            >
+              <span class="visually-hidden">Toggle Dropdown</span>
+            </button>
+            <ul class="dropdown-menu dropdown-menu">
+              <li>
+                <button
+                  class="dropdown-item"
+                  type="button"
+                  data-bs-toggle="modal"
+                  data-bs-target="#create-bucket-otr-modal"
+                  @click="bucketState.selectBucket = bucket"
+                >
+                  Transfer ownership
+                </button>
+              </li>
+              <li>
+                <button
+                  class="dropdown-item text-danger align-middle"
+                  type="button"
+                  data-bs-toggle="modal"
+                  data-bs-target="#delete-bucket-modal"
+                  @click="bucketState.selectBucket = bucket"
+                >
+                  <font-awesome-icon icon="fa-solid fa-trash" />
+                  <span class="ms-1">Delete</span>
+                </button>
+              </li>
+            </ul>
+          </div>
         </td>
       </tr>
     </tbody>
diff --git a/src/views/admin/AdminWorkflowExecutionView.vue b/src/views/admin/AdminWorkflowExecutionView.vue
index a0abaaf..4e4a4bd 100644
--- a/src/views/admin/AdminWorkflowExecutionView.vue
+++ b/src/views/admin/AdminWorkflowExecutionView.vue
@@ -15,6 +15,7 @@ import { useNameStore } from "@/stores/names";
 import dayjs from "dayjs";
 import ParameterModal from "@/components/workflows/modals/ParameterModal.vue";
 import MarkdownRenderer from "@/components/MarkdownRenderer.vue";
+import DeleteExecutionModal from "@/components/modals/DeleteExecutionModal.vue";
 
 const executionRepository = useWorkflowExecutionStore();
 const nameRepository = useNameStore();
@@ -53,10 +54,12 @@ const formState = reactive<{
   loading: boolean;
   executions: WorkflowExecutionOut[];
   executionParameters?: string;
+  deleteExecution?: WorkflowExecutionOut;
 }>({
   loading: false,
   executions: [],
   executionParameters: undefined,
+  deleteExecution: undefined,
 });
 
 const executionIterator = ref<
@@ -139,6 +142,19 @@ function workflowExecutionCancelable(execution: WorkflowExecutionOut): boolean {
   return execution.end_time == undefined;
 }
 
+function deleteExecution(executionId: string) {
+  executionRepository
+    .deleteExecution(executionId)
+    .then(() => {
+      formState.executions = formState.executions.filter(
+        (execution) => execution.execution_id !== executionId,
+      );
+    })
+    .finally(() => {
+      formState.deleteExecution = undefined;
+    });
+}
+
 function startBeforeTimestampChanged(target?: HTMLInputElement | null) {
   filters.startBefore = target?.value ? dayjs(target?.value).unix() : undefined;
 }
@@ -178,6 +194,11 @@ onMounted(() => {
 </script>
 
 <template>
+  <delete-execution-modal
+    modal-id="delete-execution-modal"
+    :execution="formState.deleteExecution"
+    @confirm-delete="deleteExecution"
+  />
   <search-user-modal
     modal-id="admin-execution-search-user-modal"
     @user-found="updateUser"
@@ -473,6 +494,18 @@ onMounted(() => {
                       <span class="ms-1">Cancel</span>
                     </button>
                   </li>
+                  <li v-if="!workflowExecutionCancelable(execution)">
+                    <button
+                      class="dropdown-item text-danger align-middle"
+                      type="button"
+                      data-bs-toggle="modal"
+                      data-bs-target="#delete-execution-modal"
+                      @click="formState.deleteExecution = execution"
+                    >
+                      <font-awesome-icon icon="fa-solid fa-trash" />
+                      <span class="ms-1">Delete</span>
+                    </button>
+                  </li>
                 </ul>
               </div>
             </td>
-- 
GitLab


From 07ef403ce757a479caecdc8c0d137d4cf0cf3d8e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Tue, 11 Feb 2025 16:47:43 +0000
Subject: [PATCH 11/25] Show OTR in create Modal if it already exists

 * Upgrade Pinia to v3

#191
---
 package-lock.json                        | 146 ++++++++++++++++++-----
 package.json                             |   2 +-
 src/components/modals/CreateOtrModal.vue |  38 ++++--
 src/stores/otrs.ts                       |  18 ++-
 4 files changed, 158 insertions(+), 46 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 3533530..dfba82c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,7 +23,7 @@
         "dompurify": "~3.2.0",
         "filesize": "~10.1.0",
         "idb-keyval": "^6.2.1",
-        "pinia": "~2.3.0",
+        "pinia": "~3.0.0",
         "qs": "^6.13.0",
         "semver": "~7.7.0",
         "showdown": "~2.1.0",
@@ -3668,6 +3668,30 @@
       "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
       "license": "MIT"
     },
+    "node_modules/@vue/devtools-kit": {
+      "version": "7.7.1",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.1.tgz",
+      "integrity": "sha512-yhZ4NPnK/tmxGtLNQxmll90jIIXdb2jAhPF76anvn5M/UkZCiLJy28bYgPIACKZ7FCosyKoaope89/RsFJll1w==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-shared": "^7.7.1",
+        "birpc": "^0.2.19",
+        "hookable": "^5.5.3",
+        "mitt": "^3.0.1",
+        "perfect-debounce": "^1.0.0",
+        "speakingurl": "^14.0.1",
+        "superjson": "^2.2.1"
+      }
+    },
+    "node_modules/@vue/devtools-shared": {
+      "version": "7.7.1",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.1.tgz",
+      "integrity": "sha512-BtgF7kHq4BHG23Lezc/3W2UhK2ga7a8ohAIAGJMBr4BkxUFzhqntQtCiuL1ijo2ztWnmusymkirgqUrXoQKumA==",
+      "license": "MIT",
+      "dependencies": {
+        "rfdc": "^1.4.1"
+      }
+    },
     "node_modules/@vue/eslint-config-prettier": {
       "version": "10.2.0",
       "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-10.2.0.tgz",
@@ -3967,6 +3991,15 @@
       ],
       "license": "MIT"
     },
+    "node_modules/birpc": {
+      "version": "0.2.19",
+      "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz",
+      "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
     "node_modules/bn.js": {
       "version": "5.2.1",
       "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
@@ -4456,6 +4489,21 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/copy-anything": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
+      "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
+      "license": "MIT",
+      "dependencies": {
+        "is-what": "^4.1.8"
+      },
+      "engines": {
+        "node": ">=12.13"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
     "node_modules/core-util-is": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -5778,6 +5826,12 @@
         "minimalistic-crypto-utils": "^1.0.1"
       }
     },
+    "node_modules/hookable": {
+      "version": "5.5.3",
+      "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
+      "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+      "license": "MIT"
+    },
     "node_modules/https-browserify": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
@@ -6011,6 +6065,18 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/is-what": {
+      "version": "4.1.16",
+      "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
+      "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.13"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
     "node_modules/isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -6307,6 +6373,12 @@
         "node": ">=8"
       }
     },
+    "node_modules/mitt": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+      "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+      "license": "MIT"
+    },
     "node_modules/mkdirp": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
@@ -6730,7 +6802,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
       "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/picocolors": {
@@ -6753,13 +6824,12 @@
       }
     },
     "node_modules/pinia": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.1.tgz",
-      "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.0.tgz",
+      "integrity": "sha512-Go23UsqaeABb4OYNmpDkE9VwDnqmbbjGzWpQhi3xfNkSPO6ZP+Ttt0EMo2J4DHXW+T0l3EqRneeXdyV/oJg/Mg==",
       "license": "MIT",
       "dependencies": {
-        "@vue/devtools-api": "^6.6.3",
-        "vue-demi": "^0.14.10"
+        "@vue/devtools-api": "^7.7.1"
       },
       "funding": {
         "url": "https://github.com/sponsors/posva"
@@ -6774,6 +6844,15 @@
         }
       }
     },
+    "node_modules/pinia/node_modules/@vue/devtools-api": {
+      "version": "7.7.1",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.1.tgz",
+      "integrity": "sha512-Cexc8GimowoDkJ6eNelOPdYIzsu2mgNyp0scOQ3tiaYSb9iok6LOESSsJvHaI+ib3joRfqRJNLkHFjhNuWA5dg==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-kit": "^7.7.1"
+      }
+    },
     "node_modules/pkg-dir": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
@@ -7106,6 +7185,12 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/rfdc": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+      "license": "MIT"
+    },
     "node_modules/ripemd160": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
@@ -7435,6 +7520,15 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/speakingurl": {
+      "version": "14.0.1",
+      "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
+      "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/stream-browserify": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
@@ -7486,6 +7580,18 @@
       "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
       "license": "MIT"
     },
+    "node_modules/superjson": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz",
+      "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
+      "license": "MIT",
+      "dependencies": {
+        "copy-anything": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=16"
+      }
+    },
     "node_modules/supports-color": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -7888,32 +7994,6 @@
         }
       }
     },
-    "node_modules/vue-demi": {
-      "version": "0.14.10",
-      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
-      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
-      "hasInstallScript": true,
-      "license": "MIT",
-      "bin": {
-        "vue-demi-fix": "bin/vue-demi-fix.js",
-        "vue-demi-switch": "bin/vue-demi-switch.js"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/antfu"
-      },
-      "peerDependencies": {
-        "@vue/composition-api": "^1.0.0-rc.1",
-        "vue": "^3.0.0-0 || ^2.6.0"
-      },
-      "peerDependenciesMeta": {
-        "@vue/composition-api": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/vue-eslint-parser": {
       "version": "9.4.3",
       "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
diff --git a/package.json b/package.json
index ea363e1..1a3c1cf 100644
--- a/package.json
+++ b/package.json
@@ -26,7 +26,7 @@
     "dompurify": "~3.2.0",
     "filesize": "~10.1.0",
     "idb-keyval": "^6.2.1",
-    "pinia": "~2.3.0",
+    "pinia": "~3.0.0",
     "qs": "^6.13.0",
     "semver": "~7.7.0",
     "showdown": "~2.1.0",
diff --git a/src/components/modals/CreateOtrModal.vue b/src/components/modals/CreateOtrModal.vue
index 3d06528..55eb1e3 100644
--- a/src/components/modals/CreateOtrModal.vue
+++ b/src/components/modals/CreateOtrModal.vue
@@ -5,6 +5,7 @@ import type {
   UserOut,
   WorkflowOut,
   BucketOut,
+  OwnershipTransferRequestOut,
 } from "@/client/types.gen";
 import { OwnershipTypeEnum } from "@/client/types.gen";
 import BootstrapModal from "@/components/modals/BootstrapModal.vue";
@@ -35,14 +36,14 @@ const otrCreateForm = ref<HTMLFormElement | undefined>(undefined);
 const formState = reactive<{
   validated: boolean;
   requestIn: OwnershipTransferRequestIn;
-  otrExists: boolean;
+  otrExists?: OwnershipTransferRequestOut;
 }>({
   validated: false,
   requestIn: {
     new_owner_uid: "",
     comment: undefined,
   },
-  otrExists: false,
+  otrExists: undefined,
 });
 
 const targetType = computed<OwnershipTypeEnum>(() => {
@@ -115,14 +116,21 @@ function checkOtrExists() {
   if (targetId.value.length > 0) {
     otrRepository
       .fetchOtr(targetType.value, targetId.value)
-      .then(() => {
-        formState.otrExists = true;
+      .then((otr) => {
+        formState.otrExists = otr;
       })
       .catch(() => {
-        formState.otrExists = false;
+        formState.otrExists = undefined;
       });
   } else {
-    formState.otrExists = true;
+    formState.otrExists = {
+      target_id: "",
+      new_owner_uid: "",
+      target_description: "",
+      target_name: "",
+      target_type: targetType.value,
+      created_at: 0,
+    };
   }
 }
 
@@ -154,14 +162,26 @@ onMounted(() => {
       <b>{{ targetName }}</b></template
     >
     <template #body>
-      <div v-if="formState.otrExists" class="text-center">
-        <i>A transfer request already exists for this {{ targetType }}.</i>
+      <div v-if="formState.otrExists != undefined" class="text-center">
+        <div>
+          <i>A transfer request already exists for this {{ targetType }}.</i>
+        </div>
+        <div class="d-flex align-items-center justify-content-center">
+          <span v-if="formState.otrExists.current_owner_uid">{{
+            nameRepository.getName(formState.otrExists.current_owner_uid)
+          }}</span
+          ><span v-else>None</span><span class="mx-4 fs-4">&#8594;</span
+          >{{ nameRepository.getName(formState.otrExists.new_owner_uid) }}
+        </div>
+        <div v-if="formState.otrExists.comment">
+          {{ formState.otrExists.comment }}
+        </div>
       </div>
       <form
         id="create-otr-form"
         ref="otrCreateForm"
         :class="{ 'was-validated': formState.validated }"
-        :hidden="formState.otrExists"
+        :hidden="formState.otrExists != undefined"
         @submit.prevent="saveOtr"
       >
         <div class="m-1">
diff --git a/src/stores/otrs.ts b/src/stores/otrs.ts
index abbc564..d403b9f 100644
--- a/src/stores/otrs.ts
+++ b/src/stores/otrs.ts
@@ -69,26 +69,38 @@ export const useOTRStore = defineStore("otrs", {
       targetType: OwnershipTypeEnum,
       otr_id: string,
     ): Promise<OwnershipTransferRequestOut> {
+      let promise: Promise<OwnershipTransferRequestOut>;
       switch (targetType) {
         case OwnershipTypeEnum.BUCKET:
-          return BucketService.bucketGetBucketOtr({
+          promise = BucketService.bucketGetBucketOtr({
             path: {
               bucket_name: otr_id,
             },
           }).then((response) => response.data!);
+          break;
         case OwnershipTypeEnum.WORKFLOW:
-          return WorkflowService.workflowGetWorkflowOtr({
+          promise = WorkflowService.workflowGetWorkflowOtr({
             path: {
               wid: otr_id,
             },
           }).then((response) => response.data!);
+          break;
         case OwnershipTypeEnum.RESOURCE:
-          return ResourceService.resourceGetResourceOtr({
+          promise = ResourceService.resourceGetResourceOtr({
             path: {
               rid: otr_id,
             },
           }).then((response) => response.data!);
+          break;
       }
+      promise.then((otr) => {
+        useUserStore().fetchUsernames([
+          otr.new_owner_uid,
+          otr.current_owner_uid,
+        ]);
+        return otr;
+      });
+      return promise;
     },
     fetchOtrs(
       targetType: OwnershipTypeEnum,
-- 
GitLab


From 330a425f9afa1a5df4af2c750d2fb6294b04bd84 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Tue, 11 Feb 2025 17:02:12 +0000
Subject: [PATCH 12/25] Delete resource and create resource OTR in admin
 interface

#191
---
 src/components/modals/CreateOtrModal.vue |  3 +-
 src/views/admin/AdminBucketsView.vue     | 14 ++---
 src/views/admin/AdminResourcesView.vue   | 71 ++++++++++++++++++++++++
 3 files changed, 80 insertions(+), 8 deletions(-)

diff --git a/src/components/modals/CreateOtrModal.vue b/src/components/modals/CreateOtrModal.vue
index 55eb1e3..ce651fb 100644
--- a/src/components/modals/CreateOtrModal.vue
+++ b/src/components/modals/CreateOtrModal.vue
@@ -81,10 +81,11 @@ function saveOtr() {
     if (otrCreateForm.value?.checkValidity()) {
       otrRepository
         .createOtr(targetId.value, formState.requestIn, targetType.value)
-        .then(() => {
+        .then((otr) => {
           createOtrModal?.hide();
           successToast?.show();
           resetForm();
+          formState.otrExists = otr;
         });
     }
   }
diff --git a/src/views/admin/AdminBucketsView.vue b/src/views/admin/AdminBucketsView.vue
index 1bf9519..a4f8b67 100644
--- a/src/views/admin/AdminBucketsView.vue
+++ b/src/views/admin/AdminBucketsView.vue
@@ -14,7 +14,7 @@ import CreateOtrModal from "@/components/modals/CreateOtrModal.vue";
 
 const bucketState = reactive<{
   buckets: BucketOut[];
-  selectBucket?: BucketOut;
+  selectedBucket?: BucketOut;
   ownerId: string;
   loading: boolean;
   searched: boolean;
@@ -22,7 +22,7 @@ const bucketState = reactive<{
   updateLimitsBucket: BucketOut;
 }>({
   buckets: [],
-  selectBucket: undefined,
+  selectedBucket: undefined,
   ownerId: "",
   loading: false,
   searched: false,
@@ -83,7 +83,7 @@ function deleteBucket(bucketName: string) {
       );
     })
     .finally(() => {
-      bucketState.selectBucket = undefined;
+      bucketState.selectedBucket = undefined;
     });
 }
 
@@ -100,13 +100,13 @@ function limitsUpdated(bucket: BucketOut) {
 <template>
   <delete-bucket-modal
     modal-id="delete-bucket-modal"
-    :bucket="bucketState.selectBucket"
+    :bucket="bucketState.selectedBucket"
     @confirm-delete="deleteBucket"
   />
   <create-otr-modal
     modal-id="create-bucket-otr-modal"
     :target="
-      bucketState.selectBucket ?? {
+      bucketState.selectedBucket ?? {
         owner_id: '',
         created_at: 0,
         name: '',
@@ -254,7 +254,7 @@ function limitsUpdated(bucket: BucketOut) {
                   type="button"
                   data-bs-toggle="modal"
                   data-bs-target="#create-bucket-otr-modal"
-                  @click="bucketState.selectBucket = bucket"
+                  @click="bucketState.selectedBucket = bucket"
                 >
                   Transfer ownership
                 </button>
@@ -265,7 +265,7 @@ function limitsUpdated(bucket: BucketOut) {
                   type="button"
                   data-bs-toggle="modal"
                   data-bs-target="#delete-bucket-modal"
-                  @click="bucketState.selectBucket = bucket"
+                  @click="bucketState.selectedBucket = bucket"
                 >
                   <font-awesome-icon icon="fa-solid fa-trash" />
                   <span class="ms-1">Delete</span>
diff --git a/src/views/admin/AdminResourcesView.vue b/src/views/admin/AdminResourcesView.vue
index 6bb58ca..d519e64 100644
--- a/src/views/admin/AdminResourcesView.vue
+++ b/src/views/admin/AdminResourcesView.vue
@@ -12,6 +12,8 @@ import { useNameStore } from "@/stores/names";
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
 import dayjs from "dayjs";
 import ResourceVersionInfoModal from "@/components/resources/modals/ResourceVersionInfoModal.vue";
+import DeleteResourceModal from "@/components/modals/DeleteResourceModal.vue";
+import CreateOtrModal from "@/components/modals/CreateOtrModal.vue";
 
 const resourceRepository = useResourceStore();
 const nameRepository = useNameStore();
@@ -25,6 +27,7 @@ const resourceState = reactive<{
   inspectVersionIndex: number;
   inspectResource?: ResourceOut;
   searched: boolean;
+  selectedResource?: ResourceOut;
 }>({
   loading: false,
   resources: [],
@@ -34,12 +37,26 @@ const resourceState = reactive<{
   inspectVersionIndex: 0,
   inspectResource: undefined,
   searched: false,
+  selectedResource: undefined,
 });
 
 function updateUser(user: UserOut) {
   resourceState.maintainerId = user.uid;
 }
 
+function deleteResource(resourceId: string) {
+  resourceRepository
+    .delete(resourceId)
+    .then(() => {
+      resourceState.resources = resourceState.resources.filter(
+        (resource) => resource.resource_id !== resourceId,
+      );
+    })
+    .finally(() => {
+      resourceState.selectedResource = undefined;
+    });
+}
+
 function searchResources() {
   resourceState.loading = true;
   resourceRepository
@@ -127,6 +144,24 @@ function resetForm() {
 </script>
 
 <template>
+  <delete-resource-modal
+    modal-id="delete-resource-modal"
+    :resource="resourceState.selectedResource"
+    @confirm-delete="deleteResource"
+  />
+  <create-otr-modal
+    modal-id="create-resource-otr-modal"
+    :target="
+      resourceState.selectedResource ?? {
+        resource_id: '',
+        description: '',
+        name: '',
+        source: '',
+        versions: [],
+        maintainer_id: '',
+      }
+    "
+  />
   <search-user-modal
     modal-id="admin-resource-search-user-modal"
     @user-found="updateUser"
@@ -223,6 +258,7 @@ function resetForm() {
         <th scope="col">Resource ID</th>
         <th scope="col">Source</th>
         <th scope="col">Maintainer</th>
+        <th scope="col"></th>
       </tr>
     </thead>
     <tbody v-if="resourceState.resources.length === 0">
@@ -245,6 +281,41 @@ function resetForm() {
           <td>{{ resource.resource_id }}</td>
           <td>{{ resource.source }}</td>
           <td>{{ nameRepository.getName(resource.maintainer_id) }}</td>
+          <td class="text-end">
+            <button
+              class="btn btn-secondary dropdown-toggle"
+              type="button"
+              data-bs-toggle="dropdown"
+              aria-expanded="false"
+            >
+              Actions
+            </button>
+            <ul class="dropdown-menu">
+              <li>
+                <button
+                  class="dropdown-item"
+                  type="button"
+                  data-bs-toggle="modal"
+                  data-bs-target="#create-resource-otr-modal"
+                  @click="resourceState.selectedResource = resource"
+                >
+                  Transfer ownership
+                </button>
+              </li>
+              <li>
+                <button
+                  class="dropdown-item text-danger align-middle"
+                  type="button"
+                  data-bs-toggle="modal"
+                  data-bs-target="#delete-resource-modal"
+                  @click="resourceState.selectedResource = resource"
+                >
+                  <font-awesome-icon icon="fa-solid fa-trash" />
+                  <span class="ms-1">Delete</span>
+                </button>
+              </li>
+            </ul>
+          </td>
         </tr>
         <tr>
           <td colspan="5">
-- 
GitLab


From 3d8d4c4e66afdd84340db5221c2169d1d0b81076 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Wed, 12 Feb 2025 09:09:49 +0000
Subject: [PATCH 13/25] Make admin interface more responsive

#191
---
 package-lock.json                             | 196 ++++----
 src/components/AppHeader.vue                  |   4 +-
 .../modals/DeleteBucketModal.vue              |   2 +-
 .../modals/DeleteObjectsModal.vue             |   2 +-
 .../modals/DeletePermissionModal.vue          |   2 +-
 .../modals/DeleteS3KeyModal.vue               |   2 +-
 .../object-storage/modals/PermissionModal.vue |   2 +-
 .../LastParameterizationsModal.vue            |   2 +-
 .../UploadParameterFileModal.vue              |   2 +-
 .../modals/DeleteResourceModal.vue            |   2 +-
 .../{ => workflows}/ParameterTable.vue        |   0
 .../modals/DeleteExecutionModal.vue           |   2 +-
 .../modals/DeleteWorkflowModal.vue            |   2 +-
 .../workflows/modals/ParameterModal.vue       |   2 +-
 src/views/admin/AdminBucketsView.vue          | 196 ++++----
 src/views/admin/AdminResourcesView.vue        | 441 +++++++++---------
 src/views/admin/AdminSyncRequestsView.vue     |   6 +-
 src/views/admin/AdminUsersView.vue            | 275 +++++------
 .../admin/AdminWorkflowExecutionView.vue      |  12 +-
 src/views/object-storage/BucketView.vue       |   2 +-
 src/views/object-storage/BucketsView.vue      |   2 +-
 src/views/object-storage/S3KeyView.vue        |   2 +-
 src/views/resources/MyResourcesView.vue       |   2 +-
 src/views/user/ProfileView.vue                |  12 +-
 .../workflows/ListWorkflowExecutionsView.vue  |   2 +-
 src/views/workflows/MyWorkflowsView.vue       |   2 +-
 26 files changed, 599 insertions(+), 577 deletions(-)
 rename src/components/{ => object-storage}/modals/DeleteBucketModal.vue (95%)
 rename src/components/{ => object-storage}/modals/DeleteObjectsModal.vue (93%)
 rename src/components/{ => object-storage}/modals/DeletePermissionModal.vue (95%)
 rename src/components/{ => object-storage}/modals/DeleteS3KeyModal.vue (93%)
 rename src/components/{ => resources}/modals/DeleteResourceModal.vue (94%)
 rename src/components/{ => workflows}/ParameterTable.vue (100%)
 rename src/components/{ => workflows}/modals/DeleteExecutionModal.vue (97%)
 rename src/components/{ => workflows}/modals/DeleteWorkflowModal.vue (94%)

diff --git a/package-lock.json b/package-lock.json
index dfba82c..ece13c4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1586,9 +1586,9 @@
       }
     },
     "node_modules/@eslint/core": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz",
-      "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==",
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz",
+      "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -1704,6 +1704,19 @@
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
+    "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz",
+      "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@types/json-schema": "^7.0.15"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
     "node_modules/@fortawesome/fontawesome-free": {
       "version": "6.7.2",
       "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz",
@@ -3366,17 +3379,17 @@
       "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz",
-      "integrity": "sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==",
+      "version": "8.24.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.0.tgz",
+      "integrity": "sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.23.0",
-        "@typescript-eslint/type-utils": "8.23.0",
-        "@typescript-eslint/utils": "8.23.0",
-        "@typescript-eslint/visitor-keys": "8.23.0",
+        "@typescript-eslint/scope-manager": "8.24.0",
+        "@typescript-eslint/type-utils": "8.24.0",
+        "@typescript-eslint/utils": "8.24.0",
+        "@typescript-eslint/visitor-keys": "8.24.0",
         "graphemer": "^1.4.0",
         "ignore": "^5.3.1",
         "natural-compare": "^1.4.0",
@@ -3396,16 +3409,16 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.23.0.tgz",
-      "integrity": "sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==",
+      "version": "8.24.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.0.tgz",
+      "integrity": "sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.23.0",
-        "@typescript-eslint/types": "8.23.0",
-        "@typescript-eslint/typescript-estree": "8.23.0",
-        "@typescript-eslint/visitor-keys": "8.23.0",
+        "@typescript-eslint/scope-manager": "8.24.0",
+        "@typescript-eslint/types": "8.24.0",
+        "@typescript-eslint/typescript-estree": "8.24.0",
+        "@typescript-eslint/visitor-keys": "8.24.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -3421,14 +3434,14 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz",
-      "integrity": "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==",
+      "version": "8.24.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.0.tgz",
+      "integrity": "sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.23.0",
-        "@typescript-eslint/visitor-keys": "8.23.0"
+        "@typescript-eslint/types": "8.24.0",
+        "@typescript-eslint/visitor-keys": "8.24.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3439,14 +3452,14 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz",
-      "integrity": "sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==",
+      "version": "8.24.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.0.tgz",
+      "integrity": "sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.23.0",
-        "@typescript-eslint/utils": "8.23.0",
+        "@typescript-eslint/typescript-estree": "8.24.0",
+        "@typescript-eslint/utils": "8.24.0",
         "debug": "^4.3.4",
         "ts-api-utils": "^2.0.1"
       },
@@ -3463,9 +3476,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.23.0.tgz",
-      "integrity": "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==",
+      "version": "8.24.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.0.tgz",
+      "integrity": "sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -3477,14 +3490,14 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz",
-      "integrity": "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==",
+      "version": "8.24.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.0.tgz",
+      "integrity": "sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.23.0",
-        "@typescript-eslint/visitor-keys": "8.23.0",
+        "@typescript-eslint/types": "8.24.0",
+        "@typescript-eslint/visitor-keys": "8.24.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
@@ -3504,16 +3517,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.23.0.tgz",
-      "integrity": "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==",
+      "version": "8.24.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.0.tgz",
+      "integrity": "sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "8.23.0",
-        "@typescript-eslint/types": "8.23.0",
-        "@typescript-eslint/typescript-estree": "8.23.0"
+        "@typescript-eslint/scope-manager": "8.24.0",
+        "@typescript-eslint/types": "8.24.0",
+        "@typescript-eslint/typescript-estree": "8.24.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3528,13 +3541,13 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz",
-      "integrity": "sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==",
+      "version": "8.24.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.0.tgz",
+      "integrity": "sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.23.0",
+        "@typescript-eslint/types": "8.24.0",
         "eslint-visitor-keys": "^4.2.0"
       },
       "engines": {
@@ -3663,10 +3676,13 @@
       }
     },
     "node_modules/@vue/devtools-api": {
-      "version": "6.6.4",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
-      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
-      "license": "MIT"
+      "version": "7.7.1",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.1.tgz",
+      "integrity": "sha512-Cexc8GimowoDkJ6eNelOPdYIzsu2mgNyp0scOQ3tiaYSb9iok6LOESSsJvHaI+ib3joRfqRJNLkHFjhNuWA5dg==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-kit": "^7.7.1"
+      }
     },
     "node_modules/@vue/devtools-kit": {
       "version": "7.7.1",
@@ -4937,9 +4953,9 @@
       }
     },
     "node_modules/eslint": {
-      "version": "9.20.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.0.tgz",
-      "integrity": "sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==",
+      "version": "9.20.1",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.1.tgz",
+      "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5109,19 +5125,6 @@
         "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/eslint/node_modules/@eslint/core": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz",
-      "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@types/json-schema": "^7.0.15"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      }
-    },
     "node_modules/eslint/node_modules/ajv": {
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -5486,9 +5489,9 @@
       }
     },
     "node_modules/for-each": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.4.tgz",
-      "integrity": "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==",
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+      "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5624,9 +5627,9 @@
       }
     },
     "node_modules/giget/node_modules/pathe": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz",
-      "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
       "dev": true,
       "license": "MIT"
     },
@@ -6406,9 +6409,9 @@
       }
     },
     "node_modules/mlly/node_modules/pathe": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz",
-      "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
       "dev": true,
       "license": "MIT"
     },
@@ -6572,9 +6575,9 @@
       }
     },
     "node_modules/nypm/node_modules/pathe": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz",
-      "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
       "dev": true,
       "license": "MIT"
     },
@@ -6844,15 +6847,6 @@
         }
       }
     },
-    "node_modules/pinia/node_modules/@vue/devtools-api": {
-      "version": "7.7.1",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.1.tgz",
-      "integrity": "sha512-Cexc8GimowoDkJ6eNelOPdYIzsu2mgNyp0scOQ3tiaYSb9iok6LOESSsJvHaI+ib3joRfqRJNLkHFjhNuWA5dg==",
-      "license": "MIT",
-      "dependencies": {
-        "@vue/devtools-kit": "^7.7.1"
-      }
-    },
     "node_modules/pkg-dir": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
@@ -6879,9 +6873,9 @@
       }
     },
     "node_modules/pkg-types/node_modules/pathe": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz",
-      "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==",
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
       "dev": true,
       "license": "MIT"
     },
@@ -6896,9 +6890,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.5.1",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
-      "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
+      "version": "8.5.2",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz",
+      "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==",
       "funding": [
         {
           "type": "opencollective",
@@ -7753,15 +7747,15 @@
       }
     },
     "node_modules/typescript-eslint": {
-      "version": "8.23.0",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.23.0.tgz",
-      "integrity": "sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==",
+      "version": "8.24.0",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.0.tgz",
+      "integrity": "sha512-/lmv4366en/qbB32Vz5+kCNZEMf6xYHwh1z48suBwZvAtnXKbP+YhGe8OLE2BqC67LMqKkCNLtjejdwsdW6uOQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.23.0",
-        "@typescript-eslint/parser": "8.23.0",
-        "@typescript-eslint/utils": "8.23.0"
+        "@typescript-eslint/eslint-plugin": "8.24.0",
+        "@typescript-eslint/parser": "8.24.0",
+        "@typescript-eslint/utils": "8.24.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -8079,6 +8073,12 @@
         "vue": "^3.2.0"
       }
     },
+    "node_modules/vue-router/node_modules/@vue/devtools-api": {
+      "version": "6.6.4",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+      "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+      "license": "MIT"
+    },
     "node_modules/vue-tsc": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.0.tgz",
diff --git a/src/components/AppHeader.vue b/src/components/AppHeader.vue
index 71a3320..6aaa9ab 100644
--- a/src/components/AppHeader.vue
+++ b/src/components/AppHeader.vue
@@ -178,7 +178,7 @@ watch(
               Resources
             </a>
             <ul
-              class="dropdown-menu shadow m-0"
+              class="dropdown-menu shadow m-0 dropdown-menu-end"
               aria-labelledby="workflowDropdown"
             >
               <li>
@@ -227,7 +227,7 @@ watch(
               Admin
             </a>
             <ul
-              class="dropdown-menu shadow m-0"
+              class="dropdown-menu shadow m-0 dropdown-menu-end"
               aria-labelledby="adminDropdown"
             >
               <li>
diff --git a/src/components/modals/DeleteBucketModal.vue b/src/components/object-storage/modals/DeleteBucketModal.vue
similarity index 95%
rename from src/components/modals/DeleteBucketModal.vue
rename to src/components/object-storage/modals/DeleteBucketModal.vue
index 855c9f7..eb22ea6 100644
--- a/src/components/modals/DeleteBucketModal.vue
+++ b/src/components/object-storage/modals/DeleteBucketModal.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import DeleteModal from "./DeleteModal.vue";
+import DeleteModal from "@/components/modals/DeleteModal.vue";
 import type { BucketOut } from "@/client/types.gen.ts";
 import { useNameStore, useUserStore } from "@/stores";
 
diff --git a/src/components/modals/DeleteObjectsModal.vue b/src/components/object-storage/modals/DeleteObjectsModal.vue
similarity index 93%
rename from src/components/modals/DeleteObjectsModal.vue
rename to src/components/object-storage/modals/DeleteObjectsModal.vue
index 8c08a63..aae51e6 100644
--- a/src/components/modals/DeleteObjectsModal.vue
+++ b/src/components/object-storage/modals/DeleteObjectsModal.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import DeleteModal from "./DeleteModal.vue";
+import DeleteModal from "@/components/modals/DeleteModal.vue";
 
 const props = defineProps<{
   modalId: string;
diff --git a/src/components/modals/DeletePermissionModal.vue b/src/components/object-storage/modals/DeletePermissionModal.vue
similarity index 95%
rename from src/components/modals/DeletePermissionModal.vue
rename to src/components/object-storage/modals/DeletePermissionModal.vue
index dbd7f6d..f97e3f1 100644
--- a/src/components/modals/DeletePermissionModal.vue
+++ b/src/components/object-storage/modals/DeletePermissionModal.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import DeleteModal from "./DeleteModal.vue";
+import DeleteModal from "@/components/modals/DeleteModal.vue";
 import type { BucketPermissionOut } from "@/client/types.gen.ts";
 import { useNameStore } from "@/stores";
 
diff --git a/src/components/modals/DeleteS3KeyModal.vue b/src/components/object-storage/modals/DeleteS3KeyModal.vue
similarity index 93%
rename from src/components/modals/DeleteS3KeyModal.vue
rename to src/components/object-storage/modals/DeleteS3KeyModal.vue
index 57a2dbb..d8e03ed 100644
--- a/src/components/modals/DeleteS3KeyModal.vue
+++ b/src/components/object-storage/modals/DeleteS3KeyModal.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import DeleteModal from "./DeleteModal.vue";
+import DeleteModal from "@/components/modals/DeleteModal.vue";
 
 const props = defineProps<{
   modalId: string;
diff --git a/src/components/object-storage/modals/PermissionModal.vue b/src/components/object-storage/modals/PermissionModal.vue
index 62d5d3e..6d9566b 100644
--- a/src/components/object-storage/modals/PermissionModal.vue
+++ b/src/components/object-storage/modals/PermissionModal.vue
@@ -16,7 +16,7 @@ import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
 import { useBucketStore } from "@/stores/buckets";
 import BootstrapToast from "@/components/BootstrapToast.vue";
 import { useNameStore } from "@/stores/names";
-import DeletePermissionModal from "@/components/modals/DeletePermissionModal.vue";
+import DeletePermissionModal from "@/components/object-storage/modals/DeletePermissionModal.vue";
 
 // Props
 // -----------------------------------------------------------------------------
diff --git a/src/components/parameter-schema/LastParameterizationsModal.vue b/src/components/parameter-schema/LastParameterizationsModal.vue
index 2cf2ff6..b93df71 100644
--- a/src/components/parameter-schema/LastParameterizationsModal.vue
+++ b/src/components/parameter-schema/LastParameterizationsModal.vue
@@ -12,7 +12,7 @@ import type {
   TemporaryParams,
 } from "@/types/WorkflowParameters.ts";
 import { flattenParameters } from "@/utils/Workflow.ts";
-import ParameterTable from "@/components/ParameterTable.vue";
+import ParameterTable from "@/components/workflows/ParameterTable.vue";
 import { type RouteLocationRaw, useRouter } from "vue-router";
 import { Modal } from "bootstrap";
 
diff --git a/src/components/parameter-schema/UploadParameterFileModal.vue b/src/components/parameter-schema/UploadParameterFileModal.vue
index b90a3ef..d7b7c89 100644
--- a/src/components/parameter-schema/UploadParameterFileModal.vue
+++ b/src/components/parameter-schema/UploadParameterFileModal.vue
@@ -6,7 +6,7 @@ import type {
   FlatWorkflowParameters,
 } from "@/types/WorkflowParameters";
 import { flattenParameters } from "@/utils/Workflow";
-import ParameterTable from "@/components/ParameterTable.vue";
+import ParameterTable from "@/components/workflows/ParameterTable.vue";
 import { type RouteLocationRaw, useRouter } from "vue-router";
 import { Modal } from "bootstrap";
 
diff --git a/src/components/modals/DeleteResourceModal.vue b/src/components/resources/modals/DeleteResourceModal.vue
similarity index 94%
rename from src/components/modals/DeleteResourceModal.vue
rename to src/components/resources/modals/DeleteResourceModal.vue
index 1d28112..f132cbc 100644
--- a/src/components/modals/DeleteResourceModal.vue
+++ b/src/components/resources/modals/DeleteResourceModal.vue
@@ -1,6 +1,6 @@
 <script setup lang="ts">
 import type { ResourceOut } from "@/client/types.gen.ts";
-import DeleteModal from "./DeleteModal.vue";
+import DeleteModal from "@/components/modals/DeleteModal.vue";
 
 const props = defineProps<{
   modalId: string;
diff --git a/src/components/ParameterTable.vue b/src/components/workflows/ParameterTable.vue
similarity index 100%
rename from src/components/ParameterTable.vue
rename to src/components/workflows/ParameterTable.vue
diff --git a/src/components/modals/DeleteExecutionModal.vue b/src/components/workflows/modals/DeleteExecutionModal.vue
similarity index 97%
rename from src/components/modals/DeleteExecutionModal.vue
rename to src/components/workflows/modals/DeleteExecutionModal.vue
index 5583509..2e2791e 100644
--- a/src/components/modals/DeleteExecutionModal.vue
+++ b/src/components/workflows/modals/DeleteExecutionModal.vue
@@ -1,8 +1,8 @@
 <script setup lang="ts">
-import DeleteModal from "./DeleteModal.vue";
 import type { WorkflowExecutionOut } from "@/client/types.gen.ts";
 import dayjs from "dayjs";
 import { useNameStore, useUserStore } from "@/stores";
+import DeleteModal from "@/components/modals/DeleteModal.vue";
 
 const props = defineProps<{
   modalId: string;
diff --git a/src/components/modals/DeleteWorkflowModal.vue b/src/components/workflows/modals/DeleteWorkflowModal.vue
similarity index 94%
rename from src/components/modals/DeleteWorkflowModal.vue
rename to src/components/workflows/modals/DeleteWorkflowModal.vue
index 535ef7c..5a51a47 100644
--- a/src/components/modals/DeleteWorkflowModal.vue
+++ b/src/components/workflows/modals/DeleteWorkflowModal.vue
@@ -1,6 +1,6 @@
 <script setup lang="ts">
 import type { WorkflowOut } from "@/client/types.gen.ts";
-import DeleteModal from "./DeleteModal.vue";
+import DeleteModal from "@/components/modals/DeleteModal.vue";
 
 const props = defineProps<{
   modalId: string;
diff --git a/src/components/workflows/modals/ParameterModal.vue b/src/components/workflows/modals/ParameterModal.vue
index efe2672..00d2c4b 100644
--- a/src/components/workflows/modals/ParameterModal.vue
+++ b/src/components/workflows/modals/ParameterModal.vue
@@ -17,7 +17,7 @@ import type {
   NestedWorkflowParameters,
   TemporaryParams,
 } from "@/types/WorkflowParameters";
-import ParameterTable from "@/components/ParameterTable.vue";
+import ParameterTable from "@/components/workflows/ParameterTable.vue";
 
 const nameRepository = useNameStore();
 const executionRepository = useWorkflowExecutionStore();
diff --git a/src/views/admin/AdminBucketsView.vue b/src/views/admin/AdminBucketsView.vue
index a4f8b67..4e3e137 100644
--- a/src/views/admin/AdminBucketsView.vue
+++ b/src/views/admin/AdminBucketsView.vue
@@ -9,7 +9,7 @@ import { useNameStore } from "@/stores/names";
 import { filesize } from "filesize";
 import dayjs from "dayjs";
 import UpdateBucketLimitsModal from "@/components/admin/UpdateBucketLimitsModal.vue";
-import DeleteBucketModal from "@/components/modals/DeleteBucketModal.vue";
+import DeleteBucketModal from "@/components/object-storage/modals/DeleteBucketModal.vue";
 import CreateOtrModal from "@/components/modals/CreateOtrModal.vue";
 
 const bucketState = reactive<{
@@ -128,7 +128,9 @@ function limitsUpdated(bucket: BucketOut) {
     <h2>Manage Buckets</h2>
   </div>
   <form id="admin-bucket-search-form" @submit.prevent="searchBuckets">
-    <div class="d-flex justify-content-evenly align-content-center mb-4">
+    <div
+      class="d-flex justify-content-evenly align-content-center mb-4 column-gap-2 flex-wrap"
+    >
       <div class="flex-fill mx-2">
         <label for="admin-bucket-name-search" class="form-label"
           >Name of bucket</label
@@ -184,99 +186,105 @@ function limitsUpdated(bucket: BucketOut) {
       Reset
     </button>
   </form>
-  <table v-if="bucketState.buckets" class="table table-striped align-middle">
-    <thead>
-      <tr>
-        <th scope="col"><b>Name</b></th>
-        <th scope="col" class="description-column">Description</th>
-        <th scope="col">Created at</th>
-        <th scope="col">Size Quota</th>
-        <th scope="col">Object Quota</th>
-        <th scope="col">Owner</th>
-        <th scope="col"></th>
-      </tr>
-    </thead>
-    <tbody v-if="filteredBuckets.length === 0">
-      <tr>
-        <td colspan="7" class="text-center fst-italic fw-light">
-          <template v-if="bucketState.searched"
-            >No bucket found with specified filters
-          </template>
-          <template v-else>Select a filter and search for buckets</template>
-        </td>
-      </tr>
-    </tbody>
-    <tbody v-else>
-      <tr v-for="bucket in filteredBuckets" :key="bucket.name">
-        <th scope="row">{{ bucket.name }}</th>
-        <td class="description-column">{{ bucket.description }}</td>
-        <td>
-          {{ dayjs.unix(bucket.created_at).format("DD.MM.YYYY HH:mm:ss") }}
-        </td>
-        <td>
-          <span v-if="bucket.size_limit">
-            {{ filesize(1024 * bucket.size_limit) }}
-          </span>
-          <span v-else>-</span>
-        </td>
-        <td>
-          <span v-if="bucket.object_limit">
-            {{ bucket.object_limit }}
-          </span>
-          <span v-else>-</span>
-        </td>
-        <td>{{ nameRepository.getName(bucket.owner_id) }}</td>
-        <td>
-          <div
-            class="btn-group btn-group-sm dropdown-center dropdown-menu-start"
-          >
-            <button
-              type="button"
-              class="btn btn-secondary btn-sm"
-              data-bs-toggle="modal"
-              :data-bs-target="'#' + updateLimitsModalId"
-              @click="bucketState.updateLimitsBucket = bucket"
-            >
-              Edit quotas
-            </button>
-            <button
-              type="button"
-              class="btn btn-secondary dropdown-toggle dropdown-toggle-split"
-              data-bs-toggle="dropdown"
-              aria-expanded="false"
+  <div
+    v-if="bucketState.buckets"
+    class="overflow-x-auto"
+    style="max-width: 100vw"
+  >
+    <table class="table table-striped align-middle">
+      <thead>
+        <tr>
+          <th scope="col"><b>Name</b></th>
+          <th scope="col">Description</th>
+          <th scope="col">Created at</th>
+          <th scope="col">Size Quota</th>
+          <th scope="col">Object Quota</th>
+          <th scope="col">Owner</th>
+          <th scope="col"></th>
+        </tr>
+      </thead>
+      <tbody v-if="filteredBuckets.length === 0">
+        <tr>
+          <td colspan="7" class="text-center fst-italic fw-light">
+            <template v-if="bucketState.searched"
+              >No bucket found with specified filters
+            </template>
+            <template v-else>Select a filter and search for buckets</template>
+          </td>
+        </tr>
+      </tbody>
+      <tbody v-else>
+        <tr v-for="bucket in filteredBuckets" :key="bucket.name">
+          <th scope="row">{{ bucket.name }}</th>
+          <td class="description-column">{{ bucket.description }}</td>
+          <td>
+            {{ dayjs.unix(bucket.created_at).format("DD.MM.YYYY HH:mm:ss") }}
+          </td>
+          <td>
+            <span v-if="bucket.size_limit">
+              {{ filesize(1024 * bucket.size_limit) }}
+            </span>
+            <span v-else>-</span>
+          </td>
+          <td>
+            <span v-if="bucket.object_limit">
+              {{ bucket.object_limit }}
+            </span>
+            <span v-else>-</span>
+          </td>
+          <td>{{ nameRepository.getName(bucket.owner_id) }}</td>
+          <td>
+            <div
+              class="btn-group btn-group-sm dropdown-center dropdown-menu-start"
             >
-              <span class="visually-hidden">Toggle Dropdown</span>
-            </button>
-            <ul class="dropdown-menu dropdown-menu">
-              <li>
-                <button
-                  class="dropdown-item"
-                  type="button"
-                  data-bs-toggle="modal"
-                  data-bs-target="#create-bucket-otr-modal"
-                  @click="bucketState.selectedBucket = bucket"
-                >
-                  Transfer ownership
-                </button>
-              </li>
-              <li>
-                <button
-                  class="dropdown-item text-danger align-middle"
-                  type="button"
-                  data-bs-toggle="modal"
-                  data-bs-target="#delete-bucket-modal"
-                  @click="bucketState.selectedBucket = bucket"
-                >
-                  <font-awesome-icon icon="fa-solid fa-trash" />
-                  <span class="ms-1">Delete</span>
-                </button>
-              </li>
-            </ul>
-          </div>
-        </td>
-      </tr>
-    </tbody>
-  </table>
+              <button
+                type="button"
+                class="btn btn-secondary btn-sm"
+                data-bs-toggle="modal"
+                :data-bs-target="'#' + updateLimitsModalId"
+                @click="bucketState.updateLimitsBucket = bucket"
+              >
+                Edit quotas
+              </button>
+              <button
+                type="button"
+                class="btn btn-secondary dropdown-toggle dropdown-toggle-split"
+                data-bs-toggle="dropdown"
+                aria-expanded="false"
+              >
+                <span class="visually-hidden">Toggle Dropdown</span>
+              </button>
+              <ul class="dropdown-menu dropdown-menu">
+                <li>
+                  <button
+                    class="dropdown-item"
+                    type="button"
+                    data-bs-toggle="modal"
+                    data-bs-target="#create-bucket-otr-modal"
+                    @click="bucketState.selectedBucket = bucket"
+                  >
+                    Transfer ownership
+                  </button>
+                </li>
+                <li>
+                  <button
+                    class="dropdown-item text-danger align-middle"
+                    type="button"
+                    data-bs-toggle="modal"
+                    data-bs-target="#delete-bucket-modal"
+                    @click="bucketState.selectedBucket = bucket"
+                  >
+                    <font-awesome-icon icon="fa-solid fa-trash" />
+                    <span class="ms-1">Delete</span>
+                  </button>
+                </li>
+              </ul>
+            </div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
 </template>
 
 <style scoped>
diff --git a/src/views/admin/AdminResourcesView.vue b/src/views/admin/AdminResourcesView.vue
index d519e64..27f2ee8 100644
--- a/src/views/admin/AdminResourcesView.vue
+++ b/src/views/admin/AdminResourcesView.vue
@@ -12,7 +12,7 @@ import { useNameStore } from "@/stores/names";
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
 import dayjs from "dayjs";
 import ResourceVersionInfoModal from "@/components/resources/modals/ResourceVersionInfoModal.vue";
-import DeleteResourceModal from "@/components/modals/DeleteResourceModal.vue";
+import DeleteResourceModal from "@/components/resources/modals/DeleteResourceModal.vue";
 import CreateOtrModal from "@/components/modals/CreateOtrModal.vue";
 
 const resourceRepository = useResourceStore();
@@ -177,8 +177,10 @@ function resetForm() {
     <h2>Manage Resources</h2>
   </div>
   <form id="admin-resource-search-form" @submit.prevent="searchResources">
-    <div class="d-flex justify-content-evenly align-content-center">
-      <div class="mx-2">
+    <div
+      class="d-flex justify-content-evenly align-content-center flex-wrap column-gap-2 mb-2"
+    >
+      <div>
         <label for="admin-resource-state-select" class="form-label"
           >Status of Resource Versions</label
         >
@@ -186,7 +188,7 @@ function resetForm() {
           id="admin-resource-state-select"
           v-model="resourceState.resourceStatus"
           multiple
-          class="form-select mb-4 w-fit"
+          class="form-select w-fit"
         >
           <option
             v-for="state in Object.values(ResourceVersionStatus)"
@@ -196,7 +198,7 @@ function resetForm() {
           </option>
         </select>
       </div>
-      <div class="flex-fill mx-2">
+      <div class="flex-fill">
         <label for="admin-resource-name-search" class="form-label"
           >Name of the Resource</label
         >
@@ -214,7 +216,7 @@ function resetForm() {
           />
         </div>
       </div>
-      <div class="flex-fill mx-2">
+      <div class="flex-fill">
         <label for="admin-resource-user-search" class="form-label"
           >Name of the Maintainer</label
         >
@@ -251,226 +253,235 @@ function resetForm() {
       Reset
     </button>
   </form>
-  <table v-if="resourceState.resources" class="table table-striped">
-    <thead>
-      <tr>
-        <th scope="col"><b>Name</b></th>
-        <th scope="col">Resource ID</th>
-        <th scope="col">Source</th>
-        <th scope="col">Maintainer</th>
-        <th scope="col"></th>
-      </tr>
-    </thead>
-    <tbody v-if="resourceState.resources.length === 0">
-      <tr>
-        <td colspan="5" class="text-center fst-italic fw-light">
-          <template v-if="resourceState.searched"
-            >No resource found with specified filters
-          </template>
-          <template v-else>Select a filter and search for Resources</template>
-        </td>
-      </tr>
-    </tbody>
-    <tbody v-else>
-      <template
-        v-for="resource in resourceState.resources"
-        :key="resource.resource_id"
-      >
+  <div
+    v-if="resourceState.resources"
+    class="overflow-x-auto"
+    style="max-width: 100vw"
+  >
+    <table class="table table-striped">
+      <thead>
         <tr>
-          <th scope="row">{{ resource.name }}</th>
-          <td>{{ resource.resource_id }}</td>
-          <td>{{ resource.source }}</td>
-          <td>{{ nameRepository.getName(resource.maintainer_id) }}</td>
-          <td class="text-end">
-            <button
-              class="btn btn-secondary dropdown-toggle"
-              type="button"
-              data-bs-toggle="dropdown"
-              aria-expanded="false"
-            >
-              Actions
-            </button>
-            <ul class="dropdown-menu">
-              <li>
-                <button
-                  class="dropdown-item"
-                  type="button"
-                  data-bs-toggle="modal"
-                  data-bs-target="#create-resource-otr-modal"
-                  @click="resourceState.selectedResource = resource"
-                >
-                  Transfer ownership
-                </button>
-              </li>
-              <li>
-                <button
-                  class="dropdown-item text-danger align-middle"
-                  type="button"
-                  data-bs-toggle="modal"
-                  data-bs-target="#delete-resource-modal"
-                  @click="resourceState.selectedResource = resource"
-                >
-                  <font-awesome-icon icon="fa-solid fa-trash" />
-                  <span class="ms-1">Delete</span>
-                </button>
-              </li>
-            </ul>
-          </td>
+          <th scope="col"><b>Name</b></th>
+          <th scope="col">Resource ID</th>
+          <th scope="col">Source</th>
+          <th scope="col">Maintainer</th>
+          <th scope="col"></th>
         </tr>
+      </thead>
+      <tbody v-if="resourceState.resources.length === 0">
         <tr>
-          <td colspan="5">
-            <table class="table mb-0 table-hover">
-              <thead>
-                <tr>
-                  <th scope="col"><b>Release</b></th>
-                  <th scope="col">Version ID</th>
-                  <th scope="col">Created At</th>
-                  <th scope="col">State</th>
-                  <th scope="col" class="text-end">Action</th>
-                </tr>
-              </thead>
-              <tbody>
-                <tr
-                  v-for="(version, index) in resource.versions"
-                  :key="version.resource_version_id"
-                >
-                  <th scope="row">{{ version.release }}</th>
-                  <th>{{ version.resource_version_id }}</th>
-                  <th>
-                    {{
-                      dayjs
-                        .unix(version.created_at)
-                        .format("DD.MM.YYYY HH:mm:ss")
-                    }}
-                  </th>
-                  <th>{{ version.status }}</th>
-                  <th class="text-end">
-                    <div class="btn-group">
-                      <button
-                        type="button"
-                        class="btn btn-secondary"
-                        data-bs-toggle="modal"
-                        data-bs-target="#admin-resource-version-info-modal"
-                        @click="
-                          resourceState.inspectResource = resource;
-                          resourceState.inspectVersionIndex = index;
-                        "
-                      >
-                        Inspect
-                      </button>
-                      <button
-                        type="button"
-                        class="btn btn-secondary dropdown-toggle dropdown-toggle-split"
-                        data-bs-toggle="dropdown"
-                        aria-expanded="false"
-                        :disabled="resourceState.loading"
-                      >
-                        <span class="visually-hidden">Toggle Dropdown</span>
-                      </button>
-                      <ul class="dropdown-menu">
-                        <li
-                          v-if="
-                            version.status ===
-                            ResourceVersionStatus.SYNCHRONIZED
+          <td colspan="5" class="text-center fst-italic fw-light">
+            <template v-if="resourceState.searched"
+              >No resource found with specified filters
+            </template>
+            <template v-else>Select a filter and search for Resources</template>
+          </td>
+        </tr>
+      </tbody>
+      <tbody v-else>
+        <template
+          v-for="resource in resourceState.resources"
+          :key="resource.resource_id"
+        >
+          <tr>
+            <th scope="row">{{ resource.name }}</th>
+            <td>{{ resource.resource_id }}</td>
+            <td>{{ resource.source }}</td>
+            <td>{{ nameRepository.getName(resource.maintainer_id) }}</td>
+            <td class="text-end">
+              <button
+                class="btn btn-secondary dropdown-toggle"
+                type="button"
+                data-bs-toggle="dropdown"
+                aria-expanded="false"
+              >
+                Actions
+              </button>
+              <ul class="dropdown-menu">
+                <li>
+                  <button
+                    class="dropdown-item"
+                    type="button"
+                    data-bs-toggle="modal"
+                    data-bs-target="#create-resource-otr-modal"
+                    @click="resourceState.selectedResource = resource"
+                  >
+                    Transfer ownership
+                  </button>
+                </li>
+                <li>
+                  <button
+                    class="dropdown-item text-danger align-middle"
+                    type="button"
+                    data-bs-toggle="modal"
+                    data-bs-target="#delete-resource-modal"
+                    @click="resourceState.selectedResource = resource"
+                  >
+                    <font-awesome-icon icon="fa-solid fa-trash" />
+                    <span class="ms-1">Delete</span>
+                  </button>
+                </li>
+              </ul>
+            </td>
+          </tr>
+          <tr>
+            <td colspan="5">
+              <table class="table mb-0 table-hover">
+                <thead>
+                  <tr>
+                    <th scope="col"><b>Release</b></th>
+                    <th scope="col">Version ID</th>
+                    <th scope="col">Created At</th>
+                    <th scope="col">State</th>
+                    <th scope="col" class="text-end">Action</th>
+                  </tr>
+                </thead>
+                <tbody>
+                  <tr
+                    v-for="(version, index) in resource.versions"
+                    :key="version.resource_version_id"
+                  >
+                    <th scope="row">{{ version.release }}</th>
+                    <th>{{ version.resource_version_id }}</th>
+                    <th>
+                      {{
+                        dayjs
+                          .unix(version.created_at)
+                          .format("DD.MM.YYYY HH:mm:ss")
+                      }}
+                    </th>
+                    <th>{{ version.status }}</th>
+                    <th class="text-end">
+                      <div class="btn-group">
+                        <button
+                          type="button"
+                          class="btn btn-secondary"
+                          data-bs-toggle="modal"
+                          data-bs-target="#admin-resource-version-info-modal"
+                          @click="
+                            resourceState.inspectResource = resource;
+                            resourceState.inspectVersionIndex = index;
                           "
                         >
-                          <button
-                            class="dropdown-item"
-                            type="button"
-                            @click="setLatest(version)"
-                          >
-                            Set to Latest
-                          </button>
-                        </li>
-                        <li
-                          v-if="
-                            version.status ===
-                            ResourceVersionStatus.WAIT_FOR_REVIEW
-                          "
+                          Inspect
+                        </button>
+                        <button
+                          type="button"
+                          class="btn btn-secondary dropdown-toggle dropdown-toggle-split"
+                          data-bs-toggle="dropdown"
+                          aria-expanded="false"
+                          :disabled="resourceState.loading"
                         >
-                          <router-link
-                            class="dropdown-item"
-                            :to="{ name: 'resource-review' }"
+                          <span class="visually-hidden">Toggle Dropdown</span>
+                        </button>
+                        <ul class="dropdown-menu">
+                          <li
+                            v-if="
+                              version.status ===
+                              ResourceVersionStatus.SYNCHRONIZED
+                            "
                           >
-                            Review Resource
-                          </router-link>
-                        </li>
-                        <li
-                          v-if="
-                            version.status ===
-                            ResourceVersionStatus.SYNC_REQUESTED
-                          "
-                        >
-                          <router-link
-                            class="dropdown-item"
-                            :to="{ name: 'admin-sync-requests' }"
+                            <button
+                              class="dropdown-item"
+                              type="button"
+                              @click="setLatest(version)"
+                            >
+                              Set to Latest
+                            </button>
+                          </li>
+                          <li
+                            v-if="
+                              version.status ===
+                              ResourceVersionStatus.WAIT_FOR_REVIEW
+                            "
                           >
-                            Review sync request
-                          </router-link>
-                        </li>
-                        <li
-                          v-if="
-                            version.status === ResourceVersionStatus.APPROVED ||
-                            version.status === ResourceVersionStatus.SYNC_ERROR
-                          "
-                        >
-                          <button
-                            class="dropdown-item"
-                            type="button"
-                            @click="syncToCluster(version)"
+                            <router-link
+                              class="dropdown-item"
+                              :to="{ name: 'resource-review' }"
+                            >
+                              Review Resource
+                            </router-link>
+                          </li>
+                          <li
+                            v-if="
+                              version.status ===
+                              ResourceVersionStatus.SYNC_REQUESTED
+                            "
                           >
-                            <font-awesome-icon
-                              icon="fa-solid fa-cloud-arrow-down"
-                            />
-                            <span class="ms-1">Sync to Cluster</span>
-                          </button>
-                        </li>
-                        <li
-                          v-if="
-                            version.status ===
-                              ResourceVersionStatus.SYNCHRONIZED ||
-                            version.status ===
-                              ResourceVersionStatus.CLUSTER_DELETE_ERROR ||
-                            version.status === ResourceVersionStatus.LATEST
-                          "
-                        >
-                          <button
-                            class="dropdown-item text-danger align-middle"
-                            type="button"
-                            @click="deleteOnCluster(version)"
+                            <router-link
+                              class="dropdown-item"
+                              :to="{ name: 'admin-sync-requests' }"
+                            >
+                              Review sync request
+                            </router-link>
+                          </li>
+                          <li
+                            v-if="
+                              version.status ===
+                                ResourceVersionStatus.APPROVED ||
+                              version.status ===
+                                ResourceVersionStatus.SYNC_ERROR
+                            "
                           >
-                            <font-awesome-icon icon="fa-solid fa-trash" />
-                            <span class="ms-1">Delete on Cluster</span>
-                          </button>
-                        </li>
-                        <li
-                          v-if="
-                            version.status === ResourceVersionStatus.APPROVED ||
-                            version.status ===
-                              ResourceVersionStatus.S3_DELETE_ERROR ||
-                            version.status === ResourceVersionStatus.DENIED
-                          "
-                        >
-                          <button
-                            class="dropdown-item text-danger align-middle"
-                            type="button"
-                            @click="deleteInS3(version)"
+                            <button
+                              class="dropdown-item"
+                              type="button"
+                              @click="syncToCluster(version)"
+                            >
+                              <font-awesome-icon
+                                icon="fa-solid fa-cloud-arrow-down"
+                              />
+                              <span class="ms-1">Sync to Cluster</span>
+                            </button>
+                          </li>
+                          <li
+                            v-if="
+                              version.status ===
+                                ResourceVersionStatus.SYNCHRONIZED ||
+                              version.status ===
+                                ResourceVersionStatus.CLUSTER_DELETE_ERROR ||
+                              version.status === ResourceVersionStatus.LATEST
+                            "
                           >
-                            <font-awesome-icon icon="fa-solid fa-trash" />
-                            <span class="ms-1">Delete in S3</span>
-                          </button>
-                        </li>
-                      </ul>
-                    </div>
-                  </th>
-                </tr>
-              </tbody>
-            </table>
-          </td>
-        </tr>
-      </template>
-    </tbody>
-  </table>
+                            <button
+                              class="dropdown-item text-danger align-middle"
+                              type="button"
+                              @click="deleteOnCluster(version)"
+                            >
+                              <font-awesome-icon icon="fa-solid fa-trash" />
+                              <span class="ms-1">Delete on Cluster</span>
+                            </button>
+                          </li>
+                          <li
+                            v-if="
+                              version.status ===
+                                ResourceVersionStatus.APPROVED ||
+                              version.status ===
+                                ResourceVersionStatus.S3_DELETE_ERROR ||
+                              version.status === ResourceVersionStatus.DENIED
+                            "
+                          >
+                            <button
+                              class="dropdown-item text-danger align-middle"
+                              type="button"
+                              @click="deleteInS3(version)"
+                            >
+                              <font-awesome-icon icon="fa-solid fa-trash" />
+                              <span class="ms-1">Delete in S3</span>
+                            </button>
+                          </li>
+                        </ul>
+                      </div>
+                    </th>
+                  </tr>
+                </tbody>
+              </table>
+            </td>
+          </tr>
+        </template>
+      </tbody>
+    </table>
+  </div>
 </template>
 
 <style scoped></style>
diff --git a/src/views/admin/AdminSyncRequestsView.vue b/src/views/admin/AdminSyncRequestsView.vue
index f879dc9..92dda33 100644
--- a/src/views/admin/AdminSyncRequestsView.vue
+++ b/src/views/admin/AdminSyncRequestsView.vue
@@ -164,19 +164,19 @@ onMounted(() => {
     </template>
   </reason-modal>
   <div
-    class="row border-bottom mb-4 justify-content-between align-items-center"
+    class="d-flex border-bottom mb-4 justify-content-between align-items-center flex-wrap gap-2"
   >
     <h2 class="w-fit">Review resource synchronization requests</h2>
     <span
       id="refreshReviewableResourcesButton"
-      class="w-fit"
+      class="w-fit mb-2"
       tabindex="0"
       data-bs-title="Refresh Reviewable Resources"
       data-bs-toggle="tooltip"
     >
       <button
         type="button"
-        class="btn me-2 shadow-sm border w-fit"
+        class="btn shadow-sm border w-fit"
         :class="{
           'btn-light': settingsStore.lightThemeActive,
           'btn-secondary': settingsStore.darkThemeActive,
diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue
index 4969d38..8d856a3 100644
--- a/src/views/admin/AdminUsersView.vue
+++ b/src/views/admin/AdminUsersView.vue
@@ -129,8 +129,10 @@ onMounted(() => {
     </button>
   </div>
   <form id="admin-user-search-form" @submit.prevent="searchUsers">
-    <div class="d-flex justify-content-evenly align-content-center">
-      <div class="mx-2">
+    <div
+      class="d-flex justify-content-evenly align-content-center column-gap-3 flex-wrap mb-2"
+    >
+      <div>
         <label for="admin-user-state-select" class="form-label"
           >User Roles</label
         >
@@ -138,14 +140,14 @@ onMounted(() => {
           id="admin-user-state-select"
           v-model="userState.userRoles"
           multiple
-          class="form-select mb-4 w-fit"
+          class="form-select w-fit"
         >
           <option v-for="role in Object.values(RoleEnum)" :key="role">
             {{ role }}
           </option>
         </select>
       </div>
-      <div class="flex-fill mx-2">
+      <div class="flex-fill">
         <label for="admin-user-name-search" class="form-label"
           >Name of a user</label
         >
@@ -173,141 +175,140 @@ onMounted(() => {
       Search
     </button>
   </form>
-  <table
-    v-if="userState.users"
-    class="table table-striped align-middle caption-top"
-  >
-    <caption>
-      Displaying
-      {{
-        userState.users.length
-      }}
-      Users
-    </caption>
-    <thead>
-      <tr>
-        <th scope="col"><b>Name</b></th>
-        <th scope="col">UID</th>
-        <th scope="col">Email</th>
-        <th
-          v-for="role in Object.values(RoleEnum)"
-          :key="role"
-          scope="col"
-          class="text-center"
-        >
-          {{ role.toUpperCase() }}
-        </th>
-        <th scope="col"></th>
-      </tr>
-    </thead>
-    <tbody v-if="userState.users.length === 0">
-      <tr>
-        <td colspan="9" class="text-center fst-italic fw-light">
-          <template v-if="userState.searched"
-            >No Users found with specified filters
-          </template>
-          <template v-else>Select a filter and search for Users</template>
-        </td>
-      </tr>
-    </tbody>
-    <tbody v-else>
-      <tr v-for="(user, index) in userState.users" :key="user.uid">
-        <th scope="row">
-          <img
-            :src="user.gravatar_url + '?d=mp&s=32'"
-            class="rounded-circle"
-            height="32"
-            width="32"
-            alt="profile picture"
-          />
-          <span class="ms-2">{{ user.display_name }}</span>
-        </th>
-        <td>{{ user.uid }}</td>
-        <td>
-          <a v-if="user.email" :href="`mailto:${user.email}`">{{
-            user.email
-          }}</a>
-        </td>
-        <td
-          v-for="role in Object.values(RoleEnum)"
-          :key="role"
-          class="text-center"
-        >
-          <input
-            v-model="userState.newUserRoles[index]"
-            type="checkbox"
-            class="form-check-input"
-            :value="role"
-            :disabled="!userState.editUserRoles[index]"
-          />
-        </td>
-        <td v-if="userState.editUserRoles[index]" class="text-end">
-          <div
-            class="btn-group btn-group-sm"
-            role="group"
-            aria-label="Basic mixed styles example"
+  <div v-if="userState.users" class="overflow-x-auto" style="max-width: 100vw">
+    <table class="table table-striped align-middle caption-top">
+      <caption>
+        Displaying
+        {{
+          userState.users.length
+        }}
+        Users
+      </caption>
+      <thead>
+        <tr>
+          <th scope="col"><b>Name</b></th>
+          <th scope="col">UID</th>
+          <th scope="col">Email</th>
+          <th
+            v-for="role in Object.values(RoleEnum)"
+            :key="role"
+            scope="col"
+            class="text-center"
           >
-            <button
-              type="button"
-              class="btn btn-success"
-              :disabled="userState.loading"
-              @click="saveUserRoles(index)"
-            >
-              Save
-            </button>
-            <button
-              type="button"
-              class="btn btn-danger"
-              :disabled="userState.loading"
-              @click="resetUserRoles(index)"
-            >
-              Cancel
-            </button>
-          </div>
-        </td>
-        <td v-else class="text-end">
-          <div class="btn-group">
-            <button
-              type="button"
-              class="btn btn-sm btn-secondary"
-              @click="userState.editUserRoles[index] = true"
-            >
-              Edit Roles
-            </button>
-            <button
-              type="button"
-              class="btn btn-secondary btn-sm dropdown-toggle dropdown-toggle-split"
-              data-bs-toggle="dropdown"
-              aria-expanded="false"
+            {{ role.toUpperCase() }}
+          </th>
+          <th scope="col"></th>
+        </tr>
+      </thead>
+      <tbody v-if="userState.users.length === 0">
+        <tr>
+          <td colspan="9" class="text-center fst-italic fw-light">
+            <template v-if="userState.searched"
+              >No Users found with specified filters
+            </template>
+            <template v-else>Select a filter and search for Users</template>
+          </td>
+        </tr>
+      </tbody>
+      <tbody v-else>
+        <tr v-for="(user, index) in userState.users" :key="user.uid">
+          <th scope="row">
+            <img
+              :src="user.gravatar_url + '?d=mp&s=32'"
+              class="rounded-circle"
+              height="32"
+              width="32"
+              alt="profile picture"
+            />
+            <span class="ms-2">{{ user.display_name }}</span>
+          </th>
+          <td>{{ user.uid }}</td>
+          <td>
+            <a v-if="user.email" :href="`mailto:${user.email}`">{{
+              user.email
+            }}</a>
+          </td>
+          <td
+            v-for="role in Object.values(RoleEnum)"
+            :key="role"
+            class="text-center"
+          >
+            <input
+              v-model="userState.newUserRoles[index]"
+              type="checkbox"
+              class="form-check-input"
+              :value="role"
+              :disabled="!userState.editUserRoles[index]"
+            />
+          </td>
+          <td v-if="userState.editUserRoles[index]" class="text-end">
+            <div
+              class="btn-group btn-group-sm"
+              role="group"
+              aria-label="Basic mixed styles example"
             >
-              <span class="visually-hidden">Toggle Dropdown</span>
-            </button>
-            <ul class="dropdown-menu">
-              <li>
-                <a
-                  v-if="user.invitation_token_created_at"
-                  class="dropdown-item"
-                  :class="{ disabled: userState.loading }"
-                  :aria-disabled="userState.loading"
-                  @click="resendInvitationEmail(user.uid)"
-                  >Resend invitation email</a
-                >
-              </li>
-              <li>
-                <a
-                  class="dropdown-item text-danger disabled"
-                  aria-disabled="true"
-                >
-                  <font-awesome-icon icon="fa-solid fa-trash" class="me-1" />
-                  Delete</a
-                >
-              </li>
-            </ul>
-          </div>
-        </td>
-      </tr>
-    </tbody>
-  </table>
+              <button
+                type="button"
+                class="btn btn-success"
+                :disabled="userState.loading"
+                @click="saveUserRoles(index)"
+              >
+                Save
+              </button>
+              <button
+                type="button"
+                class="btn btn-danger"
+                :disabled="userState.loading"
+                @click="resetUserRoles(index)"
+              >
+                Cancel
+              </button>
+            </div>
+          </td>
+          <td v-else class="text-end">
+            <div class="btn-group">
+              <button
+                type="button"
+                class="btn btn-sm btn-secondary"
+                @click="userState.editUserRoles[index] = true"
+              >
+                Edit Roles
+              </button>
+              <button
+                type="button"
+                class="btn btn-secondary btn-sm dropdown-toggle dropdown-toggle-split"
+                data-bs-toggle="dropdown"
+                aria-expanded="false"
+              >
+                <span class="visually-hidden">Toggle Dropdown</span>
+              </button>
+              <ul class="dropdown-menu">
+                <li>
+                  <a
+                    v-if="user.invitation_token_created_at"
+                    class="dropdown-item"
+                    :class="{ disabled: userState.loading }"
+                    :aria-disabled="userState.loading"
+                    @click="resendInvitationEmail(user.uid)"
+                    >Resend invitation email</a
+                  >
+                </li>
+                <li>
+                  <a
+                    class="dropdown-item text-danger disabled"
+                    aria-disabled="true"
+                  >
+                    <font-awesome-icon icon="fa-solid fa-trash" class="me-1" />
+                    Delete</a
+                  >
+                </li>
+              </ul>
+            </div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
 </template>
 
 <style scoped></style>
diff --git a/src/views/admin/AdminWorkflowExecutionView.vue b/src/views/admin/AdminWorkflowExecutionView.vue
index 4e4a4bd..347c18d 100644
--- a/src/views/admin/AdminWorkflowExecutionView.vue
+++ b/src/views/admin/AdminWorkflowExecutionView.vue
@@ -15,7 +15,7 @@ import { useNameStore } from "@/stores/names";
 import dayjs from "dayjs";
 import ParameterModal from "@/components/workflows/modals/ParameterModal.vue";
 import MarkdownRenderer from "@/components/MarkdownRenderer.vue";
-import DeleteExecutionModal from "@/components/modals/DeleteExecutionModal.vue";
+import DeleteExecutionModal from "@/components/workflows/modals/DeleteExecutionModal.vue";
 
 const executionRepository = useWorkflowExecutionStore();
 const nameRepository = useNameStore();
@@ -216,8 +216,10 @@ onMounted(() => {
     <h2>Search Workflow Execution</h2>
   </div>
   <form id="admin-execution-search-form" @submit.prevent="searchExecution">
-    <div class="d-flex justify-content-evenly align-content-center mb-4">
-      <div class="mx-2">
+    <div
+      class="d-flex justify-content-evenly align-content-center mb-4 column-gap-2 flex-wrap"
+    >
+      <div>
         <label for="admin-execution-state-select" class="form-label"
           >Status of Workflow Execution</label
         >
@@ -258,7 +260,7 @@ onMounted(() => {
           <label class="form-check-label" for="sort-radio-desc"> Desc </label>
         </div>
       </div>
-      <div class="flex-fill mx-2">
+      <div class="flex-fill">
         <label for="admin-execution-start-after-search" class="form-label"
           >Start after</label
         >
@@ -306,7 +308,7 @@ onMounted(() => {
           />
         </div>
       </div>
-      <div class="flex-fill mx-2">
+      <div class="flex-fill">
         <label for="admin-execution-user-search" class="form-label"
           >Name of the owner</label
         >
diff --git a/src/views/object-storage/BucketView.vue b/src/views/object-storage/BucketView.vue
index 29d3f77..aa4f08f 100644
--- a/src/views/object-storage/BucketView.vue
+++ b/src/views/object-storage/BucketView.vue
@@ -24,7 +24,7 @@ import BootstrapToast from "@/components/BootstrapToast.vue";
 import { useSettingsStore } from "@/stores/settings";
 import { md5 } from "@/utils/md5";
 import DownloadObjectsModal from "@/components/object-storage/modals/DownloadObjectsModal.vue";
-import DeleteObjectsModal from "@/components/modals/DeleteObjectsModal.vue";
+import DeleteObjectsModal from "@/components/object-storage/modals/DeleteObjectsModal.vue";
 
 const authStore = useUserStore();
 const bucketRepository = useBucketStore();
diff --git a/src/views/object-storage/BucketsView.vue b/src/views/object-storage/BucketsView.vue
index 208b713..7e99e98 100644
--- a/src/views/object-storage/BucketsView.vue
+++ b/src/views/object-storage/BucketsView.vue
@@ -17,7 +17,7 @@ import { useOTRStore } from "@/stores/otrs";
 import BucketDetailModal from "@/components/object-storage/modals/BucketDetailModal.vue";
 import ListOtrsModal from "@/components/modals/ListOtrsModal.vue";
 import OtrModal from "@/components/modals/ShowOtrModal.vue";
-import DeleteBucketModal from "@/components/modals/DeleteBucketModal.vue";
+import DeleteBucketModal from "@/components/object-storage/modals/DeleteBucketModal.vue";
 
 const router = useRouter();
 const bucketRepository = useBucketStore();
diff --git a/src/views/object-storage/S3KeyView.vue b/src/views/object-storage/S3KeyView.vue
index 8c29c38..42c3e5d 100644
--- a/src/views/object-storage/S3KeyView.vue
+++ b/src/views/object-storage/S3KeyView.vue
@@ -4,7 +4,7 @@ import { ref, watch } from "vue";
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
 import { environment } from "@/environment";
 import CopyToClipboardIcon from "@/components/CopyToClipboardIcon.vue";
-import DeleteS3KeyModal from "@/components/modals/DeleteS3KeyModal.vue";
+import DeleteS3KeyModal from "@/components/object-storage/modals/DeleteS3KeyModal.vue";
 
 const props = defineProps<{
   s3key: S3Key;
diff --git a/src/views/resources/MyResourcesView.vue b/src/views/resources/MyResourcesView.vue
index d5d12c0..48ab7e7 100644
--- a/src/views/resources/MyResourcesView.vue
+++ b/src/views/resources/MyResourcesView.vue
@@ -23,7 +23,7 @@ import ListOtrsModal from "@/components/modals/ListOtrsModal.vue";
 import { useOTRStore } from "@/stores/otrs";
 import { useUserStore } from "@/stores/users";
 import { useSettingsStore } from "@/stores/settings";
-import DeleteResourceModal from "@/components/modals/DeleteResourceModal.vue";
+import DeleteResourceModal from "@/components/resources/modals/DeleteResourceModal.vue";
 
 const resourceRepository = useResourceStore();
 const s3KeyRepository = useS3KeyStore();
diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue
index aefd1be..7cf5544 100644
--- a/src/views/user/ProfileView.vue
+++ b/src/views/user/ProfileView.vue
@@ -70,7 +70,7 @@ onMounted(() => {
     :user="userRepository.user ?? { display_name: '', uid: '' }"
     @confirm-delete="deleteCurrentUser"
   />
-  <div class="row border-bottom mb-4">
+  <div class="border-bottom mb-4">
     <h2 class="mb-2">My Profile</h2>
   </div>
   <div class="px-1">
@@ -93,7 +93,7 @@ onMounted(() => {
       </div>
     </div>
     <div>
-      <div class="row border-bottom mb-2 mt-4">
+      <div class="border-bottom mb-2 mt-4">
         <h3>My linked accounts</h3>
       </div>
       <div>
@@ -111,7 +111,7 @@ onMounted(() => {
         <div v-if="userRepository.user?.lifescience_id">
           <b>Linked account: </b>
           <a href="https://profile.aai.lifescience-ri.eu/profile"
-            >{{ userRepository.user?.lifescience_id }}@lifescience.eu</a
+            >{{ userRepository.user?.lifescience_id }}&#x200B;@lifescience.eu</a
           >
         </div>
         <div v-else>
@@ -140,7 +140,7 @@ onMounted(() => {
         </p>
         <div v-if="userRepository.user?.nfdi_id">
           <b>Linked account: </b
-          >{{ userRepository.user?.nfdi_id }}@lifescience.eu
+          >{{ userRepository.user?.nfdi_id }}&#x200B;@lifescience.eu
         </div>
         <div v-else>
           <div>Link your account with NFDI AAI</div>
@@ -158,7 +158,7 @@ onMounted(() => {
       </div>
     </div>
     <div>
-      <div class="row border-bottom mb-2 mt-4">
+      <div class="border-bottom mb-2 mt-4">
         <h3>My roles</h3>
       </div>
       <p>
@@ -272,7 +272,7 @@ onMounted(() => {
       </div>
     </div>
     <div>
-      <div class="row border-bottom mb-2 mt-4">
+      <div class="border-bottom mb-2 mt-4">
         <h3 class="text-danger">Delete my account</h3>
       </div>
       <p>
diff --git a/src/views/workflows/ListWorkflowExecutionsView.vue b/src/views/workflows/ListWorkflowExecutionsView.vue
index 1dbe0ee..c48260a 100644
--- a/src/views/workflows/ListWorkflowExecutionsView.vue
+++ b/src/views/workflows/ListWorkflowExecutionsView.vue
@@ -11,7 +11,7 @@ import { ExponentialBackoff } from "@/utils/BackoffStrategy";
 import { useNameStore } from "@/stores/names";
 import MarkdownRenderer from "@/components/MarkdownRenderer.vue";
 import { useSettingsStore } from "@/stores/settings";
-import DeleteExecutionModal from "@/components/modals/DeleteExecutionModal.vue";
+import DeleteExecutionModal from "@/components/workflows/modals/DeleteExecutionModal.vue";
 
 const workflowRepository = useWorkflowStore();
 const nameRepository = useNameStore();
diff --git a/src/views/workflows/MyWorkflowsView.vue b/src/views/workflows/MyWorkflowsView.vue
index 9ea093c..1ff6383 100644
--- a/src/views/workflows/MyWorkflowsView.vue
+++ b/src/views/workflows/MyWorkflowsView.vue
@@ -27,7 +27,7 @@ import { useUserStore } from "@/stores/users";
 import { Modal, Tooltip } from "bootstrap";
 import { useSettingsStore } from "@/stores/settings";
 import CreateOtrModal from "@/components/modals/CreateOtrModal.vue";
-import DeleteWorkflowModal from "@/components/modals/DeleteWorkflowModal.vue";
+import DeleteWorkflowModal from "@/components/workflows/modals/DeleteWorkflowModal.vue";
 
 const workflowRepository = useWorkflowStore();
 const workflowExecutionRepository = useWorkflowExecutionStore();
-- 
GitLab


From c8094cd17f5543fc97c5c424b249b07696b60d31 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Wed, 12 Feb 2025 09:27:48 +0000
Subject: [PATCH 14/25] Delete any account as admin

#191
---
 src/views/admin/AdminUsersView.vue | 40 ++++++++++++++++++++++++------
 1 file changed, 33 insertions(+), 7 deletions(-)

diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue
index 8d856a3..b62f506 100644
--- a/src/views/admin/AdminUsersView.vue
+++ b/src/views/admin/AdminUsersView.vue
@@ -1,11 +1,16 @@
 <script setup lang="ts">
 import { useUserStore } from "@/stores/users";
 import { onMounted, reactive } from "vue";
-import { RoleEnum, type UserOutExtended } from "@/client/types.gen";
+import {
+  RoleEnum,
+  type UserOutExtended,
+  type UserOut,
+} from "@/client/types.gen";
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
 import BootstrapToast from "@/components/BootstrapToast.vue";
 import { Toast } from "bootstrap";
 import CreateUserModal from "@/components/admin/CreateUserModal.vue";
+import DeleteUserModal from "@/components/modals/DeleteUserModal.vue";
 
 const userRepository = useUserStore();
 type RoleList = RoleEnum[];
@@ -24,6 +29,7 @@ const userState = reactive<{
   userRoles: RoleEnum[];
   inspectUser?: UserOutExtended;
   searched: boolean;
+  selectedUser?: UserOut;
 }>({
   loading: false,
   users: [],
@@ -35,6 +41,7 @@ const userState = reactive<{
   userRoles: [],
   inspectUser: undefined,
   searched: false,
+  selectedUser: undefined,
 });
 
 function searchUsers() {
@@ -93,6 +100,17 @@ function resendInvitationEmail(uid: string) {
     });
 }
 
+function deleteUser(uid: string) {
+  userRepository
+    .deleteUser(uid)
+    .then(() => {
+      userState.users = userState.users.filter((user) => user.uid !== uid);
+    })
+    .finally(() => {
+      userState.selectedUser = undefined;
+    });
+}
+
 onMounted(() => {
   successRoleToast = new Toast("#change-role-success-toast");
   successInvitationToast = new Toast("#resend-invitation-success-toast");
@@ -114,6 +132,11 @@ onMounted(() => {
     </template>
     <template #body>Error: {{ userState.errorMessage }}</template>
   </bootstrap-toast>
+  <delete-user-modal
+    modal-id="delete-user-modal"
+    :user="userState.selectedUser ?? { display_name: '', uid: '' }"
+    @confirm-delete="deleteUser"
+  />
   <create-user-modal modal-id="create-user-modal" />
   <div
     class="row border-bottom mb-4 justify-content-between align-items-center pb-2 pe-2"
@@ -293,14 +316,17 @@ onMounted(() => {
                     >Resend invitation email</a
                   >
                 </li>
-                <li>
-                  <a
-                    class="dropdown-item text-danger disabled"
-                    aria-disabled="true"
+                <li v-if="user.uid !== userRepository.currentUID">
+                  <button
+                    type="button"
+                    class="dropdown-item text-danger align-middle"
+                    data-bs-toggle="modal"
+                    data-bs-target="#delete-user-modal"
+                    @click="userState.selectedUser = user"
                   >
                     <font-awesome-icon icon="fa-solid fa-trash" class="me-1" />
-                    Delete</a
-                  >
+                    Delete
+                  </button>
                 </li>
               </ul>
             </div>
-- 
GitLab


From 9952d421ed6466ac76116f7e189c298d4c963ffe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Wed, 12 Feb 2025 10:59:24 +0000
Subject: [PATCH 15/25] Add Vue dev tools and update robots.txt

#191
---
 .gitignore        |    1 +
 package-lock.json | 1416 ++++++++++++++++++++++++++++++++++++++++++++-
 package.json      |    3 +-
 public/robots.txt |    4 +
 vite.config.ts    |    2 +
 5 files changed, 1408 insertions(+), 18 deletions(-)

diff --git a/.gitignore b/.gitignore
index dec6fc7..4ee9e22 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,3 +29,4 @@ coverage
 .env
 
 public/env.js
+public/google*.html
diff --git a/package-lock.json b/package-lock.json
index ece13c4..681e9fc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -57,9 +57,34 @@
         "typescript": "~5.7.0",
         "vite": "~6.1.0",
         "vite-plugin-node-polyfills": "^0.23.0",
+        "vite-plugin-vue-devtools": "^7.7.0",
         "vue-tsc": "~2.2.0"
       }
     },
+    "node_modules/@ampproject/remapping": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+      "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@antfu/utils": {
+      "version": "0.7.10",
+      "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz",
+      "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
     "node_modules/@aws-crypto/crc32": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz",
@@ -1028,6 +1053,263 @@
         "node": ">=18.0.0"
       }
     },
+    "node_modules/@babel/code-frame": {
+      "version": "7.26.2",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+      "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.25.9",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/compat-data": {
+      "version": "7.26.8",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
+      "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/core": {
+      "version": "7.26.8",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz",
+      "integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@ampproject/remapping": "^2.2.0",
+        "@babel/code-frame": "^7.26.2",
+        "@babel/generator": "^7.26.8",
+        "@babel/helper-compilation-targets": "^7.26.5",
+        "@babel/helper-module-transforms": "^7.26.0",
+        "@babel/helpers": "^7.26.7",
+        "@babel/parser": "^7.26.8",
+        "@babel/template": "^7.26.8",
+        "@babel/traverse": "^7.26.8",
+        "@babel/types": "^7.26.8",
+        "@types/gensync": "^1.0.0",
+        "convert-source-map": "^2.0.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.2.3",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
+      }
+    },
+    "node_modules/@babel/core/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/generator": {
+      "version": "7.26.8",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz",
+      "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.26.8",
+        "@babel/types": "^7.26.8",
+        "@jridgewell/gen-mapping": "^0.3.5",
+        "@jridgewell/trace-mapping": "^0.3.25",
+        "jsesc": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-annotate-as-pure": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+      "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets": {
+      "version": "7.26.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz",
+      "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/compat-data": "^7.26.5",
+        "@babel/helper-validator-option": "^7.25.9",
+        "browserslist": "^4.24.0",
+        "lru-cache": "^5.1.1",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/helper-create-class-features-plugin": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
+      "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.25.9",
+        "@babel/helper-member-expression-to-functions": "^7.25.9",
+        "@babel/helper-optimise-call-expression": "^7.25.9",
+        "@babel/helper-replace-supers": "^7.25.9",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+        "@babel/traverse": "^7.25.9",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/@babel/helper-member-expression-to-functions": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
+      "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.25.9",
+        "@babel/types": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-imports": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+      "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.25.9",
+        "@babel/types": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-transforms": {
+      "version": "7.26.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+      "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.25.9",
+        "@babel/helper-validator-identifier": "^7.25.9",
+        "@babel/traverse": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-optimise-call-expression": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
+      "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-plugin-utils": {
+      "version": "7.26.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
+      "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-replace-supers": {
+      "version": "7.26.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz",
+      "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-member-expression-to-functions": "^7.25.9",
+        "@babel/helper-optimise-call-expression": "^7.25.9",
+        "@babel/traverse": "^7.26.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
+      "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.25.9",
+        "@babel/types": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
     "node_modules/@babel/helper-string-parser": {
       "version": "7.25.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
@@ -1046,6 +1328,30 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@babel/helper-validator-option": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+      "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers": {
+      "version": "7.26.7",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz",
+      "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/template": "^7.25.9",
+        "@babel/types": "^7.26.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
     "node_modules/@babel/parser": {
       "version": "7.26.8",
       "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz",
@@ -1061,6 +1367,165 @@
         "node": ">=6.0.0"
       }
     },
+    "node_modules/@babel/plugin-proposal-decorators": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz",
+      "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.25.9",
+        "@babel/helper-plugin-utils": "^7.25.9",
+        "@babel/plugin-syntax-decorators": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-decorators": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz",
+      "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-attributes": {
+      "version": "7.26.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
+      "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-import-meta": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-jsx": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+      "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-typescript": {
+      "version": "7.25.9",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
+      "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-typescript": {
+      "version": "7.26.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz",
+      "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.25.9",
+        "@babel/helper-create-class-features-plugin": "^7.25.9",
+        "@babel/helper-plugin-utils": "^7.26.5",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+        "@babel/plugin-syntax-typescript": "^7.25.9"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/template": {
+      "version": "7.26.8",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz",
+      "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.26.2",
+        "@babel/parser": "^7.26.8",
+        "@babel/types": "^7.26.8"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse": {
+      "version": "7.26.8",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz",
+      "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.26.2",
+        "@babel/generator": "^7.26.8",
+        "@babel/parser": "^7.26.8",
+        "@babel/template": "^7.26.8",
+        "@babel/types": "^7.26.8",
+        "debug": "^4.3.1",
+        "globals": "^11.1.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse/node_modules/globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/@babel/types": {
       "version": "7.26.8",
       "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz",
@@ -1847,12 +2312,58 @@
         "url": "https://github.com/sponsors/nzakas"
       }
     },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.8",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+      "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/set-array": "^1.2.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
     "node_modules/@jridgewell/sourcemap-codec": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
       "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
       "license": "MIT"
     },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
     "node_modules/@jsdevtools/ono": {
       "version": "7.1.3",
       "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz",
@@ -2227,6 +2738,13 @@
         "url": "https://opencollective.com/unts"
       }
     },
+    "node_modules/@polka/url": {
+      "version": "1.0.0-next.28",
+      "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz",
+      "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/@popperjs/core": {
       "version": "2.11.8",
       "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
@@ -2569,6 +3087,26 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/@sec-ant/readable-stream": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
+      "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@sindresorhus/merge-streams": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
+      "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/@smithy/abort-controller": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.1.tgz",
@@ -3320,6 +3858,13 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/@types/gensync": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz",
+      "integrity": "sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/@types/hammerjs": {
       "version": "2.0.46",
       "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz",
@@ -3614,6 +4159,57 @@
         "vscode-uri": "^3.0.8"
       }
     },
+    "node_modules/@vue/babel-helper-vue-transform-on": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz",
+      "integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/@vue/babel-plugin-jsx": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz",
+      "integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/plugin-syntax-jsx": "^7.24.7",
+        "@babel/template": "^7.25.0",
+        "@babel/traverse": "^7.25.6",
+        "@babel/types": "^7.25.6",
+        "@vue/babel-helper-vue-transform-on": "1.2.5",
+        "@vue/babel-plugin-resolve-type": "1.2.5",
+        "html-tags": "^3.3.1",
+        "svg-tags": "^1.0.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "@babel/core": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@vue/babel-plugin-resolve-type": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz",
+      "integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.24.7",
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.8",
+        "@babel/parser": "^7.25.6",
+        "@vue/compiler-sfc": "^3.5.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
     "node_modules/@vue/compiler-core": {
       "version": "3.5.13",
       "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz",
@@ -3664,25 +4260,69 @@
         "@vue/shared": "3.5.13"
       }
     },
-    "node_modules/@vue/compiler-vue2": {
-      "version": "2.7.16",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz",
-      "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==",
+    "node_modules/@vue/compiler-vue2": {
+      "version": "2.7.16",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz",
+      "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "de-indent": "^1.0.2",
+        "he": "^1.2.0"
+      }
+    },
+    "node_modules/@vue/devtools-api": {
+      "version": "7.7.1",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.1.tgz",
+      "integrity": "sha512-Cexc8GimowoDkJ6eNelOPdYIzsu2mgNyp0scOQ3tiaYSb9iok6LOESSsJvHaI+ib3joRfqRJNLkHFjhNuWA5dg==",
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-kit": "^7.7.1"
+      }
+    },
+    "node_modules/@vue/devtools-core": {
+      "version": "7.7.1",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.1.tgz",
+      "integrity": "sha512-W4CRrSZJodNIfrPO7/dXF6ZS0QyOY6PCYVhpSoTSx9+nh2wpZxcS1482lAdKM0FTlaoApHV6jXT95Me90hSaBA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-kit": "^7.7.1",
+        "@vue/devtools-shared": "^7.7.1",
+        "mitt": "^3.0.1",
+        "nanoid": "^5.0.9",
+        "pathe": "^2.0.2",
+        "vite-hot-client": "^0.2.4"
+      },
+      "peerDependencies": {
+        "vue": "^3.0.0"
+      }
+    },
+    "node_modules/@vue/devtools-core/node_modules/nanoid": {
+      "version": "5.0.9",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz",
+      "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==",
       "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
       "license": "MIT",
-      "dependencies": {
-        "de-indent": "^1.0.2",
-        "he": "^1.2.0"
+      "bin": {
+        "nanoid": "bin/nanoid.js"
+      },
+      "engines": {
+        "node": "^18 || >=20"
       }
     },
-    "node_modules/@vue/devtools-api": {
-      "version": "7.7.1",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.1.tgz",
-      "integrity": "sha512-Cexc8GimowoDkJ6eNelOPdYIzsu2mgNyp0scOQ3tiaYSb9iok6LOESSsJvHaI+ib3joRfqRJNLkHFjhNuWA5dg==",
-      "license": "MIT",
-      "dependencies": {
-        "@vue/devtools-kit": "^7.7.1"
-      }
+    "node_modules/@vue/devtools-core/node_modules/pathe": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+      "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@vue/devtools-kit": {
       "version": "7.7.1",
@@ -4222,6 +4862,39 @@
         "pako": "~1.0.5"
       }
     },
+    "node_modules/browserslist": {
+      "version": "4.24.4",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+      "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "caniuse-lite": "^1.0.30001688",
+        "electron-to-chromium": "^1.5.73",
+        "node-releases": "^2.0.19",
+        "update-browserslist-db": "^1.1.1"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      }
+    },
     "node_modules/buffer": {
       "version": "5.6.0",
       "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
@@ -4246,6 +4919,22 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/bundle-name": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
+      "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "run-applescript": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/c12": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/c12/-/c12-2.0.1.tgz",
@@ -4333,6 +5022,27 @@
         "node": ">=6"
       }
     },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001699",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz",
+      "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "CC-BY-4.0"
+    },
     "node_modules/chalk": {
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -4505,6 +5215,13 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/convert-source-map": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/copy-anything": {
       "version": "3.0.5",
       "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
@@ -4680,6 +5397,36 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/default-browser": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
+      "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "bundle-name": "^4.1.0",
+        "default-browser-id": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/default-browser-id": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
+      "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/define-data-property": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
@@ -4698,6 +5445,19 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/define-lazy-prop": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+      "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/define-properties": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
@@ -4833,6 +5593,13 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/electron-to-chromium": {
+      "version": "1.5.97",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.97.tgz",
+      "integrity": "sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ==",
+      "dev": true,
+      "license": "ISC"
+    },
     "node_modules/elliptic": {
       "version": "6.6.1",
       "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz",
@@ -4868,6 +5635,16 @@
         "url": "https://github.com/fb55/entities?sponsor=1"
       }
     },
+    "node_modules/error-stack-parser-es": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz",
+      "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
     "node_modules/es-define-property": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
@@ -4939,6 +5716,16 @@
         "@esbuild/win32-x64": "0.24.2"
       }
     },
+    "node_modules/escalade": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/escape-string-regexp": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -5289,6 +6076,33 @@
         "safe-buffer": "^5.1.1"
       }
     },
+    "node_modules/execa": {
+      "version": "9.5.2",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.2.tgz",
+      "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@sindresorhus/merge-streams": "^4.0.0",
+        "cross-spawn": "^7.0.3",
+        "figures": "^6.1.0",
+        "get-stream": "^9.0.0",
+        "human-signals": "^8.0.0",
+        "is-plain-obj": "^4.1.0",
+        "is-stream": "^4.0.1",
+        "npm-run-path": "^6.0.0",
+        "pretty-ms": "^9.0.0",
+        "signal-exit": "^4.1.0",
+        "strip-final-newline": "^4.0.0",
+        "yoctocolors": "^2.0.0"
+      },
+      "engines": {
+        "node": "^18.19.0 || >=20.5.0"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
+      }
+    },
     "node_modules/fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -5394,6 +6208,22 @@
         "reusify": "^1.0.4"
       }
     },
+    "node_modules/figures": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz",
+      "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-unicode-supported": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/file-entry-cache": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
@@ -5519,6 +6349,21 @@
         "node": ">= 6"
       }
     },
+    "node_modules/fs-extra": {
+      "version": "11.3.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
+      "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=14.14"
+      }
+    },
     "node_modules/fs-minipass": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
@@ -5569,6 +6414,16 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
     "node_modules/get-intrinsic": {
       "version": "1.2.7",
       "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
@@ -5606,6 +6461,23 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/get-stream": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz",
+      "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@sec-ant/readable-stream": "^0.4.1",
+        "is-stream": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/giget": {
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.4.tgz",
@@ -5671,6 +6543,13 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "dev": true,
+      "license": "ISC"
+    },
     "node_modules/graphemer": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
@@ -5835,6 +6714,19 @@
       "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
       "license": "MIT"
     },
+    "node_modules/html-tags": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
+      "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/https-browserify": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
@@ -5842,6 +6734,16 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/human-signals": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz",
+      "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=18.18.0"
+      }
+    },
     "node_modules/idb-keyval": {
       "version": "6.2.1",
       "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz",
@@ -5964,6 +6866,22 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/is-docker": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+      "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "is-docker": "cli.js"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/is-extglob": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -6006,6 +6924,25 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/is-inside-container": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+      "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-docker": "^3.0.0"
+      },
+      "bin": {
+        "is-inside-container": "cli.js"
+      },
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/is-nan": {
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
@@ -6033,6 +6970,19 @@
         "node": ">=0.12.0"
       }
     },
+    "node_modules/is-plain-obj": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+      "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/is-regex": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
@@ -6052,6 +7002,19 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/is-stream": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
+      "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/is-typed-array": {
       "version": "1.1.15",
       "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
@@ -6068,16 +7031,45 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/is-unicode-supported": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+      "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/is-what": {
       "version": "4.1.16",
       "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
       "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
       "license": "MIT",
       "engines": {
-        "node": ">=12.13"
+        "node": ">=12.13"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/is-wsl": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
+      "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-inside-container": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=16"
       },
       "funding": {
-        "url": "https://github.com/sponsors/mesqueeb"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/isarray": {
@@ -6114,6 +7106,13 @@
         "jiti": "lib/jiti-cli.mjs"
       }
     },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/js-yaml": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
@@ -6127,6 +7126,19 @@
         "js-yaml": "bin/js-yaml.js"
       }
     },
+    "node_modules/jsesc": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+      "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/json-buffer": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
@@ -6147,6 +7159,32 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "dev": true,
+      "license": "MIT",
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "universalify": "^2.0.0"
+      },
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
     "node_modules/keyv": {
       "version": "4.5.4",
       "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -6157,6 +7195,13 @@
         "json-buffer": "3.0.1"
       }
     },
+    "node_modules/kolorist": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz",
+      "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/levn": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -6201,6 +7246,23 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dev": true,
+      "license": "ISC",
+      "dependencies": {
+        "yallist": "^3.0.2"
+      }
+    },
+    "node_modules/lru-cache/node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "dev": true,
+      "license": "ISC"
+    },
     "node_modules/magic-string": {
       "version": "0.30.17",
       "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
@@ -6415,6 +7477,16 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/mrmime": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz",
+      "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/ms": {
       "version": "2.1.3",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -6476,6 +7548,13 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/node-releases": {
+      "version": "2.0.19",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+      "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+      "dev": true,
+      "license": "MIT"
+    },
     "node_modules/node-stdlib-browser": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.3.1.tgz",
@@ -6540,6 +7619,36 @@
         "ieee754": "^1.1.13"
       }
     },
+    "node_modules/npm-run-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz",
+      "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^4.0.0",
+        "unicorn-magic": "^0.3.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/npm-run-path/node_modules/path-key": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+      "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/nth-check": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
@@ -6648,6 +7757,25 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/open": {
+      "version": "10.1.0",
+      "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz",
+      "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "default-browser": "^5.2.1",
+        "define-lazy-prop": "^3.0.0",
+        "is-inside-container": "^1.0.0",
+        "is-wsl": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/optionator": {
       "version": "0.9.4",
       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
@@ -6743,6 +7871,19 @@
         "node": ">= 0.10"
       }
     },
+    "node_modules/parse-ms": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz",
+      "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/path-browserify": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
@@ -6970,6 +8111,22 @@
         "node": ">=6.0.0"
       }
     },
+    "node_modules/pretty-ms": {
+      "version": "9.2.0",
+      "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz",
+      "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "parse-ms": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/process": {
       "version": "0.11.10",
       "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@@ -7235,6 +8392,19 @@
         "fsevents": "~2.3.2"
       }
     },
+    "node_modules/run-applescript": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
+      "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/run-parallel": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -7489,6 +8659,34 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/signal-exit": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+      "dev": true,
+      "license": "ISC",
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/sirv": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz",
+      "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@polka/url": "^1.0.0-next.24",
+        "mrmime": "^2.0.0",
+        "totalist": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/sortablejs": {
       "version": "1.15.6",
       "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz",
@@ -7555,6 +8753,19 @@
         "safe-buffer": "~5.2.0"
       }
     },
+    "node_modules/strip-final-newline": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz",
+      "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/strip-json-comments": {
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -7612,6 +8823,12 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/svg-tags": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+      "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
+      "dev": true
+    },
     "node_modules/synckit": {
       "version": "0.9.2",
       "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
@@ -7680,6 +8897,16 @@
         "node": ">=8.0"
       }
     },
+    "node_modules/totalist": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
+      "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/ts-api-utils": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz",
@@ -7797,6 +9024,60 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/unicorn-magic": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
+      "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/universalify": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+      "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10.0.0"
+      }
+    },
+    "node_modules/update-browserslist-db": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
+      "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "escalade": "^3.2.0",
+        "picocolors": "^1.1.1"
+      },
+      "bin": {
+        "update-browserslist-db": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
+      }
+    },
     "node_modules/uri-js": {
       "version": "4.4.1",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -7936,6 +9217,51 @@
         }
       }
     },
+    "node_modules/vite-hot-client": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-0.2.4.tgz",
+      "integrity": "sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==",
+      "dev": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-inspect": {
+      "version": "0.8.9",
+      "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz",
+      "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@antfu/utils": "^0.7.10",
+        "@rollup/pluginutils": "^5.1.3",
+        "debug": "^4.3.7",
+        "error-stack-parser-es": "^0.1.5",
+        "fs-extra": "^11.2.0",
+        "open": "^10.1.0",
+        "perfect-debounce": "^1.0.0",
+        "picocolors": "^1.1.1",
+        "sirv": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1"
+      },
+      "peerDependenciesMeta": {
+        "@nuxt/kit": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/vite-plugin-node-polyfills": {
       "version": "0.23.0",
       "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.23.0.tgz",
@@ -7953,6 +9279,49 @@
         "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0"
       }
     },
+    "node_modules/vite-plugin-vue-devtools": {
+      "version": "7.7.1",
+      "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.7.1.tgz",
+      "integrity": "sha512-f1Fnda4CJYH7t7K1WaTEjFTLdF4oUkmlZTVwBGG5UhJ+Oa5KPX0Ue32c+YWRMOpCtFbCDl1iXGgQVzg8Ew5JnQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@vue/devtools-core": "^7.7.1",
+        "@vue/devtools-kit": "^7.7.1",
+        "@vue/devtools-shared": "^7.7.1",
+        "execa": "^9.5.1",
+        "sirv": "^3.0.0",
+        "vite-plugin-inspect": "0.8.9",
+        "vite-plugin-vue-inspector": "^5.3.1"
+      },
+      "engines": {
+        "node": ">=v14.21.3"
+      },
+      "peerDependencies": {
+        "vite": "^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0"
+      }
+    },
+    "node_modules/vite-plugin-vue-inspector": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.1.tgz",
+      "integrity": "sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "^7.23.0",
+        "@babel/plugin-proposal-decorators": "^7.23.0",
+        "@babel/plugin-syntax-import-attributes": "^7.22.5",
+        "@babel/plugin-syntax-import-meta": "^7.10.4",
+        "@babel/plugin-transform-typescript": "^7.22.15",
+        "@vue/babel-plugin-jsx": "^1.1.5",
+        "@vue/compiler-dom": "^3.3.4",
+        "kolorist": "^1.8.0",
+        "magic-string": "^0.30.4"
+      },
+      "peerDependencies": {
+        "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0"
+      }
+    },
     "node_modules/vm-browserify": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
@@ -8198,6 +9567,19 @@
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
+    },
+    "node_modules/yoctocolors": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz",
+      "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==",
+      "dev": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
     }
   }
 }
diff --git a/package.json b/package.json
index 1a3c1cf..f493ba0 100644
--- a/package.json
+++ b/package.json
@@ -60,6 +60,7 @@
     "typescript": "~5.7.0",
     "vite": "~6.1.0",
     "vite-plugin-node-polyfills": "^0.23.0",
-    "vue-tsc": "~2.2.0"
+    "vue-tsc": "~2.2.0",
+    "vite-plugin-vue-devtools": "^7.7.0"
   }
 }
diff --git a/public/robots.txt b/public/robots.txt
index 425b900..4737bcc 100644
--- a/public/robots.txt
+++ b/public/robots.txt
@@ -1,3 +1,7 @@
 User-agent: *
 Disallow: /dashboard
+Allow: /
+Allow: /imprint
+Allow: /privacy
+Allow: /terms
 Allow: /login
diff --git a/vite.config.ts b/vite.config.ts
index 0f089af..b646b68 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,5 +1,6 @@
 import { fileURLToPath, URL } from "node:url";
 import { nodePolyfills } from "vite-plugin-node-polyfills";
+import vueDevTools from "vite-plugin-vue-devtools";
 
 import { defineConfig } from "vite";
 import vue from "@vitejs/plugin-vue";
@@ -16,6 +17,7 @@ export default defineConfig({
   },
   plugins: [
     vue(),
+    vueDevTools(),
     nodePolyfills({
       // To add only specific polyfills, add them here. If no option is passed, adds all polyfills
       include: ["buffer", "util", "stream", "process"],
-- 
GitLab


From ef14a0bb1b78bd88a8e6b33d778f8fbb96212bb4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Wed, 12 Feb 2025 16:18:28 +0000
Subject: [PATCH 16/25] Update pinia to exclude dev-tools from build artifacts

#191
---
 package-lock.json | 52 +++++++++++++++++++++++------------------------
 1 file changed, 26 insertions(+), 26 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 681e9fc..e075511 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4272,23 +4272,23 @@
       }
     },
     "node_modules/@vue/devtools-api": {
-      "version": "7.7.1",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.1.tgz",
-      "integrity": "sha512-Cexc8GimowoDkJ6eNelOPdYIzsu2mgNyp0scOQ3tiaYSb9iok6LOESSsJvHaI+ib3joRfqRJNLkHFjhNuWA5dg==",
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.2.tgz",
+      "integrity": "sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==",
       "license": "MIT",
       "dependencies": {
-        "@vue/devtools-kit": "^7.7.1"
+        "@vue/devtools-kit": "^7.7.2"
       }
     },
     "node_modules/@vue/devtools-core": {
-      "version": "7.7.1",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.1.tgz",
-      "integrity": "sha512-W4CRrSZJodNIfrPO7/dXF6ZS0QyOY6PCYVhpSoTSx9+nh2wpZxcS1482lAdKM0FTlaoApHV6jXT95Me90hSaBA==",
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.2.tgz",
+      "integrity": "sha512-lexREWj1lKi91Tblr38ntSsy6CvI8ba7u+jmwh2yruib/ltLUcsIzEjCnrkh1yYGGIKXbAuYV2tOG10fGDB9OQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vue/devtools-kit": "^7.7.1",
-        "@vue/devtools-shared": "^7.7.1",
+        "@vue/devtools-kit": "^7.7.2",
+        "@vue/devtools-shared": "^7.7.2",
         "mitt": "^3.0.1",
         "nanoid": "^5.0.9",
         "pathe": "^2.0.2",
@@ -4325,12 +4325,12 @@
       "license": "MIT"
     },
     "node_modules/@vue/devtools-kit": {
-      "version": "7.7.1",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.1.tgz",
-      "integrity": "sha512-yhZ4NPnK/tmxGtLNQxmll90jIIXdb2jAhPF76anvn5M/UkZCiLJy28bYgPIACKZ7FCosyKoaope89/RsFJll1w==",
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.2.tgz",
+      "integrity": "sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==",
       "license": "MIT",
       "dependencies": {
-        "@vue/devtools-shared": "^7.7.1",
+        "@vue/devtools-shared": "^7.7.2",
         "birpc": "^0.2.19",
         "hookable": "^5.5.3",
         "mitt": "^3.0.1",
@@ -4340,9 +4340,9 @@
       }
     },
     "node_modules/@vue/devtools-shared": {
-      "version": "7.7.1",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.1.tgz",
-      "integrity": "sha512-BtgF7kHq4BHG23Lezc/3W2UhK2ga7a8ohAIAGJMBr4BkxUFzhqntQtCiuL1ijo2ztWnmusymkirgqUrXoQKumA==",
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz",
+      "integrity": "sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==",
       "license": "MIT",
       "dependencies": {
         "rfdc": "^1.4.1"
@@ -7968,12 +7968,12 @@
       }
     },
     "node_modules/pinia": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.0.tgz",
-      "integrity": "sha512-Go23UsqaeABb4OYNmpDkE9VwDnqmbbjGzWpQhi3xfNkSPO6ZP+Ttt0EMo2J4DHXW+T0l3EqRneeXdyV/oJg/Mg==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.1.tgz",
+      "integrity": "sha512-WXglsDzztOTH6IfcJ99ltYZin2mY8XZCXujkYWVIJlBjqsP6ST7zw+Aarh63E1cDVYeyUcPCxPHzJpEOmzB6Wg==",
       "license": "MIT",
       "dependencies": {
-        "@vue/devtools-api": "^7.7.1"
+        "@vue/devtools-api": "^7.7.2"
       },
       "funding": {
         "url": "https://github.com/sponsors/posva"
@@ -9280,15 +9280,15 @@
       }
     },
     "node_modules/vite-plugin-vue-devtools": {
-      "version": "7.7.1",
-      "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.7.1.tgz",
-      "integrity": "sha512-f1Fnda4CJYH7t7K1WaTEjFTLdF4oUkmlZTVwBGG5UhJ+Oa5KPX0Ue32c+YWRMOpCtFbCDl1iXGgQVzg8Ew5JnQ==",
+      "version": "7.7.2",
+      "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.7.2.tgz",
+      "integrity": "sha512-5V0UijQWiSBj32blkyPEqIbzc6HO9c1bwnBhx+ay2dzU0FakH+qMdNUT8nF9BvDE+i6I1U8CqCuJiO20vKEdQw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vue/devtools-core": "^7.7.1",
-        "@vue/devtools-kit": "^7.7.1",
-        "@vue/devtools-shared": "^7.7.1",
+        "@vue/devtools-core": "^7.7.2",
+        "@vue/devtools-kit": "^7.7.2",
+        "@vue/devtools-shared": "^7.7.2",
         "execa": "^9.5.1",
         "sirv": "^3.0.0",
         "vite-plugin-inspect": "0.8.9",
-- 
GitLab


From 47eee9e96033ebce357cc005bbf480f54ed171ed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Fri, 14 Feb 2025 08:35:03 +0000
Subject: [PATCH 17/25] Add canonical URLs to improve SEO

#191
---
 .gitignore                      |  1 +
 src/views/HomeView.vue          | 11 ++++++++++-
 src/views/ImprintView.vue       | 15 ++++++++++++++-
 src/views/LoginView.vue         | 11 ++++++++++-
 src/views/PrivacyPolicyView.vue | 13 ++++++++++++-
 src/views/TermsOfUsageView.vue  | 15 ++++++++++++++-
 6 files changed, 61 insertions(+), 5 deletions(-)

diff --git a/.gitignore b/.gitignore
index 4ee9e22..762a2ec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,4 @@ coverage
 
 public/env.js
 public/google*.html
+public/sitemap.txt
diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue
index 5547935..e8dda7d 100644
--- a/src/views/HomeView.vue
+++ b/src/views/HomeView.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { computed, onBeforeMount, onMounted } from "vue";
+import { computed, onBeforeMount, onBeforeUnmount, onMounted } from "vue";
 import { useRouter } from "vue-router";
 import { useUserStore, useWorkflowStore } from "@/stores";
 import BootstrapCard from "@/components/BootstrapCard.vue";
@@ -14,6 +14,11 @@ onBeforeMount(() => {
   if (authRepo.authenticated) {
     // If user is authenticated redirect him to the dashboard
     router.push({ name: "dashboard" });
+  } else {
+    const linkTag = document.createElement("link");
+    linkTag.setAttribute("rel", "canonical");
+    linkTag.href = window.location.origin + window.location.pathname;
+    document.head.appendChild(linkTag);
   }
 });
 
@@ -32,6 +37,10 @@ function repositoryCommitUrl(workflow: PublicWorkflowOut) {
 onMounted(() => {
   workflowRepository.fetchPublicWorkflows();
 });
+
+onBeforeUnmount(() => {
+  document.head.querySelector("[rel=canonical]")?.remove();
+});
 </script>
 
 <template>
diff --git a/src/views/ImprintView.vue b/src/views/ImprintView.vue
index dd22f4f..7030a46 100644
--- a/src/views/ImprintView.vue
+++ b/src/views/ImprintView.vue
@@ -1,4 +1,17 @@
-<script setup lang="ts"></script>
+<script setup lang="ts">
+import { onBeforeMount, onBeforeUnmount } from "vue";
+
+onBeforeMount(() => {
+  const linkTag = document.createElement("link");
+  linkTag.setAttribute("rel", "canonical");
+  linkTag.href = window.location.origin + window.location.pathname;
+  document.head.appendChild(linkTag);
+});
+
+onBeforeUnmount(() => {
+  document.head.querySelector("[rel=canonical]")?.remove();
+});
+</script>
 
 <template>
   <h2>Information according to §5 DDG (Digitale-Dienste-Gesetz)</h2>
diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue
index c24cab0..e7cd86a 100644
--- a/src/views/LoginView.vue
+++ b/src/views/LoginView.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { onBeforeMount, onMounted } from "vue";
+import { onBeforeMount, onBeforeUnmount, onMounted } from "vue";
 import { useUserStore } from "@/stores/users";
 import { useRouter } from "vue-router";
 import { Toast } from "bootstrap";
@@ -27,9 +27,18 @@ onBeforeMount(() => {
   if (store.authenticated) {
     // If user is authenticated redirect him to the dashboard
     router.push({ name: "dashboard" });
+  } else {
+    const linkTag = document.createElement("link");
+    linkTag.setAttribute("rel", "canonical");
+    linkTag.href = window.location.origin + window.location.pathname;
+    document.head.appendChild(linkTag);
   }
 });
 
+onBeforeUnmount(() => {
+  document.head.querySelector("[rel=canonical]")?.remove();
+});
+
 function loginPath(provider: OidcProvider): string {
   const config: AuthKickstartLoginData = {
     url: "/auth/login/{provider}",
diff --git a/src/views/PrivacyPolicyView.vue b/src/views/PrivacyPolicyView.vue
index 14e0042..3a41255 100644
--- a/src/views/PrivacyPolicyView.vue
+++ b/src/views/PrivacyPolicyView.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { onMounted } from "vue";
+import { onBeforeMount, onBeforeUnmount, onMounted } from "vue";
 import { environment } from "@/environment";
 
 onMounted(() => {
@@ -12,6 +12,17 @@ onMounted(() => {
     document.head.appendChild(matomoScript);
   }
 });
+
+onBeforeMount(() => {
+  const linkTag = document.createElement("link");
+  linkTag.setAttribute("rel", "canonical");
+  linkTag.href = window.location.origin + window.location.pathname;
+  document.head.appendChild(linkTag);
+});
+
+onBeforeUnmount(() => {
+  document.head.querySelector("[rel=canonical]")?.remove();
+});
 </script>
 
 <template>
diff --git a/src/views/TermsOfUsageView.vue b/src/views/TermsOfUsageView.vue
index 0c05031..94a3aa0 100644
--- a/src/views/TermsOfUsageView.vue
+++ b/src/views/TermsOfUsageView.vue
@@ -1,4 +1,17 @@
-<script setup lang="ts"></script>
+<script setup lang="ts">
+import { onBeforeMount, onBeforeUnmount } from "vue";
+
+onBeforeMount(() => {
+  const linkTag = document.createElement("link");
+  linkTag.setAttribute("rel", "canonical");
+  linkTag.href = window.location.origin + window.location.pathname;
+  document.head.appendChild(linkTag);
+});
+
+onBeforeUnmount(() => {
+  document.head.querySelector("[rel=canonical]")?.remove();
+});
+</script>
 
 <template>
   <h2>Terms of Use</h2>
-- 
GitLab


From 092cc2fbf65f0ed9afb26f390143fb2d8a167db6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Thu, 20 Feb 2025 08:30:11 +0000
Subject: [PATCH 18/25] Show connected accounts in user admin view

#191
---
 package-lock.json                  | 577 ++++++++++++++---------------
 public/robots.txt                  |   4 +-
 src/components/BootstrapCard.vue   |   8 +-
 src/views/admin/AdminUsersView.vue |  20 +-
 src/views/user/ProfileView.vue     |   4 +-
 5 files changed, 313 insertions(+), 300 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e075511..a68aa65 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1079,23 +1079,22 @@
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz",
-      "integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz",
+      "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
         "@babel/code-frame": "^7.26.2",
-        "@babel/generator": "^7.26.8",
+        "@babel/generator": "^7.26.9",
         "@babel/helper-compilation-targets": "^7.26.5",
         "@babel/helper-module-transforms": "^7.26.0",
-        "@babel/helpers": "^7.26.7",
-        "@babel/parser": "^7.26.8",
-        "@babel/template": "^7.26.8",
-        "@babel/traverse": "^7.26.8",
-        "@babel/types": "^7.26.8",
-        "@types/gensync": "^1.0.0",
+        "@babel/helpers": "^7.26.9",
+        "@babel/parser": "^7.26.9",
+        "@babel/template": "^7.26.9",
+        "@babel/traverse": "^7.26.9",
+        "@babel/types": "^7.26.9",
         "convert-source-map": "^2.0.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
@@ -1121,14 +1120,14 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz",
-      "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz",
+      "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/parser": "^7.26.8",
-        "@babel/types": "^7.26.8",
+        "@babel/parser": "^7.26.9",
+        "@babel/types": "^7.26.9",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^3.0.2"
@@ -1178,18 +1177,18 @@
       }
     },
     "node_modules/@babel/helper-create-class-features-plugin": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
-      "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz",
+      "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/helper-annotate-as-pure": "^7.25.9",
         "@babel/helper-member-expression-to-functions": "^7.25.9",
         "@babel/helper-optimise-call-expression": "^7.25.9",
-        "@babel/helper-replace-supers": "^7.25.9",
+        "@babel/helper-replace-supers": "^7.26.5",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
-        "@babel/traverse": "^7.25.9",
+        "@babel/traverse": "^7.26.9",
         "semver": "^6.3.1"
       },
       "engines": {
@@ -1339,26 +1338,26 @@
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.26.7",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz",
-      "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz",
+      "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@babel/template": "^7.25.9",
-        "@babel/types": "^7.26.7"
+        "@babel/template": "^7.26.9",
+        "@babel/types": "^7.26.9"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz",
-      "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz",
+      "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==",
       "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.26.8"
+        "@babel/types": "^7.26.9"
       },
       "bin": {
         "parser": "bin/babel-parser.js"
@@ -1483,32 +1482,32 @@
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz",
-      "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
+      "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.26.2",
-        "@babel/parser": "^7.26.8",
-        "@babel/types": "^7.26.8"
+        "@babel/parser": "^7.26.9",
+        "@babel/types": "^7.26.9"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz",
-      "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz",
+      "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.26.2",
-        "@babel/generator": "^7.26.8",
-        "@babel/parser": "^7.26.8",
-        "@babel/template": "^7.26.8",
-        "@babel/types": "^7.26.8",
+        "@babel/generator": "^7.26.9",
+        "@babel/parser": "^7.26.9",
+        "@babel/template": "^7.26.9",
+        "@babel/types": "^7.26.9",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
@@ -1527,9 +1526,9 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.26.8",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz",
-      "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==",
+      "version": "7.26.9",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz",
+      "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-string-parser": "^7.25.9",
@@ -2156,32 +2155,19 @@
       }
     },
     "node_modules/@eslint/plugin-kit": {
-      "version": "0.2.5",
-      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz",
-      "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==",
+      "version": "0.2.6",
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.6.tgz",
+      "integrity": "sha512-+0TjwR1eAUdZtvv/ir1mGX+v0tUoR3VEPB8Up0LLJC+whRW0GgBBtpbOkg/a/U4Dxa6l5a3l9AJ1aWIQVyoWJA==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "@eslint/core": "^0.10.0",
+        "@eslint/core": "^0.11.0",
         "levn": "^0.4.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
-    "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz",
-      "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@types/json-schema": "^7.0.15"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      }
-    },
     "node_modules/@fortawesome/fontawesome-free": {
       "version": "6.7.2",
       "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz",
@@ -2222,9 +2208,9 @@
       }
     },
     "node_modules/@hey-api/openapi-ts": {
-      "version": "0.64.3",
-      "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.64.3.tgz",
-      "integrity": "sha512-V/7KUq59T9uu4QXMminBlqWqoVqLggDSakRdHuJX+QRSkMUhso1d4QuMEzQcvaKt0uMQdHktPd1bdc2k5puH+g==",
+      "version": "0.64.5",
+      "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.64.5.tgz",
+      "integrity": "sha512-Vl6QQbkb+TXPG/ihobCPj/13KFJPfnjTVljno+T18L2ywL8cRHDFYqi5356ktBixBuwK2cSJvKzxYR6TIMq+AA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2299,9 +2285,9 @@
       }
     },
     "node_modules/@humanwhocodes/retry": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
-      "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz",
+      "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -2815,9 +2801,9 @@
       }
     },
     "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.6.tgz",
-      "integrity": "sha512-+GcCXtOQoWuC7hhX1P00LqjjIiS/iOouHXhMdiDSnq/1DGTox4SpUvO52Xm+div6+106r+TcvOeo/cxvyEyTgg==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz",
+      "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==",
       "cpu": [
         "arm"
       ],
@@ -2829,9 +2815,9 @@
       ]
     },
     "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.6.tgz",
-      "integrity": "sha512-E8+2qCIjciYUnCa1AiVF1BkRgqIGW9KzJeesQqVfyRITGQN+dFuoivO0hnro1DjT74wXLRZ7QF8MIbz+luGaJA==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz",
+      "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==",
       "cpu": [
         "arm64"
       ],
@@ -2843,9 +2829,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.6.tgz",
-      "integrity": "sha512-z9Ib+OzqN3DZEjX7PDQMHEhtF+t6Mi2z/ueChQPLS/qUMKY7Ybn5A2ggFoKRNRh1q1T03YTQfBTQCJZiepESAg==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz",
+      "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==",
       "cpu": [
         "arm64"
       ],
@@ -2857,9 +2843,9 @@
       ]
     },
     "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.6.tgz",
-      "integrity": "sha512-PShKVY4u0FDAR7jskyFIYVyHEPCPnIQY8s5OcXkdU8mz3Y7eXDJPdyM/ZWjkYdR2m0izD9HHWA8sGcXn+Qrsyg==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz",
+      "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==",
       "cpu": [
         "x64"
       ],
@@ -2871,9 +2857,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.6.tgz",
-      "integrity": "sha512-YSwyOqlDAdKqs0iKuqvRHLN4SrD2TiswfoLfvYXseKbL47ht1grQpq46MSiQAx6rQEN8o8URtpXARCpqabqxGQ==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz",
+      "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==",
       "cpu": [
         "arm64"
       ],
@@ -2885,9 +2871,9 @@
       ]
     },
     "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.6.tgz",
-      "integrity": "sha512-HEP4CgPAY1RxXwwL5sPFv6BBM3tVeLnshF03HMhJYCNc6kvSqBgTMmsEjb72RkZBAWIqiPUyF1JpEBv5XT9wKQ==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz",
+      "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==",
       "cpu": [
         "x64"
       ],
@@ -2899,9 +2885,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.6.tgz",
-      "integrity": "sha512-88fSzjC5xeH9S2Vg3rPgXJULkHcLYMkh8faix8DX4h4TIAL65ekwuQMA/g2CXq8W+NJC43V6fUpYZNjaX3+IIg==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz",
+      "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==",
       "cpu": [
         "arm"
       ],
@@ -2913,9 +2899,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.6.tgz",
-      "integrity": "sha512-wM4ztnutBqYFyvNeR7Av+reWI/enK9tDOTKNF+6Kk2Q96k9bwhDDOlnCUNRPvromlVXo04riSliMBs/Z7RteEg==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz",
+      "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==",
       "cpu": [
         "arm"
       ],
@@ -2927,9 +2913,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.6.tgz",
-      "integrity": "sha512-9RyprECbRa9zEjXLtvvshhw4CMrRa3K+0wcp3KME0zmBe1ILmvcVHnypZ/aIDXpRyfhSYSuN4EPdCCj5Du8FIA==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz",
+      "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==",
       "cpu": [
         "arm64"
       ],
@@ -2941,9 +2927,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.6.tgz",
-      "integrity": "sha512-qTmklhCTyaJSB05S+iSovfo++EwnIEZxHkzv5dep4qoszUMX5Ca4WM4zAVUMbfdviLgCSQOu5oU8YoGk1s6M9Q==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz",
+      "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==",
       "cpu": [
         "arm64"
       ],
@@ -2955,9 +2941,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.6.tgz",
-      "integrity": "sha512-4Qmkaps9yqmpjY5pvpkfOerYgKNUGzQpFxV6rnS7c/JfYbDSU0y6WpbbredB5cCpLFGJEqYX40WUmxMkwhWCjw==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz",
+      "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==",
       "cpu": [
         "loong64"
       ],
@@ -2969,9 +2955,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.6.tgz",
-      "integrity": "sha512-Zsrtux3PuaxuBTX/zHdLaFmcofWGzaWW1scwLU3ZbW/X+hSsFbz9wDIp6XvnT7pzYRl9MezWqEqKy7ssmDEnuQ==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz",
+      "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==",
       "cpu": [
         "ppc64"
       ],
@@ -2983,9 +2969,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.6.tgz",
-      "integrity": "sha512-aK+Zp+CRM55iPrlyKiU3/zyhgzWBxLVrw2mwiQSYJRobCURb781+XstzvA8Gkjg/hbdQFuDw44aUOxVQFycrAg==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz",
+      "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==",
       "cpu": [
         "riscv64"
       ],
@@ -2997,9 +2983,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.6.tgz",
-      "integrity": "sha512-WoKLVrY9ogmaYPXwTH326+ErlCIgMmsoRSx6bO+l68YgJnlOXhygDYSZe/qbUJCSiCiZAQ+tKm88NcWuUXqOzw==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz",
+      "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==",
       "cpu": [
         "s390x"
       ],
@@ -3011,9 +2997,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.6.tgz",
-      "integrity": "sha512-Sht4aFvmA4ToHd2vFzwMFaQCiYm2lDFho5rPcvPBT5pCdC+GwHG6CMch4GQfmWTQ1SwRKS0dhDYb54khSrjDWw==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz",
+      "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==",
       "cpu": [
         "x64"
       ],
@@ -3025,9 +3011,9 @@
       ]
     },
     "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.6.tgz",
-      "integrity": "sha512-zmmpOQh8vXc2QITsnCiODCDGXFC8LMi64+/oPpPx5qz3pqv0s6x46ps4xoycfUiVZps5PFn1gksZzo4RGTKT+A==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz",
+      "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==",
       "cpu": [
         "x64"
       ],
@@ -3039,9 +3025,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.6.tgz",
-      "integrity": "sha512-3/q1qUsO/tLqGBaD4uXsB6coVGB3usxw3qyeVb59aArCgedSF66MPdgRStUd7vbZOsko/CgVaY5fo2vkvPLWiA==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz",
+      "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==",
       "cpu": [
         "arm64"
       ],
@@ -3053,9 +3039,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.6.tgz",
-      "integrity": "sha512-oLHxuyywc6efdKVTxvc0135zPrRdtYVjtVD5GUm55I3ODxhU/PwkQFD97z16Xzxa1Fz0AEe4W/2hzRtd+IfpOA==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz",
+      "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==",
       "cpu": [
         "ia32"
       ],
@@ -3067,9 +3053,9 @@
       ]
     },
     "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.6.tgz",
-      "integrity": "sha512-0PVwmgzZ8+TZ9oGBmdZoQVXflbvuwzN/HRclujpl4N/q3i+y0lqLw8n1bXA8ru3sApDjlmONaNAuYr38y1Kr9w==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz",
+      "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==",
       "cpu": [
         "x64"
       ],
@@ -3162,9 +3148,9 @@
       }
     },
     "node_modules/@smithy/core": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.2.tgz",
-      "integrity": "sha512-htwQXkbdF13uwwDevz9BEzL5ABK+1sJpVQXywwGSH973AVOvisHNfpcB8A8761G6XgHoS2kHPqc9DqHJ2gp+/Q==",
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.4.tgz",
+      "integrity": "sha512-wFExFGK+7r2wYriOqe7RRIBNpvxwiS95ih09+GSLRBdoyK/O1uZA7K7pKesj5CBvwJuSBeXwLyR88WwIAY+DGA==",
       "license": "Apache-2.0",
       "dependencies": {
         "@smithy/middleware-serde": "^4.0.2",
@@ -3172,7 +3158,7 @@
         "@smithy/types": "^4.1.0",
         "@smithy/util-body-length-browser": "^4.0.0",
         "@smithy/util-middleware": "^4.0.1",
-        "@smithy/util-stream": "^4.0.2",
+        "@smithy/util-stream": "^4.1.1",
         "@smithy/util-utf8": "^4.0.0",
         "tslib": "^2.6.2"
       },
@@ -3380,12 +3366,12 @@
       }
     },
     "node_modules/@smithy/middleware-endpoint": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.3.tgz",
-      "integrity": "sha512-YdbmWhQF5kIxZjWqPIgboVfi8i5XgiYMM7GGKFMTvBei4XjNQfNv8sukT50ITvgnWKKKpOtp0C0h7qixLgb77Q==",
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.5.tgz",
+      "integrity": "sha512-cPzGZV7qStHwboFrm6GfrzQE+YDiCzWcTh4+7wKrP/ZQ4gkw+r7qDjV8GjM4N0UYsuUyLfpzLGg5hxsYTU11WA==",
       "license": "Apache-2.0",
       "dependencies": {
-        "@smithy/core": "^3.1.2",
+        "@smithy/core": "^3.1.4",
         "@smithy/middleware-serde": "^4.0.2",
         "@smithy/node-config-provider": "^4.0.1",
         "@smithy/shared-ini-file-loader": "^4.0.1",
@@ -3399,15 +3385,15 @@
       }
     },
     "node_modules/@smithy/middleware-retry": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.4.tgz",
-      "integrity": "sha512-wmxyUBGHaYUqul0wZiset4M39SMtDBOtUr2KpDuftKNN74Do9Y36Go6Eqzj9tL0mIPpr31ulB5UUtxcsCeGXsQ==",
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.6.tgz",
+      "integrity": "sha512-s8QzuOQnbdvRymD9Gt9c9zMq10wUQAHQ3z72uirrBHCwZcLTrL5iCOuVTMdka2IXOYhQE890WD5t6G24+F+Qcg==",
       "license": "Apache-2.0",
       "dependencies": {
         "@smithy/node-config-provider": "^4.0.1",
         "@smithy/protocol-http": "^5.0.1",
         "@smithy/service-error-classification": "^4.0.1",
-        "@smithy/smithy-client": "^4.1.3",
+        "@smithy/smithy-client": "^4.1.5",
         "@smithy/types": "^4.1.0",
         "@smithy/util-middleware": "^4.0.1",
         "@smithy/util-retry": "^4.0.1",
@@ -3573,17 +3559,17 @@
       }
     },
     "node_modules/@smithy/smithy-client": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.3.tgz",
-      "integrity": "sha512-A2Hz85pu8BJJaYFdX8yb1yocqigyqBzn+OVaVgm+Kwi/DkN8vhN2kbDVEfADo6jXf5hPKquMLGA3UINA64UZ7A==",
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.5.tgz",
+      "integrity": "sha512-DMXYoYeL4QkElr216n1yodTFeATbfb4jwYM9gKn71Rw/FNA1/Sm36tkTSCsZEs7mgpG3OINmkxL9vgVFzyGPaw==",
       "license": "Apache-2.0",
       "dependencies": {
-        "@smithy/core": "^3.1.2",
-        "@smithy/middleware-endpoint": "^4.0.3",
+        "@smithy/core": "^3.1.4",
+        "@smithy/middleware-endpoint": "^4.0.5",
         "@smithy/middleware-stack": "^4.0.1",
         "@smithy/protocol-http": "^5.0.1",
         "@smithy/types": "^4.1.0",
-        "@smithy/util-stream": "^4.0.2",
+        "@smithy/util-stream": "^4.1.1",
         "tslib": "^2.6.2"
       },
       "engines": {
@@ -3680,13 +3666,13 @@
       }
     },
     "node_modules/@smithy/util-defaults-mode-browser": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.4.tgz",
-      "integrity": "sha512-Ej1bV5sbrIfH++KnWxjjzFNq9nyP3RIUq2c9Iqq7SmMO/idUR24sqvKH2LUQFTSPy/K7G4sB2m8n7YYlEAfZaw==",
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.6.tgz",
+      "integrity": "sha512-N8+VCt+piupH1A7DgSVDNrVHqRLz8r6DvBkpS7EWHiIxsUk4jqGuQLjqC/gnCzmwGkVBdNruHoYAzzaSQ8e80w==",
       "license": "Apache-2.0",
       "dependencies": {
         "@smithy/property-provider": "^4.0.1",
-        "@smithy/smithy-client": "^4.1.3",
+        "@smithy/smithy-client": "^4.1.5",
         "@smithy/types": "^4.1.0",
         "bowser": "^2.11.0",
         "tslib": "^2.6.2"
@@ -3696,16 +3682,16 @@
       }
     },
     "node_modules/@smithy/util-defaults-mode-node": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.4.tgz",
-      "integrity": "sha512-HE1I7gxa6yP7ZgXPCFfZSDmVmMtY7SHqzFF55gM/GPegzZKaQWZZ+nYn9C2Cc3JltCMyWe63VPR3tSFDEvuGjw==",
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.6.tgz",
+      "integrity": "sha512-9zhx1shd1VwSSVvLZB8CM3qQ3RPD3le7A3h/UPuyh/PC7g4OaWDi2xUNzamsVoSmCGtmUBONl56lM2EU6LcH7A==",
       "license": "Apache-2.0",
       "dependencies": {
         "@smithy/config-resolver": "^4.0.1",
         "@smithy/credential-provider-imds": "^4.0.1",
         "@smithy/node-config-provider": "^4.0.1",
         "@smithy/property-provider": "^4.0.1",
-        "@smithy/smithy-client": "^4.1.3",
+        "@smithy/smithy-client": "^4.1.5",
         "@smithy/types": "^4.1.0",
         "tslib": "^2.6.2"
       },
@@ -3767,9 +3753,9 @@
       }
     },
     "node_modules/@smithy/util-stream": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.0.2.tgz",
-      "integrity": "sha512-0eZ4G5fRzIoewtHtwaYyl8g2C+osYOT4KClXgfdNEDAgkbe2TYPqcnw4GAWabqkZCax2ihRGPe9LZnsPdIUIHA==",
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.1.1.tgz",
+      "integrity": "sha512-+Xvh8nhy0Wjv1y71rBVyV3eJU3356XsFQNI8dEZVNrQju7Eib8G31GWtO+zMa9kTCGd41Mflu+ZKfmQL/o2XzQ==",
       "license": "Apache-2.0",
       "dependencies": {
         "@smithy/fetch-http-handler": "^5.0.1",
@@ -3858,13 +3844,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/@types/gensync": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz",
-      "integrity": "sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/@types/hammerjs": {
       "version": "2.0.46",
       "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz",
@@ -3879,9 +3858,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.13.1",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz",
-      "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==",
+      "version": "22.13.4",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz",
+      "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3924,17 +3903,17 @@
       "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.0.tgz",
-      "integrity": "sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==",
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz",
+      "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.24.0",
-        "@typescript-eslint/type-utils": "8.24.0",
-        "@typescript-eslint/utils": "8.24.0",
-        "@typescript-eslint/visitor-keys": "8.24.0",
+        "@typescript-eslint/scope-manager": "8.24.1",
+        "@typescript-eslint/type-utils": "8.24.1",
+        "@typescript-eslint/utils": "8.24.1",
+        "@typescript-eslint/visitor-keys": "8.24.1",
         "graphemer": "^1.4.0",
         "ignore": "^5.3.1",
         "natural-compare": "^1.4.0",
@@ -3954,16 +3933,16 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.0.tgz",
-      "integrity": "sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==",
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz",
+      "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.24.0",
-        "@typescript-eslint/types": "8.24.0",
-        "@typescript-eslint/typescript-estree": "8.24.0",
-        "@typescript-eslint/visitor-keys": "8.24.0",
+        "@typescript-eslint/scope-manager": "8.24.1",
+        "@typescript-eslint/types": "8.24.1",
+        "@typescript-eslint/typescript-estree": "8.24.1",
+        "@typescript-eslint/visitor-keys": "8.24.1",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -3979,14 +3958,14 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.0.tgz",
-      "integrity": "sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==",
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz",
+      "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.24.0",
-        "@typescript-eslint/visitor-keys": "8.24.0"
+        "@typescript-eslint/types": "8.24.1",
+        "@typescript-eslint/visitor-keys": "8.24.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3997,14 +3976,14 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.0.tgz",
-      "integrity": "sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA==",
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz",
+      "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.24.0",
-        "@typescript-eslint/utils": "8.24.0",
+        "@typescript-eslint/typescript-estree": "8.24.1",
+        "@typescript-eslint/utils": "8.24.1",
         "debug": "^4.3.4",
         "ts-api-utils": "^2.0.1"
       },
@@ -4021,9 +4000,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.0.tgz",
-      "integrity": "sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==",
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz",
+      "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -4035,14 +4014,14 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.0.tgz",
-      "integrity": "sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==",
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz",
+      "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.24.0",
-        "@typescript-eslint/visitor-keys": "8.24.0",
+        "@typescript-eslint/types": "8.24.1",
+        "@typescript-eslint/visitor-keys": "8.24.1",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
@@ -4062,16 +4041,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.0.tgz",
-      "integrity": "sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==",
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz",
+      "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "8.24.0",
-        "@typescript-eslint/types": "8.24.0",
-        "@typescript-eslint/typescript-estree": "8.24.0"
+        "@typescript-eslint/scope-manager": "8.24.1",
+        "@typescript-eslint/types": "8.24.1",
+        "@typescript-eslint/typescript-estree": "8.24.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4086,13 +4065,13 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.0.tgz",
-      "integrity": "sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==",
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz",
+      "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.24.0",
+        "@typescript-eslint/types": "8.24.1",
         "eslint-visitor-keys": "^4.2.0"
       },
       "engines": {
@@ -4299,9 +4278,9 @@
       }
     },
     "node_modules/@vue/devtools-core/node_modules/nanoid": {
-      "version": "5.0.9",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz",
-      "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.0.tgz",
+      "integrity": "sha512-zDAl/llz8Ue/EblwSYwdxGBYfj46IM1dhjVi8dyp9LQffoIGxJEAHj2oeZ4uNcgycSRcQ83CnfcZqEJzVDLcDw==",
       "dev": true,
       "funding": [
         {
@@ -4390,9 +4369,9 @@
       }
     },
     "node_modules/@vue/language-core": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz",
-      "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==",
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.2.tgz",
+      "integrity": "sha512-QotO41kurE5PLf3vrNgGTk3QswO2PdUFjBwNiOi7zMmGhwb25PSTh9hD1MCgKC06AVv+8sZQvlL3Do4TTVHSiQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4400,7 +4379,7 @@
         "@vue/compiler-dom": "^3.5.0",
         "@vue/compiler-vue2": "^2.7.16",
         "@vue/shared": "^3.5.0",
-        "alien-signals": "^0.4.9",
+        "alien-signals": "^1.0.3",
         "minimatch": "^9.0.3",
         "muggle-string": "^0.4.1",
         "path-browserify": "^1.0.1"
@@ -4523,9 +4502,9 @@
       }
     },
     "node_modules/alien-signals": {
-      "version": "0.4.14",
-      "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz",
-      "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.4.tgz",
+      "integrity": "sha512-DJqqQD3XcsaQcQ1s+iE2jDUZmmQpXwHiR6fCAim/w87luaW+vmLY8fMlrdkmRwzaFXhkxf3rqPCR59tKVv1MDw==",
       "dev": true,
       "license": "MIT"
     },
@@ -4984,9 +4963,9 @@
       }
     },
     "node_modules/call-bind-apply-helpers": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
-      "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
       "license": "MIT",
       "dependencies": {
         "es-errors": "^1.3.0",
@@ -5023,9 +5002,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001699",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz",
-      "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==",
+      "version": "1.0.30001700",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz",
+      "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==",
       "dev": true,
       "funding": [
         {
@@ -5061,9 +5040,9 @@
       }
     },
     "node_modules/chart.js": {
-      "version": "4.4.7",
-      "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.7.tgz",
-      "integrity": "sha512-pwkcKfdzTMAU/+jNosKhNL2bHtJc/sSmYgVbuGTEDhzkrhmyihmP7vUc/5ZK9WopidMDHNe3Wm7jOd/WhuHWuw==",
+      "version": "4.4.8",
+      "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.8.tgz",
+      "integrity": "sha512-IkGZlVpXP+83QpMm4uxEiGqSI7jFizwVtF3+n5Pc3k7sMO+tkd0qxh2OzLhenM0K80xtmAONWGBn082EiBQSDA==",
       "license": "MIT",
       "dependencies": {
         "@kurkle/color": "^0.3.0"
@@ -5594,9 +5573,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.5.97",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.97.tgz",
-      "integrity": "sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ==",
+      "version": "1.5.102",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz",
+      "integrity": "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==",
       "dev": true,
       "license": "ISC"
     },
@@ -5675,6 +5654,22 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/es-set-tostringtag": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.6",
+        "has-tostringtag": "^1.0.2",
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
     "node_modules/esbuild": {
       "version": "0.24.2",
       "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz",
@@ -6291,9 +6286,9 @@
       }
     },
     "node_modules/flatted": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
-      "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+      "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
       "dev": true,
       "license": "ISC"
     },
@@ -6335,14 +6330,15 @@
       }
     },
     "node_modules/form-data": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
-      "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
+      "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
       "license": "MIT",
       "peer": true,
       "dependencies": {
         "asynckit": "^0.4.0",
         "combined-stream": "^1.0.8",
+        "es-set-tostringtag": "^2.1.0",
         "mime-types": "^2.1.12"
       },
       "engines": {
@@ -6627,7 +6623,6 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
       "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "has-symbols": "^1.0.3"
@@ -7478,9 +7473,9 @@
       "license": "MIT"
     },
     "node_modules/mrmime": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz",
-      "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
+      "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -8031,9 +8026,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.5.2",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz",
-      "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==",
+      "version": "8.5.3",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
+      "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
       "funding": [
         {
           "type": "opencollective",
@@ -8083,9 +8078,9 @@
       }
     },
     "node_modules/prettier": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.0.tgz",
-      "integrity": "sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz",
+      "integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -8272,9 +8267,9 @@
       }
     },
     "node_modules/readdirp": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz",
-      "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==",
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+      "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -8354,9 +8349,9 @@
       }
     },
     "node_modules/rollup": {
-      "version": "4.34.6",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.6.tgz",
-      "integrity": "sha512-wc2cBWqJgkU3Iz5oztRkQbfVkbxoz5EhnCGOrnJvnLnQ7O0WhQUYyv18qQI79O8L7DdHrrlJNeCHd4VGpnaXKQ==",
+      "version": "4.34.8",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz",
+      "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8370,25 +8365,25 @@
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.34.6",
-        "@rollup/rollup-android-arm64": "4.34.6",
-        "@rollup/rollup-darwin-arm64": "4.34.6",
-        "@rollup/rollup-darwin-x64": "4.34.6",
-        "@rollup/rollup-freebsd-arm64": "4.34.6",
-        "@rollup/rollup-freebsd-x64": "4.34.6",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.34.6",
-        "@rollup/rollup-linux-arm-musleabihf": "4.34.6",
-        "@rollup/rollup-linux-arm64-gnu": "4.34.6",
-        "@rollup/rollup-linux-arm64-musl": "4.34.6",
-        "@rollup/rollup-linux-loongarch64-gnu": "4.34.6",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.34.6",
-        "@rollup/rollup-linux-riscv64-gnu": "4.34.6",
-        "@rollup/rollup-linux-s390x-gnu": "4.34.6",
-        "@rollup/rollup-linux-x64-gnu": "4.34.6",
-        "@rollup/rollup-linux-x64-musl": "4.34.6",
-        "@rollup/rollup-win32-arm64-msvc": "4.34.6",
-        "@rollup/rollup-win32-ia32-msvc": "4.34.6",
-        "@rollup/rollup-win32-x64-msvc": "4.34.6",
+        "@rollup/rollup-android-arm-eabi": "4.34.8",
+        "@rollup/rollup-android-arm64": "4.34.8",
+        "@rollup/rollup-darwin-arm64": "4.34.8",
+        "@rollup/rollup-darwin-x64": "4.34.8",
+        "@rollup/rollup-freebsd-arm64": "4.34.8",
+        "@rollup/rollup-freebsd-x64": "4.34.8",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.34.8",
+        "@rollup/rollup-linux-arm-musleabihf": "4.34.8",
+        "@rollup/rollup-linux-arm64-gnu": "4.34.8",
+        "@rollup/rollup-linux-arm64-musl": "4.34.8",
+        "@rollup/rollup-linux-loongarch64-gnu": "4.34.8",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8",
+        "@rollup/rollup-linux-riscv64-gnu": "4.34.8",
+        "@rollup/rollup-linux-s390x-gnu": "4.34.8",
+        "@rollup/rollup-linux-x64-gnu": "4.34.8",
+        "@rollup/rollup-linux-x64-musl": "4.34.8",
+        "@rollup/rollup-win32-arm64-msvc": "4.34.8",
+        "@rollup/rollup-win32-ia32-msvc": "4.34.8",
+        "@rollup/rollup-win32-x64-msvc": "4.34.8",
         "fsevents": "~2.3.2"
       }
     },
@@ -8468,9 +8463,9 @@
       }
     },
     "node_modules/sass": {
-      "version": "1.84.0",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.84.0.tgz",
-      "integrity": "sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg==",
+      "version": "1.85.0",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz",
+      "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8673,9 +8668,9 @@
       }
     },
     "node_modules/sirv": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz",
-      "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz",
+      "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8780,9 +8775,9 @@
       }
     },
     "node_modules/strnum": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
-      "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.0.tgz",
+      "integrity": "sha512-a4NGarQIHRhvr+k8VXaHg6TMU6f3YEmi5CAb6RYgX2gwbGDBNMbr6coC6g0wmif5dLjHtmHUVD/qOxPq7D0tnQ==",
       "license": "MIT"
     },
     "node_modules/superjson": {
@@ -8974,15 +8969,15 @@
       }
     },
     "node_modules/typescript-eslint": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.0.tgz",
-      "integrity": "sha512-/lmv4366en/qbB32Vz5+kCNZEMf6xYHwh1z48suBwZvAtnXKbP+YhGe8OLE2BqC67LMqKkCNLtjejdwsdW6uOQ==",
+      "version": "8.24.1",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz",
+      "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.24.0",
-        "@typescript-eslint/parser": "8.24.0",
-        "@typescript-eslint/utils": "8.24.0"
+        "@typescript-eslint/eslint-plugin": "8.24.1",
+        "@typescript-eslint/parser": "8.24.1",
+        "@typescript-eslint/utils": "8.24.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -9146,14 +9141,14 @@
       }
     },
     "node_modules/vite": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz",
-      "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==",
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz",
+      "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "esbuild": "^0.24.2",
-        "postcss": "^8.5.1",
+        "postcss": "^8.5.2",
         "rollup": "^4.30.1"
       },
       "bin": {
@@ -9449,14 +9444,14 @@
       "license": "MIT"
     },
     "node_modules/vue-tsc": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.0.tgz",
-      "integrity": "sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==",
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.2.tgz",
+      "integrity": "sha512-1icPKkxAA5KTAaSwg0wVWdE48EdsH8fgvcbAiqojP4jXKl6LEM3soiW1aG/zrWrFt8Mw1ncG2vG1PvpZpVfehA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@volar/typescript": "~2.4.11",
-        "@vue/language-core": "2.2.0"
+        "@vue/language-core": "2.2.2"
       },
       "bin": {
         "vue-tsc": "bin/vue-tsc.js"
diff --git a/public/robots.txt b/public/robots.txt
index 4737bcc..d224bea 100644
--- a/public/robots.txt
+++ b/public/robots.txt
@@ -1,7 +1,9 @@
 User-agent: *
-Disallow: /dashboard
+Disallow: /workflows
+Disallow: /api
 Allow: /
 Allow: /imprint
 Allow: /privacy
 Allow: /terms
 Allow: /login
+Allow: /signup
diff --git a/src/components/BootstrapCard.vue b/src/components/BootstrapCard.vue
index 6539ee5..6bec2a5 100644
--- a/src/components/BootstrapCard.vue
+++ b/src/components/BootstrapCard.vue
@@ -1,8 +1,4 @@
-<script setup lang="ts">
-import { useSlots } from "vue";
-
-const slots = useSlots();
-</script>
+<script setup lang="ts"></script>
 
 <template>
   <div class="card">
@@ -10,7 +6,7 @@ const slots = useSlots();
       <div class="card-title">
         <slot name="title" />
       </div>
-      <h6 v-if="slots.subtitle" class="card-subtitle mb-2 text-body-secondary">
+      <h6 v-if="$slots.subtitle" class="card-subtitle mb-2 text-body-secondary">
         <slot name="subtitle" />
       </h6>
       <div class="card-text">
diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue
index b62f506..cebd4fa 100644
--- a/src/views/admin/AdminUsersView.vue
+++ b/src/views/admin/AdminUsersView.vue
@@ -212,6 +212,8 @@ onMounted(() => {
           <th scope="col"><b>Name</b></th>
           <th scope="col">UID</th>
           <th scope="col">Email</th>
+          <th scope="col">Lifescience AAI</th>
+          <th scope="col">NFDI AAI</th>
           <th
             v-for="role in Object.values(RoleEnum)"
             :key="role"
@@ -225,7 +227,7 @@ onMounted(() => {
       </thead>
       <tbody v-if="userState.users.length === 0">
         <tr>
-          <td colspan="9" class="text-center fst-italic fw-light">
+          <td colspan="11" class="text-center fst-italic fw-light">
             <template v-if="userState.searched"
               >No Users found with specified filters
             </template>
@@ -251,6 +253,22 @@ onMounted(() => {
               user.email
             }}</a>
           </td>
+          <td>
+            <input
+              type="checkbox"
+              class="form-check-input"
+              :checked="user.lifescience_id != undefined"
+              disabled
+            />
+          </td>
+          <td>
+            <input
+              type="checkbox"
+              class="form-check-input"
+              :checked="user.nfdi_id != undefined"
+              disabled
+            />
+          </td>
           <td
             v-for="role in Object.values(RoleEnum)"
             :key="role"
diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue
index 7cf5544..57d47b9 100644
--- a/src/views/user/ProfileView.vue
+++ b/src/views/user/ProfileView.vue
@@ -111,7 +111,9 @@ onMounted(() => {
         <div v-if="userRepository.user?.lifescience_id">
           <b>Linked account: </b>
           <a href="https://profile.aai.lifescience-ri.eu/profile"
-            >{{ userRepository.user?.lifescience_id }}&#x200B;@lifescience.eu</a
+            >{{
+              userRepository.user?.lifescience_id
+            }}&#x200B;@lifescience-ri.eu</a
           >
         </div>
         <div v-else>
-- 
GitLab


From b00de87e7df648183fee130ef02a7a7af18de85a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Fri, 21 Feb 2025 14:06:45 +0000
Subject: [PATCH 19/25] Add modal when logging in the first time

#191
---
 package-lock.json               | 47 ++++++++++++++-------
 src/App.vue                     | 25 +++++++++--
 src/components/LoginButtons.vue | 73 +++++++++++++++++++++++++++++++++
 src/main.ts                     |  6 +--
 src/router/index.ts             |  3 ++
 src/views/LoginView.vue         | 68 ++++--------------------------
 src/views/SignupView.vue        | 50 ++++++++++++++--------
 7 files changed, 173 insertions(+), 99 deletions(-)
 create mode 100644 src/components/LoginButtons.vue

diff --git a/package-lock.json b/package-lock.json
index a68aa65..35360ce 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1993,9 +1993,9 @@
       }
     },
     "node_modules/@eslint/compat": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.6.tgz",
-      "integrity": "sha512-k7HNCqApoDHM6XzT30zGoETj+D+uUcZUb+IVAJmar3u6bvHf7hhHJcWx09QHj4/a2qrKZMWU0E16tvkiAdv06Q==",
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.7.tgz",
+      "integrity": "sha512-xvv7hJE32yhegJ8xNAnb62ggiAwTYHBpUCWhRxEj/ksvgDJuSXfoDkBcRYaYNFiJ+jH0IE3K16hd+xXzhBgNbg==",
       "dev": true,
       "license": "Apache-2.0",
       "engines": {
@@ -2155,19 +2155,32 @@
       }
     },
     "node_modules/@eslint/plugin-kit": {
-      "version": "0.2.6",
-      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.6.tgz",
-      "integrity": "sha512-+0TjwR1eAUdZtvv/ir1mGX+v0tUoR3VEPB8Up0LLJC+whRW0GgBBtpbOkg/a/U4Dxa6l5a3l9AJ1aWIQVyoWJA==",
+      "version": "0.2.7",
+      "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz",
+      "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
-        "@eslint/core": "^0.11.0",
+        "@eslint/core": "^0.12.0",
         "levn": "^0.4.1"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
+    "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz",
+      "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==",
+      "dev": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@types/json-schema": "^7.0.15"
+      },
+      "engines": {
+        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+      }
+    },
     "node_modules/@fortawesome/fontawesome-free": {
       "version": "6.7.2",
       "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz",
@@ -7658,15 +7671,15 @@
       }
     },
     "node_modules/nypm": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.5.2.tgz",
-      "integrity": "sha512-AHzvnyUJYSrrphPhRWWZNcoZfArGNp3Vrc4pm/ZurO74tYNTgAPrEyBQEKy+qioqmWlPXwvMZCG2wOaHlPG0Pw==",
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.5.4.tgz",
+      "integrity": "sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "citty": "^0.1.6",
         "consola": "^3.4.0",
-        "pathe": "^2.0.2",
+        "pathe": "^2.0.3",
         "pkg-types": "^1.3.1",
         "tinyexec": "^0.3.2",
         "ufo": "^1.5.4"
@@ -8775,9 +8788,15 @@
       }
     },
     "node_modules/strnum": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.0.tgz",
-      "integrity": "sha512-a4NGarQIHRhvr+k8VXaHg6TMU6f3YEmi5CAb6RYgX2gwbGDBNMbr6coC6g0wmif5dLjHtmHUVD/qOxPq7D0tnQ==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.1.tgz",
+      "integrity": "sha512-O7aCHfYCamLCctjAiaucmE+fHf2DYHkus2OKCn4Wv03sykfFtgeECn505X6K4mPl8CRNd/qurC9guq+ynoN4pw==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/NaturalIntelligence"
+        }
+      ],
       "license": "MIT"
     },
     "node_modules/superjson": {
diff --git a/src/App.vue b/src/App.vue
index e3158c4..c63cc1d 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { onBeforeMount, onMounted } from "vue";
+import { onBeforeMount, onMounted, ref } from "vue";
 import { useCookies } from "vue3-cookies";
 import { useRoute, useRouter } from "vue-router";
 import { client } from "@/client/client.gen.ts";
@@ -20,6 +20,8 @@ import {
 } from "@/stores";
 import { stringify as param_stringify } from "qs";
 import { OwnershipTypeEnum } from "@/client/types.gen";
+import BootstrapModal from "@/components/modals/BootstrapModal.vue";
+import { Modal } from "bootstrap";
 
 const { cookies } = useCookies();
 const router = useRouter();
@@ -35,7 +37,10 @@ const otrRepository = useOTRStore();
 const executionRepository = useWorkflowExecutionStore();
 const newsStore = useNewsStore();
 
+const firstLogin = ref<boolean>(false);
+
 onBeforeMount(() => {
+  firstLogin.value = window.location.href.includes("first_login=True");
   client.setConfig({
     throwOnError: true,
     baseURL: environment.API_BASE_URL,
@@ -137,9 +142,6 @@ onBeforeMount(() => {
     }
   });
   nameRepository.loadNameMapping();
-});
-
-onMounted(() => {
   if (userRepository.authenticated) {
     Promise.all([
       s3KeyRepository.fetchS3Keys(),
@@ -172,11 +174,26 @@ onMounted(() => {
     }
   }
 });
+
+onMounted(() => {
+  if (firstLogin.value && userRepository.authenticated) {
+    Modal.getOrCreateInstance("#welcome-modal")?.show();
+  }
+});
 </script>
 
 <template>
   <AppHeader />
   <div class="container-fluid container-xxxl mt-2 flex-grow-1 py-2">
+    <bootstrap-modal
+      v-if="firstLogin && userRepository.authenticated"
+      modal-id="welcome-modal"
+      modal-label="Welcome Modal"
+      static-backdrop
+    >
+      <template #header>Hello to CloWM</template>
+      <template #body>This is your first time in CloWM</template>
+    </bootstrap-modal>
     <router-view />
   </div>
   <AppFooter />
diff --git a/src/components/LoginButtons.vue b/src/components/LoginButtons.vue
new file mode 100644
index 0000000..08add3e
--- /dev/null
+++ b/src/components/LoginButtons.vue
@@ -0,0 +1,73 @@
+<script setup lang="ts">
+import { type AuthKickstartLoginData, OidcProvider } from "@/client";
+import { environment } from "@/environment.ts";
+import { client } from "@/client/client.gen.ts";
+
+const props = defineProps<{
+  returnPath?: string;
+  invitationToken?: string;
+  showAccountCreationHint?: boolean;
+}>();
+
+function loginPath(provider: OidcProvider): string {
+  const config: AuthKickstartLoginData = {
+    url: "/auth/login/{provider}",
+    path: {
+      provider: provider,
+    },
+    query: {
+      next:
+        props.returnPath != undefined ? encodeURI(props.returnPath) : undefined,
+      invitation_token:
+        props.invitationToken != undefined ? props.invitationToken : undefined,
+    },
+  };
+  return (
+    environment.API_BASE_URL + client.buildUrl<AuthKickstartLoginData>(config)
+  );
+}
+</script>
+
+<template>
+  <div class="my-2 text-center">
+    <div class="fs-5">LifeScience Login</div>
+    <a :href="loginPath(OidcProvider.LIFESCIENCE_AAI)">
+      <img
+        src="/src/assets/images/ls-login.png"
+        alt="[LS Login]"
+        class="img-fluid"
+        style="max-height: 90px"
+      />
+    </a>
+  </div>
+  <div class="my-2 mt-4 text-center">
+    <div class="fs-5">NFDI AAI</div>
+    <a :href="loginPath(OidcProvider.NFDI_AAI)">
+      <img
+        src="/src/assets/images/nfdi-aai.png"
+        alt="[NFDi AAI]"
+        class="img-fluid"
+        style="max-height: 90px"
+      />
+    </a>
+  </div>
+  <div
+    v-if="showAccountCreationHint && invitationToken == undefined"
+    class="mt-2"
+  >
+    Don't have an account?
+    <router-link :to="{ name: 'signup', query: { next: props.returnPath } }">
+      Create an account
+    </router-link>
+    .
+  </div>
+  <div class="mt-2">
+    By using this service you agree to our
+    <router-link :to="{ name: 'terms' }"> terms of usage</router-link>
+    and
+    <router-link :to="{ name: 'privacy' }"> privacy policy</router-link>
+    .
+  </div>
+</template>
+
+<style scoped></style>
diff --git a/src/main.ts b/src/main.ts
index 93d3f60..c21bf73 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -65,9 +65,9 @@ app.use(router);
 const theme = localStorage.getItem("theme") as PossibleThemes;
 if (theme != undefined) {
   useSettingsStore().setTheme(theme);
-} //else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
-//  document.querySelector("html")?.setAttribute("data-bs-theme", "dark");
-//}
+} else if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
+  useSettingsStore().setTheme("dark");
+}
 
 app.mount("#app");
 
diff --git a/src/router/index.ts b/src/router/index.ts
index 154e3aa..dd5b66a 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -46,6 +46,9 @@ const router = createRouter({
         title: "Signup",
         public: true,
       },
+      props: (route) => ({
+        returnPath: route.query.next ?? undefined,
+      }),
     },
     {
       path: "/",
diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue
index e7cd86a..8e9f065 100644
--- a/src/views/LoginView.vue
+++ b/src/views/LoginView.vue
@@ -4,12 +4,7 @@ import { useUserStore } from "@/stores/users";
 import { useRouter } from "vue-router";
 import { Toast } from "bootstrap";
 import BootstrapToast from "@/components/BootstrapToast.vue";
-import {
-  type AuthKickstartLoginData,
-  OidcProvider,
-} from "@/client/types.gen.ts";
-import { client } from "@/client/client.gen.ts";
-import { environment } from "@/environment.ts";
+import LoginButtons from "@/components/LoginButtons.vue";
 
 const router = useRouter();
 
@@ -39,24 +34,6 @@ onBeforeUnmount(() => {
   document.head.querySelector("[rel=canonical]")?.remove();
 });
 
-function loginPath(provider: OidcProvider): string {
-  const config: AuthKickstartLoginData = {
-    url: "/auth/login/{provider}",
-    path: {
-      provider: provider,
-    },
-    query: {
-      next:
-        props.returnPath != undefined ? encodeURI(props.returnPath) : undefined,
-      invitation_token:
-        props.invitationToken != undefined ? props.invitationToken : undefined,
-    },
-  };
-  return (
-    environment.API_BASE_URL + client.buildUrl<AuthKickstartLoginData>(config)
-  );
-}
-
 onMounted(() => {
   errorToast = new Toast("#loginErrorToast");
   // if there is a query param 'login_error' show the error toast
@@ -108,42 +85,11 @@ onMounted(() => {
           ><span class="clowm-red fw-bold">W</span
           ><span class="clowm-green fw-bold">M</span> via
         </p>
-        <div class="my-2 text-center">
-          <div class="fs-5">LifeScience Login</div>
-          <a :href="loginPath(OidcProvider.LIFESCIENCE_AAI)">
-            <img
-              src="/src/assets/images/ls-login.png"
-              alt="[LS Login]"
-              class="img-fluid"
-              style="max-height: 90px"
-            />
-          </a>
-        </div>
-        <div class="my-2 mt-4 text-center">
-          <div class="fs-5">NFDI AAI</div>
-          <a :href="loginPath(OidcProvider.NFDI_AAI)">
-            <img
-              src="/src/assets/images/nfdi-aai.png"
-              alt="[NFDi AAI]"
-              class="img-fluid"
-              style="max-height: 90px"
-            />
-          </a>
-        </div>
-        <div v-if="invitationToken == undefined" class="mt-2">
-          Don't have an account?
-          <router-link :to="{ name: 'signup' }">
-            Create an account
-          </router-link>
-          .
-        </div>
-        <div class="mt-2">
-          By using this service you agree to our
-          <router-link :to="{ name: 'terms' }">terms of usage</router-link>
-          and
-          <router-link :to="{ name: 'privacy' }">privacy policy</router-link>
-          .
-        </div>
+        <login-buttons
+          :return-path="returnPath"
+          :invitation-token="invitationToken"
+          show-account-creation-hint
+        />
       </div>
     </div>
   </div>
@@ -153,10 +99,12 @@ onMounted(() => {
 .middle-screen {
   top: 40% !important;
 }
+
 @media (max-height: 750px) {
   .hide-sm {
     display: none !important;
   }
+
   .middle-screen {
     top: 50% !important;
   }
diff --git a/src/views/SignupView.vue b/src/views/SignupView.vue
index eb31f46..734a1ac 100644
--- a/src/views/SignupView.vue
+++ b/src/views/SignupView.vue
@@ -1,5 +1,31 @@
 <script setup lang="ts">
-import { environment } from "@/environment";
+import { onBeforeMount, onBeforeUnmount } from "vue";
+import { useUserStore } from "@/stores";
+import { useRouter } from "vue-router";
+import LoginButtons from "@/components/LoginButtons.vue";
+
+defineProps<{
+  returnPath?: string;
+}>();
+
+const router = useRouter();
+const store = useUserStore();
+
+onBeforeMount(() => {
+  if (store.authenticated) {
+    // If user is authenticated redirect him to the dashboard
+    router.push({ name: "dashboard" });
+  } else {
+    const linkTag = document.createElement("link");
+    linkTag.setAttribute("rel", "canonical");
+    linkTag.href = window.location.origin + window.location.pathname;
+    document.head.appendChild(linkTag);
+  }
+});
+
+onBeforeUnmount(() => {
+  document.head.querySelector("[rel=canonical]")?.remove();
+});
 </script>
 
 <template>
@@ -8,9 +34,11 @@ import { environment } from "@/environment";
   </h2>
   <p>
     The only prerequisite for using CloWM is a
-    <a href="https://lifescience-ri.eu/">LifeScience</a> account.
+    <a href="https://lifescience-ri.eu/">LifeScience</a> or
+    <a href="https://iam.services.base4nfdi.de">NFDI</a>
+    account.
   </p>
-  <h4>I don't have a LifeScience Account</h4>
+  <h4>I don't have such an Account</h4>
   <p>
     I you don't have a LifeScience account yet, you can register by going to the
     <a
@@ -25,21 +53,7 @@ import { environment } from "@/environment";
     account will be created automatically for you.
   </p>
   <div class="d-flex flex-column mx-auto w-fit align-items-center mt-5">
-    <a :href="`${environment.API_BASE_URL}/auth/login?provider=lifescience`">
-      <img
-        src="/src/assets/images/ls-login.png"
-        alt="[LS Login]"
-        style="max-height: 70px"
-        class="hover-shadow"
-      />
-    </a>
-    <div class="mt-2">
-      By using this service you agree to our
-      <router-link :to="{ name: 'terms' }"> terms of usage </router-link>
-      and
-      <router-link :to="{ name: 'privacy' }"> privacy policy </router-link>
-      .
-    </div>
+    <login-buttons :return-path="returnPath" />
   </div>
 </template>
 
-- 
GitLab


From 4059e4b7cf770e88c3f2620e6735d2bccabe85e7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Fri, 21 Feb 2025 14:55:51 +0000
Subject: [PATCH 20/25] Show CPU hours and used bucket storage for own buckets

#191
---
 src/App.vue                                   | 13 +++++++---
 src/stores/s3objects.ts                       | 13 ++++++++++
 src/views/DashboardView.vue                   | 25 +++++++++++++++++++
 .../admin/AdminWorkflowExecutionView.vue      |  2 +-
 .../workflows/ListWorkflowExecutionsView.vue  |  6 +++++
 5 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/src/App.vue b/src/App.vue
index c63cc1d..a0ea967 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -147,11 +147,14 @@ onBeforeMount(() => {
       s3KeyRepository.fetchS3Keys(),
       bucketRepository.fetchOwnBuckets(),
     ]).then(() => {
-      Promise.all(
-        bucketRepository.buckets
+      Promise.all([
+        ...bucketRepository.buckets
           .filter((bucket) => bucket.owner_id === userRepository.currentUID)
           .map((bucket) => objectRepository.fetchMultipartUploads(bucket.name)),
-      );
+        objectRepository.fetchS3ObjectsForMultipleBuckets(
+          bucketRepository.ownBuckets.map((bucket) => bucket.name),
+        ),
+      ]);
     });
     resourceRepository.fetchPublicResources();
     workflowRepository.fetchWorkflows();
@@ -169,6 +172,10 @@ onBeforeMount(() => {
       resourceRepository.fetchOwnResources();
       otrRepository.fetchOwnOtrs(OwnershipTypeEnum.RESOURCE);
     }
+    if (userRepository.reviewer || userRepository.admin) {
+      resourceRepository.fetchReviewableResources();
+      workflowRepository.fetchReviewableWorkflows();
+    }
     if (userRepository.admin) {
       resourceRepository.fetchSyncRequests();
     }
diff --git a/src/stores/s3objects.ts b/src/stores/s3objects.ts
index 0555fe4..6263954 100644
--- a/src/stores/s3objects.ts
+++ b/src/stores/s3objects.ts
@@ -129,9 +129,13 @@ export const useS3ObjectStore = defineStore("s3objects", {
       bucketName: string,
       prefix?: string,
       onFinally?: () => void,
+      returnCache: boolean = false,
     ): Promise<S3Object[]> {
       if (this.objectMapping[bucketName] != undefined) {
         onFinally?.();
+        if (returnCache) {
+          return this.objectMapping[bucketName];
+        }
       }
       const pag = paginateListObjectsV2(
         { client: this.client },
@@ -381,5 +385,14 @@ export const useS3ObjectStore = defineStore("s3objects", {
         }
       });
     },
+    async fetchS3ObjectsForMultipleBuckets(
+      bucketNames: string[],
+    ): Promise<S3Object[]> {
+      return Promise.all(
+        bucketNames.map((bucket) =>
+          this.fetchS3Objects(bucket, undefined, undefined, true),
+        ),
+      ).then((objectsPerBucket) => objectsPerBucket.flat());
+    },
   },
 });
diff --git a/src/views/DashboardView.vue b/src/views/DashboardView.vue
index 688db82..e6bb46e 100644
--- a/src/views/DashboardView.vue
+++ b/src/views/DashboardView.vue
@@ -27,6 +27,7 @@ import dayjs from "dayjs";
 import { latestVersion } from "@/utils/Workflow.ts";
 import NewsCard from "@/components/news/NewsCard.vue";
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
+import { filesize } from "filesize";
 
 const authStore = useUserStore();
 const bucketStore = useBucketStore();
@@ -202,6 +203,18 @@ function accumulateWorkflowStatus(
                 }}
                 shared bucket(s)
               </li>
+              <li>
+                {{
+                  filesize(
+                    bucketStore.ownBuckets
+                      .map((bucket) => objectStore.objectMapping[bucket.name])
+                      .filter((objs) => objs != undefined)
+                      .flat()
+                      .reduce((acc, cur) => acc + (cur.Size ?? 0), 0),
+                  )
+                }}
+                in own buckets
+              </li>
             </ul>
           </template>
         </bootstrap-card>
@@ -359,6 +372,18 @@ function accumulateWorkflowStatus(
                 }}
                 erroneous execution(s)
               </li>
+              <li>
+                {{
+                  executionStore.executions
+                    .reduce(
+                      (acc, cur) => acc.add(dayjs.duration(cur.cpu_time)),
+                      dayjs.duration(0, "day"),
+                    )
+                    .asHours()
+                    .toFixed(2)
+                }}
+                used CPU hours
+              </li>
             </ul>
           </template>
         </bootstrap-card>
diff --git a/src/views/admin/AdminWorkflowExecutionView.vue b/src/views/admin/AdminWorkflowExecutionView.vue
index 347c18d..13f5940 100644
--- a/src/views/admin/AdminWorkflowExecutionView.vue
+++ b/src/views/admin/AdminWorkflowExecutionView.vue
@@ -449,7 +449,7 @@ onMounted(() => {
               </template>
               <template v-else> -</template>
             </td>
-            <td>
+            <td class="text-center">
               {{ Math.floor(dayjs.duration(execution.cpu_time).asHours()) }}:{{
                 dayjs.duration(execution.cpu_time).format("mm:ss")
               }}
diff --git a/src/views/workflows/ListWorkflowExecutionsView.vue b/src/views/workflows/ListWorkflowExecutionsView.vue
index c48260a..0c6d234 100644
--- a/src/views/workflows/ListWorkflowExecutionsView.vue
+++ b/src/views/workflows/ListWorkflowExecutionsView.vue
@@ -182,6 +182,7 @@ onUnmounted(() => {
           <th scope="col">Started</th>
           <th scope="col">Duration</th>
           <th scope="col">Ended</th>
+          <th scope="col">CPU hours [HH:mm:ss]</th>
           <th scope="col"></th>
         </tr>
       </thead>
@@ -280,6 +281,11 @@ onUnmounted(() => {
               </template>
               <template v-else> -</template>
             </td>
+            <td class="text-center">
+              {{ Math.floor(dayjs.duration(execution.cpu_time).asHours()) }}:{{
+                dayjs.duration(execution.cpu_time).format("mm:ss")
+              }}
+            </td>
             <td class="text-end">
               <div
                 class="btn-group btn-group-sm dropdown-center dropdown-menu-start"
-- 
GitLab


From a6957e621575c93947e5b4dbba0604aac9fbd4a4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Mon, 24 Feb 2025 13:49:57 +0000
Subject: [PATCH 21/25] Improve admin views

#191
---
 openapi-clowm.json                            | 7324 ++++++++++++++++-
 package-lock.json                             |  112 +-
 package.json                                  |    2 +-
 src/App.vue                                   |    3 +-
 src/client/types.gen.ts                       |    4 +
 src/views/SignupView.vue                      |   19 +-
 src/views/admin/AdminBucketsView.vue          |   81 +-
 src/views/admin/AdminResourcesView.vue        |  102 +-
 src/views/admin/AdminUsersView.vue            |  115 +-
 .../admin/AdminWorkflowExecutionView.vue      |  124 +-
 src/views/user/ProfileView.vue                |    2 +-
 11 files changed, 7761 insertions(+), 127 deletions(-)

diff --git a/openapi-clowm.json b/openapi-clowm.json
index 262eef4..723fc4a 100644
--- a/openapi-clowm.json
+++ b/openapi-clowm.json
@@ -1 +1,7323 @@
-{"openapi":"3.1.0","info":{"title":"CloWM UI API","description":"This is the API for the CloWM UI. It is only for internal use and will change without prior notice.","version":"1.0"},"servers":[{"url":"/api"}],"paths":{"/auth/login/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the login flow","description":"Redirect route to OIDC provider to kickstart the login process.","operationId":"Auth-kickstart_login","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"},{"name":"invitation_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":43,"maxLength":43},{"type":"null"}],"description":"Unique token to validate an invitation","title":"Invitation Token"},"description":"Unique token to validate an invitation"},{"name":"next","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"Will be appended to redirect response in the callback route as URL query parameter `next`","title":"Next"},"description":"Will be appended to redirect response in the callback route as URL query parameter `next`"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the login process with an OIDC Provider.\n\nVisit the route login route to start the login process.\n\nIf the user is already known to the system, then a JWT token will be created and sent via the 'set-cookie' header.\nThe key for this Cookie is 'bearer'.\n\nIf the user is new, he will be created him and then a JWT token is issued.\n\nThis JWT has to be sent to all authorized endpoints via the HTTPBearer scheme.","operationId":"Auth-login_callback","parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=fake-jwt-cookie; Domain=localhost; Max-Age=691200; Path=/; SameSite=strict; Secure"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/connect/{provider}":{"get":{"tags":["Auth"],"summary":"Kickstart the account connection flow","description":"Redirect route to OIDC provider to connect the CloWM account with the AAI account.","operationId":"Auth-kickstart_account_connection","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider","description":"The OIDC provider to use for login"},"description":"The OIDC provider to use for login"}],"responses":{"302":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/account/callback/{provider}":{"get":{"tags":["Auth"],"summary":"LifeScience Login Callback","description":"Callback for the account connection process with an OIDC provider.","operationId":"Auth-account_connection_callback","security":[{"Session Token":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"$ref":"#/components/schemas/OIDCProvider"}}],"responses":{"302":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"get":{"tags":["Auth"],"summary":"Logout","description":"Logout the user from the system by deleting the bearer cookie.","operationId":"Auth-logout","responses":{"302":{"description":"Successful Response","headers":{"Set-Cookie":{"description":"JWT for accessing the API","schema":{"type":"string","example":"clowm-jwt=; Domain=localhost; Max-Age=0; Path=/; SameSite=strict; Secure"}}}}}}},"/ui/tokens":{"get":{"tags":["APIToken"],"summary":"List API token","description":"List meta information about all API token.\n\nPermissions `api_token:list_all` required. See parameter `uid` for exception.","operationId":"APIToken-list_token","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of the user to filter for. Permission `api_token:list` required if current users is the target."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiTokenOut"},"title":"Response Apitoken-List Token"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["APIToken"],"summary":"Create new API token","description":"Create a new API token for the current user.\n\nPermission `api_token:create` required.","operationId":"APIToken-create_token","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenIn","description":"Meta-data for Api token to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenPrivateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/tokens/{tid}":{"get":{"tags":["APIToken"],"summary":"Get API token","description":"Get an API token by id.\n\nPermission `api_token:read` required if the current user is the owner of the API token,\notherwise `api_token:read_any` required.","operationId":"APIToken-get_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTokenOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["APIToken"],"summary":"Delete API token","description":"Delete an API token by id.\n\nPermission `api_token:delete` required if the current user is the owner of the API token,\notherwise `api_token:delete_any` required.","operationId":"APIToken-delete_token","security":[{"Session Token":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of an API token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"],"title":"Tid"},"description":"ID of an API token"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users":{"post":{"tags":["User"],"summary":"Create User","description":"Create a new user in the system and notify him.\n\nPermission `user:create` required.","operationId":"User-create_user","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserIn","description":"Meta-data for user to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["User"],"summary":"List users and search by their name","description":"List all users in the system..\n\nPermission `user:list` required.","operationId":"User-list_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter users by a substring in their name.","examples":["Bilbo"],"title":"Name Substring"},"description":"Filter users by a substring in their name."},{"name":"filter_roles","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/RoleEnum"}},{"type":"null"}],"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression.","title":"Filter Roles"},"description":"Filter users by their role. If multiple are selected, they are concatenating by an OR Expression."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOutExtended"},"title":"Response User-List Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/search":{"get":{"tags":["User"],"summary":"Search Users","description":"Search for users in the system by their name.\n\nPermission `user: search` required.","operationId":"User-search_users","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":30,"description":"Filter users by a substring in their name.","title":"Name Substring"},"description":"Filter users by a substring in their name."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserOut"},"title":"Response User-Search Users"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/me":{"get":{"tags":["User"],"summary":"Get the logged in user","description":"Return the user associated with the used JWT.\n\nPermission `user:read` required.","operationId":"User-get_logged_in_user","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}}},"security":[{"Session Token":[]}]}},"/ui/users/{uid}":{"get":{"tags":["User"],"summary":"Get a user by its uid","description":"Return the user with the specific uid.\n\nPermission `user:read` required.","operationId":"User-get_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["User"],"summary":"Delete a user","description":"Delete a user and his S3 account.\n\nPermission `user:delete` required if the current user is the target user.","operationId":"User-delete_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/roles":{"put":{"tags":["User"],"summary":"Update user roles","description":"Update the roles of a user.\n\nPermission `user:update` required.","operationId":"User-update_roles","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRoles","description":"The new roles of the user"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/invitation":{"patch":{"tags":["User"],"summary":"Resend Invitation","description":"Resend the invitation link for an user that has an open invitation.\n\nPermission `user:create` required.","operationId":"User-resend_invitation","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutExtended"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys":{"get":{"tags":["S3Key"],"summary":"Get the S3 Access keys from a user","description":"Get all the S3 Access keys for a specific user.\n\nPermission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required.","operationId":"S3Key-get_user_keys","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/S3Key"},"title":"Response S3Key-Get User Keys"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["S3Key"],"summary":"Create a Access key for a user","description":"Create a S3 Access key for a specific user.\n\nPermission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required.","operationId":"S3Key-create_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/users/{uid}/keys/{access_id}":{"get":{"tags":["S3Key"],"summary":"Get a specific S3 Access key from a user","description":"Get a specific S3 Access Key for a specific user.\n\nPermission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required.","operationId":"S3Key-get_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/S3Key"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["S3Key"],"summary":"Delete a specific S3 Access key from a user","description":"Delete a specific S3 Access key for a specific user.\n\nPermission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.","operationId":"S3Key-delete_user_key","security":[{"Session Token":[]}],"parameters":[{"name":"access_id","in":"path","required":true,"schema":{"type":"string","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"],"title":"Access Id"},"description":"ID of the S3 access key"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets":{"get":{"tags":["Bucket"],"summary":"List buckets","description":"List all the buckets in the system or of the desired user where the user has permissions for.\n\nPermission `bucket:list_all` required. See parameter `owner_id` for exception.","operationId":"Bucket-list_buckets","security":[{"Session Token":[]}],"parameters":[{"name":"owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Owner Id"},"description":"UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target."},{"name":"bucket_type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/BucketType","description":"Type of the bucket to get. Ignored when `user` parameter not set","default":"ALL"},"description":"Type of the bucket to get. Ignored when `user` parameter not set"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketOut"},"title":"Response Bucket-List Buckets"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket for the current user","description":"Create a bucket for the current user.\n\nThe name of the bucket has some constraints.\nFor more information see the\n[Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints)\n\nPermission `bucket:create` required.","operationId":"Bucket-create_bucket","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketIn","description":"Meta-data for bucket to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"List bucket OTRs","description":"Get the ownership transfer requests for buckets.\n\nPermission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `bucket:list_all`","operationId":"Bucket-list_bucket_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Bucket-List Bucket Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}":{"get":{"tags":["Bucket"],"summary":"Get a bucket by its name","description":"Get a bucket by its name if the current user has READ permissions for the bucket.\n\nPermission `bucket:read` required if the current user is the owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket","description":"Delete a bucket by its name. Only the owner of the bucket can delete the bucket.\n\nPermission `bucket:delete` required if the current user is the owner of the bucket,\notherwise `bucket:delete_any` required.","operationId":"Bucket-delete_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"force_delete","in":"query","required":false,"schema":{"type":"boolean","description":"Delete even non-empty bucket","default":false,"title":"Force Delete"},"description":"Delete even non-empty bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/ownership_transfer_request":{"get":{"tags":["Bucket"],"summary":"Get a bucket OTR","description":"Get a specific bucket ownership transfer request.\n\nPermission `bucket:read` required if the current user is the current or new owner of the bucket,\notherwise `bucket:read_any` required.","operationId":"Bucket-get_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Bucket"],"summary":"Create a bucket OTR","description":"Create a ownership transfer request for a specific bucket.\n\nPermission `bucket:update` required if the current user is the current owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-create_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the bucket OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Bucket"],"summary":"Accept a bucket OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `bucket:update` required if the current user is the new owner of the workflow,\notherwise `bucket:update_any` required.","operationId":"Bucket-accept_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Bucket"],"summary":"Delete a bucket OTR","description":"Delete/Reject a bucket ownership transfer request.\n\nPermission `bucket:update` required if the current user is the current or new owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-delete_bucket_otr","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/public":{"patch":{"tags":["Bucket"],"summary":"Update public status","description":"Update the buckets public state.\n\nPermission `bucket:update` required if the current user is the owner of the bucket,\notherwise `bucket:update_any` required.","operationId":"Bucket-update_bucket_public_state","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_Bucket-update_bucket_public_state"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/buckets/{bucket_name}/limits":{"patch":{"tags":["Bucket"],"summary":"Update bucket limits","description":"Update the buckets size limits.\n\nPermission `bucket:update_any` required.","operationId":"Bucket-update_bucket_limits","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketSizeLimits","description":"New size limits for bucket"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions.","description":"List all the bucket permissions in the system.\n\nPermission `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions","security":[{"Session Token":[]}],"parameters":[{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["BucketPermission"],"summary":"Create a permission.","description":"Create a permission for a bucket and user.\n\nPermission `bucket_permission:create` required.","operationId":"BucketPermission-create_permission","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionIn","description":"Permission to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a user.","description":"List all the bucket permissions for the given user.\n\nPermission `bucket_permission:list` required if current user is the target the bucket permission,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_user","security":[{"Session Token":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per User"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}":{"get":{"tags":["BucketPermission"],"summary":"Get all permissions for a bucket.","description":"List all the bucket permissions for the given bucket.\n\nPermission `bucket_permission:list` required if current user is owner of the bucket,\notherwise `bucket_permission:list_all` required.","operationId":"BucketPermission-list_permissions_per_bucket","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"permission_scopes","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"enum":["read","write"],"type":"string"}},{"type":"null"}],"description":"Scopes of Bucket Permissions to fetch","title":"Permission Scopes"},"description":"Scopes of Bucket Permissions to fetch"},{"name":"permission_status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PermissionStatus"},{"type":"null"}],"description":"Status of Bucket Permissions to fetch","title":"Permission Status"},"description":"Status of Bucket Permissions to fetch"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BucketPermissionOut"},"title":"Response Bucketpermission-List Permissions Per Bucket"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/permissions/bucket/{bucket_name}/user/{uid}":{"get":{"tags":["BucketPermission"],"summary":"Get permission for bucket and user combination.","description":"Get the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:read` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:read_any` required.","operationId":"BucketPermission-get_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["BucketPermission"],"summary":"Update a bucket permission","description":"Update a permission for a bucket and user.\n\nPermission `bucket_permission:update` required.","operationId":"BucketPermission-update_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionParameters","description":"Permission to create"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BucketPermissionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["BucketPermission"],"summary":"Delete a bucket permission","description":"Delete the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:delete` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:delete_any` required.","operationId":"BucketPermission-delete_permission","security":[{"Session Token":[]}],"parameters":[{"name":"bucket_name","in":"path","required":true,"schema":{"type":"string","minLength":3,"maxLength":63,"description":"Name of a bucket","examples":["test-bucket"],"title":"Bucket Name"},"description":"Name of a bucket"},{"name":"uid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"UID of a user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Uid"},"description":"UID of a user"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows":{"post":{"tags":["Workflow"],"summary":"Create a new workflow","description":"Create a new workflow.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow-create_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowIn","description":"Meta-date for the workflow to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow"],"summary":"List workflows","description":"List all workflows.\n\nPermission `workflow:list` required.","operationId":"Workflow-list_workflows","security":[{"Session Token":[]}],"parameters":[{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":3,"maxLength":30},{"type":"null"}],"description":"Filter workflows by a substring in their name.","examples":["blast"],"title":"Name Substring"},"description":"Filter workflows by a substring in their name."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`.","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`."},{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowOut"},"title":"Response Workflow-List Workflows"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"List workflow OTRs","description":"Get the ownership transfer requests for workflows.\n\nPermission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `workflow:list_all`","operationId":"Workflow-list_workflow_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Workflow-List Workflow Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/developer_statistics":{"get":{"tags":["Workflow"],"summary":"Get anonymized workflow execution","description":"Get the workflow executions with meta information and anonymized user IDs.\n\nPermission `workflow:read` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:read_any`.","operationId":"Workflow-get_developer_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"developer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter by the developer of the workflows","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Developer Id"},"description":"Filter by the developer of the workflows"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid"}},{"type":"null"}],"description":"Filter by workflow IDs","title":"Workflow Id"},"description":"Filter by workflow IDs"},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions after this date","title":"Start"},"description":"Filter by workflow executions after this date"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filter by workflow executions before this date","title":"End"},"description":"Filter by workflow executions before this date"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AnonymizedWorkflowExecution"},"title":"Response Workflow-Get Developer Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}":{"get":{"tags":["Workflow"],"summary":"Get a workflow","description":"Get a specific workflow.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow","description":"Delete a workflow.\n\nPermission `workflow:delete` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:delete_any`.","operationId":"Workflow-delete_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/ownership_transfer_request":{"get":{"tags":["Workflow"],"summary":"Get a workflow OTR","description":"Get a specific workflow ownership transfer request.\n\nPermission `workflow:read` required if current user is the current or new owner of the workflow,\notherwise `workflow:read_any` required.","operationId":"Workflow-get_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Workflow"],"summary":"Create a workflow OTR","description":"Create a ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the current owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-create_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for workflow OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Workflow"],"summary":"Accept a workflow OTR","description":"Accept an ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-accept_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow"],"summary":"Delete a workflow OTR","description":"Delete/Reject a workflow ownership transfer request.\n\nPermission `workflow:update` required if current user is the current or new owner of the workflow,\notherwise `workflow:update_any` required.","operationId":"Workflow-delete_workflow_otr","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/statistics":{"get":{"tags":["Workflow"],"summary":"Get statistics for a workflow","description":"Get the number of started workflow per day.\n\nPermission `workflow:read` required.","operationId":"Workflow-get_workflow_statistics","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowStatistic"},"title":"Response Workflow-Get Workflow Statistics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/update":{"post":{"tags":["Workflow"],"summary":"Update a workflow","description":"Create a new workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow-update_workflow","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdate","description":"Meta-data for the workflow version to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions":{"get":{"tags":["Workflow Version"],"summary":"Get all versions of a workflow","description":"List all versions of a Workflow.\n\nPermission `workflow:list` required.","operationId":"Workflow Version-list_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionStatus"}},{"type":"null"}],"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`","title":"Version Status"},"description":"Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"title":"Response Workflow Version-List Workflow Version"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}":{"get":{"tags":["Workflow Version"],"summary":"Get a workflow version","description":"Get a specific version of a workflow.\n\nPermission `workflow:read` required if the version is public or you are the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit `git_commit_hash` of specific version or `latest`.","examples":["latest","ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit `git_commit_hash` of specific version or `latest`."},{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/status":{"patch":{"tags":["Workflow Version"],"summary":"Update status of workflow version","description":"Update the status of a workflow version.\n\nPermission `workflow:update_status`","operationId":"Workflow Version-update_workflow_version_status","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionStatusSchema","description":"New Status of the workflow version"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/metadata":{"get":{"tags":["Workflow Version"],"summary":"Get metadata of workflow version","description":"Get the metadata of a workflow version.\n\nPermission `workflow:read` required if the current user is the developer of the workflow,\notherwise `workflow:read_any`","operationId":"Workflow Version-get_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Version"],"summary":"Update metadata of workflow version","description":"Update the metadata of a workflow version.\n\nPermission `workflow:update` required if the current user is the developer of the workflow,\notherwise `workflow:update_any`","operationId":"Workflow Version-update_workflow_version_metadata","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionMetadataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate":{"patch":{"tags":["Workflow Version"],"summary":"Deprecate a workflow version","description":"Deprecate a workflow version.\n\nPermission `workflow:update` required if you are the developer of the workflow,\notherwise `workflow:update_status`","operationId":"Workflow Version-deprecate_workflow_version","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension":{"patch":{"tags":["Workflow Version"],"summary":"Update parameter extension of workflow version","description":"Update the parameter extension of a workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-update_workflow_version_parameter_extension","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ParameterExtension-Input","description":"Parameter extension specific for this CloWM instance"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/documentation":{"get":{"tags":["Workflow Version"],"summary":"Fetch documentation for a workflow version","description":"Get the documentation for a specific workflow version.\nStreams the response directly from the right git repository.\n\nPermission `workflow:read` required.","operationId":"Workflow Version-download_workflow_documentation","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."},{"name":"document","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DocumentationEnum","description":"Specify which type of documentation the client wants to fetch","default":"usage.md"},"description":"Specify which type of documentation the client wants to fetch"},{"name":"mode_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Workflow Mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"Workflow Mode"}],"responses":{"200":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/versions/{git_commit_hash}/icon":{"post":{"tags":["Workflow Version"],"summary":"Upload icon for workflow version","description":"Upload an icon for the workflow version and returns the new icon URL.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-upload_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_Workflow_Version-upload_workflow_version_icon"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IconUpdateOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Version"],"summary":"Delete icon of workflow version","description":"Delete the icon of the workflow version.\n\nPermission `workflow:update` required.","operationId":"Workflow Version-delete_workflow_version_icon","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"},{"name":"git_commit_hash","in":"path","required":true,"schema":{"type":"string","maxLength":40,"pattern":"^([0-9a-f]{40}|latest)$","description":"Git commit git_commit_hash of specific version.","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Git Commit Hash"},"description":"Git commit git_commit_hash of specific version."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions":{"post":{"tags":["Workflow Execution"],"summary":"Start a new workflow execution","description":"Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.\n\nPermission `workflow_execution:create` required if workflow versions status is `PUBLISHED`,\notherwise `workflow_execution:create_any` required.","operationId":"Workflow Execution-start_workflow","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Workflow Execution"],"summary":"List all workflow executions","description":"Get all workflow executions.\n\nThis endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the\n`Link` header.\nA missing `Link` header indicates that you iterated over all workflow executions with the current filters.\n\nPermission `workflow_execution:list` required, if `executor_id` is the same as the current user,\notherwise `workflow_execution:list_all` required.","operationId":"Workflow Execution-list_workflow_executions","security":[{"Session Token":[]}],"parameters":[{"name":"executor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Executor Id"},"description":"Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required."},{"name":"execution_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionStatus"}},{"type":"null"}],"description":"Filter for status of workflow execution","title":"Execution Status"},"description":"Filter for status of workflow execution"},{"name":"workflow_version_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":40,"maxLength":40,"pattern":"^[0-9a-f]+$"},{"type":"null"}],"description":"Filter for workflow version","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],"title":"Workflow Version Id"},"description":"Filter for workflow version"},{"name":"workflow_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Workflow Id"},"description":"Filter for workflow"},{"name":"start_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started after this UNIX timestamp","examples":[1640991600],"title":"Start After"},"description":"Filter for workflow executions that started after this UNIX timestamp"},{"name":"start_before","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967295,"minimum":1},{"type":"null"}],"description":"Filter for workflow executions that started before this UNIX timestamp","examples":[1640991600],"title":"Start Before"},"description":"Filter for workflow executions that started before this UNIX timestamp"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WorkflowExecutionOut"},"title":"Response Workflow Execution-List Workflow Executions"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/workflow_executions?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/arbitrary":{"post":{"tags":["Workflow Execution"],"summary":"Start a workflow execution with arbitrary git repository","description":"Start a new workflow execution from an arbitrary git repository.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.","operationId":"Workflow Execution-start_arbitrary_workflow","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevWorkflowExecutionIn","description":"Meta-data and parameters for the workflow to start"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"Session Token":[]}]}},"/ui/workflow_executions/{eid}":{"get":{"tags":["Workflow Execution"],"summary":"Get a workflow execution","description":"Get a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowExecutionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Execution"],"summary":"Delete a workflow execution","description":"Delete a specific workflow execution.\n\nPermission `workflow_execution:delete` required if the current user started the workflow execution,\notherwise `workflow_execution:delete_any` required.","operationId":"Workflow Execution-delete_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/params":{"get":{"tags":["Workflow Execution"],"summary":"Get the parameters of a workflow execution","description":"Get the parameters of a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.","operationId":"Workflow Execution-get_workflow_execution_params","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","title":"Response Workflow Execution-Get Workflow Execution Params"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_executions/{eid}/cancel":{"post":{"tags":["Workflow Execution"],"summary":"Cancel a workflow execution","description":"Cancel a running workflow execution.\n\nPermission `workflow_execution:cancel` required if the current user started the workflow execution,\notherwise `workflow_execution:cancel_any` required.","operationId":"Workflow Execution-cancel_workflow_execution","security":[{"Session Token":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow execution.","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Eid"},"description":"ID of a workflow execution."}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflows/{wid}/credentials":{"get":{"tags":["Workflow Credentials"],"summary":"Get the credentials of a workflow","description":"Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-get_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Workflow Credentials"],"summary":"Update the credentials of a workflow","description":"Update the credentials for the repository of a workflow.\n\nPermission `workflow:update` required.","operationId":"Workflow Credentials-update_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCredentialsIn","description":"Updated credentials for the workflow git repository"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Workflow Credentials"],"summary":"Delete the credentials of a workflow","description":"Delete the credentials for the repository of a workflow.\n\nPermission `workflow:delete` required if the developer of the workflow is the same as the current user,\nother `workflow:delete_any`.","operationId":"Workflow Credentials-delete_workflow_credentials","security":[{"Session Token":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow","examples":["0cc78936-381b-4bdd-999d-736c40591078"],"title":"Wid"},"description":"ID of a workflow"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/workflow_modes/{mode_id}":{"get":{"tags":["Workflow Mode"],"summary":"Get workflow mode","description":"Get a workflow mode.\n\nPermission `workflow:read` required","operationId":"Workflow Mode-get_workflow_mode","security":[{"Session Token":[]}],"parameters":[{"name":"mode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a workflow mode","examples":["8d47e878-f25f-41aa-b4a0-95d426b46f45"],"title":"Mode Id"},"description":"ID of a workflow mode"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowModeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources":{"post":{"tags":["Resource"],"summary":"Request a new resource","description":"Request a new resources.\n\nPermission `resource:create` required.","operationId":"Resource-create_resource","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceIn","description":"Meta-data for the resource to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Resource"],"summary":"List resources","description":"List all resources.\n\nPermission `resource:list` required.","operationId":"Resource-list_resources","security":[{"Session Token":[]}],"parameters":[{"name":"maintainer_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Maintainer Id"},"description":"Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`."},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required."},{"name":"name_substring","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"description":"Filter resources by a substring in their name.","examples":["gtdb"],"title":"Name Substring"},"description":"Filter resources by a substring in their name."},{"name":"public","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter resources to by the public flag","title":"Public"},"description":"Filter resources to by the public flag"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceOut"},"title":"Response Resource-List Resources"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/sync_requests":{"get":{"tags":["Resource"],"summary":"List resource sync requests","description":"List all resource sync requests.\n\nPermission `resource:update_any` required.","operationId":"Resource-list_sync_requests","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserSynchronizationRequestOut"},"type":"array","title":"Response Resource-List Sync Requests"}}}}},"security":[{"Session Token":[]}]}},"/ui/resources/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"List resource OTRs","description":"Get the ownership transfer requests for resources.\n\nPermission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `resource:list_all`","operationId":"Resource-list_resource_otrs","security":[{"Session Token":[]}],"parameters":[{"name":"current_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who is the current owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"Current Owner Id"},"description":"UID of user who is the current owner."},{"name":"new_owner_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"UID of user who will be the new owner.","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"],"title":"New Owner Id"},"description":"UID of user who will be the new owner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"},"title":"Response Resource-List Resource Otrs"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}":{"get":{"tags":["Resource"],"summary":"Get a resource","description":"Get a specific resource.\n\nPermission `resource:read` required.","operationId":"Resource-get_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource","description":"Delete a resources.\n\nPermission `resource:delete` required.","operationId":"Resource-delete_resource","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/ownership_transfer_request":{"get":{"tags":["Resource"],"summary":"Get a resource OTR","description":"Get a specific resource ownership transfer request.\n\nPermission `resource:read` required if the current user is the current or new owner of the resource,\notherwise `resource:read_any` required.","operationId":"Resource-get_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Resource"],"summary":"Create a resource OTR","description":"Create a ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the current owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-create_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestIn","description":"Meta-data for the resource OTR to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipTransferRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Resource"],"summary":"Accept a resource OTR","description":"Accept an ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-accept_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Resource"],"summary":"Delete a resource OTR","description":"Delete/Reject a resource ownership transfer request.\n\nPermission `resource:update` required if the current user is the current or new owner of the resource,\notherwise `resource:update_any` required.","operationId":"Resource-delete_resource_otr","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions":{"get":{"tags":["ResourceVersion"],"summary":"List versions of a resource","description":"List all the resource version for a specific resource.\n\nPermission 'resource:read' required.","operationId":"ResourceVersion-list_resource_versions","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"version_status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionStatus"}},{"type":"null"}],"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.","title":"Version Status"},"description":"Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ResourceVersionOut"},"title":"Response Resourceversion-List Resource Versions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["ResourceVersion"],"summary":"Request new version of a resource","description":"Request a new resource version.\n\nPermission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise.","operationId":"ResourceVersion-request_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionIn","description":"Meta-data for the resource version to request"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}":{"get":{"tags":["ResourceVersion"],"summary":"Get version of a resource","description":"Get a specific resource version for a specific resource.\n\nPermission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and\nthe current user is not the maintainer, then the permission `resource:read_any` is required.","operationId":"ResourceVersion-get_resource_version","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/tree":{"get":{"tags":["ResourceVersion"],"summary":"Download folder structure of resource","description":"Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster.\n\nPermission `resource:read` required.","operationId":"ResourceVersion-resource_file_tree","security":[{"Session Token":[]}],"parameters":[{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"},{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileTree"},"title":"Response Resourceversion-Resource File Tree"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_review":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version review","description":"Request the review of a resource version.\n\nPermission `resource:update` required.","operationId":"ResourceVersion-request_resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/request_sync":{"put":{"tags":["ResourceVersion"],"summary":"Request resource version synchronization","description":"Request the synchronization of a resource version to the cluster.\n\nPermission `resource:request_sync` required.","operationId":"ResourceVersion-request_resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserSynchronizationRequestIn","description":"Meta-data for the synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/review":{"put":{"tags":["ResourceVersion"],"summary":"Review resource version","description":"Review answer the resource version.\n\nPermission `resource:update_status` required.","operationId":"ResourceVersion-resource_version_review","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer for the resource version review"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/sync":{"put":{"tags":["ResourceVersion"],"summary":"Synchronize resource version with cluster","description":"Synchronize the resource version to the cluster.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_sync","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserRequestAnswer","description":"Answer to the resource version synchronization request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/latest":{"put":{"tags":["ResourceVersion"],"summary":"Set resource version to latest","description":"Set the resource version as the latest version.\n\nPermission `resource:update_any` required.","operationId":"ResourceVersion-resource_version_latest","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/cluster":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version on cluster","description":"Delete the resource version on the cluster.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_cluster","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/resources/{rid}/versions/{rvid}/s3":{"delete":{"tags":["ResourceVersion"],"summary":"Delete resource version in S3","description":"Delete the resource version in the S3 bucket.\n\nPermission `resource:delete_any` required.","operationId":"ResourceVersion-delete_resource_version_s3","security":[{"Session Token":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],"title":"Rid"},"description":"ID of a resource"},{"name":"rvid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"],"title":"Rvid"},"description":"ID of a resource version"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResourceVersionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news":{"post":{"tags":["News"],"summary":"Create news","description":"Create a news event.\n\nPermission `news:create` required.","operationId":"News-create_news","security":[{"Session Token":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsIn","description":"Meta-data for news event to create"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["News"],"summary":"List news","description":"List all news events with filters.\n\nThis endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header.\nA missing `Link` header indicates that you iterated over all news with the current filters.\n\nPermission `news:list` required.","operationId":"News-list_news","security":[{"Session Token":[]}],"parameters":[{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4294967296,"minimum":0},{"type":"null"}],"description":"Filter for news that are created after this UNIX timestamp","title":"Created After"},"description":"Filter for news that are created after this UNIX timestamp"},{"name":"creator_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter for news created by a specific user","title":"Creator Id"},"description":"Filter for news created by a specific user"},{"name":"id_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Id of the item to start the query from. DO NOT SET MANUALLY.","title":"Id After"},"description":"Id of the item to start the query from. DO NOT SET MANUALLY."},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"description":"Number of items to list per page","default":20,"title":"Per Page"},"description":"Number of items to list per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort order of items with creation time","default":"desc","title":"Sort"},"description":"Sort order of items with creation time"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NewsOut"},"title":"Response News-List News"}}},"headers":{"link":{"description":"Link for the next pagination page if there is any","schema":{"type":"string","example":"<https://dev.clowm.de/api/news?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/news/latest":{"get":{"tags":["News"],"summary":"Get latest news","description":"List the current news events.\n\nPermission `news:list` required.","operationId":"News-list_latest_news","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/NewsOut"},"type":"array","title":"Response News-List Latest News"}}}}},"security":[{"Session Token":[]}]}},"/ui/news/{nid}":{"get":{"tags":["News"],"summary":"Get a specific news","description":"Get a specified news event.\n\nPermission `news:read` required.","operationId":"News-get_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["News"],"summary":"Delete a specific news","description":"Delete a specified news event.\n\nPermission `news:delete` required.","operationId":"News-delete_news","security":[{"Session Token":[]}],"parameters":[{"name":"nid","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"ID of a news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],"title":"Nid"},"description":"ID of a news event"}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ui/public/workflows":{"get":{"tags":["Public"],"summary":"Get available workflows","description":"Public route to fetch all available workflows.","operationId":"Public-get_public_workflows","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/PublicWorkflowOut"},"type":"array","title":"Response Public-Get Public Workflows"}}}}}}}},"components":{"schemas":{"AnonymizedWorkflowExecution":{"properties":{"workflow_execution_id":{"type":"string","title":"Workflow Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"pseudo_uid":{"type":"string","title":"Pseudo Uid","description":"Anonymized user ID of the user who ran the workflow execution","examples":["7ed4249857b656e96f456449796e461e6001d3fb2481a44701f70ca437bd53a2"]},"workflow_mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Mode Id","description":"ID of the workflow mode this workflow execution ran in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"workflow_version_id":{"type":"string","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"started_at":{"type":"string","format":"date","title":"Started At","description":"Day of the workflow execution","examples":["2023-01-01"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"developer_id":{"type":"string","title":"Developer Id","description":"ID of developer of the workflow","examples":["28c5353b8bb34984a8bd4169ba94c606"]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"End status of the workflow execution","examples":["SUCCESS"]}},"type":"object","required":["workflow_execution_id","pseudo_uid","workflow_version_id","started_at","workflow_id","developer_id","status"],"title":"AnonymizedWorkflowExecution"},"ApiTokenIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"}},"type":"object","required":["name","scopes"],"title":"ApiTokenIn"},"ApiTokenOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]}},"type":"object","required":["name","scopes","token_id","uid","created_at"],"title":"ApiTokenOut"},"ApiTokenPrivateOut":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^[a-z\\d-]+$","title":"Name","description":"Short name for the API token","examples":["api-token-42"]},"expires_at":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Expires At","description":"Unix timestamp when the token should expire","examples":[1719784800]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"List of scopes this Api token has"},"token_id":{"type":"string","title":"Token Id","description":"The ID of the token","examples":["b4c861a7-7f52-4332-a001-78e0500dabbc"]},"uid":{"type":"string","title":"Uid","description":"The ID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","title":"Created At","description":"The UNIX timestamp when this token was created","examples":["1717192800"]},"last_used":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Used","description":"The UNIX timestamp when this token was used the last time","examples":["1717193800"]},"token":{"type":"string","title":"Token","description":"The actual token used for authentication","examples":["J21NRKUYgyVUgvJ3cIdllS-MMa9ny1UDKFF18aetDvo"]}},"type":"object","required":["name","scopes","token_id","uid","created_at","token"],"title":"ApiTokenPrivateOut"},"Body_Bucket-update_bucket_public_state":{"properties":{"public":{"type":"boolean","title":"Public","description":"New public state"}},"type":"object","required":["public"],"title":"Body_Bucket-update_bucket_public_state"},"Body_Workflow_Version-upload_workflow_version_icon":{"properties":{"icon":{"type":"string","format":"binary","title":"Icon","description":"Icon for the Workflow."}},"type":"object","required":["icon"],"title":"Body_Workflow Version-upload_workflow_version_icon"},"BucketIn":{"properties":{"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]}},"type":"object","required":["name","description"],"title":"BucketIn","description":"Schema for creating a new bucket."},"BucketOut":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]},"name":{"type":"string","maxLength":63,"minLength":3,"pattern":"^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$","title":"Name","description":"Name of the bucket","examples":["test-bucket"]},"description":{"type":"string","maxLength":65536,"minLength":16,"title":"Description","description":"Description of the bucket","examples":["This is a sample description of a bucket"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]},"owner_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Id","description":"UID of the owner","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"public":{"type":"boolean","title":"Public","description":"Flag if the bucket is anonymously readable"}},"type":"object","required":["name","description","created_at","owner_id","public"],"title":"BucketOut","description":"Schema for answering a request with a bucket."},"BucketPermissionIn":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","format":"uuid","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionIn"},"BucketPermissionOut":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"},"uid":{"type":"string","title":"Uid","description":"UID of the grantee","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"bucket_name":{"type":"string","maxLength":63,"minLength":3,"title":"Bucket Name","description":"Name of Bucket","examples":["test-bucket"]}},"type":"object","required":["scopes","uid","bucket_name"],"title":"BucketPermissionOut","description":"Schema for the bucket permissions."},"BucketPermissionParameters":{"properties":{"from_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"From Timestamp","description":"Start date of permission as UNIX timestamp","examples":[1640991600]},"to_timestamp":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"To Timestamp","description":"End date of permission as UNIX timestamp","examples":[1640991600]},"file_prefix":{"anyOf":[{"type":"string","maxLength":512,"minLength":1},{"type":"null"}],"title":"File Prefix","description":"Prefix of subfolder","examples":["pseudo/sub/folder/"]},"scopes":{"items":{"type":"string","enum":["read","write"]},"type":"array","minItems":1,"title":"Scopes","description":"Scopes of the bucket permission"}},"type":"object","required":["scopes"],"title":"BucketPermissionParameters","description":"Schema for the parameters of a bucket permission."},"BucketSizeLimits":{"properties":{"size_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Size Limit","description":"Size limit of the bucket in KiB","examples":[10240]},"object_limit":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Object Limit","description":"Number of objects limit of the bucket","examples":[10000]}},"type":"object","title":"BucketSizeLimits","description":"Schema to represent bucket limits."},"BucketType":{"type":"string","enum":["OWN","ALL","PERMISSION"],"title":"BucketType","description":"Enumeration for the type of buckets to fetch from the DB\n\nOWN: Only fetch buckets that the user owns\nPERMISSION: Only fetch foreign buckets that the user has access to\nALL: Fetch all buckets that the user has access to"},"DevWorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"mode":{"anyOf":[{"$ref":"#/components/schemas/WorkflowModeIn"},{"type":"null"}],"description":"Mode of the workflow with an alternative entrypoint"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow execution requires"}},"type":"object","required":["parameters","git_commit_hash","repository_url","nextflow_version"],"title":"DevWorkflowExecutionIn"},"DocumentationEnum":{"type":"string","enum":["usage.md","input.md","output.md","changelog.md","parameter_schema.json","clowm_info.json","CITATIONS.md"],"title":"DocumentationEnum"},"FileTree":{"properties":{"type":{"type":"string","enum":["file","directory","link"],"title":"Type"},"name":{"type":"string","title":"Name"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"contents":{"anyOf":[{"items":{"$ref":"#/components/schemas/FileTree"},"type":"array"},{"type":"null"}],"title":"Contents"},"size":{"type":"integer","title":"Size"}},"type":"object","required":["type","name","size"],"title":"FileTree"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IconUpdateOut":{"properties":{"icon_url":{"type":"string","minLength":1,"format":"uri","title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["icon_url"],"title":"IconUpdateOut"},"InstanceSpecificDefaultParameters":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}]},"type":"object"},"NewsIn":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event","default":"system"}},"type":"object","required":["content","title"],"title":"NewsIn"},"NewsOut":{"properties":{"content":{"type":"string","maxLength":65536,"minLength":16,"title":"Content","description":"Content of the news. Can contain Markdown.","examples":["## Header\n\nSome text"]},"title":{"type":"string","maxLength":256,"minLength":3,"title":"Title","description":"Title of the news","examples":["Some title"]},"important_till":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"Important Till","description":"UNIX timestamp till the news is important.","examples":[1640991600]},"category":{"type":"string","enum":["workflow","resource","system"],"title":"Category","description":"Category of the news event"},"news_id":{"type":"string","title":"News Id","description":"ID of the news event","examples":["f3e2acf0-e942-44b2-8f85-52b7deb660ec"]},"creator_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Creator Id","description":"ID of the creator","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"UNIX timestamp when the bucket was created","examples":[1640991600]}},"type":"object","required":["content","title","category","news_id","created_at"],"title":"NewsOut"},"NextflowVersion":{"type":"string","enum":["22.10.0","22.10.1","22.10.2","22.10.3","22.10.4","22.10.5","22.10.6","22.10.7","22.10.8","23.04.0","23.04.1","23.04.2","23.04.3","23.04.4","23.04.5","23.10.0","23.10.1","23.10.2","23.10.3","23.10.4","24.04.1","24.04.2","24.04.3","24.04.4","24.10.0"],"title":"NextflowVersion"},"OIDCProvider":{"type":"string","enum":["lifescience-aai","nfdi-aai"],"title":"OIDCProvider"},"OwnershipTransferRequestIn":{"properties":{"new_owner_uid":{"type":"string","format":"uuid","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Comment","description":"An optional comment for the transfer request","examples":["This is an example comment"]}},"type":"object","required":["new_owner_uid"],"title":"OwnershipTransferRequestIn"},"OwnershipTransferRequestOut":{"properties":{"new_owner_uid":{"type":"string","title":"New Owner Uid","description":"The new owner that get the request","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"comment":{"type":"string","title":"Comment","description":"An optional comment for the transfer request","default":"","examples":["This is an example comment"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Time when the ownership transfer was requested as UNIX timestamp","examples":[1640991600]},"current_owner_uid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Owner Uid","description":"The current uid of the current owner if he exists","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"target_id":{"type":"string","title":"Target Id","description":"Id of the target that gets its ownership transferred"},"target_name":{"type":"string","title":"Target Name","description":"Name of the target","examples":["example-bucket","Example Workflow","Example Resource"]},"target_description":{"type":"string","title":"Target Description","description":"Description of then target","examples":["Some long description of a target"]},"target_type":{"$ref":"#/components/schemas/OwnershipTypeEnum","description":"Target type of the ownership transfer","examples":["bucket"]}},"type":"object","required":["new_owner_uid","created_at","target_id","target_name","target_description","target_type"],"title":"OwnershipTransferRequestOut"},"OwnershipTypeEnum":{"type":"string","enum":["bucket","workflow","resource"],"title":"OwnershipTypeEnum"},"ParameterExtension-Input":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterExtension-Output":{"properties":{"mapping":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"}]},"type":"object"},"type":"object","title":"Mapping","description":"The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.","examples":[{"some-complex-parameter":{"Option 1":"/some/path","Option 2":"/some/other/path"}}]},"defaults":{"$ref":"#/components/schemas/InstanceSpecificDefaultParameters","description":"Dictionary with parameter name as key and default value as value","examples":[{"parameter1":"somevalue","parameter2":12}]},"parameter_visibility":{"$ref":"#/components/schemas/ParameterVisibilityMapping"}},"type":"object","title":"ParameterExtension"},"ParameterVisibility":{"type":"integer","enum":[10,20,30,40],"title":"ParameterVisibility"},"ParameterVisibilityMapping":{"additionalProperties":{"$ref":"#/components/schemas/ParameterVisibility"},"type":"object"},"PermissionStatus":{"type":"string","enum":["ACTIVE","INACTIVE"],"title":"PermissionStatus","description":"Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the\npermission itself has a time limit and the current time is not in the timespan."},"PublicWorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"latest_git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Latest Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"latest_version_tag":{"type":"string","maxLength":10,"minLength":5,"title":"Latest Version Tag","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"developer":{"type":"string","title":"Developer","description":"Name of the developer","default":"","examples":["Bilbo Baggins"]},"latest_version_timestamp":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Latest Version Timestamp","description":"Timestamp when the last version was created as UNIX timestamp","examples":[1640991600]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the workflow icon","readOnly":true,"examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]}},"type":"object","required":["name","short_description","repository_url","workflow_id","latest_git_commit_hash","latest_version_tag","latest_version_timestamp","icon_url"],"title":"PublicWorkflowOut"},"ResourceIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true}},"type":"object","required":["release","name","description","source"],"title":"ResourceIn"},"ResourceOut":{"properties":{"name":{"type":"string","maxLength":32,"minLength":3,"title":"Name","description":"Short Name for the resource","examples":["blast-db"]},"description":{"type":"string","maxLength":264,"minLength":16,"title":"Description","description":"Short description for this resource","examples":["This is a short description for a resource"]},"source":{"type":"string","maxLength":264,"minLength":8,"title":"Source","description":"A link or similar where the resource originates from","examples":["https://example.com/db"]},"private":{"type":"boolean","title":"Private","description":"Flag if this resource should be default visible in the UI","default":true},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"maintainer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Maintainer Id","description":"ID of the maintainer","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"versions":{"items":{"$ref":"#/components/schemas/ResourceVersionOut"},"type":"array","title":"Versions","description":"Versions of the resource"}},"type":"object","required":["name","description","source","resource_id","maintainer_id","versions"],"title":"ResourceOut"},"ResourceVersionIn":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]}},"type":"object","required":["release"],"title":"ResourceVersionIn"},"ResourceVersionOut":{"properties":{"release":{"type":"string","maxLength":32,"minLength":3,"title":"Release","description":"Short tag describing the version of the resource","examples":["01-2023"]},"status":{"$ref":"#/components/schemas/ResourceVersionStatus","description":"Status of the resource version"},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1672527600]},"compressed_size":{"type":"integer","maximum":1.8446744073709552e+19,"minimum":0.0,"title":"Compressed Size","description":"Size of the compressed resource in bytes","examples":[42097156608]},"cluster_path":{"type":"string","title":"Cluster Path","description":"Path to the resource on the cluster if the resource is synchronized","readOnly":true,"examples":["/vol/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4","/vol/resources/CLDB-0e240ccd/latest"]},"s3_path":{"type":"string","title":"S3 Path","description":"Path to the resource in the S3 Bucket. Not publicly available.","readOnly":true,"examples":["s3://clowm-data/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4/resource.tar.gz"]}},"type":"object","required":["release","status","resource_version_id","resource_id","created_at","compressed_size","cluster_path","s3_path"],"title":"ResourceVersionOut"},"ResourceVersionStatus":{"type":"string","enum":["RESOURCE_REQUESTED","WAIT_FOR_REVIEW","DENIED","APPROVED","SYNC_REQUESTED","SYNCHRONIZING","SYNC_ERROR","SYNCHRONIZED","SETTING_LATEST","LATEST","CLUSTER_DELETING","CLUSTER_DELETE_ERROR","S3_DELETING","S3_DELETE_ERROR","S3_DELETED"],"title":"ResourceVersionStatus","description":"Enumeration for the possible status of a resource version."},"RoleEnum":{"type":"string","enum":["administrator","user","reviewer","developer","db_maintainer"],"title":"RoleEnum"},"S3Key":{"properties":{"uid":{"type":"string","title":"Uid","description":"UID of the user of that access key","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"access_key":{"type":"string","title":"Access Key","description":"ID of the S3 access key","examples":["CRJ6B037V2ZT4U3W17VC"]},"secret_key":{"type":"string","title":"Secret Key","description":"Secret of the S3 access key","examples":["2F5uNTI1qvt4oAroXV0wWct8rWclL2QvFXKqSqjS"]}},"type":"object","required":["uid","access_key","secret_key"],"title":"S3Key","description":"Schema for a S3 key associated with a user."},"UserIn":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","examples":[["user"]]},"email":{"type":"string","format":"email","title":"Email","description":"Email of the user","examples":["user@example.org"]}},"type":"object","required":["display_name","email"],"title":"UserIn"},"UserOut":{"properties":{"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["display_name","uid"],"title":"UserOut","description":"Schema for a user."},"UserOutExtended":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]},"display_name":{"type":"string","maxLength":256,"title":"Display Name","description":"Full Name of the user","examples":["Bilbo Baggins"]},"uid":{"type":"string","title":"Uid","description":"ID of the user","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"lifescience_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lifescience Id","description":"Lifesicence AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"nfdi_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nfdi Id","description":"NFDI AAI ID of the user","examples":["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]},"invitation_token_created_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Invitation Token Created At","description":"Timestamp when the invitation token was created as UNIX timestamp"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email","description":"Email of the user","examples":["user@example.org"]},"gravatar_url":{"type":"string","minLength":1,"format":"uri","title":"Gravatar Url","description":"URL to the gravatar avatar based on the users email","readOnly":true,"examples":["https://gravatar.com/avatar/87a8c45825eb709ee8e453d2c0f8154e1b9bf4b45bb9b81b7662177340aa9d38"]}},"type":"object","required":["roles","display_name","uid","gravatar_url"],"title":"UserOutExtended"},"UserRequestAnswer":{"properties":{"deny":{"type":"boolean","title":"Deny","description":"Flag to indicate if the request was denied.","default":false},"reason":{"anyOf":[{"type":"string","maxLength":512,"minLength":16},{"type":"null"}],"title":"Reason","description":"Reason why the request was denied or approved. Required if request is denied."}},"type":"object","title":"UserRequestAnswer"},"UserRoles":{"properties":{"roles":{"items":{"$ref":"#/components/schemas/RoleEnum"},"type":"array","title":"Roles","description":"Roles of the user","examples":[["user"]]}},"type":"object","required":["roles"],"title":"UserRoles"},"UserSynchronizationRequestIn":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]}},"type":"object","required":["reason"],"title":"UserSynchronizationRequestIn"},"UserSynchronizationRequestOut":{"properties":{"reason":{"type":"string","maxLength":512,"minLength":16,"title":"Reason","description":"Reason why the request was requested.","examples":["This version is required to reproduce a execution with Workflow XY@2.0."]},"resource_version_id":{"type":"string","title":"Resource Version Id","description":"ID of the resource version","examples":["fb4cee12-1e91-49f3-905f-808845c7c1f4"]},"resource_id":{"type":"string","title":"Resource Id","description":"ID of the resource","examples":["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]},"requester_id":{"type":"string","title":"Requester Id","description":"ID of the user that requested this resource synchronization","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]}},"type":"object","required":["reason","resource_version_id","resource_id","requester_id"],"title":"UserSynchronizationRequestOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WorkflowCredentialsIn":{"properties":{"token":{"type":"string","maxLength":128,"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","required":["token"],"title":"WorkflowCredentialsIn"},"WorkflowCredentialsOut":{"properties":{"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]}},"type":"object","title":"WorkflowCredentialsOut"},"WorkflowExecutionIn":{"properties":{"parameters":{"type":"object","title":"Parameters","description":"Parameters for this workflow"},"logs_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where to save logs and reports. If None, nothing will be uploaded.","examples":["s3://example-bucket/logs"]},"provenance_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where to save provenance information. If None, nothing will be uploaded.","examples":["s3://example-bucket/provenance"]},"debug_s3_path":{"anyOf":[{"type":"string","maxLength":1024,"minLength":3,"pattern":"^s3://(\\w){1}(\\w-\\./)*(\\w){1}"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.","examples":["s3://example-bucket/debug"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["parameters","workflow_version_id"],"title":"WorkflowExecutionIn"},"WorkflowExecutionOut":{"properties":{"workflow_version_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Version Id","description":"Workflow version git commit hash","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"notes":{"anyOf":[{"type":"string","maxLength":65536},{"type":"null"}],"title":"Notes","description":"Optional notes for this workflow execution","examples":["Some workflow execution specific notes"]},"mode_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode Id","description":"ID of the workflow mode this workflow execution runs in","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"execution_id":{"type":"string","title":"Execution Id","description":"ID of the workflow execution","examples":["591b6a6e-a1f0-420d-8a20-a7a60704f695"]},"executor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Executor Id","description":"UID of user who started the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"start_time":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Start Time","description":"Start time of the workflow execution as UNIX timestamp","examples":[1640991600]},"end_time":{"anyOf":[{"type":"integer","maximum":4294967295.0,"minimum":1.0},{"type":"null"}],"title":"End Time","description":"End time of the workflow execution as UNIX timestamp","examples":[1640991600]},"status":{"$ref":"#/components/schemas/WorkflowExecutionStatus","description":"Status of the workflow execution","examples":["RUNNING"]},"workflow_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workflow Id","description":"Id of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"logs_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logs S3 Path","description":"S3 Path where logs and reports are saved.","examples":["s3://example-bucket/logs/run-591b6a6ea1f0420d8a20a7a60704f695"]},"provenance_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provenance S3 Path","description":"S3 Path where provenance information is saved.","examples":["s3://example-bucket/provenance/run-591b6a6ea1f0420d8a20a7a60704f695"]},"debug_s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Debug S3 Path","description":"S3 Path where debug information from Nextflow is saved.","examples":["s3://example-bucket/debug/run-591b6a6ea1f0420d8a20a7a60704f695"]},"cpu_time":{"type":"string","format":"duration","title":"Cpu Time","description":"The consumed cpu time in ISO 8601 format","examples":["P4DT12H30M5S"]}},"type":"object","required":["execution_id","start_time","status","cpu_time"],"title":"WorkflowExecutionOut"},"WorkflowExecutionStatus":{"type":"string","enum":["PENDING","SCHEDULED","RUNNING","CANCELED","SUCCESS","ERROR"],"title":"WorkflowExecutionStatus","description":"Enumeration for the status on a workflow execution."},"WorkflowIn":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"initial_version":{"type":"string","maxLength":10,"minLength":5,"title":"Initial Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"token":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Token","description":"Token to access the content git repository","examples":["vnpau89avpa48iunga984gh9h89pvhj"]},"modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","maxItems":10,"title":"Modes","description":"List of modes with alternative entrypoint the new workflow has","default":[]},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["name","short_description","repository_url","git_commit_hash","initial_version","nextflow_version"],"title":"WorkflowIn"},"WorkflowModeIn":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]}},"type":"object","required":["schema_path","entrypoint","name"],"title":"WorkflowModeIn"},"WorkflowModeOut":{"properties":{"schema_path":{"type":"string","maxLength":256,"title":"Schema Path","description":"Path to the alternative parameter schema","examples":["modes/schema1.json"]},"entrypoint":{"type":"string","maxLength":256,"title":"Entrypoint","description":"Name of the process the workflow should start with. Argument to the parameter '-entry'","examples":["example"]},"name":{"type":"string","maxLength":128,"title":"Name","description":"Name of the workflow mode","examples":["Example Name"]},"mode_id":{"type":"string","title":"Mode Id","description":"ID of the workflow mode","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["schema_path","entrypoint","name","mode_id"],"title":"WorkflowModeOut"},"WorkflowOut":{"properties":{"name":{"type":"string","maxLength":64,"minLength":3,"title":"Name","description":"Short descriptive name of the workflow","examples":["RNA ReadMapper"]},"short_description":{"type":"string","maxLength":256,"minLength":64,"title":"Short Description","description":"Short description of the workflow","examples":["This should be a very good example of a short and descriptive description"]},"repository_url":{"type":"string","minLength":1,"format":"uri","title":"Repository Url","description":"URL to the Git repository belonging to this workflow","examples":["https://github.com/example-user/example"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"versions":{"items":{"$ref":"#/components/schemas/WorkflowVersionOut"},"type":"array","title":"Versions","description":"Versions of the workflow"},"developer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Developer Id","description":"ID of developer of the workflow","examples":["1d3387f3-95c0-4813-8767-2cad87faeebf"]},"private":{"type":"boolean","title":"Private","description":"Flag if the workflow is hosted in a private git repository","default":false}},"type":"object","required":["name","short_description","repository_url","workflow_id","versions"],"title":"WorkflowOut"},"WorkflowStatistic":{"properties":{"day":{"type":"string","format":"date","title":"Day","description":"Day of the datapoint","examples":["2023-01-01"]},"count":{"type":"integer","title":"Count","description":"Number of started workflows on that day","examples":[1]}},"type":"object","required":["day","count"],"title":"WorkflowStatistic"},"WorkflowUpdate":{"properties":{"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"git_commit_hash":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Git Commit Hash","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"append_modes":{"items":{"$ref":"#/components/schemas/WorkflowModeIn"},"type":"array","title":"Append Modes","description":"Add modes to the new workflow version"},"delete_modes":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Delete Modes","description":"Delete modes for the new workflow version.","examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]}},"type":"object","required":["version","git_commit_hash"],"title":"WorkflowUpdate"},"WorkflowVersionMetadataIn":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataIn"},"WorkflowVersionMetadataOut":{"properties":{"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]},"nextflow_config":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nextflow Config","description":"Nextflow config that overrides the config in the git repository"},"default_container":{"anyOf":[{"type":"string","pattern":":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"},{"type":"null"}],"title":"Default Container","description":"Default container to use for all Nextflow processes that have to container specified","examples":["debian:12-slim"]}},"type":"object","required":["nextflow_version"],"title":"WorkflowVersionMetadataOut"},"WorkflowVersionOut":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]},"workflow_id":{"type":"string","title":"Workflow Id","description":"ID of the corresponding workflow","examples":["20128c04-e834-40a8-9878-68939ae46423"]},"version":{"type":"string","maxLength":10,"minLength":5,"title":"Version","description":"Version of the Workflow. Should follow semantic versioning","examples":["v1.1.0"]},"icon_url":{"anyOf":[{"type":"string","minLength":1,"format":"uri"},{"type":"null"}],"title":"Icon Url","description":"URL to the uploaded icon","examples":["https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"]},"workflow_version_id":{"type":"string","maxLength":40,"minLength":40,"pattern":"^[0-9a-f]{40}$","title":"Workflow Version Id","description":"Hash of the git commit","examples":["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]},"created_at":{"type":"integer","maximum":4294967295.0,"minimum":1.0,"title":"Created At","description":"Timestamp when the version was created as UNIX timestamp","examples":[1640991600]},"modes":{"items":{"type":"string"},"type":"array","title":"Modes","description":"Optional modes his workflow version has","default":[],"examples":["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]},"parameter_extension":{"anyOf":[{"$ref":"#/components/schemas/ParameterExtension-Output"},{"type":"null"}],"description":"Parameter extension specific for this CloWM instance"},"nextflow_version":{"$ref":"#/components/schemas/NextflowVersion","description":"The version of Nextflow this workflow version requires.","examples":["24.04.4"]}},"type":"object","required":["status","workflow_id","version","workflow_version_id","created_at","nextflow_version"],"title":"WorkflowVersionOut"},"WorkflowVersionStatus":{"type":"string","enum":["CREATED","DENIED","PUBLISHED","DEPRECATED"],"title":"WorkflowVersionStatus","description":"Enumeration for the possible status of a workflow version."},"WorkflowVersionStatusSchema":{"properties":{"status":{"$ref":"#/components/schemas/WorkflowVersionStatus","description":"Status of the workflow version","examples":["PUBLISHED"]}},"type":"object","required":["status"],"title":"WorkflowVersionStatusSchema"}},"securitySchemes":{"Session Token":{"type":"apiKey","description":"The JWT in this cookie is used by the website and should not be used when communicating directly with the API.","in":"cookie","name":"clowm-jwt"}}}}
\ No newline at end of file
+{
+  "openapi": "3.1.0",
+  "info": {
+    "title": "CloWM UI API",
+    "description": "This is the API for the CloWM UI. It is only for internal use and will change without prior notice.",
+    "version": "1.0"
+  },
+  "servers": [{ "url": "/api" }],
+  "paths": {
+    "/auth/login/{provider}": {
+      "get": {
+        "tags": ["Auth"],
+        "summary": "Kickstart the login flow",
+        "description": "Redirect route to OIDC provider to kickstart the login process.",
+        "operationId": "Auth-kickstart_login",
+        "parameters": [
+          {
+            "name": "provider",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "$ref": "#/components/schemas/OIDCProvider",
+              "description": "The OIDC provider to use for login"
+            },
+            "description": "The OIDC provider to use for login"
+          },
+          {
+            "name": "invitation_token",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "minLength": 43, "maxLength": 43 },
+                { "type": "null" }
+              ],
+              "description": "Unique token to validate an invitation",
+              "title": "Invitation Token"
+            },
+            "description": "Unique token to validate an invitation"
+          },
+          {
+            "name": "next",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "maxLength": 128 },
+                { "type": "null" }
+              ],
+              "description": "Will be appended to redirect response in the callback route as URL query parameter `next`",
+              "title": "Next"
+            },
+            "description": "Will be appended to redirect response in the callback route as URL query parameter `next`"
+          }
+        ],
+        "responses": {
+          "302": {
+            "description": "Successful Response",
+            "content": { "application/json": { "schema": {} } }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/auth/login/callback/{provider}": {
+      "get": {
+        "tags": ["Auth"],
+        "summary": "LifeScience Login Callback",
+        "description": "Callback for the login process with an OIDC Provider.\n\nVisit the route login route to start the login process.\n\nIf the user is already known to the system, then a JWT token will be created and sent via the 'set-cookie' header.\nThe key for this Cookie is 'bearer'.\n\nIf the user is new, he will be created him and then a JWT token is issued.\n\nThis JWT has to be sent to all authorized endpoints via the HTTPBearer scheme.",
+        "operationId": "Auth-login_callback",
+        "parameters": [
+          {
+            "name": "provider",
+            "in": "path",
+            "required": true,
+            "schema": { "$ref": "#/components/schemas/OIDCProvider" }
+          }
+        ],
+        "responses": {
+          "302": {
+            "description": "Successful Response",
+            "headers": {
+              "Set-Cookie": {
+                "description": "JWT for accessing the API",
+                "schema": {
+                  "type": "string",
+                  "example": "clowm-jwt=fake-jwt-cookie; Domain=localhost; Max-Age=691200; Path=/; SameSite=strict; Secure"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/auth/account/connect/{provider}": {
+      "get": {
+        "tags": ["Auth"],
+        "summary": "Kickstart the account connection flow",
+        "description": "Redirect route to OIDC provider to connect the CloWM account with the AAI account.",
+        "operationId": "Auth-kickstart_account_connection",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "provider",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "$ref": "#/components/schemas/OIDCProvider",
+              "description": "The OIDC provider to use for login"
+            },
+            "description": "The OIDC provider to use for login"
+          }
+        ],
+        "responses": {
+          "302": {
+            "description": "Successful Response",
+            "content": { "application/json": { "schema": {} } }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/auth/account/callback/{provider}": {
+      "get": {
+        "tags": ["Auth"],
+        "summary": "LifeScience Login Callback",
+        "description": "Callback for the account connection process with an OIDC provider.",
+        "operationId": "Auth-account_connection_callback",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "provider",
+            "in": "path",
+            "required": true,
+            "schema": { "$ref": "#/components/schemas/OIDCProvider" }
+          }
+        ],
+        "responses": {
+          "302": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/auth/logout": {
+      "get": {
+        "tags": ["Auth"],
+        "summary": "Logout",
+        "description": "Logout the user from the system by deleting the bearer cookie.",
+        "operationId": "Auth-logout",
+        "responses": {
+          "302": {
+            "description": "Successful Response",
+            "headers": {
+              "Set-Cookie": {
+                "description": "JWT for accessing the API",
+                "schema": {
+                  "type": "string",
+                  "example": "clowm-jwt=; Domain=localhost; Max-Age=0; Path=/; SameSite=strict; Secure"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/tokens": {
+      "get": {
+        "tags": ["APIToken"],
+        "summary": "List API token",
+        "description": "List meta information about all API token.\n\nPermissions `api_token:list_all` required. See parameter `uid` for exception.",
+        "operationId": "APIToken-list_token",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "uid",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "UID of the user to filter for. Permission `api_token:list` required if current users is the target.",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Uid"
+            },
+            "description": "UID of the user to filter for. Permission `api_token:list` required if current users is the target."
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": { "$ref": "#/components/schemas/ApiTokenOut" },
+                  "title": "Response Apitoken-List Token"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": ["APIToken"],
+        "summary": "Create new API token",
+        "description": "Create a new API token for the current user.\n\nPermission `api_token:create` required.",
+        "operationId": "APIToken-create_token",
+        "security": [{ "Session Token": [] }],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ApiTokenIn",
+                "description": "Meta-data for Api token to create"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/ApiTokenPrivateOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/tokens/{tid}": {
+      "get": {
+        "tags": ["APIToken"],
+        "summary": "Get API token",
+        "description": "Get an API token by id.\n\nPermission `api_token:read` required if the current user is the owner of the API token,\notherwise `api_token:read_any` required.",
+        "operationId": "APIToken-get_token",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "tid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of an API token",
+              "examples": ["b4c861a7-7f52-4332-a001-78e0500dabbc"],
+              "title": "Tid"
+            },
+            "description": "ID of an API token"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/ApiTokenOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["APIToken"],
+        "summary": "Delete API token",
+        "description": "Delete an API token by id.\n\nPermission `api_token:delete` required if the current user is the owner of the API token,\notherwise `api_token:delete_any` required.",
+        "operationId": "APIToken-delete_token",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "tid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of an API token",
+              "examples": ["b4c861a7-7f52-4332-a001-78e0500dabbc"],
+              "title": "Tid"
+            },
+            "description": "ID of an API token"
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/users": {
+      "post": {
+        "tags": ["User"],
+        "summary": "Create User",
+        "description": "Create a new user in the system and notify him.\n\nPermission `user:create` required.",
+        "operationId": "User-create_user",
+        "security": [{ "Session Token": [] }],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/UserIn",
+                "description": "Meta-data for user to create"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/UserOutExtended" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "get": {
+        "tags": ["User"],
+        "summary": "List users and search by their name",
+        "description": "List all users in the system..\n\nPermission `user:list` required.",
+        "operationId": "User-list_users",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "name_substring",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "minLength": 3, "maxLength": 30 },
+                { "type": "null" }
+              ],
+              "description": "Filter users by a substring in their name.",
+              "examples": ["Bilbo"],
+              "title": "Name Substring"
+            },
+            "description": "Filter users by a substring in their name."
+          },
+          {
+            "name": "filter_roles",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                {
+                  "type": "array",
+                  "items": { "$ref": "#/components/schemas/RoleEnum" }
+                },
+                { "type": "null" }
+              ],
+              "description": "Filter users by their role. If multiple are selected, they are concatenating by an OR Expression.",
+              "title": "Filter Roles"
+            },
+            "description": "Filter users by their role. If multiple are selected, they are concatenating by an OR Expression."
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": { "$ref": "#/components/schemas/UserOutExtended" },
+                  "title": "Response User-List Users"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/users/search": {
+      "get": {
+        "tags": ["User"],
+        "summary": "Search Users",
+        "description": "Search for users in the system by their name.\n\nPermission `user: search` required.",
+        "operationId": "User-search_users",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "name_substring",
+            "in": "query",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "minLength": 3,
+              "maxLength": 30,
+              "description": "Filter users by a substring in their name.",
+              "title": "Name Substring"
+            },
+            "description": "Filter users by a substring in their name."
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": { "$ref": "#/components/schemas/UserOut" },
+                  "title": "Response User-Search Users"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/users/me": {
+      "get": {
+        "tags": ["User"],
+        "summary": "Get the logged in user",
+        "description": "Return the user associated with the used JWT.\n\nPermission `user:read` required.",
+        "operationId": "User-get_logged_in_user",
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/UserOutExtended" }
+              }
+            }
+          }
+        },
+        "security": [{ "Session Token": [] }]
+      }
+    },
+    "/ui/users/{uid}": {
+      "get": {
+        "tags": ["User"],
+        "summary": "Get a user by its uid",
+        "description": "Return the user with the specific uid.\n\nPermission `user:read` required.",
+        "operationId": "User-get_user",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "uid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "UID of a user",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Uid"
+            },
+            "description": "UID of a user"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/UserOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["User"],
+        "summary": "Delete a user",
+        "description": "Delete a user and his S3 account.\n\nPermission `user:delete` required if the current user is the target user.",
+        "operationId": "User-delete_user",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "uid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "UID of a user",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Uid"
+            },
+            "description": "UID of a user"
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/users/{uid}/roles": {
+      "put": {
+        "tags": ["User"],
+        "summary": "Update user roles",
+        "description": "Update the roles of a user.\n\nPermission `user:update` required.",
+        "operationId": "User-update_roles",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "uid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "UID of a user",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Uid"
+            },
+            "description": "UID of a user"
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/UserRoles",
+                "description": "The new roles of the user"
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/UserOutExtended" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/users/{uid}/invitation": {
+      "patch": {
+        "tags": ["User"],
+        "summary": "Resend Invitation",
+        "description": "Resend the invitation link for an user that has an open invitation.\n\nPermission `user:create` required.",
+        "operationId": "User-resend_invitation",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "uid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "UID of a user",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Uid"
+            },
+            "description": "UID of a user"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/UserOutExtended" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/users/{uid}/keys": {
+      "get": {
+        "tags": ["S3Key"],
+        "summary": "Get the S3 Access keys from a user",
+        "description": "Get all the S3 Access keys for a specific user.\n\nPermission `s3_key:list` required if the current user is the target, otherwise `s3_key:list_all` required.",
+        "operationId": "S3Key-get_user_keys",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "uid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "UID of a user",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Uid"
+            },
+            "description": "UID of a user"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": { "$ref": "#/components/schemas/S3Key" },
+                  "title": "Response S3Key-Get User Keys"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": ["S3Key"],
+        "summary": "Create a Access key for a user",
+        "description": "Create a S3 Access key for a specific user.\n\nPermission `s3_key:create` required if the current user is the target, otherwise `s3_key:create_any` required.",
+        "operationId": "S3Key-create_user_key",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "uid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "UID of a user",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Uid"
+            },
+            "description": "UID of a user"
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/S3Key" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/users/{uid}/keys/{access_id}": {
+      "get": {
+        "tags": ["S3Key"],
+        "summary": "Get a specific S3 Access key from a user",
+        "description": "Get a specific S3 Access Key for a specific user.\n\nPermission `s3_key:read` required if the current user is the target, otherwise `s3_key:read_any` required.",
+        "operationId": "S3Key-get_user_key",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "access_id",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "description": "ID of the S3 access key",
+              "examples": ["CRJ6B037V2ZT4U3W17VC"],
+              "title": "Access Id"
+            },
+            "description": "ID of the S3 access key"
+          },
+          {
+            "name": "uid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "UID of a user",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Uid"
+            },
+            "description": "UID of a user"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/S3Key" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["S3Key"],
+        "summary": "Delete a specific S3 Access key from a user",
+        "description": "Delete a specific S3 Access key for a specific user.\n\nPermission `s3_key:delete` required if the current user is the target, otherwise `s3_key:delete_any` required.",
+        "operationId": "S3Key-delete_user_key",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "access_id",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "description": "ID of the S3 access key",
+              "examples": ["CRJ6B037V2ZT4U3W17VC"],
+              "title": "Access Id"
+            },
+            "description": "ID of the S3 access key"
+          },
+          {
+            "name": "uid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "UID of a user",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Uid"
+            },
+            "description": "UID of a user"
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/buckets": {
+      "get": {
+        "tags": ["Bucket"],
+        "summary": "List buckets",
+        "description": "List all the buckets in the system or of the desired user where the user has permissions for.\n\nPermission `bucket:list_all` required. See parameter `owner_id` for exception.",
+        "operationId": "Bucket-list_buckets",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "owner_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target.",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Owner Id"
+            },
+            "description": "UID of the user for whom to fetch the buckets for. Permission `bucket:read_any` required if current user is not the target."
+          },
+          {
+            "name": "bucket_type",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "$ref": "#/components/schemas/BucketType",
+              "description": "Type of the bucket to get. Ignored when `user` parameter not set",
+              "default": "ALL"
+            },
+            "description": "Type of the bucket to get. Ignored when `user` parameter not set"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": { "$ref": "#/components/schemas/BucketOut" },
+                  "title": "Response Bucket-List Buckets"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": ["Bucket"],
+        "summary": "Create a bucket for the current user",
+        "description": "Create a bucket for the current user.\n\nThe name of the bucket has some constraints.\nFor more information see the\n[Ceph documentation](https://docs.ceph.com/en/quincy/radosgw/s3/bucketops/#constraints)\n\nPermission `bucket:create` required.",
+        "operationId": "Bucket-create_bucket",
+        "security": [{ "Session Token": [] }],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/BucketIn",
+                "description": "Meta-data for bucket to create"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/BucketOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/buckets/ownership_transfer_request": {
+      "get": {
+        "tags": ["Bucket"],
+        "summary": "List bucket OTRs",
+        "description": "Get the ownership transfer requests for buckets.\n\nPermission `bucket:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `bucket:list_all`",
+        "operationId": "Bucket-list_bucket_otrs",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "current_owner_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "UID of user who is the current owner.",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Current Owner Id"
+            },
+            "description": "UID of user who is the current owner."
+          },
+          {
+            "name": "new_owner_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "UID of user who will be the new owner.",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "New Owner Id"
+            },
+            "description": "UID of user who will be the new owner."
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/OwnershipTransferRequestOut"
+                  },
+                  "title": "Response Bucket-List Bucket Otrs"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/buckets/{bucket_name}": {
+      "get": {
+        "tags": ["Bucket"],
+        "summary": "Get a bucket by its name",
+        "description": "Get a bucket by its name if the current user has READ permissions for the bucket.\n\nPermission `bucket:read` required if the current user is the owner of the bucket,\notherwise `bucket:read_any` required.",
+        "operationId": "Bucket-get_bucket",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "bucket_name",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "minLength": 3,
+              "maxLength": 63,
+              "description": "Name of a bucket",
+              "examples": ["test-bucket"],
+              "title": "Bucket Name"
+            },
+            "description": "Name of a bucket"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/BucketOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["Bucket"],
+        "summary": "Delete a bucket",
+        "description": "Delete a bucket by its name. Only the owner of the bucket can delete the bucket.\n\nPermission `bucket:delete` required if the current user is the owner of the bucket,\notherwise `bucket:delete_any` required.",
+        "operationId": "Bucket-delete_bucket",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "bucket_name",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "minLength": 3,
+              "maxLength": 63,
+              "description": "Name of a bucket",
+              "examples": ["test-bucket"],
+              "title": "Bucket Name"
+            },
+            "description": "Name of a bucket"
+          },
+          {
+            "name": "force_delete",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "boolean",
+              "description": "Delete even non-empty bucket",
+              "default": false,
+              "title": "Force Delete"
+            },
+            "description": "Delete even non-empty bucket"
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/buckets/{bucket_name}/ownership_transfer_request": {
+      "get": {
+        "tags": ["Bucket"],
+        "summary": "Get a bucket OTR",
+        "description": "Get a specific bucket ownership transfer request.\n\nPermission `bucket:read` required if the current user is the current or new owner of the bucket,\notherwise `bucket:read_any` required.",
+        "operationId": "Bucket-get_bucket_otr",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "bucket_name",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "minLength": 3,
+              "maxLength": 63,
+              "description": "Name of a bucket",
+              "examples": ["test-bucket"],
+              "title": "Bucket Name"
+            },
+            "description": "Name of a bucket"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OwnershipTransferRequestOut"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": ["Bucket"],
+        "summary": "Create a bucket OTR",
+        "description": "Create a ownership transfer request for a specific bucket.\n\nPermission `bucket:update` required if the current user is the current owner of the bucket,\notherwise `bucket:update_any` required.",
+        "operationId": "Bucket-create_bucket_otr",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "bucket_name",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "minLength": 3,
+              "maxLength": 63,
+              "description": "Name of a bucket",
+              "examples": ["test-bucket"],
+              "title": "Bucket Name"
+            },
+            "description": "Name of a bucket"
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/OwnershipTransferRequestIn",
+                "description": "Meta-data for the bucket OTR to create"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OwnershipTransferRequestOut"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "patch": {
+        "tags": ["Bucket"],
+        "summary": "Accept a bucket OTR",
+        "description": "Accept an ownership transfer request for a specific workflow.\n\nPermission `bucket:update` required if the current user is the new owner of the workflow,\notherwise `bucket:update_any` required.",
+        "operationId": "Bucket-accept_bucket_otr",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "bucket_name",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "minLength": 3,
+              "maxLength": 63,
+              "description": "Name of a bucket",
+              "examples": ["test-bucket"],
+              "title": "Bucket Name"
+            },
+            "description": "Name of a bucket"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/BucketOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["Bucket"],
+        "summary": "Delete a bucket OTR",
+        "description": "Delete/Reject a bucket ownership transfer request.\n\nPermission `bucket:update` required if the current user is the current or new owner of the bucket,\notherwise `bucket:update_any` required.",
+        "operationId": "Bucket-delete_bucket_otr",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "bucket_name",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "minLength": 3,
+              "maxLength": 63,
+              "description": "Name of a bucket",
+              "examples": ["test-bucket"],
+              "title": "Bucket Name"
+            },
+            "description": "Name of a bucket"
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/buckets/{bucket_name}/public": {
+      "patch": {
+        "tags": ["Bucket"],
+        "summary": "Update public status",
+        "description": "Update the buckets public state.\n\nPermission `bucket:update` required if the current user is the owner of the bucket,\notherwise `bucket:update_any` required.",
+        "operationId": "Bucket-update_bucket_public_state",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "bucket_name",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "minLength": 3,
+              "maxLength": 63,
+              "description": "Name of a bucket",
+              "examples": ["test-bucket"],
+              "title": "Bucket Name"
+            },
+            "description": "Name of a bucket"
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/Body_Bucket-update_bucket_public_state"
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/BucketOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/buckets/{bucket_name}/limits": {
+      "patch": {
+        "tags": ["Bucket"],
+        "summary": "Update bucket limits",
+        "description": "Update the buckets size limits.\n\nPermission `bucket:update_any` required.",
+        "operationId": "Bucket-update_bucket_limits",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "bucket_name",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "minLength": 3,
+              "maxLength": 63,
+              "description": "Name of a bucket",
+              "examples": ["test-bucket"],
+              "title": "Bucket Name"
+            },
+            "description": "Name of a bucket"
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/BucketSizeLimits",
+                "description": "New size limits for bucket"
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/BucketOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/permissions": {
+      "get": {
+        "tags": ["BucketPermission"],
+        "summary": "Get all permissions.",
+        "description": "List all the bucket permissions in the system.\n\nPermission `bucket_permission:list_all` required.",
+        "operationId": "BucketPermission-list_permissions",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "permission_scopes",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                {
+                  "type": "array",
+                  "items": { "enum": ["read", "write"], "type": "string" }
+                },
+                { "type": "null" }
+              ],
+              "description": "Scopes of Bucket Permissions to fetch",
+              "title": "Permission Scopes"
+            },
+            "description": "Scopes of Bucket Permissions to fetch"
+          },
+          {
+            "name": "permission_status",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "$ref": "#/components/schemas/PermissionStatus" },
+                { "type": "null" }
+              ],
+              "description": "Status of Bucket Permissions to fetch",
+              "title": "Permission Status"
+            },
+            "description": "Status of Bucket Permissions to fetch"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/BucketPermissionOut"
+                  },
+                  "title": "Response Bucketpermission-List Permissions"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": ["BucketPermission"],
+        "summary": "Create a permission.",
+        "description": "Create a permission for a bucket and user.\n\nPermission `bucket_permission:create` required.",
+        "operationId": "BucketPermission-create_permission",
+        "security": [{ "Session Token": [] }],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/BucketPermissionIn",
+                "description": "Permission to create"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/BucketPermissionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/permissions/user/{uid}": {
+      "get": {
+        "tags": ["BucketPermission"],
+        "summary": "Get all permissions for a user.",
+        "description": "List all the bucket permissions for the given user.\n\nPermission `bucket_permission:list` required if current user is the target the bucket permission,\notherwise `bucket_permission:list_all` required.",
+        "operationId": "BucketPermission-list_permissions_per_user",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "uid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "UID of a user",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Uid"
+            },
+            "description": "UID of a user"
+          },
+          {
+            "name": "permission_scopes",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                {
+                  "type": "array",
+                  "items": { "enum": ["read", "write"], "type": "string" }
+                },
+                { "type": "null" }
+              ],
+              "description": "Scopes of Bucket Permissions to fetch",
+              "title": "Permission Scopes"
+            },
+            "description": "Scopes of Bucket Permissions to fetch"
+          },
+          {
+            "name": "permission_status",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "$ref": "#/components/schemas/PermissionStatus" },
+                { "type": "null" }
+              ],
+              "description": "Status of Bucket Permissions to fetch",
+              "title": "Permission Status"
+            },
+            "description": "Status of Bucket Permissions to fetch"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/BucketPermissionOut"
+                  },
+                  "title": "Response Bucketpermission-List Permissions Per User"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/permissions/bucket/{bucket_name}": {
+      "get": {
+        "tags": ["BucketPermission"],
+        "summary": "Get all permissions for a bucket.",
+        "description": "List all the bucket permissions for the given bucket.\n\nPermission `bucket_permission:list` required if current user is owner of the bucket,\notherwise `bucket_permission:list_all` required.",
+        "operationId": "BucketPermission-list_permissions_per_bucket",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "bucket_name",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "minLength": 3,
+              "maxLength": 63,
+              "description": "Name of a bucket",
+              "examples": ["test-bucket"],
+              "title": "Bucket Name"
+            },
+            "description": "Name of a bucket"
+          },
+          {
+            "name": "permission_scopes",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                {
+                  "type": "array",
+                  "items": { "enum": ["read", "write"], "type": "string" }
+                },
+                { "type": "null" }
+              ],
+              "description": "Scopes of Bucket Permissions to fetch",
+              "title": "Permission Scopes"
+            },
+            "description": "Scopes of Bucket Permissions to fetch"
+          },
+          {
+            "name": "permission_status",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "$ref": "#/components/schemas/PermissionStatus" },
+                { "type": "null" }
+              ],
+              "description": "Status of Bucket Permissions to fetch",
+              "title": "Permission Status"
+            },
+            "description": "Status of Bucket Permissions to fetch"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/BucketPermissionOut"
+                  },
+                  "title": "Response Bucketpermission-List Permissions Per Bucket"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/permissions/bucket/{bucket_name}/user/{uid}": {
+      "get": {
+        "tags": ["BucketPermission"],
+        "summary": "Get permission for bucket and user combination.",
+        "description": "Get the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:read` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:read_any` required.",
+        "operationId": "BucketPermission-get_permission",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "bucket_name",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "minLength": 3,
+              "maxLength": 63,
+              "description": "Name of a bucket",
+              "examples": ["test-bucket"],
+              "title": "Bucket Name"
+            },
+            "description": "Name of a bucket"
+          },
+          {
+            "name": "uid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "UID of a user",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Uid"
+            },
+            "description": "UID of a user"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/BucketPermissionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "put": {
+        "tags": ["BucketPermission"],
+        "summary": "Update a bucket permission",
+        "description": "Update a permission for a bucket and user.\n\nPermission `bucket_permission:update` required.",
+        "operationId": "BucketPermission-update_permission",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "bucket_name",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "minLength": 3,
+              "maxLength": 63,
+              "description": "Name of a bucket",
+              "examples": ["test-bucket"],
+              "title": "Bucket Name"
+            },
+            "description": "Name of a bucket"
+          },
+          {
+            "name": "uid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "UID of a user",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Uid"
+            },
+            "description": "UID of a user"
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/BucketPermissionParameters",
+                "description": "Permission to create"
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/BucketPermissionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["BucketPermission"],
+        "summary": "Delete a bucket permission",
+        "description": "Delete the bucket permissions for the specific combination of bucket and user.\n\nPermission `bucket_permission:delete` required if current user is the target or owner of the bucket permission,\notherwise `bucket_permission:delete_any` required.",
+        "operationId": "BucketPermission-delete_permission",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "bucket_name",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "minLength": 3,
+              "maxLength": 63,
+              "description": "Name of a bucket",
+              "examples": ["test-bucket"],
+              "title": "Bucket Name"
+            },
+            "description": "Name of a bucket"
+          },
+          {
+            "name": "uid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "UID of a user",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Uid"
+            },
+            "description": "UID of a user"
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows": {
+      "post": {
+        "tags": ["Workflow"],
+        "summary": "Create a new workflow",
+        "description": "Create a new workflow.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.",
+        "operationId": "Workflow-create_workflow",
+        "security": [{ "Session Token": [] }],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/WorkflowIn",
+                "description": "Meta-date for the workflow to create"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/WorkflowOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "get": {
+        "tags": ["Workflow"],
+        "summary": "List workflows",
+        "description": "List all workflows.\n\nPermission `workflow:list` required.",
+        "operationId": "Workflow-list_workflows",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "name_substring",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "minLength": 3, "maxLength": 30 },
+                { "type": "null" }
+              ],
+              "description": "Filter workflows by a substring in their name.",
+              "examples": ["blast"],
+              "title": "Name Substring"
+            },
+            "description": "Filter workflows by a substring in their name."
+          },
+          {
+            "name": "version_status",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/WorkflowVersionStatus"
+                  }
+                },
+                { "type": "null" }
+              ],
+              "description": "Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`.",
+              "title": "Version Status"
+            },
+            "description": "Which versions of the workflow to include in the response. Permission `workflow:list_filter` required, unless `developer_id` is provided and current user is developer, then only permission `workflow:list` required. Default `PUBLISHED` and `DEPRECATED`."
+          },
+          {
+            "name": "developer_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`.",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Developer Id"
+            },
+            "description": "Filter for workflow by developer. If current user is the developer, permission `workflow:list` required, otherwise `workflow:list_filter`."
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": { "$ref": "#/components/schemas/WorkflowOut" },
+                  "title": "Response Workflow-List Workflows"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/ownership_transfer_request": {
+      "get": {
+        "tags": ["Workflow"],
+        "summary": "List workflow OTRs",
+        "description": "Get the ownership transfer requests for workflows.\n\nPermission `workflow:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `workflow:list_all`",
+        "operationId": "Workflow-list_workflow_otrs",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "current_owner_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "UID of user who is the current owner.",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Current Owner Id"
+            },
+            "description": "UID of user who is the current owner."
+          },
+          {
+            "name": "new_owner_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "UID of user who will be the new owner.",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "New Owner Id"
+            },
+            "description": "UID of user who will be the new owner."
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/OwnershipTransferRequestOut"
+                  },
+                  "title": "Response Workflow-List Workflow Otrs"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/developer_statistics": {
+      "get": {
+        "tags": ["Workflow"],
+        "summary": "Get anonymized workflow execution",
+        "description": "Get the workflow executions with meta information and anonymized user IDs.\n\nPermission `workflow:read` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:read_any`.",
+        "operationId": "Workflow-get_developer_workflow_statistics",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "developer_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "Filter by the developer of the workflows",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Developer Id"
+            },
+            "description": "Filter by the developer of the workflows"
+          },
+          {
+            "name": "workflow_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                {
+                  "type": "array",
+                  "items": { "type": "string", "format": "uuid" }
+                },
+                { "type": "null" }
+              ],
+              "description": "Filter by workflow IDs",
+              "title": "Workflow Id"
+            },
+            "description": "Filter by workflow IDs"
+          },
+          {
+            "name": "start",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "date" },
+                { "type": "null" }
+              ],
+              "description": "Filter by workflow executions after this date",
+              "title": "Start"
+            },
+            "description": "Filter by workflow executions after this date"
+          },
+          {
+            "name": "end",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "date" },
+                { "type": "null" }
+              ],
+              "description": "Filter by workflow executions before this date",
+              "title": "End"
+            },
+            "description": "Filter by workflow executions before this date"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/AnonymizedWorkflowExecution"
+                  },
+                  "title": "Response Workflow-Get Developer Workflow Statistics"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/{wid}": {
+      "get": {
+        "tags": ["Workflow"],
+        "summary": "Get a workflow",
+        "description": "Get a specific workflow.\n\nPermission `workflow:read` required.",
+        "operationId": "Workflow-get_workflow",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          },
+          {
+            "name": "version_status",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/WorkflowVersionStatus"
+                  }
+                },
+                { "type": "null" }
+              ],
+              "description": "Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`",
+              "title": "Version Status"
+            },
+            "description": "Which versions of the workflow to include in the response. Permission `workflow:read_any` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/WorkflowOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["Workflow"],
+        "summary": "Delete a workflow",
+        "description": "Delete a workflow.\n\nPermission `workflow:delete` required if the `developer_id` is the same as the uid of the current user,\nother `workflow:delete_any`.",
+        "operationId": "Workflow-delete_workflow",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/{wid}/ownership_transfer_request": {
+      "get": {
+        "tags": ["Workflow"],
+        "summary": "Get a workflow OTR",
+        "description": "Get a specific workflow ownership transfer request.\n\nPermission `workflow:read` required if current user is the current or new owner of the workflow,\notherwise `workflow:read_any` required.",
+        "operationId": "Workflow-get_workflow_otr",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OwnershipTransferRequestOut"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": ["Workflow"],
+        "summary": "Create a workflow OTR",
+        "description": "Create a ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the current owner of the workflow,\notherwise `workflow:update_any` required.",
+        "operationId": "Workflow-create_workflow_otr",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/OwnershipTransferRequestIn",
+                "description": "Meta-data for workflow OTR to create"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OwnershipTransferRequestOut"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "patch": {
+        "tags": ["Workflow"],
+        "summary": "Accept a workflow OTR",
+        "description": "Accept an ownership transfer request for a specific workflow.\n\nPermission `workflow:update` required if the current user is the new owner of the workflow,\notherwise `workflow:update_any` required.",
+        "operationId": "Workflow-accept_workflow_otr",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/WorkflowOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["Workflow"],
+        "summary": "Delete a workflow OTR",
+        "description": "Delete/Reject a workflow ownership transfer request.\n\nPermission `workflow:update` required if current user is the current or new owner of the workflow,\notherwise `workflow:update_any` required.",
+        "operationId": "Workflow-delete_workflow_otr",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/{wid}/statistics": {
+      "get": {
+        "tags": ["Workflow"],
+        "summary": "Get statistics for a workflow",
+        "description": "Get the number of started workflow per day.\n\nPermission `workflow:read` required.",
+        "operationId": "Workflow-get_workflow_statistics",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": { "$ref": "#/components/schemas/WorkflowStatistic" },
+                  "title": "Response Workflow-Get Workflow Statistics"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/{wid}/update": {
+      "post": {
+        "tags": ["Workflow"],
+        "summary": "Update a workflow",
+        "description": "Create a new workflow version.\n\nPermission `workflow:update` required.",
+        "operationId": "Workflow-update_workflow",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/WorkflowUpdate",
+                "description": "Meta-data for the workflow version to create"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/WorkflowVersionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/{wid}/versions": {
+      "get": {
+        "tags": ["Workflow Version"],
+        "summary": "Get all versions of a workflow",
+        "description": "List all versions of a Workflow.\n\nPermission `workflow:list` required.",
+        "operationId": "Workflow Version-list_workflow_version",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          },
+          {
+            "name": "version_status",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/WorkflowVersionStatus"
+                  }
+                },
+                { "type": "null" }
+              ],
+              "description": "Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`",
+              "title": "Version Status"
+            },
+            "description": "Which versions of the workflow to include in the response. Permission `workflow:list_filter` required if you are not the developer of this workflow. Default `PUBLISHED` and `DEPRECATED`"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/WorkflowVersionOut"
+                  },
+                  "title": "Response Workflow Version-List Workflow Version"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/{wid}/versions/{git_commit_hash}": {
+      "get": {
+        "tags": ["Workflow Version"],
+        "summary": "Get a workflow version",
+        "description": "Get a specific version of a workflow.\n\nPermission `workflow:read` required if the version is public or you are the developer of the workflow,\notherwise `workflow:read_any`",
+        "operationId": "Workflow Version-get_workflow_version",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "git_commit_hash",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "pattern": "^([0-9a-f]{40}|latest)$",
+              "description": "Git commit `git_commit_hash` of specific version or `latest`.",
+              "examples": [
+                "latest",
+                "ba8bcd9294c2c96aedefa1763a84a18077c50c0f"
+              ],
+              "title": "Git Commit Hash"
+            },
+            "description": "Git commit `git_commit_hash` of specific version or `latest`."
+          },
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/WorkflowVersionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/{wid}/versions/{git_commit_hash}/status": {
+      "patch": {
+        "tags": ["Workflow Version"],
+        "summary": "Update status of workflow version",
+        "description": "Update the status of a workflow version.\n\nPermission `workflow:update_status`",
+        "operationId": "Workflow Version-update_workflow_version_status",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          },
+          {
+            "name": "git_commit_hash",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "maxLength": 40,
+              "pattern": "^([0-9a-f]{40}|latest)$",
+              "description": "Git commit git_commit_hash of specific version.",
+              "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],
+              "title": "Git Commit Hash"
+            },
+            "description": "Git commit git_commit_hash of specific version."
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/WorkflowVersionStatusSchema",
+                "description": "New Status of the workflow version"
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/WorkflowVersionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/{wid}/versions/{git_commit_hash}/metadata": {
+      "get": {
+        "tags": ["Workflow Version"],
+        "summary": "Get metadata of workflow version",
+        "description": "Get the metadata of a workflow version.\n\nPermission `workflow:read` required if the current user is the developer of the workflow,\notherwise `workflow:read_any`",
+        "operationId": "Workflow Version-get_workflow_version_metadata",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          },
+          {
+            "name": "git_commit_hash",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "maxLength": 40,
+              "pattern": "^([0-9a-f]{40}|latest)$",
+              "description": "Git commit git_commit_hash of specific version.",
+              "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],
+              "title": "Git Commit Hash"
+            },
+            "description": "Git commit git_commit_hash of specific version."
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/WorkflowVersionMetadataOut"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "put": {
+        "tags": ["Workflow Version"],
+        "summary": "Update metadata of workflow version",
+        "description": "Update the metadata of a workflow version.\n\nPermission `workflow:update` required if the current user is the developer of the workflow,\notherwise `workflow:update_any`",
+        "operationId": "Workflow Version-update_workflow_version_metadata",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          },
+          {
+            "name": "git_commit_hash",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "maxLength": 40,
+              "pattern": "^([0-9a-f]{40}|latest)$",
+              "description": "Git commit git_commit_hash of specific version.",
+              "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],
+              "title": "Git Commit Hash"
+            },
+            "description": "Git commit git_commit_hash of specific version."
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/WorkflowVersionMetadataIn"
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/WorkflowVersionMetadataOut"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/{wid}/versions/{git_commit_hash}/deprecate": {
+      "patch": {
+        "tags": ["Workflow Version"],
+        "summary": "Deprecate a workflow version",
+        "description": "Deprecate a workflow version.\n\nPermission `workflow:update` required if you are the developer of the workflow,\notherwise `workflow:update_status`",
+        "operationId": "Workflow Version-deprecate_workflow_version",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          },
+          {
+            "name": "git_commit_hash",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "maxLength": 40,
+              "pattern": "^([0-9a-f]{40}|latest)$",
+              "description": "Git commit git_commit_hash of specific version.",
+              "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],
+              "title": "Git Commit Hash"
+            },
+            "description": "Git commit git_commit_hash of specific version."
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/WorkflowVersionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/{wid}/versions/{git_commit_hash}/parameter-extension": {
+      "patch": {
+        "tags": ["Workflow Version"],
+        "summary": "Update parameter extension of workflow version",
+        "description": "Update the parameter extension of a workflow version.\n\nPermission `workflow:update` required.",
+        "operationId": "Workflow Version-update_workflow_version_parameter_extension",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          },
+          {
+            "name": "git_commit_hash",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "maxLength": 40,
+              "pattern": "^([0-9a-f]{40}|latest)$",
+              "description": "Git commit git_commit_hash of specific version.",
+              "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],
+              "title": "Git Commit Hash"
+            },
+            "description": "Git commit git_commit_hash of specific version."
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ParameterExtension-Input",
+                "description": "Parameter extension specific for this CloWM instance"
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/WorkflowVersionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/{wid}/versions/{git_commit_hash}/documentation": {
+      "get": {
+        "tags": ["Workflow Version"],
+        "summary": "Fetch documentation for a workflow version",
+        "description": "Get the documentation for a specific workflow version.\nStreams the response directly from the right git repository.\n\nPermission `workflow:read` required.",
+        "operationId": "Workflow Version-download_workflow_documentation",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          },
+          {
+            "name": "git_commit_hash",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "maxLength": 40,
+              "pattern": "^([0-9a-f]{40}|latest)$",
+              "description": "Git commit git_commit_hash of specific version.",
+              "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],
+              "title": "Git Commit Hash"
+            },
+            "description": "Git commit git_commit_hash of specific version."
+          },
+          {
+            "name": "document",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "$ref": "#/components/schemas/DocumentationEnum",
+              "description": "Specify which type of documentation the client wants to fetch",
+              "default": "usage.md"
+            },
+            "description": "Specify which type of documentation the client wants to fetch"
+          },
+          {
+            "name": "mode_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "Workflow Mode",
+              "examples": ["8d47e878-f25f-41aa-b4a0-95d426b46f45"],
+              "title": "Mode Id"
+            },
+            "description": "Workflow Mode"
+          }
+        ],
+        "responses": {
+          "200": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/{wid}/versions/{git_commit_hash}/icon": {
+      "post": {
+        "tags": ["Workflow Version"],
+        "summary": "Upload icon for workflow version",
+        "description": "Upload an icon for the workflow version and returns the new icon URL.\n\nPermission `workflow:update` required.",
+        "operationId": "Workflow Version-upload_workflow_version_icon",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          },
+          {
+            "name": "git_commit_hash",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "maxLength": 40,
+              "pattern": "^([0-9a-f]{40}|latest)$",
+              "description": "Git commit git_commit_hash of specific version.",
+              "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],
+              "title": "Git Commit Hash"
+            },
+            "description": "Git commit git_commit_hash of specific version."
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "multipart/form-data": {
+              "schema": {
+                "$ref": "#/components/schemas/Body_Workflow_Version-upload_workflow_version_icon"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/IconUpdateOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["Workflow Version"],
+        "summary": "Delete icon of workflow version",
+        "description": "Delete the icon of the workflow version.\n\nPermission `workflow:update` required.",
+        "operationId": "Workflow Version-delete_workflow_version_icon",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          },
+          {
+            "name": "git_commit_hash",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "maxLength": 40,
+              "pattern": "^([0-9a-f]{40}|latest)$",
+              "description": "Git commit git_commit_hash of specific version.",
+              "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],
+              "title": "Git Commit Hash"
+            },
+            "description": "Git commit git_commit_hash of specific version."
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflow_executions": {
+      "post": {
+        "tags": ["Workflow Execution"],
+        "summary": "Start a new workflow execution",
+        "description": "Start a new workflow execution. Workflow versions wit status `DEPRECATED` or `DENIED` can't be started.\n\nPermission `workflow_execution:create` required if workflow versions status is `PUBLISHED`,\notherwise `workflow_execution:create_any` required.",
+        "operationId": "Workflow Execution-start_workflow",
+        "security": [{ "Session Token": [] }],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/WorkflowExecutionIn",
+                "description": "Meta-data and parameters for the workflow to start"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/WorkflowExecutionOut"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "get": {
+        "tags": ["Workflow Execution"],
+        "summary": "List all workflow executions",
+        "description": "Get all workflow executions.\n\nThis endpoint enforces keyset pagination. To iterate over all workflow executions, follow the link provided in the\n`Link` header.\nA missing `Link` header indicates that you iterated over all workflow executions with the current filters.\n\nPermission `workflow_execution:list` required, if `executor_id` is the same as the current user,\notherwise `workflow_execution:list_all` required.",
+        "operationId": "Workflow Execution-list_workflow_executions",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "executor_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required.",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Executor Id"
+            },
+            "description": "Filter for workflow executions by a user. If none, Permission `workflow_execution:read_any` required."
+          },
+          {
+            "name": "execution_status",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/WorkflowExecutionStatus"
+                  }
+                },
+                { "type": "null" }
+              ],
+              "description": "Filter for status of workflow execution",
+              "title": "Execution Status"
+            },
+            "description": "Filter for status of workflow execution"
+          },
+          {
+            "name": "workflow_version_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "minLength": 40,
+                  "maxLength": 40,
+                  "pattern": "^[0-9a-f]+$"
+                },
+                { "type": "null" }
+              ],
+              "description": "Filter for workflow version",
+              "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"],
+              "title": "Workflow Version Id"
+            },
+            "description": "Filter for workflow version"
+          },
+          {
+            "name": "workflow_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "Filter for workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Workflow Id"
+            },
+            "description": "Filter for workflow"
+          },
+          {
+            "name": "start_after",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "integer", "maximum": 4294967295, "minimum": 1 },
+                { "type": "null" }
+              ],
+              "description": "Filter for workflow executions that started after this UNIX timestamp",
+              "examples": [1640991600],
+              "title": "Start After"
+            },
+            "description": "Filter for workflow executions that started after this UNIX timestamp"
+          },
+          {
+            "name": "start_before",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "integer", "maximum": 4294967295, "minimum": 1 },
+                { "type": "null" }
+              ],
+              "description": "Filter for workflow executions that started before this UNIX timestamp",
+              "examples": [1640991600],
+              "title": "Start Before"
+            },
+            "description": "Filter for workflow executions that started before this UNIX timestamp"
+          },
+          {
+            "name": "id_after",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "Id of the item to start the query from. DO NOT SET MANUALLY.",
+              "title": "Id After"
+            },
+            "description": "Id of the item to start the query from. DO NOT SET MANUALLY."
+          },
+          {
+            "name": "per_page",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "maximum": 100,
+              "minimum": 5,
+              "description": "Number of items to list per page",
+              "default": 20,
+              "title": "Per Page"
+            },
+            "description": "Number of items to list per page"
+          },
+          {
+            "name": "sort",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "enum": ["asc", "desc"],
+              "type": "string",
+              "description": "Sort order of items with creation time",
+              "default": "desc",
+              "title": "Sort"
+            },
+            "description": "Sort order of items with creation time"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/WorkflowExecutionOut"
+                  },
+                  "title": "Response Workflow Execution-List Workflow Executions"
+                }
+              }
+            },
+            "headers": {
+              "link": {
+                "description": "Link for the next pagination page if there is any",
+                "schema": {
+                  "type": "string",
+                  "example": "<https://dev.clowm.de/api/ui/workflow_executions?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflow_executions/arbitrary": {
+      "post": {
+        "tags": ["Workflow Execution"],
+        "summary": "Start a workflow execution with arbitrary git repository",
+        "description": "Start a new workflow execution from an arbitrary git repository.\n\nFor private Gitlab repositories, a Project Access Token with the role Reporter and scope `read_api` is needed.\n\nFor private GitHub repositories, a Personal Access Token (classic) with scope `repo` is needed.\n\nPermission `workflow:create` required.",
+        "operationId": "Workflow Execution-start_arbitrary_workflow",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/DevWorkflowExecutionIn",
+                "description": "Meta-data and parameters for the workflow to start"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/WorkflowExecutionOut"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        },
+        "security": [{ "Session Token": [] }]
+      }
+    },
+    "/ui/workflow_executions/{eid}": {
+      "get": {
+        "tags": ["Workflow Execution"],
+        "summary": "Get a workflow execution",
+        "description": "Get a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.",
+        "operationId": "Workflow Execution-get_workflow_execution",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "eid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow execution.",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Eid"
+            },
+            "description": "ID of a workflow execution."
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/WorkflowExecutionOut"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["Workflow Execution"],
+        "summary": "Delete a workflow execution",
+        "description": "Delete a specific workflow execution.\n\nPermission `workflow_execution:delete` required if the current user started the workflow execution,\notherwise `workflow_execution:delete_any` required.",
+        "operationId": "Workflow Execution-delete_workflow_execution",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "eid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow execution.",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Eid"
+            },
+            "description": "ID of a workflow execution."
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflow_executions/{eid}/params": {
+      "get": {
+        "tags": ["Workflow Execution"],
+        "summary": "Get the parameters of a workflow execution",
+        "description": "Get the parameters of a specific workflow execution.\n\nPermission `workflow_execution:read` required if the current user started the workflow execution,\notherwise `workflow_execution:read_any` required.",
+        "operationId": "Workflow Execution-get_workflow_execution_params",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "eid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow execution.",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Eid"
+            },
+            "description": "ID of a workflow execution."
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object",
+                  "title": "Response Workflow Execution-Get Workflow Execution Params"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflow_executions/{eid}/cancel": {
+      "post": {
+        "tags": ["Workflow Execution"],
+        "summary": "Cancel a workflow execution",
+        "description": "Cancel a running workflow execution.\n\nPermission `workflow_execution:cancel` required if the current user started the workflow execution,\notherwise `workflow_execution:cancel_any` required.",
+        "operationId": "Workflow Execution-cancel_workflow_execution",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "eid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow execution.",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Eid"
+            },
+            "description": "ID of a workflow execution."
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflows/{wid}/credentials": {
+      "get": {
+        "tags": ["Workflow Credentials"],
+        "summary": "Get the credentials of a workflow",
+        "description": "Get the credentials for the repository of a workflow. Only the developer of a workflow can do this.\n\nPermission `workflow:update` required.",
+        "operationId": "Workflow Credentials-get_workflow_credentials",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/WorkflowCredentialsOut"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "put": {
+        "tags": ["Workflow Credentials"],
+        "summary": "Update the credentials of a workflow",
+        "description": "Update the credentials for the repository of a workflow.\n\nPermission `workflow:update` required.",
+        "operationId": "Workflow Credentials-update_workflow_credentials",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/WorkflowCredentialsIn",
+                "description": "Updated credentials for the workflow git repository"
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": { "application/json": { "schema": {} } }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["Workflow Credentials"],
+        "summary": "Delete the credentials of a workflow",
+        "description": "Delete the credentials for the repository of a workflow.\n\nPermission `workflow:delete` required if the developer of the workflow is the same as the current user,\nother `workflow:delete_any`.",
+        "operationId": "Workflow Credentials-delete_workflow_credentials",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "wid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow",
+              "examples": ["0cc78936-381b-4bdd-999d-736c40591078"],
+              "title": "Wid"
+            },
+            "description": "ID of a workflow"
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/workflow_modes/{mode_id}": {
+      "get": {
+        "tags": ["Workflow Mode"],
+        "summary": "Get workflow mode",
+        "description": "Get a workflow mode.\n\nPermission `workflow:read` required",
+        "operationId": "Workflow Mode-get_workflow_mode",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "mode_id",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a workflow mode",
+              "examples": ["8d47e878-f25f-41aa-b4a0-95d426b46f45"],
+              "title": "Mode Id"
+            },
+            "description": "ID of a workflow mode"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/WorkflowModeOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/resources": {
+      "post": {
+        "tags": ["Resource"],
+        "summary": "Request a new resource",
+        "description": "Request a new resources.\n\nPermission `resource:create` required.",
+        "operationId": "Resource-create_resource",
+        "security": [{ "Session Token": [] }],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ResourceIn",
+                "description": "Meta-data for the resource to request"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/ResourceOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "get": {
+        "tags": ["Resource"],
+        "summary": "List resources",
+        "description": "List all resources.\n\nPermission `resource:list` required.",
+        "operationId": "Resource-list_resources",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "maintainer_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`.",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Maintainer Id"
+            },
+            "description": "Filter for resource by maintainer. If current user is the same as maintainer ID, permission `resource:list` required, otherwise `resource:list_filter`."
+          },
+          {
+            "name": "version_status",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/ResourceVersionStatus"
+                  }
+                },
+                { "type": "null" }
+              ],
+              "description": "Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required.",
+              "title": "Version Status"
+            },
+            "description": "Which versions of the resource to include in the response. Permission `resource:list_filter` required if None or querying for non-public resources, otherwise only permission `resource:list` required."
+          },
+          {
+            "name": "name_substring",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "maxLength": 32 },
+                { "type": "null" }
+              ],
+              "description": "Filter resources by a substring in their name.",
+              "examples": ["gtdb"],
+              "title": "Name Substring"
+            },
+            "description": "Filter resources by a substring in their name."
+          },
+          {
+            "name": "public",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [{ "type": "boolean" }, { "type": "null" }],
+              "description": "Filter resources to by the public flag",
+              "title": "Public"
+            },
+            "description": "Filter resources to by the public flag"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": { "$ref": "#/components/schemas/ResourceOut" },
+                  "title": "Response Resource-List Resources"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/resources/sync_requests": {
+      "get": {
+        "tags": ["Resource"],
+        "summary": "List resource sync requests",
+        "description": "List all resource sync requests.\n\nPermission `resource:update_any` required.",
+        "operationId": "Resource-list_sync_requests",
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "items": {
+                    "$ref": "#/components/schemas/UserSynchronizationRequestOut"
+                  },
+                  "type": "array",
+                  "title": "Response Resource-List Sync Requests"
+                }
+              }
+            }
+          }
+        },
+        "security": [{ "Session Token": [] }]
+      }
+    },
+    "/ui/resources/ownership_transfer_request": {
+      "get": {
+        "tags": ["Resource"],
+        "summary": "List resource OTRs",
+        "description": "Get the ownership transfer requests for resources.\n\nPermission `resource:list` required if `current_owner_id` or `new_owner_id` is the current users id,\notherwise `resource:list_all`",
+        "operationId": "Resource-list_resource_otrs",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "current_owner_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "UID of user who is the current owner.",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "Current Owner Id"
+            },
+            "description": "UID of user who is the current owner."
+          },
+          {
+            "name": "new_owner_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "UID of user who will be the new owner.",
+              "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"],
+              "title": "New Owner Id"
+            },
+            "description": "UID of user who will be the new owner."
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/OwnershipTransferRequestOut"
+                  },
+                  "title": "Response Resource-List Resource Otrs"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/resources/{rid}": {
+      "get": {
+        "tags": ["Resource"],
+        "summary": "Get a resource",
+        "description": "Get a specific resource.\n\nPermission `resource:read` required.",
+        "operationId": "Resource-get_resource",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          },
+          {
+            "name": "version_status",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/ResourceVersionStatus"
+                  }
+                },
+                { "type": "null" }
+              ],
+              "description": "Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.",
+              "title": "Version Status"
+            },
+            "description": "Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/ResourceOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["Resource"],
+        "summary": "Delete a resource",
+        "description": "Delete a resources.\n\nPermission `resource:delete` required.",
+        "operationId": "Resource-delete_resource",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/resources/{rid}/ownership_transfer_request": {
+      "get": {
+        "tags": ["Resource"],
+        "summary": "Get a resource OTR",
+        "description": "Get a specific resource ownership transfer request.\n\nPermission `resource:read` required if the current user is the current or new owner of the resource,\notherwise `resource:read_any` required.",
+        "operationId": "Resource-get_resource_otr",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OwnershipTransferRequestOut"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": ["Resource"],
+        "summary": "Create a resource OTR",
+        "description": "Create a ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the current owner of the resource,\notherwise `resource:update_any` required.",
+        "operationId": "Resource-create_resource_otr",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/OwnershipTransferRequestIn",
+                "description": "Meta-data for the resource OTR to create"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OwnershipTransferRequestOut"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "patch": {
+        "tags": ["Resource"],
+        "summary": "Accept a resource OTR",
+        "description": "Accept an ownership transfer request for a specific resource.\n\nPermission `resource:update` required if the current user is the new owner of the resource,\notherwise `resource:update_any` required.",
+        "operationId": "Resource-accept_resource_otr",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/ResourceOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["Resource"],
+        "summary": "Delete a resource OTR",
+        "description": "Delete/Reject a resource ownership transfer request.\n\nPermission `resource:update` required if the current user is the current or new owner of the resource,\notherwise `resource:update_any` required.",
+        "operationId": "Resource-delete_resource_otr",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/resources/{rid}/versions": {
+      "get": {
+        "tags": ["ResourceVersion"],
+        "summary": "List versions of a resource",
+        "description": "List all the resource version for a specific resource.\n\nPermission 'resource:read' required.",
+        "operationId": "ResourceVersion-list_resource_versions",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          },
+          {
+            "name": "version_status",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/ResourceVersionStatus"
+                  }
+                },
+                { "type": "null" }
+              ],
+              "description": "Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required.",
+              "title": "Version Status"
+            },
+            "description": "Which versions of the resource to include in the response. Permission `resource:read_any` required if None or querying for non-public resources, otherwise only permission `resource:read` required."
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/ResourceVersionOut"
+                  },
+                  "title": "Response Resourceversion-List Resource Versions"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": ["ResourceVersion"],
+        "summary": "Request new version of a resource",
+        "description": "Request a new resource version.\n\nPermission `resource:update` required if the current user is the maintainer, `resource:update_any` otherwise.",
+        "operationId": "ResourceVersion-request_resource_version",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ResourceVersionIn",
+                "description": "Meta-data for the resource version to request"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/ResourceVersionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/resources/{rid}/versions/{rvid}": {
+      "get": {
+        "tags": ["ResourceVersion"],
+        "summary": "Get version of a resource",
+        "description": "Get a specific resource version for a specific resource.\n\nPermission `resource:read` required. If the status of the resource version is not `LATEST` or `SYNCHRONIZED` and\nthe current user is not the maintainer, then the permission `resource:read_any` is required.",
+        "operationId": "ResourceVersion-get_resource_version",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          },
+          {
+            "name": "rvid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource version",
+              "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"],
+              "title": "Rvid"
+            },
+            "description": "ID of a resource version"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/ResourceVersionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/resources/{rid}/versions/{rvid}/tree": {
+      "get": {
+        "tags": ["ResourceVersion"],
+        "summary": "Download folder structure of resource",
+        "description": "Get the folder structure of the resources. Only available if the resource was previously downloaded to the cluster.\n\nPermission `resource:read` required.",
+        "operationId": "ResourceVersion-resource_file_tree",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rvid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource version",
+              "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"],
+              "title": "Rvid"
+            },
+            "description": "ID of a resource version"
+          },
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": { "$ref": "#/components/schemas/FileTree" },
+                  "title": "Response Resourceversion-Resource File Tree"
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/resources/{rid}/versions/{rvid}/request_review": {
+      "put": {
+        "tags": ["ResourceVersion"],
+        "summary": "Request resource version review",
+        "description": "Request the review of a resource version.\n\nPermission `resource:update` required.",
+        "operationId": "ResourceVersion-request_resource_version_review",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          },
+          {
+            "name": "rvid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource version",
+              "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"],
+              "title": "Rvid"
+            },
+            "description": "ID of a resource version"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/ResourceVersionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/resources/{rid}/versions/{rvid}/request_sync": {
+      "put": {
+        "tags": ["ResourceVersion"],
+        "summary": "Request resource version synchronization",
+        "description": "Request the synchronization of a resource version to the cluster.\n\nPermission `resource:request_sync` required.",
+        "operationId": "ResourceVersion-request_resource_version_sync",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          },
+          {
+            "name": "rvid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource version",
+              "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"],
+              "title": "Rvid"
+            },
+            "description": "ID of a resource version"
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/UserSynchronizationRequestIn",
+                "description": "Meta-data for the synchronization request"
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/ResourceVersionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/resources/{rid}/versions/{rvid}/review": {
+      "put": {
+        "tags": ["ResourceVersion"],
+        "summary": "Review resource version",
+        "description": "Review answer the resource version.\n\nPermission `resource:update_status` required.",
+        "operationId": "ResourceVersion-resource_version_review",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          },
+          {
+            "name": "rvid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource version",
+              "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"],
+              "title": "Rvid"
+            },
+            "description": "ID of a resource version"
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/UserRequestAnswer",
+                "description": "Answer for the resource version review"
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/ResourceVersionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/resources/{rid}/versions/{rvid}/sync": {
+      "put": {
+        "tags": ["ResourceVersion"],
+        "summary": "Synchronize resource version with cluster",
+        "description": "Synchronize the resource version to the cluster.\n\nPermission `resource:update_any` required.",
+        "operationId": "ResourceVersion-resource_version_sync",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          },
+          {
+            "name": "rvid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource version",
+              "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"],
+              "title": "Rvid"
+            },
+            "description": "ID of a resource version"
+          }
+        ],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/UserRequestAnswer",
+                "description": "Answer to the resource version synchronization request"
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/ResourceVersionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/resources/{rid}/versions/{rvid}/latest": {
+      "put": {
+        "tags": ["ResourceVersion"],
+        "summary": "Set resource version to latest",
+        "description": "Set the resource version as the latest version.\n\nPermission `resource:update_any` required.",
+        "operationId": "ResourceVersion-resource_version_latest",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          },
+          {
+            "name": "rvid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource version",
+              "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"],
+              "title": "Rvid"
+            },
+            "description": "ID of a resource version"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/ResourceVersionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/resources/{rid}/versions/{rvid}/cluster": {
+      "delete": {
+        "tags": ["ResourceVersion"],
+        "summary": "Delete resource version on cluster",
+        "description": "Delete the resource version on the cluster.\n\nPermission `resource:delete_any` required.",
+        "operationId": "ResourceVersion-delete_resource_version_cluster",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          },
+          {
+            "name": "rvid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource version",
+              "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"],
+              "title": "Rvid"
+            },
+            "description": "ID of a resource version"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/ResourceVersionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/resources/{rid}/versions/{rvid}/s3": {
+      "delete": {
+        "tags": ["ResourceVersion"],
+        "summary": "Delete resource version in S3",
+        "description": "Delete the resource version in the S3 bucket.\n\nPermission `resource:delete_any` required.",
+        "operationId": "ResourceVersion-delete_resource_version_s3",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "rid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource",
+              "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"],
+              "title": "Rid"
+            },
+            "description": "ID of a resource"
+          },
+          {
+            "name": "rvid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a resource version",
+              "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"],
+              "title": "Rvid"
+            },
+            "description": "ID of a resource version"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/ResourceVersionOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/news": {
+      "post": {
+        "tags": ["News"],
+        "summary": "Create news",
+        "description": "Create a news event.\n\nPermission `news:create` required.",
+        "operationId": "News-create_news",
+        "security": [{ "Session Token": [] }],
+        "requestBody": {
+          "required": true,
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/NewsIn",
+                "description": "Meta-data for news event to create"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/NewsOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "get": {
+        "tags": ["News"],
+        "summary": "List news",
+        "description": "List all news events with filters.\n\nThis endpoint enforces keyset pagination. To iterate over all news, follow the link provided in the `Link` header.\nA missing `Link` header indicates that you iterated over all news with the current filters.\n\nPermission `news:list` required.",
+        "operationId": "News-list_news",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "created_after",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "integer", "maximum": 4294967296, "minimum": 0 },
+                { "type": "null" }
+              ],
+              "description": "Filter for news that are created after this UNIX timestamp",
+              "title": "Created After"
+            },
+            "description": "Filter for news that are created after this UNIX timestamp"
+          },
+          {
+            "name": "creator_id",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "Filter for news created by a specific user",
+              "title": "Creator Id"
+            },
+            "description": "Filter for news created by a specific user"
+          },
+          {
+            "name": "id_after",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "anyOf": [
+                { "type": "string", "format": "uuid" },
+                { "type": "null" }
+              ],
+              "description": "Id of the item to start the query from. DO NOT SET MANUALLY.",
+              "title": "Id After"
+            },
+            "description": "Id of the item to start the query from. DO NOT SET MANUALLY."
+          },
+          {
+            "name": "per_page",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "maximum": 100,
+              "minimum": 5,
+              "description": "Number of items to list per page",
+              "default": 20,
+              "title": "Per Page"
+            },
+            "description": "Number of items to list per page"
+          },
+          {
+            "name": "sort",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "enum": ["asc", "desc"],
+              "type": "string",
+              "description": "Sort order of items with creation time",
+              "default": "desc",
+              "title": "Sort"
+            },
+            "description": "Sort order of items with creation time"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": { "$ref": "#/components/schemas/NewsOut" },
+                  "title": "Response News-List News"
+                }
+              }
+            },
+            "headers": {
+              "link": {
+                "description": "Link for the next pagination page if there is any",
+                "schema": {
+                  "type": "string",
+                  "example": "<https://dev.clowm.de/api/news?per_page=50&sort=asc&id_after=a16c50f8-c1fb-4b3c-afe3-82f1575bc2f4>; rel=\"next\""
+                }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/news/latest": {
+      "get": {
+        "tags": ["News"],
+        "summary": "Get latest news",
+        "description": "List the current news events.\n\nPermission `news:list` required.",
+        "operationId": "News-list_latest_news",
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "items": { "$ref": "#/components/schemas/NewsOut" },
+                  "type": "array",
+                  "title": "Response News-List Latest News"
+                }
+              }
+            }
+          }
+        },
+        "security": [{ "Session Token": [] }]
+      }
+    },
+    "/ui/news/{nid}": {
+      "get": {
+        "tags": ["News"],
+        "summary": "Get a specific news",
+        "description": "Get a specified news event.\n\nPermission `news:read` required.",
+        "operationId": "News-get_news",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "nid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a news event",
+              "examples": ["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],
+              "title": "Nid"
+            },
+            "description": "ID of a news event"
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/NewsOut" }
+              }
+            }
+          },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["News"],
+        "summary": "Delete a specific news",
+        "description": "Delete a specified news event.\n\nPermission `news:delete` required.",
+        "operationId": "News-delete_news",
+        "security": [{ "Session Token": [] }],
+        "parameters": [
+          {
+            "name": "nid",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string",
+              "format": "uuid",
+              "description": "ID of a news event",
+              "examples": ["f3e2acf0-e942-44b2-8f85-52b7deb660ec"],
+              "title": "Nid"
+            },
+            "description": "ID of a news event"
+          }
+        ],
+        "responses": {
+          "204": { "description": "Successful Response" },
+          "422": {
+            "description": "Validation Error",
+            "content": {
+              "application/json": {
+                "schema": { "$ref": "#/components/schemas/HTTPValidationError" }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/ui/public/workflows": {
+      "get": {
+        "tags": ["Public"],
+        "summary": "Get available workflows",
+        "description": "Public route to fetch all available workflows.",
+        "operationId": "Public-get_public_workflows",
+        "responses": {
+          "200": {
+            "description": "Successful Response",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "items": { "$ref": "#/components/schemas/PublicWorkflowOut" },
+                  "type": "array",
+                  "title": "Response Public-Get Public Workflows"
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  },
+  "components": {
+    "schemas": {
+      "AnonymizedWorkflowExecution": {
+        "properties": {
+          "workflow_execution_id": {
+            "type": "string",
+            "title": "Workflow Execution Id",
+            "description": "ID of the workflow execution",
+            "examples": ["591b6a6e-a1f0-420d-8a20-a7a60704f695"]
+          },
+          "pseudo_uid": {
+            "type": "string",
+            "title": "Pseudo Uid",
+            "description": "Anonymized user ID of the user who ran the workflow execution",
+            "examples": [
+              "7ed4249857b656e96f456449796e461e6001d3fb2481a44701f70ca437bd53a2"
+            ]
+          },
+          "workflow_mode_id": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Workflow Mode Id",
+            "description": "ID of the workflow mode this workflow execution ran in",
+            "examples": ["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]
+          },
+          "workflow_version_id": {
+            "type": "string",
+            "title": "Workflow Version Id",
+            "description": "Hash of the git commit",
+            "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]
+          },
+          "started_at": {
+            "type": "string",
+            "format": "date",
+            "title": "Started At",
+            "description": "Day of the workflow execution",
+            "examples": ["2023-01-01"]
+          },
+          "workflow_id": {
+            "type": "string",
+            "title": "Workflow Id",
+            "description": "ID of the workflow",
+            "examples": ["20128c04-e834-40a8-9878-68939ae46423"]
+          },
+          "developer_id": {
+            "type": "string",
+            "title": "Developer Id",
+            "description": "ID of developer of the workflow",
+            "examples": ["28c5353b8bb34984a8bd4169ba94c606"]
+          },
+          "status": {
+            "$ref": "#/components/schemas/WorkflowExecutionStatus",
+            "description": "End status of the workflow execution",
+            "examples": ["SUCCESS"]
+          }
+        },
+        "type": "object",
+        "required": [
+          "workflow_execution_id",
+          "pseudo_uid",
+          "workflow_version_id",
+          "started_at",
+          "workflow_id",
+          "developer_id",
+          "status"
+        ],
+        "title": "AnonymizedWorkflowExecution"
+      },
+      "ApiTokenIn": {
+        "properties": {
+          "name": {
+            "type": "string",
+            "maxLength": 63,
+            "minLength": 3,
+            "pattern": "^[a-z\\d-]+$",
+            "title": "Name",
+            "description": "Short name for the API token",
+            "examples": ["api-token-42"]
+          },
+          "expires_at": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "Expires At",
+            "description": "Unix timestamp when the token should expire",
+            "examples": [1719784800]
+          },
+          "scopes": {
+            "items": { "type": "string", "enum": ["read", "write"] },
+            "type": "array",
+            "minItems": 1,
+            "title": "Scopes",
+            "description": "List of scopes this Api token has"
+          }
+        },
+        "type": "object",
+        "required": ["name", "scopes"],
+        "title": "ApiTokenIn"
+      },
+      "ApiTokenOut": {
+        "properties": {
+          "name": {
+            "type": "string",
+            "maxLength": 63,
+            "minLength": 3,
+            "pattern": "^[a-z\\d-]+$",
+            "title": "Name",
+            "description": "Short name for the API token",
+            "examples": ["api-token-42"]
+          },
+          "expires_at": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "Expires At",
+            "description": "Unix timestamp when the token should expire",
+            "examples": [1719784800]
+          },
+          "scopes": {
+            "items": { "type": "string", "enum": ["read", "write"] },
+            "type": "array",
+            "minItems": 1,
+            "title": "Scopes",
+            "description": "List of scopes this Api token has"
+          },
+          "token_id": {
+            "type": "string",
+            "title": "Token Id",
+            "description": "The ID of the token",
+            "examples": ["b4c861a7-7f52-4332-a001-78e0500dabbc"]
+          },
+          "uid": {
+            "type": "string",
+            "title": "Uid",
+            "description": "The ID of the owner",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          },
+          "created_at": {
+            "type": "integer",
+            "title": "Created At",
+            "description": "The UNIX timestamp when this token was created",
+            "examples": ["1717192800"]
+          },
+          "last_used": {
+            "anyOf": [{ "type": "integer" }, { "type": "null" }],
+            "title": "Last Used",
+            "description": "The UNIX timestamp when this token was used the last time",
+            "examples": ["1717193800"]
+          }
+        },
+        "type": "object",
+        "required": ["name", "scopes", "token_id", "uid", "created_at"],
+        "title": "ApiTokenOut"
+      },
+      "ApiTokenPrivateOut": {
+        "properties": {
+          "name": {
+            "type": "string",
+            "maxLength": 63,
+            "minLength": 3,
+            "pattern": "^[a-z\\d-]+$",
+            "title": "Name",
+            "description": "Short name for the API token",
+            "examples": ["api-token-42"]
+          },
+          "expires_at": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "Expires At",
+            "description": "Unix timestamp when the token should expire",
+            "examples": [1719784800]
+          },
+          "scopes": {
+            "items": { "type": "string", "enum": ["read", "write"] },
+            "type": "array",
+            "minItems": 1,
+            "title": "Scopes",
+            "description": "List of scopes this Api token has"
+          },
+          "token_id": {
+            "type": "string",
+            "title": "Token Id",
+            "description": "The ID of the token",
+            "examples": ["b4c861a7-7f52-4332-a001-78e0500dabbc"]
+          },
+          "uid": {
+            "type": "string",
+            "title": "Uid",
+            "description": "The ID of the owner",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          },
+          "created_at": {
+            "type": "integer",
+            "title": "Created At",
+            "description": "The UNIX timestamp when this token was created",
+            "examples": ["1717192800"]
+          },
+          "last_used": {
+            "anyOf": [{ "type": "integer" }, { "type": "null" }],
+            "title": "Last Used",
+            "description": "The UNIX timestamp when this token was used the last time",
+            "examples": ["1717193800"]
+          },
+          "token": {
+            "type": "string",
+            "title": "Token",
+            "description": "The actual token used for authentication",
+            "examples": ["J21NRKUYgyVUgvJ3cIdllS-MMa9ny1UDKFF18aetDvo"]
+          }
+        },
+        "type": "object",
+        "required": [
+          "name",
+          "scopes",
+          "token_id",
+          "uid",
+          "created_at",
+          "token"
+        ],
+        "title": "ApiTokenPrivateOut"
+      },
+      "Body_Bucket-update_bucket_public_state": {
+        "properties": {
+          "public": {
+            "type": "boolean",
+            "title": "Public",
+            "description": "New public state"
+          }
+        },
+        "type": "object",
+        "required": ["public"],
+        "title": "Body_Bucket-update_bucket_public_state"
+      },
+      "Body_Workflow_Version-upload_workflow_version_icon": {
+        "properties": {
+          "icon": {
+            "type": "string",
+            "format": "binary",
+            "title": "Icon",
+            "description": "Icon for the Workflow."
+          }
+        },
+        "type": "object",
+        "required": ["icon"],
+        "title": "Body_Workflow Version-upload_workflow_version_icon"
+      },
+      "BucketIn": {
+        "properties": {
+          "name": {
+            "type": "string",
+            "maxLength": 63,
+            "minLength": 3,
+            "pattern": "^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
+            "title": "Name",
+            "description": "Name of the bucket",
+            "examples": ["test-bucket"]
+          },
+          "description": {
+            "type": "string",
+            "maxLength": 65536,
+            "minLength": 16,
+            "title": "Description",
+            "description": "Description of the bucket",
+            "examples": ["This is a sample description of a bucket"]
+          }
+        },
+        "type": "object",
+        "required": ["name", "description"],
+        "title": "BucketIn",
+        "description": "Schema for creating a new bucket."
+      },
+      "BucketOut": {
+        "properties": {
+          "size_limit": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "Size Limit",
+            "description": "Size limit of the bucket in KiB",
+            "examples": [10240]
+          },
+          "object_limit": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "Object Limit",
+            "description": "Number of objects limit of the bucket",
+            "examples": [10000]
+          },
+          "name": {
+            "type": "string",
+            "maxLength": 63,
+            "minLength": 3,
+            "pattern": "^([a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$",
+            "title": "Name",
+            "description": "Name of the bucket",
+            "examples": ["test-bucket"]
+          },
+          "description": {
+            "type": "string",
+            "maxLength": 65536,
+            "minLength": 16,
+            "title": "Description",
+            "description": "Description of the bucket",
+            "examples": ["This is a sample description of a bucket"]
+          },
+          "created_at": {
+            "type": "integer",
+            "maximum": 4294967295.0,
+            "minimum": 1.0,
+            "title": "Created At",
+            "description": "UNIX timestamp when the bucket was created",
+            "examples": [1640991600]
+          },
+          "owner_id": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Owner Id",
+            "description": "UID of the owner",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          },
+          "public": {
+            "type": "boolean",
+            "title": "Public",
+            "description": "Flag if the bucket is anonymously readable"
+          }
+        },
+        "type": "object",
+        "required": ["name", "description", "created_at", "owner_id", "public"],
+        "title": "BucketOut",
+        "description": "Schema for answering a request with a bucket."
+      },
+      "BucketPermissionIn": {
+        "properties": {
+          "from_timestamp": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "From Timestamp",
+            "description": "Start date of permission as UNIX timestamp",
+            "examples": [1640991600]
+          },
+          "to_timestamp": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "To Timestamp",
+            "description": "End date of permission as UNIX timestamp",
+            "examples": [1640991600]
+          },
+          "file_prefix": {
+            "anyOf": [
+              { "type": "string", "maxLength": 512, "minLength": 1 },
+              { "type": "null" }
+            ],
+            "title": "File Prefix",
+            "description": "Prefix of subfolder",
+            "examples": ["pseudo/sub/folder/"]
+          },
+          "scopes": {
+            "items": { "type": "string", "enum": ["read", "write"] },
+            "type": "array",
+            "minItems": 1,
+            "title": "Scopes",
+            "description": "Scopes of the bucket permission"
+          },
+          "uid": {
+            "type": "string",
+            "format": "uuid",
+            "title": "Uid",
+            "description": "UID of the grantee",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          },
+          "bucket_name": {
+            "type": "string",
+            "maxLength": 63,
+            "minLength": 3,
+            "title": "Bucket Name",
+            "description": "Name of Bucket",
+            "examples": ["test-bucket"]
+          }
+        },
+        "type": "object",
+        "required": ["scopes", "uid", "bucket_name"],
+        "title": "BucketPermissionIn"
+      },
+      "BucketPermissionOut": {
+        "properties": {
+          "from_timestamp": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "From Timestamp",
+            "description": "Start date of permission as UNIX timestamp",
+            "examples": [1640991600]
+          },
+          "to_timestamp": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "To Timestamp",
+            "description": "End date of permission as UNIX timestamp",
+            "examples": [1640991600]
+          },
+          "file_prefix": {
+            "anyOf": [
+              { "type": "string", "maxLength": 512, "minLength": 1 },
+              { "type": "null" }
+            ],
+            "title": "File Prefix",
+            "description": "Prefix of subfolder",
+            "examples": ["pseudo/sub/folder/"]
+          },
+          "scopes": {
+            "items": { "type": "string", "enum": ["read", "write"] },
+            "type": "array",
+            "minItems": 1,
+            "title": "Scopes",
+            "description": "Scopes of the bucket permission"
+          },
+          "uid": {
+            "type": "string",
+            "title": "Uid",
+            "description": "UID of the grantee",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          },
+          "bucket_name": {
+            "type": "string",
+            "maxLength": 63,
+            "minLength": 3,
+            "title": "Bucket Name",
+            "description": "Name of Bucket",
+            "examples": ["test-bucket"]
+          }
+        },
+        "type": "object",
+        "required": ["scopes", "uid", "bucket_name"],
+        "title": "BucketPermissionOut",
+        "description": "Schema for the bucket permissions."
+      },
+      "BucketPermissionParameters": {
+        "properties": {
+          "from_timestamp": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "From Timestamp",
+            "description": "Start date of permission as UNIX timestamp",
+            "examples": [1640991600]
+          },
+          "to_timestamp": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "To Timestamp",
+            "description": "End date of permission as UNIX timestamp",
+            "examples": [1640991600]
+          },
+          "file_prefix": {
+            "anyOf": [
+              { "type": "string", "maxLength": 512, "minLength": 1 },
+              { "type": "null" }
+            ],
+            "title": "File Prefix",
+            "description": "Prefix of subfolder",
+            "examples": ["pseudo/sub/folder/"]
+          },
+          "scopes": {
+            "items": { "type": "string", "enum": ["read", "write"] },
+            "type": "array",
+            "minItems": 1,
+            "title": "Scopes",
+            "description": "Scopes of the bucket permission"
+          }
+        },
+        "type": "object",
+        "required": ["scopes"],
+        "title": "BucketPermissionParameters",
+        "description": "Schema for the parameters of a bucket permission."
+      },
+      "BucketSizeLimits": {
+        "properties": {
+          "size_limit": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "Size Limit",
+            "description": "Size limit of the bucket in KiB",
+            "examples": [10240]
+          },
+          "object_limit": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "Object Limit",
+            "description": "Number of objects limit of the bucket",
+            "examples": [10000]
+          }
+        },
+        "type": "object",
+        "title": "BucketSizeLimits",
+        "description": "Schema to represent bucket limits."
+      },
+      "BucketType": {
+        "type": "string",
+        "enum": ["OWN", "ALL", "PERMISSION"],
+        "title": "BucketType",
+        "description": "Enumeration for the type of buckets to fetch from the DB\n\nOWN: Only fetch buckets that the user owns\nPERMISSION: Only fetch foreign buckets that the user has access to\nALL: Fetch all buckets that the user has access to"
+      },
+      "DevWorkflowExecutionIn": {
+        "properties": {
+          "parameters": {
+            "type": "object",
+            "title": "Parameters",
+            "description": "Parameters for this workflow"
+          },
+          "logs_s3_path": {
+            "anyOf": [
+              {
+                "type": "string",
+                "maxLength": 1024,
+                "minLength": 3,
+                "pattern": "^s3://(\\w){1}(\\w-\\./)*(\\w){1}"
+              },
+              { "type": "null" }
+            ],
+            "title": "Logs S3 Path",
+            "description": "S3 Path where to save logs and reports. If None, nothing will be uploaded.",
+            "examples": ["s3://example-bucket/logs"]
+          },
+          "provenance_s3_path": {
+            "anyOf": [
+              {
+                "type": "string",
+                "maxLength": 1024,
+                "minLength": 3,
+                "pattern": "^s3://(\\w){1}(\\w-\\./)*(\\w){1}"
+              },
+              { "type": "null" }
+            ],
+            "title": "Provenance S3 Path",
+            "description": "S3 Path where to save provenance information. If None, nothing will be uploaded.",
+            "examples": ["s3://example-bucket/provenance"]
+          },
+          "debug_s3_path": {
+            "anyOf": [
+              {
+                "type": "string",
+                "maxLength": 1024,
+                "minLength": 3,
+                "pattern": "^s3://(\\w){1}(\\w-\\./)*(\\w){1}"
+              },
+              { "type": "null" }
+            ],
+            "title": "Debug S3 Path",
+            "description": "S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.",
+            "examples": ["s3://example-bucket/debug"]
+          },
+          "git_commit_hash": {
+            "type": "string",
+            "maxLength": 40,
+            "minLength": 40,
+            "pattern": "^[0-9a-f]{40}$",
+            "title": "Git Commit Hash",
+            "description": "Hash of the git commit",
+            "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]
+          },
+          "repository_url": {
+            "type": "string",
+            "minLength": 1,
+            "format": "uri",
+            "title": "Repository Url",
+            "description": "URL to the Git repository belonging to this workflow",
+            "examples": ["https://github.com/example-user/example"]
+          },
+          "token": {
+            "anyOf": [
+              { "type": "string", "maxLength": 128 },
+              { "type": "null" }
+            ],
+            "title": "Token",
+            "description": "Token to access the content git repository",
+            "examples": ["vnpau89avpa48iunga984gh9h89pvhj"]
+          },
+          "mode": {
+            "anyOf": [
+              { "$ref": "#/components/schemas/WorkflowModeIn" },
+              { "type": "null" }
+            ],
+            "description": "Mode of the workflow with an alternative entrypoint"
+          },
+          "nextflow_version": {
+            "$ref": "#/components/schemas/NextflowVersion",
+            "description": "The version of Nextflow this workflow execution requires"
+          }
+        },
+        "type": "object",
+        "required": [
+          "parameters",
+          "git_commit_hash",
+          "repository_url",
+          "nextflow_version"
+        ],
+        "title": "DevWorkflowExecutionIn"
+      },
+      "DocumentationEnum": {
+        "type": "string",
+        "enum": [
+          "usage.md",
+          "input.md",
+          "output.md",
+          "changelog.md",
+          "parameter_schema.json",
+          "clowm_info.json",
+          "CITATIONS.md"
+        ],
+        "title": "DocumentationEnum"
+      },
+      "FileTree": {
+        "properties": {
+          "type": {
+            "type": "string",
+            "enum": ["file", "directory", "link"],
+            "title": "Type"
+          },
+          "name": { "type": "string", "title": "Name" },
+          "target": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Target"
+          },
+          "contents": {
+            "anyOf": [
+              {
+                "items": { "$ref": "#/components/schemas/FileTree" },
+                "type": "array"
+              },
+              { "type": "null" }
+            ],
+            "title": "Contents"
+          },
+          "size": { "type": "integer", "title": "Size" }
+        },
+        "type": "object",
+        "required": ["type", "name", "size"],
+        "title": "FileTree"
+      },
+      "HTTPValidationError": {
+        "properties": {
+          "detail": {
+            "items": { "$ref": "#/components/schemas/ValidationError" },
+            "type": "array",
+            "title": "Detail"
+          }
+        },
+        "type": "object",
+        "title": "HTTPValidationError"
+      },
+      "IconUpdateOut": {
+        "properties": {
+          "icon_url": {
+            "type": "string",
+            "minLength": 1,
+            "format": "uri",
+            "title": "Icon Url",
+            "description": "URL to the uploaded icon",
+            "examples": [
+              "https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"
+            ]
+          }
+        },
+        "type": "object",
+        "required": ["icon_url"],
+        "title": "IconUpdateOut"
+      },
+      "InstanceSpecificDefaultParameters": {
+        "additionalProperties": {
+          "anyOf": [
+            { "type": "string" },
+            { "type": "integer" },
+            { "type": "number" },
+            { "type": "boolean" }
+          ]
+        },
+        "type": "object"
+      },
+      "NewsIn": {
+        "properties": {
+          "content": {
+            "type": "string",
+            "maxLength": 65536,
+            "minLength": 16,
+            "title": "Content",
+            "description": "Content of the news. Can contain Markdown.",
+            "examples": ["## Header\n\nSome text"]
+          },
+          "title": {
+            "type": "string",
+            "maxLength": 256,
+            "minLength": 3,
+            "title": "Title",
+            "description": "Title of the news",
+            "examples": ["Some title"]
+          },
+          "important_till": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "Important Till",
+            "description": "UNIX timestamp till the news is important.",
+            "examples": [1640991600]
+          },
+          "category": {
+            "type": "string",
+            "enum": ["workflow", "resource", "system"],
+            "title": "Category",
+            "description": "Category of the news event",
+            "default": "system"
+          }
+        },
+        "type": "object",
+        "required": ["content", "title"],
+        "title": "NewsIn"
+      },
+      "NewsOut": {
+        "properties": {
+          "content": {
+            "type": "string",
+            "maxLength": 65536,
+            "minLength": 16,
+            "title": "Content",
+            "description": "Content of the news. Can contain Markdown.",
+            "examples": ["## Header\n\nSome text"]
+          },
+          "title": {
+            "type": "string",
+            "maxLength": 256,
+            "minLength": 3,
+            "title": "Title",
+            "description": "Title of the news",
+            "examples": ["Some title"]
+          },
+          "important_till": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "Important Till",
+            "description": "UNIX timestamp till the news is important.",
+            "examples": [1640991600]
+          },
+          "category": {
+            "type": "string",
+            "enum": ["workflow", "resource", "system"],
+            "title": "Category",
+            "description": "Category of the news event"
+          },
+          "news_id": {
+            "type": "string",
+            "title": "News Id",
+            "description": "ID of the news event",
+            "examples": ["f3e2acf0-e942-44b2-8f85-52b7deb660ec"]
+          },
+          "creator_id": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Creator Id",
+            "description": "ID of the creator",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          },
+          "created_at": {
+            "type": "integer",
+            "maximum": 4294967295.0,
+            "minimum": 1.0,
+            "title": "Created At",
+            "description": "UNIX timestamp when the bucket was created",
+            "examples": [1640991600]
+          }
+        },
+        "type": "object",
+        "required": ["content", "title", "category", "news_id", "created_at"],
+        "title": "NewsOut"
+      },
+      "NextflowVersion": {
+        "type": "string",
+        "enum": [
+          "22.10.0",
+          "22.10.1",
+          "22.10.2",
+          "22.10.3",
+          "22.10.4",
+          "22.10.5",
+          "22.10.6",
+          "22.10.7",
+          "22.10.8",
+          "23.04.0",
+          "23.04.1",
+          "23.04.2",
+          "23.04.3",
+          "23.04.4",
+          "23.04.5",
+          "23.10.0",
+          "23.10.1",
+          "23.10.2",
+          "23.10.3",
+          "23.10.4",
+          "24.04.1",
+          "24.04.2",
+          "24.04.3",
+          "24.04.4",
+          "24.10.0",
+          "24.10.1",
+          "24.10.2",
+          "24.10.3",
+          "24.10.4"
+        ],
+        "title": "NextflowVersion"
+      },
+      "OIDCProvider": {
+        "type": "string",
+        "enum": ["lifescience-aai", "nfdi-aai"],
+        "title": "OIDCProvider"
+      },
+      "OwnershipTransferRequestIn": {
+        "properties": {
+          "new_owner_uid": {
+            "type": "string",
+            "format": "uuid",
+            "title": "New Owner Uid",
+            "description": "The new owner that get the request",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          },
+          "comment": {
+            "anyOf": [
+              { "type": "string", "maxLength": 256 },
+              { "type": "null" }
+            ],
+            "title": "Comment",
+            "description": "An optional comment for the transfer request",
+            "examples": ["This is an example comment"]
+          }
+        },
+        "type": "object",
+        "required": ["new_owner_uid"],
+        "title": "OwnershipTransferRequestIn"
+      },
+      "OwnershipTransferRequestOut": {
+        "properties": {
+          "new_owner_uid": {
+            "type": "string",
+            "title": "New Owner Uid",
+            "description": "The new owner that get the request",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          },
+          "comment": {
+            "type": "string",
+            "title": "Comment",
+            "description": "An optional comment for the transfer request",
+            "default": "",
+            "examples": ["This is an example comment"]
+          },
+          "created_at": {
+            "type": "integer",
+            "maximum": 4294967295.0,
+            "minimum": 1.0,
+            "title": "Created At",
+            "description": "Time when the ownership transfer was requested as UNIX timestamp",
+            "examples": [1640991600]
+          },
+          "current_owner_uid": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Current Owner Uid",
+            "description": "The current uid of the current owner if he exists",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          },
+          "target_id": {
+            "type": "string",
+            "title": "Target Id",
+            "description": "Id of the target that gets its ownership transferred"
+          },
+          "target_name": {
+            "type": "string",
+            "title": "Target Name",
+            "description": "Name of the target",
+            "examples": [
+              "example-bucket",
+              "Example Workflow",
+              "Example Resource"
+            ]
+          },
+          "target_description": {
+            "type": "string",
+            "title": "Target Description",
+            "description": "Description of then target",
+            "examples": ["Some long description of a target"]
+          },
+          "target_type": {
+            "$ref": "#/components/schemas/OwnershipTypeEnum",
+            "description": "Target type of the ownership transfer",
+            "examples": ["bucket"]
+          }
+        },
+        "type": "object",
+        "required": [
+          "new_owner_uid",
+          "created_at",
+          "target_id",
+          "target_name",
+          "target_description",
+          "target_type"
+        ],
+        "title": "OwnershipTransferRequestOut"
+      },
+      "OwnershipTypeEnum": {
+        "type": "string",
+        "enum": ["bucket", "workflow", "resource"],
+        "title": "OwnershipTypeEnum"
+      },
+      "ParameterExtension-Input": {
+        "properties": {
+          "mapping": {
+            "additionalProperties": {
+              "additionalProperties": {
+                "anyOf": [
+                  { "type": "string" },
+                  { "type": "integer" },
+                  { "type": "number" }
+                ]
+              },
+              "type": "object"
+            },
+            "type": "object",
+            "title": "Mapping",
+            "description": "The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.",
+            "examples": [
+              {
+                "some-complex-parameter": {
+                  "Option 1": "/some/path",
+                  "Option 2": "/some/other/path"
+                }
+              }
+            ]
+          },
+          "defaults": {
+            "$ref": "#/components/schemas/InstanceSpecificDefaultParameters",
+            "description": "Dictionary with parameter name as key and default value as value",
+            "examples": [{ "parameter1": "somevalue", "parameter2": 12 }]
+          },
+          "parameter_visibility": {
+            "$ref": "#/components/schemas/ParameterVisibilityMapping"
+          }
+        },
+        "type": "object",
+        "title": "ParameterExtension"
+      },
+      "ParameterExtension-Output": {
+        "properties": {
+          "mapping": {
+            "additionalProperties": {
+              "additionalProperties": {
+                "anyOf": [
+                  { "type": "string" },
+                  { "type": "integer" },
+                  { "type": "number" }
+                ]
+              },
+              "type": "object"
+            },
+            "type": "object",
+            "title": "Mapping",
+            "description": "The inner dictionary contains the display name as key and the parameter value as value. The outer dictionary has the parameter name as key.",
+            "examples": [
+              {
+                "some-complex-parameter": {
+                  "Option 1": "/some/path",
+                  "Option 2": "/some/other/path"
+                }
+              }
+            ]
+          },
+          "defaults": {
+            "$ref": "#/components/schemas/InstanceSpecificDefaultParameters",
+            "description": "Dictionary with parameter name as key and default value as value",
+            "examples": [{ "parameter1": "somevalue", "parameter2": 12 }]
+          },
+          "parameter_visibility": {
+            "$ref": "#/components/schemas/ParameterVisibilityMapping"
+          }
+        },
+        "type": "object",
+        "title": "ParameterExtension"
+      },
+      "ParameterVisibility": {
+        "type": "integer",
+        "enum": [10, 20, 30, 40],
+        "title": "ParameterVisibility"
+      },
+      "ParameterVisibilityMapping": {
+        "additionalProperties": {
+          "$ref": "#/components/schemas/ParameterVisibility"
+        },
+        "type": "object"
+      },
+      "PermissionStatus": {
+        "type": "string",
+        "enum": ["ACTIVE", "INACTIVE"],
+        "title": "PermissionStatus",
+        "description": "Status of a bucket permission. Can be either `ACTIVE` or `INACTIVE`. A permission can only get `INACTIVE` if the\npermission itself has a time limit and the current time is not in the timespan."
+      },
+      "PublicWorkflowOut": {
+        "properties": {
+          "name": {
+            "type": "string",
+            "maxLength": 64,
+            "minLength": 3,
+            "title": "Name",
+            "description": "Short descriptive name of the workflow",
+            "examples": ["RNA ReadMapper"]
+          },
+          "short_description": {
+            "type": "string",
+            "maxLength": 256,
+            "minLength": 64,
+            "title": "Short Description",
+            "description": "Short description of the workflow",
+            "examples": [
+              "This should be a very good example of a short and descriptive description"
+            ]
+          },
+          "repository_url": {
+            "type": "string",
+            "minLength": 1,
+            "format": "uri",
+            "title": "Repository Url",
+            "description": "URL to the Git repository belonging to this workflow",
+            "examples": ["https://github.com/example-user/example"]
+          },
+          "workflow_id": {
+            "type": "string",
+            "title": "Workflow Id",
+            "description": "ID of the workflow",
+            "examples": ["20128c04-e834-40a8-9878-68939ae46423"]
+          },
+          "latest_git_commit_hash": {
+            "type": "string",
+            "maxLength": 40,
+            "minLength": 40,
+            "pattern": "^[0-9a-f]{40}$",
+            "title": "Latest Git Commit Hash",
+            "description": "Hash of the git commit",
+            "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]
+          },
+          "latest_version_tag": {
+            "type": "string",
+            "maxLength": 10,
+            "minLength": 5,
+            "title": "Latest Version Tag",
+            "description": "Version of the Workflow. Should follow semantic versioning",
+            "examples": ["v1.1.0"]
+          },
+          "developer": {
+            "type": "string",
+            "title": "Developer",
+            "description": "Name of the developer",
+            "default": "",
+            "examples": ["Bilbo Baggins"]
+          },
+          "latest_version_timestamp": {
+            "type": "integer",
+            "maximum": 4294967295.0,
+            "minimum": 1.0,
+            "title": "Latest Version Timestamp",
+            "description": "Timestamp when the last version was created as UNIX timestamp",
+            "examples": [1640991600]
+          },
+          "icon_url": {
+            "anyOf": [
+              { "type": "string", "minLength": 1, "format": "uri" },
+              { "type": "null" }
+            ],
+            "title": "Icon Url",
+            "description": "URL to the workflow icon",
+            "readOnly": true,
+            "examples": [
+              "https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"
+            ]
+          }
+        },
+        "type": "object",
+        "required": [
+          "name",
+          "short_description",
+          "repository_url",
+          "workflow_id",
+          "latest_git_commit_hash",
+          "latest_version_tag",
+          "latest_version_timestamp",
+          "icon_url"
+        ],
+        "title": "PublicWorkflowOut"
+      },
+      "ResourceIn": {
+        "properties": {
+          "release": {
+            "type": "string",
+            "maxLength": 32,
+            "minLength": 3,
+            "title": "Release",
+            "description": "Short tag describing the version of the resource",
+            "examples": ["01-2023"]
+          },
+          "name": {
+            "type": "string",
+            "maxLength": 32,
+            "minLength": 3,
+            "title": "Name",
+            "description": "Short Name for the resource",
+            "examples": ["blast-db"]
+          },
+          "description": {
+            "type": "string",
+            "maxLength": 264,
+            "minLength": 16,
+            "title": "Description",
+            "description": "Short description for this resource",
+            "examples": ["This is a short description for a resource"]
+          },
+          "source": {
+            "type": "string",
+            "maxLength": 264,
+            "minLength": 8,
+            "title": "Source",
+            "description": "A link or similar where the resource originates from",
+            "examples": ["https://example.com/db"]
+          },
+          "private": {
+            "type": "boolean",
+            "title": "Private",
+            "description": "Flag if this resource should be default visible in the UI",
+            "default": true
+          }
+        },
+        "type": "object",
+        "required": ["release", "name", "description", "source"],
+        "title": "ResourceIn"
+      },
+      "ResourceOut": {
+        "properties": {
+          "name": {
+            "type": "string",
+            "maxLength": 32,
+            "minLength": 3,
+            "title": "Name",
+            "description": "Short Name for the resource",
+            "examples": ["blast-db"]
+          },
+          "description": {
+            "type": "string",
+            "maxLength": 264,
+            "minLength": 16,
+            "title": "Description",
+            "description": "Short description for this resource",
+            "examples": ["This is a short description for a resource"]
+          },
+          "source": {
+            "type": "string",
+            "maxLength": 264,
+            "minLength": 8,
+            "title": "Source",
+            "description": "A link or similar where the resource originates from",
+            "examples": ["https://example.com/db"]
+          },
+          "private": {
+            "type": "boolean",
+            "title": "Private",
+            "description": "Flag if this resource should be default visible in the UI",
+            "default": true
+          },
+          "resource_id": {
+            "type": "string",
+            "title": "Resource Id",
+            "description": "ID of the resource",
+            "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]
+          },
+          "maintainer_id": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Maintainer Id",
+            "description": "ID of the maintainer",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          },
+          "versions": {
+            "items": { "$ref": "#/components/schemas/ResourceVersionOut" },
+            "type": "array",
+            "title": "Versions",
+            "description": "Versions of the resource"
+          }
+        },
+        "type": "object",
+        "required": [
+          "name",
+          "description",
+          "source",
+          "resource_id",
+          "maintainer_id",
+          "versions"
+        ],
+        "title": "ResourceOut"
+      },
+      "ResourceVersionIn": {
+        "properties": {
+          "release": {
+            "type": "string",
+            "maxLength": 32,
+            "minLength": 3,
+            "title": "Release",
+            "description": "Short tag describing the version of the resource",
+            "examples": ["01-2023"]
+          }
+        },
+        "type": "object",
+        "required": ["release"],
+        "title": "ResourceVersionIn"
+      },
+      "ResourceVersionOut": {
+        "properties": {
+          "release": {
+            "type": "string",
+            "maxLength": 32,
+            "minLength": 3,
+            "title": "Release",
+            "description": "Short tag describing the version of the resource",
+            "examples": ["01-2023"]
+          },
+          "status": {
+            "$ref": "#/components/schemas/ResourceVersionStatus",
+            "description": "Status of the resource version"
+          },
+          "resource_version_id": {
+            "type": "string",
+            "title": "Resource Version Id",
+            "description": "ID of the resource version",
+            "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"]
+          },
+          "resource_id": {
+            "type": "string",
+            "title": "Resource Id",
+            "description": "ID of the resource",
+            "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]
+          },
+          "created_at": {
+            "type": "integer",
+            "maximum": 4294967295.0,
+            "minimum": 1.0,
+            "title": "Created At",
+            "description": "Timestamp when the version was created as UNIX timestamp",
+            "examples": [1672527600]
+          },
+          "compressed_size": {
+            "type": "integer",
+            "maximum": 1.8446744073709552e19,
+            "minimum": 0.0,
+            "title": "Compressed Size",
+            "description": "Size of the compressed resource in bytes",
+            "examples": [42097156608]
+          },
+          "cluster_path": {
+            "type": "string",
+            "title": "Cluster Path",
+            "description": "Path to the resource on the cluster if the resource is synchronized",
+            "readOnly": true,
+            "examples": [
+              "/vol/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4",
+              "/vol/resources/CLDB-0e240ccd/latest"
+            ]
+          },
+          "s3_path": {
+            "type": "string",
+            "title": "S3 Path",
+            "description": "Path to the resource in the S3 Bucket. Not publicly available.",
+            "readOnly": true,
+            "examples": [
+              "s3://clowm-data/resources/CLDB-0e240ccd/fb4cee121e9149f3905f808845c7c1f4/resource.tar.gz"
+            ]
+          }
+        },
+        "type": "object",
+        "required": [
+          "release",
+          "status",
+          "resource_version_id",
+          "resource_id",
+          "created_at",
+          "compressed_size",
+          "cluster_path",
+          "s3_path"
+        ],
+        "title": "ResourceVersionOut"
+      },
+      "ResourceVersionStatus": {
+        "type": "string",
+        "enum": [
+          "RESOURCE_REQUESTED",
+          "WAIT_FOR_REVIEW",
+          "DENIED",
+          "APPROVED",
+          "SYNC_REQUESTED",
+          "SYNCHRONIZING",
+          "SYNC_ERROR",
+          "SYNCHRONIZED",
+          "SETTING_LATEST",
+          "LATEST",
+          "CLUSTER_DELETING",
+          "CLUSTER_DELETE_ERROR",
+          "S3_DELETING",
+          "S3_DELETE_ERROR",
+          "S3_DELETED"
+        ],
+        "title": "ResourceVersionStatus",
+        "description": "Enumeration for the possible status of a resource version."
+      },
+      "RoleEnum": {
+        "type": "string",
+        "enum": [
+          "administrator",
+          "user",
+          "reviewer",
+          "developer",
+          "db_maintainer"
+        ],
+        "title": "RoleEnum"
+      },
+      "S3Key": {
+        "properties": {
+          "uid": {
+            "type": "string",
+            "title": "Uid",
+            "description": "UID of the user of that access key",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          },
+          "access_key": {
+            "type": "string",
+            "title": "Access Key",
+            "description": "ID of the S3 access key",
+            "examples": ["CRJ6B037V2ZT4U3W17VC"]
+          },
+          "secret_key": {
+            "type": "string",
+            "title": "Secret Key",
+            "description": "Secret of the S3 access key",
+            "examples": ["2F5uNTI1qvt4oAroXV0wWct8rWclL2QvFXKqSqjS"]
+          }
+        },
+        "type": "object",
+        "required": ["uid", "access_key", "secret_key"],
+        "title": "S3Key",
+        "description": "Schema for a S3 key associated with a user."
+      },
+      "UserIn": {
+        "properties": {
+          "display_name": {
+            "type": "string",
+            "maxLength": 256,
+            "title": "Display Name",
+            "description": "Full Name of the user",
+            "examples": ["Bilbo Baggins"]
+          },
+          "roles": {
+            "items": { "$ref": "#/components/schemas/RoleEnum" },
+            "type": "array",
+            "title": "Roles",
+            "examples": [["user"]]
+          },
+          "email": {
+            "type": "string",
+            "format": "email",
+            "title": "Email",
+            "description": "Email of the user",
+            "examples": ["user@example.org"]
+          }
+        },
+        "type": "object",
+        "required": ["display_name", "email"],
+        "title": "UserIn"
+      },
+      "UserOut": {
+        "properties": {
+          "display_name": {
+            "type": "string",
+            "maxLength": 256,
+            "title": "Display Name",
+            "description": "Full Name of the user",
+            "examples": ["Bilbo Baggins"]
+          },
+          "uid": {
+            "type": "string",
+            "title": "Uid",
+            "description": "ID of the user",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          }
+        },
+        "type": "object",
+        "required": ["display_name", "uid"],
+        "title": "UserOut",
+        "description": "Schema for a user."
+      },
+      "UserOutExtended": {
+        "properties": {
+          "roles": {
+            "items": { "$ref": "#/components/schemas/RoleEnum" },
+            "type": "array",
+            "title": "Roles",
+            "description": "Roles of the user",
+            "examples": [["user"]]
+          },
+          "display_name": {
+            "type": "string",
+            "maxLength": 256,
+            "title": "Display Name",
+            "description": "Full Name of the user",
+            "examples": ["Bilbo Baggins"]
+          },
+          "uid": {
+            "type": "string",
+            "title": "Uid",
+            "description": "ID of the user",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          },
+          "lifescience_id": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Lifescience Id",
+            "description": "Lifesicence AAI ID of the user",
+            "examples": ["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]
+          },
+          "nfdi_id": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Nfdi Id",
+            "description": "NFDI AAI ID of the user",
+            "examples": ["18b59678f16d2c59306c0aedb1dc7ddcfe162456"]
+          },
+          "invitation_token_created_at": {
+            "anyOf": [{ "type": "integer" }, { "type": "null" }],
+            "title": "Invitation Token Created At",
+            "description": "Timestamp when the invitation token was created as UNIX timestamp"
+          },
+          "email": {
+            "anyOf": [
+              { "type": "string", "format": "email" },
+              { "type": "null" }
+            ],
+            "title": "Email",
+            "description": "Email of the user",
+            "examples": ["user@example.org"]
+          },
+          "gravatar_url": {
+            "type": "string",
+            "minLength": 1,
+            "format": "uri",
+            "title": "Gravatar Url",
+            "description": "URL to the gravatar avatar based on the users email",
+            "readOnly": true,
+            "examples": [
+              "https://gravatar.com/avatar/87a8c45825eb709ee8e453d2c0f8154e1b9bf4b45bb9b81b7662177340aa9d38"
+            ]
+          }
+        },
+        "type": "object",
+        "required": ["roles", "display_name", "uid", "gravatar_url"],
+        "title": "UserOutExtended"
+      },
+      "UserRequestAnswer": {
+        "properties": {
+          "deny": {
+            "type": "boolean",
+            "title": "Deny",
+            "description": "Flag to indicate if the request was denied.",
+            "default": false
+          },
+          "reason": {
+            "anyOf": [
+              { "type": "string", "maxLength": 512, "minLength": 16 },
+              { "type": "null" }
+            ],
+            "title": "Reason",
+            "description": "Reason why the request was denied or approved. Required if request is denied."
+          }
+        },
+        "type": "object",
+        "title": "UserRequestAnswer"
+      },
+      "UserRoles": {
+        "properties": {
+          "roles": {
+            "items": { "$ref": "#/components/schemas/RoleEnum" },
+            "type": "array",
+            "title": "Roles",
+            "description": "Roles of the user",
+            "examples": [["user"]]
+          }
+        },
+        "type": "object",
+        "required": ["roles"],
+        "title": "UserRoles"
+      },
+      "UserSynchronizationRequestIn": {
+        "properties": {
+          "reason": {
+            "type": "string",
+            "maxLength": 512,
+            "minLength": 16,
+            "title": "Reason",
+            "description": "Reason why the request was requested.",
+            "examples": [
+              "This version is required to reproduce a execution with Workflow XY@2.0."
+            ]
+          }
+        },
+        "type": "object",
+        "required": ["reason"],
+        "title": "UserSynchronizationRequestIn"
+      },
+      "UserSynchronizationRequestOut": {
+        "properties": {
+          "reason": {
+            "type": "string",
+            "maxLength": 512,
+            "minLength": 16,
+            "title": "Reason",
+            "description": "Reason why the request was requested.",
+            "examples": [
+              "This version is required to reproduce a execution with Workflow XY@2.0."
+            ]
+          },
+          "resource_version_id": {
+            "type": "string",
+            "title": "Resource Version Id",
+            "description": "ID of the resource version",
+            "examples": ["fb4cee12-1e91-49f3-905f-808845c7c1f4"]
+          },
+          "resource_id": {
+            "type": "string",
+            "title": "Resource Id",
+            "description": "ID of the resource",
+            "examples": ["4c072e39-2bd9-4fa3-b564-4d890e240ccd"]
+          },
+          "requester_id": {
+            "type": "string",
+            "title": "Requester Id",
+            "description": "ID of the user that requested this resource synchronization",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          }
+        },
+        "type": "object",
+        "required": [
+          "reason",
+          "resource_version_id",
+          "resource_id",
+          "requester_id"
+        ],
+        "title": "UserSynchronizationRequestOut"
+      },
+      "ValidationError": {
+        "properties": {
+          "loc": {
+            "items": { "anyOf": [{ "type": "string" }, { "type": "integer" }] },
+            "type": "array",
+            "title": "Location"
+          },
+          "msg": { "type": "string", "title": "Message" },
+          "type": { "type": "string", "title": "Error Type" }
+        },
+        "type": "object",
+        "required": ["loc", "msg", "type"],
+        "title": "ValidationError"
+      },
+      "WorkflowCredentialsIn": {
+        "properties": {
+          "token": {
+            "type": "string",
+            "maxLength": 128,
+            "title": "Token",
+            "description": "Token to access the content git repository",
+            "examples": ["vnpau89avpa48iunga984gh9h89pvhj"]
+          }
+        },
+        "type": "object",
+        "required": ["token"],
+        "title": "WorkflowCredentialsIn"
+      },
+      "WorkflowCredentialsOut": {
+        "properties": {
+          "token": {
+            "anyOf": [
+              { "type": "string", "maxLength": 128 },
+              { "type": "null" }
+            ],
+            "title": "Token",
+            "description": "Token to access the content git repository",
+            "examples": ["vnpau89avpa48iunga984gh9h89pvhj"]
+          }
+        },
+        "type": "object",
+        "title": "WorkflowCredentialsOut"
+      },
+      "WorkflowExecutionIn": {
+        "properties": {
+          "parameters": {
+            "type": "object",
+            "title": "Parameters",
+            "description": "Parameters for this workflow"
+          },
+          "logs_s3_path": {
+            "anyOf": [
+              {
+                "type": "string",
+                "maxLength": 1024,
+                "minLength": 3,
+                "pattern": "^s3://(\\w){1}(\\w-\\./)*(\\w){1}"
+              },
+              { "type": "null" }
+            ],
+            "title": "Logs S3 Path",
+            "description": "S3 Path where to save logs and reports. If None, nothing will be uploaded.",
+            "examples": ["s3://example-bucket/logs"]
+          },
+          "provenance_s3_path": {
+            "anyOf": [
+              {
+                "type": "string",
+                "maxLength": 1024,
+                "minLength": 3,
+                "pattern": "^s3://(\\w){1}(\\w-\\./)*(\\w){1}"
+              },
+              { "type": "null" }
+            ],
+            "title": "Provenance S3 Path",
+            "description": "S3 Path where to save provenance information. If None, nothing will be uploaded.",
+            "examples": ["s3://example-bucket/provenance"]
+          },
+          "debug_s3_path": {
+            "anyOf": [
+              {
+                "type": "string",
+                "maxLength": 1024,
+                "minLength": 3,
+                "pattern": "^s3://(\\w){1}(\\w-\\./)*(\\w){1}"
+              },
+              { "type": "null" }
+            ],
+            "title": "Debug S3 Path",
+            "description": "S3 Path where to save debug information from Nextflow. If None, nothing will be uploaded.",
+            "examples": ["s3://example-bucket/debug"]
+          },
+          "workflow_version_id": {
+            "type": "string",
+            "maxLength": 40,
+            "minLength": 40,
+            "pattern": "^[0-9a-f]{40}$",
+            "title": "Workflow Version Id",
+            "description": "Workflow version git commit hash",
+            "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]
+          },
+          "notes": {
+            "anyOf": [
+              { "type": "string", "maxLength": 65536 },
+              { "type": "null" }
+            ],
+            "title": "Notes",
+            "description": "Optional notes for this workflow execution",
+            "examples": ["Some workflow execution specific notes"]
+          },
+          "mode_id": {
+            "anyOf": [
+              { "type": "string", "format": "uuid" },
+              { "type": "null" }
+            ],
+            "title": "Mode Id",
+            "description": "ID of the workflow mode this workflow execution runs in",
+            "examples": ["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]
+          }
+        },
+        "type": "object",
+        "required": ["parameters", "workflow_version_id"],
+        "title": "WorkflowExecutionIn"
+      },
+      "WorkflowExecutionOut": {
+        "properties": {
+          "workflow_version_id": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Workflow Version Id",
+            "description": "Workflow version git commit hash",
+            "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]
+          },
+          "notes": {
+            "anyOf": [
+              { "type": "string", "maxLength": 65536 },
+              { "type": "null" }
+            ],
+            "title": "Notes",
+            "description": "Optional notes for this workflow execution",
+            "examples": ["Some workflow execution specific notes"]
+          },
+          "mode_id": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Mode Id",
+            "description": "ID of the workflow mode this workflow execution runs in",
+            "examples": ["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]
+          },
+          "execution_id": {
+            "type": "string",
+            "title": "Execution Id",
+            "description": "ID of the workflow execution",
+            "examples": ["591b6a6e-a1f0-420d-8a20-a7a60704f695"]
+          },
+          "executor_id": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Executor Id",
+            "description": "UID of user who started the workflow",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          },
+          "start_time": {
+            "type": "integer",
+            "maximum": 4294967295.0,
+            "minimum": 1.0,
+            "title": "Start Time",
+            "description": "Start time of the workflow execution as UNIX timestamp",
+            "examples": [1640991600]
+          },
+          "end_time": {
+            "anyOf": [
+              { "type": "integer", "maximum": 4294967295.0, "minimum": 1.0 },
+              { "type": "null" }
+            ],
+            "title": "End Time",
+            "description": "End time of the workflow execution as UNIX timestamp",
+            "examples": [1640991600]
+          },
+          "status": {
+            "$ref": "#/components/schemas/WorkflowExecutionStatus",
+            "description": "Status of the workflow execution",
+            "examples": ["RUNNING"]
+          },
+          "workflow_id": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Workflow Id",
+            "description": "Id of the workflow",
+            "examples": ["20128c04-e834-40a8-9878-68939ae46423"]
+          },
+          "logs_s3_path": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Logs S3 Path",
+            "description": "S3 Path where logs and reports are saved.",
+            "examples": [
+              "s3://example-bucket/logs/run-591b6a6ea1f0420d8a20a7a60704f695"
+            ]
+          },
+          "provenance_s3_path": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Provenance S3 Path",
+            "description": "S3 Path where provenance information is saved.",
+            "examples": [
+              "s3://example-bucket/provenance/run-591b6a6ea1f0420d8a20a7a60704f695"
+            ]
+          },
+          "debug_s3_path": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Debug S3 Path",
+            "description": "S3 Path where debug information from Nextflow is saved.",
+            "examples": [
+              "s3://example-bucket/debug/run-591b6a6ea1f0420d8a20a7a60704f695"
+            ]
+          },
+          "cpu_time": {
+            "type": "string",
+            "format": "duration",
+            "title": "Cpu Time",
+            "description": "The consumed cpu time in ISO 8601 format",
+            "examples": ["P4DT12H30M5S"]
+          }
+        },
+        "type": "object",
+        "required": ["execution_id", "start_time", "status", "cpu_time"],
+        "title": "WorkflowExecutionOut"
+      },
+      "WorkflowExecutionStatus": {
+        "type": "string",
+        "enum": [
+          "PENDING",
+          "SCHEDULED",
+          "RUNNING",
+          "CANCELED",
+          "SUCCESS",
+          "ERROR"
+        ],
+        "title": "WorkflowExecutionStatus",
+        "description": "Enumeration for the status on a workflow execution."
+      },
+      "WorkflowIn": {
+        "properties": {
+          "name": {
+            "type": "string",
+            "maxLength": 64,
+            "minLength": 3,
+            "title": "Name",
+            "description": "Short descriptive name of the workflow",
+            "examples": ["RNA ReadMapper"]
+          },
+          "short_description": {
+            "type": "string",
+            "maxLength": 256,
+            "minLength": 64,
+            "title": "Short Description",
+            "description": "Short description of the workflow",
+            "examples": [
+              "This should be a very good example of a short and descriptive description"
+            ]
+          },
+          "repository_url": {
+            "type": "string",
+            "minLength": 1,
+            "format": "uri",
+            "title": "Repository Url",
+            "description": "URL to the Git repository belonging to this workflow",
+            "examples": ["https://github.com/example-user/example"]
+          },
+          "git_commit_hash": {
+            "type": "string",
+            "maxLength": 40,
+            "minLength": 40,
+            "pattern": "^[0-9a-f]{40}$",
+            "title": "Git Commit Hash",
+            "description": "Hash of the git commit",
+            "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]
+          },
+          "initial_version": {
+            "type": "string",
+            "maxLength": 10,
+            "minLength": 5,
+            "title": "Initial Version",
+            "description": "Version of the Workflow. Should follow semantic versioning",
+            "examples": ["v1.1.0"]
+          },
+          "token": {
+            "anyOf": [
+              { "type": "string", "maxLength": 128 },
+              { "type": "null" }
+            ],
+            "title": "Token",
+            "description": "Token to access the content git repository",
+            "examples": ["vnpau89avpa48iunga984gh9h89pvhj"]
+          },
+          "modes": {
+            "items": { "$ref": "#/components/schemas/WorkflowModeIn" },
+            "type": "array",
+            "maxItems": 10,
+            "title": "Modes",
+            "description": "List of modes with alternative entrypoint the new workflow has",
+            "default": []
+          },
+          "nextflow_version": {
+            "$ref": "#/components/schemas/NextflowVersion",
+            "description": "The version of Nextflow this workflow version requires.",
+            "examples": ["24.04.4"]
+          }
+        },
+        "type": "object",
+        "required": [
+          "name",
+          "short_description",
+          "repository_url",
+          "git_commit_hash",
+          "initial_version",
+          "nextflow_version"
+        ],
+        "title": "WorkflowIn"
+      },
+      "WorkflowModeIn": {
+        "properties": {
+          "schema_path": {
+            "type": "string",
+            "maxLength": 256,
+            "title": "Schema Path",
+            "description": "Path to the alternative parameter schema",
+            "examples": ["modes/schema1.json"]
+          },
+          "entrypoint": {
+            "type": "string",
+            "maxLength": 256,
+            "title": "Entrypoint",
+            "description": "Name of the process the workflow should start with. Argument to the parameter '-entry'",
+            "examples": ["example"]
+          },
+          "name": {
+            "type": "string",
+            "maxLength": 128,
+            "title": "Name",
+            "description": "Name of the workflow mode",
+            "examples": ["Example Name"]
+          }
+        },
+        "type": "object",
+        "required": ["schema_path", "entrypoint", "name"],
+        "title": "WorkflowModeIn"
+      },
+      "WorkflowModeOut": {
+        "properties": {
+          "schema_path": {
+            "type": "string",
+            "maxLength": 256,
+            "title": "Schema Path",
+            "description": "Path to the alternative parameter schema",
+            "examples": ["modes/schema1.json"]
+          },
+          "entrypoint": {
+            "type": "string",
+            "maxLength": 256,
+            "title": "Entrypoint",
+            "description": "Name of the process the workflow should start with. Argument to the parameter '-entry'",
+            "examples": ["example"]
+          },
+          "name": {
+            "type": "string",
+            "maxLength": 128,
+            "title": "Name",
+            "description": "Name of the workflow mode",
+            "examples": ["Example Name"]
+          },
+          "mode_id": {
+            "type": "string",
+            "title": "Mode Id",
+            "description": "ID of the workflow mode",
+            "examples": ["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]
+          }
+        },
+        "type": "object",
+        "required": ["schema_path", "entrypoint", "name", "mode_id"],
+        "title": "WorkflowModeOut"
+      },
+      "WorkflowOut": {
+        "properties": {
+          "name": {
+            "type": "string",
+            "maxLength": 64,
+            "minLength": 3,
+            "title": "Name",
+            "description": "Short descriptive name of the workflow",
+            "examples": ["RNA ReadMapper"]
+          },
+          "short_description": {
+            "type": "string",
+            "maxLength": 256,
+            "minLength": 64,
+            "title": "Short Description",
+            "description": "Short description of the workflow",
+            "examples": [
+              "This should be a very good example of a short and descriptive description"
+            ]
+          },
+          "repository_url": {
+            "type": "string",
+            "minLength": 1,
+            "format": "uri",
+            "title": "Repository Url",
+            "description": "URL to the Git repository belonging to this workflow",
+            "examples": ["https://github.com/example-user/example"]
+          },
+          "workflow_id": {
+            "type": "string",
+            "title": "Workflow Id",
+            "description": "ID of the workflow",
+            "examples": ["20128c04-e834-40a8-9878-68939ae46423"]
+          },
+          "versions": {
+            "items": { "$ref": "#/components/schemas/WorkflowVersionOut" },
+            "type": "array",
+            "title": "Versions",
+            "description": "Versions of the workflow"
+          },
+          "developer_id": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Developer Id",
+            "description": "ID of developer of the workflow",
+            "examples": ["1d3387f3-95c0-4813-8767-2cad87faeebf"]
+          },
+          "private": {
+            "type": "boolean",
+            "title": "Private",
+            "description": "Flag if the workflow is hosted in a private git repository",
+            "default": false
+          }
+        },
+        "type": "object",
+        "required": [
+          "name",
+          "short_description",
+          "repository_url",
+          "workflow_id",
+          "versions"
+        ],
+        "title": "WorkflowOut"
+      },
+      "WorkflowStatistic": {
+        "properties": {
+          "day": {
+            "type": "string",
+            "format": "date",
+            "title": "Day",
+            "description": "Day of the datapoint",
+            "examples": ["2023-01-01"]
+          },
+          "count": {
+            "type": "integer",
+            "title": "Count",
+            "description": "Number of started workflows on that day",
+            "examples": [1]
+          }
+        },
+        "type": "object",
+        "required": ["day", "count"],
+        "title": "WorkflowStatistic"
+      },
+      "WorkflowUpdate": {
+        "properties": {
+          "version": {
+            "type": "string",
+            "maxLength": 10,
+            "minLength": 5,
+            "title": "Version",
+            "description": "Version of the Workflow. Should follow semantic versioning",
+            "examples": ["v1.1.0"]
+          },
+          "git_commit_hash": {
+            "type": "string",
+            "maxLength": 40,
+            "minLength": 40,
+            "pattern": "^[0-9a-f]{40}$",
+            "title": "Git Commit Hash",
+            "description": "Hash of the git commit",
+            "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]
+          },
+          "append_modes": {
+            "items": { "$ref": "#/components/schemas/WorkflowModeIn" },
+            "type": "array",
+            "title": "Append Modes",
+            "description": "Add modes to the new workflow version"
+          },
+          "delete_modes": {
+            "items": { "type": "string", "format": "uuid" },
+            "type": "array",
+            "title": "Delete Modes",
+            "description": "Delete modes for the new workflow version.",
+            "examples": ["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]
+          }
+        },
+        "type": "object",
+        "required": ["version", "git_commit_hash"],
+        "title": "WorkflowUpdate"
+      },
+      "WorkflowVersionMetadataIn": {
+        "properties": {
+          "nextflow_version": {
+            "$ref": "#/components/schemas/NextflowVersion",
+            "description": "The version of Nextflow this workflow version requires.",
+            "examples": ["24.04.4"]
+          },
+          "nextflow_config": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Nextflow Config",
+            "description": "Nextflow config that overrides the config in the git repository"
+          },
+          "default_container": {
+            "anyOf": [
+              {
+                "type": "string",
+                "pattern": ":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"
+              },
+              { "type": "null" }
+            ],
+            "title": "Default Container",
+            "description": "Default container to use for all Nextflow processes that have to container specified",
+            "examples": ["debian:12-slim"]
+          }
+        },
+        "type": "object",
+        "required": ["nextflow_version"],
+        "title": "WorkflowVersionMetadataIn"
+      },
+      "WorkflowVersionMetadataOut": {
+        "properties": {
+          "nextflow_version": {
+            "$ref": "#/components/schemas/NextflowVersion",
+            "description": "The version of Nextflow this workflow version requires.",
+            "examples": ["24.04.4"]
+          },
+          "nextflow_config": {
+            "anyOf": [{ "type": "string" }, { "type": "null" }],
+            "title": "Nextflow Config",
+            "description": "Nextflow config that overrides the config in the git repository"
+          },
+          "default_container": {
+            "anyOf": [
+              {
+                "type": "string",
+                "pattern": ":[a-zA-Z0-9_][a-zA-Z0-9-_\\.]{0,127}$"
+              },
+              { "type": "null" }
+            ],
+            "title": "Default Container",
+            "description": "Default container to use for all Nextflow processes that have to container specified",
+            "examples": ["debian:12-slim"]
+          }
+        },
+        "type": "object",
+        "required": ["nextflow_version"],
+        "title": "WorkflowVersionMetadataOut"
+      },
+      "WorkflowVersionOut": {
+        "properties": {
+          "status": {
+            "$ref": "#/components/schemas/WorkflowVersionStatus",
+            "description": "Status of the workflow version",
+            "examples": ["PUBLISHED"]
+          },
+          "workflow_id": {
+            "type": "string",
+            "title": "Workflow Id",
+            "description": "ID of the corresponding workflow",
+            "examples": ["20128c04-e834-40a8-9878-68939ae46423"]
+          },
+          "version": {
+            "type": "string",
+            "maxLength": 10,
+            "minLength": 5,
+            "title": "Version",
+            "description": "Version of the Workflow. Should follow semantic versioning",
+            "examples": ["v1.1.0"]
+          },
+          "icon_url": {
+            "anyOf": [
+              { "type": "string", "minLength": 1, "format": "uri" },
+              { "type": "null" }
+            ],
+            "title": "Icon Url",
+            "description": "URL to the uploaded icon",
+            "examples": [
+              "https://s3-dev.clowm.de/clowm-data/icon/980a9446c7f2460c83187cbb876f8424.png"
+            ]
+          },
+          "workflow_version_id": {
+            "type": "string",
+            "maxLength": 40,
+            "minLength": 40,
+            "pattern": "^[0-9a-f]{40}$",
+            "title": "Workflow Version Id",
+            "description": "Hash of the git commit",
+            "examples": ["ba8bcd9294c2c96aedefa1763a84a18077c50c0f"]
+          },
+          "created_at": {
+            "type": "integer",
+            "maximum": 4294967295.0,
+            "minimum": 1.0,
+            "title": "Created At",
+            "description": "Timestamp when the version was created as UNIX timestamp",
+            "examples": [1640991600]
+          },
+          "modes": {
+            "items": { "type": "string" },
+            "type": "array",
+            "title": "Modes",
+            "description": "Optional modes his workflow version has",
+            "default": [],
+            "examples": ["2a23a083-b6b9-4681-9ec4-ff4ffbe85d3c"]
+          },
+          "parameter_extension": {
+            "anyOf": [
+              { "$ref": "#/components/schemas/ParameterExtension-Output" },
+              { "type": "null" }
+            ],
+            "description": "Parameter extension specific for this CloWM instance"
+          },
+          "nextflow_version": {
+            "$ref": "#/components/schemas/NextflowVersion",
+            "description": "The version of Nextflow this workflow version requires.",
+            "examples": ["24.04.4"]
+          }
+        },
+        "type": "object",
+        "required": [
+          "status",
+          "workflow_id",
+          "version",
+          "workflow_version_id",
+          "created_at",
+          "nextflow_version"
+        ],
+        "title": "WorkflowVersionOut"
+      },
+      "WorkflowVersionStatus": {
+        "type": "string",
+        "enum": ["CREATED", "DENIED", "PUBLISHED", "DEPRECATED"],
+        "title": "WorkflowVersionStatus",
+        "description": "Enumeration for the possible status of a workflow version."
+      },
+      "WorkflowVersionStatusSchema": {
+        "properties": {
+          "status": {
+            "$ref": "#/components/schemas/WorkflowVersionStatus",
+            "description": "Status of the workflow version",
+            "examples": ["PUBLISHED"]
+          }
+        },
+        "type": "object",
+        "required": ["status"],
+        "title": "WorkflowVersionStatusSchema"
+      }
+    },
+    "securitySchemes": {
+      "Session Token": {
+        "type": "apiKey",
+        "description": "The JWT in this cookie is used by the website and should not be used when communicating directly with the API.",
+        "in": "cookie",
+        "name": "clowm-jwt"
+      }
+    }
+  }
+}
diff --git a/package-lock.json b/package-lock.json
index 35360ce..e8c29ec 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -49,7 +49,7 @@
         "@vue/eslint-config-prettier": "~10.2.0",
         "@vue/eslint-config-typescript": "~14.4.0",
         "@vue/tsconfig": "~0.7.0",
-        "eslint": "~9.20.0",
+        "eslint": "~9.21.0",
         "eslint-plugin-vue": "~9.32.0",
         "highlight.js": "^11.9.0",
         "prettier": "~3.5.0",
@@ -2050,9 +2050,9 @@
       }
     },
     "node_modules/@eslint/core": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz",
-      "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==",
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz",
+      "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==",
       "dev": true,
       "license": "Apache-2.0",
       "dependencies": {
@@ -2063,9 +2063,9 @@
       }
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
-      "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz",
+      "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2135,9 +2135,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "9.20.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz",
-      "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==",
+      "version": "9.21.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.21.0.tgz",
+      "integrity": "sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2168,19 +2168,6 @@
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
       }
     },
-    "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz",
-      "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@types/json-schema": "^7.0.15"
-      },
-      "engines": {
-        "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
-      }
-    },
     "node_modules/@fortawesome/fontawesome-free": {
       "version": "6.7.2",
       "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz",
@@ -3871,9 +3858,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "22.13.4",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz",
-      "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==",
+      "version": "22.13.5",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz",
+      "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4291,9 +4278,9 @@
       }
     },
     "node_modules/@vue/devtools-core/node_modules/nanoid": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.0.tgz",
-      "integrity": "sha512-zDAl/llz8Ue/EblwSYwdxGBYfj46IM1dhjVi8dyp9LQffoIGxJEAHj2oeZ4uNcgycSRcQ83CnfcZqEJzVDLcDw==",
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz",
+      "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==",
       "dev": true,
       "funding": [
         {
@@ -4382,9 +4369,9 @@
       }
     },
     "node_modules/@vue/language-core": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.2.tgz",
-      "integrity": "sha512-QotO41kurE5PLf3vrNgGTk3QswO2PdUFjBwNiOi7zMmGhwb25PSTh9hD1MCgKC06AVv+8sZQvlL3Do4TTVHSiQ==",
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.4.tgz",
+      "integrity": "sha512-eGGdw7eWUwdIn9Fy/irJ7uavCGfgemuHQABgJ/hU1UgZFnbTg9VWeXvHQdhY+2SPQZWJqWXvRWIg67t4iWEa+Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -5586,9 +5573,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.5.102",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz",
-      "integrity": "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==",
+      "version": "1.5.103",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.103.tgz",
+      "integrity": "sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==",
       "dev": true,
       "license": "ISC"
     },
@@ -5748,22 +5735,22 @@
       }
     },
     "node_modules/eslint": {
-      "version": "9.20.1",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.1.tgz",
-      "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==",
+      "version": "9.21.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.21.0.tgz",
+      "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.12.1",
-        "@eslint/config-array": "^0.19.0",
-        "@eslint/core": "^0.11.0",
-        "@eslint/eslintrc": "^3.2.0",
-        "@eslint/js": "9.20.0",
-        "@eslint/plugin-kit": "^0.2.5",
+        "@eslint/config-array": "^0.19.2",
+        "@eslint/core": "^0.12.0",
+        "@eslint/eslintrc": "^3.3.0",
+        "@eslint/js": "9.21.0",
+        "@eslint/plugin-kit": "^0.2.7",
         "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
-        "@humanwhocodes/retry": "^0.4.1",
+        "@humanwhocodes/retry": "^0.4.2",
         "@types/estree": "^1.0.6",
         "@types/json-schema": "^7.0.15",
         "ajv": "^6.12.4",
@@ -6434,17 +6421,17 @@
       }
     },
     "node_modules/get-intrinsic": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
-      "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
       "license": "MIT",
       "dependencies": {
-        "call-bind-apply-helpers": "^1.0.1",
+        "call-bind-apply-helpers": "^1.0.2",
         "es-define-property": "^1.0.1",
         "es-errors": "^1.3.0",
-        "es-object-atoms": "^1.0.0",
+        "es-object-atoms": "^1.1.1",
         "function-bind": "^1.1.2",
-        "get-proto": "^1.0.0",
+        "get-proto": "^1.0.1",
         "gopd": "^1.2.0",
         "has-symbols": "^1.1.0",
         "hasown": "^2.0.2",
@@ -6488,9 +6475,9 @@
       }
     },
     "node_modules/giget": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.4.tgz",
-      "integrity": "sha512-Wv+daGyispVoA31TrWAVR+aAdP7roubTPEM/8JzRnqXhLbdJH0T9eQyXVFF8fjk3WKTsctII6QcyxILYgNp2DA==",
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.5.tgz",
+      "integrity": "sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -6498,9 +6485,8 @@
         "consola": "^3.4.0",
         "defu": "^6.1.4",
         "node-fetch-native": "^1.6.6",
-        "nypm": "^0.5.1",
-        "ohash": "^1.1.4",
-        "pathe": "^2.0.2",
+        "nypm": "^0.5.4",
+        "pathe": "^2.0.3",
         "tar": "^6.2.1"
       },
       "bin": {
@@ -8091,9 +8077,9 @@
       }
     },
     "node_modules/prettier": {
-      "version": "3.5.1",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.1.tgz",
-      "integrity": "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==",
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.2.tgz",
+      "integrity": "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -9463,14 +9449,14 @@
       "license": "MIT"
     },
     "node_modules/vue-tsc": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.2.tgz",
-      "integrity": "sha512-1icPKkxAA5KTAaSwg0wVWdE48EdsH8fgvcbAiqojP4jXKl6LEM3soiW1aG/zrWrFt8Mw1ncG2vG1PvpZpVfehA==",
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.4.tgz",
+      "integrity": "sha512-3EVHlxtpMXcb5bCaK7QDFTbEkMusDfVk0HVRrkv5hEb+Clpu9a96lKUXJAeD/akRlkoA4H8MCHgBDN19S6FnzA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@volar/typescript": "~2.4.11",
-        "@vue/language-core": "2.2.2"
+        "@vue/language-core": "2.2.4"
       },
       "bin": {
         "vue-tsc": "bin/vue-tsc.js"
diff --git a/package.json b/package.json
index f493ba0..3c83d6a 100644
--- a/package.json
+++ b/package.json
@@ -52,7 +52,7 @@
     "@vue/eslint-config-prettier": "~10.2.0",
     "@vue/eslint-config-typescript": "~14.4.0",
     "@vue/tsconfig": "~0.7.0",
-    "eslint": "~9.20.0",
+    "eslint": "~9.21.0",
     "eslint-plugin-vue": "~9.32.0",
     "highlight.js": "^11.9.0",
     "prettier": "~3.5.0",
diff --git a/src/App.vue b/src/App.vue
index a0ea967..5e39972 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -197,8 +197,9 @@ onMounted(() => {
       modal-id="welcome-modal"
       modal-label="Welcome Modal"
       static-backdrop
+      size-modifier-modal="xl"
     >
-      <template #header>Hello to CloWM</template>
+      <template #header>Welcome to CloWM</template>
       <template #body>This is your first time in CloWM</template>
     </bootstrap-modal>
     <router-view />
diff --git a/src/client/types.gen.ts b/src/client/types.gen.ts
index c9c0003..39d47ee 100644
--- a/src/client/types.gen.ts
+++ b/src/client/types.gen.ts
@@ -434,6 +434,10 @@ export enum NextflowVersion {
   "24_04_3" = "24.04.3",
   "24_04_4" = "24.04.4",
   "24_10_0" = "24.10.0",
+  "24_10_1" = "24.10.1",
+  "24_10_2" = "24.10.2",
+  "24_10_3" = "24.10.3",
+  "24_10_4" = "24.10.4",
 }
 
 export enum OidcProvider {
diff --git a/src/views/SignupView.vue b/src/views/SignupView.vue
index 734a1ac..f57cc22 100644
--- a/src/views/SignupView.vue
+++ b/src/views/SignupView.vue
@@ -35,22 +35,31 @@ onBeforeUnmount(() => {
   <p>
     The only prerequisite for using CloWM is a
     <a href="https://lifescience-ri.eu/">LifeScience</a> or
-    <a href="https://iam.services.base4nfdi.de">NFDI</a>
+    <a href="https://iam.services.base4nfdi.de">NFDI AAI</a>
     account.
   </p>
   <h4>I don't have such an Account</h4>
+  <h5>LifeScience AAI</h5>
   <p>
-    I you don't have a LifeScience account yet, you can register by going to the
+    You can register by going to the
     <a
       href="https://lifescience-ri.eu/ls-login/version-2023/user/how-to-get-ls-id.html"
       >LifeScience website</a
     >
     and follow the instructions there.
   </p>
-  <h4>I already have a LifeScience Account</h4>
+  <h5>NFDI AAI</h5>
+  <p>
+    The NFDI AAI maintains a list of
+    <a href="https://doc.nfdi-aai.de/community-aai-software/"
+      >connected Community AAIs</a
+    >. If you have an account at one of those AAIs, you can simply use the NFDI
+    AII
+  </p>
+  <h4>I already have such an account</h4>
   <p class="fs-6">
-    Then you can simply log into CloWM by clicking the button below and a CloWM
-    account will be created automatically for you.
+    Then you can simply log into CloWM by clicking one of the buttons below and
+    a CloWM account will be created automatically for you.
   </p>
   <div class="d-flex flex-column mx-auto w-fit align-items-center mt-5">
     <login-buttons :return-path="returnPath" />
diff --git a/src/views/admin/AdminBucketsView.vue b/src/views/admin/AdminBucketsView.vue
index 4e3e137..86ef666 100644
--- a/src/views/admin/AdminBucketsView.vue
+++ b/src/views/admin/AdminBucketsView.vue
@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { computed, reactive } from "vue";
+import { computed, onBeforeMount, reactive } from "vue";
 import { BucketType } from "@/client/types.gen";
 import type { BucketOut, UserOut } from "@/client/types.gen";
 import SearchUserModal from "@/components/modals/SearchUserModal.vue";
@@ -11,22 +11,28 @@ import dayjs from "dayjs";
 import UpdateBucketLimitsModal from "@/components/admin/UpdateBucketLimitsModal.vue";
 import DeleteBucketModal from "@/components/object-storage/modals/DeleteBucketModal.vue";
 import CreateOtrModal from "@/components/modals/CreateOtrModal.vue";
+import { useRoute, useRouter } from "vue-router";
+import { useUserStore } from "@/stores";
+
+const filters = reactive<{
+  searchString: string;
+  ownerId: string;
+}>({
+  searchString: "",
+  ownerId: "",
+});
 
 const bucketState = reactive<{
   buckets: BucketOut[];
   selectedBucket?: BucketOut;
-  ownerId: string;
   loading: boolean;
   searched: boolean;
-  filterString: string;
   updateLimitsBucket: BucketOut;
 }>({
   buckets: [],
   selectedBucket: undefined,
-  ownerId: "",
   loading: false,
   searched: false,
-  filterString: "",
   updateLimitsBucket: {
     name: "",
     description: "",
@@ -36,35 +42,40 @@ const bucketState = reactive<{
   },
 });
 
+const QUERY_PARAM_OWNER_ID = "owner_id";
+const QUERY_PARAM_BUCKET_NAME = "search";
+
+const route = useRoute<"admin-buckets">();
+const router = useRouter();
+
 const bucketRepository = useBucketStore();
 const nameRepository = useNameStore();
+const userRepository = useUserStore();
 
 const updateLimitsModalId = "admin-update-bucket-limits-modal";
 
 const filteredBuckets = computed<BucketOut[]>(() =>
   bucketState.buckets.filter((bucket) =>
-    bucket.name.includes(bucketState.filterString),
+    bucket.name.includes(filters.searchString),
   ),
 );
 
 function updateUser(user: UserOut) {
-  bucketState.ownerId = user.uid;
+  filters.ownerId = user.uid;
 }
 
 function resetForm() {
-  bucketState.ownerId = "";
-  bucketState.filterString = "";
+  filters.ownerId = "";
+  filters.searchString = "";
   bucketState.buckets = [];
   bucketState.searched = false;
+  router.replace({ name: "admin-buckets" });
 }
 
 function searchBuckets() {
   bucketState.loading = true;
   bucketRepository
-    .fetchBuckets(
-      bucketState.ownerId ? bucketState.ownerId : undefined,
-      BucketType.OWN,
-    )
+    .fetchBuckets(filters.ownerId ? filters.ownerId : undefined, BucketType.OWN)
     .then((buckets) => {
       bucketState.buckets = buckets;
     })
@@ -72,6 +83,17 @@ function searchBuckets() {
       bucketState.loading = false;
       bucketState.searched = true;
     });
+  const queryParams: Record<string, string> = {};
+  if (filters.ownerId.length > 0) {
+    queryParams[QUERY_PARAM_OWNER_ID] = filters.ownerId;
+  }
+  if (filters.searchString.trim().length > 0) {
+    queryParams[QUERY_PARAM_BUCKET_NAME] = filters.searchString.trim();
+  }
+  router.replace({
+    name: "admin-buckets",
+    query: queryParams,
+  });
 }
 
 function deleteBucket(bucketName: string) {
@@ -95,6 +117,26 @@ function limitsUpdated(bucket: BucketOut) {
     bucketState.buckets[bucketIndex] = bucket;
   }
 }
+
+onBeforeMount(() => {
+  let search = false;
+  if (route.query[QUERY_PARAM_OWNER_ID] != undefined) {
+    if (typeof route.query[QUERY_PARAM_OWNER_ID] === "string") {
+      filters.ownerId = route.query[QUERY_PARAM_OWNER_ID];
+      userRepository.fetchUsernames([route.query[QUERY_PARAM_OWNER_ID]]);
+      search = true;
+    }
+  }
+  if (route.query[QUERY_PARAM_BUCKET_NAME] != undefined) {
+    if (typeof route.query[QUERY_PARAM_BUCKET_NAME] === "string") {
+      filters.searchString = route.query[QUERY_PARAM_BUCKET_NAME];
+      search = true;
+    }
+  }
+  if (search) {
+    searchBuckets();
+  }
+});
 </script>
 
 <template>
@@ -127,7 +169,11 @@ function limitsUpdated(bucket: BucketOut) {
   <div class="border-bottom mb-4">
     <h2>Manage Buckets</h2>
   </div>
-  <form id="admin-bucket-search-form" @submit.prevent="searchBuckets">
+  <form
+    id="admin-bucket-search-form"
+    @submit.prevent="searchBuckets"
+    @reset.prevent="resetForm"
+  >
     <div
       class="d-flex justify-content-evenly align-content-center mb-4 column-gap-2 flex-wrap"
     >
@@ -141,7 +187,7 @@ function limitsUpdated(bucket: BucketOut) {
           </div>
           <input
             id="admin-bucket-name-search"
-            v-model.trim="bucketState.filterString"
+            v-model.trim="filters.searchString"
             type="search"
             class="form-control"
             placeholder="Search Buckets"
@@ -162,7 +208,7 @@ function limitsUpdated(bucket: BucketOut) {
             type="text"
             class="form-control"
             readonly
-            :value="nameRepository.getName(bucketState.ownerId)"
+            :value="nameRepository.getName(filters.ownerId)"
             placeholder="Search for owner"
             data-bs-toggle="modal"
             data-bs-target="#admin-bucket-search-user-modal"
@@ -178,10 +224,9 @@ function limitsUpdated(bucket: BucketOut) {
       Search
     </button>
     <button
-      type="button"
+      type="reset"
       class="btn-primary btn w-fit ms-4"
       :disabled="bucketState.loading"
-      @click="resetForm"
     >
       Reset
     </button>
diff --git a/src/views/admin/AdminResourcesView.vue b/src/views/admin/AdminResourcesView.vue
index 27f2ee8..06a2ad6 100644
--- a/src/views/admin/AdminResourcesView.vue
+++ b/src/views/admin/AdminResourcesView.vue
@@ -1,6 +1,5 @@
 <script setup lang="ts">
-import { useResourceStore } from "@/stores/resources";
-import { reactive } from "vue";
+import { onBeforeMount, reactive } from "vue";
 import { ResourceVersionStatus } from "@/client/types.gen";
 import type {
   ResourceOut,
@@ -8,22 +7,37 @@ import type {
   UserOut,
 } from "@/client/types.gen";
 import SearchUserModal from "@/components/modals/SearchUserModal.vue";
-import { useNameStore } from "@/stores/names";
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
 import dayjs from "dayjs";
 import ResourceVersionInfoModal from "@/components/resources/modals/ResourceVersionInfoModal.vue";
 import DeleteResourceModal from "@/components/resources/modals/DeleteResourceModal.vue";
 import CreateOtrModal from "@/components/modals/CreateOtrModal.vue";
+import { useRoute, useRouter } from "vue-router";
+import { useUserStore, useNameStore, useResourceStore } from "@/stores";
 
 const resourceRepository = useResourceStore();
 const nameRepository = useNameStore();
+const userRepository = useUserStore();
+const route = useRoute<"admin-resources">();
+const router = useRouter();
 
-const resourceState = reactive<{
-  loading: boolean;
-  resources: ResourceOut[];
+const QUERY_PARAM_MAINTAINER = "maintainer_id";
+const QUERY_PARAM_SEARCH_NAME = "search";
+const QUERY_PARAM_STATUS = "status";
+
+const filters = reactive<{
   maintainerId: string;
   searchString: string;
   resourceStatus: ResourceVersionStatus[];
+}>({
+  maintainerId: "",
+  searchString: "",
+  resourceStatus: [],
+});
+
+const resourceState = reactive<{
+  loading: boolean;
+  resources: ResourceOut[];
   inspectVersionIndex: number;
   inspectResource?: ResourceOut;
   searched: boolean;
@@ -31,9 +45,6 @@ const resourceState = reactive<{
 }>({
   loading: false,
   resources: [],
-  maintainerId: "",
-  searchString: "",
-  resourceStatus: [],
   inspectVersionIndex: 0,
   inspectResource: undefined,
   searched: false,
@@ -41,7 +52,7 @@ const resourceState = reactive<{
 });
 
 function updateUser(user: UserOut) {
-  resourceState.maintainerId = user.uid;
+  filters.maintainerId = user.uid;
 }
 
 function deleteResource(resourceId: string) {
@@ -61,9 +72,9 @@ function searchResources() {
   resourceState.loading = true;
   resourceRepository
     .fetchResources(
-      resourceState.maintainerId ? resourceState.maintainerId : undefined,
-      resourceState.resourceStatus ? resourceState.resourceStatus : undefined,
-      resourceState.searchString ? resourceState.searchString : undefined,
+      filters.maintainerId ? filters.maintainerId : undefined,
+      filters.resourceStatus ? filters.resourceStatus : undefined,
+      filters.searchString ? filters.searchString : undefined,
     )
     .then((resources) => {
       resourceState.resources = resources;
@@ -72,6 +83,17 @@ function searchResources() {
       resourceState.loading = false;
       resourceState.searched = true;
     });
+  const queryParams: Record<string, string | string[]> = {};
+  if (filters.searchString.trim().length > 0) {
+    queryParams[QUERY_PARAM_SEARCH_NAME] = filters.searchString.trim();
+  }
+  if (filters.maintainerId.length > 0) {
+    queryParams[QUERY_PARAM_MAINTAINER] = filters.maintainerId;
+  }
+  if (filters.resourceStatus.length > 0) {
+    queryParams[QUERY_PARAM_STATUS] = filters.resourceStatus;
+  }
+  router.replace({ name: "admin-resources", query: queryParams });
 }
 
 function replaceResourceVersion(
@@ -135,12 +157,45 @@ function syncToCluster(resourceVersion: ResourceVersionOut) {
 }
 
 function resetForm() {
-  resourceState.maintainerId = "";
-  resourceState.searchString = "";
-  resourceState.resourceStatus = [];
+  filters.maintainerId = "";
+  filters.searchString = "";
+  filters.resourceStatus = [];
   resourceState.resources = [];
   resourceState.searched = false;
+  router.replace({ name: "admin-resources" });
 }
+
+onBeforeMount(() => {
+  let search = false;
+  if (route.query[QUERY_PARAM_MAINTAINER] != undefined) {
+    if (typeof route.query[QUERY_PARAM_MAINTAINER] === "string") {
+      filters.maintainerId = route.query[QUERY_PARAM_MAINTAINER];
+      userRepository.fetchUsernames([route.query[QUERY_PARAM_MAINTAINER]]);
+      search = true;
+    }
+  }
+  if (route.query[QUERY_PARAM_SEARCH_NAME] != undefined) {
+    if (typeof route.query[QUERY_PARAM_SEARCH_NAME] === "string") {
+      filters.searchString = route.query[QUERY_PARAM_SEARCH_NAME];
+      search = true;
+    }
+  }
+  if (route.query[QUERY_PARAM_STATUS] != undefined) {
+    if (typeof route.query[QUERY_PARAM_STATUS] === "string") {
+      filters.resourceStatus = [
+        route.query[QUERY_PARAM_STATUS] as ResourceVersionStatus,
+      ];
+    } else {
+      filters.resourceStatus = route.query[QUERY_PARAM_STATUS].filter(
+        (val) => val != undefined,
+      ).map((val) => val as ResourceVersionStatus);
+    }
+    search = filters.resourceStatus.length > 0 || search;
+  }
+  if (search) {
+    searchResources();
+  }
+});
 </script>
 
 <template>
@@ -176,7 +231,11 @@ function resetForm() {
   >
     <h2>Manage Resources</h2>
   </div>
-  <form id="admin-resource-search-form" @submit.prevent="searchResources">
+  <form
+    id="admin-resource-search-form"
+    @submit.prevent="searchResources"
+    @reset.prevent="resetForm"
+  >
     <div
       class="d-flex justify-content-evenly align-content-center flex-wrap column-gap-2 mb-2"
     >
@@ -186,7 +245,7 @@ function resetForm() {
         >
         <select
           id="admin-resource-state-select"
-          v-model="resourceState.resourceStatus"
+          v-model="filters.resourceStatus"
           multiple
           class="form-select w-fit"
         >
@@ -208,7 +267,7 @@ function resetForm() {
           </div>
           <input
             id="admin-resource-name-search"
-            v-model="resourceState.searchString"
+            v-model="filters.searchString"
             type="search"
             class="form-control"
             maxlength="32"
@@ -229,7 +288,7 @@ function resetForm() {
             type="text"
             class="form-control"
             readonly
-            :value="nameRepository.getName(resourceState.maintainerId)"
+            :value="nameRepository.getName(filters.maintainerId)"
             placeholder="Search for maintainer"
             data-bs-toggle="modal"
             data-bs-target="#admin-resource-search-user-modal"
@@ -245,10 +304,9 @@ function resetForm() {
       Search
     </button>
     <button
-      type="button"
+      type="reset"
       class="btn-primary btn w-fit ms-4"
       :disabled="resourceState.loading"
-      @click="resetForm"
     >
       Reset
     </button>
diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue
index cebd4fa..e616be5 100644
--- a/src/views/admin/AdminUsersView.vue
+++ b/src/views/admin/AdminUsersView.vue
@@ -1,6 +1,6 @@
 <script setup lang="ts">
 import { useUserStore } from "@/stores/users";
-import { onMounted, reactive } from "vue";
+import { onBeforeMount, onMounted, reactive } from "vue";
 import {
   RoleEnum,
   type UserOutExtended,
@@ -11,13 +11,27 @@ import BootstrapToast from "@/components/BootstrapToast.vue";
 import { Toast } from "bootstrap";
 import CreateUserModal from "@/components/admin/CreateUserModal.vue";
 import DeleteUserModal from "@/components/modals/DeleteUserModal.vue";
+import { useRoute, useRouter } from "vue-router";
 
 const userRepository = useUserStore();
+const route = useRoute<"admin-users">();
+const router = useRouter();
 type RoleList = RoleEnum[];
 let successRoleToast: Toast | undefined;
 let successInvitationToast: Toast | undefined;
 let errorToast: Toast | undefined;
 
+const QUERY_PARAM_ROLE = "role";
+const QUERY_PARAM_NAME_SEARCH = "search";
+
+const filters = reactive<{
+  searchString: string;
+  roles: RoleEnum[];
+}>({
+  searchString: "",
+  roles: [],
+});
+
 const userState = reactive<{
   loading: boolean;
   users: UserOutExtended[];
@@ -25,8 +39,6 @@ const userState = reactive<{
   editUserRoles: boolean[];
   editedUser?: UserOutExtended;
   errorMessage: string;
-  searchString: string;
-  userRoles: RoleEnum[];
   inspectUser?: UserOutExtended;
   searched: boolean;
   selectedUser?: UserOut;
@@ -37,8 +49,6 @@ const userState = reactive<{
   editUserRoles: [],
   editedUser: undefined,
   errorMessage: "",
-  searchString: "",
-  userRoles: [],
   inspectUser: undefined,
   searched: false,
   selectedUser: undefined,
@@ -48,8 +58,8 @@ function searchUsers() {
   userState.loading = true;
   userRepository
     .fetchUsers(
-      userState.searchString ? userState.searchString : undefined,
-      userState.userRoles ? userState.userRoles : undefined,
+      filters.searchString ? filters.searchString : undefined,
+      filters.roles ? filters.roles : undefined,
     )
     .then((users) => {
       userState.users = users;
@@ -60,6 +70,22 @@ function searchUsers() {
       userState.loading = false;
       userState.searched = true;
     });
+  const queryParams: Record<string, string | string[]> = {};
+  if (filters.roles.length > 0) {
+    queryParams[QUERY_PARAM_ROLE] = filters.roles;
+  }
+  if (filters.searchString.trim().length > 0) {
+    queryParams[QUERY_PARAM_NAME_SEARCH] = filters.searchString;
+  }
+  router.replace({ name: "admin-users", query: queryParams });
+}
+
+function resetForm() {
+  filters.searchString = "";
+  filters.roles = [];
+  userState.users = [];
+  userState.searched = false;
+  router.replace({ name: "admin-users" });
 }
 
 function saveUserRoles(index: number) {
@@ -116,6 +142,29 @@ onMounted(() => {
   successInvitationToast = new Toast("#resend-invitation-success-toast");
   errorToast = new Toast("#change-role-error-toast");
 });
+
+onBeforeMount(() => {
+  let search = false;
+  if (route.query[QUERY_PARAM_ROLE] != undefined) {
+    if (typeof route.query[QUERY_PARAM_ROLE] === "string") {
+      filters.roles = [route.query[QUERY_PARAM_ROLE] as RoleEnum];
+    } else {
+      filters.roles = route.query[QUERY_PARAM_ROLE].filter(
+        (val) => val != undefined,
+      ).map((val) => val as RoleEnum);
+    }
+    search = filters.roles.length > 0 || search;
+  }
+  if (route.query[QUERY_PARAM_NAME_SEARCH] != undefined) {
+    if (typeof route.query[QUERY_PARAM_NAME_SEARCH] === "string") {
+      filters.searchString = route.query[QUERY_PARAM_NAME_SEARCH];
+      search = true;
+    }
+  }
+  if (search) {
+    searchUsers();
+  }
+});
 </script>
 
 <template>
@@ -151,7 +200,11 @@ onMounted(() => {
       Invite User
     </button>
   </div>
-  <form id="admin-user-search-form" @submit.prevent="searchUsers">
+  <form
+    id="admin-user-search-form"
+    @submit.prevent="searchUsers"
+    @reset.prevent="resetForm"
+  >
     <div
       class="d-flex justify-content-evenly align-content-center column-gap-3 flex-wrap mb-2"
     >
@@ -161,7 +214,7 @@ onMounted(() => {
         >
         <select
           id="admin-user-state-select"
-          v-model="userState.userRoles"
+          v-model="filters.roles"
           multiple
           class="form-select w-fit"
         >
@@ -180,7 +233,7 @@ onMounted(() => {
           </div>
           <input
             id="admin-user-name-search"
-            v-model="userState.searchString"
+            v-model="filters.searchString"
             type="search"
             class="form-control"
             maxlength="32"
@@ -197,6 +250,13 @@ onMounted(() => {
     >
       Search
     </button>
+    <button
+      type="reset"
+      class="btn btn-primary w-fit ms-4"
+      :disabled="userState.loading"
+    >
+      Reset
+    </button>
   </form>
   <div v-if="userState.users" class="overflow-x-auto" style="max-width: 100vw">
     <table class="table table-striped align-middle caption-top">
@@ -334,6 +394,41 @@ onMounted(() => {
                     >Resend invitation email</a
                   >
                 </li>
+                <li>
+                  <router-link
+                    :to="{
+                      name: 'admin-buckets',
+                      query: { owner_id: user.uid },
+                    }"
+                    class="dropdown-item"
+                    >View Buckets
+                  </router-link>
+                </li>
+                <li>
+                  <router-link
+                    :to="{
+                      name: 'admin-executions',
+                      query: { executor_id: user.uid },
+                    }"
+                    class="dropdown-item"
+                    >View Workflow executions
+                  </router-link>
+                </li>
+                <li
+                  v-if="
+                    user.roles.includes(RoleEnum.DB_MAINTAINER) ||
+                    user.roles.includes(RoleEnum.ADMINISTRATOR)
+                  "
+                >
+                  <router-link
+                    :to="{
+                      name: 'admin-resources',
+                      query: { maintainer_id: user.uid },
+                    }"
+                    class="dropdown-item"
+                    >View Resources
+                  </router-link>
+                </li>
                 <li v-if="user.uid !== userRepository.currentUID">
                   <button
                     type="button"
diff --git a/src/views/admin/AdminWorkflowExecutionView.vue b/src/views/admin/AdminWorkflowExecutionView.vue
index 13f5940..7c0f17d 100644
--- a/src/views/admin/AdminWorkflowExecutionView.vue
+++ b/src/views/admin/AdminWorkflowExecutionView.vue
@@ -1,5 +1,12 @@
 <script setup lang="ts">
-import { computed, nextTick, onMounted, reactive, ref } from "vue";
+import {
+  computed,
+  nextTick,
+  onBeforeMount,
+  onMounted,
+  reactive,
+  ref,
+} from "vue";
 import type {
   UserOut,
   WorkflowExecutionOut,
@@ -16,9 +23,15 @@ import dayjs from "dayjs";
 import ParameterModal from "@/components/workflows/modals/ParameterModal.vue";
 import MarkdownRenderer from "@/components/MarkdownRenderer.vue";
 import DeleteExecutionModal from "@/components/workflows/modals/DeleteExecutionModal.vue";
+import { useRoute, useRouter } from "vue-router";
+import { useUserStore } from "@/stores";
 
 const executionRepository = useWorkflowExecutionStore();
 const nameRepository = useNameStore();
+const userRepository = useUserStore();
+
+const route = useRoute<"admin-executions">();
+const router = useRouter();
 
 const statusToColorMapping = {
   PENDING: "bg-warning",
@@ -29,6 +42,14 @@ const statusToColorMapping = {
   ERROR: "bg-danger",
 };
 
+const QUERY_PARAM_EXECUTOR_ID = "executor_id";
+const QUERY_PARAM_EXECUTION_STATUS = "status";
+const QUERY_PARAM_VERSION_ID = "version_id";
+const QUERY_PARAM_START_AFTER = "start_after";
+const QUERY_PARAM_START_BEFORE = "start_before";
+const QUERY_PARAM_SORT = "sort";
+const QUERY_PARAM_WORKFLOW_ID = "workflow_id";
+
 let loadingObserver: IntersectionObserver;
 const endOfTableElement = ref<HTMLTableCaptionElement | undefined>(undefined);
 
@@ -90,7 +111,7 @@ function updateWorkflow(
 }
 
 function searchExecution() {
-  loadingObserver.disconnect();
+  loadingObserver?.disconnect();
   formState.loading = true;
   formState.executions = [];
   executionIterator.value = executionRepository.fetchExecutionsRaw(
@@ -104,6 +125,27 @@ function searchExecution() {
     filters.sort,
   );
   loadNextExecutions();
+  const queryParams: Record<string, string | string[]> = {};
+  if (filters.workflowVersionId != undefined) {
+    queryParams[QUERY_PARAM_VERSION_ID] = filters.workflowVersionId;
+  }
+  if (filters.executionStatus.length > 0) {
+    queryParams[QUERY_PARAM_EXECUTION_STATUS] = filters.executionStatus;
+  }
+  queryParams[QUERY_PARAM_SORT] = filters.sort;
+  if (filters.executorId != undefined) {
+    queryParams[QUERY_PARAM_EXECUTOR_ID] = filters.executorId;
+  }
+  if (filters.startAfter != undefined) {
+    queryParams[QUERY_PARAM_START_AFTER] = filters.startAfter.toString();
+  }
+  if (filters.startBefore != undefined) {
+    queryParams[QUERY_PARAM_START_BEFORE] = filters.startBefore.toString();
+  }
+  if (filters.workflowId != undefined) {
+    queryParams[QUERY_PARAM_WORKFLOW_ID] = filters.workflowId;
+  }
+  router.replace({ name: "admin-executions", query: queryParams });
 }
 
 function loadNextExecutions() {
@@ -175,8 +217,77 @@ function resetForm() {
   filters.sort = "desc";
   executionIterator.value = undefined;
   formState.executions = [];
+  router.replace({ name: "admin-executions" });
 }
 
+onBeforeMount(() => {
+  let search = false;
+  if (route.query[QUERY_PARAM_EXECUTOR_ID] != undefined) {
+    if (typeof route.query[QUERY_PARAM_EXECUTOR_ID] === "string") {
+      filters.executorId = route.query[QUERY_PARAM_EXECUTOR_ID];
+      userRepository.fetchUsernames([route.query[QUERY_PARAM_EXECUTOR_ID]]);
+      search = true;
+    }
+  }
+  if (route.query[QUERY_PARAM_VERSION_ID] != undefined) {
+    if (typeof route.query[QUERY_PARAM_VERSION_ID] === "string") {
+      filters.workflowVersionId = route.query[QUERY_PARAM_VERSION_ID];
+      search = true;
+    }
+  }
+  if (route.query[QUERY_PARAM_WORKFLOW_ID] != undefined) {
+    if (typeof route.query[QUERY_PARAM_WORKFLOW_ID] === "string") {
+      filters.workflowId = route.query[QUERY_PARAM_WORKFLOW_ID];
+      search = true;
+    }
+  }
+  if (route.query[QUERY_PARAM_START_AFTER] != undefined) {
+    if (typeof route.query[QUERY_PARAM_START_AFTER] === "string") {
+      const startAfter = Number(route.query[QUERY_PARAM_START_AFTER]);
+      if (!isNaN(startAfter)) {
+        filters.startAfter = startAfter;
+        search = true;
+      }
+    }
+  }
+  if (route.query[QUERY_PARAM_START_BEFORE] != undefined) {
+    if (typeof route.query[QUERY_PARAM_START_BEFORE] === "string") {
+      const startBefore = Number(route.query[QUERY_PARAM_START_BEFORE]);
+      if (!isNaN(startBefore)) {
+        filters.startBefore = startBefore;
+        search = true;
+      }
+    }
+  }
+  if (route.query[QUERY_PARAM_EXECUTION_STATUS] != undefined) {
+    if (typeof route.query[QUERY_PARAM_EXECUTION_STATUS] === "string") {
+      filters.executionStatus = [
+        route.query[QUERY_PARAM_EXECUTION_STATUS] as WorkflowExecutionStatus,
+      ];
+    } else {
+      filters.executionStatus = route.query[
+        QUERY_PARAM_EXECUTION_STATUS
+      ].filter((val) => val != undefined).map(
+        (val) => val as WorkflowExecutionStatus,
+      );
+    }
+    search = filters.executionStatus.length > 0 || search;
+  }
+  if (route.query[QUERY_PARAM_SORT] != undefined) {
+    if (
+      typeof route.query[QUERY_PARAM_SORT] === "string" &&
+      (route.query[QUERY_PARAM_SORT] === "asc" ||
+        route.query[QUERY_PARAM_SORT] === "desc")
+    ) {
+      filters.sort = route.query[QUERY_PARAM_SORT];
+      search = true;
+    }
+  }
+  if (search) {
+    searchExecution();
+  }
+});
+
 onMounted(() => {
   loadingObserver = new IntersectionObserver(
     (entries) => {
@@ -215,7 +326,11 @@ onMounted(() => {
   <div class="border-bottom mb-4">
     <h2>Search Workflow Execution</h2>
   </div>
-  <form id="admin-execution-search-form" @submit.prevent="searchExecution">
+  <form
+    id="admin-execution-search-form"
+    @submit.prevent="searchExecution"
+    @reset.prevent="resetForm"
+  >
     <div
       class="d-flex justify-content-evenly align-content-center mb-4 column-gap-2 flex-wrap"
     >
@@ -355,10 +470,9 @@ onMounted(() => {
       Search
     </button>
     <button
-      type="button"
+      type="reset"
       class="btn-primary btn w-fit ms-4"
       :disabled="formState.loading"
-      @click="resetForm"
     >
       Clear
     </button>
diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue
index 57d47b9..0b05c38 100644
--- a/src/views/user/ProfileView.vue
+++ b/src/views/user/ProfileView.vue
@@ -279,7 +279,7 @@ onMounted(() => {
       </div>
       <p>
         This action deletes your account and you lose access to everything in
-        CloWM that is connected to your it. <b>There is no going back.</b>
+        CloWM that is connected to it. <b>There is no going back.</b>
       </p>
       <button
         role="button"
-- 
GitLab


From 56a9827b80cd49124dc6b628d7afbd769c22924e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Mon, 24 Feb 2025 14:36:46 +0000
Subject: [PATCH 22/25] Show last login timestamp for users

#191
---
 openapi-clowm.json                 | 5 +++++
 src/client/types.gen.ts            | 4 ++++
 src/views/admin/AdminUsersView.vue | 9 ++++++++-
 src/views/user/ProfileView.vue     | 7 ++++++-
 4 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/openapi-clowm.json b/openapi-clowm.json
index 723fc4a..f555678 100644
--- a/openapi-clowm.json
+++ b/openapi-clowm.json
@@ -6549,6 +6549,11 @@
             "description": "Email of the user",
             "examples": ["user@example.org"]
           },
+          "last_login": {
+            "anyOf": [{ "type": "integer" }, { "type": "null" }],
+            "title": "Last Login",
+            "description": "Timestamp when the user last logged in"
+          },
           "gravatar_url": {
             "type": "string",
             "minLength": 1,
diff --git a/src/client/types.gen.ts b/src/client/types.gen.ts
index 39d47ee..db520cd 100644
--- a/src/client/types.gen.ts
+++ b/src/client/types.gen.ts
@@ -786,6 +786,10 @@ export type UserOutExtended = {
    * Email of the user
    */
   email?: string | null;
+  /**
+   * Timestamp when the user last logged in
+   */
+  last_login?: number | null;
   /**
    * URL to the gravatar avatar based on the users email
    */
diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue
index e616be5..ed5822f 100644
--- a/src/views/admin/AdminUsersView.vue
+++ b/src/views/admin/AdminUsersView.vue
@@ -12,6 +12,7 @@ import { Toast } from "bootstrap";
 import CreateUserModal from "@/components/admin/CreateUserModal.vue";
 import DeleteUserModal from "@/components/modals/DeleteUserModal.vue";
 import { useRoute, useRouter } from "vue-router";
+import dayjs from "dayjs";
 
 const userRepository = useUserStore();
 const route = useRoute<"admin-users">();
@@ -272,6 +273,7 @@ onBeforeMount(() => {
           <th scope="col"><b>Name</b></th>
           <th scope="col">UID</th>
           <th scope="col">Email</th>
+          <th scope="col">Last Login</th>
           <th scope="col">Lifescience AAI</th>
           <th scope="col">NFDI AAI</th>
           <th
@@ -287,7 +289,7 @@ onBeforeMount(() => {
       </thead>
       <tbody v-if="userState.users.length === 0">
         <tr>
-          <td colspan="11" class="text-center fst-italic fw-light">
+          <td colspan="12" class="text-center fst-italic fw-light">
             <template v-if="userState.searched"
               >No Users found with specified filters
             </template>
@@ -313,6 +315,11 @@ onBeforeMount(() => {
               user.email
             }}</a>
           </td>
+          <td>
+            <span v-if="user.last_login">{{
+              dayjs.unix(user.last_login).fromNow()
+            }}</span>
+          </td>
           <td>
             <input
               type="checkbox"
diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue
index 0b05c38..2b07838 100644
--- a/src/views/user/ProfileView.vue
+++ b/src/views/user/ProfileView.vue
@@ -10,6 +10,7 @@ import {
   OidcProvider,
 } from "@/client/types.gen.ts";
 import { client } from "@/client/client.gen.ts";
+import dayjs from "dayjs";
 
 const userRepository = useUserStore();
 const props = defineProps<{
@@ -90,6 +91,10 @@ onMounted(() => {
         Name: {{ userRepository.user?.display_name }}<br />
         Email: {{ userRepository.user?.email }}<br />
         CloWM ID: {{ userRepository.currentUID }}<br />
+        <span v-if="userRepository.user?.last_login"
+          >Last Login:
+          {{ dayjs.unix(userRepository.user?.last_login).fromNow() }}</span
+        >
       </div>
     </div>
     <div>
@@ -138,7 +143,7 @@ onMounted(() => {
           By connecting and expanding Identity and Access Management (IAM)
           systems, the IAM4NFDI initiative enables researchers across Germany
           and worldwide to seamlessly access tools, data, and services within
-          the National Research Data Infrastructure (NFDI)
+          the National Research Data Infrastructure (NFDI).
         </p>
         <div v-if="userRepository.user?.nfdi_id">
           <b>Linked account: </b
-- 
GitLab


From 44ea37a067189ff51ad17898c3c76c9c64189c60 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Mon, 24 Feb 2025 15:39:22 +0000
Subject: [PATCH 23/25] Manage api tokens as admin and change time formatting

#191
---
 src/components/AppHeader.vue                  |   7 +
 src/components/news/NewsRenderer.vue          |   2 +-
 .../object-storage/BucketListItem.vue         |   4 +-
 .../LastParameterizationsModal.vue            |   6 +-
 .../{modals => user}/DeleteApiTokenModal.vue  |  29 ++-
 src/components/workflows/WorkflowCard.vue     |   4 +-
 .../workflows/modals/DeleteExecutionModal.vue |   2 +-
 src/router/adminRoutes.ts                     |   9 +
 src/stores/users.ts                           |  16 +-
 src/views/DashboardView.vue                   |  10 +
 src/views/admin/AdminApiTokensView.vue        | 233 ++++++++++++++++++
 src/views/admin/AdminBucketsView.vue          |   2 +-
 src/views/admin/AdminResourcesView.vue        |   2 +-
 src/views/admin/AdminUsersView.vue            |   2 +-
 .../admin/AdminWorkflowExecutionView.vue      |   8 +-
 src/views/object-storage/BucketView.vue       |   2 +-
 src/views/user/ListApiTokenView.vue           |   6 +-
 src/views/user/ProfileView.vue                |   6 +-
 .../workflows/ListWorkflowExecutionsView.vue  |   8 +-
 src/views/workflows/ReviewWorkflowsView.vue   |   2 +-
 20 files changed, 328 insertions(+), 32 deletions(-)
 rename src/components/{modals => user}/DeleteApiTokenModal.vue (52%)
 create mode 100644 src/views/admin/AdminApiTokensView.vue

diff --git a/src/components/AppHeader.vue b/src/components/AppHeader.vue
index 6aaa9ab..cd2864d 100644
--- a/src/components/AppHeader.vue
+++ b/src/components/AppHeader.vue
@@ -235,6 +235,13 @@ watch(
                   >Users
                 </router-link>
               </li>
+              <li>
+                <router-link
+                  class="dropdown-item"
+                  :to="{ name: 'admin-tokens' }"
+                  >API tokens
+                </router-link>
+              </li>
               <li>
                 <router-link
                   class="dropdown-item"
diff --git a/src/components/news/NewsRenderer.vue b/src/components/news/NewsRenderer.vue
index dfca0a7..fd5e61e 100644
--- a/src/components/news/NewsRenderer.vue
+++ b/src/components/news/NewsRenderer.vue
@@ -15,7 +15,7 @@ const nameRepository = useNameStore();
   <h2>{{ newsEvent.title }}</h2>
   <markdown-renderer :markdown="newsEvent.content" />
   <p class="text-secondary">
-    from {{ dayjs.unix(newsEvent.created_at).format("DD.MM.YYYY HH:mm") }}
+    from {{ dayjs.unix(newsEvent.created_at).format("MMM DD, YYYY HH:mm") }}
     <template v-if="newsEvent.creator_id"
       >by {{ nameRepository.getName(newsEvent.creator_id) }}
     </template>
diff --git a/src/components/object-storage/BucketListItem.vue b/src/components/object-storage/BucketListItem.vue
index ffa79c7..0bb4388 100644
--- a/src/components/object-storage/BucketListItem.vue
+++ b/src/components/object-storage/BucketListItem.vue
@@ -254,7 +254,9 @@ onMounted(() => {
                   :id="'tooltip-creation-date-' + randomIDSuffix"
                   data-bs-toggle="tooltip"
                   :data-bs-title="
-                    dayjs.unix(bucket.created_at).format('DD.MM.YYYY HH:mm:ss')
+                    dayjs
+                      .unix(bucket.created_at)
+                      .format('MMM DD, YYYY HH:mm:ss')
                   "
                 >
                   {{ dayjs.unix(bucket.created_at).fromNow() }}
diff --git a/src/components/parameter-schema/LastParameterizationsModal.vue b/src/components/parameter-schema/LastParameterizationsModal.vue
index b93df71..5145c45 100644
--- a/src/components/parameter-schema/LastParameterizationsModal.vue
+++ b/src/components/parameter-schema/LastParameterizationsModal.vue
@@ -225,7 +225,9 @@ function parentDir(s3Path?: string | null): string | undefined {
                 </td>
                 <td>
                   {{
-                    dayjs.unix(execution.start_time).format("DD.MM.YYYY HH:mm")
+                    dayjs
+                      .unix(execution.start_time)
+                      .format("MMM DD, YYYY HH:mm")
                   }}
                 </td>
                 <td>
@@ -284,7 +286,7 @@ function parentDir(s3Path?: string | null): string | undefined {
             {{
               dayjs
                 .unix(formState.selectedExecution.start_time)
-                .format("DD.MM.YYYY HH:mm")
+                .format("MMM DD, YYYY HH:mm")
             }}</span
           >:
         </h5>
diff --git a/src/components/modals/DeleteApiTokenModal.vue b/src/components/user/DeleteApiTokenModal.vue
similarity index 52%
rename from src/components/modals/DeleteApiTokenModal.vue
rename to src/components/user/DeleteApiTokenModal.vue
index 1d1f4b9..31fca43 100644
--- a/src/components/modals/DeleteApiTokenModal.vue
+++ b/src/components/user/DeleteApiTokenModal.vue
@@ -1,6 +1,7 @@
 <script setup lang="ts">
-import DeleteModal from "./DeleteModal.vue";
+import DeleteModal from "../modals/DeleteModal.vue";
 import type { ApiTokenOut } from "@/client/types.gen.ts";
+import dayjs from "dayjs";
 
 const props = defineProps<{
   modalId: string;
@@ -34,12 +35,30 @@ function deleteToken() {
     @confirm-delete="deleteToken"
   >
     <template #body>
-      <p>
+      <div class="mb-3">
         Are you sure you want to delete the API token
         <strong v-if="props.token">{{ props.token.name }}</strong
-        >?<br />
-        You can't access the API with this token anymore.
-      </p>
+        >?
+        <ul v-if="token">
+          <li>
+            Created at:
+            {{ dayjs.unix(token.created_at).format("MMM DD, YYYY HH:mm:ss") }}
+          </li>
+          <li v-if="token.expires_at">
+            Expires at:
+            {{ dayjs.unix(token.expires_at).format("MMM DD, YYYY") }}
+          </li>
+          <li>
+            Last used:
+            <span v-if="token.last_used">{{
+              dayjs.unix(token.last_used).format("MMM DD, YYYY HH:mm:ss")
+            }}</span
+            ><span v-else class="fa-italic">Never</span>
+          </li>
+          <li>Scopes: {{ token.scopes.join(", ") }}</li>
+        </ul>
+        <b>You can't access the API with this token anymore.</b>
+      </div>
     </template>
   </delete-modal>
 </template>
diff --git a/src/components/workflows/WorkflowCard.vue b/src/components/workflows/WorkflowCard.vue
index 866b4e0..e82a811 100644
--- a/src/components/workflows/WorkflowCard.vue
+++ b/src/components/workflows/WorkflowCard.vue
@@ -91,7 +91,9 @@ onMounted(() => {
           data-bs-toggle="tooltip"
           class="align-self-end text-secondary"
           :data-bs-title="
-            dayjs.unix(latestVersion?.created_at).format('DD.MM.YYYY HH:mm:ss')
+            dayjs
+              .unix(latestVersion?.created_at)
+              .format('MMM DD, YYYY HH:mm:ss')
           "
         >
           Last Update: {{ dayjs.unix(latestVersion?.created_at).fromNow() }}
diff --git a/src/components/workflows/modals/DeleteExecutionModal.vue b/src/components/workflows/modals/DeleteExecutionModal.vue
index 2e2791e..5278d85 100644
--- a/src/components/workflows/modals/DeleteExecutionModal.vue
+++ b/src/components/workflows/modals/DeleteExecutionModal.vue
@@ -57,7 +57,7 @@ function deleteExecution() {
                 {{
                   dayjs
                     .unix(execution?.start_time ?? 0)
-                    .format("DD.MM.YYYY HH:mm:ss")
+                    .format("MMM DD, YYYY HH:mm:ss")
                 }}
               </th>
             </tr>
diff --git a/src/router/adminRoutes.ts b/src/router/adminRoutes.ts
index 0a16749..13a7c34 100644
--- a/src/router/adminRoutes.ts
+++ b/src/router/adminRoutes.ts
@@ -28,6 +28,15 @@ export const adminRoutes: RouteRecordRaw[] = [
       title: "Manage Buckets",
     },
   },
+  {
+    path: "/admin/tokens",
+    name: "admin-tokens",
+    component: () => import("../views/admin/AdminApiTokensView.vue"),
+    meta: {
+      requiresAdminRole: true,
+      title: "Manage Api tokens",
+    },
+  },
   {
     path: "/admin/executions",
     name: "admin-executions",
diff --git a/src/stores/users.ts b/src/stores/users.ts
index 7eab462..7005cc5 100644
--- a/src/stores/users.ts
+++ b/src/stores/users.ts
@@ -138,17 +138,17 @@ export const useUserStore = defineStore("user", {
           return users;
         });
     },
-    fetchApiTokens(
-      uid?: string,
-      onFinally?: () => void,
-    ): Promise<ApiTokenOut[]> {
+    fetchApiTokens(uid?: string): Promise<ApiTokenOut[]> {
+      return ApiTokenService.apiTokenListToken({
+        query: { uid: uid },
+      }).then((response) => response.data!);
+    },
+
+    fetchMyApiTokens(onFinally?: () => void) {
       if (this.apiTokens.length > 0) {
         onFinally?.();
       }
-      return ApiTokenService.apiTokenListToken({
-        query: { uid: uid },
-      })
-        .then((response) => response.data!)
+      this.fetchApiTokens(useUserStore().currentUID)
         .then((tokens) => {
           for (const token of tokens) {
             this.apiTokensMapping[token.token_id] = token;
diff --git a/src/views/DashboardView.vue b/src/views/DashboardView.vue
index e6bb46e..ece8e15 100644
--- a/src/views/DashboardView.vue
+++ b/src/views/DashboardView.vue
@@ -581,6 +581,16 @@ function accumulateWorkflowStatus(
               Invite or find users and update their roles
             </template>
           </bootstrap-card>
+          <bootstrap-card class="hover-shadow m-2 flex-fill w-fit">
+            <template #title>
+              <h5>
+                <router-link :to="{ name: 'admin-tokens' }"
+                  >API tokens</router-link
+                >
+              </h5>
+            </template>
+            <template #body> Manage all API tokens on the platform </template>
+          </bootstrap-card>
           <bootstrap-card class="hover-shadow m-2 flex-fill w-fit">
             <template #title>
               <h5>
diff --git a/src/views/admin/AdminApiTokensView.vue b/src/views/admin/AdminApiTokensView.vue
new file mode 100644
index 0000000..3fa05c8
--- /dev/null
+++ b/src/views/admin/AdminApiTokensView.vue
@@ -0,0 +1,233 @@
+<script setup lang="ts">
+import { onBeforeMount, reactive } from "vue";
+import { useRoute, useRouter } from "vue-router";
+import { useNameStore, useUserStore } from "@/stores";
+import type { ApiTokenOut, UserOut } from "@/client";
+import SearchUserModal from "@/components/modals/SearchUserModal.vue";
+import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
+import dayjs from "dayjs";
+import DeleteApiTokenModal from "@/components/user/DeleteApiTokenModal.vue";
+
+const route = useRoute<"admin-tokens">();
+const router = useRouter();
+
+const userRepository = useUserStore();
+const nameRepository = useNameStore();
+
+const QUERY_PARAM_OWNER_ID = "owner_id";
+
+const filters = reactive<{
+  ownerId: string;
+}>({
+  ownerId: "",
+});
+
+const formState = reactive<{
+  searched: boolean;
+  loading: boolean;
+  tokens: ApiTokenOut[];
+  deleteToken?: ApiTokenOut;
+}>({
+  searched: false,
+  loading: false,
+  tokens: [],
+  deleteToken: undefined,
+});
+
+function searchTokens() {
+  formState.loading = true;
+  userRepository
+    .fetchApiTokens(filters.ownerId ? filters.ownerId : undefined)
+    .then((tokens) => {
+      formState.tokens = tokens;
+      userRepository.fetchUsernames(tokens.map((token) => token.uid));
+    })
+    .finally(() => {
+      formState.searched = true;
+      formState.loading = false;
+    });
+  const queryParams: Record<string, string> = {};
+  if (filters.ownerId.length > 0) {
+    queryParams[QUERY_PARAM_OWNER_ID] = filters.ownerId;
+  }
+  router.replace({
+    name: "admin-tokens",
+    query: queryParams,
+  });
+}
+
+function resetForm() {
+  filters.ownerId = "";
+  formState.tokens = [];
+  formState.searched = false;
+  router.replace({ name: "admin-tokens" });
+}
+
+function updateUser(user: UserOut) {
+  filters.ownerId = user.uid;
+}
+
+function confirmedDeleteApiToken(tokenId: string) {
+  formState.loading = true;
+  formState.deleteToken = undefined;
+  userRepository
+    .deleteApiToken(tokenId)
+    .then(() => {
+      formState.tokens = formState.tokens.filter(
+        (token) => token.token_id !== tokenId,
+      );
+    })
+    .finally(() => {
+      formState.loading = false;
+    });
+}
+
+onBeforeMount(() => {
+  let search = false;
+  if (route.query[QUERY_PARAM_OWNER_ID] != undefined) {
+    if (typeof route.query[QUERY_PARAM_OWNER_ID] === "string") {
+      filters.ownerId = route.query[QUERY_PARAM_OWNER_ID];
+      userRepository.fetchUsernames([route.query[QUERY_PARAM_OWNER_ID]]);
+      search = true;
+    }
+  }
+  if (search) {
+    searchTokens();
+  }
+});
+</script>
+
+<template>
+  <search-user-modal
+    modal-id="admin-token-search-user-modal"
+    @user-found="updateUser"
+  />
+  <delete-api-token-modal
+    modal-id="admin-delete-api-token-modal"
+    :token="formState.deleteToken"
+    @confirm-delete="confirmedDeleteApiToken"
+  />
+  <div class="border-bottom mb-4">
+    <h2>Manage API tokens</h2>
+  </div>
+  <form
+    id="admin-tokens-search-form"
+    @submit.prevent="searchTokens"
+    @reset.prevent="resetForm"
+  >
+    <div class="mb-2">
+      <label for="admin-tokens-user-search" class="form-label"
+        >Name of the owner</label
+      >
+      <div class="input-group">
+        <div class="input-group-text">
+          <font-awesome-icon icon="fa-solid fa-user" />
+        </div>
+        <input
+          id="admin-token-user-search"
+          type="text"
+          class="form-control"
+          readonly
+          :value="nameRepository.getName(filters.ownerId)"
+          placeholder="Search for owner"
+          data-bs-toggle="modal"
+          data-bs-target="#admin-token-search-user-modal"
+        />
+      </div>
+    </div>
+    <button
+      type="submit"
+      class="btn btn-primary w-fit"
+      :disabled="formState.loading"
+    >
+      Search
+    </button>
+    <button
+      type="reset"
+      class="btn-primary btn w-fit ms-4"
+      :disabled="formState.loading"
+    >
+      Reset
+    </button>
+  </form>
+  <div class="overflow-x-auto" style="max-width: 100vw">
+    <table class="table table-striped align-middle">
+      <thead>
+        <tr>
+          <th scope="col"><b>Name</b></th>
+          <th scope="col">ID</th>
+          <th scope="col">Owner</th>
+          <th scope="col">Created at</th>
+          <th scope="col">Last used</th>
+          <th scope="col">Expires at</th>
+          <th scope="col">Scope READ</th>
+          <th scope="col">Scope WRITE</th>
+          <th></th>
+        </tr>
+      </thead>
+      <tbody v-if="formState.tokens.length === 0">
+        <tr>
+          <td colspan="9" class="text-center fst-italic fw-light">
+            <template v-if="formState.searched"
+              >No API tokens found with specified filters
+            </template>
+            <template v-else
+              >Select a filter and search for API tokens
+            </template>
+          </td>
+        </tr>
+      </tbody>
+      <tbody v-else>
+        <tr v-for="token in formState.tokens" :key="token.token_id">
+          <th scope="row">{{ token.name }}</th>
+          <td>{{ token.token_id }}</td>
+          <td>{{ nameRepository.getName(token.uid) }}</td>
+          <td>
+            {{ dayjs.unix(token.created_at).format("MMM DD, YYYY HH:mm:ss") }}
+          </td>
+          <td>
+            <span v-if="token.last_used">{{
+              dayjs.unix(token.last_used).format("MMM DD, YYYY HH:mm:ss")
+            }}</span
+            ><span v-else class="fa-italic">Never</span>
+          </td>
+          <td>
+            <span v-if="token.expires_at">{{
+              dayjs.unix(token.expires_at).format("MMM DD, YYYY")
+            }}</span
+            ><span v-else class="fa-italic">Never</span>
+          </td>
+          <td class="text-center">
+            <input
+              type="checkbox"
+              class="form-check-input"
+              :checked="token.scopes.includes('read')"
+              disabled
+            />
+          </td>
+          <td class="text-center">
+            <input
+              type="checkbox"
+              class="form-check-input"
+              :checked="token.scopes.includes('write')"
+              disabled
+            />
+          </td>
+          <td>
+            <button
+              type="button"
+              class="btn btn-danger"
+              data-bs-toggle="modal"
+              data-bs-target="#admin-delete-api-token-modal"
+              @click="formState.deleteToken = token"
+            >
+              Delete
+            </button>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+</template>
+
+<style scoped></style>
diff --git a/src/views/admin/AdminBucketsView.vue b/src/views/admin/AdminBucketsView.vue
index 86ef666..6da1a2e 100644
--- a/src/views/admin/AdminBucketsView.vue
+++ b/src/views/admin/AdminBucketsView.vue
@@ -263,7 +263,7 @@ onBeforeMount(() => {
           <th scope="row">{{ bucket.name }}</th>
           <td class="description-column">{{ bucket.description }}</td>
           <td>
-            {{ dayjs.unix(bucket.created_at).format("DD.MM.YYYY HH:mm:ss") }}
+            {{ dayjs.unix(bucket.created_at).format("MMM DD, YYYY HH:mm:ss") }}
           </td>
           <td>
             <span v-if="bucket.size_limit">
diff --git a/src/views/admin/AdminResourcesView.vue b/src/views/admin/AdminResourcesView.vue
index 06a2ad6..5e5033c 100644
--- a/src/views/admin/AdminResourcesView.vue
+++ b/src/views/admin/AdminResourcesView.vue
@@ -405,7 +405,7 @@ onBeforeMount(() => {
                       {{
                         dayjs
                           .unix(version.created_at)
-                          .format("DD.MM.YYYY HH:mm:ss")
+                          .format("MMM DD, YYYY HH:mm:ss")
                       }}
                     </th>
                     <th>{{ version.status }}</th>
diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue
index ed5822f..83e47dd 100644
--- a/src/views/admin/AdminUsersView.vue
+++ b/src/views/admin/AdminUsersView.vue
@@ -317,7 +317,7 @@ onBeforeMount(() => {
           </td>
           <td>
             <span v-if="user.last_login">{{
-              dayjs.unix(user.last_login).fromNow()
+              dayjs.unix(user.last_login).format("MMM DD, YYYY HH:mm")
             }}</span>
           </td>
           <td>
diff --git a/src/views/admin/AdminWorkflowExecutionView.vue b/src/views/admin/AdminWorkflowExecutionView.vue
index 7c0f17d..b216a60 100644
--- a/src/views/admin/AdminWorkflowExecutionView.vue
+++ b/src/views/admin/AdminWorkflowExecutionView.vue
@@ -540,7 +540,9 @@ onMounted(() => {
               >
             </td>
             <td>
-              {{ dayjs.unix(execution.start_time).format("DD.MM.YYYY HH:mm") }}
+              {{
+                dayjs.unix(execution.start_time).format("MMM DD, YYYY HH:mm")
+              }}
             </td>
             <td>
               <template v-if="execution.end_time">
@@ -559,7 +561,9 @@ onMounted(() => {
             </td>
             <td>
               <template v-if="execution.end_time">
-                {{ dayjs.unix(execution.end_time).format("DD.MM.YYYY HH:mm") }}
+                {{
+                  dayjs.unix(execution.end_time).format("MMM DD, YYYY HH:mm")
+                }}
               </template>
               <template v-else> -</template>
             </td>
diff --git a/src/views/object-storage/BucketView.vue b/src/views/object-storage/BucketView.vue
index aa4f08f..468dc32 100644
--- a/src/views/object-storage/BucketView.vue
+++ b/src/views/object-storage/BucketView.vue
@@ -809,7 +809,7 @@ function clickBox() {
                 class="date-tooltip"
                 data-bs-toggle="tooltip"
                 :data-bs-title="
-                  dayjs(obj.LastModified).format('DD.MM.YYYY HH:mm:ss')
+                  dayjs(obj.LastModified).format('MMM DD, YYYY HH:mm:ss')
                 "
                 >{{ dayjs(obj.LastModified).fromNow() }}</span
               >
diff --git a/src/views/user/ListApiTokenView.vue b/src/views/user/ListApiTokenView.vue
index 87e69e2..2c59182 100644
--- a/src/views/user/ListApiTokenView.vue
+++ b/src/views/user/ListApiTokenView.vue
@@ -7,7 +7,7 @@ import type { ApiTokenPrivateOut } from "@/client/types.gen";
 import FontAwesomeIcon from "@/components/FontAwesomeIcon.vue";
 import CopyToClipboardIcon from "@/components/CopyToClipboardIcon.vue";
 import { environment } from "@/environment";
-import DeleteApiTokenModal from "@/components/modals/DeleteApiTokenModal.vue";
+import DeleteApiTokenModal from "@/components/user/DeleteApiTokenModal.vue";
 
 const userRepository = useUserStore();
 
@@ -25,7 +25,7 @@ const state = reactive<{
 
 function fetchTokens() {
   state.loading = true;
-  userRepository.fetchApiTokens(userRepository.currentUID, () => {
+  userRepository.fetchMyApiTokens(() => {
     state.loading = false;
   });
 }
@@ -170,7 +170,7 @@ onMounted(() => {
           {{ dayjs.unix(token.created_at).format("MMM DD, YYYY") }}
         </td>
         <td v-if="token.last_used">
-          {{ dayjs.unix(token.last_used).format("MMM DD, YYYY HH:mm") }}
+          {{ dayjs.unix(token.last_used).format("MMM DD, YYYY HH:mm:ss") }}
         </td>
         <td v-else>Never</td>
         <td v-if="token.expires_at">
diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue
index 2b07838..cec61e0 100644
--- a/src/views/user/ProfileView.vue
+++ b/src/views/user/ProfileView.vue
@@ -93,7 +93,11 @@ onMounted(() => {
         CloWM ID: {{ userRepository.currentUID }}<br />
         <span v-if="userRepository.user?.last_login"
           >Last Login:
-          {{ dayjs.unix(userRepository.user?.last_login).fromNow() }}</span
+          {{
+            dayjs
+              .unix(userRepository.user?.last_login)
+              .format("MMM DD, YYYY HH:mm")
+          }}</span
         >
       </div>
     </div>
diff --git a/src/views/workflows/ListWorkflowExecutionsView.vue b/src/views/workflows/ListWorkflowExecutionsView.vue
index 0c6d234..314f8dc 100644
--- a/src/views/workflows/ListWorkflowExecutionsView.vue
+++ b/src/views/workflows/ListWorkflowExecutionsView.vue
@@ -258,7 +258,9 @@ onUnmounted(() => {
               >
             </td>
             <td>
-              {{ dayjs.unix(execution.start_time).format("DD.MM.YYYY HH:mm") }}
+              {{
+                dayjs.unix(execution.start_time).format("MMM DD, YYYY HH:mm")
+              }}
             </td>
             <td>
               <template v-if="execution.end_time">
@@ -277,7 +279,9 @@ onUnmounted(() => {
             </td>
             <td>
               <template v-if="execution.end_time">
-                {{ dayjs.unix(execution.end_time).format("DD.MM.YYYY HH:mm") }}
+                {{
+                  dayjs.unix(execution.end_time).format("MMM DD, YYYY HH:mm")
+                }}
               </template>
               <template v-else> -</template>
             </td>
diff --git a/src/views/workflows/ReviewWorkflowsView.vue b/src/views/workflows/ReviewWorkflowsView.vue
index 7c8eb5c..c031ca2 100644
--- a/src/views/workflows/ReviewWorkflowsView.vue
+++ b/src/views/workflows/ReviewWorkflowsView.vue
@@ -124,7 +124,7 @@ onMounted(() => {
                       :data-bs-title="
                         dayjs
                           .unix(version?.created_at)
-                          .format('DD.MM.YYYY HH:mm:ss')
+                          .format('MMM DD, YYYY HH:mm:ss')
                       "
                       >{{ dayjs.unix(version.created_at).fromNow() }}</span
                     >
-- 
GitLab


From 3303522eb93bd161b9b87f847e4e7562a5079bf8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Tue, 25 Feb 2025 16:04:56 +0000
Subject: [PATCH 24/25] Edit welcome modal

#191
---
 package-lock.json                             | 392 +++++++++---------
 package.json                                  |   2 +-
 src/App.vue                                   |  63 ++-
 src/views/DashboardView.vue                   |  47 ++-
 src/views/SignupView.vue                      |   4 +-
 src/views/admin/AdminUsersView.vue            |  10 +
 src/views/user/ProfileView.vue                |   3 +-
 .../workflows/ListWorkflowExecutionsView.vue  |  12 +-
 8 files changed, 326 insertions(+), 207 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e8c29ec..0d0813f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -55,7 +55,7 @@
         "prettier": "~3.5.0",
         "sass": "^1.66.0",
         "typescript": "~5.7.0",
-        "vite": "~6.1.0",
+        "vite": "~6.2.0",
         "vite-plugin-node-polyfills": "^0.23.0",
         "vite-plugin-vue-devtools": "^7.7.0",
         "vue-tsc": "~2.2.0"
@@ -1539,9 +1539,9 @@
       }
     },
     "node_modules/@esbuild/aix-ppc64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz",
-      "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz",
+      "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==",
       "cpu": [
         "ppc64"
       ],
@@ -1556,9 +1556,9 @@
       }
     },
     "node_modules/@esbuild/android-arm": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz",
-      "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz",
+      "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==",
       "cpu": [
         "arm"
       ],
@@ -1573,9 +1573,9 @@
       }
     },
     "node_modules/@esbuild/android-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz",
-      "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz",
+      "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==",
       "cpu": [
         "arm64"
       ],
@@ -1590,9 +1590,9 @@
       }
     },
     "node_modules/@esbuild/android-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz",
-      "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz",
+      "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==",
       "cpu": [
         "x64"
       ],
@@ -1607,9 +1607,9 @@
       }
     },
     "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz",
-      "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz",
+      "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==",
       "cpu": [
         "arm64"
       ],
@@ -1624,9 +1624,9 @@
       }
     },
     "node_modules/@esbuild/darwin-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz",
-      "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz",
+      "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==",
       "cpu": [
         "x64"
       ],
@@ -1641,9 +1641,9 @@
       }
     },
     "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz",
-      "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz",
+      "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==",
       "cpu": [
         "arm64"
       ],
@@ -1658,9 +1658,9 @@
       }
     },
     "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz",
-      "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz",
+      "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==",
       "cpu": [
         "x64"
       ],
@@ -1675,9 +1675,9 @@
       }
     },
     "node_modules/@esbuild/linux-arm": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz",
-      "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz",
+      "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==",
       "cpu": [
         "arm"
       ],
@@ -1692,9 +1692,9 @@
       }
     },
     "node_modules/@esbuild/linux-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz",
-      "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz",
+      "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==",
       "cpu": [
         "arm64"
       ],
@@ -1709,9 +1709,9 @@
       }
     },
     "node_modules/@esbuild/linux-ia32": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz",
-      "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz",
+      "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==",
       "cpu": [
         "ia32"
       ],
@@ -1726,9 +1726,9 @@
       }
     },
     "node_modules/@esbuild/linux-loong64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz",
-      "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz",
+      "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==",
       "cpu": [
         "loong64"
       ],
@@ -1743,9 +1743,9 @@
       }
     },
     "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz",
-      "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz",
+      "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==",
       "cpu": [
         "mips64el"
       ],
@@ -1760,9 +1760,9 @@
       }
     },
     "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz",
-      "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz",
+      "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==",
       "cpu": [
         "ppc64"
       ],
@@ -1777,9 +1777,9 @@
       }
     },
     "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz",
-      "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz",
+      "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==",
       "cpu": [
         "riscv64"
       ],
@@ -1794,9 +1794,9 @@
       }
     },
     "node_modules/@esbuild/linux-s390x": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz",
-      "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz",
+      "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==",
       "cpu": [
         "s390x"
       ],
@@ -1811,9 +1811,9 @@
       }
     },
     "node_modules/@esbuild/linux-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz",
-      "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz",
+      "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==",
       "cpu": [
         "x64"
       ],
@@ -1828,9 +1828,9 @@
       }
     },
     "node_modules/@esbuild/netbsd-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz",
-      "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz",
+      "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==",
       "cpu": [
         "arm64"
       ],
@@ -1845,9 +1845,9 @@
       }
     },
     "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz",
-      "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz",
+      "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==",
       "cpu": [
         "x64"
       ],
@@ -1862,9 +1862,9 @@
       }
     },
     "node_modules/@esbuild/openbsd-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz",
-      "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz",
+      "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==",
       "cpu": [
         "arm64"
       ],
@@ -1879,9 +1879,9 @@
       }
     },
     "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz",
-      "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz",
+      "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==",
       "cpu": [
         "x64"
       ],
@@ -1896,9 +1896,9 @@
       }
     },
     "node_modules/@esbuild/sunos-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz",
-      "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz",
+      "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==",
       "cpu": [
         "x64"
       ],
@@ -1913,9 +1913,9 @@
       }
     },
     "node_modules/@esbuild/win32-arm64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz",
-      "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz",
+      "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==",
       "cpu": [
         "arm64"
       ],
@@ -1930,9 +1930,9 @@
       }
     },
     "node_modules/@esbuild/win32-ia32": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz",
-      "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz",
+      "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==",
       "cpu": [
         "ia32"
       ],
@@ -1947,9 +1947,9 @@
       }
     },
     "node_modules/@esbuild/win32-x64": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz",
-      "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz",
+      "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==",
       "cpu": [
         "x64"
       ],
@@ -3148,9 +3148,9 @@
       }
     },
     "node_modules/@smithy/core": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.4.tgz",
-      "integrity": "sha512-wFExFGK+7r2wYriOqe7RRIBNpvxwiS95ih09+GSLRBdoyK/O1uZA7K7pKesj5CBvwJuSBeXwLyR88WwIAY+DGA==",
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.5.tgz",
+      "integrity": "sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA==",
       "license": "Apache-2.0",
       "dependencies": {
         "@smithy/middleware-serde": "^4.0.2",
@@ -3158,7 +3158,7 @@
         "@smithy/types": "^4.1.0",
         "@smithy/util-body-length-browser": "^4.0.0",
         "@smithy/util-middleware": "^4.0.1",
-        "@smithy/util-stream": "^4.1.1",
+        "@smithy/util-stream": "^4.1.2",
         "@smithy/util-utf8": "^4.0.0",
         "tslib": "^2.6.2"
       },
@@ -3366,12 +3366,12 @@
       }
     },
     "node_modules/@smithy/middleware-endpoint": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.5.tgz",
-      "integrity": "sha512-cPzGZV7qStHwboFrm6GfrzQE+YDiCzWcTh4+7wKrP/ZQ4gkw+r7qDjV8GjM4N0UYsuUyLfpzLGg5hxsYTU11WA==",
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.6.tgz",
+      "integrity": "sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg==",
       "license": "Apache-2.0",
       "dependencies": {
-        "@smithy/core": "^3.1.4",
+        "@smithy/core": "^3.1.5",
         "@smithy/middleware-serde": "^4.0.2",
         "@smithy/node-config-provider": "^4.0.1",
         "@smithy/shared-ini-file-loader": "^4.0.1",
@@ -3385,15 +3385,15 @@
       }
     },
     "node_modules/@smithy/middleware-retry": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.6.tgz",
-      "integrity": "sha512-s8QzuOQnbdvRymD9Gt9c9zMq10wUQAHQ3z72uirrBHCwZcLTrL5iCOuVTMdka2IXOYhQE890WD5t6G24+F+Qcg==",
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.7.tgz",
+      "integrity": "sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ==",
       "license": "Apache-2.0",
       "dependencies": {
         "@smithy/node-config-provider": "^4.0.1",
         "@smithy/protocol-http": "^5.0.1",
         "@smithy/service-error-classification": "^4.0.1",
-        "@smithy/smithy-client": "^4.1.5",
+        "@smithy/smithy-client": "^4.1.6",
         "@smithy/types": "^4.1.0",
         "@smithy/util-middleware": "^4.0.1",
         "@smithy/util-retry": "^4.0.1",
@@ -3446,9 +3446,9 @@
       }
     },
     "node_modules/@smithy/node-http-handler": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.2.tgz",
-      "integrity": "sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.3.tgz",
+      "integrity": "sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA==",
       "license": "Apache-2.0",
       "dependencies": {
         "@smithy/abort-controller": "^4.0.1",
@@ -3559,17 +3559,17 @@
       }
     },
     "node_modules/@smithy/smithy-client": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.5.tgz",
-      "integrity": "sha512-DMXYoYeL4QkElr216n1yodTFeATbfb4jwYM9gKn71Rw/FNA1/Sm36tkTSCsZEs7mgpG3OINmkxL9vgVFzyGPaw==",
+      "version": "4.1.6",
+      "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.6.tgz",
+      "integrity": "sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw==",
       "license": "Apache-2.0",
       "dependencies": {
-        "@smithy/core": "^3.1.4",
-        "@smithy/middleware-endpoint": "^4.0.5",
+        "@smithy/core": "^3.1.5",
+        "@smithy/middleware-endpoint": "^4.0.6",
         "@smithy/middleware-stack": "^4.0.1",
         "@smithy/protocol-http": "^5.0.1",
         "@smithy/types": "^4.1.0",
-        "@smithy/util-stream": "^4.1.1",
+        "@smithy/util-stream": "^4.1.2",
         "tslib": "^2.6.2"
       },
       "engines": {
@@ -3666,13 +3666,13 @@
       }
     },
     "node_modules/@smithy/util-defaults-mode-browser": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.6.tgz",
-      "integrity": "sha512-N8+VCt+piupH1A7DgSVDNrVHqRLz8r6DvBkpS7EWHiIxsUk4jqGuQLjqC/gnCzmwGkVBdNruHoYAzzaSQ8e80w==",
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.7.tgz",
+      "integrity": "sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q==",
       "license": "Apache-2.0",
       "dependencies": {
         "@smithy/property-provider": "^4.0.1",
-        "@smithy/smithy-client": "^4.1.5",
+        "@smithy/smithy-client": "^4.1.6",
         "@smithy/types": "^4.1.0",
         "bowser": "^2.11.0",
         "tslib": "^2.6.2"
@@ -3682,16 +3682,16 @@
       }
     },
     "node_modules/@smithy/util-defaults-mode-node": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.6.tgz",
-      "integrity": "sha512-9zhx1shd1VwSSVvLZB8CM3qQ3RPD3le7A3h/UPuyh/PC7g4OaWDi2xUNzamsVoSmCGtmUBONl56lM2EU6LcH7A==",
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.7.tgz",
+      "integrity": "sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ==",
       "license": "Apache-2.0",
       "dependencies": {
         "@smithy/config-resolver": "^4.0.1",
         "@smithy/credential-provider-imds": "^4.0.1",
         "@smithy/node-config-provider": "^4.0.1",
         "@smithy/property-provider": "^4.0.1",
-        "@smithy/smithy-client": "^4.1.5",
+        "@smithy/smithy-client": "^4.1.6",
         "@smithy/types": "^4.1.0",
         "tslib": "^2.6.2"
       },
@@ -3753,13 +3753,13 @@
       }
     },
     "node_modules/@smithy/util-stream": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.1.1.tgz",
-      "integrity": "sha512-+Xvh8nhy0Wjv1y71rBVyV3eJU3356XsFQNI8dEZVNrQju7Eib8G31GWtO+zMa9kTCGd41Mflu+ZKfmQL/o2XzQ==",
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.1.2.tgz",
+      "integrity": "sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw==",
       "license": "Apache-2.0",
       "dependencies": {
         "@smithy/fetch-http-handler": "^5.0.1",
-        "@smithy/node-http-handler": "^4.0.2",
+        "@smithy/node-http-handler": "^4.0.3",
         "@smithy/types": "^4.1.0",
         "@smithy/util-base64": "^4.0.0",
         "@smithy/util-buffer-from": "^4.0.0",
@@ -3903,17 +3903,17 @@
       "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.24.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz",
-      "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==",
+      "version": "8.25.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.25.0.tgz",
+      "integrity": "sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.24.1",
-        "@typescript-eslint/type-utils": "8.24.1",
-        "@typescript-eslint/utils": "8.24.1",
-        "@typescript-eslint/visitor-keys": "8.24.1",
+        "@typescript-eslint/scope-manager": "8.25.0",
+        "@typescript-eslint/type-utils": "8.25.0",
+        "@typescript-eslint/utils": "8.25.0",
+        "@typescript-eslint/visitor-keys": "8.25.0",
         "graphemer": "^1.4.0",
         "ignore": "^5.3.1",
         "natural-compare": "^1.4.0",
@@ -3933,16 +3933,16 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.24.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz",
-      "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==",
+      "version": "8.25.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.25.0.tgz",
+      "integrity": "sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.24.1",
-        "@typescript-eslint/types": "8.24.1",
-        "@typescript-eslint/typescript-estree": "8.24.1",
-        "@typescript-eslint/visitor-keys": "8.24.1",
+        "@typescript-eslint/scope-manager": "8.25.0",
+        "@typescript-eslint/types": "8.25.0",
+        "@typescript-eslint/typescript-estree": "8.25.0",
+        "@typescript-eslint/visitor-keys": "8.25.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -3958,14 +3958,14 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.24.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz",
-      "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==",
+      "version": "8.25.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.25.0.tgz",
+      "integrity": "sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.24.1",
-        "@typescript-eslint/visitor-keys": "8.24.1"
+        "@typescript-eslint/types": "8.25.0",
+        "@typescript-eslint/visitor-keys": "8.25.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3976,14 +3976,14 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.24.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz",
-      "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==",
+      "version": "8.25.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.25.0.tgz",
+      "integrity": "sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.24.1",
-        "@typescript-eslint/utils": "8.24.1",
+        "@typescript-eslint/typescript-estree": "8.25.0",
+        "@typescript-eslint/utils": "8.25.0",
         "debug": "^4.3.4",
         "ts-api-utils": "^2.0.1"
       },
@@ -4000,9 +4000,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.24.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz",
-      "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==",
+      "version": "8.25.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.25.0.tgz",
+      "integrity": "sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -4014,14 +4014,14 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.24.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz",
-      "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==",
+      "version": "8.25.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.25.0.tgz",
+      "integrity": "sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.24.1",
-        "@typescript-eslint/visitor-keys": "8.24.1",
+        "@typescript-eslint/types": "8.25.0",
+        "@typescript-eslint/visitor-keys": "8.25.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
@@ -4041,16 +4041,16 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.24.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz",
-      "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==",
+      "version": "8.25.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.25.0.tgz",
+      "integrity": "sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "8.24.1",
-        "@typescript-eslint/types": "8.24.1",
-        "@typescript-eslint/typescript-estree": "8.24.1"
+        "@typescript-eslint/scope-manager": "8.25.0",
+        "@typescript-eslint/types": "8.25.0",
+        "@typescript-eslint/typescript-estree": "8.25.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4065,13 +4065,13 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.24.1",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz",
-      "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==",
+      "version": "8.25.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.25.0.tgz",
+      "integrity": "sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.24.1",
+        "@typescript-eslint/types": "8.25.0",
         "eslint-visitor-keys": "^4.2.0"
       },
       "engines": {
@@ -5573,9 +5573,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.5.103",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.103.tgz",
-      "integrity": "sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==",
+      "version": "1.5.104",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.104.tgz",
+      "integrity": "sha512-Us9M2L4cO/zMBqVkJtnj353nQhMju9slHm62NprKTmdF3HH8wYOtNvDFq/JB2+ZRoGLzdvYDiATlMHs98XBM1g==",
       "dev": true,
       "license": "ISC"
     },
@@ -5671,9 +5671,9 @@
       }
     },
     "node_modules/esbuild": {
-      "version": "0.24.2",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz",
-      "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==",
+      "version": "0.25.0",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz",
+      "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==",
       "dev": true,
       "hasInstallScript": true,
       "license": "MIT",
@@ -5684,31 +5684,31 @@
         "node": ">=18"
       },
       "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.24.2",
-        "@esbuild/android-arm": "0.24.2",
-        "@esbuild/android-arm64": "0.24.2",
-        "@esbuild/android-x64": "0.24.2",
-        "@esbuild/darwin-arm64": "0.24.2",
-        "@esbuild/darwin-x64": "0.24.2",
-        "@esbuild/freebsd-arm64": "0.24.2",
-        "@esbuild/freebsd-x64": "0.24.2",
-        "@esbuild/linux-arm": "0.24.2",
-        "@esbuild/linux-arm64": "0.24.2",
-        "@esbuild/linux-ia32": "0.24.2",
-        "@esbuild/linux-loong64": "0.24.2",
-        "@esbuild/linux-mips64el": "0.24.2",
-        "@esbuild/linux-ppc64": "0.24.2",
-        "@esbuild/linux-riscv64": "0.24.2",
-        "@esbuild/linux-s390x": "0.24.2",
-        "@esbuild/linux-x64": "0.24.2",
-        "@esbuild/netbsd-arm64": "0.24.2",
-        "@esbuild/netbsd-x64": "0.24.2",
-        "@esbuild/openbsd-arm64": "0.24.2",
-        "@esbuild/openbsd-x64": "0.24.2",
-        "@esbuild/sunos-x64": "0.24.2",
-        "@esbuild/win32-arm64": "0.24.2",
-        "@esbuild/win32-ia32": "0.24.2",
-        "@esbuild/win32-x64": "0.24.2"
+        "@esbuild/aix-ppc64": "0.25.0",
+        "@esbuild/android-arm": "0.25.0",
+        "@esbuild/android-arm64": "0.25.0",
+        "@esbuild/android-x64": "0.25.0",
+        "@esbuild/darwin-arm64": "0.25.0",
+        "@esbuild/darwin-x64": "0.25.0",
+        "@esbuild/freebsd-arm64": "0.25.0",
+        "@esbuild/freebsd-x64": "0.25.0",
+        "@esbuild/linux-arm": "0.25.0",
+        "@esbuild/linux-arm64": "0.25.0",
+        "@esbuild/linux-ia32": "0.25.0",
+        "@esbuild/linux-loong64": "0.25.0",
+        "@esbuild/linux-mips64el": "0.25.0",
+        "@esbuild/linux-ppc64": "0.25.0",
+        "@esbuild/linux-riscv64": "0.25.0",
+        "@esbuild/linux-s390x": "0.25.0",
+        "@esbuild/linux-x64": "0.25.0",
+        "@esbuild/netbsd-arm64": "0.25.0",
+        "@esbuild/netbsd-x64": "0.25.0",
+        "@esbuild/openbsd-arm64": "0.25.0",
+        "@esbuild/openbsd-x64": "0.25.0",
+        "@esbuild/sunos-x64": "0.25.0",
+        "@esbuild/win32-arm64": "0.25.0",
+        "@esbuild/win32-ia32": "0.25.0",
+        "@esbuild/win32-x64": "0.25.0"
       }
     },
     "node_modules/escalade": {
@@ -8462,9 +8462,9 @@
       }
     },
     "node_modules/sass": {
-      "version": "1.85.0",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz",
-      "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==",
+      "version": "1.85.1",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.1.tgz",
+      "integrity": "sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -8974,15 +8974,15 @@
       }
     },
     "node_modules/typescript-eslint": {
-      "version": "8.24.1",
-      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz",
-      "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==",
+      "version": "8.25.0",
+      "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.25.0.tgz",
+      "integrity": "sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/eslint-plugin": "8.24.1",
-        "@typescript-eslint/parser": "8.24.1",
-        "@typescript-eslint/utils": "8.24.1"
+        "@typescript-eslint/eslint-plugin": "8.25.0",
+        "@typescript-eslint/parser": "8.25.0",
+        "@typescript-eslint/utils": "8.25.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -9146,14 +9146,14 @@
       }
     },
     "node_modules/vite": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz",
-      "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==",
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz",
+      "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "esbuild": "^0.24.2",
-        "postcss": "^8.5.2",
+        "esbuild": "^0.25.0",
+        "postcss": "^8.5.3",
         "rollup": "^4.30.1"
       },
       "bin": {
diff --git a/package.json b/package.json
index 3c83d6a..21e9d7c 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
     "prettier": "~3.5.0",
     "sass": "^1.66.0",
     "typescript": "~5.7.0",
-    "vite": "~6.1.0",
+    "vite": "~6.2.0",
     "vite-plugin-node-polyfills": "^0.23.0",
     "vue-tsc": "~2.2.0",
     "vite-plugin-vue-devtools": "^7.7.0"
diff --git a/src/App.vue b/src/App.vue
index 5e39972..be09bc6 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -161,6 +161,7 @@ onBeforeMount(() => {
     otrRepository.fetchOwnOtrs(OwnershipTypeEnum.BUCKET);
     executionRepository.fetchExecutions();
     newsStore.fetchCurrentNews();
+    userRepository.fetchMyApiTokens();
     if (!userRepository.foreignUser) {
       bucketRepository.fetchOwnPermissions();
     }
@@ -182,6 +183,10 @@ onBeforeMount(() => {
   }
 });
 
+function navigateToPage(name: string) {
+  router.push({ name: name });
+}
+
 onMounted(() => {
   if (firstLogin.value && userRepository.authenticated) {
     Modal.getOrCreateInstance("#welcome-modal")?.show();
@@ -199,8 +204,62 @@ onMounted(() => {
       static-backdrop
       size-modifier-modal="xl"
     >
-      <template #header>Welcome to CloWM</template>
-      <template #body>This is your first time in CloWM</template>
+      <template #header
+        ><h3 class="mb-0">Welcome to CloWM - What to do next?</h3></template
+      >
+      <template #body>
+        <h4>
+          1.
+          <router-link
+            :to="{ name: 'profile' }"
+            data-bs-dismiss="modal"
+            @click.prevent="navigateToPage('profile')"
+            >My Profile
+          </router-link>
+        </h4>
+        <p>
+          You can connect your newly created CloWM account with another identity
+          provider.
+        </p>
+        <h4>
+          2.
+          <router-link
+            :to="{ name: 'buckets' }"
+            data-bs-dismiss="modal"
+            @click.prevent="navigateToPage('buckets')"
+            >Data Buckets
+          </router-link>
+        </h4>
+        <p>
+          Up- and download data to your personal data buckets. You can use our
+          <router-link
+            :to="{ name: 'buckets' }"
+            data-bs-dismiss="modal"
+            @click.prevent="navigateToPage('buckets')"
+            >bucket browser
+          </router-link>
+          or use your own tool with your personal
+          <router-link
+            :to="{ name: 's3_keys' }"
+            data-bs-dismiss="modal"
+            @click.prevent="navigateToPage('s3_keys')"
+            >S3 credentials.
+          </router-link>
+        </p>
+        <h4>
+          3.
+          <router-link
+            :to="{ name: 'workflows' }"
+            data-bs-dismiss="modal"
+            @click.prevent="navigateToPage('workflows')"
+            >Workflows
+          </router-link>
+        </h4>
+        <p>
+          Select one of the {{ workflowRepository.workflows.length }} workflows
+          and start an workflow execution
+        </p>
+      </template>
     </bootstrap-modal>
     <router-view />
   </div>
diff --git a/src/views/DashboardView.vue b/src/views/DashboardView.vue
index ece8e15..3247153 100644
--- a/src/views/DashboardView.vue
+++ b/src/views/DashboardView.vue
@@ -114,6 +114,13 @@ const pendingWorkflowReviews = computed<number>(() =>
   ),
 );
 
+const activeTokens = computed<number>(() => {
+  const time = dayjs().unix();
+  return authStore.apiTokens.filter((token) => {
+    return (token.expires_at ?? time + 1000) > time;
+  }).length;
+});
+
 function accumulateResourceStatus(
   resources: ResourceOut[],
   status: ResourceVersionStatus,
@@ -553,6 +560,40 @@ function accumulateWorkflowStatus(
           </bootstrap-card>
         </div>
       </template>
+      <h3>
+        <font-awesome-icon icon="fa-solid fa-user" class="me-2" />
+        Account Management
+      </h3>
+      <div class="d-flex flex-wrap align-items-center">
+        <bootstrap-card class="hover-shadow m-2 flex-fill">
+          <template #title>
+            <h5>
+              <router-link :to="{ name: 'profile' }">My Profile</router-link>
+            </h5>
+          </template>
+          <template #body>
+            View your profile and connect it with other login providers
+          </template>
+        </bootstrap-card>
+        <bootstrap-card class="hover-shadow m-2 flex-fill">
+          <template #title>
+            <h5>
+              <router-link :to="{ name: 'api-tokens' }"
+                >My personal API tokens
+              </router-link>
+            </h5>
+          </template>
+          <template #body>
+            {{ authStore.apiTokens.length }} access token
+            <ul>
+              <li>{{ activeTokens }} active tokens</li>
+              <li>
+                {{ authStore.apiTokens.length - activeTokens }} expired tokens
+              </li>
+            </ul>
+          </template>
+        </bootstrap-card>
+      </div>
       <template v-if="authStore.admin">
         <h3>
           <font-awesome-icon icon="fa-solid fa-user-gear" class="me-2" />
@@ -585,11 +626,11 @@ function accumulateWorkflowStatus(
             <template #title>
               <h5>
                 <router-link :to="{ name: 'admin-tokens' }"
-                  >API tokens</router-link
-                >
+                  >API tokens
+                </router-link>
               </h5>
             </template>
-            <template #body> Manage all API tokens on the platform </template>
+            <template #body> Manage all API tokens on the platform</template>
           </bootstrap-card>
           <bootstrap-card class="hover-shadow m-2 flex-fill w-fit">
             <template #title>
diff --git a/src/views/SignupView.vue b/src/views/SignupView.vue
index f57cc22..5fb0a8a 100644
--- a/src/views/SignupView.vue
+++ b/src/views/SignupView.vue
@@ -53,8 +53,8 @@ onBeforeUnmount(() => {
     The NFDI AAI maintains a list of
     <a href="https://doc.nfdi-aai.de/community-aai-software/"
       >connected Community AAIs</a
-    >. If you have an account at one of those AAIs, you can simply use the NFDI
-    AII
+    >. If you have an account at one of those identity providers, you can simply
+    use the NFDI AAI.
   </p>
   <h4>I already have such an account</h4>
   <p class="fs-6">
diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue
index 83e47dd..d6e2377 100644
--- a/src/views/admin/AdminUsersView.vue
+++ b/src/views/admin/AdminUsersView.vue
@@ -421,6 +421,16 @@ onBeforeMount(() => {
                     >View Workflow executions
                   </router-link>
                 </li>
+                <li>
+                  <router-link
+                    :to="{
+                      name: 'admin-tokens',
+                      query: { owner_id: user.uid },
+                    }"
+                    class="dropdown-item"
+                    >View API tokens
+                  </router-link>
+                </li>
                 <li
                   v-if="
                     user.roles.includes(RoleEnum.DB_MAINTAINER) ||
diff --git a/src/views/user/ProfileView.vue b/src/views/user/ProfileView.vue
index cec61e0..404de77 100644
--- a/src/views/user/ProfileView.vue
+++ b/src/views/user/ProfileView.vue
@@ -150,8 +150,7 @@ onMounted(() => {
           the National Research Data Infrastructure (NFDI).
         </p>
         <div v-if="userRepository.user?.nfdi_id">
-          <b>Linked account: </b
-          >{{ userRepository.user?.nfdi_id }}&#x200B;@lifescience.eu
+          <b>Linked account: </b>{{ userRepository.user?.nfdi_id }}
         </div>
         <div v-else>
           <div>Link your account with NFDI AAI</div>
diff --git a/src/views/workflows/ListWorkflowExecutionsView.vue b/src/views/workflows/ListWorkflowExecutionsView.vue
index 314f8dc..08b76aa 100644
--- a/src/views/workflows/ListWorkflowExecutionsView.vue
+++ b/src/views/workflows/ListWorkflowExecutionsView.vue
@@ -173,7 +173,17 @@ onUnmounted(() => {
         {{
           executionRepository.executions.length
         }}
-        Workflow Execution
+        workflow execution(s) worth
+        {{
+          executionRepository.executions
+            .reduce(
+              (acc, cur) => acc.add(dayjs.duration(cur.cpu_time)),
+              dayjs.duration(0, "day"),
+            )
+            .asHours()
+            .toFixed(2)
+        }}
+        CPU hours
       </caption>
       <thead>
         <tr>
-- 
GitLab


From e9ade5b9bde3a3933b9c493434c11485b87b2a7d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20G=C3=B6bel?= <dgoebel@techfak.uni-bielefeld.de>
Date: Wed, 26 Feb 2025 10:06:10 +0000
Subject: [PATCH 25/25] Edit welcome modal

#191
---
 src/App.vue                 | 17 ++++++++++++-----
 src/views/DashboardView.vue |  6 +++---
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/src/App.vue b/src/App.vue
index be09bc6..f6934c7 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -218,8 +218,9 @@ onMounted(() => {
           </router-link>
         </h4>
         <p>
-          You can connect your newly created CloWM account with another identity
-          provider.
+          View your profile. You can see your permissions in the system and ask
+          for additional ones if you need them. Also, you can connect your newly
+          created CloWM account with another identity provider.
         </p>
         <h4>
           2.
@@ -252,12 +253,18 @@ onMounted(() => {
             :to="{ name: 'workflows' }"
             data-bs-dismiss="modal"
             @click.prevent="navigateToPage('workflows')"
-            >Workflows
+            >Available Workflows
           </router-link>
         </h4>
         <p>
-          Select one of the {{ workflowRepository.workflows.length }} workflows
-          and start an workflow execution
+          Browse through our {{ workflowRepository.workflows.length }} available
+          workflows. You can select one and just try it out.
+        </p>
+        <p>
+          If you have any questions about CloWM, you can contact our support at
+          <a href="mailto:support@clowm.bi.denbi.de"
+            >support@clowm.bi.denbi.de</a
+          >.
         </p>
       </template>
     </bootstrap-modal>
diff --git a/src/views/DashboardView.vue b/src/views/DashboardView.vue
index 3247153..7c4cec0 100644
--- a/src/views/DashboardView.vue
+++ b/src/views/DashboardView.vue
@@ -584,11 +584,11 @@ function accumulateWorkflowStatus(
             </h5>
           </template>
           <template #body>
-            {{ authStore.apiTokens.length }} access token
+            {{ authStore.apiTokens.length }} access token(s)
             <ul>
-              <li>{{ activeTokens }} active tokens</li>
+              <li>{{ activeTokens }} active token(s)</li>
               <li>
-                {{ authStore.apiTokens.length - activeTokens }} expired tokens
+                {{ authStore.apiTokens.length - activeTokens }} expired token(s)
               </li>
             </ul>
           </template>
-- 
GitLab