From e299038e6688a89be6069c2b4121bd63a4635973 Mon Sep 17 00:00:00 2001
From: steel <mael.acier@ensiie.fr>
Date: Tue, 27 Aug 2024 23:32:53 +0200
Subject: [PATCH] use tada.gql

---
 .gitignore                               |    3 +-
 .graphqlrc.yaml                          |    9 -
 houdini.config.js                        |   27 -
 package.json                             |    8 +-
 pnpm-lock.yaml                           | 1566 +++++----------
 src/graphql-env.d.ts                     |  110 ++
 src/lib/data.ts                          |   46 +-
 src/lib/graphql/client.ts                |   15 +-
 src/lib/graphql/index.ts                 |   14 +
 src/lib/graphql/queries.ts               |   32 +
 src/lib/graphql/queries/promo.gql        |   15 -
 src/lib/graphql/queries/user_details.gql |   10 -
 src/lib/graphql/query.ts                 |   41 +-
 src/lib/graphql/schema.gql               | 2236 ++++++++++++----------
 src/routes/quiz/+page.server.ts          |   22 +-
 src/routes/quiz/+page.svelte             |    4 +-
 tsconfig.json                            |    8 +-
 vite.config.ts                           |    3 +-
 18 files changed, 1947 insertions(+), 2222 deletions(-)
 delete mode 100644 .graphqlrc.yaml
 delete mode 100644 houdini.config.js
 create mode 100644 src/graphql-env.d.ts
 create mode 100644 src/lib/graphql/index.ts
 create mode 100644 src/lib/graphql/queries.ts
 delete mode 100644 src/lib/graphql/queries/promo.gql
 delete mode 100644 src/lib/graphql/queries/user_details.gql

diff --git a/.gitignore b/.gitignore
index dee9b57..0ce4a29 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,5 +22,6 @@ vite.config.ts.timestamp-*
 
 static/*.jpg
 
-$houdini
+
+
 .vscode
diff --git a/.graphqlrc.yaml b/.graphqlrc.yaml
deleted file mode 100644
index 427c16f..0000000
--- a/.graphqlrc.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-projects:
-  default:
-    schema:
-      - ./src/lib/graphql/schema.gql
-      - ./$houdini/graphql/schema.graphql
-    documents:
-      - '**/*.gql'
-      - '**/*.svelte'
-      - ./$houdini/graphql/documents.gql
diff --git a/houdini.config.js b/houdini.config.js
deleted file mode 100644
index 29e2b4d..0000000
--- a/houdini.config.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/** @type {import('houdini').ConfigFile} */
-export default {
-	plugins: {
-		'houdini-svelte': {
-			client: './src/lib/graphql/client'
-		}
-	},
-	schemaPath: './src/lib/graphql/schema.gql',
-	watchSchema: {
-		url(env) {
-			return `${env.API_ORIGIN}/graphql/v0`;
-		},
-		headers: {
-			Authorization(env) {
-				return `Basic ${env.API_TOKEN}`;
-			}
-		}
-	},
-	scalars: {
-		Url: {
-			type: 'string'
-		},
-		Base64: {
-			type: 'string'
-		}
-	}
-};
diff --git a/package.json b/package.json
index e7b6444..c451485 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,8 @@
 		"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
 		"lint": "prettier --check . && eslint .",
 		"format": "prettier --write .",
-		"pull-schema": "houdini pull-schema"
+		"schema-env": "gql.tada generate-schema $API_ORIGIN/graphql/v0 --header \"Authorization: Basic $API_TOKEN\" -o src/lib/graphql/schema.gql",
+		"schema": "dotenv -- pnpm run schema-env"
 	},
 	"devDependencies": {
 		"@sveltejs/adapter-node": "^5.2.2",
@@ -25,12 +26,11 @@
 		"@sveltejs/vite-plugin-svelte": "^3.0.0",
 		"@types/eslint": "^9.6.0",
 		"autoprefixer": "^10.4.20",
+		"dotenv-cli": "^7.4.2",
 		"eslint": "^9.0.0",
 		"eslint-config-prettier": "^9.1.0",
 		"eslint-plugin-svelte": "^2.36.0",
 		"globals": "^15.0.0",
-		"houdini": "^1.2.56",
-		"houdini-svelte": "^1.2.56",
 		"prettier": "^3.1.1",
 		"prettier-plugin-svelte": "^3.1.2",
 		"prettier-plugin-tailwindcss": "^0.6.5",
@@ -42,7 +42,9 @@
 		"vite": "^5.0.3"
 	},
 	"dependencies": {
+		"@urql/core": "^5.0.6",
 		"formsnap": "^1.0.1",
+		"gql.tada": "^1.8.6",
 		"msgpackr": "^1.11.0",
 		"sveltekit-superforms": "^2.17.0",
 		"zod": "^3.23.8"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 16714e4..3fd4d27 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,9 +8,15 @@ importers:
 
   .:
     dependencies:
+      '@urql/core':
+        specifier: ^5.0.6
+        version: 5.0.6(graphql@15.9.0)
       formsnap:
         specifier: ^1.0.1
         version: 1.0.1(svelte@4.2.18)(sveltekit-superforms@2.17.0(@sveltejs/kit@2.5.24(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0)))(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0)))(svelte@4.2.18))
+      gql.tada:
+        specifier: ^1.8.6
+        version: 1.8.6(graphql@15.9.0)(typescript@5.5.4)
       msgpackr:
         specifier: ^1.11.0
         version: 1.11.0
@@ -36,6 +42,9 @@ importers:
       autoprefixer:
         specifier: ^10.4.20
         version: 10.4.20(postcss@8.4.41)
+      dotenv-cli:
+        specifier: ^7.4.2
+        version: 7.4.2
       eslint:
         specifier: ^9.0.0
         version: 9.9.0(jiti@1.21.6)
@@ -44,16 +53,10 @@ importers:
         version: 9.1.0(eslint@9.9.0(jiti@1.21.6))
       eslint-plugin-svelte:
         specifier: ^2.36.0
-        version: 2.43.0(eslint@9.9.0(jiti@1.21.6))(svelte@4.2.18)
+        version: 2.43.0(eslint@9.9.0(jiti@1.21.6))(svelte@4.2.18)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4))
       globals:
         specifier: ^15.0.0
         version: 15.9.0
-      houdini:
-        specifier: ^1.2.56
-        version: 1.2.56
-      houdini-svelte:
-        specifier: ^1.2.56
-        version: 1.2.56(@types/node@22.5.0)
       prettier:
         specifier: ^3.1.1
         version: 3.3.3
@@ -68,10 +71,10 @@ importers:
         version: 4.2.18
       svelte-check:
         specifier: ^3.6.0
-        version: 3.8.5(postcss-load-config@4.0.2(postcss@8.4.41))(postcss@8.4.41)(svelte@4.2.18)
+        version: 3.8.5(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)))(postcss@8.4.41)(svelte@4.2.18)
       tailwindcss:
         specifier: ^3.4.9
-        version: 3.4.10
+        version: 3.4.10(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4))
       typescript:
         specifier: ^5.0.0
         version: 5.5.4
@@ -84,6 +87,20 @@ importers:
 
 packages:
 
+  '@0no-co/graphql.web@1.0.8':
+    resolution: {integrity: sha512-8BG6woLtDMvXB9Ajb/uE+Zr/U7y4qJ3upXi0JQHZmsKUJa7HjF/gFvmL2f3/mSmfZoQGRr9VoY97LCX2uaFMzA==}
+    peerDependencies:
+      graphql: ^14.0.0 || ^15.0.0 || ^16.0.0
+    peerDependenciesMeta:
+      graphql:
+        optional: true
+
+  '@0no-co/graphqlsp@1.12.13':
+    resolution: {integrity: sha512-/C9yXft+mq+VdoniBgWvA+iK5X6cB50KKThg1je4bFIhhBNccLJlNbWFxOglXseKuisq+h5oIY4ELTVKs6GhRQ==}
+    peerDependencies:
+      graphql: ^15.5.0 || ^16.0.0 || ^17.0.0
+      typescript: ^5.0.0
+
   '@alloc/quick-lru@5.2.0':
     resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
     engines: {node: '>=10'}
@@ -98,6 +115,40 @@ packages:
   '@ark/util@0.1.0':
     resolution: {integrity: sha512-qCLYICQoCy3kEKDVwirQp8qvxhY7NJd8BhhoHaj1l3wCFAk9NUbcDsxAkPStZEMdPI/d7NcbGJe8SWZuRG2twQ==}
 
+  '@babel/code-frame@7.24.7':
+    resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/compat-data@7.25.4':
+    resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/core@7.25.2':
+    resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/generator@7.25.5':
+    resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-compilation-targets@7.25.2':
+    resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-module-imports@7.24.7':
+    resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-module-transforms@7.25.2':
+    resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-simple-access@7.24.7':
+    resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/helper-string-parser@7.24.8':
     resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
     engines: {node: '>=6.9.0'}
@@ -106,6 +157,18 @@ packages:
     resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/helper-validator-option@7.24.8':
+    resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helpers@7.25.0':
+    resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/highlight@7.24.7':
+    resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/parser@7.25.4':
     resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==}
     engines: {node: '>=6.0.0'}
@@ -115,25 +178,21 @@ packages:
     resolution: {integrity: sha512-DSgLeL/FNcpXuzav5wfYvHCGvynXkJbn3Zvc3823AEe9nPwW9IK4UoCSS5yGymmQzN0pCPvivtgS6/8U2kkm1w==}
     engines: {node: '>=6.9.0'}
 
-  '@babel/types@7.25.4':
-    resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==}
+  '@babel/template@7.25.0':
+    resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==}
     engines: {node: '>=6.9.0'}
 
-  '@clack/core@0.3.4':
-    resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==}
-
-  '@clack/prompts@0.6.3':
-    resolution: {integrity: sha512-AM+kFmAHawpUQv2q9+mcB6jLKxXGjgu/r2EQjEwujgpCdzrST6BJqYw00GRn56/L/Izw5U7ImoLmy00X/r80Pw==}
-    bundledDependencies:
-      - is-unicode-supported
+  '@babel/traverse@7.25.4':
+    resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==}
+    engines: {node: '>=6.9.0'}
 
-  '@envelop/core@4.0.3':
-    resolution: {integrity: sha512-O0Vz8E0TObT6ijAob8jYFVJavcGywKThM3UAsxUIBBVPYZTMiqI9lo2gmAnbMUnrDcAYkUTZEW9FDYPRdF5l6g==}
-    engines: {node: '>=16.0.0'}
+  '@babel/types@7.25.4':
+    resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==}
+    engines: {node: '>=6.9.0'}
 
-  '@envelop/types@4.0.1':
-    resolution: {integrity: sha512-ULo27/doEsP7uUhm2iTnElx13qTO6I5FKvmLoX41cpfuw8x6e0NUFknoqhEsLzAbgz8xVS5mjwcxGCXh4lDYzg==}
-    engines: {node: '>=16.0.0'}
+  '@cspotcode/source-map-support@0.8.1':
+    resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+    engines: {node: '>=12'}
 
   '@esbuild/aix-ppc64@0.21.5':
     resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
@@ -141,264 +200,132 @@ packages:
     cpu: [ppc64]
     os: [aix]
 
-  '@esbuild/android-arm64@0.18.20':
-    resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-
   '@esbuild/android-arm64@0.21.5':
     resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [android]
 
-  '@esbuild/android-arm@0.18.20':
-    resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [android]
-
   '@esbuild/android-arm@0.21.5':
     resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
     engines: {node: '>=12'}
     cpu: [arm]
     os: [android]
 
-  '@esbuild/android-x64@0.18.20':
-    resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-
   '@esbuild/android-x64@0.21.5':
     resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [android]
 
-  '@esbuild/darwin-arm64@0.18.20':
-    resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-
   '@esbuild/darwin-arm64@0.21.5':
     resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [darwin]
 
-  '@esbuild/darwin-x64@0.18.20':
-    resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-
   '@esbuild/darwin-x64@0.21.5':
     resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [darwin]
 
-  '@esbuild/freebsd-arm64@0.18.20':
-    resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-
   '@esbuild/freebsd-arm64@0.21.5':
     resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [freebsd]
 
-  '@esbuild/freebsd-x64@0.18.20':
-    resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-
   '@esbuild/freebsd-x64@0.21.5':
     resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [freebsd]
 
-  '@esbuild/linux-arm64@0.18.20':
-    resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-
   '@esbuild/linux-arm64@0.21.5':
     resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [linux]
 
-  '@esbuild/linux-arm@0.18.20':
-    resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-
   '@esbuild/linux-arm@0.21.5':
     resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
     engines: {node: '>=12'}
     cpu: [arm]
     os: [linux]
 
-  '@esbuild/linux-ia32@0.18.20':
-    resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-
   '@esbuild/linux-ia32@0.21.5':
     resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
     engines: {node: '>=12'}
     cpu: [ia32]
     os: [linux]
 
-  '@esbuild/linux-loong64@0.18.20':
-    resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==}
-    engines: {node: '>=12'}
-    cpu: [loong64]
-    os: [linux]
-
   '@esbuild/linux-loong64@0.21.5':
     resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
     engines: {node: '>=12'}
     cpu: [loong64]
     os: [linux]
 
-  '@esbuild/linux-mips64el@0.18.20':
-    resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==}
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-
   '@esbuild/linux-mips64el@0.21.5':
     resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
     engines: {node: '>=12'}
     cpu: [mips64el]
     os: [linux]
 
-  '@esbuild/linux-ppc64@0.18.20':
-    resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-
   '@esbuild/linux-ppc64@0.21.5':
     resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
     engines: {node: '>=12'}
     cpu: [ppc64]
     os: [linux]
 
-  '@esbuild/linux-riscv64@0.18.20':
-    resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==}
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-
   '@esbuild/linux-riscv64@0.21.5':
     resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
     engines: {node: '>=12'}
     cpu: [riscv64]
     os: [linux]
 
-  '@esbuild/linux-s390x@0.18.20':
-    resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==}
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-
   '@esbuild/linux-s390x@0.21.5':
     resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
     engines: {node: '>=12'}
     cpu: [s390x]
     os: [linux]
 
-  '@esbuild/linux-x64@0.18.20':
-    resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-
   '@esbuild/linux-x64@0.21.5':
     resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [linux]
 
-  '@esbuild/netbsd-x64@0.18.20':
-    resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-
   '@esbuild/netbsd-x64@0.21.5':
     resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [netbsd]
 
-  '@esbuild/openbsd-x64@0.18.20':
-    resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-
   '@esbuild/openbsd-x64@0.21.5':
     resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [openbsd]
 
-  '@esbuild/sunos-x64@0.18.20':
-    resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-
   '@esbuild/sunos-x64@0.21.5':
     resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
     engines: {node: '>=12'}
     cpu: [x64]
     os: [sunos]
 
-  '@esbuild/win32-arm64@0.18.20':
-    resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-
   '@esbuild/win32-arm64@0.21.5':
     resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
     engines: {node: '>=12'}
     cpu: [arm64]
     os: [win32]
 
-  '@esbuild/win32-ia32@0.18.20':
-    resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-
   '@esbuild/win32-ia32@0.21.5':
     resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
     engines: {node: '>=12'}
     cpu: [ia32]
     os: [win32]
 
-  '@esbuild/win32-x64@0.18.20':
-    resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-
   '@esbuild/win32-x64@0.21.5':
     resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
     engines: {node: '>=12'}
@@ -434,69 +361,29 @@ packages:
   '@exodus/schemasafe@1.3.0':
     resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==}
 
-  '@fastify/busboy@2.1.1':
-    resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==}
-    engines: {node: '>=14'}
-
   '@gcornut/valibot-json-schema@0.31.0':
     resolution: {integrity: sha512-3xGptCurm23e7nuPQkdrE5rEs1FeTPHhAUsBuwwqG4/YeZLwJOoYZv+fmsppUEfo5y9lzUwNQrNqLS/q7HMc7g==}
     hasBin: true
 
-  '@graphql-tools/executor@1.3.1':
-    resolution: {integrity: sha512-tgJDdGf9SCAm64ofEMZdv925u6/J+eTmv36TGNLxgP2DpCJsZ6gnJ4A+0D28EazDXqJIvMiPd+3d+o3cCRCAnQ==}
-    engines: {node: '>=16.0.0'}
-    peerDependencies:
-      graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
-
-  '@graphql-tools/merge@8.4.2':
-    resolution: {integrity: sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==}
-    peerDependencies:
-      graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
-
-  '@graphql-tools/merge@9.0.6':
-    resolution: {integrity: sha512-TmkzFTFVieHnqu9mPTF6RxAQltaprpDQnM5HMTPSyMLXnJGMTvdWejV0yORKj7DW1YSi791/sUnKf8HytepBFQ==}
-    engines: {node: '>=16.0.0'}
-    peerDependencies:
-      graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
-
-  '@graphql-tools/schema@10.0.6':
-    resolution: {integrity: sha512-EIJgPRGzpvDFEjVp+RF1zNNYIC36BYuIeZ514jFoJnI6IdxyVyIRDLx/ykgMdaa1pKQerpfdqDnsF4JnZoDHSQ==}
-    engines: {node: '>=16.0.0'}
-    peerDependencies:
-      graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
-
-  '@graphql-tools/schema@9.0.19':
-    resolution: {integrity: sha512-oBRPoNBtCkk0zbUsyP4GaIzCt8C0aCI4ycIRUL67KK5pOHljKLBBtGT+Jr6hkzA74C8Gco8bpZPe7aWFjiaK2w==}
+  '@gql.tada/cli-utils@1.6.1':
+    resolution: {integrity: sha512-ZfYa5+rbK51c6ociTUL66qW1lyB9dXoAKNZMEAp2pWgPp16qZVBwopUaYxSKq4BML9eSiv0ocoJ7H6VW51ud7w==}
     peerDependencies:
-      graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
-
-  '@graphql-tools/utils@10.5.4':
-    resolution: {integrity: sha512-XHnyCWSlg1ccsD8s0y6ugo5GZ5TpkTiFVNPSYms5G0s6Z/xTuSmiLBfeqgkfaCwLmLaQnRCmNDL2JRnqc2R5bQ==}
-    engines: {node: '>=16.0.0'}
-    peerDependencies:
-      graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
-
-  '@graphql-tools/utils@9.2.1':
-    resolution: {integrity: sha512-WUw506Ql6xzmOORlriNrD6Ugx+HjVgYxt9KCXD9mHAak+eaXSwuGGPyE60hy9xaDEoXKBsG7SkG69ybitaVl6A==}
-    peerDependencies:
-      graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
+      '@0no-co/graphqlsp': ^1.12.13
+      '@gql.tada/svelte-support': 1.0.1
+      '@gql.tada/vue-support': 1.0.1
+      graphql: ^15.5.0 || ^16.0.0 || ^17.0.0
+      typescript: ^5.0.0
+    peerDependenciesMeta:
+      '@gql.tada/svelte-support':
+        optional: true
+      '@gql.tada/vue-support':
+        optional: true
 
-  '@graphql-typed-document-node/core@3.2.0':
-    resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==}
+  '@gql.tada/internal@1.0.7':
+    resolution: {integrity: sha512-mI/7l7If7YR4rBlgnkXihh1qxD7eO41o8nf5ZYjwYl4s6FGFQFZY1E1reV3AgRy8tDXbiuMz1bIVLpnxPXxKIQ==}
     peerDependencies:
-      graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
-
-  '@graphql-yoga/logger@1.0.0':
-    resolution: {integrity: sha512-JYoxwnPggH2BfO+dWlWZkDeFhyFZqaTRGLvFhy+Pjp2UxitEW6nDrw+pEDw/K9tJwMjIFMmTT9VfTqrnESmBHg==}
-    engines: {node: '>=16.0.0'}
-
-  '@graphql-yoga/subscription@4.0.0':
-    resolution: {integrity: sha512-0qsN/BPPZNMoC2CZ8i+P6PgiJyHh1H35aKDt37qARBDaIOKDQuvEOq7+4txUKElcmXi7DYFo109FkhSQoEajrg==}
-    engines: {node: '>=16.0.0'}
-
-  '@graphql-yoga/typed-event-target@2.0.0':
-    resolution: {integrity: sha512-oA/VGxGmaSDym1glOHrltw43qZsFwLLjBwvh57B79UKX/vo3+UQcRgOyE44c5RP7DCYjkrC2tuArZmb6jCzysw==}
-    engines: {node: '>=16.0.0'}
+      graphql: ^15.5.0 || ^16.0.0 || ^17.0.0
+      typescript: ^5.0.0
 
   '@hapi/hoek@9.3.0':
     resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
@@ -534,12 +421,8 @@ packages:
   '@jridgewell/trace-mapping@0.3.25':
     resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
 
-  '@kamilkisiela/fast-url-parser@1.1.4':
-    resolution: {integrity: sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==}
-
-  '@kitql/helpers@0.8.9':
-    resolution: {integrity: sha512-uDBFBvCYUT4UaZZKv7gJejQvbrOp4YyI1S0Z92DPiMbyLq0DPDXz3Lt2ZqUZKlQrinBX+W1TO6w0RudEX6Q6WA==}
-    engines: {node: ^16.14 || >=18}
+  '@jridgewell/trace-mapping@0.3.9':
+    resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
 
   '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3':
     resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==}
@@ -594,9 +477,6 @@ packages:
     resolution: {integrity: sha512-xhhEcEvhQC8mP5oOr5hbE4CmUgmw/IPV1jhpGg2xSkzoFrt9i8YVqBQt9744EFesi5F7pBheWozg63RUBM/5JA==}
     engines: {node: '>=18.16.0'}
 
-  '@repeaterjs/repeater@3.0.6':
-    resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==}
-
   '@rollup/plugin-commonjs@26.0.1':
     resolution: {integrity: sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==}
     engines: {node: '>=16.0.0 || 14 >= 14.17'}
@@ -733,14 +613,6 @@ packages:
     peerDependencies:
       '@sveltejs/kit': ^2.4.0
 
-  '@sveltejs/kit@1.30.4':
-    resolution: {integrity: sha512-JSQIQT6XvdchCRQEm7BABxPC56WP5RYVONAi+09S8tmzeP43fBsRlr95bFmsTQM2RHBldfgQk+jgdnsKI75daA==}
-    engines: {node: ^16.14 || >=18}
-    hasBin: true
-    peerDependencies:
-      svelte: ^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0
-      vite: ^4.0.0
-
   '@sveltejs/kit@2.5.24':
     resolution: {integrity: sha512-Nr2oxsCsDfEkdS/zzQQQbsPYTbu692Qs3/iE3L7VHzCVjG2+WujF9oMUozWI7GuX98KxYSoPMlAsfmDLSg44hQ==}
     engines: {node: '>=18.13'}
@@ -750,14 +622,6 @@ packages:
       svelte: ^4.0.0 || ^5.0.0-next.0
       vite: ^5.0.3
 
-  '@sveltejs/vite-plugin-svelte-inspector@1.0.4':
-    resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==}
-    engines: {node: ^14.18.0 || >= 16}
-    peerDependencies:
-      '@sveltejs/vite-plugin-svelte': ^2.2.0
-      svelte: ^3.54.0 || ^4.0.0
-      vite: ^4.0.0
-
   '@sveltejs/vite-plugin-svelte-inspector@2.1.0':
     resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==}
     engines: {node: ^18.0.0 || >=20}
@@ -766,13 +630,6 @@ packages:
       svelte: ^4.0.0 || ^5.0.0-next.0
       vite: ^5.0.0
 
-  '@sveltejs/vite-plugin-svelte@2.5.3':
-    resolution: {integrity: sha512-erhNtXxE5/6xGZz/M9eXsmI7Pxa6MS7jyTy06zN3Ck++ldrppOnOlJwHHTsMC7DHDQdgUp4NAc4cDNQ9eGdB/w==}
-    engines: {node: ^14.18.0 || >= 16}
-    peerDependencies:
-      svelte: ^3.54.0 || ^4.0.0 || ^5.0.0-next.0
-      vite: ^4.0.0
-
   '@sveltejs/vite-plugin-svelte@3.1.1':
     resolution: {integrity: sha512-rimpFEAboBBHIlzISibg94iP09k/KYdHgVhJlcsTfn7KMBhc70jFX/GRWkRdFCc2fdnk+4+Bdfej23cMDnJS6A==}
     engines: {node: ^18.0.0 || >=20}
@@ -780,11 +637,17 @@ packages:
       svelte: ^4.0.0 || ^5.0.0-next.0
       vite: ^5.0.0
 
-  '@types/braces@3.0.4':
-    resolution: {integrity: sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA==}
+  '@tsconfig/node10@1.0.11':
+    resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
 
-  '@types/cookie@0.5.4':
-    resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==}
+  '@tsconfig/node12@1.0.11':
+    resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+
+  '@tsconfig/node14@1.0.3':
+    resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+
+  '@tsconfig/node16@1.0.4':
+    resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
 
   '@types/cookie@0.6.0':
     resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
@@ -795,15 +658,9 @@ packages:
   '@types/estree@1.0.5':
     resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
 
-  '@types/fs-extra@9.0.13':
-    resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==}
-
   '@types/json-schema@7.0.15':
     resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
 
-  '@types/micromatch@4.0.9':
-    resolution: {integrity: sha512-7V+8ncr22h4UoYRLnLXSpTxjQrNUXtWHGeMPRJt1nULXI57G9bIcpyrHlmrQ7QK24EyyuXvYcSSWAM8GA9nqCg==}
-
   '@types/node@22.5.0':
     resolution: {integrity: sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==}
 
@@ -873,8 +730,8 @@ packages:
     resolution: {integrity: sha512-sbgsPMW9yLvS7IhCi8IpuK1oBmtbWUNP+hBdwl/I9nzqVsszGnNGti5r9dUtF5RLivHUFFIdRvLiTsPhzSyJ3Q==}
     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 
-  '@ungap/structured-clone@1.2.0':
-    resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+  '@urql/core@5.0.6':
+    resolution: {integrity: sha512-38rgSDqVNihFDauw1Pm9V7XLWIKuK8V9CKgrUF7/xEKinze8ENKP1ZeBhkG+dxWzJan7CHK+SLl46kAdvZwIlA==}
 
   '@vinejs/compiler@2.5.0':
     resolution: {integrity: sha512-hg4ekaB5Y2zh+IWzBiC/WCDWrIfpVnKu/ubUvelKlidc/VbulsexoFRw5kJGHZenPVI5YzNnDeTdYSALkTV7jQ==}
@@ -884,27 +741,15 @@ packages:
     resolution: {integrity: sha512-Qq3XxbA26jzqS9ICifkqzT399lMQZ2fWtqeV3luI2as+UIK7qDifJFU2Q4W3q3IB5VXoWxgwAZSZEO0em9I/qQ==}
     engines: {node: '>=18.16.0'}
 
