From b3a12a9bf76bd742cf49925fda2509a4ccfc183b Mon Sep 17 00:00:00 2001
From: Dave <dave.pikoppokam@student.uclouvain.be>
Date: Sat, 7 Dec 2024 17:51:24 +0000
Subject: [PATCH] feat: add message reply functionality

---
 backend/.gitignore                            |    2 +-
 backend/app/crud.py                           |    1 +
 backend/app/main.py                           |   24 +-
 backend/app/models.py                         |    3 +
 backend/app/schemas.py                        |    3 +
 frontend/global.d.ts                          |    8 +
 frontend/package-lock.json                    | 1226 +++++++++--------
 frontend/package.json                         |    4 +
 frontend/pnpm-lock.yaml                       |  224 ++-
 frontend/src/lang/en.json                     |    3 +-
 frontend/src/lang/fr.json                     |    1 +
 frontend/src/lib/api/sessions.ts              |    9 +-
 .../lib/components/sessions/message.svelte    |   57 +-
 .../lib/components/sessions/writebox.svelte   |   87 +-
 frontend/src/lib/types/linkify-html.d.ts      |    3 +
 frontend/src/lib/types/message.ts             |   42 +-
 frontend/src/lib/types/session.ts             |   33 +-
 frontend/src/lib/types/svelte-gravatar.d.ts   |   13 +
 frontend/src/lib/utils/replyUtils.ts          |   13 +
 frontend/tsconfig.json                        |   19 +-
 frontend/vite.config.ts                       |   15 +-
 scripts/surveys/groups.csv                    |    3 +-
 scripts/surveys/surveys.csv                   |    2 +-
 23 files changed, 1080 insertions(+), 715 deletions(-)
 create mode 100644 frontend/global.d.ts
 create mode 100644 frontend/src/lib/types/linkify-html.d.ts
 create mode 100644 frontend/src/lib/types/svelte-gravatar.d.ts
 create mode 100644 frontend/src/lib/utils/replyUtils.ts

diff --git a/backend/.gitignore b/backend/.gitignore
index 9923a7cb..467c90a0 100644
--- a/backend/.gitignore
+++ b/backend/.gitignore
@@ -1,3 +1,3 @@
 __pycache__/
