Jr SoulWolf commited on
Commit
83339a4
·
1 Parent(s): e629a07

fix: Correct syntax error in ReportCard component

Browse files
backend/app.py CHANGED
@@ -2,87 +2,112 @@ import os
2
  import json
3
  from fastapi import FastAPI, HTTPException
4
  from fastapi.staticfiles import StaticFiles
5
- from pydantic import BaseModel
6
- import google.generativeai as genai
7
- from dotenv import load_dotenv
8
 
9
- # Load environment variables
10
- load_dotenv()
11
- API_KEY = os.getenv("GEMINI_API_KEY")
12
- # Configure the API key if it exists
13
- if API_KEY:
14
- genai.configure(api_key=API_KEY)
15
-
16
- app = FastAPI()
17
 
18
- # Define patient data model
19
  class Patient(BaseModel):
20
  patient_id: str
21
  age: int
22
  gender: str
23
- location: str
24
- diagnosis: str
25
  comorbidities: str
26
- medications: str
27
- stay_days: int
28
- readmitted: bool
29
 
30
- # Define analysis request model
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  class AnalysisRequest(BaseModel):
32
- patients: list[Patient]
 
 
33
 
34
- # Analyze patients endpoint
35
- @app.post("/api/analyze")
 
 
 
 
 
 
 
 
36
  async def analyze_patients(request: AnalysisRequest):
37
  if not API_KEY:
38
- raise HTTPException(status_code=500, detail="GEMINI_API_KEY is not configured in Space secrets.")
 
 
 
 
 
 
 
39
 
40
  analyses = []
41
  model = genai.GenerativeModel('gemini-1.5-flash')
 
42
  for patient in request.patients:
43
  prompt = f"""
44
- Analyze the following patient data for hospital readmission risk and return the result in a single, valid JSON object format. Do not include any text or formatting outside of the JSON object itself.
45
- The JSON object must have these exact keys: "patient_id", "risk_label", "risk_score", "contributing_factors", and "recommendations".
46
- - risk_label must be one of: "HIGH RISK", "MEDIUM RISK", "LOW RISK".
47
- - risk_score must be a number (float or int) between 0 and 100.
48
- - contributing_factors must be a list of strings.
49
- - recommendations must be a list of strings.
 
50
 
51
  Patient data:
52
  - Patient ID: {patient.patient_id}
53
  - Age: {patient.age}
54
  - Gender: {patient.gender}
55
- - Diagnosis: {patient.diagnosis}
56
  - Comorbidities: {patient.comorbidities}
57
- - Medications: {patient.medications}
58
- - Length of Stay: {patient.stay_days} days
59
  """
60
  try:
61
  response = model.generate_content(prompt)
62
- # Clean the response to ensure it's valid JSON
63
  cleaned_text = response.text.strip().replace("```json", "").replace("```", "")
64
- analysis = json.loads(cleaned_text)
65
- analyses.append(analysis)
 
 
 
 
 
 
 
 
 
 
66
  except (json.JSONDecodeError, Exception) as e:
67
  print(f"Error processing patient {patient.patient_id}: {e}")
68
- # Use response.text if it's available, otherwise provide a generic error
69
- raw_response = "N/A"
70
- if 'response' in locals() and hasattr(response, 'text'):
71
- raw_response = response.text
72
- print(f"Gemini raw response was: {raw_response}")
73
- analyses.append({
74
- "patient_id": patient.patient_id,
75
- "risk_label": "ERROR",
76
- "risk_score": 0,
77
- "contributing_factors": [f"Analysis failed. See logs for details."],
78
- "recommendations": ["Check the raw Gemini response in the application logs."]
79
- })
80
  return analyses
81
 
82
- # Health check endpoint
83
- @app.get("/api/health")
84
- async def health_check():
85
- return {"status": "healthy"}
86
-
87
- # Serve the built frontend from the 'frontend/dist' directory
88
  app.mount("/", StaticFiles(directory="frontend/dist", html=True), name="static")
 
2
  import json
3
  from fastapi import FastAPI, HTTPException
4
  from fastapi.staticfiles import StaticFiles
5
+ from pydantic import BaseModel, Field
6
+ from typing import List, Optional, Literal
 
7
 
8
+ # --- Pydantic Models (matching frontend types.ts) ---
 
 
 
 
 
 
 
9
 
 
10
  class Patient(BaseModel):
11
  patient_id: str
12
  age: int
13
  gender: str
14
+ hospital: str
15
+ primary_diagnosis: str
16
  comorbidities: str
17
+ medications_at_discharge: str
18
+ length_of_stay_days: int
19
+ readmitted_within_30_days: Optional[bool] = None
20
 
21
+ class Analysis(BaseModel):
22
+ patient_id: str
23
+ risk_level: Literal["Low", "Medium", "High"]
24
+ confidence_score: float = Field(..., ge=0, le=1)
25
+ contributing_factors: List[str]
26
+ preventive_recommendations: List[str]
27
+
28
+ class BackendAnalysisSuccess(BaseModel):
29
+ status: Literal['success']
30
+ patient_id: str
31
+ analysis: Analysis
32
+
33
+ class BackendAnalysisError(BaseModel):
34
+ status: Literal['error']
35
+ patient_id: str
36
+ error: str
37
+
38
  class AnalysisRequest(BaseModel):
39
+ patients: List[Patient]
40
+
41
+ # --- AI Configuration ---
42
 
43
+ load_dotenv()
44
+ API_KEY = os.getenv("GEMINI_API_KEY")
45
+ if API_KEY:
46
+ genai.configure(api_key=API_KEY)
47
+
48
+ app = FastAPI()
49
+
50
+ # --- API Endpoints ---
51
+
52
+ @app.post("/api/analyze", response_model=List[dict])
53
  async def analyze_patients(request: AnalysisRequest):
54
  if not API_KEY:
55
+ # Return a structured error for each patient if the API key is missing
56
+ return [
57
+ BackendAnalysisError(
58
+ status='error',
59
+ patient_id=p.patient_id,
60
+ error="GEMINI_API_KEY is not configured in Space secrets."
61
+ ).dict() for p in request.patients
62
+ ]
63
 
64
  analyses = []
65
  model = genai.GenerativeModel('gemini-1.5-flash')
66
+
67
  for patient in request.patients:
68
  prompt = f"""
69
+ Analyze the following patient data for 30-day hospital readmission risk.
70
+ Return the result as a single, valid JSON object with NO additional text or markdown formatting.
71
+ The JSON object must have these exact keys: "patient_id", "risk_level", "confidence_score", "contributing_factors", and "preventive_recommendations".
72
+ - "risk_level" must be one of: "Low", "Medium", "High".
73
+ - "confidence_score" must be a number between 0.0 and 1.0.
74
+ - "contributing_factors" must be a list of 3 short, precise strings.
75
+ - "preventive_recommendations" must be a list of 3 actionable, short strings.
76
 
77
  Patient data:
78
  - Patient ID: {patient.patient_id}
79
  - Age: {patient.age}
80
  - Gender: {patient.gender}
81
+ - Diagnosis: {patient.primary_diagnosis}
82
  - Comorbidities: {patient.comorbidities}
83
+ - Medications: {patient.medications_at_discharge}
84
+ - Length of Stay: {patient.length_of_stay_days} days
85
  """
86
  try:
87
  response = model.generate_content(prompt)
 
88
  cleaned_text = response.text.strip().replace("```json", "").replace("```", "")
89
+ analysis_data = json.loads(cleaned_text)
90
+
91
+ # Validate the data with our Pydantic model
92
+ validated_analysis = Analysis(**analysis_data)
93
+
94
+ success_response = BackendAnalysisSuccess(
95
+ status='success',
96
+ patient_id=patient.patient_id,
97
+ analysis=validated_analysis
98
+ )
99
+ analyses.append(success_response.dict())
100
+
101
  except (json.JSONDecodeError, Exception) as e:
102
  print(f"Error processing patient {patient.patient_id}: {e}")
103
+ error_response = BackendAnalysisError(
104
+ status='error',
105
+ patient_id=patient.patient_id,
106
+ error=f"AI model returned an invalid format or failed. Details: {str(e)}"
107
+ )
108
+ analyses.append(error_response.dict())
109
+
 
 
 
 
 
110
  return analyses
111
 
112
+ # Serve the built frontend
 
 
 
 
 
113
  app.mount("/", StaticFiles(directory="frontend/dist", html=True), name="static")
frontend/dist/assets/index-1c526412.js DELETED
The diff for this file is too large to render. See raw diff
 
frontend/dist/assets/index-5271bae6.css DELETED
@@ -1 +0,0 @@
1
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.mb-3{margin-bottom:.75rem}.mr-3{margin-right:.75rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.flex{display:flex}.grid{display:grid}.h-2{height:.5rem}.max-h-96{max-height:24rem}.max-h-\[30rem\]{max-height:30rem}.min-h-screen{min-height:100vh}.w-full{width:100%}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-6{gap:1.5rem}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-blue-900{--tw-bg-opacity: 1;background-color:rgb(30 58 138 / var(--tw-bg-opacity, 1))}.bg-cyan-500{--tw-bg-opacity: 1;background-color:rgb(6 182 212 / var(--tw-bg-opacity, 1))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-red-900{--tw-bg-opacity: 1;background-color:rgb(127 29 29 / var(--tw-bg-opacity, 1))}.bg-yellow-600{--tw-bg-opacity: 1;background-color:rgb(202 138 4 / var(--tw-bg-opacity, 1))}.bg-opacity-30{--tw-bg-opacity: .3}.bg-opacity-50{--tw-bg-opacity: .5}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-blue-900{--tw-gradient-from: #1e3a8a var(--tw-gradient-from-position);--tw-gradient-to: rgb(30 58 138 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-black{--tw-gradient-to: #000 var(--tw-gradient-to-position)}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.pl-5{padding-left:1.25rem}.text-center{text-align:center}.text-right{text-align:right}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.uppercase{text-transform:uppercase}.text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.opacity-90{opacity:.9}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:text-blue-900:hover{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-500:disabled{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}@media (min-width: 1024px){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}
 
 
frontend/dist/index.html DELETED
@@ -1,15 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
- <title>Prevently.ai</title>
8
- <script type="module" crossorigin src="/assets/index-1c526412.js"></script>
9
- <link rel="stylesheet" href="/assets/index-5271bae6.css">
10
- </head>
11
- <body>
12
- <div id="root"></div>
13
-
14
- </body>
15
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
frontend/index.html CHANGED
@@ -2,9 +2,8 @@
2
  <html lang="en">
3
  <head>
4
  <meta charset="UTF-8" />
5
- <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
- <title>Prevently.ai</title>
8
  </head>
9
  <body>
10
  <div id="root"></div>
 
2
  <html lang="en">
3
  <head>
4
  <meta charset="UTF-8" />
 
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Prevently.ai - Readmission Risk Predictor</title>
7
  </head>
8
  <body>
9
  <div id="root"></div>
frontend/package-lock.json CHANGED
@@ -8,25 +8,29 @@
8
  "name": "prevently-frontend",
9
  "version": "1.0.0",
10
  "dependencies": {
11
- "axios": "^1.6.0",
12
- "react": "^18.2.0",
13
- "react-dom": "^18.2.0",
14
- "tailwindcss": "^3.3.5"
 
15
  },
16
  "devDependencies": {
17
- "@types/react": "^18.2.0",
18
- "@types/react-dom": "^18.2.0",
19
- "@vitejs/plugin-react": "^4.0.0",
 
20
  "autoprefixer": "^10.4.19",
21
  "postcss": "^8.4.38",
22
- "typescript": "^5.0.0",
23
- "vite": "^4.3.0"
 
24
  }
25
  },
26
  "node_modules/@alloc/quick-lru": {
27
  "version": "5.2.0",
28
  "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
29
  "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
 
30
  "license": "MIT",
31
  "engines": {
32
  "node": ">=10"
@@ -331,10 +335,27 @@
331
  "node": ">=6.9.0"
332
  }
333
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
334
  "node_modules/@esbuild/android-arm": {
335
- "version": "0.18.20",
336
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
337
- "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
338
  "cpu": [
339
  "arm"
340
  ],
@@ -349,9 +370,9 @@
349
  }
350
  },
351
  "node_modules/@esbuild/android-arm64": {
352
- "version": "0.18.20",
353
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
354
- "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
355
  "cpu": [
356
  "arm64"
357
  ],
@@ -366,9 +387,9 @@
366
  }
367
  },
368
  "node_modules/@esbuild/android-x64": {
369
- "version": "0.18.20",
370
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
371
- "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
372
  "cpu": [
373
  "x64"
374
  ],
@@ -383,9 +404,9 @@
383
  }
384
  },
385
  "node_modules/@esbuild/darwin-arm64": {
386
- "version": "0.18.20",
387
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
388
- "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
389
  "cpu": [
390
  "arm64"
391
  ],
@@ -400,9 +421,9 @@
400
  }
401
  },
402
  "node_modules/@esbuild/darwin-x64": {
403
- "version": "0.18.20",
404
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
405
- "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
406
  "cpu": [
407
  "x64"
408
  ],
@@ -417,9 +438,9 @@
417
  }
418
  },
419
  "node_modules/@esbuild/freebsd-arm64": {
420
- "version": "0.18.20",
421
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
422
- "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
423
  "cpu": [
424
  "arm64"
425
  ],
@@ -434,9 +455,9 @@
434
  }
435
  },
436
  "node_modules/@esbuild/freebsd-x64": {
437
- "version": "0.18.20",
438
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
439
- "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
440
  "cpu": [
441
  "x64"
442
  ],
@@ -451,9 +472,9 @@
451
  }
452
  },
453
  "node_modules/@esbuild/linux-arm": {
454
- "version": "0.18.20",
455
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
456
- "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
457
  "cpu": [
458
  "arm"
459
  ],
@@ -468,9 +489,9 @@
468
  }
469
  },
470
  "node_modules/@esbuild/linux-arm64": {
471
- "version": "0.18.20",
472
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
473
- "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
474
  "cpu": [
475
  "arm64"
476
  ],
@@ -485,9 +506,9 @@
485
  }
486
  },
487
  "node_modules/@esbuild/linux-ia32": {
488
- "version": "0.18.20",
489
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
490
- "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
491
  "cpu": [
492
  "ia32"
493
  ],
@@ -502,9 +523,9 @@
502
  }
503
  },
504
  "node_modules/@esbuild/linux-loong64": {
505
- "version": "0.18.20",
506
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
507
- "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
508
  "cpu": [
509
  "loong64"
510
  ],
@@ -519,9 +540,9 @@
519
  }
520
  },
521
  "node_modules/@esbuild/linux-mips64el": {
522
- "version": "0.18.20",
523
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
524
- "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
525
  "cpu": [
526
  "mips64el"
527
  ],
@@ -536,9 +557,9 @@
536
  }
537
  },
538
  "node_modules/@esbuild/linux-ppc64": {
539
- "version": "0.18.20",
540
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
541
- "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
542
  "cpu": [
543
  "ppc64"
544
  ],
@@ -553,9 +574,9 @@
553
  }
554
  },
555
  "node_modules/@esbuild/linux-riscv64": {
556
- "version": "0.18.20",
557
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
558
- "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
559
  "cpu": [
560
  "riscv64"
561
  ],
@@ -570,9 +591,9 @@
570
  }
571
  },
572
  "node_modules/@esbuild/linux-s390x": {
573
- "version": "0.18.20",
574
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
575
- "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
576
  "cpu": [
577
  "s390x"
578
  ],
@@ -587,9 +608,9 @@
587
  }
588
  },
589
  "node_modules/@esbuild/linux-x64": {
590
- "version": "0.18.20",
591
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
592
- "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
593
  "cpu": [
594
  "x64"
595
  ],
@@ -604,9 +625,9 @@
604
  }
605
  },
606
  "node_modules/@esbuild/netbsd-x64": {
607
- "version": "0.18.20",
608
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
609
- "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
610
  "cpu": [
611
  "x64"
612
  ],
@@ -621,9 +642,9 @@
621
  }
622
  },
623
  "node_modules/@esbuild/openbsd-x64": {
624
- "version": "0.18.20",
625
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
626
- "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
627
  "cpu": [
628
  "x64"
629
  ],
@@ -638,9 +659,9 @@
638
  }
639
  },
640
  "node_modules/@esbuild/sunos-x64": {
641
- "version": "0.18.20",
642
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
643
- "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
644
  "cpu": [
645
  "x64"
646
  ],
@@ -655,9 +676,9 @@
655
  }
656
  },