-  '@whatwg-node/events@0.1.2':
-    resolution: {integrity: sha512-ApcWxkrs1WmEMS2CaLLFUEem/49erT3sxIVjpzU5f6zmVcnijtDSrhoK2zVobOIikZJdH63jdAXOrvjf6eOUNQ==}
-    engines: {node: '>=18.0.0'}
-
-  '@whatwg-node/fetch@0.9.21':
-    resolution: {integrity: sha512-Wt0jPb+04JjobK0pAAN7mEHxVHcGA9HoP3OyCsZtyAecNQeADXCZ1MihFwVwjsgaRYuGVmNlsCmLxlG6mor8Gw==}
-    engines: {node: '>=18.0.0'}
-
-  '@whatwg-node/node-fetch@0.5.25':
-    resolution: {integrity: sha512-m6TrxcJlS8ptYLTQL+Ex931RFJsoCQtBQWBNHi5b0xHS0C7FJGUJl1asYZ7MdOhZqdiMVcs1lNJeHsfzyUNjOg==}
-    engines: {node: '>=18.0.0'}
-
-  '@whatwg-node/server@0.9.49':
-    resolution: {integrity: sha512-3KzLXw80gWnTsQ746G/LFdCThTPfDodjQs4PnmoNuPa6XUOl4HWq8TlJpxtmnEEB+y+UYLal+3VQ68dtYlbUDQ==}
-    engines: {node: '>=18.0.0'}
-
   acorn-jsx@5.3.2:
     resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
     peerDependencies:
       acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
 
+  acorn-walk@8.3.3:
+    resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==}
+    engines: {node: '>=0.4.0'}
+
   acorn@8.12.1:
     resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
     engines: {node: '>=0.4.0'}
@@ -921,6 +766,10 @@ packages:
     resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
     engines: {node: '>=12'}
 
+  ansi-styles@3.2.1:
+    resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+    engines: {node: '>=4'}
+
   ansi-styles@4.3.0:
     resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
     engines: {node: '>=8'}
@@ -936,6 +785,9 @@ packages:
     resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
     engines: {node: '>= 8'}
 
+  arg@4.1.3:
+    resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+
   arg@5.0.2:
     resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
 
@@ -952,10 +804,6 @@ packages:
     resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
     engines: {node: '>=8'}
 
-  ast-types@0.16.1:
-    resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==}
-    engines: {node: '>=4'}
-
   autoprefixer@10.4.20:
     resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
     engines: {node: ^10 || ^12 || >=14}
@@ -1000,13 +848,6 @@ packages:
     resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
     engines: {node: '>=6'}
 
-  builtins@5.1.0:
-    resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==}
-
-  busboy@1.6.0:
-    resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
-    engines: {node: '>=10.16.0'}
-
   callsites@3.1.0:
     resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
     engines: {node: '>=6'}
@@ -1022,6 +863,10 @@ packages:
   caniuse-lite@1.0.30001651:
     resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==}
 
+  chalk@2.4.2:
+    resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+    engines: {node: '>=4'}
+
   chalk@4.1.2:
     resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
     engines: {node: '>=10'}
@@ -1033,10 +878,16 @@ packages:
   code-red@1.0.4:
     resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==}
 
+  color-convert@1.9.3:
+    resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+
   color-convert@2.0.1:
     resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
     engines: {node: '>=7.0.0'}
 
+  color-name@1.1.3:
+    resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
   color-name@1.1.4:
     resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
 
@@ -1044,27 +895,21 @@ packages:
     resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
     engines: {node: '>= 6'}
 
-  commander@9.5.0:
-    resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==}
-    engines: {node: ^12.20.0 || >=14}
-
   commondir@1.0.1:
     resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
 
   concat-map@0.0.1:
     resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
 
-  cookie@0.5.0:
-    resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
-    engines: {node: '>= 0.6'}
+  convert-source-map@2.0.0:
+    resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
 
   cookie@0.6.0:
     resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
     engines: {node: '>= 0.6'}
 
-  cross-inspect@1.0.1:
-    resolution: {integrity: sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==}
-    engines: {node: '>=16.0.0'}
+  create-require@1.1.1:
+    resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
 
   cross-spawn@7.0.3:
     resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
@@ -1079,10 +924,6 @@ packages:
     engines: {node: '>=4'}
     hasBin: true
 
-  data-uri-to-buffer@4.0.1:
-    resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
-    engines: {node: '>= 12'}
-
   dayjs@1.11.13:
     resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
 
@@ -1114,15 +955,16 @@ packages:
     resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
     engines: {node: '>=8'}
 
-  devalue@4.3.3:
-    resolution: {integrity: sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg==}
-
   devalue@5.0.0:
     resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==}
 
   didyoumean@1.2.2:
     resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
 
+  diff@4.0.2:
+    resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+    engines: {node: '>=0.3.1'}
+
   dir-glob@3.0.1:
     resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
     engines: {node: '>=8'}
@@ -1130,9 +972,17 @@ packages:
   dlv@1.1.3:
     resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
 
-  dset@3.1.3:
-    resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==}
-    engines: {node: '>=4'}
+  dotenv-cli@7.4.2:
+    resolution: {integrity: sha512-SbUj8l61zIbzyhIbg0FwPJq6+wjbzdn9oEtozQpZ6kW2ihCcapKVZj49oCT3oPM+mgQm+itgvUQcG5szxVrZTA==}
+    hasBin: true
+
+  dotenv-expand@10.0.0:
+    resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==}
+    engines: {node: '>=12'}
+
+  dotenv@16.4.5:
+    resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==}
+    engines: {node: '>=12'}
 
   eastasianwidth@0.2.0:
     resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
@@ -1155,11 +1005,6 @@ packages:
     peerDependencies:
       esbuild: '*'
 
-  esbuild@0.18.20:
-    resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==}
-    engines: {node: '>=12'}
-    hasBin: true
-
   esbuild@0.21.5:
     resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
     engines: {node: '>=12'}
@@ -1169,6 +1014,10 @@ packages:
     resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
     engines: {node: '>=6'}
 
+  escape-string-regexp@1.0.5:
+    resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+    engines: {node: '>=0.8.0'}
+
   escape-string-regexp@4.0.0:
     resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
     engines: {node: '>=10'}
@@ -1232,11 +1081,6 @@ packages:
     resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
 
-  esprima@4.0.1:
-    resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
-    engines: {node: '>=4'}
-    hasBin: true
-
   esquery@1.6.0:
     resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
     engines: {node: '>=0.10'}
@@ -1259,13 +1103,6 @@ packages:
     resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
     engines: {node: '>=0.10.0'}
 
-  execa@6.1.0:
-    resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==}
-    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
-  fast-decode-uri-component@1.0.1:
-    resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==}
-
   fast-deep-equal@3.1.3:
     resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
 
@@ -1279,16 +1116,9 @@ packages:
   fast-levenshtein@2.0.6:
     resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
 
-  fast-querystring@1.1.2:
-    resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==}
-
   fastq@1.17.1:
     resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
 
-  fetch-blob@3.2.0:
-    resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
-    engines: {node: ^12.20 || >= 14.13}
-
   file-entry-cache@8.0.0:
     resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
     engines: {node: '>=16.0.0'}
@@ -1312,10 +1142,6 @@ packages:
     resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
     engines: {node: '>=14'}
 
-  formdata-polyfill@4.0.10:
-    resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
-    engines: {node: '>=12.20.0'}
-
   formsnap@1.0.1:
     resolution: {integrity: sha512-TvU9CoLSiacW1c7wXhLiyVpyy/LBfG0CEFDbs3M3jrsxBSrkTpsuhbQ8JYKY3CNCmIhZlgxCH+Vqr7RBF9G53w==}
     peerDependencies:
@@ -1325,13 +1151,6 @@ packages:
   fraction.js@4.3.7:
     resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
 
-  fs-extra@10.1.0:
-    resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
-    engines: {node: '>=12'}
-
-  fs-monkey@1.0.6:
-    resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==}
-
   fs.realpath@1.0.0:
     resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
 
@@ -1343,9 +1162,9 @@ packages:
   function-bind@1.1.2:
     resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
 
-  get-stream@6.0.1:
-    resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
-    engines: {node: '>=10'}
+  gensync@1.0.0-beta.2:
+    resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+    engines: {node: '>=6.9.0'}
 
   glob-parent@5.1.2:
     resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
@@ -1363,10 +1182,9 @@ packages:
     resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
     deprecated: Glob versions prior to v9 are no longer supported
 
-  glob@8.1.0:
-    resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==}
-    engines: {node: '>=12'}
-    deprecated: Glob versions prior to v9 are no longer supported
+  globals@11.12.0:
+    resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+    engines: {node: '>=4'}
 
   globals@14.0.0:
     resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
@@ -1386,22 +1204,26 @@ packages:
   globrex@0.1.2:
     resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
 
+  gql.tada@1.8.6:
+    resolution: {integrity: sha512-XyN/BkZVEJ5kxgK8oDjHluLwXBLdlUO6P4+u/AmYfknFDj5M5AnaZMm3pntMDO9tpaaEczy9pfXDEJ6tYuTlyA==}
+    hasBin: true
+    peerDependencies:
+      typescript: ^5.0.0
+
   graceful-fs@4.2.11:
     resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
 
   graphemer@1.4.0:
     resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
 
-  graphql-yoga@4.0.5:
-    resolution: {integrity: sha512-vIbJU9QX5RP4PoxbMCHcfOlt/3EsC/0uLdAOlKaiUvlwJDTFCaIHo2X10vL4i/27Gw8g90ECIwm2YbmeLDwcqg==}
-    engines: {node: '>=16.0.0'}
-    peerDependencies:
-      graphql: ^15.2.0 || ^16.0.0
-
   graphql@15.9.0:
     resolution: {integrity: sha512-GCOQdvm7XxV1S4U4CGrsdlEN37245eC8P9zaYCMr6K1BG0IPGy5lUwmJsEOGyl1GD6HXjOtl2keCP9asRBwNvA==}
     engines: {node: '>= 10.x'}
 
+  has-flag@3.0.0:
+    resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+    engines: {node: '>=4'}
+
   has-flag@4.0.0:
     resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
     engines: {node: '>=8'}
@@ -1410,17 +1232,6 @@ packages:
     resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
     engines: {node: '>= 0.4'}
 
-  houdini-svelte@1.2.56:
-    resolution: {integrity: sha512-t2eDPcMXstdTMv694KukZgmhJHy5WrB2dFZyVFMXaWHNT3ETtMFG99Mg0HXdxzSFzaiWXJnZIHneKdJ/bSZPaA==}
-
-  houdini@1.2.56:
-    resolution: {integrity: sha512-AqYuXuuCQMrkpePhNjZHnmUeIi8iOPBHOq7WmmNR1fmUhPhSFQAXOzI8EFCwwDB4h8W393pVSzH7bOZsx8h0Iw==}
-    hasBin: true
-
-  human-signals@3.0.1:
-    resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==}
-    engines: {node: '>=12.20.0'}
-
   ignore@5.3.2:
     resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
     engines: {node: '>= 4'}
@@ -1484,10 +1295,6 @@ packages:
   is-reference@3.0.2:
     resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
 
-  is-stream@3.0.0:
-    resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
-    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
   isexe@2.0.0:
     resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
 
@@ -1501,10 +1308,18 @@ packages:
   joi@17.13.3:
     resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==}
 
+  js-tokens@4.0.0:
+    resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
   js-yaml@4.1.0:
     resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
     hasBin: true
 
+  jsesc@2.5.2:
+    resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+    engines: {node: '>=4'}
+    hasBin: true
+
   json-buffer@3.0.1:
     resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
 
@@ -1518,8 +1333,10 @@ packages:
   json-stable-stringify-without-jsonify@1.0.1:
     resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
 
-  jsonfile@6.1.0:
-    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+  json5@2.2.3:
+    resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+    engines: {node: '>=6'}
+    hasBin: true
 
   just-clone@6.2.0:
     resolution: {integrity: sha512-1IynUYEc/HAwxhi3WDpIpxJbZpMCvvrrmZVqvj9EhpvbH8lls7HhdhiByjL7DkAaWlLIzpC0Xc/VPvy/UxLNjA==}
@@ -1562,38 +1379,29 @@ packages:
   lru-cache@10.4.3:
     resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
 
+  lru-cache@5.1.1:
+    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
   magic-string@0.30.11:
     resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
 
+  make-error@1.3.6:
+    resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+
   mdn-data@2.0.30:
     resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
 
-  memfs@3.5.3:
-    resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==}
-    engines: {node: '>= 4.0.0'}
-
   memoize-weak@1.0.2:
     resolution: {integrity: sha512-gj39xkrjEw7nCn4nJ1M5ms6+MyMlyiGmttzsqAUsAKn6bYKwuTHh/AO3cKPF8IBrTIYTxb0wWXFs3E//Y8VoWQ==}
 
-  merge-stream@2.0.0:
-    resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
-
   merge2@1.4.1:
     resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
     engines: {node: '>= 8'}
 
-  micromatch@4.0.5:
-    resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
-    engines: {node: '>=8.6'}
-
   micromatch@4.0.7:
     resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
     engines: {node: '>=8.6'}
 
-  mimic-fn@4.0.0:
-    resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
-    engines: {node: '>=12'}
-
   min-indent@1.0.1:
     resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
     engines: {node: '>=4'}
@@ -1601,10 +1409,6 @@ packages:
   minimatch@3.1.2:
     resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
 
-  minimatch@5.1.6:
-    resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
-    engines: {node: '>=10'}
-
   minimatch@9.0.5:
     resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
     engines: {node: '>=16 || 14 >=14.17'}
@@ -1624,10 +1428,6 @@ packages:
     resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
     engines: {node: '>=4'}
 
-  mrmime@1.0.1:
-    resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==}
-    engines: {node: '>=10'}
-
   mrmime@2.0.0:
     resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
     engines: {node: '>=10'}
@@ -1658,14 +1458,6 @@ packages:
   natural-compare@1.4.0:
     resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
 
-  node-domexception@1.0.0:
-    resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
-    engines: {node: '>=10.5.0'}
-
-  node-fetch@3.3.2:
-    resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
-    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
   node-gyp-build-optional-packages@5.2.2:
     resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==}
     hasBin: true
@@ -1685,13 +1477,6 @@ packages:
     resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==}
     engines: {node: '>=14.16'}
 
-  npm-run-path@5.3.0:
-    resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
-    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
-  npx-import@1.1.4:
-    resolution: {integrity: sha512-3ShymTWOgqGyNlh5lMJAejLuIv3W1K3fbI5Ewc6YErZU3Sp0PqsNs8UIU1O8z5+KVl/Du5ag56Gza9vdorGEoA==}
-
   object-assign@4.1.1:
     resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
     engines: {node: '>=0.10.0'}
@@ -1703,10 +1488,6 @@ packages:
   once@1.4.0:
     resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
 
-  onetime@6.0.0:
-    resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
-    engines: {node: '>=12'}
-
   optionator@0.9.4:
     resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
     engines: {node: '>= 0.8.0'}
@@ -1726,9 +1507,6 @@ packages:
     resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
     engines: {node: '>=6'}
 
-  parse-package-name@1.0.0:
-    resolution: {integrity: sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==}
-
   path-exists@4.0.0:
     resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
     engines: {node: '>=8'}
@@ -1741,10 +1519,6 @@ packages:
     resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
     engines: {node: '>=8'}
 
-  path-key@4.0.0:
-    resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
-    engines: {node: '>=12'}
-
   path-parse@1.0.7:
     resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
 
@@ -1926,10 +1700,6 @@ packages:
     resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
     engines: {node: '>=8.10.0'}
 
-  recast@0.23.9:
-    resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==}
-    engines: {node: '>= 4'}
-
   regenerator-runtime@0.14.1:
     resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
 
@@ -1950,11 +1720,6 @@ packages:
     deprecated: Rimraf versions prior to v4 are no longer supported
     hasBin: true
 
-  rollup@3.29.4:
-    resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==}
-    engines: {node: '>=14.18.0', npm: '>=8.0.0'}
-    hasBin: true
-
   rollup@4.21.0:
     resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==}
     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@@ -1970,6 +1735,10 @@ packages:
   sander@0.5.1:
     resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==}
 
+  semver@6.3.1:
+    resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+    hasBin: true
+
   semver@7.6.3:
     resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
     engines: {node: '>=10'}
@@ -1986,9 +1755,6 @@ packages:
     resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
     engines: {node: '>=8'}
 
-  signal-exit@3.0.7:
-    resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
-
   signal-exit@4.1.0:
     resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
     engines: {node: '>=14'}
@@ -1997,9 +1763,6 @@ packages:
     resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
     engines: {node: '>= 10'}
 
-  sisteransi@1.0.5:
-    resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
-
   slash@3.0.0:
     resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
     engines: {node: '>=8'}
@@ -2019,10 +1782,6 @@ packages:
     resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
     engines: {node: '>=0.10.0'}
 
-  streamsearch@1.1.0:
-    resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
-    engines: {node: '>=10.0.0'}
-
   string-width@4.2.3:
     resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
     engines: {node: '>=8'}
@@ -2039,10 +1798,6 @@ packages:
     resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
     engines: {node: '>=12'}
 
-  strip-final-newline@3.0.0:
-    resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
-    engines: {node: '>=12'}
-
   strip-indent@3.0.0:
     resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
     engines: {node: '>=8'}
@@ -2060,6 +1815,10 @@ packages:
     resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==}
     engines: {node: '>=14.0.0'}
 
+  supports-color@5.5.0:
+    resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+    engines: {node: '>=4'}
+
   supports-color@7.2.0:
     resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
     engines: {node: '>=8'}
@@ -2083,12 +1842,6 @@ packages:
       svelte:
         optional: true
 
-  svelte-hmr@0.15.3:
-    resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==}
-    engines: {node: ^12.20 || ^14.13.1 || >= 16}
-    peerDependencies:
-      svelte: ^3.19.0 || ^4.0.0
-
   svelte-hmr@0.16.0:
     resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==}
     engines: {node: ^12.20 || ^14.13.1 || >= 16}
@@ -2132,10 +1885,6 @@ packages:
       typescript:
         optional: true
 
-  svelte@3.59.2:
-    resolution: {integrity: sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==}
-    engines: {node: '>= 8'}
-
   svelte@4.2.18:
     resolution: {integrity: sha512-d0FdzYIiAePqRJEb90WlJDkjUEx42xhivxN8muUBmfZnP+tzUgz12DJ2hRJi8sIHCME7jeK1PTMgKPSfTd8JrA==}
     engines: {node: '>=16'}
@@ -2167,9 +1916,6 @@ packages:
   tiny-glob@0.2.9:
     resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==}
 
-  tiny-invariant@1.3.3:
-    resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
-
   to-fast-properties@2.0.0:
     resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
     engines: {node: '>=4'}
@@ -2201,12 +1947,23 @@ packages:
   ts-interface-checker@0.1.13:
     resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
 
+  ts-node@10.9.2:
+    resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
+    hasBin: true
+    peerDependencies:
+      '@swc/core': '>=1.2.50'
+      '@swc/wasm': '>=1.2.50'
+      '@types/node': '*'
+      typescript: '>=2.7'
+    peerDependenciesMeta:
+      '@swc/core':
+        optional: true
+      '@swc/wasm':
+        optional: true
+
   tslib@2.4.0:
     resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==}
 
-  tslib@2.7.0:
-    resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
-
   type-check@0.4.0:
     resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
     engines: {node: '>= 0.8.0'}
@@ -2232,14 +1989,6 @@ packages:
   undici-types@6.19.8:
     resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
 
-  undici@5.28.4:
-    resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==}
-    engines: {node: '>=14.0'}
-
-  universalify@2.0.1:
-    resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
-    engines: {node: '>= 10.0.0'}
-
   update-browserslist-db@1.1.0:
     resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
     hasBin: true
@@ -2249,62 +1998,22 @@ packages:
   uri-js@4.4.1:
     resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
 
-  urlpattern-polyfill@10.0.0:
-    resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==}
-
   util-deprecate@1.0.2:
     resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
 
+  v8-compile-cache-lib@3.0.1:
+    resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+
   valibot@0.31.1:
     resolution: {integrity: sha512-2YYIhPrnVSz/gfT2/iXVTrSj92HwchCt9Cga/6hX4B26iCz9zkIsGTS0HjDYTZfTi1Un0X6aRvhBi1cfqs/i0Q==}
 
   valibot@0.35.0:
     resolution: {integrity: sha512-+i2aCRkReTrd5KBN/dW2BrPOvFnU5LXTV2xjZnjnqUIO8YUx6P2+MgRrkwF2FhkexgyKq/NIZdPdknhHf5A/Ww==}
 
-  validate-npm-package-name@4.0.0:
-    resolution: {integrity: sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==}
-    engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
-
   validator@13.12.0:
     resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==}
     engines: {node: '>= 0.10'}
 
-  value-or-promise@1.0.12:
-    resolution: {integrity: sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==}
-    engines: {node: '>=12'}
-
-  vite-plugin-watch-and-run@1.7.0:
-    resolution: {integrity: sha512-f6TUUxDvOeFPMJ1/NDK8N1y/65w8h4jPZGsuOOYVnaK4lkutN95rTNAunsr0fcgTVo1BRUMxDTY7iFlsGuiCig==}
-    engines: {node: ^16.14 || >=18}
-
-  vite@4.5.3:
-    resolution: {integrity: sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==}
-    engines: {node: ^14.18.0 || >=16.0.0}
-    hasBin: true
-    peerDependencies:
-      '@types/node': '>= 14'
-      less: '*'
-      lightningcss: ^1.21.0
-      sass: '*'
-      stylus: '*'
-      sugarss: '*'
-      terser: ^5.4.0
-    peerDependenciesMeta:
-      '@types/node':
-        optional: true
-      less:
-        optional: true
-      lightningcss:
-        optional: true
-      sass:
-        optional: true
-      stylus:
-        optional: true
-      sugarss:
-        optional: true
-      terser:
-        optional: true
-
   vite@5.4.2:
     resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==}
     engines: {node: ^18.0.0 || >=20.0.0}
@@ -2344,15 +2053,14 @@ packages:
       vite:
         optional: true
 
-  web-streams-polyfill@3.3.3:
-    resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
-    engines: {node: '>= 8'}
-
   which@2.0.2:
     resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
     engines: {node: '>= 8'}
     hasBin: true
 
+  wonka@6.3.4:
+    resolution: {integrity: sha512-CjpbqNtBGNAeyNS/9W6q3kSkKE52+FjIj7AkFlLr11s/VWGUu6a2CdYSdGxocIhIVjaW/zchesBQUKPVU69Cqg==}
+
   word-wrap@1.2.5:
     resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
     engines: {node: '>=0.10.0'}
@@ -2368,6 +2076,9 @@ packages:
   wrappy@1.0.2:
     resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
 
+  yallist@3.1.1:
+    resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
   yaml@1.10.2:
     resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
     engines: {node: '>= 6'}
@@ -2377,6 +2088,10 @@ packages:
     engines: {node: '>= 14'}
     hasBin: true
 
+  yn@3.1.1:
+    resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+    engines: {node: '>=6'}
+
   yocto-queue@0.1.0:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
     engines: {node: '>=10'}
@@ -2394,6 +2109,16 @@ packages:
 
 snapshots:
 
+  '@0no-co/graphql.web@1.0.8(graphql@15.9.0)':
+    optionalDependencies:
+      graphql: 15.9.0
+
+  '@0no-co/graphqlsp@1.12.13(graphql@15.9.0)(typescript@5.5.4)':
+    dependencies:
+      '@gql.tada/internal': 1.0.7(graphql@15.9.0)(typescript@5.5.4)
+      graphql: 15.9.0
+      typescript: 5.5.4
+
   '@alloc/quick-lru@5.2.0': {}
 
   '@ampproject/remapping@2.3.0':
@@ -2409,177 +2134,211 @@ snapshots:
   '@ark/util@0.1.0':
     optional: true
 
-  '@babel/helper-string-parser@7.24.8': {}
+  '@babel/code-frame@7.24.7':
+    dependencies:
+      '@babel/highlight': 7.24.7
+      picocolors: 1.0.1
+    optional: true
 
-  '@babel/helper-validator-identifier@7.24.7': {}
+  '@babel/compat-data@7.25.4':
+    optional: true
 
-  '@babel/parser@7.25.4':
+  '@babel/core@7.25.2':
     dependencies:
+      '@ampproject/remapping': 2.3.0
+      '@babel/code-frame': 7.24.7
+      '@babel/generator': 7.25.5
+      '@babel/helper-compilation-targets': 7.25.2
+      '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2)
+      '@babel/helpers': 7.25.0
+      '@babel/parser': 7.25.4
+      '@babel/template': 7.25.0
+      '@babel/traverse': 7.25.4
       '@babel/types': 7.25.4
-
-  '@babel/runtime@7.25.4':
-    dependencies:
-      regenerator-runtime: 0.14.1
+      convert-source-map: 2.0.0
+      debug: 4.3.6
+      gensync: 1.0.0-beta.2
+      json5: 2.2.3
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
     optional: true
 
-  '@babel/types@7.25.4':
+  '@babel/generator@7.25.5':
     dependencies:
-      '@babel/helper-string-parser': 7.24.8
-      '@babel/helper-validator-identifier': 7.24.7
-      to-fast-properties: 2.0.0
+      '@babel/types': 7.25.4
+      '@jridgewell/gen-mapping': 0.3.5
+      '@jridgewell/trace-mapping': 0.3.25
+      jsesc: 2.5.2
+    optional: true
 
-  '@clack/core@0.3.4':
+  '@babel/helper-compilation-targets@7.25.2':
     dependencies:
-      picocolors: 1.0.1
-      sisteransi: 1.0.5
+      '@babel/compat-data': 7.25.4
+      '@babel/helper-validator-option': 7.24.8
+      browserslist: 4.23.3
+      lru-cache: 5.1.1
+      semver: 6.3.1
+    optional: true
 
-  '@clack/prompts@0.6.3':
+  '@babel/helper-module-imports@7.24.7':
     dependencies:
-      '@clack/core': 0.3.4
-      picocolors: 1.0.1
-      sisteransi: 1.0.5
+      '@babel/traverse': 7.25.4
+      '@babel/types': 7.25.4
+    transitivePeerDependencies:
+      - supports-color
+    optional: true
 
-  '@envelop/core@4.0.3':
+  '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)':
     dependencies:
-      '@envelop/types': 4.0.1
-      tslib: 2.7.0
+      '@babel/core': 7.25.2
+      '@babel/helper-module-imports': 7.24.7
+      '@babel/helper-simple-access': 7.24.7
+      '@babel/helper-validator-identifier': 7.24.7
+      '@babel/traverse': 7.25.4
+    transitivePeerDependencies:
+      - supports-color
+    optional: true
 
-  '@envelop/types@4.0.1':
+  '@babel/helper-simple-access@7.24.7':
     dependencies:
-      tslib: 2.7.0
-
-  '@esbuild/aix-ppc64@0.21.5':
+      '@babel/traverse': 7.25.4
+      '@babel/types': 7.25.4
+    transitivePeerDependencies:
+      - supports-color
     optional: true
 
