IDKHowToCodeFr commited on
Commit
8b66798
·
verified ·
1 Parent(s): bab72d9

Upload folder using huggingface_hub

Browse files
ARCHITECTURE.md CHANGED
@@ -1,77 +1,155 @@
1
- # HeartFlow OS Architecture
2
 
3
- HeartFlow OS is a distributed Edge AI platform. It bridges the gap between high-level Python MLOps and low-level embedded systems (ESP32/Arduino) by orchestrating live telemetry, automated model training, and zero-dependency C transpilation.
4
 
5
- ## Core Flow Diagrams
6
 
7
- ### 1. Data Cleaning & Feature Selection Pipeline
 
 
 
8
 
9
- ```mermaid
10
- graph TD
11
- A[Raw CSV Dataset] --> B{Drop Redundant Columns}
12
- B -->|Remove| C[Patient Number, Alert Flags]
13
- B --> D[Sanitize Encodings]
14
- D -->|Fix \ufffd -> °| E[Feature Engineering]
15
- E -->|Create Risk_Severity| F[Risk_Severity = HR > 105 + SpO2 < 94]
16
- F --> G[Imputation]
17
- G -->|SimpleImputer: Mean| H[Scaling]
18
- H -->|StandardScaler| I[Clean Feature Matrix]
19
- I --> J[Train / Test Split 80:20]
20
- ```
21
 
22
- ### 2. MLOps Background Retraining
23
 
24
  ```mermaid
25
- graph TD
26
- A[New CSV Upload via UI] --> B(FastAPI /retrain)
27
- B --> C[Background Thread: train_models]
28
- C --> D[Preprocess Data & Fit Transformers]
29
- D --> E[Train 5 Models: KNN, SVM, LogReg, RF, MLP]
30
- E --> F[Calculate Weighted F1 Score]
31
- F --> G{Is F1 > Active Version?}
32
- G -->|Yes| H[Save .pkl files, Update registry.json]
33
- G -->|No| I[Rollback, Discard Models]
34
- H --> J[Hot-Reload Live Inference Pipeline]
35
- ```
36
 
37
- ### 3. Edge Compilation (TinyML)
 
 
 
 
 
 
 
 
 
 
38
 
39
- ```mermaid
40
- graph TD
41
- A[Export Request /export_tinyml] --> B[Load Active .pkl Random Forest]
42
- B --> C[Traverse AST Trees Recursively]
43
- C --> D{Quantization Enabled?}
44
- D -->|Yes| E[Map Float64 to INT8 thresholds]
45
- D -->|No| F[Keep Float32 thresholds]
46
- E --> G[Generate C Header: model.h]
47
- F --> G
48
- G -->|Zero-Malloc| H[PlatformIO / ESP32 Compile]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  ```
50
 
51
- ## Detailed Explanations
52
-
53
- ### Data Cleaning and Feature Selection
54
- Raw patient data is noisy and often contains missing or invalid readings. The preprocessing pipeline (`backend/preprocessing.py`) handles this systematically:
55
- 1. **Dimensionality Reduction**: Redundant or target-leakage columns (like `Heart Rate Alert` or `Patient Number`) are dropped to prevent the model from overfitting on administrative flags.
56
- 2. **Encoding Fixes**: Unicode corruption (e.g., `\ufffd` instead of `°`) is sanitized.
57
- 3. **Imputation**: Missing sensor readings are populated using a `SimpleImputer(strategy='mean')`. The imputer is fitted on the training set and serialized to `imputer.pkl` to prevent data leakage during live inference.
58
- 4. **Feature Engineering**: A custom `Risk_Severity` feature is synthesized by combining critical thresholds: `(Heart Rate > 105) + (SpO2 < 94)`. This gives the decision trees a powerful non-linear hint.
59
- 5. **Standardization**: All continuous features are scaled to a standard normal distribution via `StandardScaler`, ensuring distance-based algorithms (like KNN and SVM) compute correctly.
60
-
61
- ### Intelligence Pipeline (Ensemble)
62
- HeartFlow doesn't rely on a single algorithm. It trains five distinct models:
63
- - **K-Nearest Neighbors (KNN)**
64
- - **Support Vector Machine (SVM)**
65
- - **Logistic Regression (LogReg)**
66
- - **Random Forest (RF)**
67
- - **Multilayer Perceptron (MLP Neural Network)**
68
-
69
- During live telemetry inference (`backend/ensemble.py`), the system aggregates the probability vectors from all five models. It performs a **soft-vote**, returning the highest confidence average as the final diagnosis.
70
-
71
- ### Fault-Tolerant Retraining (MLOps)
72
- When a clinician uploads a new batch of data via the `/mlops` UI, the system trains the entire ensemble in a background thread without dropping live WebSocket connections.
73
- It evaluates the newly trained models against a 20% holdout test set. If the new `weighted F1-Score` is higher than the `active_version` tracked in `registry.json`, the `.pkl` files are hot-swapped. If the score degrades, the new models are destroyed (Automated Rollback).
74
-
75
- ### Edge Transpilation
76
- Running Python on an ESP32 is too heavy. The `backend/export.py` script traverses the AST (Abstract Syntax Tree) of the trained Scikit-Learn Random Forest and writes pure, `if/else` C++ code into a `model.h` file.
77
- To shrink the firmware size by 75%, it applies **INT8 Quantization**, scaling floating-point sensor thresholds into 8-bit integers. The resulting inference function uses zero dynamic memory (`malloc`/`free`), ensuring the microcontroller never crashes from heap fragmentation.
 
 
 
 
 
 
1
+ # Architecture: HeartFlow OS
2
 
3
+ ## 1. System Overview and Goals
4
 
5
+ HeartFlow OS is a distributed Edge AI platform engineered to bridge the gap between high-level Python MLOps and resource-constrained embedded systems (ESP32/Arduino).
6
 
7
+ **Core Architectural Objectives:**
8
+ - **Real-Time Telemetry:** Deliver a fault-tolerant, low-latency dashboard for live cardiovascular monitoring via WebSockets.
9
+ - **Automated MLOps (CI/CD for ML):** Enable seamless background model retraining, validation, and hot-swapping without interrupting active clinical inference.
10
+ - **Bare-Metal Edge Deployment:** Transpile trained Scikit-Learn ensembles into highly optimized, zero-dependency C++ code tailored for microcontrollers.
11
 
12
+ ---
13
+
14
+ ## 2. System Flow and Component Topology
 
 
 
 
 
 
 
 
 
15
 
16
+ The following diagram illustrates the boundaries and data flow between the client interfaces, API orchestration layer, ML pipelines, and data stores.
17
 
18
  ```mermaid
19
+ %% Generated by https://gitdiagram.com/idkhowtocodefr/heartflow_os
20
+ flowchart TD
 
 
 
 
 
 
 
 
 
21
 
22
+ subgraph group_client["Telemetry interface (Next.js)"]
23
+ node_dashboard["Live dashboard<br/>[page.tsx]"]
24
+ node_telemetry_context["Telemetry context"]
25
+ node_history_ui["History view<br/>[page.tsx]"]
26
+ node_analytics["Analytics view<br/>[page.tsx]"]
27
+ node_simulator_ui["Simulator view<br/>[page.tsx]"]
28
+ node_mlops_ui["MLOps view<br/>[page.tsx]"]
29
+ node_edge_ui["Edge export view<br/>[page.tsx]"]
30
+ node_architecture_ui["Architecture view<br/>[page.tsx]"]
31
+ node_shap_chart["SHAP chart<br/>[ShapChart.tsx]"]
32
+ end
33
 
34
+ subgraph group_api["API orchestration (FastAPI)"]
35
+ node_api["FastAPI routes<br/>[main.py]"]
36
+ node_simulator["Vitals simulator<br/>[simulator.py]"]
37
+ end
38
+
39
+ subgraph group_ml["Prediction and MLOps"]
40
+ node_inference["Inference pipeline<br/>[inference.py]"]
41
+ node_preprocessing["Feature preprocessing<br/>[preprocessing.py]"]
42
+ node_ensemble["Soft-voting ensemble<br/>[ensemble.py]"]
43
+ node_training["Model training<br/>[models.py]"]
44
+ node_export["C code exporter<br/>[export.py]"]
45
+ node_model_files["Trained model files"]
46
+ node_dataset["Patient dataset"]
47
+ end
48
+
49
+ subgraph group_state["Persistence and sync"]
50
+ node_database[("Prediction history<br/>[database.py]")]
51
+ node_sqlite[("SQLite history store<br/>[patient_history.db]")]
52
+ end
53
+
54
+ node_clinician(("Clinical user"))
55
+ node_hub["Hugging Face Hub"]
56
+
57
+ node_clinician -.->|"monitors"| node_dashboard
58
+ node_clinician -.->|"reviews"| node_history_ui
59
+ node_clinician -.->|"explores"| node_analytics
60
+ node_clinician -.->|"uses"| node_simulator_ui
61
+ node_clinician -.->|"manages"| node_mlops_ui
62
+ node_clinician -.->|"exports"| node_edge_ui
63
+ node_clinician -.->|"views"| node_architecture_ui
64
+ node_dashboard -->|"uses"| node_telemetry_context
65
+ node_clinician -.->|"submits vitals"| node_api
66
+ node_dashboard -.->|"streams telemetry"| node_api
67
+ node_history_ui -.->|"requests history"| node_api
68
+ node_analytics -.->|"requests data"| node_api
69
+ node_mlops_ui -.->|"uploads retraining data"| node_api
70
+ node_edge_ui -.->|"requests C export"| node_api
71
+ node_api -->|"initializes and queries"| node_database
72
+ node_api -->|"streams generated vitals"| node_simulator
73
+ node_api -->|"evaluates vitals"| node_inference
74
+ node_api -->|"prepares explanations"| node_preprocessing
75
+ node_api -->|"generates C code"| node_export
76
+ node_api -->|"loads and refreshes"| node_ensemble
77
+ node_api -->|"starts background retraining"| node_training
78
+ node_inference -->|"transforms features"| node_preprocessing
79
+ node_inference -.->|"predicts probabilities"| node_ensemble
80
+ node_ensemble -->|"resolves model directory"| node_preprocessing
81
+ node_training -->|"splits and transforms data"| node_preprocessing
82
+ node_training -->|"reads training data"| node_dataset
83
+ node_training -->|"writes trained models"| node_model_files
84
+ node_ensemble -->|"loads model artifacts"| node_model_files
85
+ node_database -->|"reads and writes"| node_sqlite
86
+ node_database -->|"syncs history"| node_hub
87
+
88
+ classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
89
+ classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
90
+ classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
91
+ classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
92
+ classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
93
+ classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
94
+ classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
95
+
96
+ click node_dashboard "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/app/dashboard/page.tsx"
97
+ click node_telemetry_context "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/context/TelemetryContext.tsx"
98
+ click node_history_ui "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/app/history/page.tsx"
99
+ click node_analytics "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/app/analytics/page.tsx"
100
+ click node_simulator_ui "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/app/simulator/page.tsx"
101
+ click node_mlops_ui "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/app/mlops/page.tsx"
102
+ click node_edge_ui "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/app/edge/page.tsx"
103
+ click node_architecture_ui "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/app/architecture/page.tsx"
104
+ click node_shap_chart "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/components/ShapChart.tsx"
105
+ click node_api "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/main.py"
106
+ click node_simulator "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/simulator.py"
107
+ click node_inference "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/inference.py"
108
+ click node_preprocessing "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/preprocessing.py"
109
+ click node_ensemble "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/ensemble.py"
110
+ click node_training "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/models.py"
111
+ click node_export "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/export.py"
112
+ click node_model_files "https://github.com/idkhowtocodefr/heartflow_os/tree/main/model"
113
+ click node_dataset "https://github.com/idkhowtocodefr/heartflow_os/blob/main/data/patient_dataset.csv"
114
+ click node_database "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/database.py"
115
+ click node_sqlite "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/patient_history.db"
116
+
117
+ class node_dashboard,node_telemetry_context,node_history_ui,node_analytics,node_simulator_ui,node_mlops_ui,node_edge_ui,node_architecture_ui,node_shap_chart,node_clinician toneBlue
118
+ class node_api,node_simulator toneAmber
119
+ class node_inference,node_preprocessing,node_ensemble,node_training,node_export,node_model_files,node_dataset toneMint
120
+ class node_database,node_sqlite toneRose
121
+ class node_hub toneIndigo
122
  ```