-.venv/
+.env/
 **/*.sqlite
\ No newline at end of file
diff --git a/backend/app/crud.py b/backend/app/crud.py
index b120bc57..2f25bae8 100644
--- a/backend/app/crud.py
+++ b/backend/app/crud.py
@@ -214,6 +214,7 @@ def create_message(
         user_id=user.id,
         session_id=session.id,
         message_id=message.message_id,
+        reply_to_message_id=message.reply_to_message_id,
     )
     db.add(db_message)
     db.commit()
diff --git a/backend/app/main.py b/backend/app/main.py
index b429cd5c..3ccd84a7 100644
--- a/backend/app/main.py
+++ b/backend/app/main.py
@@ -19,6 +19,7 @@ from fastapi.responses import StreamingResponse
 from contextlib import asynccontextmanager
 import json
 from jose import jwt
+from jose import ExpiredSignatureError
 from io import StringIO
 import csv
 
@@ -787,7 +788,11 @@ def create_message(
         action,
     )
 
-    return {"id": message.id, "message_id": message.message_id}
+    return {
+        "id": message.id,
+        "message_id": message.message_id,
+        "reply_to": message.reply_to_message_id,
+    }
 
 
 @sessionsRouter.post(
@@ -947,16 +952,21 @@ def study_create(
 
 @websocketRouter.websocket("/sessions/{session_id}")
 async def websocket_session(
-    session_id: int,
-    token: str,
-    websocket: WebSocket,
-    db: Session = Depends(get_db),
+    session_id: int, token: str, websocket: WebSocket, db: Session = Depends(get_db)
 ):
-    payload = jwt.decode(token, config.JWT_SECRET_KEY, algorithms=["HS256"])
+    try:
+        payload = jwt.decode(token, config.JWT_SECRET_KEY, algorithms=["HS256"])
+    except ExpiredSignatureError:
+        await websocket.close(code=1008, reason="Token expired")
+        return
+    except jwt.JWTError:
+        await websocket.close(code=1008, reason="Invalid token")
+        return
 
     current_user = crud.get_user(db, user_id=payload["subject"]["uid"])
     if current_user is None:
-        raise HTTPException(status_code=401, detail="Invalid token")
+        await websocket.close(code=1008, reason="Invalid user")
+        return
 
     db_session = crud.get_session(db, session_id)
     if db_session is None:
diff --git a/backend/app/models.py b/backend/app/models.py
index 7649e88b..c767f36c 100644
--- a/backend/app/models.py
+++ b/backend/app/models.py
@@ -127,8 +127,10 @@ class Message(Base):
     user_id = Column(Integer, ForeignKey("users.id"))
     session_id = Column(Integer, ForeignKey("sessions.id"))
     created_at = Column(DateTime, default=datetime_aware)
+    reply_to_message_id = Column(Integer, ForeignKey("messages.id"), nullable=True)
 
     feedbacks = relationship("MessageFeedback", backref="message")
+    replies = relationship("Message", backref="parent_message", remote_side=[id])
 
     def raw(self):
         return [
@@ -137,6 +139,7 @@ class Message(Base):
             self.content,
             self.user_id,
             self.session_id,
+            self.reply_to_message_id,
             self.created_at,
         ]
 
diff --git a/backend/app/schemas.py b/backend/app/schemas.py
index 8e40e124..464eec16 100644
--- a/backend/app/schemas.py
+++ b/backend/app/schemas.py
@@ -142,6 +142,7 @@ class Message(BaseModel):
     user_id: int
     session_id: int
     created_at: NaiveDatetime
+    reply_to_message_id: int | None = None
     feedbacks: list[MessageFeedback]
 
     class Config:
@@ -155,6 +156,7 @@ class Message(BaseModel):
             "user_id": self.user_id,
             "session_id": self.session_id,
             "created_at": self.created_at.isoformat(),
+            "reply_to_message_id": self.reply_to_message_id,
             "feedbacks": [feedback.to_dict() for feedback in self.feedbacks],
         }
 
@@ -170,6 +172,7 @@ class MessageMetadataCreate(BaseModel):
 class MessageCreate(BaseModel):
     message_id: str | None = None
     content: str
+    reply_to_message_id: int | None = None
     metadata: list[MessageMetadataCreate]
 
     class Config:
diff --git a/frontend/global.d.ts b/frontend/global.d.ts
new file mode 100644
index 00000000..a95b876f
--- /dev/null
+++ b/frontend/global.d.ts
@@ -0,0 +1,8 @@
+// I put this to make modules appear in the global scope
+declare module 'svelte-gravatar';
+declare module 'svelte-waypoint';
+declare module 'emoji-picker-element';
+
+interface ImportMetaEnv {
+	VITE_API_URL: string;
+}
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 0fe6f39d..a9519f48 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -8,6 +8,7 @@
 			"name": "frontend",
 			"version": "0.0.1",
 			"dependencies": {
+				"@sveltekit-i18n/base": "^1.3.7",
 				"@sveltekit-i18n/parser-icu": "^1.0.8",
 				"dayjs": "^1.11.13",
 				"emoji-picker-element": "^1.23.0",
@@ -19,12 +20,15 @@
 				"svelte-select": "^5.8.3"
 			},
 			"devDependencies": {
+				"@rollup/plugin-commonjs": "^28.0.1",
 				"@rollup/plugin-json": "^6.1.0",
 				"@sveltejs/adapter-auto": "^3.3.1",
 				"@sveltejs/adapter-node": "^5.2.9",
 				"@sveltejs/adapter-static": "^3.0.6",
 				"@sveltejs/kit": "^2.8.0",
 				"@sveltejs/vite-plugin-svelte": "^4.0.0",
+				"@tailwindcss/forms": "^0.5.9",
+				"@tsconfig/svelte": "^5.0.4",
 				"@types/eslint": "^9.6.1",
 				"@types/js-cookie": "^3.0.6",
 				"@typescript-eslint/eslint-plugin": "^8.14.0",
@@ -46,6 +50,7 @@
 				"svelte-check": "^4.0.7",
 				"svelte-hero-icons": "^5.2.0",
 				"svelte-i18n": "^4.0.1",
+				"svelte-preprocess": "^6.0.3",
 				"sveltekit-i18n": "^2.4.2",
 				"tailwindcss": "^3.4.14",
 				"tslib": "^2.8.1",
@@ -70,7 +75,6 @@
 			"version": "2.3.0",
 			"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
 			"integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
-			"dev": true,
 			"license": "Apache-2.0",
 			"dependencies": {
 				"@jridgewell/gen-mapping": "^0.3.5",
@@ -472,17 +476,20 @@
 			}
 		},
 		"node_modules/@eslint-community/eslint-utils": {
-			"version": "4.4.0",
-			"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
-			"integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+			"version": "4.4.1",
+			"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
+			"integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
-				"eslint-visitor-keys": "^3.3.0"
+				"eslint-visitor-keys": "^3.4.3"
 			},
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
 			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
+			},
 			"peerDependencies": {
 				"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
 			}
@@ -498,13 +505,13 @@
 			}
 		},
 		"node_modules/@eslint/config-array": {
-			"version": "0.18.0",
-			"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz",
-			"integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==",
+			"version": "0.19.1",
+			"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz",
+			"integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==",
 			"dev": true,
 			"license": "Apache-2.0",
 			"dependencies": {
-				"@eslint/object-schema": "^2.1.4",
+				"@eslint/object-schema": "^2.1.5",
 				"debug": "^4.3.1",
 				"minimatch": "^3.1.2"
 			},
@@ -537,19 +544,22 @@
 			}
 		},
 		"node_modules/@eslint/core": {
-			"version": "0.7.0",
-			"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz",
-			"integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==",
+			"version": "0.9.1",
+			"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz",
+			"integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==",
 			"dev": true,
 			"license": "Apache-2.0",
+			"dependencies": {
+				"@types/json-schema": "^7.0.15"
+			},
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
 			}
 		},
 		"node_modules/@eslint/eslintrc": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
-			"integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
+			"version": "3.2.0",
+			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
+			"integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
@@ -595,9 +605,9 @@
 			}
 		},
 		"node_modules/@eslint/js": {
-			"version": "9.14.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz",
-			"integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==",
+			"version": "9.16.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz",
+			"integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==",
 			"dev": true,
 			"license": "MIT",
 			"engines": {
@@ -605,9 +615,9 @@
 			}
 		},
 		"node_modules/@eslint/object-schema": {
-			"version": "2.1.4",
-			"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz",
-			"integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==",
+			"version": "2.1.5",
+			"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz",
+			"integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==",
 			"dev": true,
 			"license": "Apache-2.0",
 			"engines": {
@@ -615,9 +625,9 @@
 			}
 		},
 		"node_modules/@eslint/plugin-kit": {
-			"version": "0.2.2",
-			"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.2.tgz",
-			"integrity": "sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==",
+			"version": "0.2.4",
+			"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz",
+			"integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==",
 			"dev": true,
 			"license": "Apache-2.0",
 			"dependencies": {
@@ -628,77 +638,78 @@
 			}
 		},
 		"node_modules/@floating-ui/core": {
-			"version": "1.6.6",
-			"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.6.tgz",
-			"integrity": "sha512-Vkvsw6EcpMHjvZZdMkSY+djMGFbt7CRssW99Ne8tar2WLnZ/l3dbxeTShbLQj+/s35h+Qb4cmnob+EzwtjrXGQ==",
+			"version": "1.6.8",
+			"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz",
+			"integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==",
 			"license": "MIT",
 			"dependencies": {
-				"@floating-ui/utils": "^0.2.6"
+				"@floating-ui/utils": "^0.2.8"
 			}
 		},
 		"node_modules/@floating-ui/dom": {
-			"version": "1.6.9",
-			"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.9.tgz",
-			"integrity": "sha512-zB1PcI350t4tkm3rvUhSRKa9sT7vH5CrAbQxW+VaPYJXKAO0gsg4CTueL+6Ajp7XzAQC8CW4Jj1Wgqc0sB6oUQ==",
+			"version": "1.6.12",
+			"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz",
+			"integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==",
 			"license": "MIT",
 			"dependencies": {
 				"@floating-ui/core": "^1.6.0",
-				"@floating-ui/utils": "^0.2.6"
+				"@floating-ui/utils": "^0.2.8"
 			}
 		},
 		"node_modules/@floating-ui/utils": {
-			"version": "0.2.6",
-			"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.6.tgz",
-			"integrity": "sha512-0KI3zGxIUs1KDR/pjQPdJH4Z8nGBm0yJ5WRoRfdw1Kzeh45jkIfA0rmD0kBF6fKHH+xaH7g8y4jIXyAV5MGK3g==",
+			"version": "0.2.8",
+			"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz",
+			"integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==",
 			"license": "MIT"
 		},
 		"node_modules/@formatjs/ecma402-abstract": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz",
-			"integrity": "sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==",
+			"version": "2.2.4",
+			"resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.2.4.tgz",
+			"integrity": "sha512-lFyiQDVvSbQOpU+WFd//ILolGj4UgA/qXrKeZxdV14uKiAUiPAtX6XAn7WBCRi7Mx6I7EybM9E5yYn4BIpZWYg==",
 			"license": "MIT",
 			"dependencies": {
-				"@formatjs/intl-localematcher": "0.5.4",
-				"tslib": "^2.4.0"
+				"@formatjs/fast-memoize": "2.2.3",
+				"@formatjs/intl-localematcher": "0.5.8",
+				"tslib": "2"
 			}
 		},
 		"node_modules/@formatjs/fast-memoize": {
-			"version": "2.2.0",
-			"resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz",
-			"integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==",
+			"version": "2.2.3",
+			"resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.3.tgz",
+			"integrity": "sha512-3jeJ+HyOfu8osl3GNSL4vVHUuWFXR03Iz9jjgI7RwjG6ysu/Ymdr0JRCPHfF5yGbTE6JCrd63EpvX1/WybYRbA==",
 			"license": "MIT",
 			"dependencies": {
-				"tslib": "^2.4.0"
+				"tslib": "2"
 			}
 		},
 		"node_modules/@formatjs/icu-messageformat-parser": {
-			"version": "2.7.8",
-			"resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.8.tgz",
-			"integrity": "sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==",
+			"version": "2.9.4",
+			"resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.4.tgz",
+			"integrity": "sha512-Tbvp5a9IWuxUcpWNIW6GlMQYEc4rwNHR259uUFoKWNN1jM9obf9Ul0e+7r7MvFOBNcN+13K7NuKCKqQiAn1QEg==",
 			"license": "MIT",
 			"dependencies": {
-				"@formatjs/ecma402-abstract": "2.0.0",
-				"@formatjs/icu-skeleton-parser": "1.8.2",
-				"tslib": "^2.4.0"
+				"@formatjs/ecma402-abstract": "2.2.4",
+				"@formatjs/icu-skeleton-parser": "1.8.8",
+				"tslib": "2"
 			}
 		},
 		"node_modules/@formatjs/icu-skeleton-parser": {
-			"version": "1.8.2",
-			"resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.2.tgz",
-			"integrity": "sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==",
+			"version": "1.8.8",
+			"resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.8.tgz",
+			"integrity": "sha512-vHwK3piXwamFcx5YQdCdJxUQ1WdTl6ANclt5xba5zLGDv5Bsur7qz8AD7BevaKxITwpgDeU0u8My3AIibW9ywA==",
 			"license": "MIT",
 			"dependencies": {
-				"@formatjs/ecma402-abstract": "2.0.0",
-				"tslib": "^2.4.0"
+				"@formatjs/ecma402-abstract": "2.2.4",
+				"tslib": "2"
 			}
 		},
 		"node_modules/@formatjs/intl-localematcher": {
-			"version": "0.5.4",
-			"resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz",
-			"integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==",
+			"version": "0.5.8",
+			"resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.8.tgz",
+			"integrity": "sha512-I+WDNWWJFZie+jkfkiK5Mp4hEDyRSEvmyfYadflOno/mmKJKcB17fEpEH0oJu/OWhhCJ8kJBDz2YMd/6cDl7Mg==",
 			"license": "MIT",
 			"dependencies": {
-				"tslib": "^2.4.0"
+				"tslib": "2"
 			}
 		},
 		"node_modules/@humanfs/core": {
@@ -785,40 +796,10 @@
 				"node": ">=12"
 			}
 		},
-		"node_modules/@isaacs/cliui/node_modules/ansi-regex": {
-			"version": "6.0.1",
-			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
-			"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/chalk/ansi-regex?sponsor=1"
-			}
-		},
-		"node_modules/@isaacs/cliui/node_modules/strip-ansi": {
-			"version": "7.1.0",
-			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
-			"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"ansi-regex": "^6.0.1"
-			},
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/chalk/strip-ansi?sponsor=1"
-			}
-		},
 		"node_modules/@jridgewell/gen-mapping": {
 			"version": "0.3.5",
 			"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
 			"integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
-			"dev": true,
 			"license": "MIT",
 			"dependencies": {
 				"@jridgewell/set-array": "^1.2.1",
@@ -833,7 +814,6 @@
 			"version": "3.1.2",
 			"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
 			"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
-			"dev": true,
 			"license": "MIT",
 			"engines": {
 				"node": ">=6.0.0"
@@ -843,7 +823,6 @@
 			"version": "1.2.1",
 			"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
 			"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
-			"dev": true,
 			"license": "MIT",
 			"engines": {
 				"node": ">=6.0.0"
@@ -853,14 +832,12 @@
 			"version": "1.5.0",
 			"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
 			"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
-			"dev": true,
 			"license": "MIT"
 		},
 		"node_modules/@jridgewell/trace-mapping": {
 			"version": "0.3.25",
 			"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
 			"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
-			"dev": true,
 			"license": "MIT",
 			"dependencies": {
 				"@jridgewell/resolve-uri": "^3.1.0",
@@ -950,34 +927,6 @@
 				}
 			}
 		},
-		"node_modules/@rollup/plugin-commonjs/node_modules/fdir": {
-			"version": "6.4.2",
-			"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz",
-			"integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==",
-			"dev": true,
-			"license": "MIT",
-			"peerDependencies": {
-				"picomatch": "^3 || ^4"
-			},
-			"peerDependenciesMeta": {
-				"picomatch": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/@rollup/plugin-commonjs/node_modules/picomatch": {
-			"version": "4.0.2",
-			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
-			"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/jonschlinkert"
-			}
-		},
 		"node_modules/@rollup/plugin-json": {
 			"version": "6.1.0",
 			"resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz",
@@ -1025,15 +974,15 @@
 			}
 		},
 		"node_modules/@rollup/pluginutils": {
-			"version": "5.1.0",
-			"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz",
-			"integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==",
+			"version": "5.1.3",
+			"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz",
+			"integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
 				"@types/estree": "^1.0.0",
 				"estree-walker": "^2.0.2",
-				"picomatch": "^2.3.1"
+				"picomatch": "^4.0.2"
 			},
 			"engines": {
 				"node": ">=14.0.0"
@@ -1048,9 +997,9 @@
 			}
 		},
 		"node_modules/@rollup/rollup-android-arm-eabi": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.25.0.tgz",
-			"integrity": "sha512-CC/ZqFZwlAIbU1wUPisHyV/XRc5RydFrNLtgl3dGYskdwPZdt4HERtKm50a/+DtTlKeCq9IXFEWR+P6blwjqBA==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz",
+			"integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==",
 			"cpu": [
 				"arm"
 			],
@@ -1062,9 +1011,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-android-arm64": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.25.0.tgz",
-			"integrity": "sha512-/Y76tmLGUJqVBXXCfVS8Q8FJqYGhgH4wl4qTA24E9v/IJM0XvJCGQVSW1QZ4J+VURO9h8YCa28sTFacZXwK7Rg==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz",
+			"integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==",
 			"cpu": [
 				"arm64"
 			],
@@ -1076,9 +1025,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-darwin-arm64": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.25.0.tgz",
-			"integrity": "sha512-YVT6L3UrKTlC0FpCZd0MGA7NVdp7YNaEqkENbWQ7AOVOqd/7VzyHpgIpc1mIaxRAo1ZsJRH45fq8j4N63I/vvg==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz",
+			"integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==",
 			"cpu": [
 				"arm64"
 			],
@@ -1090,9 +1039,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-darwin-x64": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.25.0.tgz",
-			"integrity": "sha512-ZRL+gexs3+ZmmWmGKEU43Bdn67kWnMeWXLFhcVv5Un8FQcx38yulHBA7XR2+KQdYIOtD0yZDWBCudmfj6lQJoA==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz",
+			"integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==",
 			"cpu": [
 				"x64"
 			],
@@ -1104,9 +1053,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-freebsd-arm64": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.25.0.tgz",
-			"integrity": "sha512-xpEIXhiP27EAylEpreCozozsxWQ2TJbOLSivGfXhU4G1TBVEYtUPi2pOZBnvGXHyOdLAUUhPnJzH3ah5cqF01g==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz",
+			"integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==",
 			"cpu": [
 				"arm64"
 			],
@@ -1118,9 +1067,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-freebsd-x64": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.25.0.tgz",
-			"integrity": "sha512-sC5FsmZGlJv5dOcURrsnIK7ngc3Kirnx3as2XU9uER+zjfyqIjdcMVgzy4cOawhsssqzoAX19qmxgJ8a14Qrqw==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz",
+			"integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==",
 			"cpu": [
 				"x64"
 			],
@@ -1132,9 +1081,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.25.0.tgz",
-			"integrity": "sha512-uD/dbLSs1BEPzg564TpRAQ/YvTnCds2XxyOndAO8nJhaQcqQGFgv/DAVko/ZHap3boCvxnzYMa3mTkV/B/3SWA==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz",
+			"integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==",
 			"cpu": [
 				"arm"
 			],
@@ -1146,9 +1095,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-arm-musleabihf": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.25.0.tgz",
-			"integrity": "sha512-ZVt/XkrDlQWegDWrwyC3l0OfAF7yeJUF4fq5RMS07YM72BlSfn2fQQ6lPyBNjt+YbczMguPiJoCfaQC2dnflpQ==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz",
+			"integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==",
 			"cpu": [
 				"arm"
 			],
@@ -1160,9 +1109,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-arm64-gnu": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.25.0.tgz",
-			"integrity": "sha512-qboZ+T0gHAW2kkSDPHxu7quaFaaBlynODXpBVnPxUgvWYaE84xgCKAPEYE+fSMd3Zv5PyFZR+L0tCdYCMAtG0A==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz",
+			"integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==",
 			"cpu": [
 				"arm64"
 			],
@@ -1174,9 +1123,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-arm64-musl": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.25.0.tgz",
-			"integrity": "sha512-ndWTSEmAaKr88dBuogGH2NZaxe7u2rDoArsejNslugHZ+r44NfWiwjzizVS1nUOHo+n1Z6qV3X60rqE/HlISgw==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz",
+			"integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==",
 			"cpu": [
 				"arm64"
 			],
@@ -1187,10 +1136,24 @@
 				"linux"
 			]
 		},
+		"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz",
+			"integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==",
+			"cpu": [
+				"loong64"
+			],
+			"dev": true,
+			"license": "MIT",
+			"optional": true,
+			"os": [
+				"linux"
+			]
+		},
 		"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.25.0.tgz",
-			"integrity": "sha512-BVSQvVa2v5hKwJSy6X7W1fjDex6yZnNKy3Kx1JGimccHft6HV0THTwNtC2zawtNXKUu+S5CjXslilYdKBAadzA==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz",
+			"integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==",
 			"cpu": [
 				"ppc64"
 			],
@@ -1202,9 +1165,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-riscv64-gnu": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.25.0.tgz",
-			"integrity": "sha512-G4hTREQrIdeV0PE2JruzI+vXdRnaK1pg64hemHq2v5fhv8C7WjVaeXc9P5i4Q5UC06d/L+zA0mszYIKl+wY8oA==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz",
+			"integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==",
 			"cpu": [
 				"riscv64"
 			],
@@ -1216,9 +1179,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-s390x-gnu": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.25.0.tgz",
-			"integrity": "sha512-9T/w0kQ+upxdkFL9zPVB6zy9vWW1deA3g8IauJxojN4bnz5FwSsUAD034KpXIVX5j5p/rn6XqumBMxfRkcHapQ==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz",
+			"integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==",
 			"cpu": [
 				"s390x"
 			],
@@ -1230,9 +1193,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-x64-gnu": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.25.0.tgz",
-			"integrity": "sha512-ThcnU0EcMDn+J4B9LD++OgBYxZusuA7iemIIiz5yzEcFg04VZFzdFjuwPdlURmYPZw+fgVrFzj4CA64jSTG4Ig==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz",
+			"integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==",
 			"cpu": [
 				"x64"
 			],
@@ -1244,9 +1207,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-linux-x64-musl": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.25.0.tgz",
-			"integrity": "sha512-zx71aY2oQxGxAT1JShfhNG79PnjYhMC6voAjzpu/xmMjDnKNf6Nl/xv7YaB/9SIa9jDYf8RBPWEnjcdlhlv1rQ==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz",
+			"integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==",
 			"cpu": [
 				"x64"
 			],
@@ -1258,9 +1221,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-win32-arm64-msvc": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.25.0.tgz",
-			"integrity": "sha512-JT8tcjNocMs4CylWY/CxVLnv8e1lE7ff1fi6kbGocWwxDq9pj30IJ28Peb+Y8yiPNSF28oad42ApJB8oUkwGww==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz",
+			"integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==",
 			"cpu": [
 				"arm64"
 			],
@@ -1272,9 +1235,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-win32-ia32-msvc": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.25.0.tgz",
-			"integrity": "sha512-dRLjLsO3dNOfSN6tjyVlG+Msm4IiZnGkuZ7G5NmpzwF9oOc582FZG05+UdfTbz5Jd4buK/wMb6UeHFhG18+OEg==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz",
+			"integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==",
 			"cpu": [
 				"ia32"
 			],
@@ -1286,9 +1249,9 @@
 			]
 		},
 		"node_modules/@rollup/rollup-win32-x64-msvc": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.25.0.tgz",
-			"integrity": "sha512-/RqrIFtLB926frMhZD0a5oDa4eFIbyNEwLLloMTEjmqfwZWXywwVVOVmwTsuyhC9HKkVEZcOOi+KV4U9wmOdlg==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz",
+			"integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==",
 			"cpu": [
 				"x64"
 			],
@@ -1300,9 +1263,9 @@
 			]
 		},
 		"node_modules/@steeze-ui/heroicons": {
-			"version": "2.4.0",
-			"resolved": "https://registry.npmjs.org/@steeze-ui/heroicons/-/heroicons-2.4.0.tgz",
-			"integrity": "sha512-gxOytXYV/lQiGxkZQC+CP5IWCa+d/vscRKn4JfZXgF8MZEzg9wfl1tTi/GOr3Eg93YkhlhNDwTIGWjhMaEwmvw==",
+			"version": "2.4.2",
+			"resolved": "https://registry.npmjs.org/@steeze-ui/heroicons/-/heroicons-2.4.2.tgz",
+			"integrity": "sha512-66luL+uaxyC6mcZigewH4phfDxNWj4sH+n6qK2VnY3zcgpMmNAgVQbMGfZYfKhLqrUo13BlqpmhWuHqAUpehlA==",
 			"dev": true,
 			"license": "MIT"
 		},
@@ -1346,9 +1309,9 @@
 			}
 		},
 		"node_modules/@sveltejs/kit": {
-			"version": "2.8.0",
-			"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.8.0.tgz",
-			"integrity": "sha512-HCiWupCuKJQ3aPaC4Xc6lpPdjOOnoGzEiYjOqMqppdtfGtY2ABrx932Vw66ZwS2RGXc0BmZvFvNq5SzqlmDVLg==",
+			"version": "2.9.0",
+			"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.9.0.tgz",
+			"integrity": "sha512-W3E7ed3ChB6kPqRs2H7tcHp+Z7oiTFC6m+lLyAQQuyXeqw6LdNuuwEUla+5VM0OGgqQD+cYD6+7Xq80vVm17Vg==",
 			"dev": true,
 			"hasInstallScript": true,
 			"license": "MIT",
@@ -1356,7 +1319,7 @@
 				"@types/cookie": "^0.6.0",
 				"cookie": "^0.6.0",
 				"devalue": "^5.1.0",
-				"esm-env": "^1.0.0",
+				"esm-env": "^1.2.1",
 				"import-meta-resolve": "^4.1.0",
 				"kleur": "^4.1.5",
 				"magic-string": "^0.30.5",
@@ -1373,15 +1336,15 @@
 				"node": ">=18.13"
 			},
 			"peerDependencies": {
-				"@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1",
+				"@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0",
 				"svelte": "^4.0.0 || ^5.0.0-next.0",
-				"vite": "^5.0.3"
+				"vite": "^5.0.3 || ^6.0.0"
 			}
 		},
 		"node_modules/@sveltejs/vite-plugin-svelte": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-4.0.0.tgz",
-			"integrity": "sha512-kpVJwF+gNiMEsoHaw+FJL76IYiwBikkxYU83+BpqQLdVMff19KeRKLd2wisS8niNBMJ2omv5gG+iGDDwd8jzag==",
+			"version": "4.0.2",
+			"resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-4.0.2.tgz",
+			"integrity": "sha512-Y9r/fWy539XlAC7+5wfNJ4zH6TygUYoQ0Eegzp0zDDqhJ54+92gOyOX1l4MO1cJSx0O+Gp13YePT5XEa3+kX0w==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
@@ -1422,7 +1385,6 @@
 			"version": "1.3.7",
 			"resolved": "https://registry.npmjs.org/@sveltekit-i18n/base/-/base-1.3.7.tgz",
 			"integrity": "sha512-kg1kql1/ro/lIudwFiWrv949Q07gmweln87tflUZR51MNdXXzK4fiJQv5Mw50K/CdQ5BOk/dJ0WOH2vOtBI6yw==",
-			"dev": true,
 			"license": "MIT",
 			"peerDependencies": {
 				"svelte": ">=3.49.0"
@@ -1444,6 +1406,26 @@
 				"intl-messageformat": "^10.1.1"
 			}
 		},
+		"node_modules/@tailwindcss/forms": {
+			"version": "0.5.9",
+			"resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.9.tgz",
+			"integrity": "sha512-tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg==",
+			"dev": true,
+			"license": "MIT",
+			"dependencies": {
+				"mini-svg-data-uri": "^1.2.3"
+			},
+			"peerDependencies": {
+				"tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20"
+			}
+		},
+		"node_modules/@tsconfig/svelte": {
+			"version": "5.0.4",
+			"resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.4.tgz",
+			"integrity": "sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==",
+			"dev": true,
+			"license": "MIT"
+		},
 		"node_modules/@types/cookie": {
 			"version": "0.6.0",
 			"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
@@ -1466,7 +1448,6 @@
 			"version": "1.0.6",
 			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
 			"integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
-			"dev": true,
 			"license": "MIT"
 		},
 		"node_modules/@types/js-cookie": {
@@ -1491,17 +1472,17 @@
 			"license": "MIT"
 		},
 		"node_modules/@typescript-eslint/eslint-plugin": {
-			"version": "8.14.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.14.0.tgz",
-			"integrity": "sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==",
+			"version": "8.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.17.0.tgz",
+			"integrity": "sha512-HU1KAdW3Tt8zQkdvNoIijfWDMvdSweFYm4hWh+KwhPstv+sCmWb89hCIP8msFm9N1R/ooh9honpSuvqKWlYy3w==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
 				"@eslint-community/regexpp": "^4.10.0",
-				"@typescript-eslint/scope-manager": "8.14.0",
-				"@typescript-eslint/type-utils": "8.14.0",
-				"@typescript-eslint/utils": "8.14.0",
-				"@typescript-eslint/visitor-keys": "8.14.0",
+				"@typescript-eslint/scope-manager": "8.17.0",
+				"@typescript-eslint/type-utils": "8.17.0",
+				"@typescript-eslint/utils": "8.17.0",
+				"@typescript-eslint/visitor-keys": "8.17.0",
 				"graphemer": "^1.4.0",
 				"ignore": "^5.3.1",
 				"natural-compare": "^1.4.0",
@@ -1525,16 +1506,16 @@
 			}
 		},
 		"node_modules/@typescript-eslint/parser": {
-			"version": "8.14.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.14.0.tgz",
-			"integrity": "sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA==",
+			"version": "8.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.17.0.tgz",
+			"integrity": "sha512-Drp39TXuUlD49F7ilHHCG7TTg8IkA+hxCuULdmzWYICxGXvDXmDmWEjJYZQYgf6l/TFfYNE167m7isnc3xlIEg==",
 			"dev": true,
 			"license": "BSD-2-Clause",
 			"dependencies": {
-				"@typescript-eslint/scope-manager": "8.14.0",
-				"@typescript-eslint/types": "8.14.0",
-				"@typescript-eslint/typescript-estree": "8.14.0",
-				"@typescript-eslint/visitor-keys": "8.14.0",
+				"@typescript-eslint/scope-manager": "8.17.0",
+				"@typescript-eslint/types": "8.17.0",
+				"@typescript-eslint/typescript-estree": "8.17.0",
+				"@typescript-eslint/visitor-keys": "8.17.0",
 				"debug": "^4.3.4"
 			},
 			"engines": {
@@ -1554,14 +1535,14 @@
 			}
 		},
 		"node_modules/@typescript-eslint/scope-manager": {
-			"version": "8.14.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.14.0.tgz",
-			"integrity": "sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==",
+			"version": "8.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.17.0.tgz",
+			"integrity": "sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/types": "8.14.0",
-				"@typescript-eslint/visitor-keys": "8.14.0"
+				"@typescript-eslint/types": "8.17.0",
+				"@typescript-eslint/visitor-keys": "8.17.0"
 			},
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1572,14 +1553,14 @@
 			}
 		},
 		"node_modules/@typescript-eslint/type-utils": {
-			"version": "8.14.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.14.0.tgz",
-			"integrity": "sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==",
+			"version": "8.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.17.0.tgz",
+			"integrity": "sha512-q38llWJYPd63rRnJ6wY/ZQqIzPrBCkPdpIsaCfkR3Q4t3p6sb422zougfad4TFW9+ElIFLVDzWGiGAfbb/v2qw==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/typescript-estree": "8.14.0",
-				"@typescript-eslint/utils": "8.14.0",
+				"@typescript-eslint/typescript-estree": "8.17.0",
+				"@typescript-eslint/utils": "8.17.0",
 				"debug": "^4.3.4",
 				"ts-api-utils": "^1.3.0"
 			},
@@ -1590,6 +1571,9 @@
 				"type": "opencollective",
 				"url": "https://opencollective.com/typescript-eslint"
 			},
+			"peerDependencies": {
+				"eslint": "^8.57.0 || ^9.0.0"
+			},
 			"peerDependenciesMeta": {
 				"typescript": {
 					"optional": true
@@ -1597,9 +1581,9 @@
 			}
 		},
 		"node_modules/@typescript-eslint/types": {
-			"version": "8.14.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.14.0.tgz",
-			"integrity": "sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==",
+			"version": "8.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.17.0.tgz",
+			"integrity": "sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==",
 			"dev": true,
 			"license": "MIT",
 			"engines": {
@@ -1611,14 +1595,14 @@
 			}
 		},
 		"node_modules/@typescript-eslint/typescript-estree": {
-			"version": "8.14.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.14.0.tgz",
-			"integrity": "sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==",
+			"version": "8.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.17.0.tgz",
+			"integrity": "sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==",
 			"dev": true,
 			"license": "BSD-2-Clause",
 			"dependencies": {
-				"@typescript-eslint/types": "8.14.0",
-				"@typescript-eslint/visitor-keys": "8.14.0",
+				"@typescript-eslint/types": "8.17.0",
+				"@typescript-eslint/visitor-keys": "8.17.0",
 				"debug": "^4.3.4",
 				"fast-glob": "^3.3.2",
 				"is-glob": "^4.0.3",
@@ -1640,16 +1624,16 @@
 			}
 		},
 		"node_modules/@typescript-eslint/utils": {
-			"version": "8.14.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.14.0.tgz",
-			"integrity": "sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==",
+			"version": "8.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.17.0.tgz",
+			"integrity": "sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"@typescript-eslint/scope-manager": "8.14.0",
-				"@typescript-eslint/types": "8.14.0",
-				"@typescript-eslint/typescript-estree": "8.14.0"
+				"@typescript-eslint/scope-manager": "8.17.0",
+				"@typescript-eslint/types": "8.17.0",
+				"@typescript-eslint/typescript-estree": "8.17.0"
 			},
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1660,17 +1644,22 @@
 			},
 			"peerDependencies": {
 				"eslint": "^8.57.0 || ^9.0.0"
+			},
+			"peerDependenciesMeta": {
+				"typescript": {
+					"optional": true
+				}
 			}
 		},
 		"node_modules/@typescript-eslint/visitor-keys": {
-			"version": "8.14.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.14.0.tgz",
-			"integrity": "sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==",
+			"version": "8.17.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.17.0.tgz",
+			"integrity": "sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
-				"@typescript-eslint/types": "8.14.0",
-				"eslint-visitor-keys": "^3.4.3"
+				"@typescript-eslint/types": "8.17.0",
+				"eslint-visitor-keys": "^4.2.0"
 			},
 			"engines": {
 				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1680,6 +1669,19 @@
 				"url": "https://opencollective.com/typescript-eslint"
 			}
 		},
+		"node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+			"integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+			"dev": true,
+			"license": "Apache-2.0",
+			"engines": {
+				"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+			},
+			"funding": {
+				"url": "https://opencollective.com/eslint"
+			}
+		},
 		"node_modules/@zerodevx/svelte-toast": {
 			"version": "0.9.6",
 			"resolved": "https://registry.npmjs.org/@zerodevx/svelte-toast/-/svelte-toast-0.9.6.tgz",
@@ -1694,7 +1696,6 @@
 			"version": "8.14.0",
 			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
 			"integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
-			"dev": true,
 			"license": "MIT",
 			"bin": {
 				"acorn": "bin/acorn"
@@ -1717,7 +1718,6 @@
 			"version": "1.4.13",
 			"resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz",
 			"integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==",
-			"dev": true,
 			"license": "MIT",
 			"peerDependencies": {
 				"acorn": ">=8.9.0"
@@ -1741,13 +1741,16 @@
 			}
 		},
 		"node_modules/ansi-regex": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+			"version": "6.1.0",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+			"integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
 			"dev": true,
 			"license": "MIT",
 			"engines": {
-				"node": ">=8"
+				"node": ">=12"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/ansi-regex?sponsor=1"
 			}
 		},
 		"node_modules/ansi-styles": {
@@ -1787,6 +1790,19 @@
 				"node": ">= 8"
 			}
 		},
+		"node_modules/anymatch/node_modules/picomatch": {
+			"version": "2.3.1",
+			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+			"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+			"dev": true,
+			"license": "MIT",
+			"engines": {
+				"node": ">=8.6"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/jonschlinkert"
+			}
+		},
 		"node_modules/arg": {
 			"version": "5.0.2",
 			"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
@@ -1805,7 +1821,6 @@
 			"version": "5.3.2",
 			"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
 			"integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
-			"dev": true,
 			"license": "Apache-2.0",
 			"engines": {
 				"node": ">= 0.4"
@@ -1857,9 +1872,9 @@
 			}
 		},
 		"node_modules/axios": {
-			"version": "1.7.7",
-			"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
-			"integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+			"version": "1.7.9",
+			"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+			"integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
@@ -1899,7 +1914,6 @@
 			"version": "4.1.0",
 			"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
 			"integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
-			"dev": true,
 			"license": "Apache-2.0",
 			"engines": {
 				"node": ">= 0.4"
@@ -1949,9 +1963,9 @@
 			}
 		},
 		"node_modules/browserslist": {
-			"version": "4.23.3",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz",
-			"integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==",
+			"version": "4.24.2",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
+			"integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
 			"dev": true,
 			"funding": [
 				{
@@ -1969,10 +1983,10 @@
 			],
 			"license": "MIT",
 			"dependencies": {
-				"caniuse-lite": "^1.0.30001646",
-				"electron-to-chromium": "^1.5.4",
+				"caniuse-lite": "^1.0.30001669",
+				"electron-to-chromium": "^1.5.41",
 				"node-releases": "^2.0.18",
-				"update-browserslist-db": "^1.1.0"
+				"update-browserslist-db": "^1.1.1"
 			},
 			"bin": {
 				"browserslist": "cli.js"
@@ -2002,9 +2016,9 @@
 			}
 		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001650",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001650.tgz",
-			"integrity": "sha512-fgEc7hP/LB7iicdXHUI9VsBsMZmUmlVJeQP2qqQW+3lkqVhbmjEU8zp+h5stWeilX+G7uXuIUIIlWlDw9jdt8g==",
+			"version": "1.0.30001687",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz",
+			"integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==",
 			"dev": true,
 			"funding": [
 				{
@@ -2049,41 +2063,19 @@
 			}
 		},
 		"node_modules/chokidar": {
-			"version": "3.6.0",
-			"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
-			"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
+			"integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
-				"anymatch": "~3.1.2",
-				"braces": "~3.0.2",
-				"glob-parent": "~5.1.2",
-				"is-binary-path": "~2.1.0",
-				"is-glob": "~4.0.1",
-				"normalize-path": "~3.0.0",
-				"readdirp": "~3.6.0"
+				"readdirp": "^4.0.1"
 			},
 			"engines": {
-				"node": ">= 8.10.0"
+				"node": ">= 14.16.0"
 			},
 			"funding": {
 				"url": "https://paulmillr.com/funding/"
-			},
-			"optionalDependencies": {
-				"fsevents": "~2.3.2"
-			}
-		},
-		"node_modules/chokidar/node_modules/glob-parent": {
-			"version": "5.1.2",
-			"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-			"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-			"dev": true,
-			"license": "ISC",
-			"dependencies": {
-				"is-glob": "^4.0.1"
-			},
-			"engines": {
-				"node": ">= 6"
 			}
 		},
 		"node_modules/cli-color": {
@@ -2184,9 +2176,9 @@
 			}
 		},
 		"node_modules/cross-spawn": {
-			"version": "7.0.3",
-			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-			"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+			"version": "7.0.6",
+			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+			"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
@@ -2282,9 +2274,9 @@
 			"license": "MIT"
 		},
 		"node_modules/debug": {
-			"version": "4.3.7",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
-			"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+			"version": "4.4.0",
+			"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+			"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
@@ -2416,16 +2408,16 @@
 			"license": "MIT"
 		},
 		"node_modules/electron-to-chromium": {
-			"version": "1.5.5",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz",
-			"integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==",
+			"version": "1.5.71",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.71.tgz",
+			"integrity": "sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==",
 			"dev": true,
 			"license": "ISC"
 		},
 		"node_modules/emoji-picker-element": {
-			"version": "1.23.0",
-			"resolved": "https://registry.npmjs.org/emoji-picker-element/-/emoji-picker-element-1.23.0.tgz",
-			"integrity": "sha512-eITYquXyUoaTkpxJxEMIzCO6y3xpFxLvLuIRbnG+fL5u0aicHzKFvjSScrOSEwqg+2LWUlDqu08vqBFvtBOAeQ==",
+			"version": "1.25.0",
+			"resolved": "https://registry.npmjs.org/emoji-picker-element/-/emoji-picker-element-1.25.0.tgz",
+			"integrity": "sha512-UcUMxqIuneLCsEJ5KpqTD1xaHZyUpg6Oa7uCVe5AMXXpsW3C2TNegbNLXj2/rlbyr6qVMf7lXTFyzvFEarOIUg==",
 			"license": "Apache-2.0"
 		},
 		"node_modules/emoji-regex": {
@@ -2557,9 +2549,9 @@
 			}
 		},
 		"node_modules/escalade": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
-			"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+			"version": "3.2.0",
+			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+			"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
 			"dev": true,
 			"license": "MIT",
 			"engines": {
@@ -2579,27 +2571,27 @@
 			}
 		},
 		"node_modules/eslint": {
-			"version": "9.14.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz",
-			"integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==",
+			"version": "9.16.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz",
+			"integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.2.0",
 				"@eslint-community/regexpp": "^4.12.1",
-				"@eslint/config-array": "^0.18.0",
-				"@eslint/core": "^0.7.0",
-				"@eslint/eslintrc": "^3.1.0",
-				"@eslint/js": "9.14.0",
-				"@eslint/plugin-kit": "^0.2.0",
+				"@eslint/config-array": "^0.19.0",
+				"@eslint/core": "^0.9.0",
+				"@eslint/eslintrc": "^3.2.0",
+				"@eslint/js": "9.16.0",
+				"@eslint/plugin-kit": "^0.2.3",
 				"@humanfs/node": "^0.16.6",
 				"@humanwhocodes/module-importer": "^1.0.1",
-				"@humanwhocodes/retry": "^0.4.0",
+				"@humanwhocodes/retry": "^0.4.1",
 				"@types/estree": "^1.0.6",
 				"@types/json-schema": "^7.0.15",
 				"ajv": "^6.12.4",
 				"chalk": "^4.0.0",
-				"cross-spawn": "^7.0.2",
+				"cross-spawn": "^7.0.5",
 				"debug": "^4.3.2",
 				"escape-string-regexp": "^4.0.0",
 				"eslint-scope": "^8.2.0",
@@ -2618,8 +2610,7 @@
 				"lodash.merge": "^4.6.2",
 				"minimatch": "^3.1.2",
 				"natural-compare": "^1.4.0",
-				"optionator": "^0.9.3",
-				"text-table": "^0.2.0"
+				"optionator": "^0.9.3"
 			},
 			"bin": {
 				"eslint": "bin/eslint.js"
@@ -2669,9 +2660,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-svelte": {
-			"version": "2.46.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.46.0.tgz",
-			"integrity": "sha512-1A7iEMkzmCZ9/Iz+EAfOGYL8IoIG6zeKEq1SmpxGeM5SXmoQq+ZNnCpXFVJpsxPWYx8jIVGMerQMzX20cqUl0g==",
+			"version": "2.46.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.46.1.tgz",
+			"integrity": "sha512-7xYr2o4NID/f9OEYMqxsEQsCsj4KaMy4q5sANaKkAb6/QeCjYFxRmDm2S3YC3A3pl1kyPZ/syOx/i7LcWYSbIw==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
@@ -2771,10 +2762,9 @@
 			}
 		},
 		"node_modules/esm-env": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz",
-			"integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==",
-			"dev": true,
+			"version": "1.2.1",
+			"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.1.tgz",
+			"integrity": "sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==",
 			"license": "MIT"
 		},
 		"node_modules/esniff": {
@@ -2838,10 +2828,9 @@
 			}
 		},
 		"node_modules/esrap": {
-			"version": "1.2.2",
-			"resolved": "https://registry.npmjs.org/esrap/-/esrap-1.2.2.tgz",
-			"integrity": "sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==",
-			"dev": true,
+			"version": "1.2.3",
+			"resolved": "https://registry.npmjs.org/esrap/-/esrap-1.2.3.tgz",
+			"integrity": "sha512-ZlQmCCK+n7SGoqo7DnfKaP1sJZa49P01/dXzmjCASSo04p72w8EksT2NMK8CEX8DhKsfJXANioIw8VyHNsBfvQ==",
 			"license": "MIT",
 			"dependencies": {
 				"@jridgewell/sourcemap-codec": "^1.4.15",
@@ -2977,6 +2966,21 @@
 				"reusify": "^1.0.4"
 			}
 		},
+		"node_modules/fdir": {
+			"version": "6.4.2",
+			"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz",
+			"integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==",
+			"dev": true,
+			"license": "MIT",
+			"peerDependencies": {
+				"picomatch": "^3 || ^4"
+			},
+			"peerDependenciesMeta": {
+				"picomatch": {
+					"optional": true
+				}
+			}
+		},
 		"node_modules/file-entry-cache": {
 			"version": "8.0.0",
 			"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
@@ -3035,16 +3039,16 @@
 			}
 		},
 		"node_modules/flatted": {
-			"version": "3.3.1",
-			"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
-			"integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
+			"version": "3.3.2",
+			"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
+			"integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
 			"dev": true,
 			"license": "ISC"
 		},
 		"node_modules/follow-redirects": {
-			"version": "1.15.6",
-			"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
-			"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+			"version": "1.15.9",
+			"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+			"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
 			"dev": true,
 			"funding": [
 				{
@@ -3063,9 +3067,9 @@
 			}
 		},
 		"node_modules/foreground-child": {
-			"version": "3.2.1",
-			"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
-			"integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
+			"version": "3.3.0",
+			"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+			"integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
 			"dev": true,
 			"license": "ISC",
 			"dependencies": {
@@ -3080,9 +3084,9 @@
 			}
 		},
 		"node_modules/form-data": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
-			"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+			"integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
@@ -3266,9 +3270,9 @@
 			}
 		},
 		"node_modules/ignore": {
-			"version": "5.3.1",
-			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
-			"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+			"version": "5.3.2",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+			"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
 			"dev": true,
 			"license": "MIT",
 			"engines": {
@@ -3328,15 +3332,15 @@
 			}
 		},
 		"node_modules/intl-messageformat": {
-			"version": "10.5.14",
-			"resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.14.tgz",
-			"integrity": "sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==",
+			"version": "10.7.7",
+			"resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.7.tgz",
+			"integrity": "sha512-F134jIoeYMro/3I0h08D0Yt4N9o9pjddU/4IIxMMURqbAtI2wu70X8hvG1V48W49zXHXv3RKSF/po+0fDfsGjA==",
 			"license": "BSD-3-Clause",
 			"dependencies": {
-				"@formatjs/ecma402-abstract": "2.0.0",
-				"@formatjs/fast-memoize": "2.2.0",
-				"@formatjs/icu-messageformat-parser": "2.7.8",
-				"tslib": "^2.4.0"
+				"@formatjs/ecma402-abstract": "2.2.4",
+				"@formatjs/fast-memoize": "2.2.3",
+				"@formatjs/icu-messageformat-parser": "2.9.4",
+				"tslib": "2"
 			}
 		},
 		"node_modules/is-binary-path": {
@@ -3359,9 +3363,9 @@
 			"license": "MIT"
 		},
 		"node_modules/is-core-module": {
-			"version": "2.15.0",
-			"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz",
-			"integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==",
+			"version": "2.15.1",
+			"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+			"integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
@@ -3562,9 +3566,9 @@
 			"license": "MIT"
 		},
 		"node_modules/less": {
-			"version": "4.2.0",
-			"resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz",
-			"integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==",
+			"version": "4.2.1",
+			"resolved": "https://registry.npmjs.org/less/-/less-4.2.1.tgz",
+			"integrity": "sha512-CasaJidTIhWmjcqv0Uj5vccMI7pJgfD9lMkKtlnTHAdJdYK/7l8pM9tumLyJ0zhbD4KJLo/YvTj+xznQd5NBhg==",
 			"dev": true,
 			"license": "Apache-2.0",
 			"dependencies": {
@@ -3620,25 +3624,24 @@
 			"license": "MIT"
 		},
 		"node_modules/linkify-html": {
-			"version": "4.1.3",
-			"resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.1.3.tgz",
-			"integrity": "sha512-Ejb8X/pOxB4IVqG1U37tnF85UW3JtX+eHudH3zlZ2pODz2e/J7zQ/vj+VDWffwhTecJqdRehhluwrRmKoJz+iQ==",
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/linkify-html/-/linkify-html-4.2.0.tgz",
+			"integrity": "sha512-bVXuLiWmGwvlH95hq6q9DFGqTsQeFSGw/nHmvvjGMZv9T3GqkxuW2d2SOgk/a4DV2ajeS4c37EqlF16cjOj7GA==",
 			"license": "MIT",
 			"peerDependencies": {
 				"linkifyjs": "^4.0.0"
 			}
 		},
 		"node_modules/linkifyjs": {
-			"version": "4.1.3",
-			"resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz",
-			"integrity": "sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==",
+			"version": "4.2.0",
+			"resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.2.0.tgz",
+			"integrity": "sha512-pCj3PrQyATaoTYKHrgWRF3SJwsm61udVh+vuls/Rl6SptiDhgE7ziUIudAedRY9QEfynmM7/RmLEfPUyw1HPCw==",
 			"license": "MIT"
 		},
 		"node_modules/locate-character": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
 			"integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
-			"dev": true,
 			"license": "MIT"
 		},
 		"node_modules/locate-path": {
@@ -3682,10 +3685,9 @@
 			}
 		},
 		"node_modules/magic-string": {
-			"version": "0.30.12",
-			"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz",
-			"integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
-			"dev": true,
+			"version": "0.30.14",
+			"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz",
+			"integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==",
 			"license": "MIT",
 			"dependencies": {
 				"@jridgewell/sourcemap-codec": "^1.5.0"
@@ -3772,6 +3774,19 @@
 				"node": ">=8.6"
 			}
 		},
+		"node_modules/micromatch/node_modules/picomatch": {
+			"version": "2.3.1",
+			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+			"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+			"dev": true,
+			"license": "MIT",
+			"engines": {
+				"node": ">=8.6"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/jonschlinkert"
+			}
+		},
 		"node_modules/mime": {
 			"version": "1.6.0",
 			"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
@@ -3809,6 +3824,16 @@
 				"node": ">= 0.6"
 			}
 		},
+		"node_modules/mini-svg-data-uri": {
+			"version": "1.4.4",
+			"resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
+			"integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
+			"dev": true,
+			"license": "MIT",
+			"bin": {
+				"mini-svg-data-uri": "cli.js"
+			}
+		},
 		"node_modules/minimatch": {
 			"version": "9.0.5",
 			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
@@ -3878,9 +3903,9 @@
 			}
 		},
 		"node_modules/nanoid": {
-			"version": "3.3.7",
-			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
-			"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+			"version": "3.3.8",
+			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+			"integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
 			"funding": [
 				{
 					"type": "github",
@@ -4025,9 +4050,9 @@
 			}
 		},
 		"node_modules/package-json-from-dist": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
-			"integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+			"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
 			"dev": true,
 			"license": "BlueOak-1.0.0"
 		},
@@ -4111,13 +4136,13 @@
 			"license": "ISC"
 		},
 		"node_modules/picomatch": {
-			"version": "2.3.1",
-			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-			"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+			"version": "4.0.2",
+			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+			"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
 			"dev": true,
 			"license": "MIT",
 			"engines": {
-				"node": ">=8.6"
+				"node": ">=12"
 			},
 			"funding": {
 				"url": "https://github.com/sponsors/jonschlinkert"
@@ -4311,9 +4336,9 @@
 			}
 		},
 		"node_modules/postcss-selector-parser": {
-			"version": "6.1.1",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz",
-			"integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==",
+			"version": "6.1.2",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+			"integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
@@ -4342,9 +4367,9 @@
 			}
 		},
 		"node_modules/prettier": {
-			"version": "3.3.3",
-			"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
-			"integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+			"version": "3.4.2",
+			"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
+			"integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
 			"dev": true,
 			"license": "MIT",
 			"bin": {
@@ -4358,9 +4383,9 @@
 			}
 		},
 		"node_modules/prettier-plugin-svelte": {
-			"version": "3.2.8",
-			"resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.8.tgz",
-			"integrity": "sha512-PAHmmU5cGZdnhW4mWhmvxuG2PVbbHIxUuPOdUKvfE+d4Qt2d29iU5VWrPdsaW5YqVEE0nqhlvN4eoKmVMpIF3Q==",
+			"version": "3.3.2",
+			"resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.3.2.tgz",
+			"integrity": "sha512-kRPjH8wSj2iu+dO+XaUv4vD8qr5mdDmlak3IT/7AOgGIMRG86z/EHOLauFcClKEnOUf4A4nOA7sre5KrJD4Raw==",
 			"dev": true,
 			"license": "MIT",
 			"peerDependencies": {
@@ -4435,16 +4460,17 @@
 			}
 		},
 		"node_modules/readdirp": {
-			"version": "3.6.0",
-			"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-			"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+			"version": "4.0.2",
+			"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
+			"integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
 			"dev": true,
 			"license": "MIT",
-			"dependencies": {
-				"picomatch": "^2.2.1"
-			},
 			"engines": {
-				"node": ">=8.10.0"
+				"node": ">= 14.16.0"
+			},
+			"funding": {
+				"type": "individual",
+				"url": "https://paulmillr.com/funding/"
 			}
 		},
 		"node_modules/resolve": {
@@ -4487,9 +4513,9 @@
 			}
 		},
 		"node_modules/rollup": {
-			"version": "4.25.0",
-			"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.25.0.tgz",
-			"integrity": "sha512-uVbClXmR6wvx5R1M3Od4utyLUxrmOcEm3pAtMphn73Apq19PDtHpgZoEvqH2YnnaNUuvKmg2DgRd2Sqv+odyqg==",
+			"version": "4.28.1",
+			"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz",
+			"integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
@@ -4503,24 +4529,25 @@
 				"npm": ">=8.0.0"
 			},
 			"optionalDependencies": {
-				"@rollup/rollup-android-arm-eabi": "4.25.0",
-				"@rollup/rollup-android-arm64": "4.25.0",
-				"@rollup/rollup-darwin-arm64": "4.25.0",
-				"@rollup/rollup-darwin-x64": "4.25.0",
-				"@rollup/rollup-freebsd-arm64": "4.25.0",
-				"@rollup/rollup-freebsd-x64": "4.25.0",
-				"@rollup/rollup-linux-arm-gnueabihf": "4.25.0",
-				"@rollup/rollup-linux-arm-musleabihf": "4.25.0",
-				"@rollup/rollup-linux-arm64-gnu": "4.25.0",
-				"@rollup/rollup-linux-arm64-musl": "4.25.0",
-				"@rollup/rollup-linux-powerpc64le-gnu": "4.25.0",
-				"@rollup/rollup-linux-riscv64-gnu": "4.25.0",
-				"@rollup/rollup-linux-s390x-gnu": "4.25.0",
-				"@rollup/rollup-linux-x64-gnu": "4.25.0",
-				"@rollup/rollup-linux-x64-musl": "4.25.0",
-				"@rollup/rollup-win32-arm64-msvc": "4.25.0",
-				"@rollup/rollup-win32-ia32-msvc": "4.25.0",
-				"@rollup/rollup-win32-x64-msvc": "4.25.0",
+				"@rollup/rollup-android-arm-eabi": "4.28.1",
+				"@rollup/rollup-android-arm64": "4.28.1",
+				"@rollup/rollup-darwin-arm64": "4.28.1",
+				"@rollup/rollup-darwin-x64": "4.28.1",
+				"@rollup/rollup-freebsd-arm64": "4.28.1",
+				"@rollup/rollup-freebsd-x64": "4.28.1",
+				"@rollup/rollup-linux-arm-gnueabihf": "4.28.1",
+				"@rollup/rollup-linux-arm-musleabihf": "4.28.1",
+				"@rollup/rollup-linux-arm64-gnu": "4.28.1",
+				"@rollup/rollup-linux-arm64-musl": "4.28.1",
+				"@rollup/rollup-linux-loongarch64-gnu": "4.28.1",
+				"@rollup/rollup-linux-powerpc64le-gnu": "4.28.1",
+				"@rollup/rollup-linux-riscv64-gnu": "4.28.1",
+				"@rollup/rollup-linux-s390x-gnu": "4.28.1",
+				"@rollup/rollup-linux-x64-gnu": "4.28.1",
+				"@rollup/rollup-linux-x64-musl": "4.28.1",
+				"@rollup/rollup-win32-arm64-msvc": "4.28.1",
+				"@rollup/rollup-win32-ia32-msvc": "4.28.1",
+				"@rollup/rollup-win32-x64-msvc": "4.28.1",
 				"fsevents": "~2.3.2"
 			}
 		},
@@ -4605,9 +4632,9 @@
 			}
 		},
 		"node_modules/set-cookie-parser": {
-			"version": "2.7.0",
-			"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz",
-			"integrity": "sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==",
+			"version": "2.7.1",
+			"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
+			"integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
 			"dev": true,
 			"license": "MIT"
 		},
@@ -4716,6 +4743,16 @@
 				"node": ">=8"
 			}
 		},
+		"node_modules/string-width-cjs/node_modules/ansi-regex": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+			"dev": true,
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
 		"node_modules/string-width-cjs/node_modules/emoji-regex": {
 			"version": "8.0.0",
 			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -4723,20 +4760,20 @@
 			"dev": true,
 			"license": "MIT"
 		},
-		"node_modules/string-width/node_modules/ansi-regex": {
+		"node_modules/string-width-cjs/node_modules/strip-ansi": {
 			"version": "6.0.1",
-			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
-			"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 			"dev": true,
 			"license": "MIT",
-			"engines": {
-				"node": ">=12"
+			"dependencies": {
+				"ansi-regex": "^5.0.1"
 			},
-			"funding": {
-				"url": "https://github.com/chalk/ansi-regex?sponsor=1"
+			"engines": {
+				"node": ">=8"
 			}
 		},
-		"node_modules/string-width/node_modules/strip-ansi": {
+		"node_modules/strip-ansi": {
 			"version": "7.1.0",
 			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
 			"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
@@ -4752,7 +4789,8 @@
 				"url": "https://github.com/chalk/strip-ansi?sponsor=1"
 			}
 		},
-		"node_modules/strip-ansi": {
+		"node_modules/strip-ansi-cjs": {
+			"name": "strip-ansi",
 			"version": "6.0.1",
 			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
 			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
@@ -4765,16 +4803,12 @@
 				"node": ">=8"
 			}
 		},
-		"node_modules/strip-ansi-cjs": {
-			"name": "strip-ansi",
-			"version": "6.0.1",
-			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+		"node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 			"dev": true,
 			"license": "MIT",
-			"dependencies": {
-				"ansi-regex": "^5.0.1"
-			},
 			"engines": {
 				"node": ">=8"
 			}
@@ -4842,10 +4876,9 @@
 			}
 		},
 		"node_modules/svelte": {
-			"version": "5.1.15",
-			"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.1.15.tgz",
-			"integrity": "sha512-cs2JYADrEorRCB4AUCHMvwperwAKcn/mz7w1xzVOv3fG6TmAS2n13JYHH8/uDCFbqVyRSXXlL+vA5RDwGUXEZg==",
-			"dev": true,
+			"version": "5.8.1",
+			"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.8.1.tgz",
+			"integrity": "sha512-tqJY46Xoe+KiKvD4/guNlqpE+jco4IBcuaM6Ei9SEMETtsbLMfbak9XjTacqd6aGMmWXh7uFInfFTd4yES5r0A==",
 			"license": "MIT",
 			"dependencies": {
 				"@ampproject/remapping": "^2.3.0",
@@ -4855,9 +4888,9 @@
 				"acorn-typescript": "^1.4.13",
 				"aria-query": "^5.3.1",
 				"axobject-query": "^4.1.0",
-				"esm-env": "^1.0.0",
-				"esrap": "^1.2.2",
-				"is-reference": "^3.0.2",
+				"esm-env": "^1.2.1",
+				"esrap": "^1.2.3",
+				"is-reference": "^3.0.3",
 				"locate-character": "^3.0.0",
 				"magic-string": "^0.30.11",
 				"zimmerframe": "^1.1.2"
@@ -4867,9 +4900,9 @@
 			}
 		},
 		"node_modules/svelte-check": {
-			"version": "4.0.7",
-			"resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.0.7.tgz",
-			"integrity": "sha512-24hwo+D5L35HOXsh3Z2sU4WhdDLavlHquYaJhrEqAt+mV1xOVzoMVYThW80n99osDJxyuH+vxjNFkNRL4EvwTg==",
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.1.1.tgz",
+			"integrity": "sha512-NfaX+6Qtc8W/CyVGS/F7/XdiSSyXz+WGYA9ZWV3z8tso14V2vzjfXviKaTFEzB7g8TqfgO2FOzP6XT4ApSTUTw==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
@@ -4890,66 +4923,6 @@
 				"typescript": ">=5.0.0"
 			}
 		},
-		"node_modules/svelte-check/node_modules/chokidar": {
-			"version": "4.0.1",
-			"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
-			"integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"readdirp": "^4.0.1"
-			},
-			"engines": {
-				"node": ">= 14.16.0"
-			},
-			"funding": {
-				"url": "https://paulmillr.com/funding/"
-			}
-		},
-		"node_modules/svelte-check/node_modules/fdir": {
-			"version": "6.4.2",
-			"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz",
-			"integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==",
-			"dev": true,
-			"license": "MIT",
-			"peerDependencies": {
-				"picomatch": "^3 || ^4"
-			},
-			"peerDependenciesMeta": {
-				"picomatch": {
-					"optional": true
-				}
-			}
-		},
-		"node_modules/svelte-check/node_modules/picomatch": {
-			"version": "4.0.2",
-			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
-			"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
-			"dev": true,
-			"license": "MIT",
-			"optional": true,
-			"peer": true,
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/jonschlinkert"
-			}
-		},
-		"node_modules/svelte-check/node_modules/readdirp": {
-			"version": "4.0.2",
-			"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
-			"integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
-			"dev": true,
-			"license": "MIT",
-			"engines": {
-				"node": ">= 14.16.0"
-			},
-			"funding": {
-				"type": "individual",
-				"url": "https://paulmillr.com/funding/"
-			}
-		},
 		"node_modules/svelte-eslint-parser": {
 			"version": "0.43.0",
 			"resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.43.0.tgz",
@@ -5087,6 +5060,62 @@
 				"svelte": "^3 || ^4 || ^5"
 			}
 		},
+		"node_modules/svelte-preprocess": {
+			"version": "6.0.3",
+			"resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-6.0.3.tgz",
+			"integrity": "sha512-PLG2k05qHdhmRG7zR/dyo5qKvakhm8IJ+hD2eFRQmMLHp7X3eJnjeupUtvuRpbNiF31RjVw45W+abDwHEmP5OA==",
+			"dev": true,
+			"hasInstallScript": true,
+			"license": "MIT",
+			"engines": {
+				"node": ">= 18.0.0"
+			},
+			"peerDependencies": {
+				"@babel/core": "^7.10.2",
+				"coffeescript": "^2.5.1",
+				"less": "^3.11.3 || ^4.0.0",
+				"postcss": "^7 || ^8",
+				"postcss-load-config": ">=3",
+				"pug": "^3.0.0",
+				"sass": "^1.26.8",
+				"stylus": ">=0.55",
+				"sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0",
+				"svelte": "^4.0.0 || ^5.0.0-next.100 || ^5.0.0",
+				"typescript": "^5.0.0"
+			},
+			"peerDependenciesMeta": {
+				"@babel/core": {
+					"optional": true
+				},
+				"coffeescript": {
+					"optional": true
+				},
+				"less": {
+					"optional": true
+				},
+				"postcss": {
+					"optional": true
+				},
+				"postcss-load-config": {
+					"optional": true
+				},
+				"pug": {
+					"optional": true
+				},
+				"sass": {
+					"optional": true
+				},
+				"stylus": {
+					"optional": true
+				},
+				"sugarss": {
+					"optional": true
+				},
+				"typescript": {
+					"optional": true
+				}
+			}
+		},
 		"node_modules/svelte-select": {
 			"version": "5.8.3",
 			"resolved": "https://registry.npmjs.org/svelte-select/-/svelte-select-5.8.3.tgz",
@@ -5103,13 +5132,12 @@
 			"license": "MIT"
 		},
 		"node_modules/svelte/node_modules/is-reference": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
-			"integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
-			"dev": true,
+			"version": "3.0.3",
+			"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
+			"integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
 			"license": "MIT",
 			"dependencies": {
-				"@types/estree": "*"
+				"@types/estree": "^1.0.6"
 			}
 		},
 		"node_modules/sveltekit-i18n": {
@@ -5130,34 +5158,34 @@
 			}
 		},
 		"node_modules/tailwindcss": {
-			"version": "3.4.14",
-			"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz",
-			"integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==",
+			"version": "3.4.16",
+			"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.16.tgz",
+			"integrity": "sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw==",
 			"dev": true,
 			"license": "MIT",
 			"dependencies": {
 				"@alloc/quick-lru": "^5.2.0",
 				"arg": "^5.0.2",
-				"chokidar": "^3.5.3",
+				"chokidar": "^3.6.0",
 				"didyoumean": "^1.2.2",
 				"dlv": "^1.1.3",
-				"fast-glob": "^3.3.0",
+				"fast-glob": "^3.3.2",
 				"glob-parent": "^6.0.2",
 				"is-glob": "^4.0.3",
-				"jiti": "^1.21.0",
-				"lilconfig": "^2.1.0",
-				"micromatch": "^4.0.5",
+				"jiti": "^1.21.6",
+				"lilconfig": "^3.1.3",
+				"micromatch": "^4.0.8",
 				"normalize-path": "^3.0.0",
 				"object-hash": "^3.0.0",
-				"picocolors": "^1.0.0",
-				"postcss": "^8.4.23",
+				"picocolors": "^1.1.1",
+				"postcss": "^8.4.47",
 				"postcss-import": "^15.1.0",
 				"postcss-js": "^4.0.1",
-				"postcss-load-config": "^4.0.1",
-				"postcss-nested": "^6.0.1",
-				"postcss-selector-parser": "^6.0.11",
-				"resolve": "^1.22.2",
-				"sucrase": "^3.32.0"
+				"postcss-load-config": "^4.0.2",
+				"postcss-nested": "^6.2.0",
+				"postcss-selector-parser": "^6.1.2",
+				"resolve": "^1.22.8",
+				"sucrase": "^3.35.0"
 			},
 			"bin": {
 				"tailwind": "lib/cli.js",
@@ -5167,6 +5195,70 @@
 				"node": ">=14.0.0"
 			}
 		},
+		"node_modules/tailwindcss/node_modules/chokidar": {
+			"version": "3.6.0",
+			"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+			"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+			"dev": true,
+			"license": "MIT",
+			"dependencies": {
+				"anymatch": "~3.1.2",
+				"braces": "~3.0.2",
+				"glob-parent": "~5.1.2",
+				"is-binary-path": "~2.1.0",
+				"is-glob": "~4.0.1",
+				"normalize-path": "~3.0.0",
+				"readdirp": "~3.6.0"
+			},
+			"engines": {
+				"node": ">= 8.10.0"
+			},
+			"funding": {
+				"url": "https://paulmillr.com/funding/"
+			},
+			"optionalDependencies": {
+				"fsevents": "~2.3.2"
+			}
+		},
+		"node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": {
+			"version": "5.1.2",
+			"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+			"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+			"dev": true,
+			"license": "ISC",
+			"dependencies": {
+				"is-glob": "^4.0.1"
+			},
+			"engines": {
+				"node": ">= 6"
+			}
+		},
+		"node_modules/tailwindcss/node_modules/lilconfig": {
+			"version": "3.1.3",
+			"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+			"integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
+			"dev": true,
+			"license": "MIT",
+			"engines": {
+				"node": ">=14"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/antonk52"
+			}
+		},
+		"node_modules/tailwindcss/node_modules/picomatch": {
+			"version": "2.3.1",
+			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+			"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+			"dev": true,
+			"license": "MIT",
+			"engines": {
+				"node": ">=8.6"
+			},
+			"funding": {
+				"url": "https://github.com/sponsors/jonschlinkert"
+			}
+		},
 		"node_modules/tailwindcss/node_modules/postcss-load-config": {
 			"version": "4.0.2",
 			"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
@@ -5203,23 +5295,23 @@
 				}
 			}
 		},
-		"node_modules/tailwindcss/node_modules/postcss-load-config/node_modules/lilconfig": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
-			"integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
+		"node_modules/tailwindcss/node_modules/readdirp": {
+			"version": "3.6.0",
+			"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+			"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
 			"dev": true,
 			"license": "MIT",
-			"engines": {
-				"node": ">=14"
+			"dependencies": {
+				"picomatch": "^2.2.1"
 			},
-			"funding": {
-				"url": "https://github.com/sponsors/antonk52"
+			"engines": {
+				"node": ">=8.10.0"
 			}
 		},
 		"node_modules/tailwindcss/node_modules/yaml": {
-			"version": "2.5.0",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz",
-			"integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==",
+			"version": "2.6.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz",
+			"integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==",
 			"dev": true,
 			"license": "ISC",
 			"bin": {
@@ -5229,13 +5321,6 @@
 				"node": ">= 14"
 			}
 		},
-		"node_modules/text-table": {
-			"version": "0.2.0",
-			"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-			"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
-			"dev": true,
-			"license": "MIT"
-		},
 		"node_modules/thenify": {
 			"version": "3.3.1",
 			"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
@@ -5308,9 +5393,9 @@
 			}
 		},
 		"node_modules/ts-api-utils": {
-			"version": "1.4.0",
-			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz",
-			"integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==",
+			"version": "1.4.3",
+			"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz",
+			"integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==",
 			"dev": true,
 			"license": "MIT",
 			"engines": {
@@ -5354,9 +5439,9 @@
 			}
 		},
 		"node_modules/typescript": {
-			"version": "5.6.3",
-			"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
-			"integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+			"version": "5.7.2",
+			"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz",
+			"integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==",
 			"dev": true,
 			"license": "Apache-2.0",
 			"bin": {
@@ -5368,9 +5453,9 @@
 			}
 		},
 		"node_modules/update-browserslist-db": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
-			"integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
+			"integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
 			"dev": true,
 			"funding": [
 				{
@@ -5388,8 +5473,8 @@
 			],
 			"license": "MIT",
 			"dependencies": {
-				"escalade": "^3.1.2",
-				"picocolors": "^1.0.1"
+				"escalade": "^3.2.0",
+				"picocolors": "^1.1.0"
 			},
 			"bin": {
 				"update-browserslist-db": "cli.js"
@@ -5906,9 +5991,9 @@
 			}
 		},
 		"node_modules/vitefu": {
-			"version": "1.0.3",
-			"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.3.tgz",
-			"integrity": "sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==",
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.4.tgz",
+			"integrity": "sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==",
 			"dev": true,
 			"license": "MIT",
 			"workspaces": [
@@ -5916,7 +6001,7 @@
 				"tests/projects/*"
 			],
 			"peerDependencies": {
-				"vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0"
+				"vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0"
 			},
 			"peerDependenciesMeta": {
 				"vite": {
@@ -5987,6 +6072,16 @@
 				"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
 			}
 		},
+		"node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+			"dev": true,
+			"license": "MIT",
+			"engines": {
+				"node": ">=8"
+			}
+		},
 		"node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
 			"version": "8.0.0",
 			"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -6009,17 +6104,17 @@
 				"node": ">=8"
 			}
 		},
-		"node_modules/wrap-ansi/node_modules/ansi-regex": {
+		"node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
 			"version": "6.0.1",
-			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
-			"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+			"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 			"dev": true,
 			"license": "MIT",
-			"engines": {
-				"node": ">=12"
+			"dependencies": {
+				"ansi-regex": "^5.0.1"
 			},
-			"funding": {
-				"url": "https://github.com/chalk/ansi-regex?sponsor=1"
+			"engines": {
+				"node": ">=8"
 			}
 		},
 		"node_modules/wrap-ansi/node_modules/ansi-styles": {
@@ -6035,22 +6130,6 @@
 				"url": "https://github.com/chalk/ansi-styles?sponsor=1"
 			}
 		},
-		"node_modules/wrap-ansi/node_modules/strip-ansi": {
-			"version": "7.1.0",
-			"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
-			"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
-			"dev": true,
-			"license": "MIT",
-			"dependencies": {
-				"ansi-regex": "^6.0.1"
-			},
-			"engines": {
-				"node": ">=12"
-			},
-			"funding": {
-				"url": "https://github.com/chalk/strip-ansi?sponsor=1"
-			}
-		},
 		"node_modules/yaml": {
 			"version": "1.10.2",
 			"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
@@ -6078,7 +6157,6 @@
 			"version": "1.1.2",
 			"resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz",
 			"integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==",
-			"dev": true,
 			"license": "MIT"
 		}
 	}
diff --git a/frontend/package.json b/frontend/package.json
index b097ab0f..c99f8cec 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -11,12 +11,15 @@
 		"format": "prettier --write . --log-level warn"
 	},
 	"devDependencies": {
+		"@rollup/plugin-commonjs": "^28.0.1",
 		"@rollup/plugin-json": "^6.1.0",
 		"@sveltejs/adapter-auto": "^3.3.1",
 		"@sveltejs/adapter-node": "^5.2.9",
 		"@sveltejs/adapter-static": "^3.0.6",
 		"@sveltejs/kit": "^2.8.0",
 		"@sveltejs/vite-plugin-svelte": "^4.0.0",
+		"@tailwindcss/forms": "^0.5.9",
+		"@tsconfig/svelte": "^5.0.4",
 		"@types/eslint": "^9.6.1",
 		"@types/js-cookie": "^3.0.6",
 		"@typescript-eslint/eslint-plugin": "^8.14.0",
@@ -38,6 +41,7 @@
 		"svelte-check": "^4.0.7",
 		"svelte-hero-icons": "^5.2.0",
 		"svelte-i18n": "^4.0.1",
+		"svelte-preprocess": "^6.0.3",
 		"sveltekit-i18n": "^2.4.2",
 		"tailwindcss": "^3.4.14",
 		"tslib": "^2.8.1",
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index f4a9973d..80254a00 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -10,7 +10,7 @@ importers:
     dependencies:
       '@sveltekit-i18n/base':
         specifier: ^1.3.7
-        version: 1.3.7(svelte@5.2.5)
+        version: 1.3.7(svelte@5.8.1)
       '@sveltekit-i18n/parser-icu':
         specifier: ^1.0.8
         version: 1.0.8
@@ -31,32 +31,44 @@ importers:
         version: 2.13.1
       svelte-gravatar:
         specifier: ^1.0.3
-        version: 1.0.3(svelte@5.2.5)
+        version: 1.0.3(svelte@5.8.1)
       svelte-i18n:
         specifier: ^4.0.1
-        version: 4.0.1(svelte@5.2.5)
+        version: 4.0.1(svelte@5.8.1)
       svelte-select:
         specifier: ^5.8.3
         version: 5.8.3
     devDependencies:
+      '@rollup/plugin-commonjs':
+        specifier: ^28.0.1
+        version: 28.0.1(rollup@4.27.3)
       '@rollup/plugin-json':
         specifier: ^6.1.0
         version: 6.1.0(rollup@4.27.3)
+      '@rollup/plugin-node-resolve':
+        specifier: ^15.3.0
+        version: 15.3.0(rollup@4.27.3)
       '@sveltejs/adapter-auto':
         specifier: ^3.3.1
-        version: 3.3.1(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))
+        version: 3.3.1(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))
       '@sveltejs/adapter-node':
         specifier: ^5.2.9
-        version: 5.2.9(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))
+        version: 5.2.9(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))
       '@sveltejs/adapter-static':
         specifier: ^3.0.6
-        version: 3.0.6(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))
+        version: 3.0.6(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))
       '@sveltejs/kit':
         specifier: ^2.8.0
-        version: 2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))(svelte@5.2.5)(vite@5.4.11(less@4.2.0))
+        version: 2.8.1(@sveltejs/vite-plugin-svelte@4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))(svelte@5.8.1)(vite@5.4.11(less@4.2.0))
       '@sveltejs/vite-plugin-svelte':
         specifier: ^4.0.0
-        version: 4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0))
+        version: 4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0))
+      '@tailwindcss/forms':
+        specifier: ^0.5.9
+        version: 0.5.9(tailwindcss@3.4.15)
+      '@tsconfig/svelte':
+        specifier: ^5.0.4
+        version: 5.0.4
       '@types/eslint':
         specifier: ^9.6.1
         version: 9.6.1
@@ -71,7 +83,7 @@ importers:
         version: 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)
       '@zerodevx/svelte-toast':
         specifier: ^0.9.6
-        version: 0.9.6(svelte@5.2.5)
+        version: 0.9.6(svelte@5.8.1)
       autoprefixer:
         specifier: ^10.4.20
         version: 10.4.20(postcss@8.4.49)
@@ -92,7 +104,7 @@ importers:
         version: 9.1.0(eslint@9.15.0(jiti@1.21.6))
       eslint-plugin-svelte:
         specifier: ^2.46.0
-        version: 2.46.0(eslint@9.15.0(jiti@1.21.6))(svelte@5.2.5)
+        version: 2.46.0(eslint@9.15.0(jiti@1.21.6))(svelte@5.8.1)
       jwt-decode:
         specifier: ^4.0.0
         version: 4.0.0
@@ -107,19 +119,22 @@ importers:
         version: 3.3.3
       prettier-plugin-svelte:
         specifier: ^3.2.8
-        version: 3.2.8(prettier@3.3.3)(svelte@5.2.5)
+        version: 3.2.8(prettier@3.3.3)(svelte@5.8.1)
       svelte:
         specifier: ^5.1.15
-        version: 5.2.5
+        version: 5.8.1
       svelte-check:
         specifier: ^4.0.7
-        version: 4.0.9(picomatch@4.0.2)(svelte@5.2.5)(typescript@5.6.3)
+        version: 4.0.9(picomatch@4.0.2)(svelte@5.8.1)(typescript@5.6.3)
       svelte-hero-icons:
         specifier: ^5.2.0
-        version: 5.2.0(svelte@5.2.5)
+        version: 5.2.0(svelte@5.8.1)
+      svelte-preprocess:
+        specifier: ^6.0.3
+        version: 6.0.3(less@4.2.0)(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(svelte@5.8.1)(typescript@5.6.3)
       sveltekit-i18n:
         specifier: ^2.4.2
-        version: 2.4.2(svelte@5.2.5)
+        version: 2.4.2(svelte@5.8.1)
       tailwindcss:
         specifier: ^3.4.14
         version: 3.4.15
@@ -699,8 +714,8 @@ packages:
       svelte: ^5.0.0-next.96 || ^5.0.0
       vite: ^5.0.0
 
-  '@sveltejs/vite-plugin-svelte@4.0.1':
-    resolution: {integrity: sha512-prXoAE/GleD2C4pKgHa9vkdjpzdYwCSw/kmjw6adIyu0vk5YKCfqIztkLg10m+kOYnzZu3bb0NaPTxlWre2a9Q==}
+  '@sveltejs/vite-plugin-svelte@4.0.2':
+    resolution: {integrity: sha512-Y9r/fWy539XlAC7+5wfNJ4zH6TygUYoQ0Eegzp0zDDqhJ54+92gOyOX1l4MO1cJSx0O+Gp13YePT5XEa3+kX0w==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22}
     peerDependencies:
       svelte: ^5.0.0-next.96 || ^5.0.0
@@ -717,6 +732,14 @@ packages:
   '@sveltekit-i18n/parser-icu@1.0.8':
     resolution: {integrity: sha512-/LnvE1EJv+higIxB5cWIV+9neiOe+CfC7VKhpv9mnU35NcZO3yOhEZ8y6F8nHHkMYIABLcqr15yk4hSvmRGWDw==}
 
+  '@tailwindcss/forms@0.5.9':
+    resolution: {integrity: sha512-tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg==}
+    peerDependencies:
+      tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20'
+
+  '@tsconfig/svelte@5.0.4':
+    resolution: {integrity: sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==}
+
   '@types/cookie@0.6.0':
     resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
 
@@ -1134,8 +1157,8 @@ packages:
       jiti:
         optional: true
 
-  esm-env@1.1.4:
-    resolution: {integrity: sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg==}
+  esm-env@1.2.1:
+    resolution: {integrity: sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==}
 
   esniff@2.0.1:
     resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==}
@@ -1153,8 +1176,8 @@ packages:
     resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
     engines: {node: '>=0.10'}
 
-  esrap@1.2.2:
-    resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==}
+  esrap@1.2.3:
+    resolution: {integrity: sha512-ZlQmCCK+n7SGoqo7DnfKaP1sJZa49P01/dXzmjCASSo04p72w8EksT2NMK8CEX8DhKsfJXANioIw8VyHNsBfvQ==}
 
   esrecurse@4.3.0:
     resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
@@ -1482,6 +1505,10 @@ packages:
     engines: {node: '>=4'}
     hasBin: true
 
+  mini-svg-data-uri@1.4.4:
+    resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==}
+    hasBin: true
+
   minimatch@3.1.2:
     resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
 
@@ -1854,14 +1881,51 @@ packages:
     peerDependencies:
       svelte: ^3 || ^4 || ^5
 
+  svelte-preprocess@6.0.3:
+    resolution: {integrity: sha512-PLG2k05qHdhmRG7zR/dyo5qKvakhm8IJ+hD2eFRQmMLHp7X3eJnjeupUtvuRpbNiF31RjVw45W+abDwHEmP5OA==}
+    engines: {node: '>= 18.0.0'}
+    peerDependencies:
+      '@babel/core': ^7.10.2
+      coffeescript: ^2.5.1
+      less: ^3.11.3 || ^4.0.0
+      postcss: ^7 || ^8
+      postcss-load-config: '>=3'
+      pug: ^3.0.0
+      sass: ^1.26.8
+      stylus: '>=0.55'
+      sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0
+      svelte: ^4.0.0 || ^5.0.0-next.100 || ^5.0.0
+      typescript: ^5.0.0
+    peerDependenciesMeta:
+      '@babel/core':
+        optional: true
+      coffeescript:
+        optional: true
+      less:
+        optional: true
+      postcss:
+        optional: true
+      postcss-load-config:
+        optional: true
+      pug:
+        optional: true
+      sass:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      typescript:
+        optional: true
+
   svelte-select@5.8.3:
     resolution: {integrity: sha512-nQsvflWmTCOZjssdrNptzfD1Ok45hHVMTL5IHay5DINk7dfu5Er+8KsVJnZMJdSircqtR0YlT4YkCFlxOUhVPA==}
 
   svelte-waypoint@0.1.4:
     resolution: {integrity: sha512-UEqoXZjJeKj2sWlAIsBOFjxjMn+KP8aFCc/zjdmZi1cCOE59z6T2C+I6ZaAf8EmNQqNzfZVB/Lci4Ci9spzXAw==}
 
-  svelte@5.2.5:
-    resolution: {integrity: sha512-D33RkKYF4AFIgM+HrItxFudmWrXOLaua8vW3Mq7bObn7UwRn6zJPZ58bEIlj8wEYfi08n8VVvTk8dCLVHNnikQ==}
+  svelte@5.8.1:
+    resolution: {integrity: sha512-tqJY46Xoe+KiKvD4/guNlqpE+jco4IBcuaM6Ei9SEMETtsbLMfbak9XjTacqd6aGMmWXh7uFInfFTd4yES5r0A==}
     engines: {node: '>=18'}
 
   sveltekit-i18n@2.4.2:
@@ -1963,10 +2027,10 @@ packages:
       terser:
         optional: true
 
-  vitefu@1.0.3:
-    resolution: {integrity: sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==}
+  vitefu@1.0.4:
+    resolution: {integrity: sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==}
     peerDependencies:
-      vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0
+      vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
     peerDependenciesMeta:
       vite:
         optional: true
@@ -2374,30 +2438,30 @@ snapshots:
 
   '@steeze-ui/heroicons@2.4.2': {}
 
-  '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))':
+  '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))':
     dependencies:
-      '@sveltejs/kit': 2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))(svelte@5.2.5)(vite@5.4.11(less@4.2.0))
+      '@sveltejs/kit': 2.8.1(@sveltejs/vite-plugin-svelte@4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))(svelte@5.8.1)(vite@5.4.11(less@4.2.0))
       import-meta-resolve: 4.1.0
 
-  '@sveltejs/adapter-node@5.2.9(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))':
+  '@sveltejs/adapter-node@5.2.9(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))':
     dependencies:
       '@rollup/plugin-commonjs': 28.0.1(rollup@4.27.3)
       '@rollup/plugin-json': 6.1.0(rollup@4.27.3)
       '@rollup/plugin-node-resolve': 15.3.0(rollup@4.27.3)
-      '@sveltejs/kit': 2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))(svelte@5.2.5)(vite@5.4.11(less@4.2.0))
+      '@sveltejs/kit': 2.8.1(@sveltejs/vite-plugin-svelte@4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))(svelte@5.8.1)(vite@5.4.11(less@4.2.0))
       rollup: 4.27.3
 
-  '@sveltejs/adapter-static@3.0.6(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))':
+  '@sveltejs/adapter-static@3.0.6(@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))':
     dependencies:
-      '@sveltejs/kit': 2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))(svelte@5.2.5)(vite@5.4.11(less@4.2.0))
+      '@sveltejs/kit': 2.8.1(@sveltejs/vite-plugin-svelte@4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))(svelte@5.8.1)(vite@5.4.11(less@4.2.0))
 
-  '@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))(svelte@5.2.5)(vite@5.4.11(less@4.2.0))':
+  '@sveltejs/kit@2.8.1(@sveltejs/vite-plugin-svelte@4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))(svelte@5.8.1)(vite@5.4.11(less@4.2.0))':
     dependencies:
-      '@sveltejs/vite-plugin-svelte': 4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0))
+      '@sveltejs/vite-plugin-svelte': 4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0))
       '@types/cookie': 0.6.0
       cookie: 0.6.0
       devalue: 5.1.1
-      esm-env: 1.1.4
+      esm-env: 1.2.1
       import-meta-resolve: 4.1.0
       kleur: 4.1.5
       magic-string: 0.30.13
@@ -2405,35 +2469,35 @@ snapshots:
       sade: 1.8.1
       set-cookie-parser: 2.7.1
       sirv: 3.0.0
-      svelte: 5.2.5
+      svelte: 5.8.1
       tiny-glob: 0.2.9
       vite: 5.4.11(less@4.2.0)
 
-  '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))(svelte@5.2.5)(vite@5.4.11(less@4.2.0))':
+  '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))(svelte@5.8.1)(vite@5.4.11(less@4.2.0))':
     dependencies:
-      '@sveltejs/vite-plugin-svelte': 4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0))
+      '@sveltejs/vite-plugin-svelte': 4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0))
       debug: 4.3.7
-      svelte: 5.2.5
+      svelte: 5.8.1
       vite: 5.4.11(less@4.2.0)
     transitivePeerDependencies:
       - supports-color
 
-  '@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0))':
+  '@sveltejs/vite-plugin-svelte@4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0))':
     dependencies:
-      '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.1(svelte@5.2.5)(vite@5.4.11(less@4.2.0)))(svelte@5.2.5)(vite@5.4.11(less@4.2.0))
+      '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.2(svelte@5.8.1)(vite@5.4.11(less@4.2.0)))(svelte@5.8.1)(vite@5.4.11(less@4.2.0))
       debug: 4.3.7
       deepmerge: 4.3.1
       kleur: 4.1.5
       magic-string: 0.30.13
-      svelte: 5.2.5
+      svelte: 5.8.1
       vite: 5.4.11(less@4.2.0)
-      vitefu: 1.0.3(vite@5.4.11(less@4.2.0))
+      vitefu: 1.0.4(vite@5.4.11(less@4.2.0))
     transitivePeerDependencies:
       - supports-color
 
-  '@sveltekit-i18n/base@1.3.7(svelte@5.2.5)':
+  '@sveltekit-i18n/base@1.3.7(svelte@5.8.1)':
     dependencies:
-      svelte: 5.2.5
+      svelte: 5.8.1
 
   '@sveltekit-i18n/parser-default@1.1.1': {}
 
@@ -2441,6 +2505,13 @@ snapshots:
     dependencies:
       intl-messageformat: 10.7.7
 
+  '@tailwindcss/forms@0.5.9(tailwindcss@3.4.15)':
+    dependencies:
+      mini-svg-data-uri: 1.4.4
+      tailwindcss: 3.4.15
+
+  '@tsconfig/svelte@5.0.4': {}
+
   '@types/cookie@0.6.0': {}
 
   '@types/eslint@9.6.1':
@@ -2538,9 +2609,9 @@ snapshots:
       '@typescript-eslint/types': 8.15.0
       eslint-visitor-keys: 4.2.0
 
-  '@zerodevx/svelte-toast@0.9.6(svelte@5.2.5)':
+  '@zerodevx/svelte-toast@0.9.6(svelte@5.8.1)':
     dependencies:
-      svelte: 5.2.5
+      svelte: 5.8.1
 
   acorn-jsx@5.3.2(acorn@8.14.0):
     dependencies:
@@ -2867,7 +2938,7 @@ snapshots:
     dependencies:
       eslint: 9.15.0(jiti@1.21.6)
 
-  eslint-plugin-svelte@2.46.0(eslint@9.15.0(jiti@1.21.6))(svelte@5.2.5):
+  eslint-plugin-svelte@2.46.0(eslint@9.15.0(jiti@1.21.6))(svelte@5.8.1):
     dependencies:
       '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6))
       '@jridgewell/sourcemap-codec': 1.5.0
@@ -2880,9 +2951,9 @@ snapshots:
       postcss-safe-parser: 6.0.0(postcss@8.4.49)
       postcss-selector-parser: 6.1.2
       semver: 7.6.3
-      svelte-eslint-parser: 0.43.0(svelte@5.2.5)
+      svelte-eslint-parser: 0.43.0(svelte@5.8.1)
     optionalDependencies:
-      svelte: 5.2.5
+      svelte: 5.8.1
     transitivePeerDependencies:
       - ts-node
 
@@ -2941,7 +3012,7 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  esm-env@1.1.4: {}
+  esm-env@1.2.1: {}
 
   esniff@2.0.1:
     dependencies:
@@ -2966,7 +3037,7 @@ snapshots:
     dependencies:
       estraverse: 5.3.0
 
-  esrap@1.2.2:
+  esrap@1.2.3:
     dependencies:
       '@jridgewell/sourcemap-codec': 1.5.0
       '@types/estree': 1.0.6
@@ -3277,6 +3348,8 @@ snapshots:
   mime@1.6.0:
     optional: true
 
+  mini-svg-data-uri@1.4.4: {}
+
   minimatch@3.1.2:
     dependencies:
       brace-expansion: 1.1.11
@@ -3428,10 +3501,10 @@ snapshots:
 
   prelude-ls@1.2.1: {}
 
-  prettier-plugin-svelte@3.2.8(prettier@3.3.3)(svelte@5.2.5):
+  prettier-plugin-svelte@3.2.8(prettier@3.3.3)(svelte@5.8.1):
     dependencies:
       prettier: 3.3.3
-      svelte: 5.2.5
+      svelte: 5.8.1
 
   prettier@3.3.3: {}
 
@@ -3575,19 +3648,19 @@ snapshots:
 
   supports-preserve-symlinks-flag@1.0.0: {}
 
-  svelte-check@4.0.9(picomatch@4.0.2)(svelte@5.2.5)(typescript@5.6.3):
+  svelte-check@4.0.9(picomatch@4.0.2)(svelte@5.8.1)(typescript@5.6.3):
     dependencies:
       '@jridgewell/trace-mapping': 0.3.25
       chokidar: 4.0.1
       fdir: 6.4.2(picomatch@4.0.2)
       picocolors: 1.1.1
       sade: 1.8.1
-      svelte: 5.2.5
+      svelte: 5.8.1
       typescript: 5.6.3
     transitivePeerDependencies:
       - picomatch
 
-  svelte-eslint-parser@0.43.0(svelte@5.2.5):
+  svelte-eslint-parser@0.43.0(svelte@5.8.1):
     dependencies:
       eslint-scope: 7.2.2
       eslint-visitor-keys: 3.4.3
@@ -3595,25 +3668,25 @@ snapshots:
       postcss: 8.4.49
       postcss-scss: 4.0.9(postcss@8.4.49)
     optionalDependencies:
-      svelte: 5.2.5
+      svelte: 5.8.1
 
   svelte-floating-ui@1.5.8:
     dependencies:
       '@floating-ui/core': 1.6.8
       '@floating-ui/dom': 1.6.12
 
-  svelte-gravatar@1.0.3(svelte@5.2.5):
+  svelte-gravatar@1.0.3(svelte@5.8.1):
     dependencies:
       md5: 2.3.0
-      svelte: 5.2.5
+      svelte: 5.8.1
       svelte-waypoint: 0.1.4
 
-  svelte-hero-icons@5.2.0(svelte@5.2.5):
+  svelte-hero-icons@5.2.0(svelte@5.8.1):
     dependencies:
       '@steeze-ui/heroicons': 2.4.2
-      svelte: 5.2.5
+      svelte: 5.8.1
 
-  svelte-i18n@4.0.1(svelte@5.2.5):
+  svelte-i18n@4.0.1(svelte@5.8.1):
     dependencies:
       cli-color: 2.0.4
       deepmerge: 4.3.1
@@ -3621,16 +3694,25 @@ snapshots:
       estree-walker: 2.0.2
       intl-messageformat: 10.7.7
       sade: 1.8.1
-      svelte: 5.2.5
+      svelte: 5.8.1
       tiny-glob: 0.2.9
 
+  svelte-preprocess@6.0.3(less@4.2.0)(postcss-load-config@4.0.2(postcss@8.4.49))(postcss@8.4.49)(svelte@5.8.1)(typescript@5.6.3):
+    dependencies:
+      svelte: 5.8.1
+    optionalDependencies:
+      less: 4.2.0
+      postcss: 8.4.49
+      postcss-load-config: 4.0.2(postcss@8.4.49)
+      typescript: 5.6.3
+
   svelte-select@5.8.3:
     dependencies:
       svelte-floating-ui: 1.5.8
 
   svelte-waypoint@0.1.4: {}
 
-  svelte@5.2.5:
+  svelte@5.8.1:
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@jridgewell/sourcemap-codec': 1.5.0
@@ -3639,18 +3721,18 @@ snapshots:
       acorn-typescript: 1.4.13(acorn@8.14.0)
       aria-query: 5.3.2
       axobject-query: 4.1.0
-      esm-env: 1.1.4
-      esrap: 1.2.2
+      esm-env: 1.2.1
+      esrap: 1.2.3
       is-reference: 3.0.3
       locate-character: 3.0.0
       magic-string: 0.30.13
       zimmerframe: 1.1.2
 
-  sveltekit-i18n@2.4.2(svelte@5.2.5):
+  sveltekit-i18n@2.4.2(svelte@5.8.1):
     dependencies:
-      '@sveltekit-i18n/base': 1.3.7(svelte@5.2.5)
+      '@sveltekit-i18n/base': 1.3.7(svelte@5.8.1)
       '@sveltekit-i18n/parser-default': 1.1.1
-      svelte: 5.2.5
+      svelte: 5.8.1
 
   tailwindcss@3.4.15:
     dependencies:
@@ -3740,7 +3822,7 @@ snapshots:
       fsevents: 2.3.3
       less: 4.2.0
 
-  vitefu@1.0.3(vite@5.4.11(less@4.2.0)):
+  vitefu@1.0.4(vite@5.4.11(less@4.2.0)):
     optionalDependencies:
       vite: 5.4.11(less@4.2.0)
 
diff --git a/frontend/src/lang/en.json b/frontend/src/lang/en.json
index db6bb521..26887444 100644
--- a/frontend/src/lang/en.json
+++ b/frontend/src/lang/en.json
@@ -6,7 +6,8 @@
 	},
 	"chatbox": {
 		"placeholder": "Type your message here...",
-		"sendError": "Failed to send message"
+		"sendError": "Failed to send message",
+		"replyingTo": "Replying to: "
 	},
 	"home": {
 		"date": "Date",
diff --git a/frontend/src/lang/fr.json b/frontend/src/lang/fr.json
index ad705d4c..e090487e 100644
--- a/frontend/src/lang/fr.json
+++ b/frontend/src/lang/fr.json
@@ -20,6 +20,7 @@
 		"disabled": "Cette session est accessible uniquement en lecture",
 		"edited": "modifié",
 		"history": "Historique",
+		"replyingTo": "En réponse à : ",
 		"deleteFeedback": "Êtes-vous sûr de vouloir supprimer ce feedback ? Cette action est irréversible."
 	},
 	"home": {
diff --git a/frontend/src/lib/api/sessions.ts b/frontend/src/lib/api/sessions.ts
index a8159d97..c49b667d 100644
--- a/frontend/src/lib/api/sessions.ts
+++ b/frontend/src/lib/api/sessions.ts
@@ -44,9 +44,14 @@ export async function getMessagesAPI(id: number) {
 export async function createMessageAPI(
 	id: number,
 	content: string,
-	metadata: { message: string; date: number }[]
+	metadata: { message: string; date: number }[],
+	replyTo: number | null
 ): Promise<any | null> {
-	const response = await axiosInstance.post(`/sessions/${id}/messages`, { content, metadata });
+	const response = await axiosInstance.post(`/sessions/${id}/messages`, {
+		content,
+		metadata,
+		reply_to_message_id: replyTo
+	});
 
 	if (response.status !== 201) {
 		toastAlert('Failed to send message');
diff --git a/frontend/src/lib/components/sessions/message.svelte b/frontend/src/lib/components/sessions/message.svelte
index cfccf2ef..8f9f2502 100644
--- a/frontend/src/lib/components/sessions/message.svelte
+++ b/frontend/src/lib/components/sessions/message.svelte
@@ -1,7 +1,7 @@
 <script lang="ts">
 	import type Message from '$lib/types/message';
 	import { displayTime } from '$lib/utils/date';
-	import { Check, Icon, Pencil } from 'svelte-hero-icons';
+	import { Pencil, Check, Icon, ArrowUturnLeft } from 'svelte-hero-icons';
 	import { user } from '$lib/types/user';
 	import Gravatar from 'svelte-gravatar';
 	import { t } from '$lib/services/i18n';
@@ -12,9 +12,32 @@
 	import linkifyHtml from 'linkify-html';
 	import { sanitize } from '$lib/utils/sanitize';
 	import CloseIcon from '../icons/closeIcon.svelte';
+	import { initiateReply } from '$lib/utils/replyUtils';
 
 	export let message: Message;
 
+	let replyTo: string | undefined;
+
+	$: replyTo = message['_replyTo'];
+
+	let replyToMessage: Message | null = null;
+
+	$: if (replyTo) {
+		findMessageById(replyTo).then((msg) => {
+			replyToMessage = msg;
+		});
+	}
+
+	async function findMessageById(id: string): Promise<Message | null> {
+		try {
+			const resolvedMessage = await message.getMessageById(Number(id));
+			return resolvedMessage;
+		} catch (error) {
+			console.error(`Error resolving message ID ${id}:`, error);
+			return null;
+		}
+	}
+
 	let timer: number;
 	$: displayedTime = displayTime(message.created_at);
 	$: {
@@ -55,6 +78,12 @@
 		}
 	}
 
+	function truncateMessage(content: string, maxLength: number = 20): string {
+		if (content.length > maxLength) {
+			return content.slice(0, maxLength) + '...';
+		}
+		return content;
+	}
 	let hightlight: HTMLDivElement;
 
 	onMount(() => {
@@ -151,6 +180,7 @@
 		if (current < content.length) {
 			parts.push({ text: content.slice(current), feedback: null });
 		}
+
 		return parts;
 	}
 
@@ -181,12 +211,35 @@
 			class="rounded-full"
 		/>
 	</div>
+
 	<div class="chat-bubble text-black" class:bg-blue-50={isSender} class:bg-gray-300={!isSender}>
+		{#if replyToMessage}
+			<a
+				href={`#${replyToMessage.uuid}`}
+				class="flex items-center text-[0.65rem] text-gray-400 mb-1 cursor-pointer"
+				aria-label="Scroll to replied message"
+			>
+				{$t('chatbox.replyingTo')}
+				<span
+					class="italic truncate whitespace-nowrap overflow-hidden max-w-[150px] text-[0.65rem] inline-block"
+				>
+					{truncateMessage(replyToMessage?.content)}
+				</span>
+			</a>
+		{/if}
+
+		<button
+			class="absolute -right-6 top-1/2 transform -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-opacity duration-200 cursor-pointer"
+			on:click={() => initiateReply(message)}
+		>
+			<Icon src={ArrowUturnLeft} class="w-4 h-4 text-gray-800" />
+		</button>
+
 		{#if isEdit}
 			<div
 				contenteditable="true"
 				bind:this={contentDiv}
-				class="bg-blue-50 whitespace-pre-wrap min-h-8"
+				class="bg-blue-50 whitespace-pre-wrap min-h-8 p-2"
 			>
 				{message.content}
 			</div>
diff --git a/frontend/src/lib/components/sessions/writebox.svelte b/frontend/src/lib/components/sessions/writebox.svelte
index 280fbf12..9c6f2f86 100644
--- a/frontend/src/lib/components/sessions/writebox.svelte
+++ b/frontend/src/lib/components/sessions/writebox.svelte
@@ -8,12 +8,15 @@
 	import { onMount } from 'svelte';
 	import { get } from 'svelte/store';
 
+	import { replyToMessage, clearReplyToMessage } from '$lib/utils/replyUtils';
+
 	onMount(async () => {
 		await import('emoji-picker-element');
 	});
 
 	export let session: Session;
 
+	let currentReplyToMessage = null;
 	let metadata: { message: string; date: number }[] = [];
 	let lastMessage = '';
 	let message = '';
@@ -21,6 +24,12 @@
 	let showSpecials = false;
 	let textearea: HTMLTextAreaElement;
 
+	$: currentReplyToMessage = $replyToMessage;
+
+	function cancelReply() {
+		clearReplyToMessage();
+	}
+
 	let us = get(user);
 	let disabled =
 		us == null ||
@@ -32,30 +41,65 @@
 		message = message.trim();
 		if (message.length == 0) return;
 
-		if ($user === null) return;
-
-		const m = await session.sendMessage($user, message, metadata);
-
-		if (m === null) {
+		if ($user === null) {
 			toastAlert($t('chatbox.sendError'));
 			return;
 		}
 
-		message = '';
-		metadata = [];
+		try {
+			const m = await session.sendMessage(
+				structuredClone($user),
+				message,
+				[...metadata],
+				$replyToMessage?.id || null
+			);
+
+			if (m === null) {
+				toastAlert($t('chatbox.sendError'));
+				return;
+			}
+
+			// Reset after sending
+			message = '';
+			metadata = [];
+			clearReplyToMessage();
+		} catch (error) {
+			console.error('Failed to send message:', error);
+			toastAlert($t('chatbox.sendError'));
+		}
 	}
 
-	function keyPress() {
+	function keyPress(event: KeyboardEvent) {
 		if (message === lastMessage) return;
 
-		metadata.push({ message: message, date: new Date().getTime() });
+		if (metadata.length === 0 || metadata[metadata.length - 1].message !== message) {
+			metadata.push({ message: message, date: new Date().getTime() });
+		}
 		lastMessage = message;
 
-		session.sendTyping();
+		if (event.key === 'Enter' && !event.shiftKey) {
+			event.preventDefault();
+			sendMessage();
+		} else {
+			session.sendTyping();
+		}
 	}
 </script>
 
-<div class="w-full border-t-2">
+<div class="flex flex-col w-full py-2 relative">
+	{#if currentReplyToMessage}
+		<div
+			class="flex items-center justify-between bg-gray-100 p-2 rounded-md mb-1 text-sm text-gray-600"
+		>
+			<p class="text-xs text-gray-400">
+				Replying to: <span class="text-xs text-gray-400">{currentReplyToMessage.content}</span>
+			</p>
+			<button class="text-xs text-blue-500 underline ml-4 cursor-pointer" on:click={cancelReply}>
+				Cancel
+			</button>
+		</div>
+	{/if}
+
 	{#if showSpecials}
 		<ul class="flex justify-around divide-x-2 border-b-2 py-1 flex-wrap md:flex-nowrap">
 			{#each config.SPECIAL_CHARS as char (char)}
@@ -73,41 +117,34 @@
 			{/each}
 		</ul>
 	{/if}
+
 	<div class="w-full flex relative">
 		<textarea
 			bind:this={textearea}
-			class="flex-grow p-2 resize-none overflow-y-hidden pr-16"
+			class="flex-grow border border-gray-300 rounded-md p-2 text-base resize-none"
 			placeholder={disabled ? $t('chatbox.disabled') : $t('chatbox.placeholder')}
 			{disabled}
 			bind:value={message}
-			on:keypress={() => keyPress()}
-			on:keypress={async (e) => {
-				if (e.key === 'Enter' && !e.shiftKey) {
-					await sendMessage();
-				} else {
-					keyPress();
-				}
-			}}
+			on:keypress={keyPress}
 		/>
+
 		<div
 			class="absolute top-1/2 right-20 transform -translate-y-1/2 text-lg select-none cursor-pointer"
 			on:click={() => (showPicker = !showPicker)}
 			data-tooltip-target="tooltip-emoji"
 			data-tooltip-placement="right"
-			data-riple-light="true"
 			aria-hidden={false}
 			role="button"
 			tabindex="0"
 		>
 			😀
 		</div>
+
 		<div class="relative">
 			<div
 				id="tooltip-emoji"
-				data-tooltip="tooltip-emoji"
-				role="tooltip"
 				class:hidden={!showPicker}
-				class="absolute z-10 tooltip bottom-16 right-0 lg:left-0 lg:right-auto"
+				class="absolute z-10 bottom-16 right-0 lg:left-0 lg:right-auto hidden"
 			>
 				<emoji-picker
 					class="light"
@@ -119,6 +156,7 @@
 				</emoji-picker>
 			</div>
 		</div>
+
 		<div
 			class="absolute top-1/2 right-28 kbd transform -translate-y-1/2 text-sm select-none cursor-pointer"
 			on:click={() => (showSpecials = !showSpecials)}
@@ -128,6 +166,7 @@
 		>
 			É
 		</div>
+
 		<button class="btn btn-primary rounded-none size-16" on:click={sendMessage}>
 			<Icon src={PaperAirplane} />
 		</button>
diff --git a/frontend/src/lib/types/linkify-html.d.ts b/frontend/src/lib/types/linkify-html.d.ts
new file mode 100644
index 00000000..074aa975
--- /dev/null
+++ b/frontend/src/lib/types/linkify-html.d.ts
@@ -0,0 +1,3 @@
+declare module 'linkify-html' {
+	export default function linkifyHtml(input: string, options?: Record<string, any>): string;
+}
diff --git a/frontend/src/lib/types/message.ts b/frontend/src/lib/types/message.ts
index 5ab56c05..12ee2175 100644
--- a/frontend/src/lib/types/message.ts
+++ b/frontend/src/lib/types/message.ts
@@ -1,6 +1,6 @@
 import Session from './session';
 import User from './user';
-import { updateMessageAPI, createMessageFeedbackAPI } from '$lib/api/sessions';
+import { updateMessageAPI, createMessageFeedbackAPI, getMessagesAPI } from '$lib/api/sessions';
 import { toastAlert } from '$lib/utils/toasts';
 import { get, writable, type Writable } from 'svelte/store';
 import Feedback from './feedback';
@@ -16,6 +16,7 @@ export default class Message {
 	private _edited: boolean = false;
 	private _versions = writable([] as { content: string; date: Date }[]);
 	private _feedbacks = writable([] as Feedback[]);
+	private _replyTo: string;
 
 	public constructor(
 		id: number,
@@ -23,7 +24,8 @@ export default class Message {
 		content: string,
 		created_at: Date,
 		user: User,
-		session: Session
+		session: Session,
+		replyTo: string
 	) {
 		this._id = id;
 		this._message_id = message_id;
@@ -32,6 +34,7 @@ export default class Message {
 		this._user = user;
 		this._session = session;
 		this._versions.set([{ content: content, date: created_at }]);
+		this._replyTo = replyTo;
 	}
 
 	get id(): number {
@@ -86,6 +89,36 @@ export default class Message {
 		return true;
 	}
 
+	async getMessageById(id: number): Promise<Message | null> {
+		try {
+			const response = await getMessagesAPI(this._session.id); // Fetch all messages for the session
+			if (!response) {
+				toastAlert('Failed to retrieve messages from the server.');
+				return null;
+			}
+
+			// Locate the message by ID in the response
+			const messageData = response.find((msg: any) => msg.id === id);
+			if (!messageData) {
+				toastAlert(`Message with ID ${id} not found.`);
+				return null;
+			}
+
+			// Parse the message object
+			const parsedMessage = Message.parse(messageData, this._user, this._session);
+			if (!parsedMessage) {
+				toastAlert(`Failed to parse message with ID ${id}`);
+				return null;
+			}
+
+			return parsedMessage;
+		} catch (error) {
+			console.error(`Error while fetching message by ID ${id}:`, error);
+			toastAlert(`Unexpected error while retrieving message.`);
+			return null;
+		}
+	}
+
 	async localUpdate(content: string, force: boolean = false): Promise<boolean> {
 		if (!force) {
 			this._versions.update((v) => [...v, { content: content, date: new Date() }]);
@@ -132,7 +165,6 @@ export default class Message {
 	}
 
 	static parse(
-		// eslint-disable-next-line @typescript-eslint/no-explicit-any
 		json: any,
 		user: User | null | undefined = null,
 		session: Session | null | undefined = null
@@ -164,9 +196,9 @@ export default class Message {
 			json.content,
 			parseToLocalDate(json.created_at),
 			user,
-			session
+			session,
+			json.reply_to_message_id
 		);
-
 		message.feedbacks.set(Feedback.parseAll(json.feedbacks, message));
 
 		return message;
diff --git a/frontend/src/lib/types/session.ts b/frontend/src/lib/types/session.ts
index dd92bd3c..d7b465fa 100644
--- a/frontend/src/lib/types/session.ts
+++ b/frontend/src/lib/types/session.ts
@@ -187,31 +187,30 @@ export default class Session {
 		const messagesStr = await getMessagesAPI(this.id);
 
 		this._messages.set(Message.parseAll(messagesStr));
-
 		return true;
 	}
 
 	async sendMessage(
 		sender: User,
 		content: string,
-		metadata: { message: string; date: number }[]
+		metadata: { message: string; date: number }[],
+		replyTo: number | null
 	): Promise<Message | null> {
-		const json = await createMessageAPI(this.id, content, metadata);
-		if (json == null || json.id == null || json.message_id == null) {
+		const json = await createMessageAPI(this.id, content, metadata, replyTo);
+
+		if (!json || !json.id || !json.message_id) {
 			toastAlert('Failed to parse message');
 			return null;
 		}
-
-		const message = new Message(json.id, json.message_id, content, new Date(), sender, this);
-
-		this._messages.update((messages) => {
-			if (!messages.find((m) => m instanceof Message && m.message_id === message.message_id)) {
-				return [...messages, message];
-			}
-			return messages.map((m) =>
-				m instanceof Message && m.message_id === message.message_id ? message : m
-			);
-		});
+		const message = new Message(
+			json.id,
+			json.message_id,
+			content,
+			new Date(),
+			sender,
+			this,
+			json.reply_to
+		);
 
 		return message;
 	}
@@ -254,7 +253,6 @@ export default class Session {
 
 		this._ws.onopen = () => {
 			this._ws_connected.set(true);
-			console.log('WS connected');
 		};
 
 		this._ws.onmessage = (event) => {
@@ -350,7 +348,7 @@ export default class Session {
 							users.delete(user_id);
 							return users;
 						});
-					}, 30000)
+					}, 30000) as unknown as number
 				);
 
 				return;
@@ -361,7 +359,6 @@ export default class Session {
 		this._ws.onclose = () => {
 			this._ws = null;
 			this._ws_connected.set(false);
-			console.log('WS closed, reconnecting in 1s');
 			setTimeout(() => this.wsConnect(jwt), 1000);
 		};
 	}
diff --git a/frontend/src/lib/types/svelte-gravatar.d.ts b/frontend/src/lib/types/svelte-gravatar.d.ts
new file mode 100644
index 00000000..053fe280
--- /dev/null
+++ b/frontend/src/lib/types/svelte-gravatar.d.ts
@@ -0,0 +1,13 @@
+declare module 'svelte-gravatar' {
+	import { SvelteComponentTyped } from 'svelte';
+
+	interface GravatarProps {
+		email: string;
+		size?: number;
+		rating?: 'g' | 'pg' | 'r' | 'x';
+		defaultImage?: string;
+		forceDefault?: boolean;
+	}
+
+	export default class Gravatar extends SvelteComponentTyped<GravatarProps> {}
+}
diff --git a/frontend/src/lib/utils/replyUtils.ts b/frontend/src/lib/utils/replyUtils.ts
new file mode 100644
index 00000000..9efff367
--- /dev/null
+++ b/frontend/src/lib/utils/replyUtils.ts
@@ -0,0 +1,13 @@
+import type { Writable } from 'svelte/store';
+import type Message from '$lib/types/message';
+import { writable } from 'svelte/store';
+
+export const replyToMessage: Writable<Message | null> = writable(null);
+
+export function initiateReply(message: Message): void {
+	replyToMessage.set(message);
+}
+
+export function clearReplyToMessage(): void {
+	replyToMessage.set(null);
+}
diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json
index 82081abc..18027737 100644
--- a/frontend/tsconfig.json
+++ b/frontend/tsconfig.json
@@ -3,16 +3,23 @@
 	"compilerOptions": {
 		"allowJs": true,
 		"checkJs": true,
+		"types": ["svelte"],
 		"esModuleInterop": true,
 		"forceConsistentCasingInFileNames": true,
 		"resolveJsonModule": true,
 		"skipLibCheck": true,
 		"sourceMap": true,
 		"strict": true,
-		"moduleResolution": "bundler"
-	}
-	// Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
-	//
-	// If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
-	// from the referenced tsconfig.json - TypeScript does not merge them in
+		"baseUrl": "./",
+		"paths": {
+			"$lib/*": ["src/lib/*"],
+			"$routes/*": ["src/routes/*"]
+		},
+		"moduleResolution": "node",
+		"target": "ESNext",
+		"module": "ESNext",
+		"isolatedModules": true
+	},
+	"include": ["src/**/*", "global.d.ts"],
+	"exclude": ["node_modules", ".svelte-kit/*", "build/*"]
 }
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
index 3682c254..4fe702bf 100644
--- a/frontend/vite.config.ts
+++ b/frontend/vite.config.ts
@@ -3,12 +3,23 @@ import { defineConfig } from 'vite';
 
 export default defineConfig({
 	plugins: [sveltekit()],
+	resolve: {
+		alias: {
+			$lib: '/src/lib',
+			$routes: '/src/routes'
+		}
+	},
 	optimizeDeps: {
-		exclude: ['emoji-picker-element']
+		exclude: ['emoji-picker-element'],
+		include: ['svelte-gravatar', 'svelte-waypoint']
 	},
 	server: {
 		proxy: {
-			'/api': 'http://localhost:8000'
+			'/api': {
+				target: 'http://localhost:8000',
+				changeOrigin: true,
+				secure: false
+			}
 		}
 	}
 });
diff --git a/scripts/surveys/groups.csv b/scripts/surveys/groups.csv
index ed22a90c..291813eb 100644
--- a/scripts/surveys/groups.csv
+++ b/scripts/surveys/groups.csv
@@ -1,4 +1,5 @@
 id,title,options
 1,Auditory Picture Vocabulary Test - English,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179
 3,Test,3,4,5
-4,Question,101,102
\ No newline at end of file
+4,Question,101,102
+1100,Infos
diff --git a/scripts/surveys/surveys.csv b/scripts/surveys/surveys.csv
index d780f21c..6b0fe310 100644
--- a/scripts/surveys/surveys.csv
+++ b/scripts/surveys/surveys.csv
@@ -1,3 +1,3 @@
 id,title,groups
 1,Title,1
-2,Test,4
\ No newline at end of file
+2,Test,4,1100
-- 
GitLab