-  '@esbuild/android-arm64@0.18.20':
+  '@babel/helper-string-parser@7.24.8':
     optional: true
 
-  '@esbuild/android-arm64@0.21.5':
+  '@babel/helper-validator-identifier@7.24.7':
     optional: true
 
-  '@esbuild/android-arm@0.18.20':
+  '@babel/helper-validator-option@7.24.8':
     optional: true
 
-  '@esbuild/android-arm@0.21.5':
+  '@babel/helpers@7.25.0':
+    dependencies:
+      '@babel/template': 7.25.0
+      '@babel/types': 7.25.4
     optional: true
 
-  '@esbuild/android-x64@0.18.20':
+  '@babel/highlight@7.24.7':
+    dependencies:
+      '@babel/helper-validator-identifier': 7.24.7
+      chalk: 2.4.2
+      js-tokens: 4.0.0
+      picocolors: 1.0.1
     optional: true
 
-  '@esbuild/android-x64@0.21.5':
+  '@babel/parser@7.25.4':
+    dependencies:
+      '@babel/types': 7.25.4
     optional: true
 
-  '@esbuild/darwin-arm64@0.18.20':
+  '@babel/runtime@7.25.4':
+    dependencies:
+      regenerator-runtime: 0.14.1
     optional: true
 
-  '@esbuild/darwin-arm64@0.21.5':
+  '@babel/template@7.25.0':
+    dependencies:
+      '@babel/code-frame': 7.24.7
+      '@babel/parser': 7.25.4
+      '@babel/types': 7.25.4
     optional: true
 
-  '@esbuild/darwin-x64@0.18.20':
+  '@babel/traverse@7.25.4':
+    dependencies:
+      '@babel/code-frame': 7.24.7
+      '@babel/generator': 7.25.5
+      '@babel/parser': 7.25.4
+      '@babel/template': 7.25.0
+      '@babel/types': 7.25.4
+      debug: 4.3.6
+      globals: 11.12.0
+    transitivePeerDependencies:
+      - supports-color
     optional: true
 
-  '@esbuild/darwin-x64@0.21.5':
+  '@babel/types@7.25.4':
+    dependencies:
+      '@babel/helper-string-parser': 7.24.8
+      '@babel/helper-validator-identifier': 7.24.7
+      to-fast-properties: 2.0.0
     optional: true
 
-  '@esbuild/freebsd-arm64@0.18.20':
+  '@cspotcode/source-map-support@0.8.1':
+    dependencies:
+      '@jridgewell/trace-mapping': 0.3.9
     optional: true
 
-  '@esbuild/freebsd-arm64@0.21.5':
+  '@esbuild/aix-ppc64@0.21.5':
     optional: true
 
-  '@esbuild/freebsd-x64@0.18.20':
+  '@esbuild/android-arm64@0.21.5':
     optional: true
 
-  '@esbuild/freebsd-x64@0.21.5':
+  '@esbuild/android-arm@0.21.5':
     optional: true
 
-  '@esbuild/linux-arm64@0.18.20':
+  '@esbuild/android-x64@0.21.5':
     optional: true
 
-  '@esbuild/linux-arm64@0.21.5':
+  '@esbuild/darwin-arm64@0.21.5':
     optional: true
 
-  '@esbuild/linux-arm@0.18.20':
+  '@esbuild/darwin-x64@0.21.5':
     optional: true
 
-  '@esbuild/linux-arm@0.21.5':
+  '@esbuild/freebsd-arm64@0.21.5':
     optional: true
 
-  '@esbuild/linux-ia32@0.18.20':
+  '@esbuild/freebsd-x64@0.21.5':
     optional: true
 
-  '@esbuild/linux-ia32@0.21.5':
+  '@esbuild/linux-arm64@0.21.5':
     optional: true
 
-  '@esbuild/linux-loong64@0.18.20':
+  '@esbuild/linux-arm@0.21.5':
     optional: true
 
-  '@esbuild/linux-loong64@0.21.5':
+  '@esbuild/linux-ia32@0.21.5':
     optional: true
 
-  '@esbuild/linux-mips64el@0.18.20':
+  '@esbuild/linux-loong64@0.21.5':
     optional: true
 
   '@esbuild/linux-mips64el@0.21.5':
     optional: true
 
-  '@esbuild/linux-ppc64@0.18.20':
-    optional: true
-
   '@esbuild/linux-ppc64@0.21.5':
     optional: true
 
-  '@esbuild/linux-riscv64@0.18.20':
-    optional: true
-
   '@esbuild/linux-riscv64@0.21.5':
     optional: true
 
-  '@esbuild/linux-s390x@0.18.20':
-    optional: true
-
   '@esbuild/linux-s390x@0.21.5':
     optional: true
 
-  '@esbuild/linux-x64@0.18.20':
-    optional: true
-
   '@esbuild/linux-x64@0.21.5':
     optional: true
 
-  '@esbuild/netbsd-x64@0.18.20':
-    optional: true
-
   '@esbuild/netbsd-x64@0.21.5':
     optional: true
 
-  '@esbuild/openbsd-x64@0.18.20':
-    optional: true
-
   '@esbuild/openbsd-x64@0.21.5':
     optional: true
 
-  '@esbuild/sunos-x64@0.18.20':
-    optional: true
-
   '@esbuild/sunos-x64@0.21.5':
     optional: true
 
-  '@esbuild/win32-arm64@0.18.20':
-    optional: true
-
   '@esbuild/win32-arm64@0.21.5':
     optional: true
 
-  '@esbuild/win32-ia32@0.18.20':
-    optional: true
-
   '@esbuild/win32-ia32@0.21.5':
     optional: true
 
-  '@esbuild/win32-x64@0.18.20':
-    optional: true
-
   '@esbuild/win32-x64@0.21.5':
     optional: true
 
@@ -2614,92 +2373,32 @@ snapshots:
 
   '@eslint/js@9.9.0': {}
 
-  '@eslint/object-schema@2.1.4': {}
-
-  '@exodus/schemasafe@1.3.0':
-    optional: true
-
-  '@fastify/busboy@2.1.1': {}
-
-  '@gcornut/valibot-json-schema@0.31.0':
-    dependencies:
-      valibot: 0.31.1
-    optionalDependencies:
-      '@types/json-schema': 7.0.15
-      esbuild: 0.21.5
-      esbuild-runner: 2.2.2(esbuild@0.21.5)
-    optional: true
-
-  '@graphql-tools/executor@1.3.1(graphql@15.9.0)':
-    dependencies:
-      '@graphql-tools/utils': 10.5.4(graphql@15.9.0)
-      '@graphql-typed-document-node/core': 3.2.0(graphql@15.9.0)
-      '@repeaterjs/repeater': 3.0.6
-      graphql: 15.9.0
-      tslib: 2.7.0
-      value-or-promise: 1.0.12
-
-  '@graphql-tools/merge@8.4.2(graphql@15.9.0)':
-    dependencies:
-      '@graphql-tools/utils': 9.2.1(graphql@15.9.0)
-      graphql: 15.9.0
-      tslib: 2.4.0
-
-  '@graphql-tools/merge@9.0.6(graphql@15.9.0)':
-    dependencies:
-      '@graphql-tools/utils': 10.5.4(graphql@15.9.0)
-      graphql: 15.9.0
-      tslib: 2.4.0
-
-  '@graphql-tools/schema@10.0.6(graphql@15.9.0)':
-    dependencies:
-      '@graphql-tools/merge': 9.0.6(graphql@15.9.0)
-      '@graphql-tools/utils': 10.5.4(graphql@15.9.0)
-      graphql: 15.9.0
-      tslib: 2.7.0
-      value-or-promise: 1.0.12
-
-  '@graphql-tools/schema@9.0.19(graphql@15.9.0)':
-    dependencies:
-      '@graphql-tools/merge': 8.4.2(graphql@15.9.0)
-      '@graphql-tools/utils': 9.2.1(graphql@15.9.0)
-      graphql: 15.9.0
-      tslib: 2.4.0
-      value-or-promise: 1.0.12
-
-  '@graphql-tools/utils@10.5.4(graphql@15.9.0)':
-    dependencies:
-      '@graphql-typed-document-node/core': 3.2.0(graphql@15.9.0)
-      cross-inspect: 1.0.1
-      dset: 3.1.3
-      graphql: 15.9.0
-      tslib: 2.4.0
-
-  '@graphql-tools/utils@9.2.1(graphql@15.9.0)':
-    dependencies:
-      '@graphql-typed-document-node/core': 3.2.0(graphql@15.9.0)
-      graphql: 15.9.0
-      tslib: 2.4.0
+  '@eslint/object-schema@2.1.4': {}
 
-  '@graphql-typed-document-node/core@3.2.0(graphql@15.9.0)':
-    dependencies:
-      graphql: 15.9.0
+  '@exodus/schemasafe@1.3.0':
+    optional: true
 
-  '@graphql-yoga/logger@1.0.0':
+  '@gcornut/valibot-json-schema@0.31.0':
     dependencies:
-      tslib: 2.7.0
+      valibot: 0.31.1
+    optionalDependencies:
+      '@types/json-schema': 7.0.15
+      esbuild: 0.21.5
+      esbuild-runner: 2.2.2(esbuild@0.21.5)
+    optional: true
 
-  '@graphql-yoga/subscription@4.0.0':
+  '@gql.tada/cli-utils@1.6.1(@0no-co/graphqlsp@1.12.13(graphql@15.9.0)(typescript@5.5.4))(graphql@15.9.0)(typescript@5.5.4)':
     dependencies:
-      '@graphql-yoga/typed-event-target': 2.0.0
-      '@repeaterjs/repeater': 3.0.6
-      '@whatwg-node/events': 0.1.2
-      tslib: 2.7.0
+      '@0no-co/graphqlsp': 1.12.13(graphql@15.9.0)(typescript@5.5.4)
+      '@gql.tada/internal': 1.0.7(graphql@15.9.0)(typescript@5.5.4)
+      graphql: 15.9.0
+      typescript: 5.5.4
 
-  '@graphql-yoga/typed-event-target@2.0.0':
+  '@gql.tada/internal@1.0.7(graphql@15.9.0)(typescript@5.5.4)':
     dependencies:
-      '@repeaterjs/repeater': 3.0.6
-      tslib: 2.7.0
+      '@0no-co/graphql.web': 1.0.8(graphql@15.9.0)
+      graphql: 15.9.0
+      typescript: 5.5.4
 
   '@hapi/hoek@9.3.0':
     optional: true
@@ -2739,11 +2438,11 @@ snapshots:
       '@jridgewell/resolve-uri': 3.1.2
       '@jridgewell/sourcemap-codec': 1.5.0
 
-  '@kamilkisiela/fast-url-parser@1.1.4': {}
-
-  '@kitql/helpers@0.8.9':
+  '@jridgewell/trace-mapping@0.3.9':
     dependencies:
-      esm-env: 1.0.0
+      '@jridgewell/resolve-uri': 3.1.2
+      '@jridgewell/sourcemap-codec': 1.5.0
+    optional: true
 
   '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3':
     optional: true
@@ -2783,8 +2482,6 @@ snapshots:
   '@poppinss/macroable@1.0.2':
     optional: true
 
-  '@repeaterjs/repeater@3.0.6': {}
-
   '@rollup/plugin-commonjs@26.0.1(rollup@4.21.0)':
     dependencies:
       '@rollup/pluginutils': 5.1.0(rollup@4.21.0)
@@ -2894,26 +2591,6 @@ snapshots:
       '@sveltejs/kit': 2.5.24(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0)))(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0))
       rollup: 4.21.0
 
-  '@sveltejs/kit@1.30.4(svelte@3.59.2)(vite@4.5.3(@types/node@22.5.0))':
-    dependencies:
-      '@sveltejs/vite-plugin-svelte': 2.5.3(svelte@3.59.2)(vite@4.5.3(@types/node@22.5.0))
-      '@types/cookie': 0.5.4
-      cookie: 0.5.0
-      devalue: 4.3.3
-      esm-env: 1.0.0
-      kleur: 4.1.5
-      magic-string: 0.30.11
-      mrmime: 1.0.1
-      sade: 1.8.1
-      set-cookie-parser: 2.7.0
-      sirv: 2.0.4
-      svelte: 3.59.2
-      tiny-glob: 0.2.9
-      undici: 5.28.4
-      vite: 4.5.3(@types/node@22.5.0)
-    transitivePeerDependencies:
-      - supports-color
-
   '@sveltejs/kit@2.5.24(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0)))(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0))':
     dependencies:
       '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0))
@@ -2932,15 +2609,6 @@ snapshots:
       tiny-glob: 0.2.9
       vite: 5.4.2(@types/node@22.5.0)
 
-  '@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.5.3(svelte@3.59.2)(vite@4.5.3(@types/node@22.5.0)))(svelte@3.59.2)(vite@4.5.3(@types/node@22.5.0))':
-    dependencies:
-      '@sveltejs/vite-plugin-svelte': 2.5.3(svelte@3.59.2)(vite@4.5.3(@types/node@22.5.0))
-      debug: 4.3.6
-      svelte: 3.59.2
-      vite: 4.5.3(@types/node@22.5.0)
-    transitivePeerDependencies:
-      - supports-color
-
   '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0)))(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0))':
     dependencies:
       '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0))
@@ -2950,20 +2618,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@sveltejs/vite-plugin-svelte@2.5.3(svelte@3.59.2)(vite@4.5.3(@types/node@22.5.0))':
-    dependencies:
-      '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.5.3(svelte@3.59.2)(vite@4.5.3(@types/node@22.5.0)))(svelte@3.59.2)(vite@4.5.3(@types/node@22.5.0))
-      debug: 4.3.6
-      deepmerge: 4.3.1
-      kleur: 4.1.5
-      magic-string: 0.30.11
-      svelte: 3.59.2
-      svelte-hmr: 0.15.3(svelte@3.59.2)
-      vite: 4.5.3(@types/node@22.5.0)
-      vitefu: 0.2.5(vite@4.5.3(@types/node@22.5.0))
-    transitivePeerDependencies:
-      - supports-color
-
   '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0))':
     dependencies:
       '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0)))(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0))
@@ -2978,9 +2632,17 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@types/braces@3.0.4': {}
+  '@tsconfig/node10@1.0.11':
+    optional: true
+
+  '@tsconfig/node12@1.0.11':
+    optional: true
+
+  '@tsconfig/node14@1.0.3':
+    optional: true
 
-  '@types/cookie@0.5.4': {}
+  '@tsconfig/node16@1.0.4':
+    optional: true
 
   '@types/cookie@0.6.0': {}
 
@@ -2991,19 +2653,12 @@ snapshots:
 
   '@types/estree@1.0.5': {}
 
-  '@types/fs-extra@9.0.13':
-    dependencies:
-      '@types/node': 22.5.0
-
   '@types/json-schema@7.0.15': {}
 
-  '@types/micromatch@4.0.9':
-    dependencies:
-      '@types/braces': 3.0.4
-
   '@types/node@22.5.0':
     dependencies:
       undici-types: 6.19.8
+    optional: true
 
   '@types/pug@2.0.10': {}
 
@@ -3093,7 +2748,12 @@ snapshots:
       '@typescript-eslint/types': 8.2.0
       eslint-visitor-keys: 3.4.3
 
-  '@ungap/structured-clone@1.2.0': {}
+  '@urql/core@5.0.6(graphql@15.9.0)':
+    dependencies:
+      '@0no-co/graphql.web': 1.0.8(graphql@15.9.0)
+      wonka: 6.3.4
+    transitivePeerDependencies:
+      - graphql
 
   '@vinejs/compiler@2.5.0':
     optional: true
@@ -3110,30 +2770,14 @@ snapshots:
       validator: 13.12.0
     optional: true
 
-  '@whatwg-node/events@0.1.2':
-    dependencies:
-      tslib: 2.7.0
-
-  '@whatwg-node/fetch@0.9.21':
-    dependencies:
-      '@whatwg-node/node-fetch': 0.5.25
-      urlpattern-polyfill: 10.0.0
-
-  '@whatwg-node/node-fetch@0.5.25':
-    dependencies:
-      '@kamilkisiela/fast-url-parser': 1.1.4
-      busboy: 1.6.0
-      fast-querystring: 1.1.2
-      tslib: 2.7.0
-
-  '@whatwg-node/server@0.9.49':
+  acorn-jsx@5.3.2(acorn@8.12.1):
     dependencies:
-      '@whatwg-node/fetch': 0.9.21
-      tslib: 2.7.0
+      acorn: 8.12.1
 
-  acorn-jsx@5.3.2(acorn@8.12.1):
+  acorn-walk@8.3.3:
     dependencies:
       acorn: 8.12.1
+    optional: true
 
   acorn@8.12.1: {}
 
@@ -3148,6 +2792,11 @@ snapshots:
 
   ansi-regex@6.0.1: {}
 
+  ansi-styles@3.2.1:
+    dependencies:
+      color-convert: 1.9.3
+    optional: true
+
   ansi-styles@4.3.0:
     dependencies:
       color-convert: 2.0.1
@@ -3161,6 +2810,9 @@ snapshots:
       normalize-path: 3.0.0
       picomatch: 2.3.1
 
+  arg@4.1.3:
+    optional: true
+
   arg@5.0.2: {}
 
   argparse@2.0.1: {}
@@ -3177,10 +2829,6 @@ snapshots:
 
   array-union@2.1.0: {}
 
-  ast-types@0.16.1:
-    dependencies:
-      tslib: 2.4.0
-
   autoprefixer@10.4.20(postcss@8.4.41):
     dependencies:
       browserslist: 4.23.3
@@ -3224,14 +2872,6 @@ snapshots:
 
   builtin-modules@3.3.0: {}
 
-  builtins@5.1.0:
-    dependencies:
-      semver: 7.6.3
-
-  busboy@1.6.0:
-    dependencies:
-      streamsearch: 1.1.0
-
   callsites@3.1.0: {}
 
   camelcase-css@2.0.1: {}
@@ -3241,6 +2881,13 @@ snapshots:
 
   caniuse-lite@1.0.30001651: {}
 
+  chalk@2.4.2:
+    dependencies:
+      ansi-styles: 3.2.1
+      escape-string-regexp: 1.0.5
+      supports-color: 5.5.0
+    optional: true
+
   chalk@4.1.2:
     dependencies:
       ansi-styles: 4.3.0
@@ -3266,27 +2913,33 @@ snapshots:
       estree-walker: 3.0.3
       periscopic: 3.1.0
 
+  color-convert@1.9.3:
+    dependencies:
+      color-name: 1.1.3
+    optional: true
+
   color-convert@2.0.1:
     dependencies:
       color-name: 1.1.4
 
+  color-name@1.1.3:
+    optional: true
+
   color-name@1.1.4: {}
 
   commander@4.1.1: {}
 
-  commander@9.5.0: {}
-
   commondir@1.0.1: {}
 
   concat-map@0.0.1: {}
 
-  cookie@0.5.0: {}
+  convert-source-map@2.0.0:
+    optional: true
 
   cookie@0.6.0: {}
 
-  cross-inspect@1.0.1:
-    dependencies:
-      tslib: 2.4.0
+  create-require@1.1.1:
+    optional: true
 
   cross-spawn@7.0.3:
     dependencies:
@@ -3301,8 +2954,6 @@ snapshots:
 
   cssesc@3.0.0: {}
 
-  data-uri-to-buffer@4.0.1: {}
-
   dayjs@1.11.13:
     optional: true
 
@@ -3321,19 +2972,29 @@ snapshots:
   detect-libc@2.0.3:
     optional: true
 
-  devalue@4.3.3: {}
-
   devalue@5.0.0: {}
 
   didyoumean@1.2.2: {}
 
+  diff@4.0.2:
+    optional: true
+
   dir-glob@3.0.1:
     dependencies:
       path-type: 4.0.0
 
   dlv@1.1.3: {}
 
-  dset@3.1.3: {}
+  dotenv-cli@7.4.2:
+    dependencies:
+      cross-spawn: 7.0.3
+      dotenv: 16.4.5
+      dotenv-expand: 10.0.0
+      minimist: 1.2.8
+
+  dotenv-expand@10.0.0: {}
+
+  dotenv@16.4.5: {}
 
   eastasianwidth@0.2.0: {}
 
@@ -3352,31 +3013,6 @@ snapshots:
       tslib: 2.4.0
     optional: true
 
-  esbuild@0.18.20:
-    optionalDependencies:
-      '@esbuild/android-arm': 0.18.20
-      '@esbuild/android-arm64': 0.18.20
-      '@esbuild/android-x64': 0.18.20
-      '@esbuild/darwin-arm64': 0.18.20
-      '@esbuild/darwin-x64': 0.18.20
-      '@esbuild/freebsd-arm64': 0.18.20
-      '@esbuild/freebsd-x64': 0.18.20
-      '@esbuild/linux-arm': 0.18.20
-      '@esbuild/linux-arm64': 0.18.20
-      '@esbuild/linux-ia32': 0.18.20
-      '@esbuild/linux-loong64': 0.18.20
-      '@esbuild/linux-mips64el': 0.18.20
-      '@esbuild/linux-ppc64': 0.18.20
-      '@esbuild/linux-riscv64': 0.18.20
-      '@esbuild/linux-s390x': 0.18.20
-      '@esbuild/linux-x64': 0.18.20
-      '@esbuild/netbsd-x64': 0.18.20
-      '@esbuild/openbsd-x64': 0.18.20
-      '@esbuild/sunos-x64': 0.18.20
-      '@esbuild/win32-arm64': 0.18.20
-      '@esbuild/win32-ia32': 0.18.20
-      '@esbuild/win32-x64': 0.18.20
-
   esbuild@0.21.5:
     optionalDependencies:
       '@esbuild/aix-ppc64': 0.21.5
@@ -3405,6 +3041,9 @@ snapshots:
 
   escalade@3.1.2: {}
 
+  escape-string-regexp@1.0.5:
+    optional: true
+
   escape-string-regexp@4.0.0: {}
 
   eslint-compat-utils@0.5.1(eslint@9.9.0(jiti@1.21.6)):
@@ -3416,7 +3055,7 @@ snapshots:
     dependencies:
       eslint: 9.9.0(jiti@1.21.6)
 
-  eslint-plugin-svelte@2.43.0(eslint@9.9.0(jiti@1.21.6))(svelte@4.2.18):
+  eslint-plugin-svelte@2.43.0(eslint@9.9.0(jiti@1.21.6))(svelte@4.2.18)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)):
     dependencies:
       '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.0(jiti@1.21.6))
       '@jridgewell/sourcemap-codec': 1.5.0
@@ -3425,7 +3064,7 @@ snapshots:
       esutils: 2.0.3
       known-css-properties: 0.34.0
       postcss: 8.4.41
-      postcss-load-config: 3.1.4(postcss@8.4.41)
+      postcss-load-config: 3.1.4(postcss@8.4.41)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4))
       postcss-safe-parser: 6.0.0(postcss@8.4.41)
       postcss-selector-parser: 6.1.2
       semver: 7.6.3
@@ -3504,8 +3143,6 @@ snapshots:
       acorn-jsx: 5.3.2(acorn@8.12.1)
       eslint-visitor-keys: 3.4.3
 
-  esprima@4.0.1: {}
-
   esquery@1.6.0:
     dependencies:
       estraverse: 5.3.0
@@ -3524,20 +3161,6 @@ snapshots:
 
   esutils@2.0.3: {}
 
-  execa@6.1.0:
-    dependencies:
-      cross-spawn: 7.0.3
-      get-stream: 6.0.1
-      human-signals: 3.0.1
-      is-stream: 3.0.0
-      merge-stream: 2.0.0
-      npm-run-path: 5.3.0
-      onetime: 6.0.0
-      signal-exit: 3.0.7
-      strip-final-newline: 3.0.0
-
-  fast-decode-uri-component@1.0.1: {}
-
   fast-deep-equal@3.1.3: {}
 
   fast-glob@3.3.2:
@@ -3552,19 +3175,10 @@ snapshots:
 
   fast-levenshtein@2.0.6: {}
 
-  fast-querystring@1.1.2:
-    dependencies:
-      fast-decode-uri-component: 1.0.1
-
   fastq@1.17.1:
     dependencies:
       reusify: 1.0.4
 
-  fetch-blob@3.2.0:
-    dependencies:
-      node-domexception: 1.0.0
-      web-streams-polyfill: 3.3.3
-
   file-entry-cache@8.0.0:
     dependencies:
       flat-cache: 4.0.1
@@ -3590,10 +3204,6 @@ snapshots:
       cross-spawn: 7.0.3
       signal-exit: 4.1.0
 
-  formdata-polyfill@4.0.10:
-    dependencies:
-      fetch-blob: 3.2.0
-
   formsnap@1.0.1(svelte@4.2.18)(sveltekit-superforms@2.17.0(@sveltejs/kit@2.5.24(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0)))(svelte@4.2.18)(vite@5.4.2(@types/node@22.5.0)))(svelte@4.2.18)):
     dependencies:
       nanoid: 5.0.7
@@ -3602,14 +3212,6 @@ snapshots:
 
   fraction.js@4.3.7: {}
 
-  fs-extra@10.1.0:
-    dependencies:
-      graceful-fs: 4.2.11
-      jsonfile: 6.1.0
-      universalify: 2.0.1
-
-  fs-monkey@1.0.6: {}
-
   fs.realpath@1.0.0: {}
 
   fsevents@2.3.3:
@@ -3617,7 +3219,8 @@ snapshots:
 
   function-bind@1.1.2: {}
 
-  get-stream@6.0.1: {}
+  gensync@1.0.0-beta.2:
+    optional: true
 
   glob-parent@5.1.2:
     dependencies:
@@ -3645,13 +3248,8 @@ snapshots:
       once: 1.4.0
       path-is-absolute: 1.0.1
 
-  glob@8.1.0:
-    dependencies:
-      fs.realpath: 1.0.0
-      inflight: 1.0.6
-      inherits: 2.0.4
-      minimatch: 5.1.6
-      once: 1.4.0
+  globals@11.12.0:
+    optional: true
 
   globals@14.0.0: {}
 
@@ -3670,85 +3268,33 @@ snapshots:
 
   globrex@0.1.2: {}
 
+  gql.tada@1.8.6(graphql@15.9.0)(typescript@5.5.4):
+    dependencies:
+      '@0no-co/graphql.web': 1.0.8(graphql@15.9.0)
+      '@0no-co/graphqlsp': 1.12.13(graphql@15.9.0)(typescript@5.5.4)
+      '@gql.tada/cli-utils': 1.6.1(@0no-co/graphqlsp@1.12.13(graphql@15.9.0)(typescript@5.5.4))(graphql@15.9.0)(typescript@5.5.4)
+      '@gql.tada/internal': 1.0.7(graphql@15.9.0)(typescript@5.5.4)
+      typescript: 5.5.4
+    transitivePeerDependencies:
+      - '@gql.tada/svelte-support'
+      - '@gql.tada/vue-support'
+      - graphql
+
   graceful-fs@4.2.11: {}
 
   graphemer@1.4.0: {}
 