123
 
124
+ ---
125
+
126
+ ## 3. Component Architecture
127
+
128
+ ### 3.1 Client Layer (Frontend)
129
+ Built entirely on **Next.js 16** and **React 19**, the client provides specialized views for distinct clinical and engineering workflows.
130
+ - **Telemetry (`/dashboard`)**: Consumes high-frequency WebSocket streams. The `TelemetryContext` implements connection pooling and exponential backoff to recover gracefully from network interruptions.
131
+ - **MLOps Control (`/mlops`)**: Exposes the training pipeline to clinicians. Accepts batch CSV uploads and triggers asynchronous retraining tasks on the backend.
132
+ - **Hardware Export (`/edge`)**: Provides an interface for hardware engineers to retrieve transpiled C++ inference headers for immediate flashing.
133
+
134
+ ### 3.2 API & Orchestration (Backend)
135
+ Powered by **FastAPI** on Python 3.10.
136
+ - **WebSocket Router (`main.py`)**: Manages active clinical sessions. Ensures that long-running operations (like retraining) do not block the ASGI event loop, guaranteeing uninterrupted telemetry.
137
+ - **Vitals Simulator (`simulator.py`)**: A fallback data generator that produces synthetic, clinically realistic cardiovascular data (Heart Rate, SpO2) when physical ESP32 hardware is disconnected.
138
+
139
+ ### 3.3 Machine Learning & Inference Pipeline
140
+ To maximize accuracy and prevent edge hallucinations, the system relies on a robust ensemble rather than a single algorithm.
141
+ - **Preprocessing (`preprocessing.py`)**: Handles data sanitization, `SimpleImputer` mean-filling, and `StandardScaler` normalization. Synthesizes non-linear risk indicators (e.g., combining HR and SpO2 thresholds).
142
+ - **Soft-Voting Ensemble (`ensemble.py`)**: Aggregates predictions across five distinct models (KNN, SVM, LogReg, RF, MLP). By averaging probability vectors rather than relying on hard class votes, the system yields higher confidence diagnoses.
143
+ - **Fault-Tolerant Retraining (`models.py`)**: Model updates execute in background threads. New models are evaluated against a 20% holdout set. The system enforces an **Automated Rollback**: `.pkl` weights are only hot-swapped into memory if the new weighted F1-Score strictly exceeds the active version.
144
+
145
+ ### 3.4 TinyML Edge Compiler
146
+ The most critical architectural component, closing the loop between cloud intelligence and bare-metal execution.
147
+ - **AST Transpilation (`export.py`)**: Parses the internal Abstract Syntax Tree (AST) of the active Scikit-Learn Random Forest model.
148
+ - **INT8 Quantization**: Downscales `float64` node boundaries into 8-bit integers, effectively slashing the memory footprint by up to 75% for resource-starved microcontrollers.
149
+ - **Zero-Malloc Generation**: The output is a pure C++ header (`model.h`) consisting exclusively of static `if/else` branching. By strictly forbidding dynamic memory allocation (`malloc`/`free`), the exported firmware is mathematically guaranteed to be immune to heap fragmentation crashes—a mandatory requirement for medical IoT devices.
150
+
151
+ ---
152
+
153
+ ## 4. Data Persistence Strategy
154
+ - **SQLite Event Store (`database.py`)**: Telemetry events, anomaly flags, and clinical interventions are logged to a local, file-based SQLite database (`patient_history.db`) for high-speed read/write access without the overhead of a dedicated RDBMS.
155
+ - **Hugging Face Hub**: Serves as the off-site model registry and backup layer. Periodically syncs versioned models, preprocessing transformers, and historical datasets to ensure state recovery in the event of local hardware failure.```
README.md CHANGED
@@ -33,7 +33,11 @@ pinned: false
33
 
34
  HeartFlow OS streams cardiovascular vitals, predicts anomalies using a soft-voting ensemble, and exports models to highly-constrained edge devices (ESP32/Arduino).
35
 
36
- ## System Architecture
 
 
 
 
37
 
38
  | Domain | Tech | Details |
39
  | :--- | :--- | :--- |
@@ -43,24 +47,24 @@ HeartFlow OS streams cardiovascular vitals, predicts anomalies using a soft-voti
43
  | **Edge Compiler** | Custom AST Transpiler | Exports trained ensembles to zero-dependency, INT8 quantized C headers. |
44
  | **Firmware** | PlatformIO, C++ | Ready-to-deploy hardware wrapper for ESP32/Arduino execution. |
45
 
46
- ## Core Features
47
 
48
- - **Fault-Tolerant Telemetry**: Streams data via WebSockets to the React dashboard with exponential backoff and UI-level auto-reconnection.
49
- - **Automated MLOps Registry**: Upload batch CSV data to `/retrain`. The system evaluates the new models against a test set and will automatically roll back if performance (F1-score) degrades.
50
- - **Edge Compilation (TinyML)**: Converts trained models into standalone C code (`model.h`). The generated code requires no dynamic memory allocation (`malloc`-free) and uses integer quantization to cut memory footprint by 75%.
51
- - **Cross-Language Assurance**: Built-in test pipelines verify that the exported C logic perfectly matches the Python models before flashing to hardware.
52
 
53
- ## Quickstart
54
 
55
  ### Option 1: Docker Compose (Recommended)
56
 
57
- Run the entire full-stack platform (Frontend + Backend) with a single command:
58
 
59
  ```bash
60
  docker compose up --build
61
  ```
62
- - UI available at: `http://localhost:3000`
63
- - API Docs available at: `http://localhost:8000/docs`
64
 
65
  ### Option 2: Manual Local Setup
66
 
@@ -83,14 +87,15 @@ npm run dev
83
 
84
  ### Option 3: Hardware Firmware (Edge Deployment)
85
 
86
- Once you export your `model.h` from the UI or API, deploy to your microcontroller:
87
 
88
  ```bash
89
  cd firmware
90
- # Copy your exported model.h to firmware/src/model.h
 
91
  pio run -t upload
92
  ```
93
 
94
  ## License
95
 
96
- MIT License. See `LICENSE`.
 
33
 
34
  HeartFlow OS streams cardiovascular vitals, predicts anomalies using a soft-voting ensemble, and exports models to highly-constrained edge devices (ESP32/Arduino).
35
 
36
+ ## Architecture
37
+
38
+ To see the complete pipeline and component structure, check out the **[Architecture Documentation](ARCHITECTURE.md)**.
39
+
40
+ ### System Overview
41
 
42
  | Domain | Tech | Details |
43
  | :--- | :--- | :--- |
 
47
  | **Edge Compiler** | Custom AST Transpiler | Exports trained ensembles to zero-dependency, INT8 quantized C headers. |
48
  | **Firmware** | PlatformIO, C++ | Ready-to-deploy hardware wrapper for ESP32/Arduino execution. |
49
 
50
+ ## Core Capabilities
51
 
52
+ - **Fault-Tolerant Telemetry**: Streams data via WebSockets to the React dashboard with UI-level auto-reconnection.
53
+ - **Automated MLOps Registry**: Upload batch CSV data to `/retrain`. The system evaluates new models against a test set and rolls back if performance degrades.
54
+ - **Edge Compilation (TinyML)**: Converts trained models into standalone C code (`model.h`) without dynamic memory allocation (`malloc`-free).
55
+ - **Cross-Language Assurance**: Test pipelines verify that the exported C logic matches the Python models before flashing to hardware.
56
 
57
+ ## Quickstart Guide
58
 
59
  ### Option 1: Docker Compose (Recommended)
60
 
61
+ Run the entire full-stack platform (Frontend + Backend):
62
 
63
  ```bash
64
  docker compose up --build
65
  ```
66
+ - **UI**: `http://localhost:3000`
67
+ - **API Docs**: `http://localhost:8000/docs`
68
 
69
  ### Option 2: Manual Local Setup
70
 
 
87
 
88
  ### Option 3: Hardware Firmware (Edge Deployment)
89
 
90
+ Once you export your `model.h` from the UI or API, deploy it to your microcontroller:
91
 
92
  ```bash
93
  cd firmware
94
+ # 1. Copy your exported model.h to firmware/src/model.h
95
+ # 2. Upload to the connected ESP32/Arduino
96
  pio run -t upload
97
  ```
98
 
99
  ## License
100
 
101
+ MIT License. See `LICENSE` for more information.
frontend/AGENTS.md DELETED
@@ -1,9 +0,0 @@
1
- <!-- BEGIN:nextjs-agent-rules -->
2
-
3
- # This is NOT the Next.js you know
4
-
5
- This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
6
-
7
- This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
8
-
9
- <!-- END:nextjs-agent-rules -->
 
 
 
 
 
 
 
 
 
 
frontend/CLAUDE.md DELETED
@@ -1 +0,0 @@
1
- @AGENTS.md
 
 
frontend/package-lock.json CHANGED
@@ -10,6 +10,7 @@
10
  "dependencies": {
11
  "framer-motion": "^13.4.4",
12
  "lucide-react": "^1.48.0",
 
13
  "next": "16.3.6",
14
  "react": "19.2.8",
15
  "react-dom": "19.2.8"
@@ -38,6 +39,19 @@
38
  "url": "https://github.com/sponsors/sindresorhus"
39
  }
40
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  "node_modules/@babel/code-frame": {
42
  "version": "7.29.7",
43
  "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
@@ -278,6 +292,49 @@
278
  "node": ">=6.9.0"
279
  }
280
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
281
  "node_modules/@emnapi/core": {
282
  "version": "1.10.0",
283
  "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
@@ -521,6 +578,23 @@
521
  "url": "https://github.com/sponsors/nzakas"
522
  }
523
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
524
  "node_modules/@img/colour": {
525
  "version": "1.1.0",
526
  "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
@@ -1120,6 +1194,18 @@
1120
  "@jridgewell/sourcemap-codec": "^1.4.14"
1121
  }
1122
  },
 
 
 
 
 
 
 
 
 
 
 
 
1123
  "node_modules/@napi-rs/wasm-runtime": {
1124
  "version": "1.2.4",
1125
  "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz",
@@ -1689,6 +1775,259 @@
1689
  "tslib": "^2.4.0"
1690
  }
1691
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1692
  "node_modules/@types/estree": {
1693
  "version": "1.0.9",
1694
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
@@ -1696,6 +2035,12 @@
1696
  "dev": true,
1697
  "license": "MIT"
1698
  },
 
 
 
 
 
 
1699
  "node_modules/@types/json-schema": {
1700
  "version": "7.0.15",
1701
  "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -1740,6 +2085,13 @@
1740
  "@types/react": "^19.3.0"
1741
  }
1742
  },
 
 
 
 
 
 
 
1743
  "node_modules/@typescript-eslint/eslint-plugin": {
1744
  "version": "8.70.1",
1745
  "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.70.1.tgz",
@@ -2389,6 +2741,16 @@
2389
  "win32"
2390
  ]
2391
  },
 
 
 
 
 
 
 
 
 
 
2392
  "node_modules/acorn": {
2393
  "version": "8.18.0",
2394
  "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
@@ -2749,168 +3111,701 @@
2749
  "browserslist": "cli.js"
2750
  },
2751
  "engines": {
2752
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2753
  }
2754
  },
2755
- "node_modules/call-bind": {
2756
- "version": "1.0.9",
2757
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz",
2758
- "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==",
2759
- "dev": true,
2760
- "license": "MIT",
 
 
 
 
 
 
 
 
2761
  "dependencies": {
2762
- "call-bind-apply-helpers": "^1.0.2",
2763
- "es-define-property": "^1.0.1",
2764
- "get-intrinsic": "^1.3.0",
2765
- "set-function-length": "^1.2.2"
2766
  },
2767
  "engines": {
2768
- "node": ">= 0.4"
2769
- },
2770
- "funding": {
2771
- "url": "https://github.com/sponsors/ljharb"
2772
  }
2773
  },