657
  "node_modules/@esbuild/win32-arm64": {
658
- "version": "0.18.20",
659
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
660
- "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
661
  "cpu": [
662
  "arm64"
663
  ],
@@ -672,9 +693,9 @@
672
  }
673
  },
674
  "node_modules/@esbuild/win32-ia32": {
675
- "version": "0.18.20",
676
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
677
- "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
678
  "cpu": [
679
  "ia32"
680
  ],
@@ -689,9 +710,9 @@
689
  }
690
  },
691
  "node_modules/@esbuild/win32-x64": {
692
- "version": "0.18.20",
693
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
694
- "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
695
  "cpu": [
696
  "x64"
697
  ],
@@ -709,6 +730,7 @@
709
  "version": "8.0.2",
710
  "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
711
  "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
 
712
  "license": "ISC",
713
  "dependencies": {
714
  "string-width": "^5.1.2",
@@ -726,6 +748,7 @@
726
  "version": "0.3.12",
727
  "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
728
  "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==",
 
729
  "license": "MIT",
730
  "dependencies": {
731
  "@jridgewell/sourcemap-codec": "^1.5.0",
@@ -736,6 +759,7 @@
736
  "version": "3.1.2",
737
  "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
738
  "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
 
739
  "license": "MIT",
740
  "engines": {
741
  "node": ">=6.0.0"
@@ -745,12 +769,14 @@
745
  "version": "1.5.4",
746
  "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
747
  "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==",
 
748
  "license": "MIT"
749
  },
750
  "node_modules/@jridgewell/trace-mapping": {
751
  "version": "0.3.29",
752
  "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz",
753
  "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==",
 
754
  "license": "MIT",
755
  "dependencies": {
756
  "@jridgewell/resolve-uri": "^3.1.0",
@@ -761,6 +787,7 @@
761
  "version": "2.1.5",
762
  "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
763
  "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
 
764
  "license": "MIT",
765
  "dependencies": {
766
  "@nodelib/fs.stat": "2.0.5",
@@ -774,6 +801,7 @@
774
  "version": "2.0.5",
775
  "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
776
  "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
 
777
  "license": "MIT",
778
  "engines": {
779
  "node": ">= 8"
@@ -783,6 +811,7 @@
783
  "version": "1.2.8",
784
  "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
785
  "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
 
786
  "license": "MIT",
787
  "dependencies": {
788
  "@nodelib/fs.scandir": "2.1.5",
@@ -796,6 +825,7 @@
796
  "version": "0.11.0",
797
  "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
798
  "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
 
799
  "license": "MIT",
800
  "optional": true,
801
  "engines": {
@@ -809,6 +839,286 @@
809
  "dev": true,
810
  "license": "MIT"
811
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
812
  "node_modules/@types/babel__core": {
813
  "version": "7.20.5",
814
  "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
@@ -854,6 +1164,33 @@
854
  "@babel/types": "^7.20.7"
855
  }
856
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
857
  "node_modules/@types/prop-types": {
858
  "version": "15.7.15",
859
  "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
@@ -907,6 +1244,7 @@
907
  "version": "6.1.0",
908
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
909
  "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
 
910
  "license": "MIT",
911
  "engines": {
912
  "node": ">=12"
@@ -919,6 +1257,7 @@
919
  "version": "6.2.1",
920
  "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
921
  "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
 
922
  "license": "MIT",
923
  "engines": {
924
  "node": ">=12"
@@ -931,12 +1270,14 @@
931
  "version": "1.3.0",
932
  "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
933
  "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
 
934
  "license": "MIT"
935
  },
936
  "node_modules/anymatch": {
937
  "version": "3.1.3",
938
  "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
939
  "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
 
940
  "license": "ISC",
941
  "dependencies": {
942
  "normalize-path": "^3.0.0",
@@ -950,6 +1291,7 @@
950
  "version": "5.0.2",
951
  "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
952
  "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
 
953
  "license": "MIT"
954
  },
955
  "node_modules/asynckit": {
@@ -1011,12 +1353,14 @@
1011
  "version": "1.0.2",
1012
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1013
  "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
 
1014
  "license": "MIT"
1015
  },
1016
  "node_modules/binary-extensions": {
1017
  "version": "2.3.0",
1018
  "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
1019
  "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
 
1020
  "license": "MIT",
1021
  "engines": {
1022
  "node": ">=8"
@@ -1029,6 +1373,7 @@
1029
  "version": "2.0.2",
1030
  "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
1031
  "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
 
1032
  "license": "MIT",
1033
  "dependencies": {
1034
  "balanced-match": "^1.0.0"
@@ -1038,6 +1383,7 @@
1038
  "version": "3.0.3",
1039
  "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
1040
  "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
 
1041
  "license": "MIT",
1042
  "dependencies": {
1043
  "fill-range": "^7.1.1"
@@ -1096,6 +1442,7 @@
1096
  "version": "2.0.1",
1097
  "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
1098
  "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
 
1099
  "license": "MIT",
1100
  "engines": {
1101
  "node": ">= 6"
@@ -1126,6 +1473,7 @@
1126
  "version": "3.6.0",
1127
  "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
1128
  "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
 
1129
  "license": "MIT",
1130
  "dependencies": {
1131
  "anymatch": "~3.1.2",
@@ -1150,6 +1498,7 @@
1150
  "version": "5.1.2",
1151
  "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1152
  "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
 
1153
  "license": "ISC",
1154
  "dependencies": {
1155
  "is-glob": "^4.0.1"
@@ -1162,6 +1511,7 @@
1162
  "version": "2.0.1",
1163
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1164
  "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
 
1165
  "license": "MIT",
1166
  "dependencies": {
1167
  "color-name": "~1.1.4"
@@ -1174,6 +1524,7 @@
1174
  "version": "1.1.4",
1175
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1176
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
 
1177
  "license": "MIT"
1178
  },
1179
  "node_modules/combined-stream": {
@@ -1192,6 +1543,7 @@
1192
  "version": "4.1.1",
1193
  "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
1194
  "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
 
1195
  "license": "MIT",
1196
  "engines": {
1197
  "node": ">= 6"
@@ -1208,6 +1560,7 @@
1208
  "version": "7.0.6",
1209
  "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
1210
  "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
 
1211
  "license": "MIT",
1212
  "dependencies": {
1213
  "path-key": "^3.1.0",
@@ -1222,6 +1575,7 @@
1222
  "version": "3.0.0",
1223
  "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
1224
  "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
 
1225
  "license": "MIT",
1226
  "bin": {
1227
  "cssesc": "bin/cssesc"
@@ -1268,12 +1622,14 @@
1268
  "version": "1.2.2",
1269
  "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
1270
  "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
 
1271
  "license": "Apache-2.0"
1272
  },
1273
  "node_modules/dlv": {
1274
  "version": "1.1.3",
1275
  "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
1276
  "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
 
1277
  "license": "MIT"
1278
  },
1279
  "node_modules/dunder-proto": {
@@ -1294,6 +1650,7 @@
1294
  "version": "0.2.0",
1295
  "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
1296
  "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
 
1297
  "license": "MIT"
1298
  },
1299
  "node_modules/electron-to-chromium": {
@@ -1307,6 +1664,7 @@
1307
  "version": "9.2.2",
1308
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
1309
  "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
 
1310
  "license": "MIT"
1311
  },
1312
  "node_modules/es-define-property": {
@@ -1355,9 +1713,9 @@
1355
  }
1356
  },
1357
  "node_modules/esbuild": {
1358
- "version": "0.18.20",
1359
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
1360
- "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
1361
  "dev": true,
1362
  "hasInstallScript": true,
1363
  "license": "MIT",
@@ -1368,28 +1726,29 @@
1368
  "node": ">=12"
1369
  },
1370
  "optionalDependencies": {
1371
- "@esbuild/android-arm": "0.18.20",
1372
- "@esbuild/android-arm64": "0.18.20",
1373
- "@esbuild/android-x64": "0.18.20",
1374
- "@esbuild/darwin-arm64": "0.18.20",
1375
- "@esbuild/darwin-x64": "0.18.20",
1376
- "@esbuild/freebsd-arm64": "0.18.20",
1377
- "@esbuild/freebsd-x64": "0.18.20",
1378
- "@esbuild/linux-arm": "0.18.20",
1379
- "@esbuild/linux-arm64": "0.18.20",
1380
- "@esbuild/linux-ia32": "0.18.20",
1381
- "@esbuild/linux-loong64": "0.18.20",
1382
- "@esbuild/linux-mips64el": "0.18.20",
1383
- "@esbuild/linux-ppc64": "0.18.20",
1384
- "@esbuild/linux-riscv64": "0.18.20",
1385
- "@esbuild/linux-s390x": "0.18.20",
1386
- "@esbuild/linux-x64": "0.18.20",
1387
- "@esbuild/netbsd-x64": "0.18.20",
1388
- "@esbuild/openbsd-x64": "0.18.20",
1389
- "@esbuild/sunos-x64": "0.18.20",
1390
- "@esbuild/win32-arm64": "0.18.20",
1391
- "@esbuild/win32-ia32": "0.18.20",
1392
- "@esbuild/win32-x64": "0.18.20"
 
1393
  }
1394
  },
1395
  "node_modules/escalade": {
@@ -1406,6 +1765,7 @@
1406
  "version": "3.3.3",
1407
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
1408
  "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
 
1409
  "license": "MIT",
1410
  "dependencies": {
1411
  "@nodelib/fs.stat": "^2.0.2",
@@ -1422,6 +1782,7 @@
1422
  "version": "5.1.2",
1423
  "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1424
  "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
 
1425
  "license": "ISC",
1426
  "dependencies": {
1427
  "is-glob": "^4.0.1"
@@ -1434,6 +1795,7 @@
1434
  "version": "1.19.1",
1435
  "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
1436
  "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
 
1437
  "license": "ISC",
1438
  "dependencies": {
1439
  "reusify": "^1.0.4"
@@ -1443,6 +1805,7 @@
1443
  "version": "7.1.1",
1444
  "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1445
  "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
 
1446
  "license": "MIT",
1447
  "dependencies": {
1448
  "to-regex-range": "^5.0.1"
@@ -1475,6 +1838,7 @@
1475
  "version": "3.3.1",
1476
  "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
1477
  "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
 
1478
  "license": "ISC",
1479
  "dependencies": {
1480
  "cross-spawn": "^7.0.6",
@@ -1521,6 +1885,7 @@
1521
  "version": "2.3.3",
1522
  "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1523
  "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
 
1524
  "hasInstallScript": true,
1525
  "license": "MIT",
1526
  "optional": true,
@@ -1591,6 +1956,7 @@
1591
  "version": "10.4.5",
1592
  "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
1593
  "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
 
1594
  "license": "ISC",
1595
  "dependencies": {
1596
  "foreground-child": "^3.1.0",
@@ -1611,6 +1977,7 @@
1611
  "version": "6.0.2",
1612
  "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1613
  "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
 
1614
  "license": "ISC",
1615
  "dependencies": {
1616
  "is-glob": "^4.0.3"
@@ -1674,6 +2041,7 @@
1674
  "version": "2.1.0",
1675
  "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1676
  "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
 
1677
  "license": "MIT",
1678
  "dependencies": {
1679
  "binary-extensions": "^2.0.0"
@@ -1686,6 +2054,7 @@
1686
  "version": "2.16.1",
1687
  "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
1688
  "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
 
1689
  "license": "MIT",
1690
  "dependencies": {
1691
  "hasown": "^2.0.2"
@@ -1701,6 +2070,7 @@
1701
  "version": "2.1.1",
1702
  "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1703
  "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
 
1704
  "license": "MIT",
1705
  "engines": {
1706
  "node": ">=0.10.0"
@@ -1710,6 +2080,7 @@
1710
  "version": "3.0.0",
1711
  "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1712
  "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
 
1713
  "license": "MIT",
1714
  "engines": {
1715
  "node": ">=8"
@@ -1719,6 +2090,7 @@
1719
  "version": "4.0.3",
1720
  "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1721
  "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
 
1722
  "license": "MIT",
1723
  "dependencies": {
1724
  "is-extglob": "^2.1.1"
@@ -1731,6 +2103,7 @@
1731
  "version": "7.0.0",
1732
  "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1733
  "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
 
1734
  "license": "MIT",
1735
  "engines": {
1736
  "node": ">=0.12.0"
@@ -1740,12 +2113,14 @@
1740
  "version": "2.0.0",
1741
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1742
  "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
 
1743
  "license": "ISC"
1744
  },
1745
  "node_modules/jackspeak": {
1746
  "version": "3.4.3",
1747
  "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
1748
  "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
 
1749
  "license": "BlueOak-1.0.0",
1750
  "dependencies": {
1751
  "@isaacs/cliui": "^8.0.2"
@@ -1761,6 +2136,7 @@
1761
  "version": "1.21.7",
1762
  "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
1763
  "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
 
1764
  "license": "MIT",
1765
  "bin": {
1766
  "jiti": "bin/jiti.js"
@@ -1802,6 +2178,7 @@
1802
  "version": "3.1.3",
1803
  "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
1804
  "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
 
1805
  "license": "MIT",
1806
  "engines": {
1807
  "node": ">=14"
@@ -1814,6 +2191,7 @@
1814
  "version": "1.2.4",
1815
  "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
1816
  "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
 
1817
  "license": "MIT"
1818
  },
1819
  "node_modules/loose-envify": {
@@ -1851,6 +2229,7 @@
1851
  "version": "1.4.1",
1852
  "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1853
  "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
 
1854
  "license": "MIT",
1855
  "engines": {
1856
  "node": ">= 8"
@@ -1860,6 +2239,7 @@
1860
  "version": "4.0.8",
1861
  "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
1862
  "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
 
1863
  "license": "MIT",
1864
  "dependencies": {
1865
  "braces": "^3.0.3",
@@ -1894,6 +2274,7 @@
1894
  "version": "9.0.5",
1895
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
1896
  "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
 
1897
  "license": "ISC",
1898
  "dependencies": {
1899
  "brace-expansion": "^2.0.1"
@@ -1909,6 +2290,7 @@
1909
  "version": "7.1.2",
1910
  "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
1911
  "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
 
1912
  "license": "ISC",
1913
  "engines": {
1914
  "node": ">=16 || 14 >=14.17"
@@ -1925,6 +2307,7 @@
1925
  "version": "2.7.0",
1926
  "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
1927
  "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
 
1928
  "license": "MIT",
1929
  "dependencies": {
1930
  "any-promise": "^1.0.0",
@@ -1936,6 +2319,7 @@
1936
  "version": "3.3.11",
1937
  "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
1938
  "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
 
1939
  "funding": [
1940
  {
1941
  "type": "github",
@@ -1961,6 +2345,7 @@
1961
  "version": "3.0.0",
1962
  "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1963
  "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
 
1964
  "license": "MIT",
1965
  "engines": {
1966
  "node": ">=0.10.0"
@@ -1980,6 +2365,7 @@
1980
  "version": "4.1.1",
1981
  "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1982
  "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
 
1983
  "license": "MIT",
1984
  "engines": {
1985
  "node": ">=0.10.0"
@@ -1989,6 +2375,7 @@
1989
  "version": "3.0.0",
1990
  "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
1991
  "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
 
1992
  "license": "MIT",
1993
  "engines": {
1994
  "node": ">= 6"
@@ -1998,12 +2385,20 @@
1998
  "version": "1.0.1",
1999
  "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
2000
  "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
 
2001
  "license": "BlueOak-1.0.0"
2002
  },
 
 
 
 
 
 
2003
  "node_modules/path-key": {
2004
  "version": "3.1.1",
2005
  "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2006
  "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
 
2007
  "license": "MIT",
2008
  "engines": {
2009
  "node": ">=8"
@@ -2013,12 +2408,14 @@
2013
  "version": "1.0.7",
2014
  "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
2015
  "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
 
2016
  "license": "MIT"
2017
  },
2018
  "node_modules/path-scurry": {
2019
  "version": "1.11.1",
2020
  "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
2021
  "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
 
2022
  "license": "BlueOak-1.0.0",
2023
  "dependencies": {
2024
  "lru-cache": "^10.2.0",
@@ -2035,18 +2432,21 @@
2035
  "version": "10.4.3",
2036
  "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
2037
  "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
 
2038
  "license": "ISC"
2039
  },
2040
  "node_modules/picocolors": {
2041
  "version": "1.1.1",
2042
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
2043
  "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
 
2044
  "license": "ISC"
2045
  },
2046
  "node_modules/picomatch": {
2047
  "version": "2.3.1",
2048
  "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2049
  "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
 
2050
  "license": "MIT",
2051
  "engines": {
2052
  "node": ">=8.6"
@@ -2059,6 +2459,7 @@
2059
  "version": "2.3.0",
2060
  "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2061
  "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
 
2062
  "license": "MIT",
2063
  "engines": {
2064
  "node": ">=0.10.0"
@@ -2068,6 +2469,7 @@
2068
  "version": "4.0.7",
2069
  "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
2070
  "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
 
2071
  "license": "MIT",
2072
  "engines": {
2073
  "node": ">= 6"
@@ -2077,6 +2479,7 @@
2077
  "version": "8.5.6",
2078
  "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
2079
  "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
 
2080
  "funding": [
2081
  {
2082
  "type": "opencollective",
@@ -2105,6 +2508,7 @@
2105
  "version": "15.1.0",
2106
  "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
2107
  "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
 
2108
  "license": "MIT",
2109
  "dependencies": {
2110
  "postcss-value-parser": "^4.0.0",
@@ -2122,6 +2526,7 @@
2122
  "version": "4.0.1",
2123
  "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
2124
  "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
 
2125
  "license": "MIT",
2126
  "dependencies": {
2127
  "camelcase-css": "^2.0.1"
@@ -2141,6 +2546,7 @@
2141
  "version": "4.0.2",
2142
  "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
2143
  "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
 
2144
  "funding": [
2145
  {
2146
  "type": "opencollective",
@@ -2176,6 +2582,7 @@
2176
  "version": "6.2.0",
2177
  "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
2178
  "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
 
2179
  "funding": [
2180
  {
2181
  "type": "opencollective",
@@ -2201,6 +2608,7 @@
2201
  "version": "6.1.2",
2202
  "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
2203
  "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
 
2204
  "license": "MIT",
2205
  "dependencies": {
2206
  "cssesc": "^3.0.0",
@@ -2214,6 +2622,7 @@
2214
  "version": "4.2.0",
2215
  "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
2216
  "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
 
2217
  "license": "MIT"
2218
  },
2219
  "node_modules/proxy-from-env": {
@@ -2226,6 +2635,7 @@
2226
  "version": "1.2.3",
2227
  "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
2228
  "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
 
2229
  "funding": [
2230
  {
2231
  "type": "github",
@@ -2281,6 +2691,7 @@
2281
  "version": "1.0.0",
2282
  "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
2283
  "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
 
2284
  "license": "MIT",
2285
  "dependencies": {
2286
  "pify": "^2.3.0"
@@ -2290,6 +2701,7 @@
2290
  "version": "3.6.0",
2291
  "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
2292
  "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
 
2293
  "license": "MIT",
2294
  "dependencies": {
2295
  "picomatch": "^2.2.1"
@@ -2302,6 +2714,7 @@
2302
  "version": "1.22.10",
2303
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
2304
  "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
 
2305
  "license": "MIT",
2306
  "dependencies": {
2307
  "is-core-module": "^2.16.0",
@@ -2322,6 +2735,7 @@
2322
  "version": "1.1.0",
2323
  "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
2324
  "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
 
2325
  "license": "MIT",
2326
  "engines": {
2327
  "iojs": ">=1.0.0",
@@ -2329,19 +2743,42 @@
2329
  }
2330
  },
2331
  "node_modules/rollup": {
2332
- "version": "3.29.5",
2333
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz",
2334
- "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==",
2335
  "dev": true,
2336
  "license": "MIT",
 
 
 
2337
  "bin": {
2338
  "rollup": "dist/bin/rollup"
2339
  },
2340
  "engines": {
2341
- "node": ">=14.18.0",
2342
  "npm": ">=8.0.0"
2343
  },
2344
  "optionalDependencies": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2345
  "fsevents": "~2.3.2"
2346
  }
2347
  },
@@ -2349,6 +2786,7 @@
2349
  "version": "1.2.0",
2350
  "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2351
  "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
 
2352
  "funding": [
2353
  {
2354
  "type": "github",
@@ -2391,6 +2829,7 @@
2391
  "version": "2.0.0",
2392
  "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2393
  "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
 
2394
  "license": "MIT",
2395
  "dependencies": {
2396
  "shebang-regex": "^3.0.0"
@@ -2403,6 +2842,7 @@
2403
  "version": "3.0.0",
2404
  "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2405
  "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
 
2406
  "license": "MIT",
2407
  "engines": {
2408
  "node": ">=8"
@@ -2412,6 +2852,7 @@
2412
  "version": "4.1.0",
2413
  "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
2414
  "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
 
2415
  "license": "ISC",
2416
  "engines": {
2417
  "node": ">=14"
@@ -2424,6 +2865,7 @@
2424
  "version": "1.2.1",
2425
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
2426
  "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
 
2427
  "license": "BSD-3-Clause",
2428
  "engines": {
2429
  "node": ">=0.10.0"
@@ -2433,6 +2875,7 @@
2433
  "version": "5.1.2",
2434
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
2435
  "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
 
2436
  "license": "MIT",
2437
  "dependencies": {
2438
  "eastasianwidth": "^0.2.0",
@@ -2451,6 +2894,7 @@
2451
  "version": "4.2.3",
2452
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2453
  "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 
2454
  "license": "MIT",
2455
  "dependencies": {
2456
  "emoji-regex": "^8.0.0",
@@ -2465,6 +2909,7 @@
2465
  "version": "5.0.1",
2466
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2467
  "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 
2468
  "license": "MIT",
2469
  "engines": {
2470
  "node": ">=8"
@@ -2474,12 +2919,14 @@
2474
  "version": "8.0.0",
2475
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2476
  "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 
2477
  "license": "MIT"
2478
  },
2479
  "node_modules/string-width-cjs/node_modules/strip-ansi": {
2480
  "version": "6.0.1",
2481
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2482
  "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 
2483
  "license": "MIT",
2484
  "dependencies": {
2485
  "ansi-regex": "^5.0.1"
@@ -2492,6 +2939,7 @@
2492
  "version": "7.1.0",
2493
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
2494
  "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
 
2495
  "license": "MIT",
2496
  "dependencies": {
2497
  "ansi-regex": "^6.0.1"
@@ -2508,6 +2956,7 @@
2508
  "version": "6.0.1",
2509
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2510
  "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 
2511
  "license": "MIT",
2512
  "dependencies": {
2513
  "ansi-regex": "^5.0.1"
@@ -2520,6 +2969,7 @@
2520
  "version": "5.0.1",
2521
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2522
  "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 
2523
  "license": "MIT",
2524
  "engines": {
2525
  "node": ">=8"
@@ -2529,6 +2979,7 @@
2529
  "version": "3.35.0",
2530
  "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
2531
  "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
 
2532
  "license": "MIT",
2533
  "dependencies": {
2534
  "@jridgewell/gen-mapping": "^0.3.2",
@@ -2551,6 +3002,7 @@
2551
  "version": "1.0.0",
2552
  "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
2553
  "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
 
2554
  "license": "MIT",
2555
  "engines": {
2556
  "node": ">= 0.4"
@@ -2563,6 +3015,7 @@
2563
  "version": "3.4.17",
2564
  "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
2565
  "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
 
2566
  "license": "MIT",
2567
  "dependencies": {
2568
  "@alloc/quick-lru": "^5.2.0",
@@ -2600,6 +3053,7 @@
2600
  "version": "3.3.1",
2601
  "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
2602
  "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
 
2603
  "license": "MIT",
2604
  "dependencies": {
2605
  "any-promise": "^1.0.0"
@@ -2609,6 +3063,7 @@
2609
  "version": "1.6.0",
2610
  "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
2611
  "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
 
2612
  "license": "MIT",
2613
  "dependencies": {
2614
  "thenify": ">= 3.1.0 < 4"
@@ -2621,6 +3076,7 @@
2621
  "version": "5.0.1",
2622
  "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2623
  "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
 
2624
  "license": "MIT",
2625
  "dependencies": {
2626
  "is-number": "^7.0.0"
@@ -2633,6 +3089,7 @@
2633
  "version": "0.1.13",
2634
  "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
2635
  "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
 
2636
  "license": "Apache-2.0"
2637
  },
2638
  "node_modules/typescript": {
@@ -2649,6 +3106,13 @@
2649
  "node": ">=14.17"
2650
  }
2651
  },
 
 
 
 
 
 
 
2652
  "node_modules/update-browserslist-db": {
2653
  "version": "1.1.3",
2654
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
@@ -2684,36 +3148,38 @@
2684
  "version": "1.0.2",
2685
  "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2686
  "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
 
2687
  "license": "MIT"
2688
  },
2689
  "node_modules/vite": {
2690
- "version": "4.5.14",
2691
- "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.14.tgz",
2692
- "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==",
2693
  "dev": true,
2694
  "license": "MIT",
2695
  "dependencies": {
2696
- "esbuild": "^0.18.10",
2697
- "postcss": "^8.4.27",
2698
- "rollup": "^3.27.1"
2699
  },
2700
  "bin": {
2701
  "vite": "bin/vite.js"
2702
  },
2703
  "engines": {
2704
- "node": "^14.18.0 || >=16.0.0"
2705
  },
2706
  "funding": {
2707
  "url": "https://github.com/vitejs/vite?sponsor=1"
2708
  },
2709
  "optionalDependencies": {
2710
- "fsevents": "~2.3.2"
2711
  },
2712
  "peerDependencies": {
2713
- "@types/node": ">= 14",
2714
  "less": "*",
2715
  "lightningcss": "^1.21.0",
2716
  "sass": "*",
 
2717
  "stylus": "*",
2718
  "sugarss": "*",
2719
  "terser": "^5.4.0"
@@ -2731,6 +3197,9 @@
2731
  "sass": {
2732
  "optional": true
2733
  },
 
 
 
2734
  "stylus": {
2735
  "optional": true
2736
  },
@@ -2746,6 +3215,7 @@
2746
  "version": "2.0.2",
2747
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2748
  "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
 
2749
  "license": "ISC",
2750
  "dependencies": {
2751
  "isexe": "^2.0.0"
@@ -2761,6 +3231,7 @@
2761
  "version": "8.1.0",
2762
  "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
2763
  "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
 
2764
  "license": "MIT",
2765
  "dependencies": {
2766
  "ansi-styles": "^6.1.0",
@@ -2779,6 +3250,7 @@
2779
  "version": "7.0.0",
2780
  "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
2781
  "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
 
2782
  "license": "MIT",
2783
  "dependencies": {
2784
  "ansi-styles": "^4.0.0",
@@ -2796,6 +3268,7 @@
2796
  "version": "5.0.1",
2797
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2798
  "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 
2799
  "license": "MIT",
2800
  "engines": {
2801
  "node": ">=8"
@@ -2805,6 +3278,7 @@
2805
  "version": "4.3.0",
2806
  "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2807
  "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
 
2808
  "license": "MIT",
2809
  "dependencies": {
2810
  "color-convert": "^2.0.1"
@@ -2820,12 +3294,14 @@
2820
  "version": "8.0.0",
2821
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2822
  "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 
2823
  "license": "MIT"
2824
  },
2825
  "node_modules/wrap-ansi-cjs/node_modules/string-width": {
2826
  "version": "4.2.3",
2827
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2828
  "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 
2829
  "license": "MIT",
2830
  "dependencies": {
2831
  "emoji-regex": "^8.0.0",
@@ -2840,6 +3316,7 @@
2840
  "version": "6.0.1",
2841
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2842
  "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 
2843
  "license": "MIT",
2844
  "dependencies": {
2845
  "ansi-regex": "^5.0.1"
@@ -2859,6 +3336,7 @@
2859
  "version": "2.8.0",
2860
  "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
2861
  "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==",
 
2862
  "license": "ISC",
2863
  "bin": {
2864
  "yaml": "bin.mjs"
@@ -2866,6 +3344,15 @@
2866
  "engines": {
2867
  "node": ">= 14.6"
2868
  }
 
 
 
 
 
 
 
 
 
2869
  }
2870
  }
2871
  }
 
8
  "name": "prevently-frontend",
9
  "version": "1.0.0",
10
  "dependencies": {
11
+ "axios": "^1.7.2",
12
+ "papaparse": "^5.4.1",
13
+ "react": "^18.3.1",
14
+ "react-dom": "^18.3.1",
15
+ "zod": "^3.23.8"
16
  },
17
  "devDependencies": {
18
+ "@types/papaparse": "^5.3.14",
19
+ "@types/react": "^18.3.3",
20
+ "@types/react-dom": "^18.3.0",
21
+ "@vitejs/plugin-react": "^4.3.1",
22
  "autoprefixer": "^10.4.19",
23
  "postcss": "^8.4.38",
24
+ "tailwindcss": "^3.4.4",
25
+ "typescript": "^5.4.5",
26
+ "vite": "^5.3.1"
27
  }
28
  },
29
  "node_modules/@alloc/quick-lru": {
30
  "version": "5.2.0",
31
  "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
32
  "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
33
+ "dev": true,
34
  "license": "MIT",
35
  "engines": {
36
  "node": ">=10"
 
335
  "node": ">=6.9.0"
336
  }
337
  },
338
+ "node_modules/@esbuild/aix-ppc64": {
339
+ "version": "0.21.5",
340
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
341
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
342
+ "cpu": [
343
+ "ppc64"
344
+ ],
345
+ "dev": true,
346
+ "license": "MIT",
347
+ "optional": true,
348
+ "os": [
349
+ "aix"
350
+ ],
351
+ "engines": {
352
+ "node": ">=12"
353
+ }
354
+ },
355
  "node_modules/@esbuild/android-arm": {
356
+ "version": "0.21.5",
357
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
358
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
359
  "cpu": [
360
  "arm"
361
  ],
 
370
  }
371
  },
372
  "node_modules/@esbuild/android-arm64": {
373
+ "version": "0.21.5",
374
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
375
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
376
  "cpu": [
377
  "arm64"
378
  ],
 
387
  }
388
  },
389
  "node_modules/@esbuild/android-x64": {
390
+ "version": "0.21.5",
391
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
392
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
393
  "cpu": [
394
  "x64"
395
  ],
 
404
  }
405
  },
406
  "node_modules/@esbuild/darwin-arm64": {
407
+ "version": "0.21.5",
408
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
409
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
410
  "cpu": [
411
  "arm64"
412
  ],
 
421
  }
422
  },
423
  "node_modules/@esbuild/darwin-x64": {
424
+ "version": "0.21.5",
425
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
426
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
427
  "cpu": [
428
  "x64"
429
  ],
 
438
  }
439
  },
440
  "node_modules/@esbuild/freebsd-arm64": {
441
+ "version": "0.21.5",
442
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
443
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
444
  "cpu": [
445
  "arm64"
446
  ],
 
455
  }
456
  },
457
  "node_modules/@esbuild/freebsd-x64": {
458
+ "version": "0.21.5",
459
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
460
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
461
  "cpu": [
462
  "x64"
463
  ],
 
472
  }
473
  },
474
  "node_modules/@esbuild/linux-arm": {
475
+ "version": "0.21.5",
476
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
477
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
478
  "cpu": [
479
  "arm"
480
  ],
 
489
  }
490
  },
491
  "node_modules/@esbuild/linux-arm64": {
492
+ "version": "0.21.5",
493
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
494
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
495
  "cpu": [
496
  "arm64"
497
  ],
 
506
  }
507
  },
508
  "node_modules/@esbuild/linux-ia32": {
509
+ "version": "0.21.5",
510
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
511
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
512
  "cpu": [
513
  "ia32"
514
  ],
 
523
  }
524
  },
525
  "node_modules/@esbuild/linux-loong64": {
526
+ "version": "0.21.5",
527
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
528
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
529
  "cpu": [
530
  "loong64"
531
  ],
 
540
  }
541
  },
542
  "node_modules/@esbuild/linux-mips64el": {
543
+ "version": "0.21.5",
544
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
545
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
546
  "cpu": [
547
  "mips64el"
548
  ],
 
557
  }
558
  },
559
  "node_modules/@esbuild/linux-ppc64": {
560
+ "version": "0.21.5",
561
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
562
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
563
  "cpu": [
564
  "ppc64"
565
  ],
 
574
  }
575
  },
576
  "node_modules/@esbuild/linux-riscv64": {
577
+ "version": "0.21.5",
578
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
579
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
580
  "cpu": [
581
  "riscv64"
582
  ],
 
591
  }
592
  },
593
  "node_modules/@esbuild/linux-s390x": {
594
+ "version": "0.21.5",
595
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
596
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
597
  "cpu": [
598
  "s390x"
599
  ],
 
608
  }
609
  },
610
  "node_modules/@esbuild/linux-x64": {
611
+ "version": "0.21.5",
612
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
613
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
614
  "cpu": [
615
  "x64"
616
  ],
 
625
  }
626
  },
627
  "node_modules/@esbuild/netbsd-x64": {
628
+ "version": "0.21.5",
629
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
630
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
631
  "cpu": [
632
  "x64"
633
  ],
 
642
  }
643
  },
644
  "node_modules/@esbuild/openbsd-x64": {
645
+ "version": "0.21.5",
646
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
647
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
648
  "cpu": [
649
  "x64"
650
  ],
 
659
  }
660
  },
661
  "node_modules/@esbuild/sunos-x64": {
662
+ "version": "0.21.5",
663
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
664
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
665
  "cpu": [
666
  "x64"
667
  ],
 
676
  }
677
  },
678
  "node_modules/@esbuild/win32-arm64": {
679
+ "version": "0.21.5",
680
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
681
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
682
  "cpu": [
683
  "arm64"
684
  ],
 
693
  }
694
  },
695
  "node_modules/@esbuild/win32-ia32": {
696
+ "version": "0.21.5",
697
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
698
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
699
  "cpu": [
700
  "ia32"
701
  ],
 
710
  }
711
  },
712
  "node_modules/@esbuild/win32-x64": {
713
+ "version": "0.21.5",
714
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
715
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
716
  "cpu": [
717
  "x64"
718
  ],
 
730
  "version": "8.0.2",
731
  "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
732
  "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
733
+ "dev": true,
734
  "license": "ISC",
735
  "dependencies": {
736
  "string-width": "^5.1.2",
 
748
  "version": "0.3.12",
749
  "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
750
  "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==",
751
+ "dev": true,
752
  "license": "MIT",
753
  "dependencies": {
754
  "@jridgewell/sourcemap-codec": "^1.5.0",
 
759
  "version": "3.1.2",
760
  "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
761
  "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
762
+ "dev": true,
763
  "license": "MIT",
764
  "engines": {
765
  "node": ">=6.0.0"
 
769
  "version": "1.5.4",
770
  "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
771
  "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==",
772
+ "dev": true,
773
  "license": "MIT"
774
  },
775
  "node_modules/@jridgewell/trace-mapping": {
776
  "version": "0.3.29",
777
  "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz",
778
  "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==",
779
+ "dev": true,
780
  "license": "MIT",
781
  "dependencies": {
782
  "@jridgewell/resolve-uri": "^3.1.0",
 
787
  "version": "2.1.5",
788
  "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
789
  "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
790
+ "dev": true,
791
  "license": "MIT",
792
  "dependencies": {
793
  "@nodelib/fs.stat": "2.0.5",
 
801
  "version": "2.0.5",
802
  "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
803
  "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
804
+ "dev": true,
805
  "license": "MIT",
806
  "engines": {
807
  "node": ">= 8"
 
811
  "version": "1.2.8",
812
  "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
813
  "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
814
+ "dev": true,
815
  "license": "MIT",
816
  "dependencies": {
817
  "@nodelib/fs.scandir": "2.1.5",
 
825
  "version": "0.11.0",
826
  "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
827
  "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
828
+ "dev": true,
829
  "license": "MIT",
830
  "optional": true,
831
  "engines": {
 
839
  "dev": true,
840
  "license": "MIT"
841
  },
842
+ "node_modules/@rollup/rollup-android-arm-eabi": {
843
+ "version": "4.45.1",
844
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz",
845
+ "integrity": "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==",
846
+ "cpu": [
847
+ "arm"
848
+ ],
849
+ "dev": true,
850
+ "license": "MIT",
851
+ "optional": true,
852
+ "os": [
853
+ "android"
854
+ ]
855
+ },
856
+ "node_modules/@rollup/rollup-android-arm64": {
857
+ "version": "4.45.1",
858
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz",
859
+ "integrity": "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==",
860
+ "cpu": [
861
+ "arm64"
862
+ ],
863
+ "dev": true,
864
+ "license": "MIT",
865
+ "optional": true,
866
+ "os": [
867
+ "android"
868
+ ]
869
+ },
870
+ "node_modules/@rollup/rollup-darwin-arm64": {
871
+ "version": "4.45.1",
872
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz",
873
+ "integrity": "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==",
874
+ "cpu": [
875
+ "arm64"
876
+ ],
877
+ "dev": true,
878
+ "license": "MIT",
879
+ "optional": true,
880
+ "os": [
881
+ "darwin"
882
+ ]
883
+ },
884
+ "node_modules/@rollup/rollup-darwin-x64": {
885
+ "version": "4.45.1",
886
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz",
887
+ "integrity": "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==",
888
+ "cpu": [
889
+ "x64"
890
+ ],
891
+ "dev": true,
892
+ "license": "MIT",
893
+ "optional": true,
894
+ "os": [
895
+ "darwin"
896
+ ]
897
+ },
898
+ "node_modules/@rollup/rollup-freebsd-arm64": {
899
+ "version": "4.45.1",
900
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz",
901
+ "integrity": "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==",
902
+ "cpu": [
903
+ "arm64"
904
+ ],
905
+ "dev": true,
906
+ "license": "MIT",
907
+ "optional": true,
908
+ "os": [
909
+ "freebsd"
910
+ ]
911
+ },
912
+ "node_modules/@rollup/rollup-freebsd-x64": {
913
+ "version": "4.45.1",
914
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz",
915
+ "integrity": "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==",
916
+ "cpu": [
917
+ "x64"
918
+ ],
919
+ "dev": true,
920
+ "license": "MIT",
921
+ "optional": true,
922
+ "os": [
923
+ "freebsd"
924
+ ]
925
+ },
926
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
927
+ "version": "4.45.1",
928
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz",
929
+ "integrity": "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==",
930
+ "cpu": [
931
+ "arm"
932
+ ],
933
+ "dev": true,
934
+ "license": "MIT",
935
+ "optional": true,
936
+ "os": [
937
+ "linux"
938
+ ]
939
+ },
940
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
941
+ "version": "4.45.1",
942
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz",
943
+ "integrity": "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==",
944
+ "cpu": [
945
+ "arm"
946
+ ],
947
+ "dev": true,
948
+ "license": "MIT",
949
+ "optional": true,
950
+ "os": [
951
+ "linux"
952
+ ]
953
+ },
954
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
955
+ "version": "4.45.1",
956
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz",
957
+ "integrity": "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==",
958
+ "cpu": [
959
+ "arm64"
960
+ ],
961
+ "dev": true,
962
+ "license": "MIT",
963
+ "optional": true,
964
+ "os": [
965
+ "linux"
966
+ ]
967
+ },
968
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
969
+ "version": "4.45.1",
970
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz",
971
+ "integrity": "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==",
972
+ "cpu": [
973
+ "arm64"
974
+ ],
975
+ "dev": true,
976
+ "license": "MIT",
977
+ "optional": true,
978
+ "os": [
979
+ "linux"
980
+ ]
981
+ },
982
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
983
+ "version": "4.45.1",
984
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz",
985
+ "integrity": "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==",
986
+ "cpu": [
987
+ "loong64"
988
+ ],
989
+ "dev": true,
990
+ "license": "MIT",
991
+ "optional": true,
992
+ "os": [
993
+ "linux"
994
+ ]
995
+ },
996
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
997
+ "version": "4.45.1",
998
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz",
999
+ "integrity": "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==",
1000
+ "cpu": [
1001
+ "ppc64"
1002
+ ],
1003
+ "dev": true,
1004
+ "license": "MIT",
1005
+ "optional": true,
1006
+ "os": [
1007
+ "linux"
1008
+ ]
1009
+ },
1010
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
1011
+ "version": "4.45.1",
1012
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz",
1013
+ "integrity": "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==",
1014
+ "cpu": [
1015
+ "riscv64"
1016
+ ],
1017
+ "dev": true,
1018
+ "license": "MIT",
1019
+ "optional": true,
1020
+ "os": [
1021
+ "linux"
1022
+ ]
1023
+ },
1024
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
1025
+ "version": "4.45.1",
1026
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz",
1027
+ "integrity": "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==",
1028
+ "cpu": [
1029
+ "riscv64"
1030
+ ],
1031
+ "dev": true,
1032
+ "license": "MIT",
1033
+ "optional": true,
1034
+ "os": [
1035
+ "linux"
1036
+ ]
1037
+ },
1038
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
1039
+ "version": "4.45.1",
1040
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz",
1041
+ "integrity": "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==",
1042
+ "cpu": [
1043
+ "s390x"
1044
+ ],
1045
+ "dev": true,
1046
+ "license": "MIT",
1047
+ "optional": true,
1048
+ "os": [
1049
+ "linux"
1050
+ ]
1051
+ },
1052
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
1053
+ "version": "4.45.1",
1054
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz",
1055
+ "integrity": "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==",
1056
+ "cpu": [
1057
+ "x64"
1058
+ ],
1059
+ "dev": true,
1060
+ "license": "MIT",
1061
+ "optional": true,
1062
+ "os": [
1063
+ "linux"
1064
+ ]
1065
+ },
1066
+ "node_modules/@rollup/rollup-linux-x64-musl": {
1067
+ "version": "4.45.1",
1068
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz",
1069
+ "integrity": "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==",
1070
+ "cpu": [
1071
+ "x64"
1072
+ ],
1073
+ "dev": true,
1074
+ "license": "MIT",
1075
+ "optional": true,
1076
+ "os": [
1077
+ "linux"
1078
+ ]
1079
+ },
1080
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
1081
+ "version": "4.45.1",
1082
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz",
1083
+ "integrity": "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==",
1084
+ "cpu": [
1085
+ "arm64"
1086
+ ],
1087
+ "dev": true,
1088
+ "license": "MIT",
1089
+ "optional": true,
1090
+ "os": [
1091
+ "win32"
1092
+ ]
1093
+ },
1094
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
1095
+ "version": "4.45.1",
1096
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz",
1097
+ "integrity": "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==",
1098
+ "cpu": [
1099
+ "ia32"
1100
+ ],
1101
+ "dev": true,
1102
+ "license": "MIT",
1103
+ "optional": true,
1104
+ "os": [
1105
+ "win32"
1106
+ ]
1107
+ },
1108
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
1109
+ "version": "4.45.1",
1110
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz",
1111
+ "integrity": "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==",
1112
+ "cpu": [
1113
+ "x64"
1114
+ ],
1115
+ "dev": true,
1116
+ "license": "MIT",
1117
+ "optional": true,
1118
+ "os": [
1119
+ "win32"
1120
+ ]
1121
+ },
1122
  "node_modules/@types/babel__core": {
1123
  "version": "7.20.5",
1124
  "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
 
1164
  "@babel/types": "^7.20.7"
1165
  }
1166
  },
1167
+ "node_modules/@types/estree": {
1168
+ "version": "1.0.8",
1169
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1170
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1171
+ "dev": true,
1172
+ "license": "MIT"
1173
+ },
1174
+ "node_modules/@types/node": {
1175
+ "version": "24.0.15",
1176
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.15.tgz",
1177
+ "integrity": "sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA==",
1178
+ "dev": true,
1179
+ "license": "MIT",
1180
+ "dependencies": {
1181
+ "undici-types": "~7.8.0"
1182
+ }
1183
+ },
1184
+ "node_modules/@types/papaparse": {
1185
+ "version": "5.3.16",
1186
+ "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.3.16.tgz",
1187
+ "integrity": "sha512-T3VuKMC2H0lgsjI9buTB3uuKj3EMD2eap1MOuEQuBQ44EnDx/IkGhU6EwiTf9zG3za4SKlmwKAImdDKdNnCsXg==",
1188
+ "dev": true,
1189
+ "license": "MIT",
1190
+ "dependencies": {
1191
+ "@types/node": "*"
1192
+ }
1193
+ },
1194
  "node_modules/@types/prop-types": {
1195
  "version": "15.7.15",
1196
  "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
 
1244
  "version": "6.1.0",
1245
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
1246
  "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
1247
+ "dev": true,
1248
  "license": "MIT",
1249
  "engines": {
1250
  "node": ">=12"
 
1257
  "version": "6.2.1",
1258
  "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
1259
  "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
1260
+ "dev": true,
1261
  "license": "MIT",
1262
  "engines": {
1263
  "node": ">=12"
 
1270
  "version": "1.3.0",
1271
  "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
1272
  "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
1273
+ "dev": true,
1274
  "license": "MIT"
1275
  },
1276
  "node_modules/anymatch": {
1277
  "version": "3.1.3",
1278
  "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
1279
  "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
1280
+ "dev": true,
1281
  "license": "ISC",
1282
  "dependencies": {
1283
  "normalize-path": "^3.0.0",
 
1291
  "version": "5.0.2",
1292
  "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
1293
  "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
1294
+ "dev": true,
1295
  "license": "MIT"
1296
  },
1297
  "node_modules/asynckit": {
 
1353
  "version": "1.0.2",
1354
  "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1355
  "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1356
+ "dev": true,
1357
  "license": "MIT"
1358
  },
1359
  "node_modules/binary-extensions": {
1360
  "version": "2.3.0",
1361
  "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
1362
  "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
1363
+ "dev": true,
1364
  "license": "MIT",
1365
  "engines": {
1366
  "node": ">=8"
 
1373
  "version": "2.0.2",
1374
  "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
1375
  "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
1376
+ "dev": true,
1377
  "license": "MIT",
1378
  "dependencies": {
1379
  "balanced-match": "^1.0.0"
 
1383
  "version": "3.0.3",
1384
  "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
1385
  "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
1386
+ "dev": true,
1387
  "license": "MIT",
1388
  "dependencies": {
1389
  "fill-range": "^7.1.1"
 
1442
  "version": "2.0.1",
1443
  "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
1444
  "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
1445
+ "dev": true,
1446
  "license": "MIT",
1447
  "engines": {
1448
  "node": ">= 6"
 
1473
  "version": "3.6.0",
1474
  "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
1475
  "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
1476
+ "dev": true,
1477
  "license": "MIT",
1478
  "dependencies": {
1479
  "anymatch": "~3.1.2",
 
1498
  "version": "5.1.2",
1499
  "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1500
  "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1501
+ "dev": true,
1502
  "license": "ISC",
1503
  "dependencies": {
1504
  "is-glob": "^4.0.1"
 
1511
  "version": "2.0.1",
1512
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1513
  "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1514
+ "dev": true,
1515
  "license": "MIT",
1516
  "dependencies": {
1517
  "color-name": "~1.1.4"
 
1524
  "version": "1.1.4",
1525
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1526
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1527
+ "dev": true,
1528
  "license": "MIT"
1529
  },
1530
  "node_modules/combined-stream": {
 
1543
  "version": "4.1.1",
1544
  "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
1545
  "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
1546
+ "dev": true,
1547
  "license": "MIT",
1548
  "engines": {
1549
  "node": ">= 6"
 
1560
  "version": "7.0.6",
1561
  "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
1562
  "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
1563
+ "dev": true,
1564
  "license": "MIT",
1565
  "dependencies": {
1566
  "path-key": "^3.1.0",
 
1575
  "version": "3.0.0",
1576
  "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
1577
  "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
1578
+ "dev": true,
1579
  "license": "MIT",
1580
  "bin": {
1581
  "cssesc": "bin/cssesc"
 
1622
  "version": "1.2.2",
1623
  "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
1624
  "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
1625
+ "dev": true,
1626
  "license": "Apache-2.0"
1627
  },
1628
  "node_modules/dlv": {
1629
  "version": "1.1.3",
1630
  "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
1631
  "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
1632
+ "dev": true,
1633
  "license": "MIT"
1634
  },
1635
  "node_modules/dunder-proto": {
 
1650
  "version": "0.2.0",
1651
  "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
1652
  "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
1653
+ "dev": true,
1654
  "license": "MIT"
1655
  },
1656
  "node_modules/electron-to-chromium": {
 
1664
  "version": "9.2.2",
1665
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
1666
  "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
1667
+ "dev": true,
1668
  "license": "MIT"
1669
  },
1670
  "node_modules/es-define-property": {
 
1713
  }
1714
  },
1715
  "node_modules/esbuild": {
1716
+ "version": "0.21.5",
1717
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
1718
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
1719
  "dev": true,
1720
  "hasInstallScript": true,
1721
  "license": "MIT",
 
1726
  "node": ">=12"
1727
  },
1728
  "optionalDependencies": {
1729
+ "@esbuild/aix-ppc64": "0.21.5",
1730
+ "@esbuild/android-arm": "0.21.5",
1731
+ "@esbuild/android-arm64": "0.21.5",
1732
+ "@esbuild/android-x64": "0.21.5",
1733
+ "@esbuild/darwin-arm64": "0.21.5",
1734
+ "@esbuild/darwin-x64": "0.21.5",
1735
+ "@esbuild/freebsd-arm64": "0.21.5",
1736
+ "@esbuild/freebsd-x64": "0.21.5",
1737
+ "@esbuild/linux-arm": "0.21.5",
1738
+ "@esbuild/linux-arm64": "0.21.5",
1739
+ "@esbuild/linux-ia32": "0.21.5",
1740
+ "@esbuild/linux-loong64": "0.21.5",
1741
+ "@esbuild/linux-mips64el": "0.21.5",
1742
+ "@esbuild/linux-ppc64": "0.21.5",
1743
+ "@esbuild/linux-riscv64": "0.21.5",
1744
+ "@esbuild/linux-s390x": "0.21.5",
1745
+ "@esbuild/linux-x64": "0.21.5",
1746
+ "@esbuild/netbsd-x64": "0.21.5",
1747
+ "@esbuild/openbsd-x64": "0.21.5",
1748
+ "@esbuild/sunos-x64": "0.21.5",
1749
+ "@esbuild/win32-arm64": "0.21.5",
1750
+ "@esbuild/win32-ia32": "0.21.5",
1751
+ "@esbuild/win32-x64": "0.21.5"
1752
  }
1753
  },
1754
  "node_modules/escalade": {
 
1765
  "version": "3.3.3",
1766
  "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
1767
  "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
1768
+ "dev": true,
1769
  "license": "MIT",
1770
  "dependencies": {
1771
  "@nodelib/fs.stat": "^2.0.2",
 
1782
  "version": "5.1.2",
1783
  "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1784
  "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1785
+ "dev": true,
1786
  "license": "ISC",
1787
  "dependencies": {
1788
  "is-glob": "^4.0.1"
 
1795
  "version": "1.19.1",
1796
  "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
1797
  "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
1798
+ "dev": true,
1799
  "license": "ISC",
1800
  "dependencies": {
1801
  "reusify": "^1.0.4"
 
1805
  "version": "7.1.1",
1806
  "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1807
  "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
1808
+ "dev": true,
1809
  "license": "MIT",
1810
  "dependencies": {
1811
  "to-regex-range": "^5.0.1"
 
1838
  "version": "3.3.1",
1839
  "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
1840
  "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
1841
+ "dev": true,
1842
  "license": "ISC",
1843
  "dependencies": {
1844
  "cross-spawn": "^7.0.6",
 
1885
  "version": "2.3.3",
1886
  "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1887
  "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1888
+ "dev": true,
1889
  "hasInstallScript": true,
1890
  "license": "MIT",
1891
  "optional": true,
 
1956
  "version": "10.4.5",
1957
  "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
1958
  "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
1959
+ "dev": true,
1960
  "license": "ISC",
1961
  "dependencies": {
1962
  "foreground-child": "^3.1.0",
 
1977
  "version": "6.0.2",
1978
  "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1979
  "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1980
+ "dev": true,
1981
  "license": "ISC",
1982
  "dependencies": {
1983
  "is-glob": "^4.0.3"
 
2041
  "version": "2.1.0",
2042
  "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
2043
  "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
2044
+ "dev": true,
2045
  "license": "MIT",
2046
  "dependencies": {
2047
  "binary-extensions": "^2.0.0"
 
2054
  "version": "2.16.1",
2055
  "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
2056
  "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
2057
+ "dev": true,
2058
  "license": "MIT",
2059
  "dependencies": {
2060
  "hasown": "^2.0.2"
 
2070
  "version": "2.1.1",
2071
  "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
2072
  "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
2073
+ "dev": true,
2074
  "license": "MIT",
2075
  "engines": {
2076
  "node": ">=0.10.0"
 
2080
  "version": "3.0.0",
2081
  "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
2082
  "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
2083
+ "dev": true,
2084
  "license": "MIT",
2085
  "engines": {
2086
  "node": ">=8"
 
2090
  "version": "4.0.3",
2091
  "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
2092
  "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
2093
+ "dev": true,
2094
  "license": "MIT",
2095
  "dependencies": {
2096
  "is-extglob": "^2.1.1"
 
2103
  "version": "7.0.0",
2104
  "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
2105
  "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
2106
+ "dev": true,
2107
  "license": "MIT",
2108
  "engines": {
2109
  "node": ">=0.12.0"
 
2113
  "version": "2.0.0",
2114
  "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2115
  "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
2116
+ "dev": true,
2117
  "license": "ISC"
2118
  },
2119
  "node_modules/jackspeak": {
2120
  "version": "3.4.3",
2121
  "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
2122
  "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
2123
+ "dev": true,
2124
  "license": "BlueOak-1.0.0",
2125
  "dependencies": {
2126
  "@isaacs/cliui": "^8.0.2"
 
2136
  "version": "1.21.7",
2137
  "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
2138
  "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
2139
+ "dev": true,
2140
  "license": "MIT",
2141
  "bin": {
2142
  "jiti": "bin/jiti.js"
 
2178
  "version": "3.1.3",
2179
  "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
2180
  "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
2181
+ "dev": true,
2182
  "license": "MIT",
2183
  "engines": {
2184
  "node": ">=14"
 
2191
  "version": "1.2.4",
2192
  "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
2193
  "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
2194
+ "dev": true,
2195
  "license": "MIT"
2196
  },
2197
  "node_modules/loose-envify": {
 
2229
  "version": "1.4.1",
2230
  "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
2231
  "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
2232
+ "dev": true,
2233
  "license": "MIT",
2234
  "engines": {
2235
  "node": ">= 8"
 
2239
  "version": "4.0.8",
2240
  "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
2241
  "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
2242
+ "dev": true,
2243
  "license": "MIT",
2244
  "dependencies": {
2245
  "braces": "^3.0.3",
 
2274
  "version": "9.0.5",
2275
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
2276
  "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
2277
+ "dev": true,
2278
  "license": "ISC",
2279
  "dependencies": {
2280
  "brace-expansion": "^2.0.1"
 
2290
  "version": "7.1.2",
2291
  "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
2292
  "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
2293
+ "dev": true,
2294
  "license": "ISC",
2295
  "engines": {
2296
  "node": ">=16 || 14 >=14.17"
 
2307
  "version": "2.7.0",
2308
  "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
2309
  "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
2310
+ "dev": true,
2311
  "license": "MIT",
2312
  "dependencies": {
2313
  "any-promise": "^1.0.0",
 
2319
  "version": "3.3.11",
2320
  "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
2321
  "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
2322
+ "dev": true,
2323
  "funding": [
2324
  {
2325
  "type": "github",
 
2345
  "version": "3.0.0",
2346
  "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
2347
  "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
2348
+ "dev": true,
2349
  "license": "MIT",
2350
  "engines": {
2351
  "node": ">=0.10.0"
 
2365
  "version": "4.1.1",
2366
  "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2367
  "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
2368
+ "dev": true,
2369
  "license": "MIT",
2370
  "engines": {
2371
  "node": ">=0.10.0"
 
2375
  "version": "3.0.0",
2376
  "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
2377
  "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
2378
+ "dev": true,
2379
  "license": "MIT",
2380
  "engines": {
2381
  "node": ">= 6"
 
2385
  "version": "1.0.1",
2386
  "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
2387
  "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
2388
+ "dev": true,
2389
  "license": "BlueOak-1.0.0"
2390
  },
2391
+ "node_modules/papaparse": {
2392
+ "version": "5.5.3",
2393
+ "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz",
2394
+ "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==",
2395
+ "license": "MIT"
2396
+ },
2397
  "node_modules/path-key": {
2398
  "version": "3.1.1",
2399
  "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2400
  "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2401
+ "dev": true,
2402
  "license": "MIT",
2403
  "engines": {
2404
  "node": ">=8"
 
2408
  "version": "1.0.7",
2409
  "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
2410
  "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
2411
+ "dev": true,
2412
  "license": "MIT"
2413
  },
2414
  "node_modules/path-scurry": {
2415
  "version": "1.11.1",
2416
  "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
2417
  "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
2418
+ "dev": true,
2419
  "license": "BlueOak-1.0.0",
2420
  "dependencies": {
2421
  "lru-cache": "^10.2.0",
 
2432
  "version": "10.4.3",
2433
  "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
2434
  "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
2435
+ "dev": true,
2436
  "license": "ISC"
2437
  },
2438
  "node_modules/picocolors": {
2439
  "version": "1.1.1",
2440
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
2441
  "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
2442
+ "dev": true,
2443
  "license": "ISC"
2444
  },
2445
  "node_modules/picomatch": {
2446
  "version": "2.3.1",
2447
  "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2448
  "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
2449
+ "dev": true,
2450
  "license": "MIT",
2451
  "engines": {
2452
  "node": ">=8.6"
 
2459
  "version": "2.3.0",
2460
  "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2461
  "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
2462
+ "dev": true,
2463
  "license": "MIT",
2464
  "engines": {
2465
  "node": ">=0.10.0"
 
2469
  "version": "4.0.7",
2470
  "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
2471
  "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
2472
+ "dev": true,
2473
  "license": "MIT",
2474
  "engines": {
2475
  "node": ">= 6"
 
2479
  "version": "8.5.6",
2480
  "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
2481
  "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
2482
+ "dev": true,
2483
  "funding": [
2484
  {
2485
  "type": "opencollective",
 
2508
  "version": "15.1.0",
2509
  "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
2510
  "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
2511
+ "dev": true,
2512
  "license": "MIT",
2513
  "dependencies": {
2514
  "postcss-value-parser": "^4.0.0",
 
2526
  "version": "4.0.1",
2527
  "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
2528
  "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
2529
+ "dev": true,
2530
  "license": "MIT",
2531
  "dependencies": {
2532
  "camelcase-css": "^2.0.1"
 
2546
  "version": "4.0.2",
2547
  "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
2548
  "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
2549
+ "dev": true,
2550
  "funding": [
2551
  {
2552
  "type": "opencollective",
 
2582
  "version": "6.2.0",
2583
  "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
2584
  "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
2585
+ "dev": true,
2586
  "funding": [
2587
  {
2588
  "type": "opencollective",
 
2608
  "version": "6.1.2",
2609
  "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
2610
  "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
2611
+ "dev": true,
2612
  "license": "MIT",
2613
  "dependencies": {
2614
  "cssesc": "^3.0.0",
 
2622
  "version": "4.2.0",
2623
  "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
2624
  "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
2625
+ "dev": true,
2626
  "license": "MIT"
2627
  },
2628
  "node_modules/proxy-from-env": {
 
2635
  "version": "1.2.3",
2636
  "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
2637
  "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
2638
+ "dev": true,
2639
  "funding": [
2640
  {
2641
  "type": "github",
 
2691
  "version": "1.0.0",
2692
  "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
2693
  "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
2694
+ "dev": true,
2695
  "license": "MIT",
2696
  "dependencies": {
2697
  "pify": "^2.3.0"
 
2701
  "version": "3.6.0",
2702
  "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
2703
  "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
2704
+ "dev": true,
2705
  "license": "MIT",
2706
  "dependencies": {
2707
  "picomatch": "^2.2.1"
 
2714
  "version": "1.22.10",
2715
  "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
2716
  "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
2717
+ "dev": true,
2718
  "license": "MIT",
2719
  "dependencies": {
2720
  "is-core-module": "^2.16.0",
 
2735
  "version": "1.1.0",
2736
  "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
2737
  "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
2738
+ "dev": true,
2739
  "license": "MIT",
2740
  "engines": {
2741
  "iojs": ">=1.0.0",
 
2743
  }
2744
  },
2745
  "node_modules/rollup": {
2746
+ "version": "4.45.1",
2747
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz",
2748
+ "integrity": "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==",
2749
  "dev": true,
2750
  "license": "MIT",
2751
+ "dependencies": {
2752
+ "@types/estree": "1.0.8"
2753
+ },
2754
  "bin": {
2755
  "rollup": "dist/bin/rollup"
2756
  },
2757
  "engines": {
2758
+ "node": ">=18.0.0",
2759
  "npm": ">=8.0.0"
2760
  },
2761
  "optionalDependencies": {
2762
+ "@rollup/rollup-android-arm-eabi": "4.45.1",
2763
+ "@rollup/rollup-android-arm64": "4.45.1",
2764
+ "@rollup/rollup-darwin-arm64": "4.45.1",
2765
+ "@rollup/rollup-darwin-x64": "4.45.1",
2766
+ "@rollup/rollup-freebsd-arm64": "4.45.1",
2767
+ "@rollup/rollup-freebsd-x64": "4.45.1",
2768
+ "@rollup/rollup-linux-arm-gnueabihf": "4.45.1",
2769
+ "@rollup/rollup-linux-arm-musleabihf": "4.45.1",
2770
+ "@rollup/rollup-linux-arm64-gnu": "4.45.1",
2771
+ "@rollup/rollup-linux-arm64-musl": "4.45.1",
2772
+ "@rollup/rollup-linux-loongarch64-gnu": "4.45.1",
2773
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1",
2774
+ "@rollup/rollup-linux-riscv64-gnu": "4.45.1",
2775
+ "@rollup/rollup-linux-riscv64-musl": "4.45.1",
2776
+ "@rollup/rollup-linux-s390x-gnu": "4.45.1",
2777
+ "@rollup/rollup-linux-x64-gnu": "4.45.1",
2778
+ "@rollup/rollup-linux-x64-musl": "4.45.1",
2779
+ "@rollup/rollup-win32-arm64-msvc": "4.45.1",
2780
+ "@rollup/rollup-win32-ia32-msvc": "4.45.1",
2781
+ "@rollup/rollup-win32-x64-msvc": "4.45.1",
2782
  "fsevents": "~2.3.2"
2783
  }
2784
  },
 
2786
  "version": "1.2.0",
2787
  "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2788
  "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2789
+ "dev": true,
2790
  "funding": [
2791
  {
2792
  "type": "github",
 
2829
  "version": "2.0.0",
2830
  "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2831
  "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2832
+ "dev": true,
2833
  "license": "MIT",
2834
  "dependencies": {
2835
  "shebang-regex": "^3.0.0"
 
2842
  "version": "3.0.0",
2843
  "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2844
  "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2845
+ "dev": true,
2846
  "license": "MIT",
2847
  "engines": {
2848
  "node": ">=8"
 
2852
  "version": "4.1.0",
2853
  "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
2854
  "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
2855
+ "dev": true,
2856
  "license": "ISC",
2857
  "engines": {
2858
  "node": ">=14"
 
2865
  "version": "1.2.1",
2866
  "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
2867
  "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
2868
+ "dev": true,
2869
  "license": "BSD-3-Clause",
2870
  "engines": {
2871
  "node": ">=0.10.0"
 
2875
  "version": "5.1.2",
2876
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
2877
  "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
2878
+ "dev": true,
2879
  "license": "MIT",
2880
  "dependencies": {
2881
  "eastasianwidth": "^0.2.0",
 
2894
  "version": "4.2.3",
2895
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2896
  "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2897
+ "dev": true,
2898
  "license": "MIT",
2899
  "dependencies": {
2900
  "emoji-regex": "^8.0.0",
 
2909
  "version": "5.0.1",
2910
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2911
  "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2912
+ "dev": true,
2913
  "license": "MIT",
2914
  "engines": {
2915
  "node": ">=8"
 
2919
  "version": "8.0.0",
2920
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2921
  "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2922
+ "dev": true,
2923
  "license": "MIT"
2924
  },
2925
  "node_modules/string-width-cjs/node_modules/strip-ansi": {
2926
  "version": "6.0.1",
2927
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2928
  "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2929
+ "dev": true,
2930
  "license": "MIT",
2931
  "dependencies": {
2932
  "ansi-regex": "^5.0.1"
 
2939
  "version": "7.1.0",
2940
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
2941
  "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
2942
+ "dev": true,
2943
  "license": "MIT",
2944
  "dependencies": {
2945
  "ansi-regex": "^6.0.1"
 
2956
  "version": "6.0.1",
2957
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2958
  "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2959
+ "dev": true,
2960
  "license": "MIT",
2961
  "dependencies": {
2962
  "ansi-regex": "^5.0.1"
 
2969
  "version": "5.0.1",
2970
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2971
  "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2972
+ "dev": true,
2973
  "license": "MIT",
2974
  "engines": {
2975
  "node": ">=8"
 
2979
  "version": "3.35.0",
2980
  "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
2981
  "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
2982
+ "dev": true,
2983
  "license": "MIT",
2984
  "dependencies": {
2985
  "@jridgewell/gen-mapping": "^0.3.2",
 
3002
  "version": "1.0.0",
3003
  "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
3004
  "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
3005
+ "dev": true,
3006
  "license": "MIT",
3007
  "engines": {
3008
  "node": ">= 0.4"
 
3015
  "version": "3.4.17",
3016
  "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
3017
  "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
3018
+ "dev": true,
3019
  "license": "MIT",
3020
  "dependencies": {
3021
  "@alloc/quick-lru": "^5.2.0",
 
3053
  "version": "3.3.1",
3054
  "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
3055
  "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
3056
+ "dev": true,
3057
  "license": "MIT",
3058
  "dependencies": {
3059
  "any-promise": "^1.0.0"
 
3063
  "version": "1.6.0",
3064
  "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
3065
  "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
3066
+ "dev": true,
3067
  "license": "MIT",
3068
  "dependencies": {
3069
  "thenify": ">= 3.1.0 < 4"
 
3076
  "version": "5.0.1",
3077
  "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
3078
  "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
3079
+ "dev": true,
3080
  "license": "MIT",
3081
  "dependencies": {
3082
  "is-number": "^7.0.0"
 
3089
  "version": "0.1.13",
3090
  "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
3091
  "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
3092
+ "dev": true,
3093
  "license": "Apache-2.0"
3094
  },
3095
  "node_modules/typescript": {
 
3106
  "node": ">=14.17"
3107
  }
3108
  },
3109
+ "node_modules/undici-types": {
3110
+ "version": "7.8.0",
3111
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
3112
+ "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
3113
+ "dev": true,
3114
+ "license": "MIT"
3115
+ },
3116
  "node_modules/update-browserslist-db": {
3117
  "version": "1.1.3",
3118
  "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
 
3148
  "version": "1.0.2",
3149
  "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
3150
  "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
3151
+ "dev": true,
3152
  "license": "MIT"
3153
  },
3154
  "node_modules/vite": {
3155
+ "version": "5.4.19",
3156
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz",
3157
+ "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==",
3158
  "dev": true,
3159
  "license": "MIT",
3160
  "dependencies": {
3161
+ "esbuild": "^0.21.3",
3162
+ "postcss": "^8.4.43",
3163
+ "rollup": "^4.20.0"
3164
  },
3165
  "bin": {
3166
  "vite": "bin/vite.js"
3167
  },
3168
  "engines": {
3169
+ "node": "^18.0.0 || >=20.0.0"
3170
  },
3171
  "funding": {
3172
  "url": "https://github.com/vitejs/vite?sponsor=1"
3173
  },
3174
  "optionalDependencies": {
3175
+ "fsevents": "~2.3.3"
3176
  },
3177
  "peerDependencies": {
3178
+ "@types/node": "^18.0.0 || >=20.0.0",
3179
  "less": "*",
3180
  "lightningcss": "^1.21.0",
3181
  "sass": "*",
3182
+ "sass-embedded": "*",
3183
  "stylus": "*",
3184
  "sugarss": "*",
3185
  "terser": "^5.4.0"
 
3197
  "sass": {
3198
  "optional": true
3199
  },
3200
+ "sass-embedded": {
3201
+ "optional": true
3202
+ },
3203
  "stylus": {
3204
  "optional": true
3205
  },
 
3215
  "version": "2.0.2",
3216
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
3217
  "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
3218
+ "dev": true,
3219
  "license": "ISC",
3220
  "dependencies": {
3221
  "isexe": "^2.0.0"
 
3231
  "version": "8.1.0",
3232
  "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
3233
  "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
3234
+ "dev": true,
3235
  "license": "MIT",
3236
  "dependencies": {
3237
  "ansi-styles": "^6.1.0",
 
3250
  "version": "7.0.0",
3251
  "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
3252
  "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
3253
+ "dev": true,
3254
  "license": "MIT",
3255
  "dependencies": {
3256
  "ansi-styles": "^4.0.0",
 
3268
  "version": "5.0.1",
3269
  "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
3270
  "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
3271
+ "dev": true,
3272
  "license": "MIT",
3273
  "engines": {
3274
  "node": ">=8"
 
3278
  "version": "4.3.0",
3279
  "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
3280
  "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
3281
+ "dev": true,
3282
  "license": "MIT",
3283
  "dependencies": {
3284
  "color-convert": "^2.0.1"
 
3294
  "version": "8.0.0",
3295
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
3296
  "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
3297
+ "dev": true,
3298
  "license": "MIT"
3299
  },
3300
  "node_modules/wrap-ansi-cjs/node_modules/string-width": {
3301
  "version": "4.2.3",
3302
  "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
3303
  "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
3304
+ "dev": true,
3305
  "license": "MIT",
3306
  "dependencies": {
3307
  "emoji-regex": "^8.0.0",
 
3316
  "version": "6.0.1",
3317
  "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
3318
  "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
3319
+ "dev": true,
3320
  "license": "MIT",
3321
  "dependencies": {
3322
  "ansi-regex": "^5.0.1"
 
3336
  "version": "2.8.0",
3337
  "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
3338
  "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==",
3339
+ "dev": true,
3340
  "license": "ISC",
3341
  "bin": {
3342
  "yaml": "bin.mjs"
 
3344
  "engines": {
3345
  "node": ">= 14.6"
3346
  }
3347
+ },
3348
+ "node_modules/zod": {
3349
+ "version": "3.25.76",
3350
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
3351
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
3352
+ "license": "MIT",
3353
+ "funding": {
3354
+ "url": "https://github.com/sponsors/colinhacks"
3355
+ }
3356
  }
3357
  }
3358
  }
frontend/package.json CHANGED
@@ -3,10 +3,11 @@
3
  "version": "1.0.0",
4
  "private": true,
5
  "dependencies": {
6
- "react": "^18.2.0",
7
- "react-dom": "^18.2.0",
8
- "axios": "^1.6.0",
9
- "tailwindcss": "^3.3.5"
 
10
  },
11
  "scripts": {
12
  "dev": "vite",
@@ -14,12 +15,14 @@
14
  "preview": "vite preview"
15
  },
16
  "devDependencies": {
17
- "@types/react": "^18.2.0",
18
- "@types/react-dom": "^18.2.0",
19
- "@vitejs/plugin-react": "^4.0.0",
20
- "typescript": "^5.0.0",
21
- "vite": "^4.3.0",
22
  "autoprefixer": "^10.4.19",
23
- "postcss": "^8.4.38"
 
 
 
 
24
  }
25
  }
 
3
  "version": "1.0.0",
4
  "private": true,
5
  "dependencies": {
6
+ "papaparse": "^5.4.1",
7
+ "react": "^18.3.1",
8
+ "react-dom": "^18.3.1",
9
+ "zod": "^3.23.8",
10
+ "axios": "^1.7.2"
11
  },
12
  "scripts": {
13
  "dev": "vite",
 
15
  "preview": "vite preview"
16
  },
17
  "devDependencies": {
18
+ "@types/papaparse": "^5.3.14",
19
+ "@types/react": "^18.3.3",
20
+ "@types/react-dom": "^18.3.0",
 
 
21
  "autoprefixer": "^10.4.19",
22
+ "postcss": "^8.4.38",
23
+ "tailwindcss": "^3.4.4",
24
+ "typescript": "^5.4.5",
25
+ "vite": "^5.3.1",
26
+ "@vitejs/plugin-react": "^4.3.1"
27
  }
28
  }
frontend/src/App.tsx CHANGED
@@ -1,142 +1,79 @@
1
- import React, { useState, useEffect } from 'react';
2
- import axios from 'axios';
 
 
 
 
 
 
 
3
 
4
- interface Patient {
5
- patient_id: string;
6
- age: number;
7
- gender: string;
8
- location: string;
9
- diagnosis: string;
10
- comorbidities: string;
11
- medications: string;
12
- stay_days: number;
13
- readmitted: boolean;
14
- }
15
-
16
- interface Analysis {
17
- patient_id: string;
18
- risk_label: string;
19
- risk_score: number;
20
- contributing_factors: string[];
21
- recommendations: string[];
22
- }
23
 
24
  const App: React.FC = () => {
25
- const [patients, setPatients] = useState<Patient[]>([]);
26
- const [analyses, setAnalyses] = useState<Analysis[]>([]);
27
- const [loading, setLoading] = useState(false);
28
- const [error, setError] = useState<string | null>(null);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
 
 
 
 
30
  useEffect(() => {
31
- // Load sample patient data
32
- setPatients([
33
- { patient_id: "P016", age: 29, gender: "Male", location: "Mayo Clinic, Rochester", diagnosis: "Uncomplicated Appendectomy", comorbidities: "None", medications: "None", stay_days: 2, readmitted: false },
34
- { patient_id: "P017", age: 48, gender: "Female", location: "Mayo Clinic, Rochester", diagnosis: "Post-surgical Infection", comorbidities: "Non-adherence to post-op instructions", medications: "None", stay_days: 5, readmitted: true },
35
- { patient_id: "P015", age: 86, gender: "Male", location: "Mayo Clinic, Rochester", diagnosis: "Fall with hip fracture", comorbidities: "None", medications: "None", stay_days: 10, readmitted: true },
36
- { patient_id: "P010", age: 56, gender: "Female", location: "Mayo Clinic, Rochester", diagnosis: "Hip Replacement", comorbidities: "Multiple comorbidities (2)", medications: "None", stay_days: 7, readmitted: false },
37
- ]);
38
  }, []);
39
 
40
- const analyzePatients = async () => {
41
- setLoading(true);
42
- setError(null);
43
- try {
44
- const response = await axios.post('/api/analyze', { patients });
45
- setAnalyses(response.data);
46
- } catch (err) {
47
- if (axios.isAxiosError(err) && err.response) {
48
- setError(`Analysis failed: ${err.response.data.detail || 'An unknown error occurred.'}`);
49
- } else {
50
- setError('An unexpected error occurred. Please check the network connection.');
51
- }
52
- console.error('Error analyzing patients:', err);
53
- } finally {
54
- setLoading(false);
55
- }
56
  };
57
 
58
  return (
59
- <div className="min-h-screen bg-gradient-to-br from-blue-900 to-black text-white p-6 font-sans">
60
- <header>
61
- <h1 className="text-4xl font-bold">Prevently.ai</h1>
62
- <p className="text-lg text-blue-300">AI-Powered Hospital Readmission Risk Predictor</p>
63
- </header>
64
-
65
- <div className="mt-4 p-4 border border-blue-500 rounded flex items-center bg-blue-900 bg-opacity-30">
66
- <span className="text-xl mr-3">ⓘ</span>
67
- <p className="text-sm">
68
- This application is for demonstration purposes only and is not for clinical use. All analysis is performed by a generative AI and has not been validated.
69
- </p>
70
- </div>
71
-
72
- {error && (
73
- <div className="mt-4 p-4 border border-red-500 rounded flex items-center bg-red-900 bg-opacity-50">
74
- <span className="text-xl mr-3">⚠️</span>
75
- <p className="text-sm">{error}</p>
76
- </div>
77
- )}
78
-
79
- <div className="mt-6 grid grid-cols-1 lg:grid-cols-2 gap-6">
80
- <div className="bg-black bg-opacity-30 p-6 rounded-lg">
81
- <h2 className="text-2xl font-bold">PATIENT DATA INPUT</h2>
82
- <p className="text-sm mt-2 text-blue-400">Now viewing sample data from: Mayo Clinic, Rochester</p>
83
- <div className="mt-4 max-h-96 overflow-y-auto bg-black bg-opacity-50 p-4 rounded">
84
- {patients.map((patient) => (
85
- <div key={patient.patient_id} className="text-sm mb-3">
86
- <strong className="text-blue-300">{patient.patient_id}</strong>: {patient.age}y {patient.gender}, {patient.diagnosis}, {patient.comorbidities}.
87
- </div>
88
- ))}
89
- </div>
90
- <button
91
- onClick={analyzePatients}
92
- disabled={loading}
93
- className="mt-4 w-full border-2 border-white py-2 px-4 rounded uppercase font-bold hover:bg-white hover:text-blue-900 transition disabled:bg-gray-500 disabled:cursor-not-allowed"
94
- >
95
- {loading ? 'Analyzing...' : 'Analyze Patients'}
96
- </button>
97
- </div>
98
-
99
- <div className="bg-black bg-opacity-30 p-6 rounded-lg">
100
- <h2 className="text-2xl font-bold">ANALYSIS REPORTS</h2>
101
- <div className="mt-4 space-y-4 max-h-[30rem] overflow-y-auto">
102
- {analyses.length === 0 && !loading && (
103
- <div className="text-center text-gray-400 py-10">
104
- Click 'Analyze Patients' to see risk reports.
105
- </div>
106
- )}
107
- {analyses.map((analysis) => (
108
- <div key={analysis.patient_id} className="bg-black bg-opacity-50 p-4 rounded">
109
- <div className="flex justify-between items-start">
110
- <h3 className="text-lg font-bold text-blue-300">{analysis.patient_id}</h3>
111
- <span className={`py-1 px-3 rounded text-xs font-bold ${
112
- analysis.risk_label === 'HIGH RISK' ? 'bg-red-600' :
113
- analysis.risk_label === 'MEDIUM RISK' ? 'bg-yellow-600' :
114
- analysis.risk_label === 'LOW RISK' ? 'bg-green-600' :
115
- 'bg-gray-600'
116
- }`}>
117
- {analysis.risk_label}
118
- </span>
119
- </div>
120
- <div className="mt-2">
121
- <p className="text-xs uppercase">Confidence Score</p>
122
- <div className="bg-gray-700 h-2 rounded mt-1">
123
- <div className="bg-cyan-500 h-2 rounded" style={{ width: `${analysis.risk_score}%` }}></div>
124
- </div>
125
- <p className="text-sm text-right font-bold">{analysis.risk_score}%</p>
126
- </div>
127
- <h4 className="mt-2 text-sm font-bold">Contributing Factors</h4>
128
- <ul className="list-disc pl-5 text-sm opacity-90">
129
- {analysis.contributing_factors.map((factor, idx) => <li key={idx}>{factor}</li>)}
130
- </ul>
131
- <h4 className="mt-2 text-sm font-bold">Preventive Recommendations</h4>
132
- <ul className="list-disc pl-5 text-sm opacity-90">
133
- {analysis.recommendations.map((rec, idx) => <li key={idx}>{rec}</li>)}
134
- </ul>
135
- </div>
136
- ))}
137
- </div>
138
  </div>
139
- </div>
 
 
 
140
  </div>
141
  );
142
  };
 
1
+ import React, { useState, useEffect, useCallback } from 'react';
2
+ import Papa from 'papaparse';
3
+ import { InputPanel } from './components/InputPanel';
4
+ import { ResultsPanel } from './components/ResultsPanel';
5
+ import { Header } from './components/Header';
6
+ import { Disclaimer } from './components/Disclaimer';
7
+ import { usePatientAnalysis } from './hooks/usePatientAnalysis';
8
+ import { ALL_PATIENTS, HOSPITALS } from './constants';
9
+ import { runInference } from './api/aiApi';
10
 
11
+ const shuffleArray = <T,>(array: T[]): T[] => {
12
+ const newArr = [...array];
13
+ for (let i = newArr.length - 1; i > 0; i--) {
14
+ const j = Math.floor(Math.random() * (i + 1));
15
+ [newArr[i], newArr[j]] = [newArr[j], newArr[i]];
16
+ }
17
+ return newArr;
18
+ };
 
 
 
 
 
 
 
 
 
 
 
19
 
20
  const App: React.FC = () => {
21
+ const [csvData, setCsvData] = useState<string>('');
22
+ const [currentHospital, setCurrentHospital] = useState<string>(HOSPITALS[0]);
23
+ const {
24
+ analysisResults,
25
+ isAnalyzing,
26
+ errors,
27
+ runAnalysis,
28
+ } = usePatientAnalysis(runInference);
29
+
30
+ const prepareNewBatch = useCallback(() => {
31
+ const availableHospitals = HOSPITALS.filter(h => h !== currentHospital);
32
+ const newHospital = availableHospitals[Math.floor(Math.random() * availableHospitals.length)] || HOSPITALS[0];
33
+
34
+ const newBatch = shuffleArray(ALL_PATIENTS).slice(0, 4 + Math.floor(Math.random() * 4));
35
+
36
+ const newCsvData = Papa.unparse(
37
+ newBatch.map(p => ({...p, hospital: newHospital})),
38
+ { header: true, skipEmptyLines: true }
39
+ );
40
 
41
+ setCsvData(newCsvData);
42
+ setCurrentHospital(newHospital);
43
+ }, [currentHospital]);
44
+
45
  useEffect(() => {
46
+ prepareNewBatch();
 
 
 
 
 
 
47
  }, []);
48
 
49
+ const handleAnalyze = () => {
50
+ runAnalysis(csvData);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  };
52
 
53
  return (
54
+ <div className="min-h-screen font-sans text-slate-100">
55
+ <Header />
56
+ <main className="container mx-auto p-4 md:p-8">
57
+ <Disclaimer />
58
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-8 mt-8">
59
+ <InputPanel
60
+ csvData={csvData}
61
+ setCsvData={setCsvData}
62
+ onAnalyze={handleAnalyze}
63
+ isAnalyzing={isAnalyzing}
64
+ hospitalName={currentHospital}
65
+ onShuffle={prepareNewBatch}
66
+ />
67
+ <ResultsPanel
68
+ results={analysisResults}
69
+ errors={errors}
70
+ isAnalyzing={isAnalyzing}
71
+ />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  </div>
73
+ </main>
74
+ <footer className="text-center p-4 text-slate-400 text-sm">
75
+ <p>Demonstration UI connecting to a live Gemini 1.5 Flash model via a FastAPI backend.</p>
76
+ </footer>
77
  </div>
78
  );
79
  };
frontend/src/api/aiApi.ts ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import axios from 'axios';
2
+ import type { Patient, BackendAnalysisResult } from '../types';
3
+
4
+ export const runInference = async (patients: Patient[]): Promise<BackendAnalysisResult[]> => {
5
+ console.log("Sending", patients.length, "patients to the backend for analysis...");
6
+
7
+ try {
8
+ const response = await axios.post('/api/analyze', { patients });
9
+ console.log("Received analysis from backend:", response.data);
10
+ return response.data;
11
+ } catch (error) {
12
+ console.error("Error calling backend API:", error);
13
+ if (axios.isAxiosError(error) && error.response) {
14
+ // If the backend provides a structured error, re-throw it
15
+ throw new Error(`API Error: ${error.response.data.detail || error.message}`);
16
+ }
17
+ // Otherwise, throw a generic network error
18
+ throw new Error('Failed to communicate with the analysis server.');
19
+ }
20
+ };
frontend/src/components/Disclaimer.tsx ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+
3
+ export const Disclaimer: React.FC = () => {
4
+ return (
5
+ <div className="bg-cyan-500/10 border-l-4 border-cyan-400 p-4 rounded-r-lg backdrop-blur-sm">
6
+ <div className="flex">
7
+ <div className="py-1">
8
+ <svg className="h-6 w-6 text-cyan-300 mr-4 shrink-0" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
9
+ <path strokeLinecap="round" strokeLinejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
10
+ </svg>
11
+ </div>
12
+ <div>
13
+ <h3 className="font-bold text-cyan-200">Live AI Demonstration</h3>
14
+ <p className="text-sm text-cyan-200/80 mt-1">
15
+ This application connects to a <strong>live Google Gemini 1.5 Flash model</strong> via a Python FastAPI backend.
16
+ </p>
17
+ <p className="text-sm text-cyan-200/80 mt-2">
18
+ The patient data is a randomized, de-identified sample. This application is for demonstration purposes and is <strong>not for clinical use.</strong>
19
+ </p>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ );
24
+ };
frontend/src/components/Header.tsx ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+
3
+ export const Header: React.FC = () => {
4
+ return (
5
+ <header className="sticky top-0 z-10 bg-black/10 backdrop-blur-lg border-b border-white/10 shadow-lg">
6
+ <div className="container mx-auto px-4 py-5 md:px-8">
7
+ <h1 className="text-3xl font-bold text-white">
8
+ Prevently<span className="text-cyan-300">.ai</span>
9
+ </h1>
10
+ <p className="mt-1 text-md text-slate-300">
11
+ AI-Powered Hospital Readmission Risk Prediction
12
+ </p>
13
+ </div>
14
+ </header>
15
+ );
16
+ };
frontend/src/components/InputPanel.tsx ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+
3
+ interface InputPanelProps {
4
+ csvData: string;
5
+ setCsvData: (data: string) => void;
6
+ onAnalyze: () => void;
7
+ isAnalyzing: boolean;
8
+ hospitalName: string;
9
+ onShuffle: () => void;
10
+ }
11
+
12
+ export const InputPanel: React.FC<InputPanelProps> = ({
13
+ csvData,
14
+ setCsvData,
15
+ onAnalyze,
16
+ isAnalyzing,
17
+ hospitalName,
18
+ onShuffle
19
+ }) => {
20
+ return (
21
+ <div className="bg-white/5 p-6 rounded-2xl shadow-2xl border border-white/10 backdrop-blur-xl">
22
+ <div className="flex justify-between items-center mb-4">
23
+ <h2 className="text-xl font-semibold text-white">Patient Data Input</h2>
24
+ <button onClick={onShuffle} disabled={isAnalyzing} className="text-sm text-cyan-300 hover:text-cyan-200 disabled:opacity-50 transition">New Batch</button>
25
+ </div>
26
+
27
+ <div className="bg-black/10 p-3 rounded-xl mb-4 border border-white/10">
28
+ <p className="text-sm text-slate-300">
29
+ Now viewing sample data from: <strong className="font-semibold text-white">{hospitalName}</strong>
30
+ </p>
31
+ </div>
32
+
33
+ <textarea
34
+ value={csvData}
35
+ onChange={(e) => setCsvData(e.target.value)}
36
+ className="w-full h-80 p-3 border border-white/20 rounded-xl shadow-inner bg-black/20 focus:ring-2 focus:ring-cyan-400 focus:border-cyan-400 transition duration-150 ease-in-out font-mono text-xs text-slate-200 placeholder:text-slate-500"
37
+ placeholder="patient_id,age,gender,..."
38
+ disabled={isAnalyzing}
39
+ />
40
+ <button
41
+ onClick={onAnalyze}
42
+ disabled={isAnalyzing || !csvData.trim()}
43
+ className="mt-4 w-full bg-white/10 border border-white/20 text-white font-bold py-3 px-4 rounded-xl hover:bg-white/20 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-slate-900 focus:ring-cyan-400 disabled:bg-white/5 disabled:text-slate-400 disabled:cursor-not-allowed transition-all duration-200 ease-in-out flex items-center justify-center backdrop-blur-sm"
44
+ >
45
+ {isAnalyzing ? (
46
+ <>
47
+ <svg className="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
48
+ <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
49
+ <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
50
+ </svg>
51
+ Analyzing...
52
+ </>
53
+ ) : (
54
+ 'Analyze Patients'
55
+ )}
56
+ </button>
57
+ </div>
58
+ );
59
+ };
frontend/src/components/ReportCard.tsx ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import type { AnalysisResult } from '../types';
3
+ import { RiskLevel } from '../types';
4
+ import { Spinner } from './Spinner';
5
+
6
+ interface ReportCardProps {
7
+ result: AnalysisResult;
8
+ }
9
+
10
+ const RiskBadge: React.FC<{ level: RiskLevel }> = ({ level }) => {
11
+ const riskStyles = {
12
+ [RiskLevel.Low]: 'bg-green-500/10 text-green-300 border-green-500/20',
13
+ [RiskLevel.Medium]: 'bg-yellow-500/10 text-yellow-300 border-yellow-500/20',
14
+ [RiskLevel.High]: 'bg-red-500/10 text-red-300 border-red-500/20',
15
+ };
16
+ return (
17
+ <span className={`px-3 py-1 text-sm font-semibold rounded-full border ${riskStyles[level]} backdrop-blur-sm`}>
18
+ {level} Risk
19
+ </span>
20
+ );
21
+ };
22
+
23
+ const Section: React.FC<{ title: string; children: React.ReactNode }> = ({ title, children }) => (
24
+ <div>
25
+ <h4 className="font-semibold text-slate-300">{title}</h4>
26
+ {children}
27
+ </div>
28
+ );
29
+
30
+ export const ReportCard: React.FC<ReportCardProps> = ({ result }) => {
31
+ const cardBaseStyle = "border rounded-xl p-4 transition-all duration-500";
32
+
33
+ const animationStyle = {
34
+ animation: `fadeIn 0.5s ease-in-out`,
35
+ animationFillMode: 'forwards',
36
+ opacity: 0,
37
+ } as React.CSSProperties;
38
+
39
+ if (result.status === 'loading') {
40
+ return (
41
+ <div className={`${cardBaseStyle} border-white/10 bg-black/10 animate-pulse flex items-center space-x-4`} style={animationStyle}>
42
+ <Spinner />
43
+ <div>
44
+ <p className="font-bold text-slate-300">Analyzing Patient {result.patient.patient_id}...</p>
45
+ <div className="h-4 bg-white/10 rounded w-48 mt-1"></div>
46
+ </div>
47
+ </div>
48
+ );
49
+ }
50
+
51
+ if (result.status === 'error') {
52
+ return (
53
+ <div className={`${cardBaseStyle} border-red-500/30 bg-red-900/40`} style={animationStyle}>
54
+ <div className="flex justify-between items-center">
55
+ <h3 className="text-lg font-bold text-red-200">Patient {result.patient.patient_id}</h3>
56
+ </div>
57
+ <p className="mt-2 text-red-300">
58
+ <strong className="font-semibold">Analysis Failed:</strong> {result.error}
59
+ </p>
60
+ </div>
61
+ );
62
+ }
63
+
64
+ const { analysis, patient } = result;
65
+
66
+ return (
67
+ <div className={`${cardBaseStyle} border-white/10 bg-black/10 hover:bg-black/20`} style={animationStyle}>
68
+ <div className="flex justify-between items-start mb-3">
69
+ <h3 className="text-lg font-bold text-white">Patient {patient.patient_id}</h3>
70
+ <RiskBadge level={analysis.risk_level} />
71
+ </div>
72
+
73
+ <div className="space-y-4">
74
+ <Section title="Confidence Score">
75
+ <div className="w-full bg-white/10 rounded-full h-2.5 my-1">
76
+ <div className="bg-cyan-400 h-2.5 rounded-full" style={{ width: `${analysis.confidence_score * 100}%` }}></div>
77
+ </div>
78
+ <p className="text-right text-sm text-slate-300 font-medium">{(analysis.confidence_score * 100).toFixed(1)}%</p>
79
+ </Section>
80
+
81
+ <Section title="Contributing Factors">
82
+ <ul className="list-disc list-inside text-slate-300 text-sm space-y-1 mt-1">
83
+ {analysis.contributing_factors.map((factor, i) => <li key={i}>{factor}</li>)}
84
+ </ul>
85
+ </Section>
86
+
87
+ <Section title="Preventive Recommendations">
88
+ <ul className="list-disc list-inside text-slate-300 text-sm space-y-1 mt-1">
89
+ {analysis.preventive_recommendations.map((rec, i) => <li key={i}>{rec}</li>)}
90
+ </ul>
91
+ </Section>
92
+
93
+ <details className="text-xs text-slate-400">
94
+ <summary className="cursor-pointer font-medium hover:text-white">Show Original Data</summary>
95
+ <div className="mt-2 p-3 bg-black/20 rounded-lg border border-white/10">
96
+ <p><strong>Hospital:</strong> {patient.hospital}</p>
97
+ <p><strong>Age:</strong> {patient.age}</p>
98
+ <p><strong>Gender:</strong> {patient.gender}</p>
99
+ <p><strong>Diagnosis:</strong> {patient.primary_diagnosis}</p>
100
+ <p><strong>Comorbidities:</strong> {patient.comorbidities}</p>
101
+ <p><strong>Medications:</strong> {patient.medications_at_discharge}</p>
102
+ <p><strong>Length of Stay:</strong> {patient.length_of_stay_days} days</p>
103
+ </div>
104
+ </details>
105
+ </div>
106
+ <style>{\`
107
+ @keyframes fadeIn {
108
+ from { opacity: 0; transform: translateY(10px); }
109
+ to { opacity: 1; transform: translateY(0); }
110
+ }
111
+ \`}</style>
112
+ </div>
113
+ );
114
+ };
frontend/src/components/ResultsPanel.tsx ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import { ReportCard } from './ReportCard';
3
+ import { Spinner } from './Spinner';
4
+ import type { AnalysisResult, AnalysisErrors } from '../types';
5
+
6
+ interface ResultsPanelProps {
7
+ results: AnalysisResult[];
8
+ errors: AnalysisErrors;
9
+ isAnalyzing: boolean;
10
+ }
11
+
12
+ const ErrorDisplay: React.FC<{title: string; errors: string[]}> = ({ title, errors }) => (
13
+ <div className="bg-red-900/40 border-l-4 border-red-500 text-red-200 p-4 mb-4 rounded-r-lg" role="alert">
14
+ <p className="font-bold">{title}</p>
15
+ <ul className="mt-2 list-disc list-inside text-sm">
16
+ {errors.map((e, i) => <li key={i}>{e}</li>)}
17
+ </ul>
18
+ </div>
19
+ );
20
+
21
+ const GettingStarted: React.FC = () => (
22
+ <div className="text-center py-16 text-slate-400">
23
+ <svg xmlns="http://www.w3.org/2000/svg" className="mx-auto h-12 w-12 text-slate-500" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth="1">
24
+ <path strokeLinecap="round" strokeLinejoin="round" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
25
+ </svg>
26
+ <h3 className="mt-4 text-lg font-semibold text-slate-200">Ready for Analysis</h3>
27
+ <p className="mt-1 text-sm text-slate-400">
28
+ Click 'Analyze Patients' to see the reports appear here.
29
+ </p>
30
+ </div>
31
+ );
32
+
33
+ export const ResultsPanel: React.FC<ResultsPanelProps> = ({ results, errors, isAnalyzing }) => {
34
+ const { parseError, validationErrors } = errors;
35
+ const hasResults = results.length > 0;
36
+ const hasValidationErrors = validationErrors.length > 0;
37
+
38
+ return (
39
+ <div className="bg-white/5 p-6 rounded-2xl shadow-2xl border border-white/10 backdrop-blur-xl min-h-[580px]">
40
+ <h2 className="text-xl font-semibold mb-4 text-white">Analysis Reports</h2>
41
+
42
+ {parseError && (
43
+ <ErrorDisplay title="Parsing Error" errors={[parseError]} />
44
+ )}
45
+
46
+ {hasValidationErrors && (
47
+ <ErrorDisplay title="Data Validation Errors" errors={validationErrors} />
48
+ )}
49
+
50
+ {isAnalyzing && !hasResults && !parseError && !hasValidationErrors && (
51
+ <div className="flex justify-center items-center py-16">
52
+ <Spinner />
53
+ <p className="ml-4 text-slate-300">Parsing & validating data...</p>
54
+ </div>
55
+ )}
56
+
57
+ {!isAnalyzing && !hasResults && !parseError && !hasValidationErrors && (
58
+ <GettingStarted />
59
+ )}
60
+
61
+ {hasResults && (
62
+ <div className="space-y-4 h-[480px] overflow-y-auto pr-2">
63
+ {results.map((result, index) => (
64
+ <ReportCard key={result.patient.patient_id || index} result={result} />
65
+ ))}
66
+ </div>
67
+ )}
68
+ </div>
69
+ );
70
+ };
frontend/src/components/Spinner.tsx ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+
3
+ export const Spinner: React.FC = () => {
4
+ return (
5
+ <svg className="animate-spin h-6 w-6 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
6
+ <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4"></circle>
7
+ <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path>
8
+ </svg>
9
+ );
10
+ };
frontend/src/constants.ts ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ export const HOSPITALS = [
2
+ "Mayo Clinic, Rochester",
3
+ "Johns Hopkins Hospital, Baltimore",
4
+ "Cleveland Clinic, Cleveland",
5
+ "Massachusetts General Hospital, Boston",
6
+ "Charité - Universitätsmedizin Berlin",
7
+ "Singapore General Hospital",
8
+ "The University of Tokyo Hospital",
9
+ "Toronto General Hospital",
10
+ "UCLA Medical Center, Los Angeles",
11
+ ];
12
+
13
+ export const ALL_PATIENTS = [
14
+ { patient_id: "P001", age: 72, gender: "Male", hospital: "Mayo Clinic, Rochester", primary_diagnosis: "Congestive Heart Failure", comorbidities: "Hypertension, Diabetes Type 2", medications_at_discharge: "Lisinopril, Metformin, Furosemide", length_of_stay_days: 8 },
15
+ { patient_id: "P002", age: 65, gender: "Female", hospital: "Johns Hopkins Hospital, Baltimore", primary_diagnosis: "COPD", comorbidities: "Asthma, Smoking History", medications_at_discharge: "Albuterol, Prednisone", length_of_stay_days: 5 },
16
+ { patient_id: "P003", age: 81, gender: "Female", hospital: "Massachusetts General Hospital, Boston", primary_diagnosis: "Pneumonia", comorbidities: "Atrial Fibrillation, Chronic Kidney Disease, Lives Alone", medications_at_discharge: "Warfarin, Amoxicillin", length_of_stay_days: 12 },
17
+ { patient_id: "P004", age: 58, gender: "Male", hospital: "Cleveland Clinic, Cleveland", primary_diagnosis: "Myocardial Infarction", comorbidities: "Hyperlipidemia, Obesity, Family history of heart disease", medications_at_discharge: "Atorvastatin, Aspirin, Metoprolol", length_of_stay_days: 6 },
18
+ { patient_id: "P005", age: 76, gender: "Female", hospital: "Charité - Universitätsmedizin Berlin", primary_diagnosis: "Stroke", comorbidities: "Hypertension, Hyperlipidemia, Previous TIA", medications_at_discharge: "Clopidogrel, Simvastatin", length_of_stay_days: 10 },
19
+ { patient_id: "P006", age: 49, gender: "Male", hospital: "UCLA Medical Center, Los Angeles", primary_diagnosis: "Post-surgical Infection", comorbidities: "Non-adherence to post-op instructions", medications_at_discharge: "Vancomycin", length_of_stay_days: 14 },
20
+ { patient_id: "P007", age: 88, gender: "Male", hospital: "Toronto General Hospital", primary_diagnosis: "Sepsis", comorbidities: "Dementia, Malnutrition, Social isolation", medications_at_discharge: "Ceftriaxone, IV Fluids", length_of_stay_days: 9 },
21
+ { patient_id: "P008", age: 62, gender: "Female", hospital: "The University of Tokyo Hospital", primary_diagnosis: "Diabetic Ketoacidosis", comorbidities: "Diabetes Type 1, Depression", medications_at_discharge: "Insulin, Potassium Chloride", length_of_stay_days: 4 },
22
+ { patient_id: "P009", age: 79, gender: "Male", hospital: "Singapore General Hospital", primary_diagnosis: "Acute Renal Failure", comorbidities: "Chronic Kidney Disease, Hypertension, Gout", medications_at_discharge: "Furosemide, Allopurinol", length_of_stay_days: 7 },
23
+ { patient_id: "P010", age: 55, gender: "Female", hospital: "Mayo Clinic, Rochester", primary_diagnosis: "Hip Replacement", comorbidities: "Osteoarthritis, History of falls", medications_at_discharge: "Oxycodone, Enoxaparin", length_of_stay_days: 5 },
24
+ { patient_id: "P011", age: 70, gender: "Male", hospital: "Johns Hopkins Hospital, Baltimore", primary_diagnosis: "Gastrointestinal Bleed", comorbidities: "Peptic Ulcer Disease, Substance use history (alcohol)", medications_at_discharge: "Pantoprazole, Octreotide", length_of_stay_days: 6 },
25
+ { patient_id: "P012", age: 85, gender: "Female", hospital: "Cleveland Clinic, Cleveland", primary_diagnosis: "Urinary Tract Infection", comorbidities: "Incontinence, Recurrent UTIs, Unstable housing", medications_at_discharge: "Ciprofloxacin", length_of_stay_days: 5 },
26
+ { patient_id: "P013", age: 34, gender: "Male", hospital: "Massachusetts General Hospital, Boston", primary_diagnosis: "Cellulitis from IV drug use", comorbidities: "Substance use disorder (opioids), Hepatitis C, Homeless", medications_at_discharge: "Clindamycin, Buprenorphine", length_of_stay_days: 7 },
27
+ { patient_id: "P014", age: 45, gender: "Female", hospital: "Charité - Universitätsmedizin Berlin", primary_diagnosis: "Asthma Exacerbation", comorbidities: "Anxiety, GERD, Frequent ER visits for asthma", medications_at_discharge: "Fluticasone, Montelukast", length_of_stay_days: 3 },
28
+ { patient_id: "P015", age: 96, gender: "Female", hospital: "UCLA Medical Center, Los Angeles", primary_diagnosis: "Fall with hip fracture", comorbidities: "Frailty, Osteoporosis, Vision impairment, Dementia", medications_at_discharge: "Calcium, Vitamin D, Donepezil", length_of_stay_days: 10 },
29
+ { patient_id: "P016", age: 52, gender: "Male", hospital: "Toronto General Hospital", primary_diagnosis: "Schizophrenia exacerbation", comorbidities: "Medication non-adherence, Social isolation", medications_at_discharge: "Risperidone, Lorazepam", length_of_stay_days: 15 },
30
+ { patient_id: "P017", age: 68, gender: "Female", hospital: "The University of Tokyo Hospital", primary_diagnosis: "Knee Replacement Surgery", comorbidities: "Obesity, Hypertension", medications_at_discharge: "Rivaroxaban, Tramadol", length_of_stay_days: 4 },
31
+ { patient_id: "P018", age: 29, gender: "Male", hospital: "Singapore General Hospital", primary_diagnosis: "Uncomplicated Appendectomy", comorbidities: "None", medications_at_discharge: "None", length_of_stay_days: 2 },
32
+ { patient_id: "P019", age: 61, gender: "Female", hospital: "Mayo Clinic, Rochester", primary_diagnosis: "Myocardial Infarction", comorbidities: "Language barrier (Spanish-speaking only), Diabetes", medications_at_discharge: "Lisinopril, Aspirin", length_of_stay_days: 9 },
33
+ { patient_id: "P020", age: 41, gender: "Male", hospital: "Johns Hopkins Hospital, Baltimore", primary_diagnosis: "Major Depressive Disorder", comorbidities: "Suicidal ideation (resolved), Substance use history (alcohol)", medications_at_discharge: "Sertraline", length_of_stay_days: 8 }
34
+ ];
frontend/src/hooks/usePatientAnalysis.ts ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useState, useCallback } from 'react';
2
+ import Papa from 'papaparse';
3
+ import type { Patient, AnalysisResult, AnalysisErrors, BackendAnalysisResult } from '../types';
4
+ import { PatientSchema } from '../validation/schemas';
5
+
6
+ type InferenceFn = (patients: Patient[]) => Promise<BackendAnalysisResult[]>;
7
+
8
+ export const usePatientAnalysis = (inferenceFn: InferenceFn) => {
9
+ const [analysisResults, setAnalysisResults] = useState<AnalysisResult[]>([]);
10
+ const [isAnalyzing, setIsAnalyzing] = useState<boolean>(false);
11
+ const [errors, setErrors] = useState<AnalysisErrors>({ parseError: null, validationErrors: [] });
12
+
13
+ const runAnalysis = useCallback(async (csvData: string) => {
14
+ setIsAnalyzing(true);
15
+ setErrors({ parseError: null, validationErrors: [] });
16
+ setAnalysisResults([]);
17
+
18
+ Papa.parse(csvData, {
19
+ header: true,
20
+ skipEmptyLines: true,
21
+ dynamicTyping: true,
22
+ complete: async (results) => {
23
+ if (results.errors.length > 0) {
24
+ setErrors({ parseError: `Error parsing CSV data: ${results.errors.map(e => e.message).join(', ')}`, validationErrors: [] });
25
+ setIsAnalyzing(false);
26
+ return;
27
+ }
28
+
29
+ const validationErrorMessages: string[] = [];
30
+ const validPatients: Patient[] = [];
31
+
32
+ results.data.forEach((row: any, index) => {
33
+ const validationResult = PatientSchema.safeParse(row);
34
+ if(validationResult.success){
35
+ validPatients.push(validationResult.data as Patient);
36
+ } else {
37
+ const id = row.patient_id || `Row ${index + 2}`;
38
+ const issues = validationResult.error.issues.map(i => `${i.path.join('.')}: ${i.message}`).join(', ');
39
+ validationErrorMessages.push(`Patient ${id} is invalid - ${issues}`);
40
+ }
41
+ });
42
+
43
+ setErrors({ parseError: null, validationErrors: validationErrorMessages });
44
+
45
+ if(validPatients.length === 0){
46
+ if(validationErrorMessages.length === 0) {
47
+ setErrors(prev => ({ ...prev, parseError: "No valid patient data found to analyze." }));
48
+ }
49
+ setIsAnalyzing(false);
50
+ return;
51
+ }
52
+
53
+ const initialResults: AnalysisResult[] = validPatients.map((p) => ({ status: 'loading', patient: p }));
54
+ setAnalysisResults(initialResults);
55
+
56
+ try {
57
+ const backendResults: BackendAnalysisResult[] = await inferenceFn(validPatients);
58
+
59
+ const resultsMap = new Map(backendResults.map(res => [res.patient_id, res]));
60
+
61
+ const finalResults: AnalysisResult[] = validPatients.map(patient => {
62
+ const result = resultsMap.get(patient.patient_id);
63
+ if (!result) {
64
+ return { status: 'error', patient, error: 'Analysis result not returned from the server.' };
65
+ }
66
+ if (result.status === 'success') {
67
+ return { status: 'success', patient, analysis: result.analysis };
68
+ }
69
+ return { status: 'error', patient, error: result.error };
70
+ });
71
+
72
+ setAnalysisResults(finalResults);
73
+
74
+ } catch (err) {
75
+ const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred during API communication.';
76
+ setAnalysisResults(
77
+ validPatients.map(p => ({ status: 'error', patient: p, error: errorMessage }))
78
+ );
79
+ } finally {
80
+ setIsAnalyzing(false);
81
+ }
82
+ },
83
+ error: (err: any) => {
84
+ setErrors({ parseError: `Failed to parse CSV: ${err.message}`, validationErrors: [] });
85
+ setIsAnalyzing(false);
86
+ }
87
+ });
88
+ }, [inferenceFn]);
89
+
90
+ return {
91
+ analysisResults,
92
+ isAnalyzing,
93
+ errors,
94
+ runAnalysis,
95
+ };
96
+ };
frontend/src/index.css CHANGED
@@ -1,3 +1,27 @@
1
  @tailwind base;
2
  @tailwind components;
3
  @tailwind utilities;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  @tailwind base;
2
  @tailwind components;
3
  @tailwind utilities;
4
+
5
+ body {
6
+ --c1: #3d3a77;
7
+ --c2: #1e1d3e;
8
+ --c3: #a43e4f;
9
+ --c4: #2b616d;
10
+ background: radial-gradient(circle at 10% 20%, var(--c1) 0%, transparent 25%),
11
+ radial-gradient(circle at 85% 70%, var(--c3) 0%, transparent 25%),
12
+ radial-gradient(circle at 25% 85%, var(--c4) 0%, transparent 30%),
13
+ #1e1d3e;
14
+ overflow-x: hidden;
15
+ }
16
+ body::before {
17
+ content: "";
18
+ position: fixed;
19
+ top: 0;
20
+ left: 0;
21
+ width: 100vw;
22
+ height: 100vh;
23
+ background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800"><filter id="noiseFilter"><feTurbulence type="fractalNoise" baseFrequency="0.65" numOctaves="3" stitchTiles="stitch"/></filter><rect width="100%" height="100%" filter="url(%23noiseFilter)"/></svg>');
24
+ opacity: 0.05;
25
+ z-index: -1;
26
+ pointer-events: none;
27
+ }
frontend/src/main.tsx CHANGED
@@ -1,6 +1,6 @@
1
  import React from 'react'
2
  import ReactDOM from 'react-dom/client'
3
- import App from './App.tsx'
4
  import './index.css'
5
 
6
  ReactDOM.createRoot(document.getElementById('root')!).render(
 
1
  import React from 'react'
2
  import ReactDOM from 'react-dom/client'
3
+ import App from './App'
4
  import './index.css'
5
 
6
  ReactDOM.createRoot(document.getElementById('root')!).render(
frontend/src/types.ts ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { z } from 'zod';
2
+ import { PatientSchema } from './validation/schemas';
3
+
4
+ export type Patient = z.infer<typeof PatientSchema>;
5
+
6
+ export enum RiskLevel {
7
+ Low = "Low",
8
+ Medium = "Medium",
9
+ High = "High",
10
+ }
11
+
12
+ export interface Analysis {
13
+ patient_id: string;
14
+ risk_level: RiskLevel;
15
+ confidence_score: number;
16
+ contributing_factors: string[];
17
+ preventive_recommendations: string[];
18
+ }
19
+
20
+ export interface BackendAnalysisSuccess {
21
+ status: 'success';
22
+ patient_id: string;
23
+ analysis: Analysis;
24
+ }
25
+
26
+ export interface BackendAnalysisError {
27
+ status: 'error';
28
+ patient_id: string;
29
+ error: string;
30
+ }
31
+
32
+ export type BackendAnalysisResult = BackendAnalysisSuccess | BackendAnalysisError;
33
+
34
+ export type AnalysisResult =
35
+ | { status: 'loading'; patient: Patient }
36
+ | { status: 'success'; patient: Patient; analysis: Analysis }
37
+ | { status: 'error'; patient: Patient; error: string };
38
+
39
+ export interface AnalysisErrors {
40
+ parseError: string | null;
41
+ validationErrors: string[];
42
+ }
frontend/src/validation/schemas.ts ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { z } from 'zod';
2
+
3
+ export const PatientSchema = z.object({
4
+ patient_id: z.string().min(1, { message: "patient_id cannot be empty." }),
5
+ age: z.number().int().positive({ message: "Age must be a positive number." }),
6
+ gender: z.string().min(1, { message: "Gender cannot be empty." }),
7
+ hospital: z.string().min(1, { message: "Hospital cannot be empty." }),
8
+ primary_diagnosis: z.string().min(1, { message: "Primary diagnosis cannot be empty." }),
9
+ comorbidities: z.string().min(1, { message: "Comorbidities cannot be empty." }),
10
+ medications_at_discharge: z.string().min(1, { message: "Medications cannot be empty." }),
11
+ length_of_stay_days: z.number().int().positive({ message: "Length of stay must be a positive number." }),
12
+ readmitted_within_30_days: z.preprocess(
13
+ (value) => {
14
+ if (typeof value === 'string') {
15
+ const lowercasedValue = value.toLowerCase();
16
+ if (lowercasedValue === 'true') return true;
17
+ if (lowercasedValue === 'false') return false;
18
+ }
19
+ return value;
20
+ },
21
+ z.boolean().optional()
22
+ ),
23
+ });
frontend/tsconfig.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "useDefineForClassFields": true,
5
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
6
+ "module": "ESNext",
7
+ "skipLibCheck": true,
8
+ "moduleResolution": "bundler",
9
+ "allowImportingTsExtensions": true,
10
+ "resolveJsonModule": true,
11
+ "isolatedModules": true,
12
+ "noEmit": true,
13
+ "jsx": "react-jsx",
14
+ "strict": true,
15
+ "noUnusedLocals": true,
16
+ "noUnusedParameters": true,
17
+ "noFallthroughCasesInSwitch": true
18
+ },
19
+ "include": ["src"],
20
+ "references": [{ "path": "./tsconfig.node.json" }]
21
+ }
frontend/tsconfig.node.json ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "composite": true,
4
+ "skipLibCheck": true,
5
+ "module": "ESNext",
6
+ "moduleResolution": "bundler",
7
+ "allowSyntheticDefaultImports": true,
8
+ "strict": true
9
+ },
10
+ "include": ["vite.config.ts"]
11
+ }
frontend/vite.config.ts CHANGED
@@ -1,14 +1,15 @@
1
- import { defineConfig } from 'vite';
2
- import react from '@vitejs/plugin-react';
3
 
 
4
  export default defineConfig({
5
  plugins: [react()],
6
- build: {
7
- outDir: 'dist',
8
- },
9
  server: {
10
  proxy: {
11
- '/api': 'http://localhost:8000',
 
 
 
12
  },
13
  },
14
- });
 
1
+ import { defineConfig } from 'vite'
2
+ import react from '@vitejs/plugin-react'
3
 
4
+ // https://vitejs.dev/config/
5
  export default defineConfig({
6
  plugins: [react()],
 
 
 
7
  server: {
8
  proxy: {
9
+ '/api': {
10
+ target: 'http://127.0.0.1:8000',
11
+ changeOrigin: true,
12
+ },
13
  },
14
  },
15
+ })