-  graphql-yoga@4.0.5(graphql@15.9.0):
-    dependencies:
-      '@envelop/core': 4.0.3
-      '@graphql-tools/executor': 1.3.1(graphql@15.9.0)
-      '@graphql-tools/schema': 10.0.6(graphql@15.9.0)
-      '@graphql-tools/utils': 10.5.4(graphql@15.9.0)
-      '@graphql-yoga/logger': 1.0.0
-      '@graphql-yoga/subscription': 4.0.0
-      '@whatwg-node/fetch': 0.9.21
-      '@whatwg-node/server': 0.9.49
-      dset: 3.1.3
-      graphql: 15.9.0
-      lru-cache: 10.4.3
-      tslib: 2.7.0
-
   graphql@15.9.0: {}
 
+  has-flag@3.0.0:
+    optional: true
+
   has-flag@4.0.0: {}
 
   hasown@2.0.2:
     dependencies:
       function-bind: 1.1.2
 
-  houdini-svelte@1.2.56(@types/node@22.5.0):
-    dependencies:
-      '@kitql/helpers': 0.8.9
-      '@sveltejs/kit': 1.30.4(svelte@3.59.2)(vite@4.5.3(@types/node@22.5.0))
-      ast-types: 0.16.1
-      estree-walker: 3.0.3
-      graphql: 15.9.0
-      houdini: 1.2.56
-      recast: 0.23.9
-      rollup: 3.29.4
-      svelte: 3.59.2
-      vite: 4.5.3(@types/node@22.5.0)
-    transitivePeerDependencies:
-      - '@types/node'
-      - less
-      - lightningcss
-      - sass
-      - stylus
-      - sugarss
-      - supports-color
-      - terser
-
-  houdini@1.2.56:
-    dependencies:
-      '@babel/parser': 7.25.4
-      '@clack/prompts': 0.6.3
-      '@graphql-tools/merge': 9.0.6(graphql@15.9.0)
-      '@graphql-tools/schema': 9.0.19(graphql@15.9.0)
-      '@kitql/helpers': 0.8.9
-      '@types/estree': 1.0.5
-      '@types/fs-extra': 9.0.13
-      '@types/micromatch': 4.0.9
-      '@ungap/structured-clone': 1.2.0
-      '@whatwg-node/server': 0.9.49
-      ast-types: 0.16.1
-      commander: 9.5.0
-      deepmerge: 4.3.1
-      estree-walker: 3.0.3
-      fs-extra: 10.1.0
-      glob: 8.1.0
-      graphql: 15.9.0
-      graphql-yoga: 4.0.5(graphql@15.9.0)
-      memfs: 3.5.3
-      micromatch: 4.0.7
-      minimatch: 5.1.6
-      node-fetch: 3.3.2
-      npx-import: 1.1.4
-      recast: 0.23.9
-      vite-plugin-watch-and-run: 1.7.0
-
-  human-signals@3.0.1: {}
-
   ignore@5.3.2: {}
 
   import-fresh@3.3.0:
@@ -3801,8 +3347,6 @@ snapshots:
     dependencies:
       '@types/estree': 1.0.5
 
-  is-stream@3.0.0: {}
-
   isexe@2.0.0: {}
 
   jackspeak@3.4.3:
@@ -3822,10 +3366,16 @@ snapshots:
       '@sideway/pinpoint': 2.0.0
     optional: true
 
+  js-tokens@4.0.0:
+    optional: true
+
   js-yaml@4.1.0:
     dependencies:
       argparse: 2.0.1
 
+  jsesc@2.5.2:
+    optional: true
+
   json-buffer@3.0.1: {}
 
   json-schema-to-ts@3.1.0:
@@ -3838,11 +3388,8 @@ snapshots:
 
   json-stable-stringify-without-jsonify@1.0.1: {}
 
-  jsonfile@6.1.0:
-    dependencies:
-      universalify: 2.0.1
-    optionalDependencies:
-      graceful-fs: 4.2.11
+  json5@2.2.3:
+    optional: true
 
   just-clone@6.2.0: {}
 
@@ -3875,44 +3422,35 @@ snapshots:
 
   lru-cache@10.4.3: {}
 
+  lru-cache@5.1.1:
+    dependencies:
+      yallist: 3.1.1
+    optional: true
+
   magic-string@0.30.11:
     dependencies:
       '@jridgewell/sourcemap-codec': 1.5.0
 
-  mdn-data@2.0.30: {}
+  make-error@1.3.6:
+    optional: true
 
-  memfs@3.5.3:
-    dependencies:
-      fs-monkey: 1.0.6
+  mdn-data@2.0.30: {}
 
   memoize-weak@1.0.2: {}
 
-  merge-stream@2.0.0: {}
-
   merge2@1.4.1: {}
 
-  micromatch@4.0.5:
-    dependencies:
-      braces: 3.0.3
-      picomatch: 2.3.1
-
   micromatch@4.0.7:
     dependencies:
       braces: 3.0.3
       picomatch: 2.3.1
 
-  mimic-fn@4.0.0: {}
-
   min-indent@1.0.1: {}
 
   minimatch@3.1.2:
     dependencies:
       brace-expansion: 1.1.11
 
-  minimatch@5.1.6:
-    dependencies:
-      brace-expansion: 2.0.1
-
   minimatch@9.0.5:
     dependencies:
       brace-expansion: 2.0.1
@@ -3927,8 +3465,6 @@ snapshots:
 
   mri@1.2.0: {}
 
-  mrmime@1.0.1: {}
-
   mrmime@2.0.0: {}
 
   ms@2.1.2: {}
@@ -3961,14 +3497,6 @@ snapshots:
 
   natural-compare@1.4.0: {}
 
-  node-domexception@1.0.0: {}
-
-  node-fetch@3.3.2:
-    dependencies:
-      data-uri-to-buffer: 4.0.1
-      fetch-blob: 3.2.0
-      formdata-polyfill: 4.0.10
-
   node-gyp-build-optional-packages@5.2.2:
     dependencies:
       detect-libc: 2.0.3
@@ -3983,17 +3511,6 @@ snapshots:
   normalize-url@8.0.1:
     optional: true
 
-  npm-run-path@5.3.0:
-    dependencies:
-      path-key: 4.0.0
-
-  npx-import@1.1.4:
-    dependencies:
-      execa: 6.1.0
-      parse-package-name: 1.0.0
-      semver: 7.6.3
-      validate-npm-package-name: 4.0.0
-
   object-assign@4.1.1: {}
 
   object-hash@3.0.0: {}
@@ -4002,10 +3519,6 @@ snapshots:
     dependencies:
       wrappy: 1.0.2
 
-  onetime@6.0.0:
-    dependencies:
-      mimic-fn: 4.0.0
-
   optionator@0.9.4:
     dependencies:
       deep-is: 0.1.4
@@ -4029,16 +3542,12 @@ snapshots:
     dependencies:
       callsites: 3.1.0
 
-  parse-package-name@1.0.0: {}
-
   path-exists@4.0.0: {}
 
   path-is-absolute@1.0.1: {}
 
   path-key@3.1.1: {}
 
-  path-key@4.0.0: {}
-
   path-parse@1.0.7: {}
 
   path-scurry@1.11.1:
@@ -4074,19 +3583,21 @@ snapshots:
       camelcase-css: 2.0.1
       postcss: 8.4.41
 
-  postcss-load-config@3.1.4(postcss@8.4.41):
+  postcss-load-config@3.1.4(postcss@8.4.41)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)):
     dependencies:
       lilconfig: 2.1.0
       yaml: 1.10.2
     optionalDependencies:
       postcss: 8.4.41
+      ts-node: 10.9.2(@types/node@22.5.0)(typescript@5.5.4)
 
-  postcss-load-config@4.0.2(postcss@8.4.41):
+  postcss-load-config@4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)):
     dependencies:
       lilconfig: 3.1.2
       yaml: 2.5.0
     optionalDependencies:
       postcss: 8.4.41
+      ts-node: 10.9.2(@types/node@22.5.0)(typescript@5.5.4)
 
   postcss-nested@6.2.0(postcss@8.4.41):
     dependencies:
@@ -4144,14 +3655,6 @@ snapshots:
     dependencies:
       picomatch: 2.3.1
 
-  recast@0.23.9:
-    dependencies:
-      ast-types: 0.16.1
-      esprima: 4.0.1
-      source-map: 0.6.1
-      tiny-invariant: 1.3.3
-      tslib: 2.4.0
-
   regenerator-runtime@0.14.1:
     optional: true
 
@@ -4169,10 +3672,6 @@ snapshots:
     dependencies:
       glob: 7.2.3
 
-  rollup@3.29.4:
-    optionalDependencies:
-      fsevents: 2.3.3
-
   rollup@4.21.0:
     dependencies:
       '@types/estree': 1.0.5
@@ -4210,6 +3709,9 @@ snapshots:
       mkdirp: 0.5.6
       rimraf: 2.7.1
 
+  semver@6.3.1:
+    optional: true
+
   semver@7.6.3: {}
 
   set-cookie-parser@2.7.0: {}
@@ -4220,8 +3722,6 @@ snapshots:
 
   shebang-regex@3.0.0: {}
 
-  signal-exit@3.0.7: {}
-
   signal-exit@4.1.0: {}
 
   sirv@2.0.4:
@@ -4230,8 +3730,6 @@ snapshots:
       mrmime: 2.0.0
       totalist: 3.0.1
 
-  sisteransi@1.0.5: {}
-
   slash@3.0.0: {}
 
   sorcery@0.11.1:
@@ -4249,9 +3747,8 @@ snapshots:
       source-map: 0.6.1
     optional: true
 
-  source-map@0.6.1: {}
-
-  streamsearch@1.1.0: {}
+  source-map@0.6.1:
+    optional: true
 
   string-width@4.2.3:
     dependencies:
@@ -4273,8 +3770,6 @@ snapshots:
     dependencies:
       ansi-regex: 6.0.1
 
-  strip-final-newline@3.0.0: {}
-
   strip-indent@3.0.0:
     dependencies:
       min-indent: 1.0.1
@@ -4294,20 +3789,25 @@ snapshots:
   superstruct@2.0.2:
     optional: true
 
+  supports-color@5.5.0:
+    dependencies:
+      has-flag: 3.0.0
+    optional: true
+
   supports-color@7.2.0:
     dependencies:
       has-flag: 4.0.0
 
   supports-preserve-symlinks-flag@1.0.0: {}
 
-  svelte-check@3.8.5(postcss-load-config@4.0.2(postcss@8.4.41))(postcss@8.4.41)(svelte@4.2.18):
+  svelte-check@3.8.5(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)))(postcss@8.4.41)(svelte@4.2.18):
     dependencies:
       '@jridgewell/trace-mapping': 0.3.25
       chokidar: 3.6.0
       picocolors: 1.0.1
       sade: 1.8.1
       svelte: 4.2.18
-      svelte-preprocess: 5.1.4(postcss-load-config@4.0.2(postcss@8.4.41))(postcss@8.4.41)(svelte@4.2.18)(typescript@5.5.4)
+      svelte-preprocess: 5.1.4(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)))(postcss@8.4.41)(svelte@4.2.18)(typescript@5.5.4)
       typescript: 5.5.4
     transitivePeerDependencies:
       - '@babel/core'
@@ -4330,15 +3830,11 @@ snapshots:
     optionalDependencies:
       svelte: 4.2.18
 
-  svelte-hmr@0.15.3(svelte@3.59.2):
-    dependencies:
-      svelte: 3.59.2
-
   svelte-hmr@0.16.0(svelte@4.2.18):
     dependencies:
       svelte: 4.2.18
 
-  svelte-preprocess@5.1.4(postcss-load-config@4.0.2(postcss@8.4.41))(postcss@8.4.41)(svelte@4.2.18)(typescript@5.5.4):
+  svelte-preprocess@5.1.4(@babel/core@7.25.2)(postcss-load-config@4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)))(postcss@8.4.41)(svelte@4.2.18)(typescript@5.5.4):
     dependencies:
       '@types/pug': 2.0.10
       detect-indent: 6.1.0
@@ -4347,12 +3843,11 @@ snapshots:
       strip-indent: 3.0.0
       svelte: 4.2.18
     optionalDependencies:
+      '@babel/core': 7.25.2
       postcss: 8.4.41
-      postcss-load-config: 4.0.2(postcss@8.4.41)
+      postcss-load-config: 4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4))
       typescript: 5.5.4
 
-  svelte@3.59.2: {}
-
   svelte@4.2.18:
     dependencies:
       '@ampproject/remapping': 2.3.0
@@ -4393,7 +3888,7 @@ snapshots:
       zod: 3.23.8
       zod-to-json-schema: 3.23.2(zod@3.23.8)
 
-  tailwindcss@3.4.10:
+  tailwindcss@3.4.10(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4)):
     dependencies:
       '@alloc/quick-lru': 5.2.0
       arg: 5.0.2
@@ -4412,7 +3907,7 @@ snapshots:
       postcss: 8.4.41
       postcss-import: 15.1.0(postcss@8.4.41)
       postcss-js: 4.0.1(postcss@8.4.41)
-      postcss-load-config: 4.0.2(postcss@8.4.41)
+      postcss-load-config: 4.0.2(postcss@8.4.41)(ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4))
       postcss-nested: 6.2.0(postcss@8.4.41)
       postcss-selector-parser: 6.1.2
       resolve: 1.22.8
@@ -4438,9 +3933,8 @@ snapshots:
       globalyzer: 0.1.0
       globrex: 0.1.2
 
-  tiny-invariant@1.3.3: {}
-
-  to-fast-properties@2.0.0: {}
+  to-fast-properties@2.0.0:
+    optional: true
 
   to-regex-range@5.0.1:
     dependencies:
@@ -4462,9 +3956,27 @@ snapshots:
 
   ts-interface-checker@0.1.13: {}
 
-  tslib@2.4.0: {}
+  ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4):
+    dependencies:
+      '@cspotcode/source-map-support': 0.8.1
+      '@tsconfig/node10': 1.0.11
+      '@tsconfig/node12': 1.0.11
+      '@tsconfig/node14': 1.0.3
+      '@tsconfig/node16': 1.0.4
+      '@types/node': 22.5.0
+      acorn: 8.12.1
+      acorn-walk: 8.3.3
+      arg: 4.1.3
+      create-require: 1.1.1
+      diff: 4.0.2
+      make-error: 1.3.6
+      typescript: 5.5.4
+      v8-compile-cache-lib: 3.0.1
+      yn: 3.1.1
+    optional: true
 
-  tslib@2.7.0: {}
+  tslib@2.4.0:
+    optional: true
 
   type-check@0.4.0:
     dependencies:
@@ -4486,13 +3998,8 @@ snapshots:
 
   typescript@5.5.4: {}
 
-  undici-types@6.19.8: {}
-
-  undici@5.28.4:
-    dependencies:
-      '@fastify/busboy': 2.1.1
-
-  universalify@2.0.1: {}
+  undici-types@6.19.8:
+    optional: true
 
   update-browserslist-db@1.1.0(browserslist@4.23.3):
     dependencies:
@@ -4504,39 +4011,20 @@ snapshots:
     dependencies:
       punycode: 2.3.1
 
-  urlpattern-polyfill@10.0.0: {}
-
   util-deprecate@1.0.2: {}
 
+  v8-compile-cache-lib@3.0.1:
+    optional: true
+
   valibot@0.31.1:
     optional: true
 
   valibot@0.35.0:
     optional: true
 
-  validate-npm-package-name@4.0.0:
-    dependencies:
-      builtins: 5.1.0
-
   validator@13.12.0:
     optional: true
 
-  value-or-promise@1.0.12: {}
-
-  vite-plugin-watch-and-run@1.7.0:
-    dependencies:
-      '@kitql/helpers': 0.8.9
-      micromatch: 4.0.5
-
-  vite@4.5.3(@types/node@22.5.0):
-    dependencies:
-      esbuild: 0.18.20
-      postcss: 8.4.41
-      rollup: 3.29.4
-    optionalDependencies:
-      '@types/node': 22.5.0
-      fsevents: 2.3.3
-
   vite@5.4.2(@types/node@22.5.0):
     dependencies:
       esbuild: 0.21.5
@@ -4546,20 +4034,16 @@ snapshots:
       '@types/node': 22.5.0
       fsevents: 2.3.3
 
-  vitefu@0.2.5(vite@4.5.3(@types/node@22.5.0)):
-    optionalDependencies:
-      vite: 4.5.3(@types/node@22.5.0)
-
   vitefu@0.2.5(vite@5.4.2(@types/node@22.5.0)):
     optionalDependencies:
       vite: 5.4.2(@types/node@22.5.0)
 
-  web-streams-polyfill@3.3.3: {}
-
   which@2.0.2:
     dependencies:
       isexe: 2.0.0
 
+  wonka@6.3.4: {}
+
   word-wrap@1.2.5: {}
 
   wrap-ansi@7.0.0:
@@ -4576,10 +4060,16 @@ snapshots:
 
   wrappy@1.0.2: {}
 
+  yallist@3.1.1:
+    optional: true
+
   yaml@1.10.2: {}
 
   yaml@2.5.0: {}
 
+  yn@3.1.1:
+    optional: true
+
   yocto-queue@0.1.0: {}
 
   yup@1.4.0:
diff --git a/src/graphql-env.d.ts b/src/graphql-env.d.ts
new file mode 100644
index 0000000..b241f15
--- /dev/null
+++ b/src/graphql-env.d.ts
@@ -0,0 +1,110 @@
+/* eslint-disable */
+/* prettier-ignore */
+
+export type introspection_types = {
+    'Account': { kind: 'UNION'; name: 'Account'; fields: {}; possibleTypes: 'Group' | 'User'; };
+    'AccountId': { kind: 'INPUT_OBJECT'; name: 'AccountId'; isOneOf: false; inputFields: [{ name: 'id'; type: { kind: 'SCALAR'; name: 'SmolStr'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; defaultValue: null }]; };
+    'Address': { kind: 'OBJECT'; name: 'Address'; fields: { 'accountUuid': { name: 'accountUuid'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; } }; 'country': { name: 'country'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'formatted': { name: 'formatted'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'locality': { name: 'locality'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'name': { name: 'name'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'postalCode': { name: 'postalCode'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'region': { name: 'region'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'streetAddress': { name: 'streetAddress'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; }; };
+    'Base64': unknown;
+    'Boolean': unknown;
+    'BooleanFilter': { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; isOneOf: false; inputFields: [{ name: 'eq'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; }; defaultValue: null }]; };
+    'BuildInfo': { kind: 'OBJECT'; name: 'BuildInfo'; fields: { 'ref': { name: 'ref'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'sha': { name: 'sha'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; }; };
+    'ClaimAccess': { name: 'ClaimAccess'; enumValues: 'CREATE' | 'DELETE' | 'NONE' | 'READ' | 'WRITE'; };
+    'CreateGroup': { kind: 'INPUT_OBJECT'; name: 'CreateGroup'; isOneOf: false; inputFields: [{ name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; }; defaultValue: null }, { name: 'name'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }, { name: 'type'; type: { kind: 'ENUM'; name: 'GroupType'; ofType: null; }; defaultValue: null }]; };
+    'CreateToken': { kind: 'INPUT_OBJECT'; name: 'CreateToken'; isOneOf: false; inputFields: [{ name: 'allowedIps'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; }; defaultValue: null }, { name: 'claims'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'INPUT_OBJECT'; name: 'NewTokenClaim'; ofType: null; }; }; }; defaultValue: null }, { name: 'description'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }, { name: 'globalAccess'; type: { kind: 'ENUM'; name: 'ClaimAccess'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }]; };
+    'CreateTraining': { kind: 'INPUT_OBJECT'; name: 'CreateTraining'; isOneOf: false; inputFields: [{ name: 'fullName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; }; defaultValue: null }, { name: 'name'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }]; };
+    'CreateUnixAccount': { kind: 'INPUT_OBJECT'; name: 'CreateUnixAccount'; isOneOf: false; inputFields: [{ name: 'vhost'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }]; };
+    'CreateUser': { kind: 'INPUT_OBJECT'; name: 'CreateUser'; isOneOf: false; inputFields: [{ name: 'familyName'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }, { name: 'givenName'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }, { name: 'password'; type: { kind: 'INPUT_OBJECT'; name: 'Password'; ofType: null; }; defaultValue: null }, { name: 'promotion'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; }; defaultValue: null }, { name: 'trainingId'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; }; defaultValue: null }]; };
+    'CurrentGroupRole': { name: 'CurrentGroupRole'; enumValues: 'ADMIN' | 'BOARD_MEMBER' | 'MEMBER' | 'OWNER'; };
+    'Date': unknown;
+    'DateTime': unknown;
+    'DateTimeFilter': { kind: 'INPUT_OBJECT'; name: 'DateTimeFilter'; isOneOf: false; inputFields: [{ name: 'eq'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'LocalDateTime'; ofType: null; }; }; }; defaultValue: null }, { name: 'gt'; type: { kind: 'SCALAR'; name: 'LocalDateTime'; ofType: null; }; defaultValue: null }, { name: 'lt'; type: { kind: 'SCALAR'; name: 'LocalDateTime'; ofType: null; }; defaultValue: null }]; };
+    'Float': unknown;
+    'FromNull': { name: 'FromNull'; enumValues: 'BOOLEAN' | 'LIST' | 'NUMBER' | 'OBJECT' | 'STRING'; };
+    'Gender': { name: 'Gender'; enumValues: 'FEMALE' | 'MALE' | 'NON_BINARY' | 'UNKNOWN'; };
+    'GenderFilter': { kind: 'INPUT_OBJECT'; name: 'GenderFilter'; isOneOf: false; inputFields: [{ name: 'isIn'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'Gender'; ofType: null; }; }; }; }; defaultValue: null }]; };
+    'GlobalValues': { kind: 'OBJECT'; name: 'GlobalValues'; fields: { 'evenSemester': { name: 'evenSemester'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'integration': { name: 'integration'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'schoolYear': { name: 'schoolYear'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; }; };
+    'Group': { kind: 'OBJECT'; name: 'Group'; fields: { 'active': { name: 'active'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'backgroundImage': { name: 'backgroundImage'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; } }; 'backgroundImageThumbnailHash': { name: 'backgroundImageThumbnailHash'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Base64'; ofType: null; }; } }; 'createdAt': { name: 'createdAt'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'DateTime'; ofType: null; }; } }; 'description': { name: 'description'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'email': { name: 'email'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'hidden': { name: 'hidden'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'id': { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; } }; 'name': { name: 'name'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'picture': { name: 'picture'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; } }; 'pictureThumbnailHash': { name: 'pictureThumbnailHash'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Base64'; ofType: null; }; } }; 'profile': { name: 'profile'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; } }; 'shortDescription': { name: 'shortDescription'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'type': { name: 'type'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'GroupType'; ofType: null; }; } }; 'unixAccount': { name: 'unixAccount'; type: { kind: 'OBJECT'; name: 'UnixAccount'; ofType: null; } }; 'updatedAt': { name: 'updatedAt'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'DateTime'; ofType: null; }; } }; 'uuid': { name: 'uuid'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; } }; 'website': { name: 'website'; type: { kind: 'SCALAR'; name: 'Url'; ofType: null; } }; }; };
+    'GroupConnection': { kind: 'OBJECT'; name: 'GroupConnection'; fields: { 'edges': { name: 'edges'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'GroupEdge'; ofType: null; }; }; }; } }; 'nodes': { name: 'nodes'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Group'; ofType: null; }; }; }; } }; 'pageInfo': { name: 'pageInfo'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'PageInfo'; ofType: null; }; } }; 'remainingCount': { name: 'remainingCount'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; }; };
+    'GroupEdge': { kind: 'OBJECT'; name: 'GroupEdge'; fields: { 'cursor': { name: 'cursor'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'node': { name: 'node'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Group'; ofType: null; }; } }; 'remainingCount': { name: 'remainingCount'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; }; };
+    'GroupFilter': { kind: 'INPUT_OBJECT'; name: 'GroupFilter'; isOneOf: false; inputFields: [{ name: 'accountUuid'; type: { kind: 'INPUT_OBJECT'; name: 'UuidFilter'; ofType: null; }; defaultValue: null }, { name: 'active'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'createdAt'; type: { kind: 'INPUT_OBJECT'; name: 'DateTimeFilter'; ofType: null; }; defaultValue: null }, { name: 'description'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'email'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'emailVerified'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'hidden'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'name'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'or'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'INPUT_OBJECT'; name: 'GroupFilter'; ofType: null; }; }; }; defaultValue: null }, { name: 'shortDescription'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'type'; type: { kind: 'INPUT_OBJECT'; name: 'GroupTypeFilter'; ofType: null; }; defaultValue: null }, { name: 'unixAccount'; type: { kind: 'INPUT_OBJECT'; name: 'UnixAccountFilter'; ofType: null; }; defaultValue: null }, { name: 'updatedAt'; type: { kind: 'INPUT_OBJECT'; name: 'DateTimeFilter'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'INPUT_OBJECT'; name: 'UuidFilter'; ofType: null; }; defaultValue: null }, { name: 'website'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }]; };
+    'GroupId': { kind: 'INPUT_OBJECT'; name: 'GroupId'; isOneOf: false; inputFields: [{ name: 'email'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'SCALAR'; name: 'SmolStr'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; defaultValue: null }]; };
+    'GroupOfMember': { kind: 'OBJECT'; name: 'GroupOfMember'; fields: { 'group': { name: 'group'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Group'; ofType: null; }; } }; 'isAdmin': { name: 'isAdmin'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'isBoardMember': { name: 'isBoardMember'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'isOwner': { name: 'isOwner'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'role': { name: 'role'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'CurrentGroupRole'; ofType: null; }; } }; 'since': { name: 'since'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; } }; }; };
+    'GroupOfMemberFilter': { kind: 'INPUT_OBJECT'; name: 'GroupOfMemberFilter'; isOneOf: false; inputFields: [{ name: 'role'; type: { kind: 'ENUM'; name: 'CurrentGroupRole'; ofType: null; }; defaultValue: null }, { name: 'since'; type: { kind: 'INPUT_OBJECT'; name: 'NeverDateFilter'; ofType: null; }; defaultValue: null }, { name: 'strictRole'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; }; defaultValue: "false" }]; };
+    'GroupRole': { name: 'GroupRole'; enumValues: 'ADMIN' | 'BOARD_MEMBER' | 'GONE' | 'MEMBER' | 'OWNER'; };
+    'GroupType': { name: 'GroupType'; enumValues: 'ASSOCIATION' | 'CLUB' | 'COMMISSION' | 'HOME' | 'LIST' | 'OTHER' | 'UNKNOWN'; };
+    'GroupTypeFilter': { kind: 'INPUT_OBJECT'; name: 'GroupTypeFilter'; isOneOf: false; inputFields: [{ name: 'isIn'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'GroupType'; ofType: null; }; }; }; }; defaultValue: null }]; };
+    'Health': { kind: 'OBJECT'; name: 'Health'; fields: { 'db': { name: 'db'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; }; };
+    'HistoricalGroupOfMember': { kind: 'OBJECT'; name: 'HistoricalGroupOfMember'; fields: { 'group': { name: 'group'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Group'; ofType: null; }; } }; 'role': { name: 'role'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'GroupRole'; ofType: null; }; } }; 'since': { name: 'since'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; } }; }; };
+    'HistoricalGroupOfMemberFilter': { kind: 'INPUT_OBJECT'; name: 'HistoricalGroupOfMemberFilter'; isOneOf: false; inputFields: [{ name: 'role'; type: { kind: 'ENUM'; name: 'GroupRole'; ofType: null; }; defaultValue: null }, { name: 'since'; type: { kind: 'INPUT_OBJECT'; name: 'NeverDateFilter'; ofType: null; }; defaultValue: null }, { name: 'strictRole'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; }; defaultValue: "false" }]; };
+    'HistoricalMemberOfGroup': { kind: 'OBJECT'; name: 'HistoricalMemberOfGroup'; fields: { 'role': { name: 'role'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'GroupRole'; ofType: null; }; } }; 'since': { name: 'since'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; } }; 'user': { name: 'user'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'User'; ofType: null; }; } }; }; };
+    'Identifier': unknown;
+    'Int': unknown;
+    'Int16Filter': { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; isOneOf: false; inputFields: [{ name: 'eq'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; }; }; defaultValue: null }, { name: 'gt'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'lt'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }]; };
+    'LevenshteinFilter': { kind: 'INPUT_OBJECT'; name: 'LevenshteinFilter'; isOneOf: false; inputFields: [{ name: 'threshold'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'value'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }]; };
+    'LocalDateTime': unknown;
+    'Mutation': { kind: 'OBJECT'; name: 'Mutation'; fields: { 'addClaims': { name: 'addClaims'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Token'; ofType: null; }; } }; 'addGroupMemberRole': { name: 'addGroupMemberRole'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'HistoricalMemberOfGroup'; ofType: null; }; } }; 'copyClaims': { name: 'copyClaims'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Token'; ofType: null; }; } }; 'createGroup': { name: 'createGroup'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Group'; ofType: null; }; } }; 'createGroupUnixAccount': { name: 'createGroupUnixAccount'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'UnixAccount'; ofType: null; }; } }; 'createToken': { name: 'createToken'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'PlainToken'; ofType: null; }; } }; 'createTraining': { name: 'createTraining'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Training'; ofType: null; }; } }; 'createUser': { name: 'createUser'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'User'; ofType: null; }; } }; 'createUserUnixAccount': { name: 'createUserUnixAccount'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'UnixAccount'; ofType: null; }; } }; 'deleteClaims': { name: 'deleteClaims'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Token'; ofType: null; }; } }; 'deleteGroup': { name: 'deleteGroup'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'deleteToken': { name: 'deleteToken'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'deleteTraining': { name: 'deleteTraining'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'deleteUser': { name: 'deleteUser'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'endOfIntegration': { name: 'endOfIntegration'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'evenSemester': { name: 'evenSemester'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'newYear': { name: 'newYear'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'regenerateToken': { name: 'regenerateToken'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'PlainToken'; ofType: null; }; } }; 'status': { name: 'status'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'updateGroup': { name: 'updateGroup'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Group'; ofType: null; }; } }; 'updateToken': { name: 'updateToken'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Token'; ofType: null; }; } }; 'updateTraining': { name: 'updateTraining'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Training'; ofType: null; }; } }; 'updateUnixAccount': { name: 'updateUnixAccount'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'UnixAccount'; ofType: null; }; } }; 'updateUser': { name: 'updateUser'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'User'; ofType: null; }; } }; }; };
+    'NeverDateFilter': { kind: 'INPUT_OBJECT'; name: 'NeverDateFilter'; isOneOf: false; inputFields: [{ name: 'eq'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; }; }; defaultValue: null }, { name: 'gt'; type: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; defaultValue: null }, { name: 'lt'; type: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; defaultValue: null }]; };
+    'NewTokenClaim': { kind: 'INPUT_OBJECT'; name: 'NewTokenClaim'; isOneOf: false; inputFields: [{ name: 'access'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'ClaimAccess'; ofType: null; }; }; defaultValue: null }, { name: 'claim'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }]; };
+    'NullableDateFilter': { kind: 'INPUT_OBJECT'; name: 'NullableDateFilter'; isOneOf: false; inputFields: [{ name: 'day'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'eq'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; }; }; defaultValue: null }, { name: 'gt'; type: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; defaultValue: null }, { name: 'lt'; type: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; defaultValue: null }, { name: 'month'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'null'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }]; };
+    'NullableDateTimeFilter': { kind: 'INPUT_OBJECT'; name: 'NullableDateTimeFilter'; isOneOf: false; inputFields: [{ name: 'eq'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'LocalDateTime'; ofType: null; }; }; }; defaultValue: null }, { name: 'gt'; type: { kind: 'SCALAR'; name: 'LocalDateTime'; ofType: null; }; defaultValue: null }, { name: 'lt'; type: { kind: 'SCALAR'; name: 'LocalDateTime'; ofType: null; }; defaultValue: null }, { name: 'null'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }]; };
+    'NullableFilter': { kind: 'INPUT_OBJECT'; name: 'NullableFilter'; isOneOf: false; inputFields: [{ name: 'null'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }]; };
+    'NullableTextFilter': { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; isOneOf: false; inputFields: [{ name: 'levenshtein'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'INPUT_OBJECT'; name: 'LevenshteinFilter'; ofType: null; }; }; }; defaultValue: null }, { name: 'like'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; }; defaultValue: null }, { name: 'notLike'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; }; defaultValue: null }, { name: 'null'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'similar'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'INPUT_OBJECT'; name: 'SimilarFilter'; ofType: null; }; }; }; defaultValue: null }]; };
+    'OrderByGroup': { name: 'OrderByGroup'; enumValues: 'CREATED_AT' | 'ID' | 'NAME' | 'UPDATED_AT' | 'UUID'; };
+    'OrderByUser': { name: 'OrderByUser'; enumValues: 'BIRTH_DATE' | 'CREATED_AT' | 'FAMILY_NAME' | 'GIVEN_NAME' | 'ID' | 'LAST_USED_AT' | 'NICKNAME' | 'PROMOTION' | 'UPDATED_AT' | 'UUID' | 'YEAR'; };
+    'PageInfo': { kind: 'OBJECT'; name: 'PageInfo'; fields: { 'endCursor': { name: 'endCursor'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'hasNextPage': { name: 'hasNextPage'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'hasPreviousPage': { name: 'hasPreviousPage'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'startCursor': { name: 'startCursor'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; }; };
+    'Password': { kind: 'INPUT_OBJECT'; name: 'Password'; isOneOf: false; inputFields: [{ name: 'hash'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'plain'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }]; };
+    'PlainToken': { kind: 'OBJECT'; name: 'PlainToken'; fields: { 'base64': { name: 'base64'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'raw': { name: 'raw'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; }; };
+    'Query': { kind: 'OBJECT'; name: 'Query'; fields: { 'account': { name: 'account'; type: { kind: 'UNION'; name: 'Account'; ofType: null; } }; 'buildInfo': { name: 'buildInfo'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'BuildInfo'; ofType: null; }; } }; 'currentToken': { name: 'currentToken'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Token'; ofType: null; }; } }; 'globalsValues': { name: 'globalsValues'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'GlobalValues'; ofType: null; }; } }; 'group': { name: 'group'; type: { kind: 'OBJECT'; name: 'Group'; ofType: null; } }; 'groups': { name: 'groups'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'GroupConnection'; ofType: null; }; } }; 'health': { name: 'health'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Health'; ofType: null; }; } }; 'oAuthAppOwner': { name: 'oAuthAppOwner'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'UNION'; name: 'Account'; ofType: null; }; } }; 'token': { name: 'token'; type: { kind: 'OBJECT'; name: 'Token'; ofType: null; } }; 'tokens': { name: 'tokens'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Token'; ofType: null; }; }; }; } }; 'trainings': { name: 'trainings'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Training'; ofType: null; }; }; }; } }; 'user': { name: 'user'; type: { kind: 'OBJECT'; name: 'User'; ofType: null; } }; 'users': { name: 'users'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'UserConnection'; ofType: null; }; } }; }; };
+    'SimilarFilter': { kind: 'INPUT_OBJECT'; name: 'SimilarFilter'; isOneOf: false; inputFields: [{ name: 'threshold'; type: { kind: 'SCALAR'; name: 'Float'; ofType: null; }; defaultValue: null }, { name: 'value'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; defaultValue: null }]; };
+    'SmolStr': unknown;
+    'String': unknown;
+    'TextFilter': { kind: 'INPUT_OBJECT'; name: 'TextFilter'; isOneOf: false; inputFields: [{ name: 'levenshtein'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'INPUT_OBJECT'; name: 'LevenshteinFilter'; ofType: null; }; }; }; defaultValue: null }, { name: 'like'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; }; defaultValue: null }, { name: 'notLike'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; }; defaultValue: null }, { name: 'similar'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'INPUT_OBJECT'; name: 'SimilarFilter'; ofType: null; }; }; }; defaultValue: null }]; };
+    'Token': { kind: 'OBJECT'; name: 'Token'; fields: { 'allowedIps': { name: 'allowedIps'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; }; } }; 'claims': { name: 'claims'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'TokenClaim'; ofType: null; }; }; }; } }; 'description': { name: 'description'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'globalAccess': { name: 'globalAccess'; type: { kind: 'ENUM'; name: 'ClaimAccess'; ofType: null; } }; 'id': { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'tokenHash': { name: 'tokenHash'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'uuid': { name: 'uuid'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; } }; }; };
+    'TokenClaim': { kind: 'OBJECT'; name: 'TokenClaim'; fields: { 'access': { name: 'access'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'ClaimAccess'; ofType: null; }; } }; 'claim': { name: 'claim'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; }; };
+    'TokenId': { kind: 'INPUT_OBJECT'; name: 'TokenId'; isOneOf: false; inputFields: [{ name: 'globalAccess'; type: { kind: 'ENUM'; name: 'ClaimAccess'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'SCALAR'; name: 'SmolStr'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; defaultValue: null }]; };
+    'Training': { kind: 'OBJECT'; name: 'Training'; fields: { 'fullName': { name: 'fullName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'id': { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; } }; 'name': { name: 'name'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'uuid': { name: 'uuid'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; } }; }; };
+    'TrainingId': { kind: 'INPUT_OBJECT'; name: 'TrainingId'; isOneOf: false; inputFields: [{ name: 'id'; type: { kind: 'SCALAR'; name: 'SmolStr'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; defaultValue: null }]; };
+    'UUID': unknown;
+    'UnixAccount': { kind: 'OBJECT'; name: 'UnixAccount'; fields: { 'accountUuid': { name: 'accountUuid'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; } }; 'uid': { name: 'uid'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'vhost': { name: 'vhost'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'website': { name: 'website'; type: { kind: 'SCALAR'; name: 'Url'; ofType: null; } }; }; };
+    'UnixAccountFilter': { kind: 'INPUT_OBJECT'; name: 'UnixAccountFilter'; isOneOf: false; inputFields: [{ name: 'null'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'uid'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'INPUT_OBJECT'; name: 'UuidFilter'; ofType: null; }; defaultValue: null }, { name: 'vhost'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }]; };
+    'UnixAccountId': { kind: 'INPUT_OBJECT'; name: 'UnixAccountId'; isOneOf: false; inputFields: [{ name: 'uid'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; defaultValue: null }]; };
+    'UpdateGroup': { kind: 'INPUT_OBJECT'; name: 'UpdateGroup'; isOneOf: false; inputFields: [{ name: 'active'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'description'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'email'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'emailVerified'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'hidden'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; defaultValue: null }, { name: 'name'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'shortDescription'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'type'; type: { kind: 'ENUM'; name: 'GroupType'; ofType: null; }; defaultValue: null }, { name: 'website'; type: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; defaultValue: null }]; };
+    'UpdateToken': { kind: 'INPUT_OBJECT'; name: 'UpdateToken'; isOneOf: false; inputFields: [{ name: 'allowedIps'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; }; }; defaultValue: null }, { name: 'description'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }]; };
+    'UpdateTraining': { kind: 'INPUT_OBJECT'; name: 'UpdateTraining'; isOneOf: false; inputFields: [{ name: 'fullName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'name'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }]; };
+    'UpdateUnixAccount': { kind: 'INPUT_OBJECT'; name: 'UpdateUnixAccount'; isOneOf: false; inputFields: [{ name: 'uid'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'vhost'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }]; };
+    'UpdateUser': { kind: 'INPUT_OBJECT'; name: 'UpdateUser'; isOneOf: false; inputFields: [{ name: 'aeiieMember'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'birthdate'; type: { kind: 'SCALAR'; name: 'Date'; ofType: null; }; defaultValue: null }, { name: 'diplomaYearDuration'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'email'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'emailVerified'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'extendedTrialPeriod'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'familyName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'gapYear'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'gender'; type: { kind: 'ENUM'; name: 'Gender'; ofType: null; }; defaultValue: null }, { name: 'givenNameAtBirth'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'givenNameInUse'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'hidden'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; defaultValue: null }, { name: 'initialPromotion'; type: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; defaultValue: null }, { name: 'lastUsedAt'; type: { kind: 'SCALAR'; name: 'LocalDateTime'; ofType: null; }; defaultValue: null }, { name: 'locale'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'middleName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'nickname'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'password'; type: { kind: 'INPUT_OBJECT'; name: 'Password'; ofType: null; }; defaultValue: null }, { name: 'phoneNumber'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'phoneNumberVerified'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'public'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'schoolLogin'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'suspended'; type: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; defaultValue: null }, { name: 'trainingId'; type: { kind: 'SCALAR'; name: 'SmolStr'; ofType: null; }; defaultValue: null }, { name: 'website'; type: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; defaultValue: null }, { name: 'zoneinfo'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }]; };
+    'Url': unknown;
+    'Urn': unknown;
+    'User': { kind: 'OBJECT'; name: 'User'; fields: { 'address': { name: 'address'; type: { kind: 'OBJECT'; name: 'Address'; ofType: null; } }; 'aeiieMember': { name: 'aeiieMember'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'backgroundImage': { name: 'backgroundImage'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; } }; 'backgroundImageThumbnailHash': { name: 'backgroundImageThumbnailHash'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Base64'; ofType: null; }; } }; 'birthdate': { name: 'birthdate'; type: { kind: 'SCALAR'; name: 'Date'; ofType: null; } }; 'civilName': { name: 'civilName'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'createdAt': { name: 'createdAt'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'DateTime'; ofType: null; }; } }; 'diplomaYearDuration': { name: 'diplomaYearDuration'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'email': { name: 'email'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'emailForwardAddress': { name: 'emailForwardAddress'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'emailVerified': { name: 'emailVerified'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'extendedTrialPeriod': { name: 'extendedTrialPeriod'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'familyName': { name: 'familyName'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'forenames': { name: 'forenames'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'gapYear': { name: 'gapYear'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'gender': { name: 'gender'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'ENUM'; name: 'Gender'; ofType: null; }; } }; 'givenName': { name: 'givenName'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'givenNameAtBirth': { name: 'givenNameAtBirth'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'givenNameInUse': { name: 'givenNameInUse'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'group': { name: 'group'; type: { kind: 'OBJECT'; name: 'GroupOfMember'; ofType: null; } }; 'groupHistory': { name: 'groupHistory'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'HistoricalGroupOfMember'; ofType: null; }; }; }; } }; 'groups': { name: 'groups'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'GroupOfMember'; ofType: null; }; }; }; } }; 'hidden': { name: 'hidden'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'id': { name: 'id'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Identifier'; ofType: null; }; } }; 'initialPromotion': { name: 'initialPromotion'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'lastUsedAt': { name: 'lastUsedAt'; type: { kind: 'SCALAR'; name: 'DateTime'; ofType: null; } }; 'locale': { name: 'locale'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'middleName': { name: 'middleName'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'name': { name: 'name'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'nickname': { name: 'nickname'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'oAuthGroup': { name: 'oAuthGroup'; type: { kind: 'OBJECT'; name: 'GroupOfMember'; ofType: null; } }; 'passwordHash': { name: 'passwordHash'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'phoneNumber': { name: 'phoneNumber'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; } }; 'phoneNumberVerified': { name: 'phoneNumberVerified'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'photo': { name: 'photo'; type: { kind: 'SCALAR'; name: 'Url'; ofType: null; } }; 'photoThumbnailHash': { name: 'photoThumbnailHash'; type: { kind: 'SCALAR'; name: 'Base64'; ofType: null; } }; 'picture': { name: 'picture'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; } }; 'pictureThumbnailHash': { name: 'pictureThumbnailHash'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Base64'; ofType: null; }; } }; 'preferredNickname': { name: 'preferredNickname'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'preferredUsername': { name: 'preferredUsername'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'profile': { name: 'profile'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Url'; ofType: null; }; } }; 'promotion': { name: 'promotion'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'restrictedAccess': { name: 'restrictedAccess'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'schoolEmail': { name: 'schoolEmail'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'schoolLogin': { name: 'schoolLogin'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'semester': { name: 'semester'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'suspended': { name: 'suspended'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Boolean'; ofType: null; }; } }; 'training': { name: 'training'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'Training'; ofType: null; }; } }; 'trialPeriodDaysLeft': { name: 'trialPeriodDaysLeft'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'unixAccount': { name: 'unixAccount'; type: { kind: 'OBJECT'; name: 'UnixAccount'; ofType: null; } }; 'updatedAt': { name: 'updatedAt'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'DateTime'; ofType: null; }; } }; 'uuid': { name: 'uuid'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; } }; 'website': { name: 'website'; type: { kind: 'SCALAR'; name: 'Url'; ofType: null; } }; 'year': { name: 'year'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; 'zoneinfo': { name: 'zoneinfo'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; }; };
+    'UserConnection': { kind: 'OBJECT'; name: 'UserConnection'; fields: { 'edges': { name: 'edges'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'UserEdge'; ofType: null; }; }; }; } }; 'nodes': { name: 'nodes'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'User'; ofType: null; }; }; }; } }; 'pageInfo': { name: 'pageInfo'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'PageInfo'; ofType: null; }; } }; 'remainingCount': { name: 'remainingCount'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; }; };
+    'UserEdge': { kind: 'OBJECT'; name: 'UserEdge'; fields: { 'cursor': { name: 'cursor'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'String'; ofType: null; }; } }; 'node': { name: 'node'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'OBJECT'; name: 'User'; ofType: null; }; } }; 'remainingCount': { name: 'remainingCount'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'Int'; ofType: null; }; } }; }; };
+    'UserFilter': { kind: 'INPUT_OBJECT'; name: 'UserFilter'; isOneOf: false; inputFields: [{ name: 'accountUuid'; type: { kind: 'INPUT_OBJECT'; name: 'UuidFilter'; ofType: null; }; defaultValue: null }, { name: 'aeiieMember'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'backgroundThumbnailHash'; type: { kind: 'INPUT_OBJECT'; name: 'NullableFilter'; ofType: null; }; defaultValue: null }, { name: 'birthdate'; type: { kind: 'INPUT_OBJECT'; name: 'NullableDateFilter'; ofType: null; }; defaultValue: null }, { name: 'createdAt'; type: { kind: 'INPUT_OBJECT'; name: 'DateTimeFilter'; ofType: null; }; defaultValue: null }, { name: 'diplomaYearDuration'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'email'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'emailVerified'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'extendedTrialPeriod'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'familyName'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'gapYear'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'gender'; type: { kind: 'INPUT_OBJECT'; name: 'GenderFilter'; ofType: null; }; defaultValue: null }, { name: 'givenName'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'givenNameAtBirth'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'givenNameInUse'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'groups'; type: { kind: 'INPUT_OBJECT'; name: 'UserGroupsFilter'; ofType: null; }; defaultValue: null }, { name: 'hidden'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'initialPromotion'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'lastUsedAt'; type: { kind: 'INPUT_OBJECT'; name: 'NullableDateTimeFilter'; ofType: null; }; defaultValue: null }, { name: 'locale'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'middleName'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'nickname'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'or'; type: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'INPUT_OBJECT'; name: 'UserFilter'; ofType: null; }; }; }; defaultValue: null }, { name: 'phoneNumber'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'phoneNumberVerified'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'photoThumbnailHash'; type: { kind: 'INPUT_OBJECT'; name: 'NullableFilter'; ofType: null; }; defaultValue: null }, { name: 'pictureThumbnailHash'; type: { kind: 'INPUT_OBJECT'; name: 'NullableFilter'; ofType: null; }; defaultValue: null }, { name: 'promotion'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'public'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'restrictedAccess'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'schoolLogin'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'semester'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'suspended'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'training'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'trialPeriodDaysLeft'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'unixAccount'; type: { kind: 'INPUT_OBJECT'; name: 'UnixAccountFilter'; ofType: null; }; defaultValue: null }, { name: 'updatedAt'; type: { kind: 'INPUT_OBJECT'; name: 'DateTimeFilter'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'INPUT_OBJECT'; name: 'UuidFilter'; ofType: null; }; defaultValue: null }, { name: 'website'; type: { kind: 'INPUT_OBJECT'; name: 'NullableTextFilter'; ofType: null; }; defaultValue: null }, { name: 'year'; type: { kind: 'INPUT_OBJECT'; name: 'Int16Filter'; ofType: null; }; defaultValue: null }, { name: 'zoneinfo'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }]; };
+    'UserGroupsFilter': { kind: 'INPUT_OBJECT'; name: 'UserGroupsFilter'; isOneOf: false; inputFields: [{ name: 'active'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'hidden'; type: { kind: 'INPUT_OBJECT'; name: 'BooleanFilter'; ofType: null; }; defaultValue: null }, { name: 'id'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'name'; type: { kind: 'INPUT_OBJECT'; name: 'TextFilter'; ofType: null; }; defaultValue: null }, { name: 'type'; type: { kind: 'INPUT_OBJECT'; name: 'GroupTypeFilter'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'INPUT_OBJECT'; name: 'UuidFilter'; ofType: null; }; defaultValue: null }]; };
+    'UserId': { kind: 'INPUT_OBJECT'; name: 'UserId'; isOneOf: false; inputFields: [{ name: 'id'; type: { kind: 'SCALAR'; name: 'SmolStr'; ofType: null; }; defaultValue: null }, { name: 'personalEmail'; type: { kind: 'SCALAR'; name: 'String'; ofType: null; }; defaultValue: null }, { name: 'urn'; type: { kind: 'SCALAR'; name: 'Urn'; ofType: null; }; defaultValue: null }, { name: 'uuid'; type: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; defaultValue: null }]; };
+    'UuidFilter': { kind: 'INPUT_OBJECT'; name: 'UuidFilter'; isOneOf: false; inputFields: [{ name: 'isIn'; type: { kind: 'NON_NULL'; name: never; ofType: { kind: 'LIST'; name: never; ofType: { kind: 'NON_NULL'; name: never; ofType: { kind: 'SCALAR'; name: 'UUID'; ofType: null; }; }; }; }; defaultValue: null }]; };
+};
+
+/** An IntrospectionQuery representation of your schema.
+ *
+ * @remarks
+ * This is an introspection of your schema saved as a file by GraphQLSP.
+ * It will automatically be used by `gql.tada` to infer the types of your GraphQL documents.
+ * If you need to reuse this data or update your `scalars`, update `tadaOutputLocation` to
+ * instead save to a .ts instead of a .d.ts file.
+ */
+export type introspection = {
+	name: never;
+	query: 'Query';
+	mutation: 'Mutation';
+	subscription: never;
+	types: introspection_types;
+};
+
+import * as gqlTada from 'gql.tada';
+
+declare module 'gql.tada' {
+	interface setupSchema {
+		introspection: introspection;
+	}
+}
diff --git a/src/lib/data.ts b/src/lib/data.ts
index e482317..73d4339 100644
--- a/src/lib/data.ts
+++ b/src/lib/data.ts
@@ -1,6 +1,6 @@
-import { GetPromotionStore } from '$houdini';
 import { pageIterator } from '$lib/graphql/query';