2774
- "node_modules/call-bind-apply-helpers": {
2775
- "version": "1.0.2",
2776
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
2777
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
2778
- "dev": true,
2779
- "license": "MIT",
2780
  "dependencies": {
2781
- "es-errors": "^1.3.0",
2782
- "function-bind": "^1.1.2"
2783
  },
2784
  "engines": {
2785
- "node": ">= 0.4"
2786
  }
2787
  },
2788
- "node_modules/call-bound": {
2789
- "version": "1.0.4",
2790
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
2791
- "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
2792
- "dev": true,
2793
- "license": "MIT",
2794
  "dependencies": {
2795
- "call-bind-apply-helpers": "^1.0.2",
2796
- "get-intrinsic": "^1.3.0"
2797
  },
2798
  "engines": {
2799
- "node": ">= 0.4"
2800
- },
2801
- "funding": {
2802
- "url": "https://github.com/sponsors/ljharb"
2803
  }
2804
  },
2805
- "node_modules/callsites": {
2806
- "version": "3.1.0",
2807
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
2808
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
2809
- "dev": true,
2810
- "license": "MIT",
2811
  "engines": {
2812
- "node": ">=6"
2813
  }
2814
  },
2815
- "node_modules/caniuse-lite": {
2816
- "version": "1.0.30001812",
2817
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001812.tgz",
2818
- "integrity": "sha512-qN+QNNBr93TCmFrmte0bBCjSDMuRvt78VlHT99qIGPszm4QsqCX8lnyWUFkHi8B7ZBAPq8SH+UqyXNy/odMdng==",
2819
- "funding": [
2820
- {
2821
- "type": "opencollective",
2822
- "url": "https://opencollective.com/browserslist"
2823
- },
2824
- {
2825
- "type": "tidelift",
2826
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
2827
- },
2828
- {
2829
- "type": "github",
2830
- "url": "https://github.com/sponsors/ai"
2831
- }
2832
- ],
2833
- "license": "CC-BY-4.0"
2834
- },
2835
- "node_modules/chalk": {
2836
- "version": "4.1.2",
2837
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
2838
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
2839
- "dev": true,
2840
- "license": "MIT",
2841
  "dependencies": {
2842
- "ansi-styles": "^4.1.0",
2843
- "supports-color": "^7.1.0"
 
 
 
2844
  },
2845
  "engines": {
2846
- "node": ">=10"
2847
  },
2848
- "funding": {
2849
- "url": "https://github.com/chalk/chalk?sponsor=1"
2850
  }
2851
  },
2852
- "node_modules/client-only": {
2853
- "version": "0.0.1",
2854
- "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
2855
- "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
2856
- "license": "MIT"
2857
- },
2858
- "node_modules/color-convert": {
2859
- "version": "2.0.1",
2860
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
2861
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
2862
- "dev": true,
2863
- "license": "MIT",
2864
  "dependencies": {
2865
- "color-name": "~1.1.4"
 
 
 
 
2866
  },
2867
  "engines": {
2868
- "node": ">=7.0.0"
2869
  }
2870
  },
2871
- "node_modules/color-name": {
2872
- "version": "1.1.4",
2873
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
2874
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
2875
- "dev": true,
2876
- "license": "MIT"
2877
- },
2878
- "node_modules/concat-map": {
2879
- "version": "0.0.1",
2880
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
2881
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
2882
- "dev": true,
2883
- "license": "MIT"
2884
- },
2885
- "node_modules/convert-source-map": {
2886
- "version": "2.0.0",
2887
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
2888
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
2889
- "dev": true,
2890
- "license": "MIT"
2891
- },
2892
- "node_modules/cross-spawn": {
2893
- "version": "7.0.6",
2894
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
2895
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
2896
- "dev": true,
2897
  "license": "MIT",
2898
  "dependencies": {
2899
- "path-key": "^3.1.0",
2900
- "shebang-command": "^2.0.0",
2901
- "which": "^2.0.1"
2902
- },
2903
- "engines": {
2904
- "node": ">= 8"
2905
  }
2906
  },
2907
- "node_modules/csstype": {
2908
- "version": "3.2.3",
2909
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
2910
- "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
2911
- "dev": true,
2912
- "license": "MIT"
2913
- },
2914
  "node_modules/damerau-levenshtein": {
2915
  "version": "1.0.8",
2916
  "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
@@ -2972,6 +3867,12 @@
2972
  "url": "https://github.com/sponsors/ljharb"
2973
  }
2974
  },
 
 
 
 
 
 
2975
  "node_modules/debug": {
2976
  "version": "4.4.3",
2977
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@@ -3033,6 +3934,15 @@
3033
  "url": "https://github.com/sponsors/ljharb"
3034
  }
3035
  },
 
 
 
 
 
 
 
 
 
3036
  "node_modules/detect-libc": {
3037
  "version": "2.1.2",
3038
  "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
@@ -3056,6 +3966,15 @@
3056
  "node": ">=0.10.0"
3057
  }
3058
  },
 
 
 
 
 
 
 
 
 
3059
  "node_modules/dunder-proto": {
3060
  "version": "1.0.1",
3061
  "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -3078,6 +3997,12 @@
3078
  "dev": true,
3079
  "license": "ISC"
3080
  },
 
 
 
 
 
 
3081
  "node_modules/emoji-regex": {
3082
  "version": "9.2.2",
3083
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
@@ -3298,6 +4223,18 @@
3298
  "url": "https://github.com/sponsors/ljharb"
3299
  }
3300
  },
 
 
 
 
 
 
 
 
 
 
 
 
3301
  "node_modules/escalade": {
3302
  "version": "3.2.0",
3303
  "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
@@ -4089,6 +5026,12 @@
4089
  "dev": true,
4090
  "license": "ISC"
4091
  },
 
 
 
 
 
 
4092
  "node_modules/has-bigints": {
4093
  "version": "1.1.0",
4094
  "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
@@ -4200,6 +5143,18 @@
4200
  "hermes-estree": "0.25.1"
4201
  }
4202
  },
 
 
 
 
 
 
 
 
 
 
 
 
4203
  "node_modules/ignore": {
4204
  "version": "5.3.2",
4205
  "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -4227,6 +5182,16 @@
4227
  "url": "https://github.com/sponsors/sindresorhus"
4228
  }
4229
  },
 
 
 
 
 
 
 
 
 
 
4230
  "node_modules/imurmurhash": {
4231
  "version": "0.1.4",
4232
  "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -4252,6 +5217,15 @@
4252
  "node": ">= 0.4"
4253
  }
4254
  },
 
 
 
 
 
 
 
 
 
4255
  "node_modules/is-array-buffer": {
4256
  "version": "3.0.5",
4257
  "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
@@ -4818,6 +5792,31 @@
4818
  "node": ">=4.0"
4819
  }
4820
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4821
  "node_modules/keyv": {
4822
  "version": "4.5.4",
4823
  "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -4828,6 +5827,11 @@
4828
  "json-buffer": "3.0.1"
4829
  }
4830
  },
 
 
 
 
 
4831
  "node_modules/language-subtag-registry": {
4832
  "version": "0.3.23",
4833
  "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
@@ -4848,6 +5852,12 @@
4848
  "node": ">=0.10"
4849
  }
4850
  },
 
 
 
 
 
 
4851
  "node_modules/levn": {
4852
  "version": "0.4.1",
4853
  "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -5151,6 +6161,12 @@
5151
  "url": "https://github.com/sponsors/sindresorhus"
5152
  }
5153
  },
 
 
 
 
 
 
5154
  "node_modules/lodash.merge": {
5155
  "version": "4.6.2",
5156
  "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -5200,6 +6216,18 @@
5200
  "@jridgewell/sourcemap-codec": "^1.5.5"
5201
  }
5202
  },
 
 
 
 
 
 
 
 
 
 
 
 
5203
  "node_modules/math-intrinsics": {
5204
  "version": "1.1.0",
5205
  "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -5220,6 +6248,40 @@
5220
  "node": ">= 8"
5221
  }
5222
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5223
  "node_modules/micromatch": {
5224
  "version": "4.0.8",
5225
  "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
@@ -5622,6 +6684,12 @@
5622
  "url": "https://github.com/sponsors/sindresorhus"
5623
  }
5624
  },
 
 
 
 
 
 
5625
  "node_modules/parent-module": {
5626
  "version": "1.0.1",
5627
  "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -5635,6 +6703,12 @@
5635
  "node": ">=6"
5636
  }
5637
  },
 
 
 
 
 
 
5638
  "node_modules/path-exists": {
5639
  "version": "4.0.0",
5640
  "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -5681,6 +6755,22 @@
5681
  "url": "https://github.com/sponsors/jonschlinkert"
5682
  }
5683
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5684
  "node_modules/possible-typed-array-names": {
5685
  "version": "1.1.0",
5686
  "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
@@ -5900,6 +6990,24 @@
5900
  "node": ">=0.10.0"
5901
  }
5902
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5903
  "node_modules/run-parallel": {
5904
  "version": "1.2.0",
5905
  "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -5924,6 +7032,12 @@
5924
  "queue-microtask": "^1.2.2"
5925
  }
5926
  },
 
 
 
 
 
 
5927
  "node_modules/safe-array-concat": {
5928
  "version": "1.1.4",
5929
  "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz",
@@ -5979,6 +7093,12 @@
5979
  "url": "https://github.com/sponsors/ljharb"
5980
  }
5981
  },
 
 
 
 
 
 
5982
  "node_modules/scheduler": {
5983
  "version": "0.27.0",
5984
  "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
@@ -6396,6 +7516,12 @@
6396
  }
6397
  }
6398
  },
 
 
 
 
 
 
6399
  "node_modules/supports-color": {
6400
  "version": "7.2.0",
6401
  "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -6443,6 +7569,15 @@
6443
  "url": "https://opencollective.com/webpack"
6444
  }
6445
  },
 
 
 
 
 
 
 
 
 
6446
  "node_modules/tinyglobby": {
6447
  "version": "0.2.17",
6448
  "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
@@ -6517,6 +7652,15 @@
6517
  "typescript": ">=4.8.4"
6518
  }
6519
  },
 
 
 
 
 
 
 
 
 
6520
  "node_modules/tsconfig-paths": {
6521
  "version": "3.15.0",
6522
  "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
@@ -6782,6 +7926,19 @@
6782
  "punycode": "^2.1.0"
6783
  }
6784
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
6785
  "node_modules/which": {
6786
  "version": "2.0.2",
6787
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
 
10
  "dependencies": {
11
  "framer-motion": "^13.4.4",
12
  "lucide-react": "^1.48.0",
13
+ "mermaid": "^12.1.0",
14
  "next": "16.3.6",
15
  "react": "19.2.8",
16
  "react-dom": "19.2.8"
 
39
  "url": "https://github.com/sponsors/sindresorhus"
40
  }
41
  },
42
+ "node_modules/@antfu/install-pkg": {
43
+ "version": "2.1.0",
44
+ "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-2.1.0.tgz",
45
+ "integrity": "sha512-sdg9NxU3zR4Mnawfbc/x6GB5Wf17WYud5qOuEuxXjaKpYpMkISSJEjItGebXJ2bQ4DIcly4NYH23mtkGJjvKUw==",
46
+ "license": "MIT",
47
+ "dependencies": {
48
+ "package-manager-detector": "^1.8.0",
49
+ "tinyexec": "^1.3.1"
50
+ },
51
+ "funding": {
52
+ "url": "https://github.com/sponsors/antfu"
53
+ }
54
+ },
55
  "node_modules/@babel/code-frame": {
56
  "version": "7.29.7",
57
  "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
 
292
  "node": ">=6.9.0"
293
  }
294
  },
295
+ "node_modules/@braintree/sanitize-url": {
296
+ "version": "7.1.2",
297
+ "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz",
298
+ "integrity": "sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==",
299
+ "license": "MIT"
300
+ },
301
+ "node_modules/@chevrotain/cst-dts-gen": {
302
+ "version": "13.2.0",
303
+ "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-13.2.0.tgz",
304
+ "integrity": "sha512-bA9dvWlhAUcHkNwU+8w9yiUxJPlj/Lm3VqS7MD+NbIR/7LmpNLuK/AWNFdCo/T3SK5ND0/UHf3IJvl/Jn/i6yg==",
305
+ "license": "Apache-2.0",
306
+ "dependencies": {
307
+ "@chevrotain/gast": "13.2.0",
308
+ "@chevrotain/types": "13.2.0"
309
+ }
310
+ },
311
+ "node_modules/@chevrotain/gast": {
312
+ "version": "13.2.0",
313
+ "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-13.2.0.tgz",
314
+ "integrity": "sha512-bCARdAsG+eEbOveSXcOAC7pVxA04I1ionzeMOwIYf5NX7SaS7zgn4Dgug2BSqoL+iyKeMNSorQjsFSHJHsCNwg==",
315
+ "license": "Apache-2.0",
316
+ "dependencies": {
317
+ "@chevrotain/types": "13.2.0"
318
+ }
319
+ },
320
+ "node_modules/@chevrotain/regexp-to-ast": {
321
+ "version": "13.2.0",
322
+ "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-13.2.0.tgz",
323
+ "integrity": "sha512-kxpUkLtiaK09ph+dib+Yvm+3sWSnuwlo25gqfKRgTPNmF6H7uW4gVkMjaRdtnN783S9sM6vUNWh9CsxYX4QwKw==",
324
+ "license": "Apache-2.0"
325
+ },
326
+ "node_modules/@chevrotain/types": {
327
+ "version": "13.2.0",
328
+ "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-13.2.0.tgz",
329
+ "integrity": "sha512-7qrYHRlKfWf2AvBfJi5eVOrKAkbxvMFsy/iIHTGIiApNcEecCaVIdR+mIQhyCBsTDJxBz4JWXHMo6krbhR9hVg==",
330
+ "license": "Apache-2.0"
331
+ },
332
+ "node_modules/@chevrotain/utils": {
333
+ "version": "13.2.0",
334
+ "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-13.2.0.tgz",
335
+ "integrity": "sha512-SzKYY68rseOrb9KILVzPsl6SjkQtdWw01SRGB5aCVI5kFcHltQsOYV3JB0Ffst72DgkvHCyDQ0NLwxtmCCf97Q==",
336
+ "license": "Apache-2.0"
337
+ },
338
  "node_modules/@emnapi/core": {
339
  "version": "1.10.0",
340
  "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz",
 
578
  "url": "https://github.com/sponsors/nzakas"
579
  }
580
  },
581
+ "node_modules/@iconify/types": {
582
+ "version": "2.0.0",
583
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
584
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
585
+ "license": "MIT"
586
+ },
587
+ "node_modules/@iconify/utils": {
588
+ "version": "3.1.7",
589
+ "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.7.tgz",
590
+ "integrity": "sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w==",
591
+ "license": "MIT",
592
+ "dependencies": {
593
+ "@antfu/install-pkg": "^2.0.1",
594
+ "@iconify/types": "^2.0.0",
595
+ "import-meta-resolve": "^4.2.0"
596
+ }
597
+ },
598
  "node_modules/@img/colour": {
599
  "version": "1.1.0",
600
  "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
 
1194
  "@jridgewell/sourcemap-codec": "^1.4.14"
1195
  }
1196
  },
1197
+ "node_modules/@mermaid-js/parser": {
1198
+ "version": "2.0.1",
1199
+ "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-2.0.1.tgz",
1200
+ "integrity": "sha512-j37dj/h6p6pots1L7pLPPNuABEEu9WP4OYg9pW1g+nYG331j0+3canE9OagtYdytYvdSAMG+2fKU5cxep6LgjA==",
1201
+ "license": "MIT",
1202
+ "dependencies": {
1203
+ "@chevrotain/types": "~13.2.0"
1204
+ },
1205
+ "engines": {
1206
+ "node": ">=22.12.0"
1207
+ }
1208
+ },
1209
  "node_modules/@napi-rs/wasm-runtime": {
1210
  "version": "1.2.4",
1211
  "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz",
 
1775
  "tslib": "^2.4.0"
1776
  }
1777
  },
1778
+ "node_modules/@types/d3": {
1779
+ "version": "7.4.3",
1780
+ "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz",
1781
+ "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",
1782
+ "license": "MIT",
1783
+ "dependencies": {
1784
+ "@types/d3-array": "*",
1785
+ "@types/d3-axis": "*",
1786
+ "@types/d3-brush": "*",
1787
+ "@types/d3-chord": "*",
1788
+ "@types/d3-color": "*",
1789
+ "@types/d3-contour": "*",
1790
+ "@types/d3-delaunay": "*",
1791
+ "@types/d3-dispatch": "*",
1792
+ "@types/d3-drag": "*",
1793
+ "@types/d3-dsv": "*",
1794
+ "@types/d3-ease": "*",
1795
+ "@types/d3-fetch": "*",
1796
+ "@types/d3-force": "*",
1797
+ "@types/d3-format": "*",
1798
+ "@types/d3-geo": "*",
1799
+ "@types/d3-hierarchy": "*",
1800
+ "@types/d3-interpolate": "*",
1801
+ "@types/d3-path": "*",
1802
+ "@types/d3-polygon": "*",
1803
+ "@types/d3-quadtree": "*",
1804
+ "@types/d3-random": "*",
1805
+ "@types/d3-scale": "*",
1806
+ "@types/d3-scale-chromatic": "*",
1807
+ "@types/d3-selection": "*",
1808
+ "@types/d3-shape": "*",
1809
+ "@types/d3-time": "*",
1810
+ "@types/d3-time-format": "*",
1811
+ "@types/d3-timer": "*",
1812
+ "@types/d3-transition": "*",
1813
+ "@types/d3-zoom": "*"
1814
+ }
1815
+ },
1816
+ "node_modules/@types/d3-array": {
1817
+ "version": "3.2.2",
1818
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",
1819
+ "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==",
1820
+ "license": "MIT"
1821
+ },
1822
+ "node_modules/@types/d3-axis": {
1823
+ "version": "3.0.6",
1824
+ "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz",
1825
+ "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",
1826
+ "license": "MIT",
1827
+ "dependencies": {
1828
+ "@types/d3-selection": "*"
1829
+ }
1830
+ },
1831
+ "node_modules/@types/d3-brush": {
1832
+ "version": "3.0.6",
1833
+ "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz",
1834
+ "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",
1835
+ "license": "MIT",
1836
+ "dependencies": {
1837
+ "@types/d3-selection": "*"
1838
+ }
1839
+ },
1840
+ "node_modules/@types/d3-chord": {
1841
+ "version": "3.0.6",
1842
+ "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz",
1843
+ "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==",
1844
+ "license": "MIT"
1845
+ },
1846
+ "node_modules/@types/d3-color": {
1847
+ "version": "3.1.3",
1848
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
1849
+ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
1850
+ "license": "MIT"
1851
+ },
1852
+ "node_modules/@types/d3-contour": {
1853
+ "version": "3.0.6",
1854
+ "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz",
1855
+ "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",
1856
+ "license": "MIT",
1857
+ "dependencies": {
1858
+ "@types/d3-array": "*",
1859
+ "@types/geojson": "*"
1860
+ }
1861
+ },
1862
+ "node_modules/@types/d3-delaunay": {
1863
+ "version": "6.0.4",
1864
+ "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
1865
+ "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==",
1866
+ "license": "MIT"
1867
+ },
1868
+ "node_modules/@types/d3-dispatch": {
1869
+ "version": "3.0.7",
1870
+ "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz",
1871
+ "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==",
1872
+ "license": "MIT"
1873
+ },
1874
+ "node_modules/@types/d3-drag": {
1875
+ "version": "3.0.7",
1876
+ "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz",
1877
+ "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==",
1878
+ "license": "MIT",
1879
+ "dependencies": {
1880
+ "@types/d3-selection": "*"
1881
+ }
1882
+ },
1883
+ "node_modules/@types/d3-dsv": {
1884
+ "version": "3.0.7",
1885
+ "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",
1886
+ "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==",
1887
+ "license": "MIT"
1888
+ },
1889
+ "node_modules/@types/d3-ease": {
1890
+ "version": "3.0.2",
1891
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
1892
+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
1893
+ "license": "MIT"
1894
+ },
1895
+ "node_modules/@types/d3-fetch": {
1896
+ "version": "3.0.7",
1897
+ "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",
1898
+ "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",
1899
+ "license": "MIT",
1900
+ "dependencies": {
1901
+ "@types/d3-dsv": "*"
1902
+ }
1903
+ },
1904
+ "node_modules/@types/d3-force": {
1905
+ "version": "3.0.10",
1906
+ "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz",
1907
+ "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==",
1908
+ "license": "MIT"
1909
+ },
1910
+ "node_modules/@types/d3-format": {
1911
+ "version": "3.0.4",
1912
+ "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz",
1913
+ "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==",
1914
+ "license": "MIT"
1915
+ },
1916
+ "node_modules/@types/d3-geo": {
1917
+ "version": "3.1.1",
1918
+ "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.1.tgz",
1919
+ "integrity": "sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w==",
1920
+ "license": "MIT",
1921
+ "dependencies": {
1922
+ "@types/geojson": "*"
1923
+ }
1924
+ },
1925
+ "node_modules/@types/d3-hierarchy": {
1926
+ "version": "3.1.7",
1927
+ "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz",
1928
+ "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==",
1929
+ "license": "MIT"
1930
+ },
1931
+ "node_modules/@types/d3-interpolate": {
1932
+ "version": "3.0.4",
1933
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
1934
+ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
1935
+ "license": "MIT",
1936
+ "dependencies": {
1937
+ "@types/d3-color": "*"
1938
+ }
1939
+ },
1940
+ "node_modules/@types/d3-path": {
1941
+ "version": "3.1.1",
1942
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",
1943
+ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",
1944
+ "license": "MIT"
1945
+ },
1946
+ "node_modules/@types/d3-polygon": {
1947
+ "version": "3.0.2",
1948
+ "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz",
1949
+ "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==",
1950
+ "license": "MIT"
1951
+ },
1952
+ "node_modules/@types/d3-quadtree": {
1953
+ "version": "3.0.6",
1954
+ "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",
1955
+ "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==",
1956
+ "license": "MIT"
1957
+ },
1958
+ "node_modules/@types/d3-random": {
1959
+ "version": "3.0.4",
1960
+ "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.4.tgz",
1961
+ "integrity": "sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA==",
1962
+ "license": "MIT"
1963
+ },
1964
+ "node_modules/@types/d3-scale": {
1965
+ "version": "4.0.9",
1966
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",
1967
+ "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
1968
+ "license": "MIT",
1969
+ "dependencies": {
1970
+ "@types/d3-time": "*"
1971
+ }
1972
+ },
1973
+ "node_modules/@types/d3-scale-chromatic": {
1974
+ "version": "3.1.0",
1975
+ "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
1976
+ "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==",
1977
+ "license": "MIT"
1978
+ },
1979
+ "node_modules/@types/d3-selection": {
1980
+ "version": "3.0.12",
1981
+ "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.12.tgz",
1982
+ "integrity": "sha512-Qe/KWYhEiIIxGs7HrAAjMfShxKldx19SJtr5zu53f3afPsdZNz7HHtdTLXo/kqeiWNXVycI24kSnfzBYkTzpgw==",
1983
+ "license": "MIT"
1984
+ },
1985
+ "node_modules/@types/d3-shape": {
1986
+ "version": "3.2.0",
1987
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.2.0.tgz",
1988
+ "integrity": "sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw==",
1989
+ "license": "MIT",
1990
+ "dependencies": {
1991
+ "@types/d3-path": "*"
1992
+ }
1993
+ },
1994
+ "node_modules/@types/d3-time": {
1995
+ "version": "3.0.4",
1996
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",
1997
+ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
1998
+ "license": "MIT"
1999
+ },
2000
+ "node_modules/@types/d3-time-format": {
2001
+ "version": "4.0.3",
2002
+ "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz",
2003
+ "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==",
2004
+ "license": "MIT"
2005
+ },
2006
+ "node_modules/@types/d3-timer": {
2007
+ "version": "3.0.2",
2008
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
2009
+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
2010
+ "license": "MIT"
2011
+ },
2012
+ "node_modules/@types/d3-transition": {
2013
+ "version": "3.0.9",
2014
+ "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz",
2015
+ "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==",
2016
+ "license": "MIT",
2017
+ "dependencies": {
2018
+ "@types/d3-selection": "*"
2019
+ }
2020
+ },
2021
+ "node_modules/@types/d3-zoom": {
2022
+ "version": "3.0.9",
2023
+ "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.9.tgz",
2024
+ "integrity": "sha512-0sE1406XBYJGiqD3AusTl9ZqC//2mIXix51tbom25gDCA8ri4xnSZg28CaSE8Srl6FClqABUKfsn0qghgdepMA==",
2025
+ "license": "MIT",
2026
+ "dependencies": {
2027
+ "@types/d3-interpolate": "*",
2028
+ "@types/d3-selection": "*"
2029
+ }
2030
+ },
2031
  "node_modules/@types/estree": {
2032
  "version": "1.0.9",
2033
  "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
 
2035
  "dev": true,
2036
  "license": "MIT"
2037
  },