-import type { RequestEvent } from '@sveltejs/kit';
+import { client } from './graphql';
+import { PROMOTION_QUERY, USER_DETAILS_QUERY } from './graphql/queries';
 
 type UserId = string;
 type PromoCache = {
@@ -12,39 +12,53 @@ const cache = new Map<number, PromoCache>();
 // 1 hour
 const CACHE_DURATION_MS = 1000 * 60 * 60;
 
-async function fetchPromotion(promotion: number, event: RequestEvent): Promise<PromoCache> {
-	const array = await Array.fromAsync(pageIterator(GetPromotionStore, { promotion }, event));
+async function cacheImages(users: UserId[]): Promise<void> {
+	for (const user of users) {
+		const response = await client.query(USER_DETAILS_QUERY, { idList: [user] });
+
+		if (response.error) {
+			throw response.error;
+		}
+
+		const url = response.data?.page.nodes[0].photo;
+		if (!url) continue;
+		await fetch(url, { method: 'HEAD' });
+	}
+}
+
+async function fetchPromotion(promotion: number): Promise<PromoCache> {
+	const array = await Array.fromAsync(pageIterator(PROMOTION_QUERY, { promotion }));
+	const users = array.map((node) => node.id);
+
+	// background task
+	cacheImages(users);
+
 	return {
 		lastUpdateMs: new Date().getTime(),
-		promo: new Set(array.map((node) => node.id))
+		promo: new Set(users)
 	};
 }
 
-export async function getPromotion(promo: number, event: RequestEvent): Promise<Set<UserId>> {
+export async function getPromotion(promo: number): Promise<Set<UserId>> {
 	if (cache.has(promo)) {
 		const data = cache.get(promo)!;
 		if (new Date().getTime() - data.lastUpdateMs < CACHE_DURATION_MS) return data.promo;
 	}
-	const freshData = await fetchPromotion(promo, event);
+	const freshData = await fetchPromotion(promo);
 	cache.set(promo, freshData);
 	return freshData.promo;
 }
 
 export async function* promotionIterator(
 	min: number,
-	max: number,
-	event: RequestEvent
+	max: number
 ): AsyncGenerator<UserId, void, undefined> {
 	for (let i = min; i <= max; i++) {
-		const promo = await getPromotion(i, event);
+		const promo = await getPromotion(i);
 		yield* promo;
 	}
 }
 
-export function getPromotionRange(
-	min: number,
-	max: number,
-	event: RequestEvent
-): Promise<Set<UserId>> {
-	return Array.fromAsync(promotionIterator(min, max, event)).then((array) => new Set(array));
+export function getPromotionRange(min: number, max: number): Promise<Set<UserId>> {
+	return Array.fromAsync(promotionIterator(min, max)).then((array) => new Set(array));
 }
diff --git a/src/lib/graphql/client.ts b/src/lib/graphql/client.ts
index e422bf9..3de9bd7 100644
--- a/src/lib/graphql/client.ts
+++ b/src/lib/graphql/client.ts
@@ -1,13 +1,12 @@
 import env from '$lib/env';
-import { HoudiniClient } from '$houdini';
+import { Client, cacheExchange, fetchExchange } from '@urql/core';
 
-export default new HoudiniClient({
+export const client = new Client({
 	url: `${env.API_ORIGIN}/graphql/v0`,
-	fetchParams() {
-		return {
-			headers: {
-				Authorization: `Basic ${env.API_TOKEN}`
-			}
-		};
+	exchanges: [cacheExchange, fetchExchange],
+	fetchOptions: {
+		headers: {
+			Authorization: `Basic ${env.API_TOKEN}`
+		}
 	}
 });
diff --git a/src/lib/graphql/index.ts b/src/lib/graphql/index.ts
new file mode 100644
index 0000000..0b2e1ba
--- /dev/null
+++ b/src/lib/graphql/index.ts
@@ -0,0 +1,14 @@
+import { initGraphQLTada } from 'gql.tada';
+import type { introspection } from '../../graphql-env.d.ts';
+
+export const graphql = initGraphQLTada<{
+	introspection: introspection;
+	scalars: {
+		Identifier: string;
+		Base64: string;
+		Url: string;
+	};
+}>();
+
+export { readFragment } from 'gql.tada';
+export { client } from './client';
diff --git a/src/lib/graphql/queries.ts b/src/lib/graphql/queries.ts
new file mode 100644
index 0000000..d568967
--- /dev/null
+++ b/src/lib/graphql/queries.ts
@@ -0,0 +1,32 @@
+import { graphql } from '.';
+
+export const PROMOTION_QUERY = graphql(`
+	query GetPromotion($first: Int!, $after: String, $promotion: Int!) {
+		page: users(
+			first: $first
+			after: $after
+			filter: { promotion: { eq: [$promotion] }, nickname: { null: false } }
+		) {
+			pageInfo {
+				endCursor
+				hasNextPage
+			}
+			nodes {
+				id
+			}
+		}
+	}
+`);
+
+export const USER_DETAILS_QUERY = graphql(`
+	query UserDetails($first: Int = 4, $idList: [String!]!) {
+		page: users(first: $first, filter: { id: { like: $idList } }) {
+			nodes {
+				id
+				nickname
+				photo
+				photoThumbnailHash
+			}
+		}
+	}
+`);
diff --git a/src/lib/graphql/queries/promo.gql b/src/lib/graphql/queries/promo.gql
deleted file mode 100644
index a24a18c..0000000
--- a/src/lib/graphql/queries/promo.gql
+++ /dev/null
@@ -1,15 +0,0 @@
-query GetPromotion($first: Int!, $after: String, $promotion: Int!) {
-	page: users(
-		first: $first
-		after: $after
-		filter: { promotion: { eq: [$promotion] }, nickname: { null: false } }
-	) {
-		pageInfo {
-			endCursor
-			hasNextPage
-		}
-		nodes {
-			id
-		}
-	}
-}
diff --git a/src/lib/graphql/queries/user_details.gql b/src/lib/graphql/queries/user_details.gql
deleted file mode 100644
index 78ab2e4..0000000
--- a/src/lib/graphql/queries/user_details.gql
+++ /dev/null
@@ -1,10 +0,0 @@
-query UserDetails($first: Int = 4, $idList: [String!]!) {
-	page: users(first: $first, filter: { id: { like: $idList } }) {
-		nodes {
-			id
-			nickname
-			photo
-			photoThumbnailHash
-		}
-	}
-}
diff --git a/src/lib/graphql/query.ts b/src/lib/graphql/query.ts
index b6dac16..c8d69de 100644
--- a/src/lib/graphql/query.ts
+++ b/src/lib/graphql/query.ts
@@ -1,5 +1,5 @@
-import type { GraphQLValue, GraphQLVariables, QueryResult, QueryStore } from '$houdini';
-import type { RequestEvent } from '@sveltejs/kit';
+import { client } from '$lib/graphql';
+import type { DocumentInput } from '@urql/core';
 
 type Page<T> = {
 	page: {
@@ -11,37 +11,32 @@ type Page<T> = {
 	};
 };
 
-type NodeType<T> = T extends Page<infer U> ? U : never;
-
 interface PageArgs {
 	first: number;
-	after: string | null | undefined;
+	after: string | null;
 }
 
-export async function* pageIterator<
-	Data extends Page<GraphQLValue>,
-	Input extends PageArgs | GraphQLVariables
->(
-	queryStore: new () => QueryStore<Data, Input>,
-	variables: Omit<Input, 'first' | 'after'>,
-	event: RequestEvent,
+export async function* pageIterator<T, Variables extends PageArgs>(
+	query: DocumentInput<Page<T>, Variables>,
+	variables: Omit<Variables, 'first' | 'after'>,
 	pageSize = 100
-): AsyncGenerator<NodeType<Data>, void, undefined> {
-	const store = new queryStore();
+): AsyncGenerator<T, void, undefined> {
 	let cursor: string | null = null;
 	let hasNextPage = true;
 
 	while (hasNextPage) {
-		const result: QueryResult<Data, Input> = await store.fetch({
-			event,
-			variables: { first: pageSize, after: cursor, ...variables } as Input
-		});
+		const result = await client
+			.query(query, { first: pageSize, after: cursor, ...variables } as Variables)
+			.toPromise();
 
-		if (result.errors) {
-			throw result.errors;
+		if (result.error) {
+			throw result.error;
 		}
-		yield* (result.data?.page.nodes as NodeType<Data>[]) ?? [];
-		cursor = result.data?.page.pageInfo.endCursor ?? null;
-		hasNextPage = !!result.data?.page.pageInfo.hasNextPage;
+		const page: Page<T>['page'] | undefined = result.data?.page;
+		if (!page) return;
+
+		yield* page.nodes ?? [];
+		cursor = page.pageInfo.endCursor ?? null;
+		hasNextPage = page.pageInfo.hasNextPage;
 	}
 }
diff --git a/src/lib/graphql/schema.gql b/src/lib/graphql/schema.gql
index b601941..e5981e2 100644
--- a/src/lib/graphql/schema.gql
+++ b/src/lib/graphql/schema.gql
@@ -17,140 +17,170 @@ Indicates that an Input Object is a OneOf Input Object (and thus requires
 """
 directive @oneOf on INPUT_OBJECT
 
-union Account = Group | User
+union Account = User | Group
 
 input AccountId {
-  id: SmolStr
-  uuid: UUID
+	uuid: UUID
+	id: SmolStr
 }
 
 type Address {
-  """
-  # **ADMIN ONLY**
-  ## UUID interne de l'adresse
-  
-  Par exemple, `72c612f8-1d07-432e-8f71-60584be51f40`
-  """
-  accountUuid: UUID!
-
-  """## Pays de l'adresse"""
-  country: String!
-
-  """
-  ## Adresse postale complète de l'adresse
-  Formatée pour être affichée ou utilisée sur une étiquette d'envoi.
-  Ce champ PEUT contenir plusieurs lignes, séparées par des retours à la ligne.
-  Les nouvelles lignes peuvent être représentées soit par une paire retour
-  chariot/saut de ligne ("\r\n"), soit par un seul caractère de saut de ligne ("\n").
-  """
-  formatted: String!
-
-  """## Ville ou localité de l'adresse"""
-  locality: String!
-
-  """
-  ## Nom de l'adresse
-  Le nom usuel de l'adresse s'il existe. Limite de **64** caractères.
-  
-  Par exemple, `Pyroloc` ou `Résidence "Les Estudines du Parc"`.
-  """
-  name: String
-
-  """## Code postal de l'adresse"""
-  postalCode: String!
-
-  """
-  ## Région de l'adresse
-  Province, de la préfecture ou région.
-  """
-  region: String
-
-  """
-  ## Rue de l'adresse
-  Composante complète de l'adresse de la rue, qui PEUT inclure le numéro de la maison,
-  le nom de la rue, la boîte postale et des informations sur plusieurs lignes concernant
-  l'adresse de la rue. Ce champ PEUT contenir plusieurs lignes, séparées par des retours
-  à la ligne. Les nouvelles lignes peuvent être représentées soit par une paire retour
-  chariot/saut de ligne ("\r\n"), soit par un seul caractère de saut de ligne ("\n").
-  """
-  streetAddress: String!
-}
-
-"""Base64 [RFC4648](https://www.rfc-editor.org/rfc/rfc4648)"""
+	"""
+	# **ADMIN ONLY**
+	## UUID interne de l'adresse
+
+	Par exemple, `72c612f8-1d07-432e-8f71-60584be51f40`
+	"""
+	accountUuid: UUID!
+
+	"""
+	## Nom de l'adresse
+	Le nom usuel de l'adresse s'il existe. Limite de **64** caractères.
+
+	Par exemple, `Pyroloc` ou `Résidence "Les Estudines du Parc"`.
+	"""
+	name: String
+
+	"""
+	## Adresse postale complète de l'adresse
+	Formatée pour être affichée ou utilisée sur une étiquette d'envoi.
+	Ce champ PEUT contenir plusieurs lignes, séparées par des retours à la ligne.
+	Les nouvelles lignes peuvent être représentées soit par une paire retour
+	chariot/saut de ligne ("\r\n"), soit par un seul caractère de saut de ligne ("\n").
+	"""
+	formatted: String!
+
+	"""
+	## Rue de l'adresse
+	Composante complète de l'adresse de la rue, qui PEUT inclure le numéro de la maison,
+	le nom de la rue, la boîte postale et des informations sur plusieurs lignes concernant
+	l'adresse de la rue. Ce champ PEUT contenir plusieurs lignes, séparées par des retours
+	à la ligne. Les nouvelles lignes peuvent être représentées soit par une paire retour
+	chariot/saut de ligne ("\r\n"), soit par un seul caractère de saut de ligne ("\n").
+	"""
+	streetAddress: String!
+
+	"""
+	## Ville ou localité de l'adresse
+	"""
+	locality: String!
+
+	"""
+	## Région de l'adresse
+	Province, de la préfecture ou région.
+	"""
+	region: String
+
+	"""
+	## Code postal de l'adresse
+	"""
+	postalCode: String!
+
+	"""
+	## Pays de l'adresse
+	"""
+	country: String!
+}
+
+"""
+Base64 [RFC4648](https://www.rfc-editor.org/rfc/rfc4648)
+"""
 scalar Base64
 
 input BooleanFilter {
-  eq: Boolean!
+	eq: Boolean!
 }
 
 type BuildInfo {
-  ref: String
-  sha: String
+	ref: String
+	sha: String
 }
 
-"""Rôles dans un group"""
+"""
+Rôles dans un group
+"""
 enum ClaimAccess {
-  """Création"""
-  CREATE
+	"""
+	Aucun
+	"""
+	NONE
 
-  """Suppression"""
-  DELETE
+	"""
+	Lecture
+	"""
+	READ
 
-  """Aucun"""
-  NONE
+	"""
+	Écriture
+	"""
+	WRITE
 
-  """Lecture"""
-  READ
+	"""
+	Création
+	"""
+	CREATE
 
-  """Écriture"""
-  WRITE
+	"""
+	Suppression
+	"""
+	DELETE
 }
 
 input CreateGroup {
-  id: Identifier!
-  name: String!
-  type: GroupType
+	id: Identifier!
+	name: String!
+	type: GroupType
 }
 
 input CreateToken {
-  allowedIps: [String!]
-  claims: [NewTokenClaim!]
-  description: String!
-  globalAccess: ClaimAccess
-  id: String!
+	id: String!
+	description: String!
+	globalAccess: ClaimAccess
+	allowedIps: [String!]
+	claims: [NewTokenClaim!]
 }
 
 input CreateTraining {
-  fullName: String
-  id: Identifier!
-  name: String!
+	id: Identifier!
+	name: String!
+	fullName: String
 }
 
 input CreateUnixAccount {
-  vhost: String
+	vhost: String
 }
 
 input CreateUser {
-  familyName: String!
-  givenName: String!
-  password: Password
-  promotion: Int!
-  trainingId: Identifier!
+	password: Password
+	familyName: String!
+	givenName: String!
+	promotion: Int!
+	trainingId: Identifier!
 }
 
-"""Rôles dans un groupe"""
+"""
+Rôles dans un groupe
+"""
 enum CurrentGroupRole {
-  """Administrateur·trice"""
-  ADMIN
+	"""
+	Membre ordinaire
+	"""
+	MEMBER
 
-  """Membre du bureau"""
-  BOARD_MEMBER
+	"""
+	Administrateur·trice
+	"""
+	ADMIN
 
-  """Membre ordinaire"""
-  MEMBER
+	"""
+	Membre du bureau
+	"""
+	BOARD_MEMBER
 
-  """Président·e"""
-  OWNER
+	"""
+	Président·e
+	"""
+	OWNER
 }
 
 """
@@ -175,292 +205,332 @@ format, but it is always normalized to the UTC (Z) offset, e.g.
 scalar DateTime
 
 input DateTimeFilter {
-  eq: [LocalDateTime!]
-  gt: LocalDateTime
-  lt: LocalDateTime
+	gt: LocalDateTime
+	eq: [LocalDateTime!]
+	lt: LocalDateTime
 }
 
 enum FromNull {
-  BOOLEAN
-  LIST
-  NUMBER
-  OBJECT
-  STRING
+	NUMBER
+	STRING
+	BOOLEAN
+	LIST
+	OBJECT
 }
 
-"""Genre d'une personne"""
+"""
+Genre d'une personne
+"""
 enum Gender {
-  """Féminin"""
-  FEMALE
+	"""
+	Masculin
+	"""
+	MALE
 
-  """Masculin"""
-  MALE
+	"""
+	Féminin
+	"""
+	FEMALE
 
-  """Non binaire"""
-  NON_BINARY
+	"""
+	Non binaire
+	"""
+	NON_BINARY
 
-  """Inconnu"""
-  UNKNOWN
+	"""
+	Inconnu
+	"""
+	UNKNOWN
 }
 
 input GenderFilter {
-  isIn: [Gender!]!
+	isIn: [Gender!]!
 }
 
 type GlobalValues {
-  evenSemester: Boolean!
-  integration: Boolean!
-  schoolYear: Int!
+	schoolYear: Int!
+	evenSemester: Boolean!
+	integration: Boolean!
 }
 
 type Group {
-  """
-  ## Groupe actif
-  **VRAI** si le group est encore actif.
-  Se traduit par une déclaration lors d'une réunion publique de l'AEIIE s'il
-  s'agit d'un group BdE. Les listes candidates à l'élection BdE sont actives le
-  temps de la campagne.
-  """
-  active: Boolean!
-
-  """
-  ## URL de la photo de profil du groupe
-  Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
-  JPEG ou GIF), plutôt qu'à une page Web contenant une image.
-  
-  Par exemple, `https://api.iiens.net/picture/acier2020` ou `https://api.iiens.net/picture/dupontj2042`
-  """
-  backgroundImage: Url!
-
-  """Hash de l'image d'arrière plan du groupe"""
-  backgroundImageThumbnailHash: Base64!
-
-  """
-  ## Date de la création du compte du group
-  Sa valeur est un string JSON [RFC3339] représentant le temps  entre 1970-01-01T0:0:0Z,
-  mesuré en UTC, et la date/heure.
-  """
-  createdAt: DateTime!
-
-  """
-  ## Description du group
-  Une description plus complète que `short_description`, sans limite de caractères.
-  """
-  description: String
-
-  """
-  ## Adresse électronique préférée de l'utilisateur.
-  Sa valeur DOIT être conforme à la syntaxe addr-spec de la RFC 5322 [RFC5322].
-  
-  Par exemple, `arise@iiens.net` ou `bde@iiens.net`.
-  """
-  email: String!
-
-  """
-  # **ADMIN ONLY**
-  ## Compte caché
-  Le compte du group sera invisible de toutes les requêtes, sauf admin si le filtre
-  de la requête le demande.
-  """
-  hidden: Boolean!
-
-  """
-  ## Identifiant du group
-  Le nom du group normalisé (sans accents, caractères spéciaux ni espaces).
-  Ne peut contenir que des caractères ASCII et éventuellement des tirets pour
-  remplacer les espaces.
-  
-  Par exemple, `arise` ou `aeiie`.
-  """
-  id: Identifier!
-
-  """
-  ## Nom du group
-  Le nom usuel du group, présenté sous forme d'acronyme ou sous forme longue.
-  
-  Par exemple, `ARISE` ou `BdE`.
-  """
-  name: String!
-
-  """
-  ## URL de la photo de profil du groupe
-  Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
-  JPEG ou GIF), plutôt qu'à une page Web contenant une image.
-  
-  Par exemple, `https://api.iiens.net/picture/acier2020` ou `https://api.iiens.net/picture/dupontj2042`
-  """
-  picture: Url!
-
-  """Hash de la photo de profil du groupe"""
-  pictureThumbnailHash: Base64!
-
-  """
-  ## URL de la page de profil du group
-  Page de profil sur [www.iiens.net].
-  
-  Par exemple, `https://www.iiens.net/eleve/acier2020` ou `https://www.iiens.net/eleve/dupontj2042`
-  """
-  profile: Url!
-
-  """
-  ## Description courte du group
-  64 caractères maximum, de quoi présenter le group succinctement.
-  """
-  shortDescription: String
-
-  """
-  ## Type de groupe
-  Club, Association 1901, etc.
-  """
-  type: GroupType!
-  unixAccount: UnixAccount
-
-  """
-  ## Date de la dernière mise à jour des informations relatives au group
-  Sa valeur est un string JSON [RFC3339] représentant le temps  entre 1970-01-01T0:0:0Z,
-  mesuré en UTC, et la date/heure.
-  """
-  updatedAt: DateTime!
-
-  """
-  # **ADMIN ONLY**
-  ## UUID interne du group
-  
-  Par exemple, `72c612f8-1d07-432e-8f71-60584be51f40`
-  """
-  uuid: UUID!
-
-  """## URL du site perso du groupe"""
-  website: Url
+	"""
+	# **ADMIN ONLY**
+	## UUID interne du group
+
+	Par exemple, `72c612f8-1d07-432e-8f71-60584be51f40`
+	"""
+	uuid: UUID!
+
+	"""
+	## Identifiant du group
+	Le nom du group normalisé (sans accents, caractères spéciaux ni espaces).
+	Ne peut contenir que des caractères ASCII et éventuellement des tirets pour
+	remplacer les espaces.
+
+	Par exemple, `arise` ou `aeiie`.
+	"""
+	id: Identifier!
+
+	"""
+	## Nom du group
+	Le nom usuel du group, présenté sous forme d'acronyme ou sous forme longue.
+
+	Par exemple, `ARISE` ou `BdE`.
+	"""
+	name: String!
+
+	"""
+	## Description courte du group
+	64 caractères maximum, de quoi présenter le group succinctement.
+	"""
+	shortDescription: String
+
+	"""
+	## Description du group
+	Une description plus complète que `short_description`, sans limite de caractères.
+	"""
+	description: String
+
+	"""
+	## Adresse électronique préférée de l'utilisateur.
+	Sa valeur DOIT être conforme à la syntaxe addr-spec de la RFC 5322 [RFC5322].
+
+	Par exemple, `arise@iiens.net` ou `bde@iiens.net`.
+	"""
+	email: String!
+
+	"""
+	## URL du site perso du groupe
+	"""
+	website: Url
+
+	"""
+	## Type de groupe
+	Club, Association 1901, etc.
+	"""
+	type: GroupType!
+	unixAccount: UnixAccount
+
+	"""
+	## Date de la création du compte du group
+	Sa valeur est un string JSON [RFC3339] représentant le temps  entre 1970-01-01T0:0:0Z,
+	mesuré en UTC, et la date/heure.
+	"""
+	createdAt: DateTime!
+
+	"""
+	## Date de la dernière mise à jour des informations relatives au group
+	Sa valeur est un string JSON [RFC3339] représentant le temps  entre 1970-01-01T0:0:0Z,
+	mesuré en UTC, et la date/heure.
+	"""
+	updatedAt: DateTime!
+
+	"""
+	## URL de la page de profil du group
+	Page de profil sur [www.iiens.net].
+
+	Par exemple, `https://www.iiens.net/eleve/acier2020` ou `https://www.iiens.net/eleve/dupontj2042`
+	"""
+	profile: Url!
+
+	"""
+	## URL de la photo de profil du groupe
+	Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
+	JPEG ou GIF), plutôt qu'à une page Web contenant une image.
+
+	Par exemple, `https://api.iiens.net/picture/acier2020` ou `https://api.iiens.net/picture/dupontj2042`
+	"""
+	picture: Url!
+
+	"""
+	Hash de la photo de profil du groupe
+	"""
+	pictureThumbnailHash: Base64!
+
+	"""
+	## URL de la photo de profil du groupe
+	Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
+	JPEG ou GIF), plutôt qu'à une page Web contenant une image.
+
+	Par exemple, `https://api.iiens.net/picture/acier2020` ou `https://api.iiens.net/picture/dupontj2042`
+	"""
+	backgroundImage: Url!
+
+	"""
+	Hash de l'image d'arrière plan du groupe
+	"""
+	backgroundImageThumbnailHash: Base64!
+
+	"""
+	## Groupe actif
+	**VRAI** si le group est encore actif.
+	Se traduit par une déclaration lors d'une réunion publique de l'AEIIE s'il
+	s'agit d'un group BdE. Les listes candidates à l'élection BdE sont actives le
+	temps de la campagne.
+	"""
+	active: Boolean!
+
+	"""
+	# **ADMIN ONLY**
+	## Compte caché
+	Le compte du group sera invisible de toutes les requêtes, sauf admin si le filtre
+	de la requête le demande.
+	"""
+	hidden: Boolean!
 }
 
 type GroupConnection {
-  """A list of edges."""
-  edges: [GroupEdge!]!
+	"""
+	Information to aid in pagination.
+	"""
+	pageInfo: PageInfo!
 
-  """A list of nodes."""
-  nodes: [Group!]!
+	"""
+	A list of edges.
+	"""
+	edges: [GroupEdge!]!
 
-  """Information to aid in pagination."""
-  pageInfo: PageInfo!
-  remainingCount: Int!
+	"""
+	A list of nodes.
+	"""
+	nodes: [Group!]!
+	remainingCount: Int!
 }
 
-"""An edge in a connection."""
+"""
+An edge in a connection.
+"""
 type GroupEdge {
-  """A cursor for use in pagination"""
-  cursor: String!
+	"""
+	The item at the end of the edge
+	"""
+	node: Group!
+	remainingCount: Int!
 
-  """The item at the end of the edge"""
-  node: Group!
-  remainingCount: Int!
+	"""
+	A cursor for use in pagination
+	"""
+	cursor: String!
 }
 
 input GroupFilter {
-  accountUuid: UuidFilter
-  active: BooleanFilter
-  createdAt: DateTimeFilter
-  description: NullableTextFilter
-  email: TextFilter
-  emailVerified: BooleanFilter
-  hidden: BooleanFilter
-  id: TextFilter
-  name: TextFilter
-  or: [GroupFilter!]
-  shortDescription: NullableTextFilter
-  type: GroupTypeFilter
-  unixAccount: UnixAccountFilter
-  updatedAt: DateTimeFilter
-  uuid: UuidFilter
-  website: NullableTextFilter
+	uuid: UuidFilter
+	name: TextFilter
+	type: GroupTypeFilter
+	shortDescription: NullableTextFilter
+	description: NullableTextFilter
+	active: BooleanFilter
+	accountUuid: UuidFilter
+	unixAccount: UnixAccountFilter
+	id: TextFilter
+	email: TextFilter
+	emailVerified: BooleanFilter
+	website: NullableTextFilter
+	hidden: BooleanFilter
+	createdAt: DateTimeFilter
+	updatedAt: DateTimeFilter
+	or: [GroupFilter!]
 }
 
 input GroupId {
-  email: String
-  id: SmolStr
-  uuid: UUID
+	id: SmolStr
+	email: String
+	uuid: UUID
 }
 
 type GroupOfMember {
-  group: Group!
-  isAdmin: Boolean!
-  isBoardMember: Boolean!
-  isOwner: Boolean!
-  role: CurrentGroupRole!
-  since: Date!
+	group: Group!
+	role: CurrentGroupRole!
+	isOwner: Boolean!
+	isBoardMember: Boolean!
+	isAdmin: Boolean!
+	since: Date!
 }
 
 input GroupOfMemberFilter {
-  role: CurrentGroupRole
-  since: NeverDateFilter
-  strictRole: Boolean! = false
+	role: CurrentGroupRole
+	since: NeverDateFilter
+	strictRole: Boolean! = false
 }
 
-"""Rôles dans un groupe"""
+"""
+Rôles dans un groupe
+"""
 enum GroupRole {
-  """Administrateur·trice"""
-  ADMIN
+	"""
+	A quitté le groupe
+	"""
+	GONE
 
-  """Membre du bureau"""
-  BOARD_MEMBER
+	"""
+	Membre ordinaire
+	"""
+	MEMBER
 
-  """A quitté le groupe"""
-  GONE
+	"""
+	Administrateur·trice
+	"""
+	ADMIN
 
-  """Membre ordinaire"""
-  MEMBER
+	"""
+	Membre du bureau
+	"""
+	BOARD_MEMBER
 
-  """Président·e"""
-  OWNER
+	"""
+	Président·e
+	"""
+	OWNER
 }
 
 enum GroupType {
-  ASSOCIATION
-  CLUB
-  COMMISSION
-  HOME
-  LIST
-  OTHER
-  UNKNOWN
+	ASSOCIATION
+	CLUB
+	COMMISSION
+	LIST
+	HOME
+	OTHER
+	UNKNOWN
 }
 
 input GroupTypeFilter {
-  isIn: [GroupType!]!
+	isIn: [GroupType!]!
 }
 
 type Health {
-  db: String!
+	db: String!
 }
 
 type HistoricalGroupOfMember {
-  group: Group!
-  role: GroupRole!
-  since: Date!
+	group: Group!
+	role: GroupRole!
+	since: Date!
 }
 
 input HistoricalGroupOfMemberFilter {
-  role: GroupRole
-  since: NeverDateFilter
-  strictRole: Boolean! = false
+	role: GroupRole
+	since: NeverDateFilter
+	strictRole: Boolean! = false
 }
 
 type HistoricalMemberOfGroup {
-  role: GroupRole!
-  since: Date!
-  user: User!
+	user: User!
+	role: GroupRole!
+	since: Date!
 }
 
 scalar Identifier
 
 input Int16Filter {
-  eq: [Int!]
-  gt: Int
-  lt: Int
+	gt: Int
+	eq: [Int!]
+	lt: Int
 }
 
 input LevenshteinFilter {
-  threshold: Int
-  value: String!
+	value: String!
+	threshold: Int
 }
 
 """
@@ -472,149 +542,160 @@ subseconds. E.g. "2022-01-12T07:30:19.12345".
 scalar LocalDateTime
 
 type Mutation {
-  addClaims(claims: [NewTokenClaim!]!, token: TokenId!): Token!
-  addGroupMemberRole(group: GroupId!, role: GroupRole!, user: UserId!): HistoricalMemberOfGroup!
-  copyClaims(dstToken: TokenId!, srcToken: TokenId!): Token!
-
-  """Création d'un groupe"""
-  createGroup(group: CreateGroup!): Group!
-  createGroupUnixAccount(account: CreateUnixAccount!, group: GroupId!): UnixAccount!
-  createToken(token: CreateToken!): PlainToken!
-  createTraining(training: CreateTraining!): Training!
-
-  """
-  Création d'un utilisateur
-  ### Erreurs possibles
-  - `NOT_FOUND`: La formation n'existe pas.
-  - `ID_GENERATION_FAILURE`: L'identifiant de l'utilisateur n'a pas pu être généré.
-  """
-  createUser(user: CreateUser!): User!
-  createUserUnixAccount(account: CreateUnixAccount!, user: UserId!): UnixAccount!
-  deleteClaims(claims: [String!], token: TokenId!): Token!
-
-  """
-  Suppression d'un groupe
-  ### Erreurs possibles
-  - `NOT_FOUND`: Le groupe n'existe pas.
-  """
-  deleteGroup(group: GroupId!): Boolean!
-  deleteToken(token: TokenId!): Int!
-  deleteTraining(training: TrainingId!): Int!
-
-  """
-  Suppression d'un utilisateur
-  ### Erreurs possibles
-  - `NOT_FOUND`: L'utilisateur n'existe pas.
-  """
-  deleteUser(user: UserId!): Int!
-  endOfIntegration: Boolean!
-  evenSemester: Boolean!
-  newYear: Int!
-  regenerateToken(token: TokenId!): PlainToken!
-  status: Int!
-
-  """
-  Mise à jour d'un groupe
-  ### Erreurs possibles
-  - `NOT_FOUND`: Le groupe n'existe pas.
-  """
-  updateGroup(group: GroupId!, update: UpdateGroup!): Group!
-  updateToken(token: TokenId!, update: UpdateToken!): Token!
-  updateTraining(training: TrainingId!, update: UpdateTraining!): Training!
-  updateUnixAccount(unixAccount: UnixAccountId!, update: UpdateUnixAccount!): UnixAccount!
-
-  """
-  Mise à jour d'un utilisateur
-  ### Erreurs possibles
-  - `NOT_FOUND`: L'utilisateur ou la formation n'existe pas.
-  """
-  updateUser(update: UpdateUser!, user: UserId!): User!
+	"""
+	Création d'un utilisateur
+	### Erreurs possibles
+	- `NOT_FOUND`: La formation n'existe pas.
+	- `ID_GENERATION_FAILURE`: L'identifiant de l'utilisateur n'a pas pu être généré.
+	"""
+	createUser(user: CreateUser!): User!
+
+	"""
+	Mise à jour d'un utilisateur
+	### Erreurs possibles
+	- `NOT_FOUND`: L'utilisateur ou la formation n'existe pas.
+	"""
+	updateUser(user: UserId!, update: UpdateUser!): User!
+
+	"""
+	Suppression d'un utilisateur
+	### Erreurs possibles
+	- `NOT_FOUND`: L'utilisateur n'existe pas.
+	"""
+	deleteUser(user: UserId!): Int!
+
+	"""
+	Création d'un groupe
+	"""
+	createGroup(group: CreateGroup!): Group!
+
+	"""
+	Mise à jour d'un groupe
+	### Erreurs possibles
+	- `NOT_FOUND`: Le groupe n'existe pas.
+	"""
+	updateGroup(group: GroupId!, update: UpdateGroup!): Group!
+
+	"""
+	Suppression d'un groupe
+	### Erreurs possibles
+	- `NOT_FOUND`: Le groupe n'existe pas.
+	"""
+	deleteGroup(group: GroupId!): Boolean!
+	addGroupMemberRole(user: UserId!, group: GroupId!, role: GroupRole!): HistoricalMemberOfGroup!
+	createToken(token: CreateToken!): PlainToken!
+	updateToken(token: TokenId!, update: UpdateToken!): Token!
+	regenerateToken(token: TokenId!): PlainToken!
+	deleteClaims(token: TokenId!, claims: [String!]): Token!
+	addClaims(token: TokenId!, claims: [NewTokenClaim!]!): Token!
+	copyClaims(srcToken: TokenId!, dstToken: TokenId!): Token!
+	deleteToken(token: TokenId!): Int!
+	createUserUnixAccount(user: UserId!, account: CreateUnixAccount!): UnixAccount!
+	createGroupUnixAccount(group: GroupId!, account: CreateUnixAccount!): UnixAccount!
+	updateUnixAccount(unixAccount: UnixAccountId!, update: UpdateUnixAccount!): UnixAccount!
+	createTraining(training: CreateTraining!): Training!
+	updateTraining(training: TrainingId!, update: UpdateTraining!): Training!
+	deleteTraining(training: TrainingId!): Int!
+	newYear: Int!
+	evenSemester: Boolean!
+	endOfIntegration: Boolean!
+	status: Int!
 }
 
 input NeverDateFilter {
-  eq: [Date!]
-  gt: Date
-  lt: Date
+	gt: Date
+	eq: [Date!]
+	lt: Date
 }
 
 input NewTokenClaim {
-  access: ClaimAccess!
-  claim: String!
+	claim: String!
+	access: ClaimAccess!
 }
 
 input NullableDateFilter {
-  day: Int
-  eq: [Date!]
-  gt: Date
-  lt: Date
-  month: Int
-  null: Boolean
+	null: Boolean
+	day: Int
+	month: Int
+	gt: Date
+	eq: [Date!]
+	lt: Date
 }
 
 input NullableDateTimeFilter {
-  eq: [LocalDateTime!]
-  gt: LocalDateTime
-  lt: LocalDateTime
-  null: Boolean
+	null: Boolean
+	gt: LocalDateTime
+	eq: [LocalDateTime!]
+	lt: LocalDateTime
 }
 
 input NullableFilter {
-  null: Boolean
+	null: Boolean
 }
 
 input NullableTextFilter {
-  levenshtein: [LevenshteinFilter!]
-  like: [String!]
-  notLike: [String!]
-  null: Boolean
-  similar: [SimilarFilter!]
+	null: Boolean
+	like: [String!]
+	notLike: [String!]
+	similar: [SimilarFilter!]
+	levenshtein: [LevenshteinFilter!]
 }
 
 enum OrderByGroup {
-  CREATED_AT
-  ID
-  NAME
-  UPDATED_AT
-  UUID
+	UUID
+	ID
+	NAME
+	CREATED_AT
+	UPDATED_AT
 }
 
 enum OrderByUser {
-  BIRTH_DATE
-  CREATED_AT
-  FAMILY_NAME
-  GIVEN_NAME
-  ID
-  LAST_USED_AT
-  NICKNAME
-  PROMOTION
-  UPDATED_AT
-  UUID
-  YEAR
-}
-
-"""Information about pagination in a connection"""
+	UUID
+	ID
+	GIVEN_NAME
+	FAMILY_NAME
+	NICKNAME
+	BIRTH_DATE
+	PROMOTION
+	YEAR
+	CREATED_AT
+	UPDATED_AT
+	LAST_USED_AT
+}
+
+"""
+Information about pagination in a connection
+"""
 type PageInfo {
-  """When paginating forwards, the cursor to continue."""
-  endCursor: String
+	"""
+	When paginating backwards, are there more items?
+	"""
+	hasPreviousPage: Boolean!
 
-  """When paginating forwards, are there more items?"""
-  hasNextPage: Boolean!
+	"""
+	When paginating forwards, are there more items?
+	"""
+	hasNextPage: Boolean!
 
-  """When paginating backwards, are there more items?"""
-  hasPreviousPage: Boolean!
+	"""
+	When paginating backwards, the cursor to continue.
+	"""
+	startCursor: String
 
-  """When paginating backwards, the cursor to continue."""
-  startCursor: String
+	"""
+	When paginating forwards, the cursor to continue.
+	"""
+	endCursor: String
 }
 
 input Password {
-  hash: String
-  plain: String
+	hash: String
+	plain: String
 }
 
 type PlainToken {
-  base64: String!
-  raw: String!
+	raw: String!
+	base64: String!
 }
 
 """
@@ -622,91 +703,104 @@ Ensemble des requêtes possibles pour l'API Arise.
 Certaines peuvent être cachées, en fonction des permissions courantes.
 """
 type Query {
-  account(account: AccountId!): Account
-  buildInfo: BuildInfo!
-  currentToken: Token!
-  globalsValues: GlobalValues!
-  group(group: GroupId!): Group
-  groups(after: String, before: String, filter: GroupFilter, first: Int, last: Int, orderBy: [OrderByGroup!]! = []): GroupConnection!
-  health: Health!
-  oAuthAppOwner: Account!
-  token(token: TokenId!): Token
-  tokens: [Token!]!
-  trainings: [Training!]!
-  user(user: UserId!): User
-  users(after: String, before: String, filter: UserFilter, first: Int, last: Int, orderBy: [OrderByUser!]! = []): UserConnection!
+	user(user: UserId!): User
+	users(
+		after: String
+		before: String
+		first: Int
+		last: Int
+		filter: UserFilter
+		orderBy: [OrderByUser!]! = []
+	): UserConnection!
+	group(group: GroupId!): Group
+	groups(
+		after: String
+		before: String
+		first: Int
+		last: Int
+		filter: GroupFilter
+		orderBy: [OrderByGroup!]! = []
+	): GroupConnection!
+	account(account: AccountId!): Account
+	oAuthAppOwner: Account!
+	currentToken: Token!
+	token(token: TokenId!): Token
+	tokens: [Token!]!
+	trainings: [Training!]!
+	buildInfo: BuildInfo!
+	health: Health!
+	globalsValues: GlobalValues!
 }
 
 input SimilarFilter {
-  threshold: Float
-  value: String!
+	value: String!
+	threshold: Float
 }
 
 scalar SmolStr
 
 input TextFilter {
-  levenshtein: [LevenshteinFilter!]
-  like: [String!]
-  notLike: [String!]
-  similar: [SimilarFilter!]
+	like: [String!]
+	notLike: [String!]
+	similar: [SimilarFilter!]
+	levenshtein: [LevenshteinFilter!]
 }
 
 type Token {
-  allowedIps: [String!]!
-  claims: [TokenClaim!]!
-
-  """
-  # **ADMIN ONLY**
-  ## Description du jeton
-  """
-  description: String!
-  globalAccess: ClaimAccess
-
-  """
-  # **ADMIN ONLY**
-  ## Identifiant du jeton
-  """
-  id: String!
-
-  """
-  # **ADMIN ONLY**
-  ## Hash du jeton
-  Standard actuel : BLAKE3
-  
-  Par exemple, `$blake3$1ChQCR0BrfBO42AkRogZaw$+COVVpcK/ptUTSckqIdI/rFF1JdIkvk9V++z56kLNf4'`
-  """
-  tokenHash: String!
-
-  """
-  # **ADMIN ONLY**
-  ## UUID interne du jeton
-  
-  Par exemple, `72c612f8-1d07-432e-8f71-60584be51f40`
-  """
-  uuid: UUID!
+	"""
+	# **ADMIN ONLY**
+	## UUID interne du jeton
+
+	Par exemple, `72c612f8-1d07-432e-8f71-60584be51f40`
+	"""
+	uuid: UUID!
+
+	"""
+	# **ADMIN ONLY**
+	## Identifiant du jeton
+	"""
+	id: String!
+
+	"""
+	# **ADMIN ONLY**
+	## Description du jeton
+	"""
+	description: String!
+
+	"""
+	# **ADMIN ONLY**
+	## Hash du jeton
+	Standard actuel : BLAKE3
+
+	Par exemple, `$blake3$1ChQCR0BrfBO42AkRogZaw$+COVVpcK/ptUTSckqIdI/rFF1JdIkvk9V++z56kLNf4'`
+	"""
+	tokenHash: String!
+	globalAccess: ClaimAccess
+	allowedIps: [String!]!
+	claims: [TokenClaim!]!
 }
 
 type TokenClaim {
-  access: ClaimAccess!
-  claim: String!
+	claim: String!
+	access: ClaimAccess!
 }
 
 input TokenId {
-  globalAccess: ClaimAccess
-  id: SmolStr
-  uuid: UUID
+	id: SmolStr
+	uuid: UUID
+	globalAccess: ClaimAccess
 }
 
 type Training {
-  fullName: String
-  id: Identifier!
-  name: String!
-  uuid: UUID!
+	uuid: UUID!
+	id: Identifier!
+	name: String!
+	fullName: String
 }
 
 input TrainingId {
-  id: SmolStr
-  uuid: UUID
+	id: SmolStr
+	uuid: UUID
 }
 
 """
@@ -722,89 +816,89 @@ entities without requiring a central allocating authority.
 scalar UUID
 
 type UnixAccount {
-  accountUuid: UUID!
-  uid: Int!
-  vhost: String
+	accountUuid: UUID!
+	uid: Int!
+	vhost: String
+
+	"""
+	URL du site personnel de l'utilisateur
+
+	Page "perso" de l'utilisateur hébergée sur les serveurs d'ARISE.
 
-  """
-  URL du site personnel de l'utilisateur
-  
-  Page "perso" de l'utilisateur hébergée sur les serveurs d'ARISE.
-  
-  Par exemple, `https://acier.perso.iiens.net`
-  """
-  website: Url
+	Par exemple, `https://acier.perso.iiens.net`
+	"""
+	website: Url
 }
 
 input UnixAccountFilter {
-  null: Boolean
-  uid: Int16Filter
-  uuid: UuidFilter
-  vhost: TextFilter
+	null: Boolean
+	uuid: UuidFilter
+	uid: Int16Filter
+	vhost: TextFilter
 }
 
 input UnixAccountId {
-  uid: Int
-  uuid: UUID
+	uid: Int
+	uuid: UUID
 }
 
 input UpdateGroup {
-  active: Boolean
-  description: String
-  email: String
-  emailVerified: Boolean
-  hidden: Boolean
-  id: Identifier
-  name: String
-  shortDescription: String
-  type: GroupType
-  website: Url
+	name: String
+	type: GroupType
+	shortDescription: String
+	description: String
+	active: Boolean
+	id: Identifier
+	email: String
+	emailVerified: Boolean
+	website: Url
+	hidden: Boolean
 }
 
 input UpdateToken {
-  allowedIps: [String!]
-  description: String
-  id: String
+	id: String
+	description: String
+	allowedIps: [String!]
 }
 
 input UpdateTraining {
-  fullName: String
-  name: String
+	name: String
+	fullName: String
 }
 
 input UpdateUnixAccount {
-  uid: Int
-  vhost: String
+	uid: Int
+	vhost: String
 }
 
 input UpdateUser {
-  aeiieMember: Boolean
-  birthdate: Date
-  diplomaYearDuration: Int
-  email: String
-  emailVerified: Boolean
-  extendedTrialPeriod: Boolean
-  familyName: String
-  gapYear: Int
-  gender: Gender
-  givenNameAtBirth: String
-  givenNameInUse: String
-  hidden: Boolean
-  id: Identifier
-  initialPromotion: Int
-  lastUsedAt: LocalDateTime
-  locale: String
-  middleName: String
-  nickname: String
-  password: Password
-  phoneNumber: String
-  phoneNumberVerified: Boolean
-  public: Boolean
-  schoolLogin: String
-  suspended: Boolean
-  trainingId: SmolStr
-  website: Url
-  zoneinfo: String
+	password: Password
+	givenNameAtBirth: String
+	givenNameInUse: String
+	middleName: String
+	familyName: String
+	nickname: String
+	gender: Gender
+	birthdate: Date
+	zoneinfo: String
+	locale: String
+	schoolLogin: String
+	phoneNumber: String
+	phoneNumberVerified: Boolean
+	initialPromotion: Int
+	gapYear: Int
+	diplomaYearDuration: Int
+	trainingId: SmolStr
+	extendedTrialPeriod: Boolean
+	aeiieMember: Boolean
+	suspended: Boolean
+	public: Boolean
+	lastUsedAt: LocalDateTime
+	id: Identifier
+	email: String
+	emailVerified: Boolean
+	website: Url
+	hidden: Boolean
 }
 
 """
@@ -815,541 +909,569 @@ scalar Url
 scalar Urn
 
 type User {
-  """Adresse de l'utilisateur"""
-  address: Address
-
-  """
-  Adhérent de l'AEIIE
-  
-  **VRAI** si l'utilisateur est membre de l'AEIIE. **FAUX** à la création du compte.
-  """
-  aeiieMember: Boolean!
-
-  """
-  URL de l'image d'arrière plan de l'utilisateur
-  
-  Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
-  JPEG ou GIF), plutôt qu'à une page Web contenant une image.
-  
-  Par exemple, `https://api.iiens.net/picture/acier2020`
-  """
-  backgroundImage: Url!
-
-  """Hash de l'image d'arrière plan de l'utilisateur"""
-  backgroundImageThumbnailHash: Base64!
-
-  """Date de naissance de l'utilisateur"""
-  birthdate: Date
-
-  """
-  Nom complet administratif de l'utilisateur
-  
-  Présenté sous une forme affichable, avec toutes les parties du nom, **SAUF** le surnom.
-  
-  Par exemple, `Jean Dupont`
-  """
-  civilName: String!
-
-  """
-  Date de la création du compte de l'utilisateur
-  
-  Sa valeur est un string JSON [RFC3339] représentant le temps  entre 1970-01-01T0:0:0Z,
-  mesuré en UTC, et la date/heure.
-  """
-  createdAt: DateTime!
-
-  """
-  Années d'études requises jusqu'au diplôme
-  
-  Par défaut cette valeur est de 03.
-  """
-  diplomaYearDuration: Int!
-
-  """
-  Adresse électronique de l'utilisateur
-  
-  Un alias de l'adresse électronique véritable de l'utilisateur.
-  À utiliser en priorité pour la création de comptes.
-  
-  Par exemple, `acier2020.e2e01581919c@alias.iiens.net`.
-  """
-  email: String!
-
-  """
-  Adresse électronique réelle de l'utilisateur
-  
-  Sa valeur DOIT être conforme à la syntaxe addr-spec de la RFC 5322 [RFC5322].
-  
-  Par exemple, `foo.bar@ensiie.fr` ou `dupont.jean@gmail.com`.
-  """
-  emailForwardAddress: String
-
-  """
-  Adresse électronique de l'utilisateur vérifiée
-  
-  Vrai si l'adresse électronique préférée de l'utilisateur a été vérifiée, sinon faux.
-  Lorsque cette valeur d'allégation est vraie, cela signifie qu'ARISE a pris des mesures
-  positives pour s'assurer que l'adresse électronique était contrôlée par l'utilisateur
-  au moment où la vérification a été effectuée.
-  """
-  emailVerified: Boolean!
-
-  """
-  Période d'essai étendue de l'utilisateur
-  
-  **FAUX** lors de la création du compte.
-  
-  Cette variable permet d'outrepasser le champ `restricted_access`.
-  """
-  extendedTrialPeriod: Boolean!
-
-  """
-  Nom(s) de famille de l'utilisateur
-  
-  Notez que dans certaines cultures, les personnes peuvent avoir plusieurs noms de famille ou
-  aucun nom de famille ; tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
-  
-  Par exemple, `Leroy`
-  """
-  familyName: String!
-
-  """
-  Prénoms de l'utilisateur
-  
-  Tous les prénoms de l'utilisateur concaténés ensembles.
-  
-  Par exemple, `Jean Pierre-Jacques` ou `Robert`
-  """
-  forenames: String!
-
-  """
-  Années d'étude d'écart de l'utilisateur
-  
-  Désigne des périodes de temps où un utilisateur prend une pause ou un écart par
-  rapport à la norme. Cela peut être causé par une année sabbatique, une année de
-  redoublement ou pour d'autres raisons.
-  
-  Par défaut cette valeur est de 0.
-  """
-  gapYear: Int!
-
-  """
-  Genre de l'utilisateur
-  
-  Par défaut à `UNKNOWN`.
-  """
-  gender: Gender!
-
-  """
-  Prénom(s) de l'utilisateur
-  
-  Notez que dans certaines cultures, les personnes peuvent avoir plusieurs prénoms ;
-  tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
-  
-  Par exemple, `Jean` ou `Pierre Jacques`
-  """
-  givenName: String!
-
-  """
-  Prénom(s) de naissance de l'utilisateur
-  
-  Notez que dans certaines cultures, les personnes peuvent avoir plusieurs prénoms ;
-  tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
-  
-  Par exemple, `Jean` ou `Pierre Jacques`
-  """
-  givenNameAtBirth: String!
-
-  """
-  Prénom(s) d'usage de l'utilisateur
-  
-  Notez que dans certaines cultures, les personnes peuvent avoir plusieurs prénoms ;
-  tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
-  
-  Par exemple, `Jeanne` ou `Pierre Jacques`
-  """
-  givenNameInUse: String
-
-  """Groupe de l'utilisateur"""
-  group(id: GroupId!): GroupOfMember
-
-  """
-  Historique des groupes de l'utilisateur
-  
-  Cet historique retrace tous les rôles que l'utilisateur à pu prendre au
-  sein des groups de l'école.
-  """
-  groupHistory(filter: HistoricalGroupOfMemberFilter): [HistoricalGroupOfMember!]!
-
-  """
-  Groupes de l'utilisateur
-  
-  Les rôles passés ne seront pas renvoyés dans cette requête.
-  Pour cela, se référer à `group_history.`
-  """
-  groups(filter: GroupOfMemberFilter): [GroupOfMember!]!
-
-  """
-  Compte caché
-  
-  Le compte utilisateur sera invisible de toutes les requêtes, sauf admin si le filtre
-  de la requête le demande.
-  """
-  hidden: Boolean!
-
-  """
-  Identifiant de l'utilisateur
-  
-  Plus communément appelé AriseID, il est composé de 8 caractères maximum formés du nom
-  et du prénom, et de 4 chiffre représentant l'année d'arrivée pour arriver à un identifiant unique.
-  
-  Par exemple, `acier2020` ou `dupontj2042`.
-  """
-  id: Identifier!
-
-  """
-  Promotion d'origine de l'utilisateur
-  
-  La promotion présupposée de l'utilisateur au moment où il rentre à l'école.
-  
-  Habituellement `année d'entrée + 3`
-  """
-  initialPromotion: Int!
-
-  """
-  Date de la dernière activité via l'API de l'utilisateur
-  
-  Sa valeur est un string JSON [RFC3339] représentant le temps entre 1970-01-01T0:0:0Z,
-  mesuré en UTC, et la date/heure.
-  """
-  lastUsedAt: DateTime
-
-  """
-  Langue
-  
-  Les paramètres régionaux de l'utilisateur, représentés par une balise de
-  langue BCP47 [RFC5646]. Il s'agit généralement d'un code de langue ISO 639-1
-  Alpha-2 [ISO639-1] en minuscules et d'un code de pays ISO 3166-1 Alpha-2
-  [ISO3166-1] en majuscules, séparés par un tiret.
-  
-  Par exemple, `en-US` ou `fr-CA`.
-  """
-  locale: String!
-
-  """
-  Deuxième(s) prénom(s) de l'utilisateur
-  
-  Notez que dans certaines cultures, les personnes peuvent avoir plusieurs seconds prénoms ;
-  tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
-  Notez également que dans certaines cultures, les seconds prénoms ne sont pas utilisés.
-  
-  Par exemple, `Robert`
-  """
-  middleName: String
-
-  """
-  Nom complet de l'utilisateur
-  
-  Présenté sous une forme affichable, avec toutes les parties du nom, **Y COMPRIS** le surnom.
-  
-  Par exemple, `Jean "Foobar" Dupont` ou `Jean Dupont`
-  """
-  name: String!
-
-  """
-  Surnom de l'utilisateur
-  
-  Le surnom qu'a choisi l'utilisateur.
-  
-  Par exemple, `Foobar` ou `Jean`
-  """
-  nickname: String
-
-  """
-  Groupe courant de l'utilisateur
-  
-  Retourne le propriétaire de l'application si ce dernier est un groupe.
-  
-  Les rôles passés ne seront pas renvoyés dans cette requête.
-  Pour cela, se référer à `current_group_history.`
-  """
-  oAuthGroup: GroupOfMember
-
-  """
-  Hash du mot de passe de l'utilisateur
-  
-  Standard actuel : Argon2id
-  
-  Par exemple, `$argon2id$v=19$m=19456,t=2,p=1$XMBjfqZtpEyVxZbGNjKPCg$krFvSFSL3XUr6736galD8YVmGgXpqNSc02VyLqFesPY'`
-  """
-  passwordHash: String
-
-  """
-  Numéro de téléphone de l'utilisateur
-  
-  E.164 [E.164] est le format adopté pour ce champ.
-  
-  Par exemple, `+14255551212` ou `+5626872400`.
-  """
-  phoneNumber: String
-
-  """
-  Numéro de téléphone de l'utilisateur vérifié
-  
-  Vrai si le numéro de téléphone de l'utilisateur a été vérifié, sinon faux.
-  Lorsque cette valeur d'allégation est vraie, cela signifie qu'ARISE a pris
-  des mesures positives pour s'assurer que ce numéro de téléphone était contrôlé
-  par l'utilisateur final au moment où la vérification a été effectuée. Les moyens
-  par lesquels un numéro de téléphone est vérifié sont spécifiques au contexte
-  et dépendent du cadre de confiance ou des accords contractuels dans lesquels
-  les parties opèrent.
-  """
-  phoneNumberVerified: Boolean!
-
-  """
-  URL de la photo de trombinoscope de l'utilisateur
-  
-  Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
-  JPEG ou GIF), plutôt qu'à une page Web contenant une image.
-  
-  Par exemple, `https://api.iiens.net/rest/v0/photo/acier2020`
-  """
-  photo: Url
-
-  """Hash de la photo de trombinoscope de l'utilisateur"""
-  photoThumbnailHash: Base64
-
-  """
-  URL de l'image de profil de l'utilisateur
-  
-  Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
-  JPEG ou GIF), plutôt qu'à une page Web contenant une image.
-  
-  Par exemple, `https://api.iiens.net/picture/acier2020`
-  """
-  picture: Url!
-
-  """Hash de la photo de profil de l'utilisateur"""
-  pictureThumbnailHash: Base64!
-
-  """
-  Pseudo préféré
-  
-  Pseudo abrégé non unique par lequel l'utilisateur souhaite être désigné.
-  
-  Surnom si renseigné par l'utilisateur, sinon nom civil par défaut.
-  
-  Par exemple, `Foobar` ou `dupontj2042`
-  """
-  preferredNickname: String!
-
-  """
-  Nom d'utilisateur préféré
-  
-  Nom abrégé non unique par lequel l'utilisateur souhaite être désigné.
-  
-  Surnom si renseigné par l'utilisateur, sinon identifiant ARISE par défaut.
-  
-  Par exemple, `Foobar` ou `dupontj2042`
-  """
-  preferredUsername: String!
-
-  """
-  URL de la page de profil de l'utilisateur
-  
-  Page de profil sur [www.iiens.net](https://www.iiens.net).
-  
-  Par exemple, `https://www.iiens.net/eleve/acier2020`
-  """
-  profile: Url!
-
-  """
-  Promotion effective de l'utilisateur
-  
-  Promotion de l'utilisateur en tenant compte des redoublements et autres facteurs.
-  """
-  promotion: Int!
-
-  """
-  Accès restreint aux services d'ARISE
-  
-  **VRAI** si la période d'essai est arrivée à terme (42 jours) et que l'utilisateur n'est pas
-  membre d'ARISE **ET** de l'AEIIE.
-  """
-  restrictedAccess: Boolean!
-
-  """
-  Adresse électronique scolaire de l'utilisateur
-  
-  Sa valeur DOIT être conforme à la syntaxe addr-spec de la RFC 5322 [RFC5322].
-  
-  Par exemple, `mael.acier@ensiie.eu` ou `dupont.jean@ensiie.eu`.
-  """
-  schoolEmail: String!
-
-  """
-  Identifiant de connexion scolaire de l'utilisateur
-  
-  Habituellement sous la forme `prenom.nom`
-  """
-  schoolLogin: String!
-
-  """
-  Semestre actuel de l'utilisateur
-  
-  Compteur de semestres en fonction de l'année de promotion effective.
-  Les redoublements sont pris en compte dans l'évaluation de cette valeur.
-  
-  Par exemple, `S1`, `S2`, `S3` *(Le `S` n'est pas ajouté automatiquement)*
-  """
-  semester: Int!
-
-  """
-  Compte suspendu
-  
-  Le compte utilisateur ne sera plus utilisable pour se connecter aux services d'ARISE.
-  """
-  suspended: Boolean!
-
-  """
-  ## Parcours
-  
-  Par exemple, "FISE", "FISA"
-  """
-  training: Training!
-
-  """
-  Nombre de jours restants sur la période d'essai de l'utilisateur
-  
-  **42** lors de la création du compte.
-  """
-  trialPeriodDaysLeft: Int!
-
-  """Compte UNIX"""
-  unixAccount: UnixAccount
-
-  """
-  Date de la dernière mise à jour des informations relatives à l'utilisateur
-  
-  Sa valeur est un string JSON [RFC3339] représentant le temps entre 1970-01-01T0:0:0Z,
-  mesuré en UTC, et la date/heure.
-  """
-  updatedAt: DateTime!
-
-  """UUID du compte de l'utilisateur"""
-  uuid: UUID!
-
-  """
-  URL du site Web ou du blog de l'utilisateur
-  
-  Par exemple, `https://foo.com`
-  """
-  website: Url
-
-  """
-  Année en cours de l'utilisateur
-  
-  Compteur d'années en fonction de l'année de promotion effective.
-  Les redoublements sont pris en compte dans l'évaluation de cette valeur.
-  
-  Par exemple, `1A`, `2A`, `3A` *(Le `A` n'est pas ajouté automatiquement)*
-  """
-  year: Int!
-
-  """
-  Fuseau horaire
-  
-  Chaîne de caractères provenant de la base de données des fuseaux horaires zoneinfo
-  [zoneinfo] représentant le fuseau horaire de l'utilisateur.
-  
-  Par exemple, `Europe/Paris` ou `Amérique/Los_Angeles`.
-  """
-  zoneinfo: String!
+	"""
+	UUID du compte de l'utilisateur
+	"""
+	uuid: UUID!
+
+	"""
+	Identifiant de l'utilisateur
+
+	Plus communément appelé AriseID, il est composé de 8 caractères maximum formés du nom
+	et du prénom, et de 4 chiffre représentant l'année d'arrivée pour arriver à un identifiant unique.
+
+	Par exemple, `acier2020` ou `dupontj2042`.
+	"""
+	id: Identifier!
+
+	"""
+	Hash du mot de passe de l'utilisateur
+
+	Standard actuel : Argon2id
+
+	Par exemple, `$argon2id$v=19$m=19456,t=2,p=1$XMBjfqZtpEyVxZbGNjKPCg$krFvSFSL3XUr6736galD8YVmGgXpqNSc02VyLqFesPY'`
+	"""
+	passwordHash: String
+
+	"""
+	Nom complet de l'utilisateur
+
+	Présenté sous une forme affichable, avec toutes les parties du nom, **Y COMPRIS** le surnom.
+
+	Par exemple, `Jean "Foobar" Dupont` ou `Jean Dupont`
+	"""
+	name: String!
+
+	"""
+	Nom complet administratif de l'utilisateur
+
+	Présenté sous une forme affichable, avec toutes les parties du nom, **SAUF** le surnom.
+
+	Par exemple, `Jean Dupont`
+	"""
+	civilName: String!
+
+	"""
+	Prénom(s) de l'utilisateur
+
+	Notez que dans certaines cultures, les personnes peuvent avoir plusieurs prénoms ;
+	tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
+
+	Par exemple, `Jean` ou `Pierre Jacques`
+	"""
+	givenName: String!
+
+	"""
+	Prénom(s) de naissance de l'utilisateur
+
+	Notez que dans certaines cultures, les personnes peuvent avoir plusieurs prénoms ;
+	tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
+
+	Par exemple, `Jean` ou `Pierre Jacques`
+	"""
+	givenNameAtBirth: String!
+
+	"""
+	Prénom(s) d'usage de l'utilisateur
+
+	Notez que dans certaines cultures, les personnes peuvent avoir plusieurs prénoms ;
+	tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
+
+	Par exemple, `Jeanne` ou `Pierre Jacques`
+	"""
+	givenNameInUse: String
+
+	"""
+	Deuxième(s) prénom(s) de l'utilisateur
+
+	Notez que dans certaines cultures, les personnes peuvent avoir plusieurs seconds prénoms ;
+	tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
+	Notez également que dans certaines cultures, les seconds prénoms ne sont pas utilisés.
+
+	Par exemple, `Robert`
+	"""
+	middleName: String
+
+	"""
+	Prénoms de l'utilisateur
+
+	Tous les prénoms de l'utilisateur concaténés ensembles.
+
+	Par exemple, `Jean Pierre-Jacques` ou `Robert`
+	"""
+	forenames: String!
+
+	"""
+	Nom(s) de famille de l'utilisateur
+
+	Notez que dans certaines cultures, les personnes peuvent avoir plusieurs noms de famille ou
+	aucun nom de famille ; tous peuvent être présents, les noms étant séparés par des caractères d'espacement.
+
+	Par exemple, `Leroy`
+	"""
+	familyName: String!
+
+	"""
+	Surnom de l'utilisateur
+
+	Le surnom qu'a choisi l'utilisateur.
+
+	Par exemple, `Foobar` ou `Jean`
+	"""
+	nickname: String
+
+	"""
+	Pseudo préféré
+
+	Pseudo abrégé non unique par lequel l'utilisateur souhaite être désigné.
+
+	Surnom si renseigné par l'utilisateur, sinon nom civil par défaut.
+
+	Par exemple, `Foobar` ou `dupontj2042`
+	"""
+	preferredNickname: String!
+
+	"""
+	Nom d'utilisateur préféré
+
+	Nom abrégé non unique par lequel l'utilisateur souhaite être désigné.
+
+	Surnom si renseigné par l'utilisateur, sinon identifiant ARISE par défaut.
+
+	Par exemple, `Foobar` ou `dupontj2042`
+	"""
+	preferredUsername: String!
+
+	"""
+	Genre de l'utilisateur
+
+	Par défaut à `UNKNOWN`.
+	"""
+	gender: Gender!
+
+	"""
+	Date de naissance de l'utilisateur
+	"""
+	birthdate: Date
+
+	"""
+	URL de la page de profil de l'utilisateur
+
+	Page de profil sur [www.iiens.net](https://www.iiens.net).
+
+	Par exemple, `https://www.iiens.net/eleve/acier2020`
+	"""
+	profile: Url!
+
+	"""
+	URL de l'image de profil de l'utilisateur
+
+	Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
+	JPEG ou GIF), plutôt qu'à une page Web contenant une image.
+
+	Par exemple, `https://api.iiens.net/picture/acier2020`
+	"""
+	picture: Url!
+
+	"""
+	Hash de la photo de profil de l'utilisateur
+	"""
+	pictureThumbnailHash: Base64!
+
+	"""
+	URL de l'image d'arrière plan de l'utilisateur
+
+	Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
+	JPEG ou GIF), plutôt qu'à une page Web contenant une image.
+
+	Par exemple, `https://api.iiens.net/picture/acier2020`
+	"""
+	backgroundImage: Url!
+
+	"""
+	Hash de l'image d'arrière plan de l'utilisateur
+	"""
+	backgroundImageThumbnailHash: Base64!
+
+	"""
+	URL de la photo de trombinoscope de l'utilisateur
+
+	Cette URL fait référence à un fichier image (par exemple, un fichier image PNG,
+	JPEG ou GIF), plutôt qu'à une page Web contenant une image.
+
+	Par exemple, `https://api.iiens.net/rest/v0/photo/acier2020`
+	"""
+	photo: Url
+
+	"""
+	Hash de la photo de trombinoscope de l'utilisateur
+	"""
+	photoThumbnailHash: Base64
+
+	"""
+	URL du site Web ou du blog de l'utilisateur
+
+	Par exemple, `https://foo.com`
+	"""
+	website: Url
+
+	"""
+	Fuseau horaire
+
+	Chaîne de caractères provenant de la base de données des fuseaux horaires zoneinfo
+	[zoneinfo] représentant le fuseau horaire de l'utilisateur.
+
+	Par exemple, `Europe/Paris` ou `Amérique/Los_Angeles`.
+	"""
+	zoneinfo: String!
+
+	"""
+	Langue
+
+	Les paramètres régionaux de l'utilisateur, représentés par une balise de
+	langue BCP47 [RFC5646]. Il s'agit généralement d'un code de langue ISO 639-1
+	Alpha-2 [ISO639-1] en minuscules et d'un code de pays ISO 3166-1 Alpha-2
+	[ISO3166-1] en majuscules, séparés par un tiret.
+
+	Par exemple, `en-US` ou `fr-CA`.
+	"""
+	locale: String!
+
+	"""
+	Adresse électronique de l'utilisateur
+
+	Un alias de l'adresse électronique véritable de l'utilisateur.
+	À utiliser en priorité pour la création de comptes.
+
+	Par exemple, `acier2020.e2e01581919c@alias.iiens.net`.
+	"""
+	email: String!
+
+	"""
+	Adresse électronique réelle de l'utilisateur
+
+	Sa valeur DOIT être conforme à la syntaxe addr-spec de la RFC 5322 [RFC5322].
+
+	Par exemple, `foo.bar@ensiie.fr` ou `dupont.jean@gmail.com`.
+	"""
+	emailForwardAddress: String
+
+	"""
+	Adresse électronique de l'utilisateur vérifiée
+
+	Vrai si l'adresse électronique préférée de l'utilisateur a été vérifiée, sinon faux.
+	Lorsque cette valeur d'allégation est vraie, cela signifie qu'ARISE a pris des mesures
+	positives pour s'assurer que l'adresse électronique était contrôlée par l'utilisateur
+	au moment où la vérification a été effectuée.
+	"""
+	emailVerified: Boolean!
+
+	"""
+	Identifiant de connexion scolaire de l'utilisateur
+
+	Habituellement sous la forme `prenom.nom`
+	"""
+	schoolLogin: String!
+
+	"""
+	Adresse électronique scolaire de l'utilisateur
+
+	Sa valeur DOIT être conforme à la syntaxe addr-spec de la RFC 5322 [RFC5322].
+
+	Par exemple, `mael.acier@ensiie.eu` ou `dupont.jean@ensiie.eu`.
+	"""
+	schoolEmail: String!
+
+	"""
+	Numéro de téléphone de l'utilisateur
+
+	E.164 [E.164] est le format adopté pour ce champ.
+
+	Par exemple, `+14255551212` ou `+5626872400`.
+	"""
+	phoneNumber: String
+
+	"""
+	Numéro de téléphone de l'utilisateur vérifié
+
+	Vrai si le numéro de téléphone de l'utilisateur a été vérifié, sinon faux.
+	Lorsque cette valeur d'allégation est vraie, cela signifie qu'ARISE a pris
+	des mesures positives pour s'assurer que ce numéro de téléphone était contrôlé
+	par l'utilisateur final au moment où la vérification a été effectuée. Les moyens
+	par lesquels un numéro de téléphone est vérifié sont spécifiques au contexte
+	et dépendent du cadre de confiance ou des accords contractuels dans lesquels
+	les parties opèrent.
+	"""
+	phoneNumberVerified: Boolean!
+
+	"""
+	Adresse de l'utilisateur
+	"""
+	address: Address
+
+	"""
+	Promotion d'origine de l'utilisateur
+
+	La promotion présupposée de l'utilisateur au moment où il rentre à l'école.
+
+	Habituellement `année d'entrée + 3`
+	"""
+	initialPromotion: Int!
+
+	"""
+	Promotion effective de l'utilisateur
+
+	Promotion de l'utilisateur en tenant compte des redoublements et autres facteurs.
+	"""
+	promotion: Int!
+
+	"""
+	Années d'étude d'écart de l'utilisateur
+
+	Désigne des périodes de temps où un utilisateur prend une pause ou un écart par
+	rapport à la norme. Cela peut être causé par une année sabbatique, une année de
+	redoublement ou pour d'autres raisons.
+
+	Par défaut cette valeur est de 0.
+	"""
+	gapYear: Int!
+
+	"""
+	Années d'études requises jusqu'au diplôme
+
+	Par défaut cette valeur est de 03.
+	"""
+	diplomaYearDuration: Int!
+
+	"""
+	Année en cours de l'utilisateur
+
+	Compteur d'années en fonction de l'année de promotion effective.
+	Les redoublements sont pris en compte dans l'évaluation de cette valeur.
+
+	Par exemple, `1A`, `2A`, `3A` *(Le `A` n'est pas ajouté automatiquement)*
+	"""
+	year: Int!
+
+	"""
+	Semestre actuel de l'utilisateur
+
+	Compteur de semestres en fonction de l'année de promotion effective.
+	Les redoublements sont pris en compte dans l'évaluation de cette valeur.
+
+	Par exemple, `S1`, `S2`, `S3` *(Le `S` n'est pas ajouté automatiquement)*
+	"""
+	semester: Int!
+
+	"""
+	## Parcours
+
+	Par exemple, "FISE", "FISA"
+	"""
+	training: Training!
+
+	"""
+	Groupe de l'utilisateur
+	"""
+	group(id: GroupId!): GroupOfMember
+
+	"""
+	Groupes de l'utilisateur
+
+	Les rôles passés ne seront pas renvoyés dans cette requête.
+	Pour cela, se référer à `group_history.`
+	"""
+	groups(filter: GroupOfMemberFilter): [GroupOfMember!]!
+
+	"""
+	Historique des groupes de l'utilisateur
+
+	Cet historique retrace tous les rôles que l'utilisateur à pu prendre au
+	sein des groups de l'école.
+	"""
+	groupHistory(filter: HistoricalGroupOfMemberFilter): [HistoricalGroupOfMember!]!
+
+	"""
+	Groupe courant de l'utilisateur
+
+	Retourne le propriétaire de l'application si ce dernier est un groupe.
+
+	Les rôles passés ne seront pas renvoyés dans cette requête.
+	Pour cela, se référer à `current_group_history.`
+	"""
+	oAuthGroup: GroupOfMember
+
+	"""
+	Adhérent de l'AEIIE
+
+	**VRAI** si l'utilisateur est membre de l'AEIIE. **FAUX** à la création du compte.
+	"""
+	aeiieMember: Boolean!
+
+	"""
+	Nombre de jours restants sur la période d'essai de l'utilisateur
+
+	**42** lors de la création du compte.
+	"""
+	trialPeriodDaysLeft: Int!
+
+	"""
+	Période d'essai étendue de l'utilisateur
+
+	**FAUX** lors de la création du compte.
+
+	Cette variable permet d'outrepasser le champ `restricted_access`.
+	"""
+	extendedTrialPeriod: Boolean!
+
+	"""
+	Accès restreint aux services d'ARISE
+
+	**VRAI** si la période d'essai est arrivée à terme (42 jours) et que l'utilisateur n'est pas
+	membre d'ARISE **ET** de l'AEIIE.
+	"""
+	restrictedAccess: Boolean!
+
+	"""
+	Compte caché
+
+	Le compte utilisateur sera invisible de toutes les requêtes, sauf admin si le filtre
+	de la requête le demande.
+	"""
+	hidden: Boolean!
+
+	"""
+	Compte suspendu
+
+	Le compte utilisateur ne sera plus utilisable pour se connecter aux services d'ARISE.
+	"""
+	suspended: Boolean!
+
+	"""
+	Compte UNIX
+	"""
+	unixAccount: UnixAccount
+
+	"""
+	Date de la création du compte de l'utilisateur
+
+	Sa valeur est un string JSON [RFC3339] représentant le temps  entre 1970-01-01T0:0:0Z,
+	mesuré en UTC, et la date/heure.
+	"""
+	createdAt: DateTime!
+
+	"""
+	Date de la dernière mise à jour des informations relatives à l'utilisateur
+
+	Sa valeur est un string JSON [RFC3339] représentant le temps entre 1970-01-01T0:0:0Z,
+	mesuré en UTC, et la date/heure.
+	"""
+	updatedAt: DateTime!
+
+	"""
+	Date de la dernière activité via l'API de l'utilisateur
+
+	Sa valeur est un string JSON [RFC3339] représentant le temps entre 1970-01-01T0:0:0Z,
+	mesuré en UTC, et la date/heure.
+	"""
+	lastUsedAt: DateTime
 }
 
 type UserConnection {
-  """A list of edges."""
-  edges: [UserEdge!]!
+	"""
+	Information to aid in pagination.
+	"""
+	pageInfo: PageInfo!
 
-  """A list of nodes."""
-  nodes: [User!]!
+	"""
+	A list of edges.
+	"""
+	edges: [UserEdge!]!
 
-  """Information to aid in pagination."""
-  pageInfo: PageInfo!
-  remainingCount: Int!
+	"""
+	A list of nodes.
+	"""
+	nodes: [User!]!
+	remainingCount: Int!
 }
 
-"""An edge in a connection."""
+"""
+An edge in a connection.
+"""
 type UserEdge {
-  """A cursor for use in pagination"""
-  cursor: String!
+	"""
+	The item at the end of the edge
+	"""
+	node: User!
+	remainingCount: Int!
 
-  """The item at the end of the edge"""
-  node: User!
-  remainingCount: Int!
+	"""
+	A cursor for use in pagination
+	"""
+	cursor: String!
 }
 
 input UserFilter {
-  accountUuid: UuidFilter
-  aeiieMember: BooleanFilter
-  backgroundThumbnailHash: NullableFilter
-  birthdate: NullableDateFilter
-  createdAt: DateTimeFilter
-  diplomaYearDuration: Int16Filter
-  email: TextFilter
-  emailVerified: BooleanFilter
-  extendedTrialPeriod: BooleanFilter
-  familyName: TextFilter
-  gapYear: Int16Filter
-  gender: GenderFilter
-  givenName: TextFilter
-  givenNameAtBirth: TextFilter
-  givenNameInUse: NullableTextFilter
-  groups: UserGroupsFilter
-  hidden: BooleanFilter
-  id: TextFilter
-  initialPromotion: Int16Filter
-  lastUsedAt: NullableDateTimeFilter
-  locale: TextFilter
-  middleName: NullableTextFilter
-  nickname: NullableTextFilter
-  or: [UserFilter!]
-  phoneNumber: NullableTextFilter
-  phoneNumberVerified: BooleanFilter
-  photoThumbnailHash: NullableFilter
-  pictureThumbnailHash: NullableFilter
-  promotion: Int16Filter
-  public: BooleanFilter
-  restrictedAccess: BooleanFilter
-  schoolLogin: TextFilter
-  semester: Int16Filter
-  suspended: BooleanFilter
-  training: TextFilter
-  trialPeriodDaysLeft: Int16Filter
-  unixAccount: UnixAccountFilter
-  updatedAt: DateTimeFilter
-  uuid: UuidFilter
-  website: NullableTextFilter
-  year: Int16Filter
-  zoneinfo: TextFilter
+	uuid: UuidFilter
+	givenName: TextFilter
+	givenNameInUse: NullableTextFilter
+	givenNameAtBirth: TextFilter
+	middleName: NullableTextFilter
+	familyName: TextFilter
+	nickname: NullableTextFilter
+	gender: GenderFilter
+	birthdate: NullableDateFilter
+	zoneinfo: TextFilter
+	locale: TextFilter
+	pictureThumbnailHash: NullableFilter
+	backgroundThumbnailHash: NullableFilter
+	photoThumbnailHash: NullableFilter
+	phoneNumber: NullableTextFilter
+	phoneNumberVerified: BooleanFilter
+	schoolLogin: TextFilter
+	promotion: Int16Filter
+	initialPromotion: Int16Filter
+	gapYear: Int16Filter
+	year: Int16Filter
+	diplomaYearDuration: Int16Filter
+	semester: Int16Filter
+	training: TextFilter
+	aeiieMember: BooleanFilter
+	trialPeriodDaysLeft: Int16Filter
+	extendedTrialPeriod: BooleanFilter
+	restrictedAccess: BooleanFilter
+	suspended: BooleanFilter
+	public: BooleanFilter
+	lastUsedAt: NullableDateTimeFilter
+	groups: UserGroupsFilter
+	accountUuid: UuidFilter
+	unixAccount: UnixAccountFilter
+	id: TextFilter
+	email: TextFilter
+	emailVerified: BooleanFilter
+	website: NullableTextFilter
+	hidden: BooleanFilter
+	createdAt: DateTimeFilter
+	updatedAt: DateTimeFilter
+	or: [UserFilter!]
 }
 
 input UserGroupsFilter {
-  active: BooleanFilter
-  hidden: BooleanFilter
-  id: TextFilter
-  name: TextFilter
-  type: GroupTypeFilter
-  uuid: UuidFilter
+	uuid: UuidFilter
+	id: TextFilter
+	name: TextFilter
+	type: GroupTypeFilter
+	active: BooleanFilter
+	hidden: BooleanFilter
 }
 
 input UserId {
-  id: SmolStr
-  personalEmail: String
-  urn: Urn
-  uuid: UUID
+	uuid: UUID
+	id: SmolStr
+	personalEmail: String
+	urn: Urn
 }
 
 input UuidFilter {
-  isIn: [UUID!]!
+	isIn: [UUID!]!
 }
diff --git a/src/routes/quiz/+page.server.ts b/src/routes/quiz/+page.server.ts
index d7c9432..1c69064 100644
--- a/src/routes/quiz/+page.server.ts
+++ b/src/routes/quiz/+page.server.ts
@@ -2,10 +2,11 @@ import { superValidate } from 'sveltekit-superforms';
 import { zod } from 'sveltekit-superforms/adapters';
 import { schema } from './schema';
 import { fail, redirect } from '@sveltejs/kit';
-import { UserDetailsStore } from '$houdini';
 import { getRandomItems } from '$lib/utils';
 import { GameStage, Game } from '$lib/game';
 import { getPromotion } from '$lib/data';
+import { client } from '$lib/graphql';
+import { USER_DETAILS_QUERY } from '$lib/graphql/queries';
 
 type Option = {
 	value: string;
@@ -18,7 +19,9 @@ export async function load(event) {
 	if (game.state.stage === GameStage.GAME_OVER) redirect(303, '/quiz/game-over');
 
 	if (game.state.stage === GameStage.NEXT) {
-		const all = await getPromotion(2023, event);
+		console.time('getPromotion');
+		const all = await getPromotion(2023);
+		console.timeEnd('getPromotion');
 
 		const previous = new Set(game.state.history);
 		const available = all.difference(previous);
@@ -29,13 +32,14 @@ export async function load(event) {
 		game.state.step++;
 	}
 
-	const details = await new UserDetailsStore().fetch({
-		event,
-		variables: { idList: game.state.options }
-	});
+	console.time('userDetailsQuery');
+	const details = await client
+		.query(USER_DETAILS_QUERY, { idList: game.state.options })
+		.toPromise();
+	console.timeEnd('userDetailsQuery');
 
-	if (details.errors) {
-		throw details.errors;
+	if (details.error) {
+		throw details.error;
 	}
 
 	const users = details.data!.page.nodes ?? [];
@@ -44,7 +48,7 @@ export async function load(event) {
 
 	game.save();
 
-	const photo = users.find((node) => node.id === game.state.solution)?.photo!;
+	const photo = users.find((node) => node.id === game.state.solution)?.photo;
 
 	const form = await superValidate(zod(schema));
 	return { form, options, score: game.state.score, step: game.state.step, photo };
diff --git a/src/routes/quiz/+page.svelte b/src/routes/quiz/+page.svelte
index 9a3d34b..17d47ae 100644
--- a/src/routes/quiz/+page.svelte
+++ b/src/routes/quiz/+page.svelte
@@ -1,6 +1,6 @@
 <script lang="ts">
 	import { Fieldset, Control, Label } from 'formsnap';
-	import SuperDebug, { superForm } from 'sveltekit-superforms';
+	import { superForm } from 'sveltekit-superforms';
 
 	export let data;
 	export let form;
@@ -88,8 +88,6 @@
 	</div>
 </form>
 
-<!-- <SuperDebug data={formData} /> -->
-
 <style>
 	:global(body) {
 		background-color: #f65a52;
diff --git a/tsconfig.json b/tsconfig.json
index bba4bd6..431cb8b 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -10,6 +10,12 @@
 		"sourceMap": true,
 		"strict": true,
 		"moduleResolution": "bundler",
-		"rootDirs": [".", "./.svelte-kit/types", "./$houdini/types"]
+		"plugins": [
+			{
+				"name": "gql.tada/ts-plugin",
+				"schema": "./src/lib/graphql/schema.gql",
+				"tadaOutputLocation": "./src/graphql-env.d.ts"
+			}
+		]
 	}
 }
diff --git a/vite.config.ts b/vite.config.ts
index 521b240..bbf8c7d 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,7 +1,6 @@
 import { sveltekit } from '@sveltejs/kit/vite';
-import houdini from 'houdini/vite';
 import { defineConfig } from 'vite';
 
 export default defineConfig({
-	plugins: [houdini(), sveltekit()]
+	plugins: [sveltekit()]
 });
-- 
GitLab