2038
+ "node_modules/@types/geojson": {
2039
+ "version": "7946.0.16",
2040
+ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz",
2041
+ "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",
2042
+ "license": "MIT"
2043
+ },
2044
  "node_modules/@types/json-schema": {
2045
  "version": "7.0.15",
2046
  "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
 
2085
  "@types/react": "^19.3.0"
2086
  }
2087
  },
2088
+ "node_modules/@types/trusted-types": {
2089
+ "version": "2.0.7",
2090
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
2091
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
2092
+ "license": "MIT",
2093
+ "optional": true
2094
+ },
2095
  "node_modules/@typescript-eslint/eslint-plugin": {
2096
  "version": "8.70.1",
2097
  "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.70.1.tgz",
 
2741
  "win32"
2742
  ]
2743
  },
2744
+ "node_modules/@upsetjs/venn.js": {
2745
+ "version": "2.0.0",
2746
+ "resolved": "https://registry.npmjs.org/@upsetjs/venn.js/-/venn.js-2.0.0.tgz",
2747
+ "integrity": "sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==",
2748
+ "license": "MIT",
2749
+ "optionalDependencies": {
2750
+ "d3-selection": "^3.0.0",
2751
+ "d3-transition": "^3.0.1"
2752
+ }
2753
+ },
2754
  "node_modules/acorn": {
2755
  "version": "8.18.0",
2756
  "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
 
3111
  "browserslist": "cli.js"
3112
  },
3113
  "engines": {
3114
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
3115
+ }
3116
+ },
3117
+ "node_modules/call-bind": {
3118
+ "version": "1.0.9",
3119
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz",
3120
+ "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==",
3121
+ "dev": true,
3122
+ "license": "MIT",
3123
+ "dependencies": {
3124
+ "call-bind-apply-helpers": "^1.0.2",
3125
+ "es-define-property": "^1.0.1",
3126
+ "get-intrinsic": "^1.3.0",
3127
+ "set-function-length": "^1.2.2"
3128
+ },
3129
+ "engines": {
3130
+ "node": ">= 0.4"
3131
+ },
3132
+ "funding": {
3133
+ "url": "https://github.com/sponsors/ljharb"
3134
+ }
3135
+ },
3136
+ "node_modules/call-bind-apply-helpers": {
3137
+ "version": "1.0.2",
3138
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
3139
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
3140
+ "dev": true,
3141
+ "license": "MIT",
3142
+ "dependencies": {
3143
+ "es-errors": "^1.3.0",
3144
+ "function-bind": "^1.1.2"
3145
+ },
3146
+ "engines": {
3147
+ "node": ">= 0.4"
3148
+ }
3149
+ },
3150
+ "node_modules/call-bound": {
3151
+ "version": "1.0.4",
3152
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
3153
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
3154
+ "dev": true,
3155
+ "license": "MIT",
3156
+ "dependencies": {
3157
+ "call-bind-apply-helpers": "^1.0.2",
3158
+ "get-intrinsic": "^1.3.0"
3159
+ },
3160
+ "engines": {
3161
+ "node": ">= 0.4"
3162
+ },
3163
+ "funding": {
3164
+ "url": "https://github.com/sponsors/ljharb"
3165
+ }
3166
+ },
3167
+ "node_modules/callsites": {
3168
+ "version": "3.1.0",
3169
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
3170
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
3171
+ "dev": true,
3172
+ "license": "MIT",
3173
+ "engines": {
3174
+ "node": ">=6"
3175
+ }
3176
+ },
3177
+ "node_modules/caniuse-lite": {
3178
+ "version": "1.0.30001812",
3179
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001812.tgz",
3180
+ "integrity": "sha512-qN+QNNBr93TCmFrmte0bBCjSDMuRvt78VlHT99qIGPszm4QsqCX8lnyWUFkHi8B7ZBAPq8SH+UqyXNy/odMdng==",
3181
+ "funding": [
3182
+ {
3183
+ "type": "opencollective",
3184
+ "url": "https://opencollective.com/browserslist"
3185
+ },
3186
+ {
3187
+ "type": "tidelift",
3188
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
3189
+ },
3190
+ {
3191
+ "type": "github",
3192
+ "url": "https://github.com/sponsors/ai"
3193
+ }
3194
+ ],
3195
+ "license": "CC-BY-4.0"
3196
+ },
3197
+ "node_modules/chalk": {
3198
+ "version": "4.1.2",
3199
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
3200
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
3201
+ "dev": true,
3202
+ "license": "MIT",
3203
+ "dependencies": {
3204
+ "ansi-styles": "^4.1.0",
3205
+ "supports-color": "^7.1.0"
3206
+ },
3207
+ "engines": {
3208
+ "node": ">=10"
3209
+ },
3210
+ "funding": {
3211
+ "url": "https://github.com/chalk/chalk?sponsor=1"
3212
+ }
3213
+ },
3214
+ "node_modules/chevrotain": {
3215
+ "version": "13.2.0",
3216
+ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-13.2.0.tgz",
3217
+ "integrity": "sha512-GTouk5YzgBxlTPCaDn5q0q2EJKkrYmnPF+HmF8v0Qo4r3iyPG7HJivkN1wthCXZcm3sIcZFpGTRovLPNdJNRCA==",
3218
+ "license": "Apache-2.0",
3219
+ "dependencies": {
3220
+ "@chevrotain/cst-dts-gen": "13.2.0",
3221
+ "@chevrotain/gast": "13.2.0",
3222
+ "@chevrotain/regexp-to-ast": "13.2.0",
3223
+ "@chevrotain/types": "13.2.0",
3224
+ "@chevrotain/utils": "13.2.0"
3225
+ },
3226
+ "engines": {
3227
+ "node": ">=22.0.0"
3228
+ }
3229
+ },
3230
+ "node_modules/client-only": {
3231
+ "version": "0.0.1",
3232
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
3233
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
3234
+ "license": "MIT"
3235
+ },
3236
+ "node_modules/color-convert": {
3237
+ "version": "2.0.1",
3238
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
3239
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
3240
+ "dev": true,
3241
+ "license": "MIT",
3242
+ "dependencies": {
3243
+ "color-name": "~1.1.4"
3244
+ },
3245
+ "engines": {
3246
+ "node": ">=7.0.0"
3247
+ }
3248
+ },
3249
+ "node_modules/color-name": {
3250
+ "version": "1.1.4",
3251
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
3252
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
3253
+ "dev": true,
3254
+ "license": "MIT"
3255
+ },
3256
+ "node_modules/commander": {
3257
+ "version": "7.2.0",
3258
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
3259
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
3260
+ "license": "MIT",
3261
+ "engines": {
3262
+ "node": ">= 10"
3263
+ }
3264
+ },
3265
+ "node_modules/concat-map": {
3266
+ "version": "0.0.1",
3267
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
3268
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
3269
+ "dev": true,
3270
+ "license": "MIT"
3271
+ },
3272
+ "node_modules/convert-source-map": {
3273
+ "version": "2.0.0",
3274
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
3275
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
3276
+ "dev": true,
3277
+ "license": "MIT"
3278
+ },
3279
+ "node_modules/cose-base": {
3280
+ "version": "1.0.3",
3281
+ "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz",
3282
+ "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==",
3283
+ "license": "MIT",
3284
+ "dependencies": {
3285
+ "layout-base": "^1.0.0"
3286
+ }
3287
+ },
3288
+ "node_modules/cross-spawn": {
3289
+ "version": "7.0.6",
3290
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
3291
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
3292
+ "dev": true,
3293
+ "license": "MIT",
3294
+ "dependencies": {
3295
+ "path-key": "^3.1.0",
3296
+ "shebang-command": "^2.0.0",
3297
+ "which": "^2.0.1"
3298
+ },
3299
+ "engines": {
3300
+ "node": ">= 8"
3301
+ }
3302
+ },
3303
+ "node_modules/csstype": {
3304
+ "version": "3.2.3",
3305
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
3306
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
3307
+ "dev": true,
3308
+ "license": "MIT"
3309
+ },
3310
+ "node_modules/cytoscape": {
3311
+ "version": "3.34.3",
3312
+ "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.3.tgz",
3313
+ "integrity": "sha512-yfYGhRcGAntq6YBD583j4n0Eg3jIxvWmZtz/5uz9UYkeIStSlMxuUja+ec5j3iBD8nv1rwaOAYMW09tBdkSeaQ==",
3314
+ "license": "MIT",
3315
+ "engines": {
3316
+ "node": ">=0.10"
3317
+ }
3318
+ },
3319
+ "node_modules/cytoscape-cose-bilkent": {
3320
+ "version": "4.1.0",
3321
+ "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz",
3322
+ "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==",
3323
+ "license": "MIT",
3324
+ "dependencies": {
3325
+ "cose-base": "^1.0.0"
3326
+ },
3327
+ "peerDependencies": {
3328
+ "cytoscape": "^3.2.0"
3329
+ }
3330
+ },
3331
+ "node_modules/cytoscape-fcose": {
3332
+ "version": "2.2.0",
3333
+ "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz",
3334
+ "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==",
3335
+ "license": "MIT",
3336
+ "dependencies": {
3337
+ "cose-base": "^2.2.0"
3338
+ },
3339
+ "peerDependencies": {
3340
+ "cytoscape": "^3.2.0"
3341
+ }
3342
+ },
3343
+ "node_modules/cytoscape-fcose/node_modules/cose-base": {
3344
+ "version": "2.2.0",
3345
+ "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz",
3346
+ "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==",
3347
+ "license": "MIT",
3348
+ "dependencies": {
3349
+ "layout-base": "^2.0.0"
3350
+ }
3351
+ },
3352
+ "node_modules/cytoscape-fcose/node_modules/layout-base": {
3353
+ "version": "2.0.1",
3354
+ "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz",
3355
+ "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==",
3356
+ "license": "MIT"
3357
+ },
3358
+ "node_modules/d3": {
3359
+ "version": "7.9.0",
3360
+ "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz",
3361
+ "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",
3362
+ "license": "ISC",
3363
+ "dependencies": {
3364
+ "d3-array": "3",
3365
+ "d3-axis": "3",
3366
+ "d3-brush": "3",
3367
+ "d3-chord": "3",
3368
+ "d3-color": "3",
3369
+ "d3-contour": "4",
3370
+ "d3-delaunay": "6",
3371
+ "d3-dispatch": "3",
3372
+ "d3-drag": "3",
3373
+ "d3-dsv": "3",
3374
+ "d3-ease": "3",
3375
+ "d3-fetch": "3",
3376
+ "d3-force": "3",
3377
+ "d3-format": "3",
3378
+ "d3-geo": "3",
3379
+ "d3-hierarchy": "3",
3380
+ "d3-interpolate": "3",
3381
+ "d3-path": "3",
3382
+ "d3-polygon": "3",
3383
+ "d3-quadtree": "3",
3384
+ "d3-random": "3",
3385
+ "d3-scale": "4",
3386
+ "d3-scale-chromatic": "3",
3387
+ "d3-selection": "3",
3388
+ "d3-shape": "3",
3389
+ "d3-time": "3",
3390
+ "d3-time-format": "4",
3391
+ "d3-timer": "3",
3392
+ "d3-transition": "3",
3393
+ "d3-zoom": "3"
3394
+ },
3395
+ "engines": {
3396
+ "node": ">=12"
3397
+ }
3398
+ },
3399
+ "node_modules/d3-array": {
3400
+ "version": "3.2.4",
3401
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
3402
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
3403
+ "license": "ISC",
3404
+ "dependencies": {
3405
+ "internmap": "1 - 2"
3406
+ },
3407
+ "engines": {
3408
+ "node": ">=12"
3409
+ }
3410
+ },
3411
+ "node_modules/d3-axis": {
3412
+ "version": "3.0.0",
3413
+ "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",
3414
+ "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==",
3415
+ "license": "ISC",
3416
+ "engines": {
3417
+ "node": ">=12"
3418
+ }
3419
+ },
3420
+ "node_modules/d3-brush": {
3421
+ "version": "3.0.0",
3422
+ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",
3423
+ "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
3424
+ "license": "ISC",
3425
+ "dependencies": {
3426
+ "d3-dispatch": "1 - 3",
3427
+ "d3-drag": "2 - 3",
3428
+ "d3-interpolate": "1 - 3",
3429
+ "d3-selection": "3",
3430
+ "d3-transition": "3"
3431
+ },
3432
+ "engines": {
3433
+ "node": ">=12"
3434
+ }
3435
+ },
3436
+ "node_modules/d3-chord": {
3437
+ "version": "3.0.1",
3438
+ "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",
3439
+ "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
3440
+ "license": "ISC",
3441
+ "dependencies": {
3442
+ "d3-path": "1 - 3"
3443
+ },
3444
+ "engines": {
3445
+ "node": ">=12"
3446
+ }
3447
+ },
3448
+ "node_modules/d3-color": {
3449
+ "version": "3.1.0",
3450
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
3451
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
3452
+ "license": "ISC",
3453
+ "engines": {
3454
+ "node": ">=12"
3455
+ }
3456
+ },
3457
+ "node_modules/d3-contour": {
3458
+ "version": "4.0.2",
3459
+ "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz",
3460
+ "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
3461
+ "license": "ISC",
3462
+ "dependencies": {
3463
+ "d3-array": "^3.2.0"
3464
+ },
3465
+ "engines": {
3466
+ "node": ">=12"
3467
+ }
3468
+ },
3469
+ "node_modules/d3-delaunay": {
3470
+ "version": "6.0.4",
3471
+ "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
3472
+ "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",
3473
+ "license": "ISC",
3474
+ "dependencies": {
3475
+ "delaunator": "5"
3476
+ },
3477
+ "engines": {
3478
+ "node": ">=12"
3479
+ }
3480
+ },
3481
+ "node_modules/d3-dispatch": {
3482
+ "version": "3.0.1",
3483
+ "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
3484
+ "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
3485
+ "license": "ISC",
3486
+ "engines": {
3487
+ "node": ">=12"
3488
+ }
3489
+ },
3490
+ "node_modules/d3-drag": {
3491
+ "version": "3.0.0",
3492
+ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
3493
+ "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
3494
+ "license": "ISC",
3495
+ "dependencies": {
3496
+ "d3-dispatch": "1 - 3",
3497
+ "d3-selection": "3"
3498
+ },
3499
+ "engines": {
3500
+ "node": ">=12"
3501
+ }
3502
+ },
3503
+ "node_modules/d3-dsv": {
3504
+ "version": "3.0.1",
3505
+ "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",
3506
+ "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
3507
+ "license": "ISC",
3508
+ "dependencies": {
3509
+ "commander": "7",
3510
+ "iconv-lite": "0.6",
3511
+ "rw": "1"
3512
+ },
3513
+ "bin": {
3514
+ "csv2json": "bin/dsv2json.js",
3515
+ "csv2tsv": "bin/dsv2dsv.js",
3516
+ "dsv2dsv": "bin/dsv2dsv.js",
3517
+ "dsv2json": "bin/dsv2json.js",
3518
+ "json2csv": "bin/json2dsv.js",
3519
+ "json2dsv": "bin/json2dsv.js",
3520
+ "json2tsv": "bin/json2dsv.js",
3521
+ "tsv2csv": "bin/dsv2dsv.js",
3522
+ "tsv2json": "bin/dsv2json.js"
3523
+ },
3524
+ "engines": {
3525
+ "node": ">=12"
3526
+ }
3527
+ },
3528
+ "node_modules/d3-ease": {
3529
+ "version": "3.0.1",
3530
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
3531
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
3532
+ "license": "BSD-3-Clause",
3533
+ "engines": {
3534
+ "node": ">=12"
3535
+ }
3536
+ },
3537
+ "node_modules/d3-fetch": {
3538
+ "version": "3.0.1",
3539
+ "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",
3540
+ "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
3541
+ "license": "ISC",
3542
+ "dependencies": {
3543
+ "d3-dsv": "1 - 3"
3544
+ },
3545
+ "engines": {
3546
+ "node": ">=12"
3547
+ }
3548
+ },
3549
+ "node_modules/d3-force": {
3550
+ "version": "3.0.0",
3551
+ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
3552
+ "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
3553
+ "license": "ISC",
3554
+ "dependencies": {
3555
+ "d3-dispatch": "1 - 3",
3556
+ "d3-quadtree": "1 - 3",
3557
+ "d3-timer": "1 - 3"
3558
+ },
3559
+ "engines": {
3560
+ "node": ">=12"
3561
+ }
3562
+ },
3563
+ "node_modules/d3-format": {
3564
+ "version": "3.1.2",
3565
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz",
3566
+ "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==",
3567
+ "license": "ISC",
3568
+ "engines": {
3569
+ "node": ">=12"
3570
+ }
3571
+ },
3572
+ "node_modules/d3-geo": {
3573
+ "version": "3.1.1",
3574
+ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz",
3575
+ "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==",
3576
+ "license": "ISC",
3577
+ "dependencies": {
3578
+ "d3-array": "2.5.0 - 3"
3579
+ },
3580
+ "engines": {
3581
+ "node": ">=12"
3582
+ }
3583
+ },
3584
+ "node_modules/d3-hierarchy": {
3585
+ "version": "3.1.2",
3586
+ "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
3587
+ "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
3588
+ "license": "ISC",
3589
+ "engines": {
3590
+ "node": ">=12"
3591
+ }
3592
+ },
3593
+ "node_modules/d3-interpolate": {
3594
+ "version": "3.0.1",
3595
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
3596
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
3597
+ "license": "ISC",
3598
+ "dependencies": {
3599
+ "d3-color": "1 - 3"
3600
+ },
3601
+ "engines": {
3602
+ "node": ">=12"
3603
+ }
3604
+ },
3605
+ "node_modules/d3-path": {
3606
+ "version": "3.1.0",
3607
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
3608
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
3609
+ "license": "ISC",
3610
+ "engines": {
3611
+ "node": ">=12"
3612
+ }
3613
+ },
3614
+ "node_modules/d3-polygon": {
3615
+ "version": "3.0.1",
3616
+ "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",
3617
+ "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",
3618
+ "license": "ISC",
3619
+ "engines": {
3620
+ "node": ">=12"
3621
+ }
3622
+ },
3623
+ "node_modules/d3-quadtree": {
3624
+ "version": "3.0.1",
3625
+ "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
3626
+ "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
3627
+ "license": "ISC",
3628
+ "engines": {
3629
+ "node": ">=12"
3630
+ }
3631
+ },
3632
+ "node_modules/d3-random": {
3633
+ "version": "3.0.1",
3634
+ "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",
3635
+ "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",
3636
+ "license": "ISC",
3637
+ "engines": {
3638
+ "node": ">=12"
3639
+ }
3640
+ },
3641
+ "node_modules/d3-sankey": {
3642
+ "version": "0.12.3",
3643
+ "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz",
3644
+ "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==",
3645
+ "license": "BSD-3-Clause",
3646
+ "dependencies": {
3647
+ "d3-array": "1 - 2",
3648
+ "d3-shape": "^1.2.0"
3649
+ }
3650
+ },
3651
+ "node_modules/d3-sankey/node_modules/d3-array": {
3652
+ "version": "2.12.1",
3653
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz",
3654
+ "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==",
3655
+ "license": "BSD-3-Clause",
3656
+ "dependencies": {
3657
+ "internmap": "^1.0.0"
3658
+ }
3659
+ },
3660
+ "node_modules/d3-sankey/node_modules/d3-path": {
3661
+ "version": "1.0.9",
3662
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
3663
+ "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==",
3664
+ "license": "BSD-3-Clause"
3665
+ },
3666
+ "node_modules/d3-sankey/node_modules/d3-shape": {
3667
+ "version": "1.3.7",
3668
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
3669
+ "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
3670
+ "license": "BSD-3-Clause",
3671
+ "dependencies": {
3672
+ "d3-path": "1"
3673
+ }
3674
+ },
3675
+ "node_modules/d3-sankey/node_modules/internmap": {
3676
+ "version": "1.0.1",
3677
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz",
3678
+ "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==",
3679
+ "license": "ISC"
3680
+ },
3681
+ "node_modules/d3-scale": {
3682
+ "version": "4.0.2",
3683
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
3684
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
3685
+ "license": "ISC",
3686
+ "dependencies": {
3687
+ "d3-array": "2.10.0 - 3",
3688
+ "d3-format": "1 - 3",
3689
+ "d3-interpolate": "1.2.0 - 3",
3690
+ "d3-time": "2.1.1 - 3",
3691
+ "d3-time-format": "2 - 4"
3692
+ },
3693
+ "engines": {
3694
+ "node": ">=12"
3695
+ }
3696
+ },
3697
+ "node_modules/d3-scale-chromatic": {
3698
+ "version": "3.1.0",
3699
+ "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
3700
+ "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",
3701
+ "license": "ISC",
3702
+ "dependencies": {
3703
+ "d3-color": "1 - 3",
3704
+ "d3-interpolate": "1 - 3"
3705
+ },
3706
+ "engines": {
3707
+ "node": ">=12"
3708
  }
3709
  },
3710
+ "node_modules/d3-selection": {
3711
+ "version": "3.0.0",
3712
+ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
3713
+ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
3714
+ "license": "ISC",
3715
+ "engines": {
3716
+ "node": ">=12"
3717
+ }
3718
+ },
3719
+ "node_modules/d3-shape": {
3720
+ "version": "3.2.0",
3721
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
3722
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
3723
+ "license": "ISC",
3724
  "dependencies": {
3725
+ "d3-path": "^3.1.0"
 
 
 
3726
  },
3727
  "engines": {
3728
+ "node": ">=12"
 
 
 
3729
  }
3730
  },
3731
+ "node_modules/d3-time": {
3732
+ "version": "3.1.0",
3733
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
3734
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
3735
+ "license": "ISC",
 
3736
  "dependencies": {
3737
+ "d3-array": "2 - 3"
 
3738
  },
3739
  "engines": {
3740
+ "node": ">=12"
3741
  }
3742
  },
3743
+ "node_modules/d3-time-format": {
3744
+ "version": "4.1.0",
3745
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
3746
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
3747
+ "license": "ISC",
 
3748
  "dependencies": {
3749
+ "d3-time": "1 - 3"
 
3750
  },
3751
  "engines": {
3752
+ "node": ">=12"
 
 
 
3753
  }
3754
  },
3755
+ "node_modules/d3-timer": {
3756
+ "version": "3.0.1",
3757
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
3758
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
3759
+ "license": "ISC",
 
3760
  "engines": {
3761
+ "node": ">=12"
3762
  }
3763
  },
3764
+ "node_modules/d3-transition": {
3765
+ "version": "3.0.1",
3766
+ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
3767
+ "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
3768
+ "license": "ISC",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3769
  "dependencies": {
3770
+ "d3-color": "1 - 3",
3771
+ "d3-dispatch": "1 - 3",
3772
+ "d3-ease": "1 - 3",
3773
+ "d3-interpolate": "1 - 3",
3774
+ "d3-timer": "1 - 3"
3775
  },
3776
  "engines": {
3777
+ "node": ">=12"
3778
  },
3779
+ "peerDependencies": {
3780
+ "d3-selection": "2 - 3"
3781
  }
3782
  },
3783
+ "node_modules/d3-zoom": {
3784
+ "version": "3.0.0",
3785
+ "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
3786
+ "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
3787
+ "license": "ISC",
 
 
 
 
 
 
 
3788
  "dependencies": {
3789
+ "d3-dispatch": "1 - 3",
3790
+ "d3-drag": "2 - 3",
3791
+ "d3-interpolate": "1 - 3",
3792
+ "d3-selection": "2 - 3",
3793
+ "d3-transition": "2 - 3"
3794
  },
3795
  "engines": {
3796
+ "node": ">=12"
3797
  }
3798
  },
3799
+ "node_modules/dagre-d3-es": {
3800
+ "version": "7.0.14",
3801
+ "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz",
3802
+ "integrity": "sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3803
  "license": "MIT",
3804
  "dependencies": {
3805
+ "d3": "^7.9.0",
3806
+ "lodash-es": "^4.17.21"
 
 
 
 
3807
  }
3808
  },
 
 
 
 
 
 
 
3809
  "node_modules/damerau-levenshtein": {
3810
  "version": "1.0.8",
3811
  "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
 
3867
  "url": "https://github.com/sponsors/ljharb"
3868
  }
3869
  },
3870
+ "node_modules/dayjs": {
3871
+ "version": "1.11.23",
3872
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz",
3873
+ "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==",
3874
+ "license": "MIT"
3875
+ },
3876
  "node_modules/debug": {
3877
  "version": "4.4.3",
3878
  "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
 
3934
  "url": "https://github.com/sponsors/ljharb"
3935
  }
3936
  },
3937
+ "node_modules/delaunator": {
3938
+ "version": "5.1.0",
3939
+ "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz",
3940
+ "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==",
3941
+ "license": "ISC",
3942
+ "dependencies": {
3943
+ "robust-predicates": "^3.0.2"
3944
+ }
3945
+ },
3946
  "node_modules/detect-libc": {
3947
  "version": "2.1.2",
3948
  "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
 
3966
  "node": ">=0.10.0"
3967
  }
3968
  },
3969
+ "node_modules/dompurify": {
3970
+ "version": "3.4.16",
3971
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.16.tgz",
3972
+ "integrity": "sha512-sqo+pNp3qRhCIpbgRi1y8Tgk27Bo2Ry7w0dC1NBeNTdZChWjz9Xb/KOoZbRP/R6pQZ80Qw8YhXw13hWWBbMRnQ==",
3973
+ "license": "(MPL-2.0 OR Apache-2.0)",
3974
+ "optionalDependencies": {
3975
+ "@types/trusted-types": "^2.0.7"
3976
+ }
3977
+ },
3978
  "node_modules/dunder-proto": {
3979
  "version": "1.0.1",
3980
  "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
 
3997
  "dev": true,
3998
  "license": "ISC"
3999
  },
4000
+ "node_modules/elkjs": {
4001
+ "version": "0.9.3",
4002
+ "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz",
4003
+ "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==",
4004
+ "license": "EPL-2.0"
4005
+ },
4006
  "node_modules/emoji-regex": {
4007
  "version": "9.2.2",
4008
  "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
 
4223
  "url": "https://github.com/sponsors/ljharb"
4224
  }
4225
  },
4226
+ "node_modules/es-toolkit": {
4227
+ "version": "1.52.0",
4228
+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.52.0.tgz",
4229
+ "integrity": "sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==",
4230
+ "license": "MIT",
4231
+ "workspaces": [
4232
+ "docs",
4233
+ "benchmarks",
4234
+ "tests/types",
4235
+ "tests/browser-compat"
4236
+ ]
4237
+ },
4238
  "node_modules/escalade": {
4239
  "version": "3.2.0",
4240
  "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
 
5026
  "dev": true,
5027
  "license": "ISC"
5028
  },
5029
+ "node_modules/hachure-fill": {
5030
+ "version": "0.5.2",
5031
+ "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz",
5032
+ "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==",
5033
+ "license": "MIT"
5034
+ },
5035
  "node_modules/has-bigints": {
5036
  "version": "1.1.0",
5037
  "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
 
5143
  "hermes-estree": "0.25.1"
5144
  }
5145
  },
5146
+ "node_modules/iconv-lite": {
5147
+ "version": "0.6.3",
5148
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
5149
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
5150
+ "license": "MIT",
5151
+ "dependencies": {
5152
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
5153
+ },
5154
+ "engines": {
5155
+ "node": ">=0.10.0"
5156
+ }
5157
+ },
5158
  "node_modules/ignore": {
5159
  "version": "5.3.2",
5160
  "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
 
5182
  "url": "https://github.com/sponsors/sindresorhus"
5183
  }
5184
  },
5185
+ "node_modules/import-meta-resolve": {
5186
+ "version": "4.2.0",
5187
+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz",
5188
+ "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==",
5189
+ "license": "MIT",
5190
+ "funding": {
5191
+ "type": "github",
5192
+ "url": "https://github.com/sponsors/wooorm"
5193
+ }
5194
+ },
5195
  "node_modules/imurmurhash": {
5196
  "version": "0.1.4",
5197
  "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
 
5217
  "node": ">= 0.4"
5218
  }
5219
  },
5220
+ "node_modules/internmap": {
5221
+ "version": "2.0.3",
5222
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
5223
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
5224
+ "license": "ISC",
5225
+ "engines": {
5226
+ "node": ">=12"
5227
+ }
5228
+ },
5229
  "node_modules/is-array-buffer": {
5230
  "version": "3.0.5",
5231
  "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
 
5792
  "node": ">=4.0"
5793
  }
5794
  },
5795
+ "node_modules/katex": {
5796
+ "version": "0.16.47",
5797
+ "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz",
5798
+ "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==",
5799
+ "funding": [
5800
+ "https://opencollective.com/katex",
5801
+ "https://github.com/sponsors/katex"
5802
+ ],
5803
+ "license": "MIT",
5804
+ "dependencies": {
5805
+ "commander": "^8.3.0"
5806
+ },
5807
+ "bin": {
5808
+ "katex": "cli.js"
5809
+ }
5810
+ },
5811
+ "node_modules/katex/node_modules/commander": {
5812
+ "version": "8.3.0",
5813
+ "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
5814
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
5815
+ "license": "MIT",
5816
+ "engines": {
5817
+ "node": ">= 12"
5818
+ }
5819
+ },
5820
  "node_modules/keyv": {
5821
  "version": "4.5.4",
5822
  "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
 
5827
  "json-buffer": "3.0.1"
5828
  }
5829
  },
5830
+ "node_modules/khroma": {
5831
+ "version": "2.1.0",
5832
+ "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz",
5833
+ "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="
5834
+ },
5835
  "node_modules/language-subtag-registry": {
5836
  "version": "0.3.23",
5837
  "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
 
5852
  "node": ">=0.10"
5853
  }
5854
  },
5855
+ "node_modules/layout-base": {
5856
+ "version": "1.0.2",
5857
+ "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz",
5858
+ "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==",
5859
+ "license": "MIT"
5860
+ },
5861
  "node_modules/levn": {
5862
  "version": "0.4.1",
5863
  "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
 
6161
  "url": "https://github.com/sponsors/sindresorhus"
6162
  }
6163
  },
6164
+ "node_modules/lodash-es": {
6165
+ "version": "4.18.1",
6166
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
6167
+ "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==",
6168
+ "license": "MIT"
6169
+ },
6170
  "node_modules/lodash.merge": {
6171
  "version": "4.6.2",
6172
  "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
 
6216
  "@jridgewell/sourcemap-codec": "^1.5.5"
6217
  }
6218
  },
6219
+ "node_modules/marked": {
6220
+ "version": "16.4.2",
6221
+ "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz",
6222
+ "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==",
6223
+ "license": "MIT",
6224
+ "bin": {
6225
+ "marked": "bin/marked.js"
6226
+ },
6227
+ "engines": {
6228
+ "node": ">= 20"
6229
+ }
6230
+ },
6231
  "node_modules/math-intrinsics": {
6232
  "version": "1.1.0",
6233
  "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
 
6248
  "node": ">= 8"
6249
  }
6250
  },
6251
+ "node_modules/mermaid": {
6252
+ "version": "12.1.0",
6253
+ "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-12.1.0.tgz",
6254
+ "integrity": "sha512-wlVCp+8eTupfCeeFvoZNNiTuHrvag0P2jz/ILgb/f/6jkVokUefOcujefi8qUe/j2asHiSePncVsz/xzzA80LQ==",
6255
+ "license": "MIT",
6256
+ "dependencies": {
6257
+ "@braintree/sanitize-url": "^7.1.2",
6258
+ "@iconify/utils": "^3.0.2",
6259
+ "@mermaid-js/parser": "^2.0.1",
6260
+ "@types/d3": "^7.4.3",
6261
+ "@upsetjs/venn.js": "^2.0.0",
6262
+ "chevrotain": "~13.2.0",
6263
+ "cytoscape": "^3.34.0",
6264
+ "cytoscape-cose-bilkent": "^4.1.0",
6265
+ "cytoscape-fcose": "^2.2.0",
6266
+ "d3": "^7.9.0",
6267
+ "d3-sankey": "^0.12.3",
6268
+ "dagre-d3-es": "7.0.14",
6269
+ "dayjs": "^1.11.21",
6270
+ "dompurify": "^3.4.12",
6271
+ "elkjs": "^0.9.3",
6272
+ "es-toolkit": "^1.45.1",
6273
+ "katex": "^0.16.47",
6274
+ "khroma": "^2.1.0",
6275
+ "marked": "^16.3.0",
6276
+ "roughjs": "^4.6.6",
6277
+ "stylis": "^4.3.6",
6278
+ "ts-dedent": "^2.2.0",
6279
+ "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0"
6280
+ },
6281
+ "engines": {
6282
+ "node": ">=22.12.0"
6283
+ }
6284
+ },
6285
  "node_modules/micromatch": {
6286
  "version": "4.0.8",
6287
  "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
 
6684
  "url": "https://github.com/sponsors/sindresorhus"
6685
  }
6686
  },
6687
+ "node_modules/package-manager-detector": {
6688
+ "version": "1.9.0",
6689
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.9.0.tgz",
6690
+ "integrity": "sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA==",
6691
+ "license": "MIT"
6692
+ },
6693
  "node_modules/parent-module": {
6694
  "version": "1.0.1",
6695
  "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
 
6703
  "node": ">=6"
6704
  }
6705
  },
6706
+ "node_modules/path-data-parser": {
6707
+ "version": "0.1.0",
6708
+ "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz",
6709
+ "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==",
6710
+ "license": "MIT"
6711
+ },
6712
  "node_modules/path-exists": {
6713
  "version": "4.0.0",
6714
  "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
 
6755
  "url": "https://github.com/sponsors/jonschlinkert"
6756
  }
6757
  },
6758
+ "node_modules/points-on-curve": {
6759
+ "version": "0.2.0",
6760
+ "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz",
6761
+ "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==",
6762
+ "license": "MIT"
6763
+ },
6764
+ "node_modules/points-on-path": {
6765
+ "version": "0.2.1",
6766
+ "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz",
6767
+ "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==",
6768
+ "license": "MIT",
6769
+ "dependencies": {
6770
+ "path-data-parser": "0.1.0",
6771
+ "points-on-curve": "0.2.0"
6772
+ }
6773
+ },
6774
  "node_modules/possible-typed-array-names": {
6775
  "version": "1.1.0",
6776
  "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
 
6990
  "node": ">=0.10.0"
6991
  }
6992
  },
6993
+ "node_modules/robust-predicates": {
6994
+ "version": "3.0.3",
6995
+ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz",
6996
+ "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==",
6997
+ "license": "Unlicense"
6998
+ },
6999
+ "node_modules/roughjs": {
7000
+ "version": "4.6.6",
7001
+ "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz",
7002
+ "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==",
7003
+ "license": "MIT",
7004
+ "dependencies": {
7005
+ "hachure-fill": "^0.5.2",
7006
+ "path-data-parser": "^0.1.0",
7007
+ "points-on-curve": "^0.2.0",
7008
+ "points-on-path": "^0.2.1"
7009
+ }
7010
+ },
7011
  "node_modules/run-parallel": {
7012
  "version": "1.2.0",
7013
  "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
 
7032
  "queue-microtask": "^1.2.2"
7033
  }
7034
  },
7035
+ "node_modules/rw": {
7036
+ "version": "1.3.3",
7037
+ "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
7038
+ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",
7039
+ "license": "BSD-3-Clause"
7040
+ },
7041
  "node_modules/safe-array-concat": {
7042
  "version": "1.1.4",
7043
  "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz",
 
7093
  "url": "https://github.com/sponsors/ljharb"
7094
  }
7095
  },
7096
+ "node_modules/safer-buffer": {
7097
+ "version": "2.1.2",
7098
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
7099
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
7100
+ "license": "MIT"
7101
+ },
7102
  "node_modules/scheduler": {
7103
  "version": "0.27.0",
7104
  "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
 
7516
  }
7517
  }
7518
  },
7519
+ "node_modules/stylis": {
7520
+ "version": "4.4.0",
7521
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz",
7522
+ "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==",
7523
+ "license": "MIT"
7524
+ },
7525
  "node_modules/supports-color": {
7526
  "version": "7.2.0",
7527
  "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
 
7569
  "url": "https://opencollective.com/webpack"
7570
  }
7571
  },
7572
+ "node_modules/tinyexec": {
7573
+ "version": "1.3.1",
7574
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz",
7575
+ "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==",
7576
+ "license": "MIT",
7577
+ "engines": {
7578
+ "node": ">=18"
7579
+ }
7580
+ },
7581
  "node_modules/tinyglobby": {
7582
  "version": "0.2.17",
7583
  "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
 
7652
  "typescript": ">=4.8.4"
7653
  }
7654
  },
7655
+ "node_modules/ts-dedent": {
7656
+ "version": "2.3.0",
7657
+ "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.3.0.tgz",
7658
+ "integrity": "sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==",
7659
+ "license": "MIT",
7660
+ "engines": {
7661
+ "node": ">=6.10"
7662
+ }
7663
+ },
7664
  "node_modules/tsconfig-paths": {
7665
  "version": "3.15.0",
7666
  "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
 
7926
  "punycode": "^2.1.0"
7927
  }
7928
  },
7929
+ "node_modules/uuid": {
7930
+ "version": "14.0.2",
7931
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz",
7932
+ "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==",
7933
+ "funding": [
7934
+ "https://github.com/sponsors/broofa",
7935
+ "https://github.com/sponsors/ctavan"
7936
+ ],
7937
+ "license": "MIT",
7938
+ "bin": {
7939
+ "uuid": "dist-node/bin/uuid"
7940
+ }
7941
+ },
7942
  "node_modules/which": {
7943
  "version": "2.0.2",
7944
  "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
frontend/package.json CHANGED
@@ -11,6 +11,7 @@
11
  "dependencies": {
12
  "framer-motion": "^13.4.4",
13
  "lucide-react": "^1.48.0",
 
14
  "next": "16.3.6",
15
  "react": "19.2.8",
16
  "react-dom": "19.2.8"
 
11
  "dependencies": {
12
  "framer-motion": "^13.4.4",
13
  "lucide-react": "^1.48.0",
14
+ "mermaid": "^12.1.0",
15
  "next": "16.3.6",
16
  "react": "19.2.8",
17
  "react-dom": "19.2.8"
frontend/src/app/architecture/page.tsx CHANGED
@@ -1,6 +1,113 @@
1
  "use client";
2
 
3
  import { motion } from "framer-motion";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
 
5
  const easeFluid: [number, number, number, number] = [0.16, 1, 0.3, 1];
6
 
@@ -169,6 +276,15 @@ export default function Architecture() {
169
  </div>
170
 
171
  </motion.div>
 
 
 
 
 
 
 
 
 
172
  </div>
173
  </main>
174
  );
 
1
  "use client";
2
 
3
  import { motion } from "framer-motion";
4
+ import Mermaid from "@/components/Mermaid";
5
+
6
+ const flowchartData = `
7
+ %% Generated by https://gitdiagram.com/idkhowtocodefr/heartflow_os
8
+ flowchart TD
9
+
10
+ subgraph group_client["Telemetry interface (Next.js)"]
11
+ node_dashboard["Live dashboard<br/>[page.tsx]"]
12
+ node_telemetry_context["Telemetry context"]
13
+ node_history_ui["History view<br/>[page.tsx]"]
14
+ node_analytics["Analytics view<br/>[page.tsx]"]
15
+ node_simulator_ui["Simulator view<br/>[page.tsx]"]
16
+ node_mlops_ui["MLOps view<br/>[page.tsx]"]
17
+ node_edge_ui["Edge export view<br/>[page.tsx]"]
18
+ node_architecture_ui["Architecture view<br/>[page.tsx]"]
19
+ node_shap_chart["SHAP chart<br/>[ShapChart.tsx]"]
20
+ end
21
+
22
+ subgraph group_api["API orchestration (FastAPI)"]
23
+ node_api["FastAPI routes<br/>[main.py]"]
24
+ node_simulator["Vitals simulator<br/>[simulator.py]"]
25
+ end
26
+
27
+ subgraph group_ml["Prediction and MLOps"]
28
+ node_inference["Inference pipeline<br/>[inference.py]"]
29
+ node_preprocessing["Feature preprocessing<br/>[preprocessing.py]"]
30
+ node_ensemble["Soft-voting ensemble<br/>[ensemble.py]"]
31
+ node_training["Model training<br/>[models.py]"]
32
+ node_export["C code exporter<br/>[export.py]"]
33
+ node_model_files["Trained model files"]
34
+ node_dataset["Patient dataset"]
35
+ end
36
+
37
+ subgraph group_state["Persistence and sync"]
38
+ node_database[("Prediction history<br/>[database.py]")]
39
+ node_sqlite[("SQLite history store<br/>[patient_history.db]")]
40
+ end
41
+
42
+ node_clinician(("Clinical user"))
43
+ node_hub["Hugging Face Hub"]
44
+
45
+ node_clinician -.->|"monitors"| node_dashboard
46
+ node_clinician -.->|"reviews"| node_history_ui
47
+ node_clinician -.->|"explores"| node_analytics
48
+ node_clinician -.->|"uses"| node_simulator_ui
49
+ node_clinician -.->|"manages"| node_mlops_ui
50
+ node_clinician -.->|"exports"| node_edge_ui
51
+ node_clinician -.->|"views"| node_architecture_ui
52
+ node_dashboard -->|"uses"| node_telemetry_context
53
+ node_clinician -.->|"submits vitals"| node_api
54
+ node_dashboard -.->|"streams telemetry"| node_api
55
+ node_history_ui -.->|"requests history"| node_api
56
+ node_analytics -.->|"requests data"| node_api
57
+ node_mlops_ui -.->|"uploads retraining data"| node_api
58
+ node_edge_ui -.->|"requests C export"| node_api
59
+ node_api -->|"initializes and queries"| node_database
60
+ node_api -->|"streams generated vitals"| node_simulator
61
+ node_api -->|"evaluates vitals"| node_inference
62
+ node_api -->|"prepares explanations"| node_preprocessing
63
+ node_api -->|"generates C code"| node_export
64
+ node_api -->|"loads and refreshes"| node_ensemble
65
+ node_api -->|"starts background retraining"| node_training
66
+ node_inference -->|"transforms features"| node_preprocessing
67
+ node_inference -.->|"predicts probabilities"| node_ensemble
68
+ node_ensemble -->|"resolves model directory"| node_preprocessing
69
+ node_training -->|"splits and transforms data"| node_preprocessing
70
+ node_training -->|"reads training data"| node_dataset
71
+ node_training -->|"writes trained models"| node_model_files
72
+ node_ensemble -->|"loads model artifacts"| node_model_files
73
+ node_database -->|"reads and writes"| node_sqlite
74
+ node_database -->|"syncs history"| node_hub
75
+
76
+ click node_dashboard "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/app/dashboard/page.tsx"
77
+ click node_telemetry_context "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/context/TelemetryContext.tsx"
78
+ click node_history_ui "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/app/history/page.tsx"
79
+ click node_analytics "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/app/analytics/page.tsx"
80
+ click node_simulator_ui "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/app/simulator/page.tsx"
81
+ click node_mlops_ui "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/app/mlops/page.tsx"
82
+ click node_edge_ui "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/app/edge/page.tsx"
83
+ click node_architecture_ui "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/app/architecture/page.tsx"
84
+ click node_shap_chart "https://github.com/idkhowtocodefr/heartflow_os/blob/main/frontend/src/components/ShapChart.tsx"
85
+ click node_api "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/main.py"
86
+ click node_simulator "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/simulator.py"
87
+ click node_inference "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/inference.py"
88
+ click node_preprocessing "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/preprocessing.py"
89
+ click node_ensemble "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/ensemble.py"
90
+ click node_training "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/models.py"
91
+ click node_export "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/export.py"
92
+ click node_model_files "https://github.com/idkhowtocodefr/heartflow_os/tree/main/model"
93
+ click node_dataset "https://github.com/idkhowtocodefr/heartflow_os/blob/main/data/patient_dataset.csv"
94
+ click node_database "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/database.py"
95
+ click node_sqlite "https://github.com/idkhowtocodefr/heartflow_os/blob/main/backend/patient_history.db"
96
+
97
+ classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
98
+ classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
99
+ classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
100
+ classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
101
+ classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
102
+ classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
103
+ classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
104
+
105
+ class node_dashboard,node_telemetry_context,node_history_ui,node_analytics,node_simulator_ui,node_mlops_ui,node_edge_ui,node_architecture_ui,node_shap_chart,node_clinician toneBlue
106
+ class node_api,node_simulator toneAmber
107
+ class node_inference,node_preprocessing,node_ensemble,node_training,node_export,node_model_files,node_dataset toneMint
108
+ class node_database,node_sqlite toneRose
109
+ class node_hub toneIndigo
110
+ `;
111
 
112
  const easeFluid: [number, number, number, number] = [0.16, 1, 0.3, 1];
113
 
 
276
  </div>
277
 
278
  </motion.div>
279
+
280
+ {/* FLOWCHART */}
281
+ <motion.div initial="hidden" animate="show" variants={fadeUp} className="w-full flex flex-col gap-8 mb-16">
282
+ <div>
283
+ <div className="text-[10px] text-hazard font-bold tracking-[0.15em] mb-2 uppercase">CHART_01</div>
284
+ <h2 className="text-[24px] font-sans font-black tracking-[-0.02em] uppercase text-ink leading-tight">SYSTEM TOPOLOGY GRAPH</h2>
285
+ </div>
286
+ <Mermaid chart={flowchartData} />
287
+ </motion.div>
288
  </div>
289
  </main>
290
  );
frontend/src/components/Mermaid.tsx ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ "use client";
2
+
3
+ import React, { useEffect, useState } from "react";
4
+
5
+ export default function Mermaid({ chart }: { chart: string }) {
6
+ const [svgContent, setSvgContent] = useState<string>("");
7
+
8
+ useEffect(() => {
9
+ const renderChart = async () => {
10
+ try {
11
+ const mermaid = (await import("mermaid")).default;
12
+ mermaid.initialize({
13
+ startOnLoad: false,
14
+ theme: "base",
15
+ themeVariables: {
16
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace",
17
+ },
18
+ });
19
+ const { svg } = await mermaid.render("mermaid-svg-" + Math.random().toString(36).substring(7), chart);
20
+ setSvgContent(svg);
21
+ } catch (e) {
22
+ console.error("Mermaid parsing error", e);
23
+ }
24
+ };
25
+ renderChart();
26
+ }, [chart]);
27
+
28
+ return (
29
+ <div
30
+ className="w-full overflow-x-auto p-8 bg-canvas-cream border-4 border-ink flex justify-center items-center [&_svg]:max-w-full [&_svg]:h-auto"
31
+ dangerouslySetInnerHTML={{ __html: svgContent }}
32
+ />
33
+ );
34
+ }