rasAli02 commited on
Commit
4cc00df
Β·
1 Parent(s): af6cd33

git add, commit, push

Browse files
backend/agents.py CHANGED
@@ -15,19 +15,25 @@ import httpx # async HTTP β€” lightweight, no extra deps beyond requirements
15
  # ── AMD vLLM inference endpoint ─────────────────────────────────────────────
16
  # vLLM exposes an OpenAI-compatible API at /v1/chat/completions.
17
  # Set AMD_INFERENCE_URL in your .env to point at the running vLLM server.
18
- # Example: http://129.212.191.163:8000 (direct port β€” ensure firewall allows it)
19
  # Or use the Jupyter proxy route: http://129.212.191.163/proxy/8000
20
  AMD_INFERENCE_URL = os.environ.get(
21
  "AMD_INFERENCE_URL",
22
- "http://129.212.191.163:8000"
23
  ).rstrip("/")
24
 
 
 
 
 
 
 
25
  # The model name vLLM is serving (used in the chat/completions request).
26
  # Override with AMD_MODEL_NAME env var if you deploy a different checkpoint.
27
  AMD_MODEL_NAME = os.environ.get("AMD_MODEL_NAME", "Qwen/Qwen2-VL-7B-Instruct")
28
 
29
  # Timeout (seconds) to wait for the AMD server before falling back to mock.
30
- AMD_TIMEOUT = float(os.environ.get("AMD_TIMEOUT", "30"))
31
 
32
  # ── System prompts ───────────────────────────────────────────────────────────
33
  INSPECTOR_SYSTEM = """You are the INSPECTOR agent of ForgeSight β€” a multimodal quality-control copilot
@@ -180,10 +186,13 @@ async def _call_amd_vllm(
180
  }
181
 
182
  url = f"{AMD_INFERENCE_URL}/v1/chat/completions"
 
 
 
183
 
184
  try:
185
  async with httpx.AsyncClient(timeout=AMD_TIMEOUT) as client:
186
- resp = await client.post(url, json=payload)
187
  resp.raise_for_status()
188
  data = resp.json()
189
  return data["choices"][0]["message"]["content"]
 
15
  # ── AMD vLLM inference endpoint ─────────────────────────────────────────────
16
  # vLLM exposes an OpenAI-compatible API at /v1/chat/completions.
17
  # Set AMD_INFERENCE_URL in your .env to point at the running vLLM server.
18
+ # Example: http://129.212.191.163 (direct port β€” ensure firewall allows it)
19
  # Or use the Jupyter proxy route: http://129.212.191.163/proxy/8000
20
  AMD_INFERENCE_URL = os.environ.get(
21
  "AMD_INFERENCE_URL",
22
+ "http://165.245.143.46:8000"
23
  ).rstrip("/")
24
 
25
+ # Token for the AMD inference server (if required)
26
+ AMD_INFERENCE_TOKEN = os.environ.get(
27
+ "AMD_INFERENCE_TOKEN",
28
+ "5peRa6unb0DdXvzB3Pbck48IgNTDmxeJSUvE4NdnhvW70FcaX"
29
+ )
30
+
31
  # The model name vLLM is serving (used in the chat/completions request).
32
  # Override with AMD_MODEL_NAME env var if you deploy a different checkpoint.
33
  AMD_MODEL_NAME = os.environ.get("AMD_MODEL_NAME", "Qwen/Qwen2-VL-7B-Instruct")
34
 
35
  # Timeout (seconds) to wait for the AMD server before falling back to mock.
36
+ AMD_TIMEOUT = float(os.environ.get("AMD_TIMEOUT", "60"))
37
 
38
  # ── System prompts ───────────────────────────────────────────────────────────
39
  INSPECTOR_SYSTEM = """You are the INSPECTOR agent of ForgeSight β€” a multimodal quality-control copilot
 
186
  }
187
 
188
  url = f"{AMD_INFERENCE_URL}/v1/chat/completions"
189
+ headers = {}
190
+ if AMD_INFERENCE_TOKEN:
191
+ headers["Authorization"] = f"Bearer {AMD_INFERENCE_TOKEN}"
192
 
193
  try:
194
  async with httpx.AsyncClient(timeout=AMD_TIMEOUT) as client:
195
+ resp = await client.post(url, json=payload, headers=headers)
196
  resp.raise_for_status()
197
  data = resp.json()
198
  return data["choices"][0]["message"]["content"]
backend/start_vllm.sh ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # ============================================================
3
+ # ForgeSight β€” Start vLLM Inference Server on AMD MI300X
4
+ # ============================================================
5
+ # Default configuration
6
+ MODEL_NAME=${AMD_MODEL_NAME:-"Qwen/Qwen2-VL-7B-Instruct"}
7
+ PORT=${PORT:-8000}
8
+
9
+ echo "πŸš€ Starting vLLM Server with $MODEL_NAME on port $PORT..."
10
+
11
+ # Use the venv if it exists
12
+ if [ -f "/opt/forgesight/venv/bin/activate" ]; then
13
+ source /opt/forgesight/venv/bin/activate
14
+ fi
15
+
16
+ # vLLM on ROCm requires some specific environment variables for best performance
17
+ export HSA_OVERRIDE_GFX_VERSION=11.0.0
18
+ export NCCL_DEBUG=ERROR
19
+
20
+ python3 -m vllm.entrypoints.openai.api_server \
21
+ --model "$MODEL_NAME" \
22
+ --host 0.0.0.0 \
23
+ --port "$PORT" \
24
+ --trust-remote-code \
25
+ --dtype bfloat16 \
26
+ --limit-mm-per-prompt image=1 \
27
+ --gpu-memory-utilization 0.95 \
28
+ --max-model-len 8192 \
29
+ --tensor-parallel-size 1
frontend/package-lock.json CHANGED
@@ -36,6 +36,7 @@
36
  "@radix-ui/react-toggle": "^1.1.6",
37
  "@radix-ui/react-toggle-group": "^1.1.7",
38
  "@radix-ui/react-tooltip": "^1.2.4",
 
39
  "axios": "^1.8.4",
40
  "class-variance-authority": "^0.7.1",
41
  "clsx": "^2.1.1",
@@ -43,7 +44,9 @@
43
  "cra-template": "1.2.0",
44
  "date-fns": "^4.1.0",
45
  "embla-carousel-react": "^8.6.0",
 
46
  "input-otp": "^1.4.2",
 
47
  "lucide-react": "^0.507.0",
48
  "next-themes": "^0.4.6",
49
  "react": "^19.0.0",
@@ -63,7 +66,6 @@
63
  "devDependencies": {
64
  "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
65
  "@craco/craco": "^7.1.0",
66
- "@emergentbase/visual-edits": "https://assets.emergent.sh/npm/emergentbase-visual-edits-1.0.8.tgz",
67
  "@eslint/js": "9.23.0",
68
  "autoprefixer": "^10.4.20",
69
  "eslint": "9.23.0",
@@ -2046,9 +2048,9 @@
2046
  }
2047
  },
2048
  "node_modules/@babel/runtime": {
2049
- "version": "7.28.4",
2050
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
2051
- "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
2052
  "license": "MIT",
2053
  "engines": {
2054
  "node": ">=6.9.0"
@@ -2453,36 +2455,6 @@
2453
  "postcss-selector-parser": "^6.0.10"
2454
  }
2455
  },
2456
- "node_modules/@emergentbase/visual-edits": {
2457
- "version": "1.0.8",
2458
- "resolved": "https://assets.emergent.sh/npm/emergentbase-visual-edits-1.0.8.tgz",
2459
- "integrity": "sha512-n6vWWr/H8mUvuQqjtZzzGXUS6RDhcIIzT8VjX8EOFOk8sgoMjVoA9pFl6XG+wJuIOS7QAKK+QjiKipLHoVvbWA==",
2460
- "dev": true,
2461
- "peerDependencies": {
2462
- "@babel/core": "^7.0.0",
2463
- "@babel/generator": "^7.0.0",
2464
- "@babel/parser": "^7.0.0",
2465
- "@babel/traverse": "^7.0.0",
2466
- "express": "^4.0.0"
2467
- },
2468
- "peerDependenciesMeta": {
2469
- "@babel/core": {
2470
- "optional": true
2471
- },
2472
- "@babel/generator": {
2473
- "optional": true
2474
- },
2475
- "@babel/parser": {
2476
- "optional": true
2477
- },
2478
- "@babel/traverse": {
2479
- "optional": true
2480
- },
2481
- "express": {
2482
- "optional": true
2483
- }
2484
- }
2485
- },
2486
  "node_modules/@eslint-community/eslint-utils": {
2487
  "version": "4.9.0",
2488
  "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
@@ -2584,6 +2556,23 @@
2584
  "url": "https://opencollective.com/eslint"
2585
  }
2586
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2587
  "node_modules/@eslint/eslintrc/node_modules/globals": {
2588
  "version": "14.0.0",
2589
  "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
@@ -2597,6 +2586,13 @@
2597
  "url": "https://github.com/sponsors/sindresorhus"
2598
  }
2599
  },
 
 
 
 
 
 
 
2600
  "node_modules/@eslint/js": {
2601
  "version": "9.23.0",
2602
  "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz",
@@ -5723,6 +5719,12 @@
5723
  "@types/node": "*"
5724
  }
5725
  },
 
 
 
 
 
 
5726
  "node_modules/@types/parse-json": {
5727
  "version": "4.0.2",
5728
  "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
@@ -5747,6 +5749,13 @@
5747
  "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
5748
  "license": "MIT"
5749
  },
 
 
 
 
 
 
 
5750
  "node_modules/@types/range-parser": {
5751
  "version": "1.2.7",
5752
  "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
@@ -6433,15 +6442,15 @@
6433
  }
6434
  },
6435
  "node_modules/ajv": {
6436
- "version": "6.12.6",
6437
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
6438
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
6439
  "license": "MIT",
6440
  "dependencies": {
6441
- "fast-deep-equal": "^3.1.1",
6442
- "fast-json-stable-stringify": "^2.0.0",
6443
- "json-schema-traverse": "^0.4.1",
6444
- "uri-js": "^4.2.2"
6445
  },
6446
  "funding": {
6447
  "type": "github",
@@ -6465,28 +6474,6 @@
6465
  }
6466
  }
6467
  },
6468
- "node_modules/ajv-formats/node_modules/ajv": {
6469
- "version": "8.17.1",
6470
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
6471
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
6472
- "license": "MIT",
6473
- "dependencies": {
6474
- "fast-deep-equal": "^3.1.3",
6475
- "fast-uri": "^3.0.1",
6476
- "json-schema-traverse": "^1.0.0",
6477
- "require-from-string": "^2.0.2"
6478
- },
6479
- "funding": {
6480
- "type": "github",
6481
- "url": "https://github.com/sponsors/epoberezkin"
6482
- }
6483
- },
6484
- "node_modules/ajv-formats/node_modules/json-schema-traverse": {
6485
- "version": "1.0.0",
6486
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
6487
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
6488
- "license": "MIT"
6489
- },
6490
  "node_modules/ajv-keywords": {
6491
  "version": "5.1.0",
6492
  "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
@@ -6966,6 +6953,22 @@
6966
  "webpack": ">=2"
6967
  }
6968
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6969
  "node_modules/babel-loader/node_modules/ajv-keywords": {
6970
  "version": "3.5.2",
6971
  "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
@@ -6975,6 +6978,12 @@
6975
  "ajv": "^6.9.1"
6976
  }
6977
  },
 
 
 
 
 
 
6978
  "node_modules/babel-loader/node_modules/schema-utils": {
6979
  "version": "2.7.1",
6980
  "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
@@ -7166,6 +7175,15 @@
7166
  "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
7167
  "license": "MIT"
7168
  },
 
 
 
 
 
 
 
 
 
7169
  "node_modules/baseline-browser-mapping": {
7170
  "version": "2.9.11",
7171
  "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz",
@@ -7507,6 +7525,26 @@
7507
  ],
7508
  "license": "CC-BY-4.0"
7509
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7510
  "node_modules/case-sensitive-paths-webpack-plugin": {
7511
  "version": "2.4.0",
7512
  "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
@@ -8140,6 +8178,15 @@
8140
  "postcss": "^8.4"
8141
  }
8142
  },
 
 
 
 
 
 
 
 
 
8143
  "node_modules/css-loader": {
8144
  "version": "6.11.0",
8145
  "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz",
@@ -9000,6 +9047,16 @@
9000
  "url": "https://github.com/fb55/domhandler?sponsor=1"
9001
  }
9002
  },
 
 
 
 
 
 
 
 
 
 
9003
  "node_modules/domutils": {
9004
  "version": "2.8.0",
9005
  "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
@@ -9860,6 +9917,30 @@
9860
  "url": "https://github.com/chalk/supports-color?sponsor=1"
9861
  }
9862
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9863
  "node_modules/espree": {
9864
  "version": "10.4.0",
9865
  "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
@@ -10125,6 +10206,17 @@
10125
  "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
10126
  "license": "MIT"
10127
  },
 
 
 
 
 
 
 
 
 
 
 
10128
  "node_modules/fast-uri": {
10129
  "version": "3.1.0",
10130
  "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
@@ -10188,6 +10280,12 @@
10188
  }
10189
  }
10190
  },
 
 
 
 
 
 
10191
  "node_modules/file-entry-cache": {
10192
  "version": "8.0.0",
10193
  "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
@@ -10221,6 +10319,22 @@
10221
  "webpack": "^4.0.0 || ^5.0.0"
10222
  }
10223
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10224
  "node_modules/file-loader/node_modules/ajv-keywords": {
10225
  "version": "3.5.2",
10226
  "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
@@ -10230,6 +10344,12 @@
10230
  "ajv": "^6.9.1"
10231
  }
10232
  },
 
 
 
 
 
 
10233
  "node_modules/file-loader/node_modules/schema-utils": {
10234
  "version": "3.3.0",
10235
  "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
@@ -10469,6 +10589,22 @@
10469
  }
10470
  }
10471
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10472
  "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": {
10473
  "version": "3.5.2",
10474
  "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
@@ -10509,6 +10645,12 @@
10509
  "node": ">=10"
10510
  }
10511
  },
 
 
 
 
 
 
10512
  "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": {
10513
  "version": "2.7.0",
10514
  "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
@@ -11207,6 +11349,19 @@
11207
  }
11208
  }
11209
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
11210
  "node_modules/htmlparser2": {
11211
  "version": "6.1.0",
11212
  "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
@@ -11499,6 +11654,12 @@
11499
  "node": ">=12"
11500
  }
11501
  },
 
 
 
 
 
 
11502
  "node_modules/ipaddr.js": {
11503
  "version": "2.3.0",
11504
  "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz",
@@ -13216,9 +13377,9 @@
13216
  "license": "(AFL-2.1 OR BSD-3-Clause)"
13217
  },
13218
  "node_modules/json-schema-traverse": {
13219
- "version": "0.4.1",
13220
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
13221
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
13222
  "license": "MIT"
13223
  },
13224
  "node_modules/json-stable-stringify-without-jsonify": {
@@ -13283,6 +13444,23 @@
13283
  "node": ">=0.10.0"
13284
  }
13285
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13286
  "node_modules/jsx-ast-utils": {
13287
  "version": "3.3.5",
13288
  "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
@@ -14206,6 +14384,12 @@
14206
  "node": ">=6"
14207
  }
14208
  },
 
 
 
 
 
 
14209
  "node_modules/param-case": {
14210
  "version": "3.0.4",
14211
  "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
@@ -16442,6 +16626,22 @@
16442
  "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
16443
  }
16444
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16445
  "node_modules/react-scripts/node_modules/doctrine": {
16446
  "version": "3.0.0",
16447
  "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -16596,6 +16796,12 @@
16596
  "url": "https://github.com/sponsors/sindresorhus"
16597
  }
16598
  },
 
 
 
 
 
 
16599
  "node_modules/react-scripts/node_modules/semver": {
16600
  "version": "7.7.3",
16601
  "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
@@ -17047,6 +17253,16 @@
17047
  "node": ">=0.10.0"
17048
  }
17049
  },
 
 
 
 
 
 
 
 
 
 
17050
  "node_modules/rimraf": {
17051
  "version": "3.0.2",
17052
  "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -17305,28 +17521,6 @@
17305
  "url": "https://opencollective.com/webpack"
17306
  }
17307
  },
17308
- "node_modules/schema-utils/node_modules/ajv": {
17309
- "version": "8.17.1",
17310
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
17311
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
17312
- "license": "MIT",
17313
- "dependencies": {
17314
- "fast-deep-equal": "^3.1.3",
17315
- "fast-uri": "^3.0.1",
17316
- "json-schema-traverse": "^1.0.0",
17317
- "require-from-string": "^2.0.2"
17318
- },
17319
- "funding": {
17320
- "type": "github",
17321
- "url": "https://github.com/sponsors/epoberezkin"
17322
- }
17323
- },
17324
- "node_modules/schema-utils/node_modules/json-schema-traverse": {
17325
- "version": "1.0.0",
17326
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
17327
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
17328
- "license": "MIT"
17329
- },
17330
  "node_modules/select-hose": {
17331
  "version": "2.0.0",
17332
  "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
@@ -17849,6 +18043,16 @@
17849
  "node": ">=8"
17850
  }
17851
  },
 
 
 
 
 
 
 
 
 
 
17852
  "node_modules/stackframe": {
17853
  "version": "1.3.4",
17854
  "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
@@ -18303,6 +18507,16 @@
18303
  "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
18304
  "license": "MIT"
18305
  },
 
 
 
 
 
 
 
 
 
 
18306
  "node_modules/svgo": {
18307
  "version": "1.3.2",
18308
  "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
@@ -18697,6 +18911,15 @@
18697
  "node": ">=8"
18698
  }
18699
  },
 
 
 
 
 
 
 
 
 
18700
  "node_modules/text-table": {
18701
  "version": "0.2.0",
18702
  "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -19351,6 +19574,15 @@
19351
  "node": ">= 0.4.0"
19352
  }
19353
  },
 
 
 
 
 
 
 
 
 
19354
  "node_modules/uuid": {
19355
  "version": "8.3.2",
19356
  "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
@@ -19986,22 +20218,6 @@
19986
  "node": ">=16.0.0"
19987
  }
19988
  },
19989
- "node_modules/workbox-build/node_modules/ajv": {
19990
- "version": "8.17.1",
19991
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
19992
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
19993
- "license": "MIT",
19994
- "dependencies": {
19995
- "fast-deep-equal": "^3.1.3",
19996
- "fast-uri": "^3.0.1",
19997
- "json-schema-traverse": "^1.0.0",
19998
- "require-from-string": "^2.0.2"
19999
- },
20000
- "funding": {
20001
- "type": "github",
20002
- "url": "https://github.com/sponsors/epoberezkin"
20003
- }
20004
- },
20005
  "node_modules/workbox-build/node_modules/fs-extra": {
20006
  "version": "9.1.0",
20007
  "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
@@ -20017,12 +20233,6 @@
20017
  "node": ">=10"
20018
  }
20019
  },
20020
- "node_modules/workbox-build/node_modules/json-schema-traverse": {
20021
- "version": "1.0.0",
20022
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
20023
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
20024
- "license": "MIT"
20025
- },
20026
  "node_modules/workbox-build/node_modules/source-map": {
20027
  "version": "0.8.0-beta.0",
20028
  "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
 
36
  "@radix-ui/react-toggle": "^1.1.6",
37
  "@radix-ui/react-toggle-group": "^1.1.7",
38
  "@radix-ui/react-tooltip": "^1.2.4",
39
+ "ajv": "^8.20.0",
40
  "axios": "^1.8.4",
41
  "class-variance-authority": "^0.7.1",
42
  "clsx": "^2.1.1",
 
44
  "cra-template": "1.2.0",
45
  "date-fns": "^4.1.0",
46
  "embla-carousel-react": "^8.6.0",
47
+ "html2canvas": "^1.4.1",
48
  "input-otp": "^1.4.2",
49
+ "jspdf": "^4.2.1",
50
  "lucide-react": "^0.507.0",
51
  "next-themes": "^0.4.6",
52
  "react": "^19.0.0",
 
66
  "devDependencies": {
67
  "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
68
  "@craco/craco": "^7.1.0",
 
69
  "@eslint/js": "9.23.0",
70
  "autoprefixer": "^10.4.20",
71
  "eslint": "9.23.0",
 
2048
  }
2049
  },
2050
  "node_modules/@babel/runtime": {
2051
+ "version": "7.29.2",
2052
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
2053
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
2054
  "license": "MIT",
2055
  "engines": {
2056
  "node": ">=6.9.0"
 
2455
  "postcss-selector-parser": "^6.0.10"
2456
  }
2457
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2458
  "node_modules/@eslint-community/eslint-utils": {
2459
  "version": "4.9.0",
2460
  "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
 
2556
  "url": "https://opencollective.com/eslint"
2557
  }
2558
  },
2559
+ "node_modules/@eslint/eslintrc/node_modules/ajv": {
2560
+ "version": "6.15.0",
2561
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
2562
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
2563
+ "dev": true,
2564
+ "license": "MIT",
2565
+ "dependencies": {
2566
+ "fast-deep-equal": "^3.1.1",
2567
+ "fast-json-stable-stringify": "^2.0.0",
2568
+ "json-schema-traverse": "^0.4.1",
2569
+ "uri-js": "^4.2.2"
2570
+ },
2571
+ "funding": {
2572
+ "type": "github",
2573
+ "url": "https://github.com/sponsors/epoberezkin"
2574
+ }
2575
+ },
2576
  "node_modules/@eslint/eslintrc/node_modules/globals": {
2577
  "version": "14.0.0",
2578
  "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
 
2586
  "url": "https://github.com/sponsors/sindresorhus"
2587
  }
2588
  },
2589
+ "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
2590
+ "version": "0.4.1",
2591
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
2592
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
2593
+ "dev": true,
2594
+ "license": "MIT"
2595
+ },
2596
  "node_modules/@eslint/js": {
2597
  "version": "9.23.0",
2598
  "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz",
 
5719
  "@types/node": "*"
5720
  }
5721
  },
5722
+ "node_modules/@types/pako": {
5723
+ "version": "2.0.4",
5724
+ "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz",
5725
+ "integrity": "sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==",
5726
+ "license": "MIT"
5727
+ },
5728
  "node_modules/@types/parse-json": {
5729
  "version": "4.0.2",
5730
  "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
 
5749
  "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
5750
  "license": "MIT"
5751
  },
5752
+ "node_modules/@types/raf": {
5753
+ "version": "3.4.3",
5754
+ "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz",
5755
+ "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==",
5756
+ "license": "MIT",
5757
+ "optional": true
5758
+ },
5759
  "node_modules/@types/range-parser": {
5760
  "version": "1.2.7",
5761
  "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
 
6442
  }
6443
  },
6444
  "node_modules/ajv": {
6445
+ "version": "8.20.0",
6446
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
6447
+ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
6448
  "license": "MIT",
6449
  "dependencies": {
6450
+ "fast-deep-equal": "^3.1.3",
6451
+ "fast-uri": "^3.0.1",
6452
+ "json-schema-traverse": "^1.0.0",
6453
+ "require-from-string": "^2.0.2"
6454
  },
6455
  "funding": {
6456
  "type": "github",
 
6474
  }
6475
  }
6476
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6477
  "node_modules/ajv-keywords": {
6478
  "version": "5.1.0",
6479
  "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
 
6953
  "webpack": ">=2"
6954
  }
6955
  },
6956
+ "node_modules/babel-loader/node_modules/ajv": {
6957
+ "version": "6.15.0",
6958
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
6959
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
6960
+ "license": "MIT",
6961
+ "dependencies": {
6962
+ "fast-deep-equal": "^3.1.1",
6963
+ "fast-json-stable-stringify": "^2.0.0",
6964
+ "json-schema-traverse": "^0.4.1",
6965
+ "uri-js": "^4.2.2"
6966
+ },
6967
+ "funding": {
6968
+ "type": "github",
6969
+ "url": "https://github.com/sponsors/epoberezkin"
6970
+ }
6971
+ },
6972
  "node_modules/babel-loader/node_modules/ajv-keywords": {
6973
  "version": "3.5.2",
6974
  "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
 
6978
  "ajv": "^6.9.1"
6979
  }
6980
  },
6981
+ "node_modules/babel-loader/node_modules/json-schema-traverse": {
6982
+ "version": "0.4.1",
6983
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
6984
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
6985
+ "license": "MIT"
6986
+ },
6987
  "node_modules/babel-loader/node_modules/schema-utils": {
6988
  "version": "2.7.1",
6989
  "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
 
7175
  "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
7176
  "license": "MIT"
7177
  },
7178
+ "node_modules/base64-arraybuffer": {
7179
+ "version": "1.0.2",
7180
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
7181
+ "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
7182
+ "license": "MIT",
7183
+ "engines": {
7184
+ "node": ">= 0.6.0"
7185
+ }
7186
+ },
7187
  "node_modules/baseline-browser-mapping": {
7188
  "version": "2.9.11",
7189
  "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz",
 
7525
  ],
7526
  "license": "CC-BY-4.0"
7527
  },
7528
+ "node_modules/canvg": {
7529
+ "version": "3.0.11",
7530
+ "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.11.tgz",
7531
+ "integrity": "sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==",
7532
+ "license": "MIT",
7533
+ "optional": true,
7534
+ "dependencies": {
7535
+ "@babel/runtime": "^7.12.5",
7536
+ "@types/raf": "^3.4.0",
7537
+ "core-js": "^3.8.3",
7538
+ "raf": "^3.4.1",
7539
+ "regenerator-runtime": "^0.13.7",
7540
+ "rgbcolor": "^1.0.1",
7541
+ "stackblur-canvas": "^2.0.0",
7542
+ "svg-pathdata": "^6.0.3"
7543
+ },
7544
+ "engines": {
7545
+ "node": ">=10.0.0"
7546
+ }
7547
+ },
7548
  "node_modules/case-sensitive-paths-webpack-plugin": {
7549
  "version": "2.4.0",
7550
  "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
 
8178
  "postcss": "^8.4"
8179
  }
8180
  },
8181
+ "node_modules/css-line-break": {
8182
+ "version": "2.1.0",
8183
+ "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz",
8184
+ "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
8185
+ "license": "MIT",
8186
+ "dependencies": {
8187
+ "utrie": "^1.0.2"
8188
+ }
8189
+ },
8190
  "node_modules/css-loader": {
8191
  "version": "6.11.0",
8192
  "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz",
 
9047
  "url": "https://github.com/fb55/domhandler?sponsor=1"
9048
  }
9049
  },
9050
+ "node_modules/dompurify": {
9051
+ "version": "3.4.2",
9052
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.2.tgz",
9053
+ "integrity": "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==",
9054
+ "license": "(MPL-2.0 OR Apache-2.0)",
9055
+ "optional": true,
9056
+ "optionalDependencies": {
9057
+ "@types/trusted-types": "^2.0.7"
9058
+ }
9059
+ },
9060
  "node_modules/domutils": {
9061
  "version": "2.8.0",
9062
  "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
 
9917
  "url": "https://github.com/chalk/supports-color?sponsor=1"
9918
  }
9919
  },
9920
+ "node_modules/eslint/node_modules/ajv": {
9921
+ "version": "6.15.0",
9922
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
9923
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
9924
+ "dev": true,
9925
+ "license": "MIT",
9926
+ "dependencies": {
9927
+ "fast-deep-equal": "^3.1.1",
9928
+ "fast-json-stable-stringify": "^2.0.0",
9929
+ "json-schema-traverse": "^0.4.1",
9930
+ "uri-js": "^4.2.2"
9931
+ },
9932
+ "funding": {
9933
+ "type": "github",
9934
+ "url": "https://github.com/sponsors/epoberezkin"
9935
+ }
9936
+ },
9937
+ "node_modules/eslint/node_modules/json-schema-traverse": {
9938
+ "version": "0.4.1",
9939
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
9940
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
9941
+ "dev": true,
9942
+ "license": "MIT"
9943
+ },
9944
  "node_modules/espree": {
9945
  "version": "10.4.0",
9946
  "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
 
10206
  "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
10207
  "license": "MIT"
10208
  },
10209
+ "node_modules/fast-png": {
10210
+ "version": "6.4.0",
10211
+ "resolved": "https://registry.npmjs.org/fast-png/-/fast-png-6.4.0.tgz",
10212
+ "integrity": "sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==",
10213
+ "license": "MIT",
10214
+ "dependencies": {
10215
+ "@types/pako": "^2.0.3",
10216
+ "iobuffer": "^5.3.2",
10217
+ "pako": "^2.1.0"
10218
+ }
10219
+ },
10220
  "node_modules/fast-uri": {
10221
  "version": "3.1.0",
10222
  "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
 
10280
  }
10281
  }
10282
  },
10283
+ "node_modules/fflate": {
10284
+ "version": "0.8.2",
10285
+ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
10286
+ "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
10287
+ "license": "MIT"
10288
+ },
10289
  "node_modules/file-entry-cache": {
10290
  "version": "8.0.0",
10291
  "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
 
10319
  "webpack": "^4.0.0 || ^5.0.0"
10320
  }
10321
  },
10322
+ "node_modules/file-loader/node_modules/ajv": {
10323
+ "version": "6.15.0",
10324
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
10325
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
10326
+ "license": "MIT",
10327
+ "dependencies": {
10328
+ "fast-deep-equal": "^3.1.1",
10329
+ "fast-json-stable-stringify": "^2.0.0",
10330
+ "json-schema-traverse": "^0.4.1",
10331
+ "uri-js": "^4.2.2"
10332
+ },
10333
+ "funding": {
10334
+ "type": "github",
10335
+ "url": "https://github.com/sponsors/epoberezkin"
10336
+ }
10337
+ },
10338
  "node_modules/file-loader/node_modules/ajv-keywords": {
10339
  "version": "3.5.2",
10340
  "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
 
10344
  "ajv": "^6.9.1"
10345
  }
10346
  },
10347
+ "node_modules/file-loader/node_modules/json-schema-traverse": {
10348
+ "version": "0.4.1",
10349
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
10350
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
10351
+ "license": "MIT"
10352
+ },
10353
  "node_modules/file-loader/node_modules/schema-utils": {
10354
  "version": "3.3.0",
10355
  "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
 
10589
  }
10590
  }
10591
  },
10592
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": {
10593
+ "version": "6.15.0",
10594
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
10595
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
10596
+ "license": "MIT",
10597
+ "dependencies": {
10598
+ "fast-deep-equal": "^3.1.1",
10599
+ "fast-json-stable-stringify": "^2.0.0",
10600
+ "json-schema-traverse": "^0.4.1",
10601
+ "uri-js": "^4.2.2"
10602
+ },
10603
+ "funding": {
10604
+ "type": "github",
10605
+ "url": "https://github.com/sponsors/epoberezkin"
10606
+ }
10607
+ },
10608
  "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": {
10609
  "version": "3.5.2",
10610
  "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
 
10645
  "node": ">=10"
10646
  }
10647
  },
10648
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": {
10649
+ "version": "0.4.1",
10650
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
10651
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
10652
+ "license": "MIT"
10653
+ },
10654
  "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": {
10655
  "version": "2.7.0",
10656
  "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
 
11349
  }
11350
  }
11351
  },
11352
+ "node_modules/html2canvas": {
11353
+ "version": "1.4.1",
11354
+ "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz",
11355
+ "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
11356
+ "license": "MIT",
11357
+ "dependencies": {
11358
+ "css-line-break": "^2.1.0",
11359
+ "text-segmentation": "^1.0.3"
11360
+ },
11361
+ "engines": {
11362
+ "node": ">=8.0.0"
11363
+ }
11364
+ },
11365
  "node_modules/htmlparser2": {
11366
  "version": "6.1.0",
11367
  "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
 
11654
  "node": ">=12"
11655
  }
11656
  },
11657
+ "node_modules/iobuffer": {
11658
+ "version": "5.4.0",
11659
+ "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz",
11660
+ "integrity": "sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==",
11661
+ "license": "MIT"
11662
+ },
11663
  "node_modules/ipaddr.js": {
11664
  "version": "2.3.0",
11665
  "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz",
 
13377
  "license": "(AFL-2.1 OR BSD-3-Clause)"
13378
  },
13379
  "node_modules/json-schema-traverse": {
13380
+ "version": "1.0.0",
13381
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
13382
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
13383
  "license": "MIT"
13384
  },
13385
  "node_modules/json-stable-stringify-without-jsonify": {
 
13444
  "node": ">=0.10.0"
13445
  }
13446
  },
13447
+ "node_modules/jspdf": {
13448
+ "version": "4.2.1",
13449
+ "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-4.2.1.tgz",
13450
+ "integrity": "sha512-YyAXyvnmjTbR4bHQRLzex3CuINCDlQnBqoSYyjJwTP2x9jDLuKDzy7aKUl0hgx3uhcl7xzg32agn5vlie6HIlQ==",
13451
+ "license": "MIT",
13452
+ "dependencies": {
13453
+ "@babel/runtime": "^7.28.6",
13454
+ "fast-png": "^6.2.0",
13455
+ "fflate": "^0.8.1"
13456
+ },
13457
+ "optionalDependencies": {
13458
+ "canvg": "^3.0.11",
13459
+ "core-js": "^3.6.0",
13460
+ "dompurify": "^3.3.1",
13461
+ "html2canvas": "^1.0.0-rc.5"
13462
+ }
13463
+ },
13464
  "node_modules/jsx-ast-utils": {
13465
  "version": "3.3.5",
13466
  "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
 
14384
  "node": ">=6"
14385
  }
14386
  },
14387
+ "node_modules/pako": {
14388
+ "version": "2.1.0",
14389
+ "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
14390
+ "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==",
14391
+ "license": "(MIT AND Zlib)"
14392
+ },
14393
  "node_modules/param-case": {
14394
  "version": "3.0.4",
14395
  "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
 
16626
  "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
16627
  }
16628
  },
16629
+ "node_modules/react-scripts/node_modules/ajv": {
16630
+ "version": "6.15.0",
16631
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
16632
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
16633
+ "license": "MIT",
16634
+ "dependencies": {
16635
+ "fast-deep-equal": "^3.1.1",
16636
+ "fast-json-stable-stringify": "^2.0.0",
16637
+ "json-schema-traverse": "^0.4.1",
16638
+ "uri-js": "^4.2.2"
16639
+ },
16640
+ "funding": {
16641
+ "type": "github",
16642
+ "url": "https://github.com/sponsors/epoberezkin"
16643
+ }
16644
+ },
16645
  "node_modules/react-scripts/node_modules/doctrine": {
16646
  "version": "3.0.0",
16647
  "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
 
16796
  "url": "https://github.com/sponsors/sindresorhus"
16797
  }
16798
  },
16799
+ "node_modules/react-scripts/node_modules/json-schema-traverse": {
16800
+ "version": "0.4.1",
16801
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
16802
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
16803
+ "license": "MIT"
16804
+ },
16805
  "node_modules/react-scripts/node_modules/semver": {
16806
  "version": "7.7.3",
16807
  "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
 
17253
  "node": ">=0.10.0"
17254
  }
17255
  },
17256
+ "node_modules/rgbcolor": {
17257
+ "version": "1.0.1",
17258
+ "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz",
17259
+ "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==",
17260
+ "license": "MIT OR SEE LICENSE IN FEEL-FREE.md",
17261
+ "optional": true,
17262
+ "engines": {
17263
+ "node": ">= 0.8.15"
17264
+ }
17265
+ },
17266
  "node_modules/rimraf": {
17267
  "version": "3.0.2",
17268
  "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
 
17521
  "url": "https://opencollective.com/webpack"
17522
  }
17523
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17524
  "node_modules/select-hose": {
17525
  "version": "2.0.0",
17526
  "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
 
18043
  "node": ">=8"
18044
  }
18045
  },
18046
+ "node_modules/stackblur-canvas": {
18047
+ "version": "2.7.0",
18048
+ "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz",
18049
+ "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==",
18050
+ "license": "MIT",
18051
+ "optional": true,
18052
+ "engines": {
18053
+ "node": ">=0.1.14"
18054
+ }
18055
+ },
18056
  "node_modules/stackframe": {
18057
  "version": "1.3.4",
18058
  "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
 
18507
  "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
18508
  "license": "MIT"
18509
  },
18510
+ "node_modules/svg-pathdata": {
18511
+ "version": "6.0.3",
18512
+ "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz",
18513
+ "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==",
18514
+ "license": "MIT",
18515
+ "optional": true,
18516
+ "engines": {
18517
+ "node": ">=12.0.0"
18518
+ }
18519
+ },
18520
  "node_modules/svgo": {
18521
  "version": "1.3.2",
18522
  "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
 
18911
  "node": ">=8"
18912
  }
18913
  },
18914
+ "node_modules/text-segmentation": {
18915
+ "version": "1.0.3",
18916
+ "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz",
18917
+ "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
18918
+ "license": "MIT",
18919
+ "dependencies": {
18920
+ "utrie": "^1.0.2"
18921
+ }
18922
+ },
18923
  "node_modules/text-table": {
18924
  "version": "0.2.0",
18925
  "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
 
19574
  "node": ">= 0.4.0"
19575
  }
19576
  },
19577
+ "node_modules/utrie": {
19578
+ "version": "1.0.2",
19579
+ "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz",
19580
+ "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
19581
+ "license": "MIT",
19582
+ "dependencies": {
19583
+ "base64-arraybuffer": "^1.0.2"
19584
+ }
19585
+ },
19586
  "node_modules/uuid": {
19587
  "version": "8.3.2",
19588
  "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
 
20218
  "node": ">=16.0.0"
20219
  }
20220
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20221
  "node_modules/workbox-build/node_modules/fs-extra": {
20222
  "version": "9.1.0",
20223
  "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
 
20233
  "node": ">=10"
20234
  }
20235
  },
 
 
 
 
 
 
20236
  "node_modules/workbox-build/node_modules/source-map": {
20237
  "version": "0.8.0-beta.0",
20238
  "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
frontend/package.json CHANGED
@@ -31,6 +31,7 @@
31
  "@radix-ui/react-toggle": "^1.1.6",
32
  "@radix-ui/react-toggle-group": "^1.1.7",
33
  "@radix-ui/react-tooltip": "^1.2.4",
 
34
  "axios": "^1.8.4",
35
  "class-variance-authority": "^0.7.1",
36
  "clsx": "^2.1.1",
@@ -38,7 +39,9 @@
38
  "cra-template": "1.2.0",
39
  "date-fns": "^4.1.0",
40
  "embla-carousel-react": "^8.6.0",
 
41
  "input-otp": "^1.4.2",
 
42
  "lucide-react": "^0.507.0",
43
  "next-themes": "^0.4.6",
44
  "react": "^19.0.0",
 
31
  "@radix-ui/react-toggle": "^1.1.6",
32
  "@radix-ui/react-toggle-group": "^1.1.7",
33
  "@radix-ui/react-tooltip": "^1.2.4",
34
+ "ajv": "^8.20.0",
35
  "axios": "^1.8.4",
36
  "class-variance-authority": "^0.7.1",
37
  "clsx": "^2.1.1",
 
39
  "cra-template": "1.2.0",
40
  "date-fns": "^4.1.0",
41
  "embla-carousel-react": "^8.6.0",
42
+ "html2canvas": "^1.4.1",
43
  "input-otp": "^1.4.2",
44
+ "jspdf": "^4.2.1",
45
  "lucide-react": "^0.507.0",
46
  "next-themes": "^0.4.6",
47
  "react": "^19.0.0",
frontend/src/components/AgentTranscript.jsx CHANGED
@@ -1,90 +1,246 @@
1
  import { useEffect, useState } from "react";
2
- import { Eye, Stethoscope, Wrench, FileText } from "lucide-react";
3
 
4
  const ICONS = {
5
- inspector: Eye,
6
  diagnostician: Stethoscope,
7
- action: Wrench,
8
- reporter: FileText,
9
  };
10
 
11
- /**
12
- * Pseudo-streams each agent's raw output character-by-character so the user
13
- * sees live "thinking". The backend returns the full transcript in one shot.
14
- */
15
- export default function AgentTranscript({ transcript, onDone }) {
16
- const [visibleIndex, setVisibleIndex] = useState(-1);
17
- const [visibleChars, setVisibleChars] = useState(0);
18
 
19
- useEffect(() => {
20
- if (!transcript) return;
21
- setVisibleIndex(0);
22
- setVisibleChars(0);
23
- }, [transcript]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
  useEffect(() => {
26
- if (!transcript || visibleIndex < 0) return;
 
27
  const agents = transcript.agents || [];
28
- if (visibleIndex >= agents.length) {
29
- onDone && onDone();
30
- return;
31
- }
32
- const current = agents[visibleIndex];
33
- const raw = formatRaw(current);
34
- if (visibleChars < raw.length) {
35
- const speed = Math.max(4, Math.floor(raw.length / 140));
36
- const id = setTimeout(() => setVisibleChars((c) => Math.min(raw.length, c + speed)), 16);
37
- return () => clearTimeout(id);
38
- }
39
- const next = setTimeout(() => {
40
- setVisibleIndex((i) => i + 1);
41
- setVisibleChars(0);
42
- }, 320);
43
- return () => clearTimeout(next);
44
- // eslint-disable-next-line react-hooks/exhaustive-deps
45
- }, [transcript, visibleIndex, visibleChars]);
46
 
47
  if (!transcript) return null;
48
  const agents = transcript.agents || [];
49
 
 
 
 
50
  return (
51
- <div className="space-y-0 border border-white/10 bg-[#0d0d10] fs-scanlines" data-testid="agent-transcript">
52
  {agents.map((a, idx) => {
53
  const Icon = ICONS[a.role] || Eye;
54
- const active = idx === visibleIndex;
55
- const done = idx < visibleIndex;
56
- const raw = formatRaw(a);
57
- const shown = done ? raw : active ? raw.slice(0, visibleChars) : "";
58
  return (
59
  <div
60
  key={a.role}
61
- className={`border-b border-white/10 last:border-b-0 p-5 transition-colors ${
62
- active ? "bg-[#141416]" : "bg-transparent"
63
- }`}
64
  data-testid={`agent-block-${a.role}`}
65
  >
66
- <div className="flex items-center justify-between mb-3">
 
67
  <div className="flex items-center gap-3">
68
- <div
69
- className={`w-7 h-7 flex items-center justify-center border ${
70
- active || done ? "border-[#ED1C24] text-[#ED1C24]" : "border-white/20 text-zinc-500"
71
- }`}
72
- >
73
  <Icon className="w-3.5 h-3.5" />
74
  </div>
75
  <div>
76
- <div className="font-display font-bold tracking-tight text-sm">{a.label}</div>
77
- <div className="fs-mono-small text-zinc-500">{a.model}</div>
78
  </div>
79
  </div>
80
- <StatusPill state={done ? "done" : active ? "active" : "pending"} />
81
  </div>
82
 
83
- <pre className="font-mono text-[12.5px] leading-relaxed text-zinc-300 whitespace-pre-wrap break-words">
84
- {shown}
85
- {active && <span className="fs-cursor" />}
86
- {!done && !active && <span className="text-zinc-600">awaiting upstream…</span>}
87
- </pre>
 
88
  </div>
89
  );
90
  })}
@@ -92,20 +248,8 @@ export default function AgentTranscript({ transcript, onDone }) {
92
  );
93
  }
94
 
95
- function StatusPill({ state }) {
96
- if (state === "done") return <span className="fs-chip fs-chip-pass">complete</span>;
97
- if (state === "active") return <span className="fs-chip fs-chip-fail">streaming</span>;
98
- return <span className="fs-chip">queued</span>;
99
- }
100
-
101
- function formatRaw(agent) {
102
- const parsed = agent?.output?.parsed;
103
- if (parsed && !parsed._raw) {
104
- try {
105
- return JSON.stringify(parsed, null, 2);
106
- } catch {
107
- return agent?.output?.raw || "";
108
- }
109
- }
110
- return agent?.output?.raw || "";
111
  }
 
1
  import { useEffect, useState } from "react";
2
+ import { Eye, Stethoscope, Wrench, FileText, CheckCircle2, AlertTriangle, XCircle, WifiOff } from "lucide-react";
3
 
4
  const ICONS = {
5
+ inspector: Eye,
6
  diagnostician: Stethoscope,
7
+ action: Wrench,
8
+ reporter: FileText,
9
  };
10
 
11
+ const VERDICT_CONFIG = {
12
+ pass: { label: "PASS", color: "#10B981", Icon: CheckCircle2 },
13
+ warn: { label: "WARN", color: "#F59E0B", Icon: AlertTriangle },
14
+ fail: { label: "FAIL", color: "#ED1C24", Icon: XCircle },
15
+ };
 
 
16
 
17
+ // ── Renderers β€” one per agent role ─────────────────────────────────────────
18
+
19
+ function InspectorOutput({ parsed, isMock }) {
20
+ const vc = VERDICT_CONFIG[parsed?.verdict] || VERDICT_CONFIG.warn;
21
+ const defects = parsed?.defects || [];
22
+ return (
23
+ <div className="space-y-4">
24
+ {isMock && (
25
+ <div className="flex items-center gap-2 px-3 py-2 bg-yellow-500/10 border border-yellow-500/30 rounded text-yellow-400 font-mono text-xs">
26
+ <WifiOff className="w-3 h-3 shrink-0" />
27
+ AMD server offline β€” showing demo data. Start the vLLM server for live inference.
28
+ </div>
29
+ )}
30
+ {/* Verdict banner */}
31
+ <div className="flex items-center gap-3 p-4 border rounded" style={{ borderColor: `${vc.color}44`, background: `${vc.color}0d` }}>
32
+ <vc.Icon className="w-5 h-5" style={{ color: vc.color }} />
33
+ <div>
34
+ <div className="font-mono text-xs text-zinc-400 mb-0.5">VERDICT</div>
35
+ <div className="font-display font-black text-xl tracking-tight" style={{ color: vc.color }}>{vc.label}</div>
36
+ </div>
37
+ <div className="ml-auto text-right">
38
+ <div className="font-mono text-xs text-zinc-400 mb-0.5">CONFIDENCE</div>
39
+ <div className="font-display font-black text-xl">{Math.round((parsed?.confidence || 0) * 100)}%</div>
40
+ </div>
41
+ </div>
42
+
43
+ {/* Observation */}
44
+ {parsed?.observation && (
45
+ <div>
46
+ <div className="font-mono text-[10px] text-zinc-500 uppercase tracking-wider mb-1.5">Observation</div>
47
+ <p className="text-sm text-zinc-300 leading-relaxed">{parsed.observation.replace("[LOCAL MOCK β€” AMD server offline]", "").trim()}</p>
48
+ </div>
49
+ )}
50
+
51
+ {/* Defects */}
52
+ {defects.length > 0 && (
53
+ <div>
54
+ <div className="font-mono text-[10px] text-zinc-500 uppercase tracking-wider mb-2">Detected Defects ({defects.length})</div>
55
+ <div className="space-y-2">
56
+ {defects.map((d, i) => (
57
+ <div key={i} className="flex gap-3 p-3 border border-white/10 bg-white/[0.02] rounded">
58
+ <div className="shrink-0 w-1.5 rounded-full self-stretch" style={{ background: d.severity === "high" ? "#ED1C24" : d.severity === "medium" ? "#F59E0B" : "#71717A" }} />
59
+ <div className="min-w-0">
60
+ <div className="flex items-center gap-2 flex-wrap mb-0.5">
61
+ <span className="font-mono text-xs font-bold text-white">{d.type}</span>
62
+ <span className="font-mono text-[10px] px-1.5 py-0.5 rounded border" style={{ color: d.severity === "high" ? "#ED1C24" : d.severity === "medium" ? "#F59E0B" : "#71717A", borderColor: "currentColor", background: "transparent" }}>{d.severity?.toUpperCase()}</span>
63
+ {d.location && <span className="font-mono text-[10px] text-zinc-500">@ {d.location}</span>}
64
+ </div>
65
+ <p className="text-xs text-zinc-400">{d.description}</p>
66
+ </div>
67
+ </div>
68
+ ))}
69
+ </div>
70
+ </div>
71
+ )}
72
+ </div>
73
+ );
74
+ }
75
+
76
+ function DiagnosticianOutput({ parsed }) {
77
+ const factors = parsed?.contributing_factors || [];
78
+ return (
79
+ <div className="space-y-3">
80
+ {parsed?.probable_cause && (
81
+ <div>
82
+ <div className="font-mono text-[10px] text-zinc-500 uppercase tracking-wider mb-1.5">Root Cause</div>
83
+ <p className="text-sm text-zinc-200 leading-relaxed font-medium">{parsed.probable_cause.replace("[LOCAL MOCK]", "").trim()}</p>
84
+ </div>
85
+ )}
86
+ {parsed?.affected_process_step && (
87
+ <div>
88
+ <div className="font-mono text-[10px] text-zinc-500 uppercase tracking-wider mb-1.5">Affected Process Step</div>
89
+ <span className="font-mono text-xs px-2 py-1 border border-white/20 text-zinc-300">{parsed.affected_process_step}</span>
90
+ </div>
91
+ )}
92
+ {factors.length > 0 && (
93
+ <div>
94
+ <div className="font-mono text-[10px] text-zinc-500 uppercase tracking-wider mb-2">Contributing Factors</div>
95
+ <ul className="space-y-1">
96
+ {factors.map((f, i) => (
97
+ <li key={i} className="flex items-start gap-2 text-sm text-zinc-300">
98
+ <span className="text-[#ED1C24] font-mono text-xs mt-0.5 shrink-0">β†’</span>
99
+ {f}
100
+ </li>
101
+ ))}
102
+ </ul>
103
+ </div>
104
+ )}
105
+ </div>
106
+ );
107
+ }
108
+
109
+ function ActionOutput({ parsed }) {
110
+ const steps = parsed?.steps || [];
111
+ const tools = parsed?.parts_or_tools || [];
112
+ const priorityColor = { P0: "#ED1C24", P1: "#F97316", P2: "#F59E0B", P3: "#71717A" }[parsed?.priority] || "#71717A";
113
+ return (
114
+ <div className="space-y-3">
115
+ <div className="flex gap-4 flex-wrap">
116
+ {parsed?.priority && (
117
+ <div>
118
+ <div className="font-mono text-[10px] text-zinc-500 uppercase tracking-wider mb-1">Priority</div>
119
+ <span className="font-display font-black text-xl" style={{ color: priorityColor }}>{parsed.priority}</span>
120
+ </div>
121
+ )}
122
+ {parsed?.assignee_role && (
123
+ <div>
124
+ <div className="font-mono text-[10px] text-zinc-500 uppercase tracking-wider mb-1">Assign To</div>
125
+ <span className="font-mono text-sm text-zinc-200">{parsed.assignee_role}</span>
126
+ </div>
127
+ )}
128
+ {parsed?.estimated_minutes && (
129
+ <div>
130
+ <div className="font-mono text-[10px] text-zinc-500 uppercase tracking-wider mb-1">Est. Time</div>
131
+ <span className="font-mono text-sm text-zinc-200">{parsed.estimated_minutes} min</span>
132
+ </div>
133
+ )}
134
+ </div>
135
+ {steps.length > 0 && (
136
+ <div>
137
+ <div className="font-mono text-[10px] text-zinc-500 uppercase tracking-wider mb-2">Work Order Steps</div>
138
+ <ol className="space-y-1.5">
139
+ {steps.map((s, i) => (
140
+ <li key={i} className="flex items-start gap-3 text-sm text-zinc-300">
141
+ <span className="font-mono text-xs text-zinc-500 w-5 shrink-0 text-right">{String(i + 1).padStart(2, "0")}.</span>
142
+ {s}
143
+ </li>
144
+ ))}
145
+ </ol>
146
+ </div>
147
+ )}
148
+ {tools.length > 0 && (
149
+ <div>
150
+ <div className="font-mono text-[10px] text-zinc-500 uppercase tracking-wider mb-2">Parts / Tools Required</div>
151
+ <div className="flex flex-wrap gap-1.5">
152
+ {tools.map((t, i) => <span key={i} className="font-mono text-xs px-2 py-1 border border-white/15 text-zinc-400">{t}</span>)}
153
+ </div>
154
+ </div>
155
+ )}
156
+ </div>
157
+ );
158
+ }
159
+
160
+ function ReporterOutput({ parsed }) {
161
+ const tags = parsed?.tags || [];
162
+ return (
163
+ <div className="space-y-3">
164
+ {parsed?.headline && (
165
+ <div className="font-display font-black text-2xl tracking-tighter text-white">{parsed.headline.replace("[Mock]", "").trim()}</div>
166
+ )}
167
+ {parsed?.summary && (
168
+ <p className="text-sm text-zinc-300 leading-relaxed">{parsed.summary}</p>
169
+ )}
170
+ {tags.length > 0 && (
171
+ <div className="flex flex-wrap gap-1.5">
172
+ {tags.map((t, i) => (
173
+ <span key={i} className="font-mono text-[10px] px-2 py-1 border border-[#ED1C24]/40 text-[#ED1C24] bg-[#ED1C24]/5">#{t}</span>
174
+ ))}
175
+ </div>
176
+ )}
177
+ </div>
178
+ );
179
+ }
180
+
181
+ function AgentContent({ agent, isMock }) {
182
+ const { role, output } = agent;
183
+ const parsed = output?.parsed || {};
184
+ if (role === "inspector") return <InspectorOutput parsed={parsed} isMock={isMock} />;
185
+ if (role === "diagnostician") return <DiagnosticianOutput parsed={parsed} />;
186
+ if (role === "action") return <ActionOutput parsed={parsed} />;
187
+ if (role === "reporter") return <ReporterOutput parsed={parsed} />;
188
+ return <pre className="font-mono text-xs text-zinc-400 whitespace-pre-wrap break-words">{JSON.stringify(parsed, null, 2)}</pre>;
189
+ }
190
+
191
+ // ── Main component ──────────────────────────────────────────────────────────
192
+
193
+ export default function AgentTranscript({ transcript }) {
194
+ const [revealed, setRevealed] = useState(0);
195
 
196
  useEffect(() => {
197
+ if (!transcript) return;
198
+ setRevealed(0);
199
  const agents = transcript.agents || [];
200
+ agents.forEach((_, i) => {
201
+ setTimeout(() => setRevealed((r) => Math.max(r, i + 1)), i * 400);
202
+ });
203
+ }, [transcript]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
204
 
205
  if (!transcript) return null;
206
  const agents = transcript.agents || [];
207
 
208
+ // Detect mock mode from first agent's source
209
+ const isMock = agents[0]?.output?.source?.includes("mock");
210
+
211
  return (
212
+ <div className="space-y-0 border border-white/10 bg-[#0d0d10]" data-testid="agent-transcript">
213
  {agents.map((a, idx) => {
214
  const Icon = ICONS[a.role] || Eye;
215
+ const isVisible = idx < revealed;
216
+ const isActive = idx === revealed - 1;
217
+
 
218
  return (
219
  <div
220
  key={a.role}
221
+ className={`border-b border-white/10 last:border-b-0 transition-all duration-500 ${isVisible ? "opacity-100" : "opacity-0"}`}
 
 
222
  data-testid={`agent-block-${a.role}`}
223
  >
224
+ {/* Agent header */}
225
+ <div className={`flex items-center justify-between px-5 py-3 border-b border-white/5 ${isActive ? "bg-[#ED1C24]/5" : "bg-[#141416]"}`}>
226
  <div className="flex items-center gap-3">
227
+ <div className={`w-7 h-7 flex items-center justify-center border ${isVisible ? "border-[#ED1C24] text-[#ED1C24]" : "border-white/20 text-zinc-500"}`}>
 
 
 
 
228
  <Icon className="w-3.5 h-3.5" />
229
  </div>
230
  <div>
231
+ <div className="font-display font-bold tracking-tight text-sm text-white">{a.label}</div>
232
+ <div className="font-mono text-[10px] text-zinc-500">{a.model}</div>
233
  </div>
234
  </div>
235
+ <StatusPill visible={isVisible} active={isActive} />
236
  </div>
237
 
238
+ {/* Agent body */}
239
+ {isVisible && (
240
+ <div className="p-5">
241
+ <AgentContent agent={a} isMock={isMock} />
242
+ </div>
243
+ )}
244
  </div>
245
  );
246
  })}
 
248
  );
249
  }
250
 
251
+ function StatusPill({ visible, active }) {
252
+ if (!visible) return <span className="fs-chip text-zinc-600">queued</span>;
253
+ if (active) return <span className="fs-chip" style={{ color: "#ED1C24", borderColor: "#ED1C24", background: "#ED1C2411" }}>complete</span>;
254
+ return <span className="fs-chip fs-chip-pass">complete</span>;
 
 
 
 
 
 
 
 
 
 
 
 
255
  }
frontend/src/components/ReportDownloader.jsx ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * ReportDownloader β€” exports an inspection result as PNG or PDF.
3
+ * Uses html2canvas to capture the DOM node passed via `targetRef`,
4
+ * then jsPDF to wrap it into a letter-sized PDF if needed.
5
+ */
6
+ import { useRef, useState } from "react";
7
+ import html2canvas from "html2canvas";
8
+ import { jsPDF } from "jspdf";
9
+ import { Download, Image as ImageIcon, FileText, Loader2 } from "lucide-react";
10
+
11
+ async function captureNode(node, scale = 2) {
12
+ return html2canvas(node, {
13
+ backgroundColor: "#0A0A0A",
14
+ scale,
15
+ useCORS: true,
16
+ logging: false,
17
+ });
18
+ }
19
+
20
+ export default function ReportDownloader({ targetRef, inspectionId, disabled }) {
21
+ const [busy, setBusy] = useState(null); // "png" | "pdf" | null
22
+
23
+ const filename = `forgesight-report-${(inspectionId || "inspection").slice(0, 8)}`;
24
+
25
+ const downloadPNG = async () => {
26
+ if (!targetRef?.current || busy) return;
27
+ setBusy("png");
28
+ try {
29
+ const canvas = await captureNode(targetRef.current, 2);
30
+ const link = document.createElement("a");
31
+ link.download = `${filename}.png`;
32
+ link.href = canvas.toDataURL("image/png");
33
+ link.click();
34
+ } finally {
35
+ setBusy(null);
36
+ }
37
+ };
38
+
39
+ const downloadPDF = async () => {
40
+ if (!targetRef?.current || busy) return;
41
+ setBusy("pdf");
42
+ try {
43
+ const canvas = await captureNode(targetRef.current, 2);
44
+ const imgData = canvas.toDataURL("image/png");
45
+
46
+ // A4 portrait in mm
47
+ const pdf = new jsPDF({ orientation: "portrait", unit: "mm", format: "a4" });
48
+ const pageW = pdf.internal.pageSize.getWidth();
49
+ const pageH = pdf.internal.pageSize.getHeight();
50
+
51
+ // Scale image to fit full page width, paginate if tall
52
+ const imgW = canvas.width;
53
+ const imgH = canvas.height;
54
+ const ratio = pageW / (imgW / 2); // /2 because scale=2
55
+ const scaledH = (imgH / 2) * ratio;
56
+
57
+ let yOffset = 0;
58
+ let remaining = scaledH;
59
+ let page = 0;
60
+
61
+ while (remaining > 0) {
62
+ if (page > 0) pdf.addPage();
63
+ const sliceH = Math.min(remaining, pageH);
64
+ // sourceY in original canvas pixels
65
+ const srcY = page * pageH * (imgW / 2) / pageW;
66
+ pdf.addImage(
67
+ imgData,
68
+ "PNG",
69
+ 0, 0,
70
+ pageW, sliceH,
71
+ undefined, "FAST",
72
+ 0,
73
+ );
74
+ remaining -= pageH;
75
+ page++;
76
+ }
77
+
78
+ // Metadata
79
+ pdf.setProperties({
80
+ title: `ForgeSight Inspection Report`,
81
+ subject: "Automated QC Report β€” AMD MI300X Γ— Qwen2-VL",
82
+ author: "ForgeSight",
83
+ creator: "ForgeSight Β· AMD Developer Hackathon",
84
+ });
85
+
86
+ pdf.save(`${filename}.pdf`);
87
+ } finally {
88
+ setBusy(null);
89
+ }
90
+ };
91
+
92
+ if (disabled) return null;
93
+
94
+ return (
95
+ <div className="flex items-center gap-2">
96
+ <span className="fs-label hidden sm:inline">Export</span>
97
+
98
+ {/* PNG */}
99
+ <button
100
+ onClick={downloadPNG}
101
+ disabled={!!busy}
102
+ title="Download as PNG"
103
+ className="fs-chip inline-flex items-center gap-1.5 hover:border-white/40 hover:text-white disabled:opacity-40 disabled:cursor-not-allowed transition-colors"
104
+ data-testid="download-png-btn"
105
+ >
106
+ {busy === "png" ? (
107
+ <Loader2 className="w-3 h-3 animate-spin" />
108
+ ) : (
109
+ <ImageIcon className="w-3 h-3" />
110
+ )}
111
+ PNG
112
+ </button>
113
+
114
+ {/* PDF */}
115
+ <button
116
+ onClick={downloadPDF}
117
+ disabled={!!busy}
118
+ title="Download as PDF"
119
+ className="fs-chip inline-flex items-center gap-1.5 hover:border-white/40 hover:text-white disabled:opacity-40 disabled:cursor-not-allowed transition-colors"
120
+ data-testid="download-pdf-btn"
121
+ >
122
+ {busy === "pdf" ? (
123
+ <Loader2 className="w-3 h-3 animate-spin" />
124
+ ) : (
125
+ <FileText className="w-3 h-3" />
126
+ )}
127
+ PDF
128
+ </button>
129
+ </div>
130
+ );
131
+ }
frontend/src/components/TelemetryWidget.jsx CHANGED
@@ -1,66 +1,222 @@
1
- import { useEffect, useState } from "react";
2
  import { forgesight } from "@/lib/api";
3
- import { Activity } from "lucide-react";
4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  export default function TelemetryWidget() {
6
- const [t, setT] = useState(null);
 
7
 
8
  useEffect(() => {
9
  let alive = true;
10
  const tick = async () => {
11
  try {
12
  const data = await forgesight.getTelemetry();
13
- if (alive) setT(data);
 
 
 
14
  } catch {}
15
  };
16
  tick();
17
- const id = setInterval(tick, 1500);
18
- return () => {
19
- alive = false;
20
- clearInterval(id);
21
- };
22
  }, []);
23
 
24
- const vramPct = t ? (t.vram_used_gb / t.vram_total_gb) * 100 : 0;
 
 
 
 
 
 
 
 
 
25
 
26
  return (
27
- <div className="border border-white/10 bg-[#141416] p-5 fs-corners" data-testid="telemetry-widget">
28
- <div className="flex items-center justify-between mb-4">
 
 
 
 
 
 
 
 
 
29
  <div className="flex items-center gap-2">
30
- <Activity className="w-3.5 h-3.5 text-[#ED1C24]" />
31
  <span className="fs-label">Live Telemetry</span>
32
  </div>
33
- <span className="fs-chip fs-chip-warn" data-testid="telemetry-simulated-chip">SIMULATED</span>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  </div>
35
 
36
- <div className="font-mono text-xs text-zinc-500 mb-3">
37
- {t ? t.device : "AMD Instinct MI300X"}
 
 
 
 
 
 
 
38
  </div>
39
 
40
- <div className="space-y-3">
41
- <Row label="GPU Util" value={t ? `${t.gpu_util_pct.toFixed(1)}%` : "β€”"} pct={t?.gpu_util_pct || 0} />
42
- <Row
43
- label="VRAM"
44
- value={t ? `${t.vram_used_gb.toFixed(1)} / ${t.vram_total_gb} GB` : "β€”"}
 
 
 
 
 
45
  pct={vramPct}
 
 
 
 
 
 
 
 
 
 
 
46
  />
47
- <Row label="Tokens/sec" value={t ? t.tokens_per_sec.toLocaleString() : "β€”"} pct={t ? (t.tokens_per_sec / 4000) * 100 : 0} />
48
- <Row label="Power" value={t ? `${t.power_watts} W` : "β€”"} pct={t ? (t.power_watts / 750) * 100 : 0} />
49
- <Row label="Temp" value={t ? `${t.temp_c.toFixed(1)} Β°C` : "β€”"} pct={t ? (t.temp_c / 90) * 100 : 0} />
50
  </div>
51
- </div>
52
- );
53
- }
54
 
55
- function Row({ label, value, pct }) {
56
- return (
57
- <div>
58
- <div className="flex items-baseline justify-between">
59
- <span className="fs-mono-small text-zinc-500 uppercase">{label}</span>
60
- <span className="font-mono text-sm text-white tabular-nums">{value}</span>
61
- </div>
62
- <div className="fs-bar mt-1.5">
63
- <div style={{ width: `${Math.max(2, Math.min(100, pct))}%` }} />
 
 
 
 
 
 
 
 
 
 
 
64
  </div>
65
  </div>
66
  );
 
1
+ import { useEffect, useRef, useState } from "react";
2
  import { forgesight } from "@/lib/api";
3
+ import { Activity, Cpu, Zap, Thermometer, BarChart3, Database } from "lucide-react";
4
 
5
+ /* ── helpers ─────────────────────────────────────────────────────────────── */
6
+ function arc(pct, r = 38) {
7
+ const clamp = Math.min(100, Math.max(0, pct));
8
+ const angle = (clamp / 100) * 270 - 135; // 270Β° sweep, start -135Β°
9
+ const rad = (a) => (a * Math.PI) / 180;
10
+ const x = 50 + r * Math.cos(rad(angle));
11
+ const y = 50 + r * Math.sin(rad(angle));
12
+ const large = clamp > 50 ? 1 : 0;
13
+ const sx = 50 + r * Math.cos(rad(-135));
14
+ const sy = 50 + r * Math.sin(rad(-135));
15
+ return `M ${sx} ${sy} A ${r} ${r} 0 ${large} 1 ${x} ${y}`;
16
+ }
17
+
18
+ function ArcGauge({ pct = 0, label, value, icon: Icon, color = "#ED1C24" }) {
19
+ const prev = useRef(pct);
20
+ const [displayed, setDisplayed] = useState(pct);
21
+
22
+ useEffect(() => {
23
+ // smooth interpolation
24
+ const start = prev.current;
25
+ const end = pct;
26
+ const dur = 600;
27
+ const t0 = performance.now();
28
+ let raf;
29
+ const step = (now) => {
30
+ const progress = Math.min((now - t0) / dur, 1);
31
+ const eased = 1 - Math.pow(1 - progress, 3);
32
+ setDisplayed(start + (end - start) * eased);
33
+ if (progress < 1) raf = requestAnimationFrame(step);
34
+ else prev.current = end;
35
+ };
36
+ raf = requestAnimationFrame(step);
37
+ return () => cancelAnimationFrame(raf);
38
+ }, [pct]);
39
+
40
+ const bgPath = arc(100);
41
+ const fgPath = arc(displayed);
42
+
43
+ return (
44
+ <div className="flex flex-col items-center gap-1 min-w-0">
45
+ <div className="relative w-20 h-20 shrink-0">
46
+ <svg viewBox="0 0 100 100" className="w-full h-full -rotate-90" style={{ transform: "rotate(0deg)" }}>
47
+ {/* Track */}
48
+ <path d={bgPath} fill="none" stroke="#27272A" strokeWidth="8" strokeLinecap="round" />
49
+ {/* Value */}
50
+ <path
51
+ d={fgPath}
52
+ fill="none"
53
+ stroke={color}
54
+ strokeWidth="8"
55
+ strokeLinecap="round"
56
+ style={{ filter: `drop-shadow(0 0 4px ${color}66)` }}
57
+ />
58
+ </svg>
59
+ {/* Center icon */}
60
+ <div className="absolute inset-0 flex items-center justify-center">
61
+ {Icon && <Icon className="w-4 h-4" style={{ color }} />}
62
+ </div>
63
+ </div>
64
+ <div className="font-mono text-sm text-white tabular-nums text-center leading-tight">
65
+ {value}
66
+ </div>
67
+ <div className="font-mono text-[10px] text-zinc-500 uppercase tracking-wider text-center">
68
+ {label}
69
+ </div>
70
+ </div>
71
+ );
72
+ }
73
+
74
+ function StatRow({ label, value, pct, color = "#ED1C24" }) {
75
+ return (
76
+ <div>
77
+ <div className="flex items-baseline justify-between mb-1">
78
+ <span className="font-mono text-[10px] text-zinc-500 uppercase tracking-wider">{label}</span>
79
+ <span className="font-mono text-xs text-white tabular-nums">{value}</span>
80
+ </div>
81
+ <div className="h-1 w-full bg-white/5 rounded-full overflow-hidden">
82
+ <div
83
+ className="h-full rounded-full transition-all duration-700 ease-out"
84
+ style={{
85
+ width: `${Math.max(2, Math.min(100, pct))}%`,
86
+ background: `linear-gradient(90deg, ${color}99, ${color})`,
87
+ boxShadow: `0 0 6px ${color}66`,
88
+ }}
89
+ />
90
+ </div>
91
+ </div>
92
+ );
93
+ }
94
+
95
+ /* ── main component ──────────────────────────────────────────────────────── */
96
  export default function TelemetryWidget() {
97
+ const [t, setT] = useState(null);
98
+ const [blink, setBlink] = useState(false);
99
 
100
  useEffect(() => {
101
  let alive = true;
102
  const tick = async () => {
103
  try {
104
  const data = await forgesight.getTelemetry();
105
+ if (alive) {
106
+ setT(data);
107
+ setBlink((b) => !b);
108
+ }
109
  } catch {}
110
  };
111
  tick();
112
+ const id = setInterval(tick, 2000);
113
+ return () => { alive = false; clearInterval(id); };
 
 
 
114
  }, []);
115
 
116
+ const status = t?.status ?? "β€”";
117
+ const isLive = status === "Connected";
118
+ const isLimited = status === "Limited";
119
+
120
+ const statusColor = isLive ? "#10B981" : isLimited ? "#F59E0B" : "#71717A";
121
+ const statusLabel = isLive ? "LIVE" : isLimited ? "LIMITED" : "OFFLINE";
122
+
123
+ const vramPct = t ? (t.vram_used_gb / t.vram_total_gb) * 100 : 0;
124
+ const tokensPct = t ? (t.tokens_per_sec / 4000) * 100 : 0;
125
+ const powerPct = t ? (t.power_watts / 750) * 100 : 0;
126
 
127
  return (
128
+ <div
129
+ className="border bg-[#0d0d10] p-5 fs-corners"
130
+ style={{
131
+ borderColor: isLive ? "#10B98133" : "#27272A",
132
+ boxShadow: isLive ? "0 0 20px #10B98111" : "none",
133
+ transition: "border-color 0.6s, box-shadow 0.6s",
134
+ }}
135
+ data-testid="telemetry-widget"
136
+ >
137
+ {/* Header */}
138
+ <div className="flex items-center justify-between mb-5">
139
  <div className="flex items-center gap-2">
140
+ <Activity className="w-3.5 h-3.5" style={{ color: statusColor }} />
141
  <span className="fs-label">Live Telemetry</span>
142
  </div>
143
+ <div className="flex items-center gap-2">
144
+ {/* Pulse dot */}
145
+ <span
146
+ className="w-2 h-2 rounded-full inline-block"
147
+ style={{
148
+ background: statusColor,
149
+ boxShadow: isLive ? `0 0 6px ${statusColor}` : "none",
150
+ opacity: isLive && blink ? 1 : isLive ? 0.5 : 0.3,
151
+ transition: "opacity 0.5s",
152
+ }}
153
+ />
154
+ <span
155
+ className="font-mono text-[10px] tracking-widest px-2 py-0.5 border rounded"
156
+ style={{ color: statusColor, borderColor: `${statusColor}44`, background: `${statusColor}11` }}
157
+ data-testid="telemetry-status-badge"
158
+ >
159
+ {statusLabel}
160
+ </span>
161
+ </div>
162
  </div>
163
 
164
+ {/* Device */}
165
+ <div className="font-mono text-[10px] text-zinc-600 mb-4 flex items-center justify-between">
166
+ <span>{t?.device ?? "AMD Instinct MI300X"}</span>
167
+ {t?.persistence && (
168
+ <span className="flex items-center gap-1 text-zinc-600">
169
+ <Database className="w-2.5 h-2.5" />
170
+ {t.persistence}
171
+ </span>
172
+ )}
173
  </div>
174
 
175
+ {/* Arc gauges row */}
176
+ <div className="grid grid-cols-3 gap-2 mb-5 pb-5 border-b border-white/5">
177
+ <ArcGauge
178
+ pct={t?.gpu_util_pct ?? 0}
179
+ label="GPU Util"
180
+ value={t ? `${t.gpu_util_pct.toFixed(0)}%` : "β€”"}
181
+ icon={Cpu}
182
+ color={isLive ? "#ED1C24" : "#3F3F46"}
183
+ />
184
+ <ArcGauge
185
  pct={vramPct}
186
+ label="VRAM"
187
+ value={t ? `${t.vram_used_gb.toFixed(0)}G` : "β€”"}
188
+ icon={BarChart3}
189
+ color={isLive ? "#F59E0B" : "#3F3F46"}
190
+ />
191
+ <ArcGauge
192
+ pct={t?.temp_c ? (t.temp_c / 90) * 100 : 0}
193
+ label="Temp"
194
+ value={t ? `${t.temp_c.toFixed(0)}Β°C` : "β€”"}
195
+ icon={Thermometer}
196
+ color={isLive ? "#06B6D4" : "#3F3F46"}
197
  />
 
 
 
198
  </div>
 
 
 
199
 
200
+ {/* Bar stats */}
201
+ <div className="space-y-3">
202
+ <StatRow
203
+ label="Tokens/sec"
204
+ value={t ? t.tokens_per_sec.toLocaleString() : "β€”"}
205
+ pct={tokensPct}
206
+ color={isLive ? "#10B981" : "#3F3F46"}
207
+ />
208
+ <StatRow
209
+ label="Power Draw"
210
+ value={t ? `${t.power_watts} W` : "β€”"}
211
+ pct={powerPct}
212
+ color={isLive ? "#ED1C24" : "#3F3F46"}
213
+ />
214
+ <StatRow
215
+ label="VRAM Used"
216
+ value={t ? `${t.vram_used_gb.toFixed(1)} / ${t.vram_total_gb} GB` : "β€”"}
217
+ pct={vramPct}
218
+ color={isLive ? "#F59E0B" : "#3F3F46"}
219
+ />
220
  </div>
221
  </div>
222
  );
frontend/src/pages/Console.jsx CHANGED
@@ -4,6 +4,7 @@ import { toast } from "sonner";
4
  import { forgesight, fileToBase64 } from "@/lib/api";
5
  import TelemetryWidget from "@/components/TelemetryWidget";
6
  import AgentTranscript from "@/components/AgentTranscript";
 
7
 
8
  export default function Console() {
9
  const [file, setFile] = useState(null);
@@ -13,7 +14,8 @@ export default function Console() {
13
  const [loading, setLoading] = useState(false);
14
  const [result, setResult] = useState(null);
15
  const [dragActive, setDragActive] = useState(false);
16
- const inputRef = useRef(null);
 
17
 
18
  const handleFile = useCallback((f) => {
19
  if (!f) return;
@@ -174,13 +176,22 @@ export default function Console() {
174
  </div>
175
 
176
  {/* RIGHT β€” transcript */}
177
- <div className="lg:col-span-7 space-y-6">
178
  {summary && (
179
- <div className="border border-white/10 bg-[#141416] p-5 grid grid-cols-2 md:grid-cols-4 gap-4 fs-rise" data-testid="summary-panel">
180
- <SummaryStat label="Verdict" value={summary.verdict.toUpperCase()} kind={summary.verdict} />
181
- <SummaryStat label="Confidence" value={`${Math.round(summary.confidence * 100)}%`} />
182
- <SummaryStat label="Defects" value={summary.defect_count} />
183
- <SummaryStat label="Priority" value={summary.priority} />
 
 
 
 
 
 
 
 
 
184
  </div>
185
  )}
186
 
 
4
  import { forgesight, fileToBase64 } from "@/lib/api";
5
  import TelemetryWidget from "@/components/TelemetryWidget";
6
  import AgentTranscript from "@/components/AgentTranscript";
7
+ import ReportDownloader from "@/components/ReportDownloader";
8
 
9
  export default function Console() {
10
  const [file, setFile] = useState(null);
 
14
  const [loading, setLoading] = useState(false);
15
  const [result, setResult] = useState(null);
16
  const [dragActive, setDragActive] = useState(false);
17
+ const inputRef = useRef(null);
18
+ const reportRef = useRef(null);
19
 
20
  const handleFile = useCallback((f) => {
21
  if (!f) return;
 
176
  </div>
177
 
178
  {/* RIGHT β€” transcript */}
179
+ <div className="lg:col-span-7 space-y-6" ref={reportRef}>
180
  {summary && (
181
+ <div className="border border-white/10 bg-[#141416] p-5 fs-rise" data-testid="summary-panel">
182
+ <div className="flex items-start justify-between gap-4 flex-wrap mb-4">
183
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-4 flex-1">
184
+ <SummaryStat label="Verdict" value={summary.verdict.toUpperCase()} kind={summary.verdict} />
185
+ <SummaryStat label="Confidence" value={`${Math.round(summary.confidence * 100)}%`} />
186
+ <SummaryStat label="Defects" value={summary.defect_count} />
187
+ <SummaryStat label="Priority" value={summary.priority} />
188
+ </div>
189
+ <ReportDownloader
190
+ targetRef={reportRef}
191
+ inspectionId={result?.id}
192
+ disabled={!result}
193
+ />
194
+ </div>
195
  </div>
196
  )}
197
 
frontend/yarn.lock CHANGED
@@ -318,11 +318,6 @@
318
  "@babel/helper-create-class-features-plugin" "^7.18.6"
319
  "@babel/helper-plugin-utils" "^7.18.6"
320
 
321
- "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2":
322
- version "7.21.0-placeholder-for-preset-env.2"
323
- resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz"
324
- integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==
325
-
326
  "@babel/plugin-proposal-private-property-in-object@^7.16.7", "@babel/plugin-proposal-private-property-in-object@^7.21.11":
327
  version "7.21.11"
328
  resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz"
@@ -333,6 +328,11 @@
333
  "@babel/helper-plugin-utils" "^7.20.2"
334
  "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
335
 
 
 
 
 
 
336
  "@babel/plugin-syntax-async-generators@^7.8.4":
337
  version "7.8.4"
338
  resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz"
@@ -1057,10 +1057,10 @@
1057
  "@babel/plugin-transform-modules-commonjs" "^7.27.1"
1058
  "@babel/plugin-transform-typescript" "^7.28.5"
1059
 
1060
- "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3":
1061
- version "7.28.4"
1062
- resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz"
1063
- integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==
1064
 
1065
  "@babel/template@^7.27.1", "@babel/template@^7.27.2", "@babel/template@^7.3.3":
1066
  version "7.27.2"
@@ -1652,14 +1652,6 @@
1652
  resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"
1653
  integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
1654
 
1655
- "@jridgewell/trace-mapping@0.3.9":
1656
- version "0.3.9"
1657
- resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz"
1658
- integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
1659
- dependencies:
1660
- "@jridgewell/resolve-uri" "^3.0.3"
1661
- "@jridgewell/sourcemap-codec" "^1.4.10"
1662
-
1663
  "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28":
1664
  version "0.3.31"
1665
  resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz"
@@ -1668,6 +1660,14 @@
1668
  "@jridgewell/resolve-uri" "^3.1.0"
1669
  "@jridgewell/sourcemap-codec" "^1.4.14"
1670
 
 
 
 
 
 
 
 
 
1671
  "@leichtgewicht/ip-codec@^2.0.1":
1672
  version "2.0.5"
1673
  resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz"
@@ -1688,7 +1688,7 @@
1688
  "@nodelib/fs.stat" "2.0.5"
1689
  run-parallel "^1.1.9"
1690
 
1691
- "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
1692
  version "2.0.5"
1693
  resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
1694
  integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@@ -1790,7 +1790,7 @@
1790
  "@radix-ui/react-use-previous" "1.1.1"
1791
  "@radix-ui/react-use-size" "1.1.1"
1792
 
1793
- "@radix-ui/react-collapsible@1.1.12", "@radix-ui/react-collapsible@^1.1.8":
1794
  version "1.1.12"
1795
  resolved "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz"
1796
  integrity sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==
@@ -1814,7 +1814,7 @@
1814
  "@radix-ui/react-primitive" "2.1.3"
1815
  "@radix-ui/react-slot" "1.2.3"
1816
 
1817
- "@radix-ui/react-compose-refs@1.1.2", "@radix-ui/react-compose-refs@^1.1.1":
1818
  version "1.1.2"
1819
  resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz"
1820
  integrity sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==
@@ -1841,7 +1841,7 @@
1841
  resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz"
1842
  integrity sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==
1843
 
1844
- "@radix-ui/react-dialog@1.1.15", "@radix-ui/react-dialog@^1.1.1", "@radix-ui/react-dialog@^1.1.11", "@radix-ui/react-dialog@^1.1.6":
1845
  version "1.1.15"
1846
  resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz"
1847
  integrity sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==
@@ -1919,7 +1919,7 @@
1919
  "@radix-ui/react-primitive" "2.1.3"
1920
  "@radix-ui/react-use-controllable-state" "1.2.2"
1921
 
1922
- "@radix-ui/react-id@1.1.1", "@radix-ui/react-id@^1.1.0":
1923
  version "1.1.1"
1924
  resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz"
1925
  integrity sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==
@@ -2046,7 +2046,7 @@
2046
  "@radix-ui/react-compose-refs" "1.1.2"
2047
  "@radix-ui/react-use-layout-effect" "1.1.1"
2048
 
2049
- "@radix-ui/react-primitive@2.1.3", "@radix-ui/react-primitive@^2.0.2":
2050
  version "2.1.3"
2051
  resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz"
2052
  integrity sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==
@@ -2165,6 +2165,13 @@
2165
  "@radix-ui/react-use-previous" "1.1.1"
2166
  "@radix-ui/react-use-size" "1.1.1"
2167
 
 
 
 
 
 
 
 
2168
  "@radix-ui/react-slot@1.2.3":
2169
  version "1.2.3"
2170
  resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz"
@@ -2172,13 +2179,6 @@
2172
  dependencies:
2173
  "@radix-ui/react-compose-refs" "1.1.2"
2174
 
2175
- "@radix-ui/react-slot@1.2.4", "@radix-ui/react-slot@^1.2.0":
2176
- version "1.2.4"
2177
- resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz"
2178
- integrity sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==
2179
- dependencies:
2180
- "@radix-ui/react-compose-refs" "1.1.2"
2181
-
2182
  "@radix-ui/react-switch@^1.2.2":
2183
  version "1.2.6"
2184
  resolved "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz"
@@ -2237,7 +2237,7 @@
2237
  "@radix-ui/react-toggle" "1.1.10"
2238
  "@radix-ui/react-use-controllable-state" "1.2.2"
2239
 
2240
- "@radix-ui/react-toggle@1.1.10", "@radix-ui/react-toggle@^1.1.6":
2241
  version "1.1.10"
2242
  resolved "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz"
2243
  integrity sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==
@@ -2807,6 +2807,11 @@
2807
  dependencies:
2808
  undici-types "~7.16.0"
2809
 
 
 
 
 
 
2810
  "@types/parse-json@^4.0.0":
2811
  version "4.0.2"
2812
  resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz"
@@ -2827,6 +2832,11 @@
2827
  resolved "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz"
2828
  integrity sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==
2829
 
 
 
 
 
 
2830
  "@types/range-parser@*":
2831
  version "1.2.7"
2832
  resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz"
@@ -2892,7 +2902,7 @@
2892
  resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz"
2893
  integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==
2894
 
2895
- "@types/trusted-types@^2.0.2":
2896
  version "2.0.7"
2897
  resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz"
2898
  integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==
@@ -2997,7 +3007,7 @@
2997
  semver "^7.3.7"
2998
  tsutils "^3.21.0"
2999
 
3000
- "@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.58.0":
3001
  version "5.62.0"
3002
  resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz"
3003
  integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==
@@ -3024,7 +3034,7 @@
3024
  resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz"
3025
  integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==
3026
 
3027
- "@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1":
3028
  version "1.14.1"
3029
  resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz"
3030
  integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==
@@ -3125,7 +3135,7 @@
3125
  "@webassemblyjs/wasm-gen" "1.14.1"
3126
  "@webassemblyjs/wasm-parser" "1.14.1"
3127
 
3128
- "@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1":
3129
  version "1.14.1"
3130
  resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz"
3131
  integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==
@@ -3235,7 +3245,12 @@ ajv-formats@^2.1.1:
3235
  dependencies:
3236
  ajv "^8.0.0"
3237
 
3238
- ajv-keywords@^3.4.1, ajv-keywords@^3.5.2:
 
 
 
 
 
3239
  version "3.5.2"
3240
  resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz"
3241
  integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
@@ -3247,20 +3262,40 @@ ajv-keywords@^5.1.0:
3247
  dependencies:
3248
  fast-deep-equal "^3.1.3"
3249
 
3250
- ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5:
3251
- version "6.12.6"
3252
- resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
3253
- integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3254
  dependencies:
3255
  fast-deep-equal "^3.1.1"
3256
  fast-json-stable-stringify "^2.0.0"
3257
  json-schema-traverse "^0.4.1"
3258
  uri-js "^4.2.2"
3259
 
3260
- ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0:
3261
- version "8.17.1"
3262
- resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz"
3263
- integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
3264
  dependencies:
3265
  fast-deep-equal "^3.1.3"
3266
  fast-uri "^3.0.1"
@@ -3687,6 +3722,11 @@ balanced-match@^1.0.0:
3687
  resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
3688
  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
3689
 
 
 
 
 
 
3690
  baseline-browser-mapping@^2.9.0:
3691
  version "2.9.11"
3692
  resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz"
@@ -3809,7 +3849,7 @@ builtin-modules@^3.1.0:
3809
  resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz"
3810
  integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==
3811
 
3812
- bytes@3.1.2, bytes@~3.1.2:
3813
  version "3.1.2"
3814
  resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz"
3815
  integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
@@ -3883,6 +3923,20 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001759, caniuse-lite@^1.0.30001760:
3883
  resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz"
3884
  integrity sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==
3885
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3886
  case-sensitive-paths-webpack-plugin@^2.4.0:
3887
  version "2.4.0"
3888
  resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz"
@@ -4030,16 +4084,16 @@ color-convert@^2.0.1:
4030
  dependencies:
4031
  color-name "~1.1.4"
4032
 
4033
- color-name@1.1.3:
4034
- version "1.1.3"
4035
- resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
4036
- integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
4037
-
4038
  color-name@~1.1.4:
4039
  version "1.1.4"
4040
  resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
4041
  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
4042
 
 
 
 
 
 
4043
  colord@^2.9.1:
4044
  version "2.9.3"
4045
  resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz"
@@ -4134,7 +4188,17 @@ content-type@~1.0.4, content-type@~1.0.5:
4134
  resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz"
4135
  integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
4136
 
4137
- convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
 
 
 
 
 
 
 
 
 
 
4138
  version "1.9.0"
4139
  resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"
4140
  integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
@@ -4171,7 +4235,7 @@ core-js-pure@^3.23.3:
4171
  resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz"
4172
  integrity sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==
4173
 
4174
- core-js@^3.19.2:
4175
  version "3.47.0"
4176
  resolved "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz"
4177
  integrity sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==
@@ -4254,6 +4318,13 @@ css-has-pseudo@^3.0.4:
4254
  dependencies:
4255
  postcss-selector-parser "^6.0.9"
4256
 
 
 
 
 
 
 
 
4257
  css-loader@^6.5.1:
4258
  version "6.11.0"
4259
  resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz"
@@ -4311,15 +4382,15 @@ css-select@^4.1.3:
4311
  domutils "^2.8.0"
4312
  nth-check "^2.0.1"
4313
 
4314
- css-tree@1.0.0-alpha.37:
4315
- version "1.0.0-alpha.37"
4316
- resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz"
4317
- integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==
4318
  dependencies:
4319
- mdn-data "2.0.4"
4320
  source-map "^0.6.1"
4321
 
4322
- css-tree@^1.1.2, css-tree@^1.1.3:
4323
  version "1.1.3"
4324
  resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz"
4325
  integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
@@ -4327,6 +4398,14 @@ css-tree@^1.1.2, css-tree@^1.1.3:
4327
  mdn-data "2.0.14"
4328
  source-map "^0.6.1"
4329
 
 
 
 
 
 
 
 
 
4330
  css-what@^3.2.1:
4331
  version "3.4.2"
4332
  resolved "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz"
@@ -4420,7 +4499,7 @@ cssstyle@^2.3.0:
4420
  dependencies:
4421
  cssom "~0.3.6"
4422
 
4423
- "d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6:
4424
  version "3.2.4"
4425
  resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"
4426
  integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
@@ -4442,7 +4521,7 @@ d3-ease@^3.0.1:
4442
  resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz"
4443
  integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==
4444
 
4445
- "d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1:
4446
  version "3.0.1"
4447
  resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz"
4448
  integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
@@ -4479,7 +4558,7 @@ d3-shape@^3.1.0:
4479
  dependencies:
4480
  d3-time "1 - 3"
4481
 
4482
- "d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0:
4483
  version "3.1.0"
4484
  resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz"
4485
  integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
@@ -4537,26 +4616,33 @@ date-fns@^4.1.0:
4537
  resolved "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz"
4538
  integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==
4539
 
4540
- debug@2.6.9, debug@^2.6.0:
4541
  version "2.6.9"
4542
  resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
4543
  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
4544
  dependencies:
4545
  ms "2.0.0"
4546
 
4547
- debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.1:
 
 
 
 
 
 
 
4548
  version "4.4.3"
4549
  resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"
4550
  integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
4551
  dependencies:
4552
  ms "^2.1.3"
4553
 
4554
- debug@^3.2.7:
4555
- version "3.2.7"
4556
- resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
4557
- integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
4558
  dependencies:
4559
- ms "^2.1.1"
4560
 
4561
  decimal.js-light@^2.5.1:
4562
  version "2.5.1"
@@ -4618,17 +4704,17 @@ delayed-stream@~1.0.0:
4618
  resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
4619
  integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
4620
 
4621
- depd@2.0.0, depd@~2.0.0:
4622
- version "2.0.0"
4623
- resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"
4624
- integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
4625
-
4626
  depd@~1.1.2:
4627
  version "1.1.2"
4628
  resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
4629
  integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
4630
 
4631
- destroy@1.2.0, destroy@~1.2.0:
 
 
 
 
 
4632
  version "1.2.0"
4633
  resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz"
4634
  integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
@@ -4711,14 +4797,6 @@ dom-converter@^0.2.0:
4711
  dependencies:
4712
  utila "~0.4"
4713
 
4714
- dom-serializer@0:
4715
- version "0.2.2"
4716
- resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz"
4717
- integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
4718
- dependencies:
4719
- domelementtype "^2.0.1"
4720
- entities "^2.0.0"
4721
-
4722
  dom-serializer@^1.0.1:
4723
  version "1.4.1"
4724
  resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz"
@@ -4728,16 +4806,24 @@ dom-serializer@^1.0.1:
4728
  domhandler "^4.2.0"
4729
  entities "^2.0.0"
4730
 
4731
- domelementtype@1:
4732
- version "1.3.1"
4733
- resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz"
4734
- integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
 
 
 
4735
 
4736
  domelementtype@^2.0.1, domelementtype@^2.2.0:
4737
  version "2.3.0"
4738
  resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz"
4739
  integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
4740
 
 
 
 
 
 
4741
  domexception@^2.0.1:
4742
  version "2.0.1"
4743
  resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz"
@@ -4752,6 +4838,13 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1:
4752
  dependencies:
4753
  domelementtype "^2.2.0"
4754
 
 
 
 
 
 
 
 
4755
  domutils@^1.7.0:
4756
  version "1.7.0"
4757
  resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz"
@@ -5125,7 +5218,7 @@ eslint-plugin-flowtype@^8.0.3:
5125
  lodash "^4.17.21"
5126
  string-natural-compare "^3.0.1"
5127
 
5128
- eslint-plugin-import@2.31.0, eslint-plugin-import@^2.25.3:
5129
  version "2.31.0"
5130
  resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz"
5131
  integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==
@@ -5157,7 +5250,7 @@ eslint-plugin-jest@^25.3.0:
5157
  dependencies:
5158
  "@typescript-eslint/experimental-utils" "^5.0.0"
5159
 
5160
- eslint-plugin-jsx-a11y@6.10.2, eslint-plugin-jsx-a11y@^6.5.1:
5161
  version "6.10.2"
5162
  resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz"
5163
  integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==
@@ -5178,17 +5271,17 @@ eslint-plugin-jsx-a11y@6.10.2, eslint-plugin-jsx-a11y@^6.5.1:
5178
  safe-regex-test "^1.0.3"
5179
  string.prototype.includes "^2.0.1"
5180
 
5181
- eslint-plugin-react-hooks@5.2.0:
5182
- version "5.2.0"
5183
- resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz"
5184
- integrity sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==
5185
-
5186
  eslint-plugin-react-hooks@^4.3.0:
5187
  version "4.6.2"
5188
  resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz"
5189
  integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==
5190
 
5191
- eslint-plugin-react@7.37.4, eslint-plugin-react@^7.27.1:
 
 
 
 
 
5192
  version "7.37.4"
5193
  resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz"
5194
  integrity sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==
@@ -5219,7 +5312,7 @@ eslint-plugin-testing-library@^5.0.1:
5219
  dependencies:
5220
  "@typescript-eslint/utils" "^5.58.0"
5221
 
5222
- eslint-scope@5.1.1, eslint-scope@^5.1.1:
5223
  version "5.1.1"
5224
  resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz"
5225
  integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@@ -5243,12 +5336,25 @@ eslint-scope@^8.3.0:
5243
  esrecurse "^4.3.0"
5244
  estraverse "^5.2.0"
5245
 
 
 
 
 
 
 
 
 
5246
  eslint-visitor-keys@^2.1.0:
5247
  version "2.1.0"
5248
  resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz"
5249
  integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
5250
 
5251
- eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
 
 
 
 
 
5252
  version "3.4.3"
5253
  resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
5254
  integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
@@ -5269,47 +5375,6 @@ eslint-webpack-plugin@^3.1.1:
5269
  normalize-path "^3.0.0"
5270
  schema-utils "^4.0.0"
5271
 
5272
- eslint@9.23.0:
5273
- version "9.23.0"
5274
- resolved "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz"
5275
- integrity sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==
5276
- dependencies:
5277
- "@eslint-community/eslint-utils" "^4.2.0"
5278
- "@eslint-community/regexpp" "^4.12.1"
5279
- "@eslint/config-array" "^0.19.2"
5280
- "@eslint/config-helpers" "^0.2.0"
5281
- "@eslint/core" "^0.12.0"
5282
- "@eslint/eslintrc" "^3.3.1"
5283
- "@eslint/js" "9.23.0"
5284
- "@eslint/plugin-kit" "^0.2.7"
5285
- "@humanfs/node" "^0.16.6"
5286
- "@humanwhocodes/module-importer" "^1.0.1"
5287
- "@humanwhocodes/retry" "^0.4.2"
5288
- "@types/estree" "^1.0.6"
5289
- "@types/json-schema" "^7.0.15"
5290
- ajv "^6.12.4"
5291
- chalk "^4.0.0"
5292
- cross-spawn "^7.0.6"
5293
- debug "^4.3.2"
5294
- escape-string-regexp "^4.0.0"
5295
- eslint-scope "^8.3.0"
5296
- eslint-visitor-keys "^4.2.0"
5297
- espree "^10.3.0"
5298
- esquery "^1.5.0"
5299
- esutils "^2.0.2"
5300
- fast-deep-equal "^3.1.3"
5301
- file-entry-cache "^8.0.0"
5302
- find-up "^5.0.0"
5303
- glob-parent "^6.0.2"
5304
- ignore "^5.2.0"
5305
- imurmurhash "^0.1.4"
5306
- is-glob "^4.0.0"
5307
- json-stable-stringify-without-jsonify "^1.0.1"
5308
- lodash.merge "^4.6.2"
5309
- minimatch "^3.1.2"
5310
- natural-compare "^1.4.0"
5311
- optionator "^0.9.3"
5312
-
5313
  eslint@^8.3.0:
5314
  version "8.57.1"
5315
  resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz"
@@ -5354,6 +5419,47 @@ eslint@^8.3.0:
5354
  strip-ansi "^6.0.1"
5355
  text-table "^0.2.0"
5356
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5357
  espree@^10.0.1, espree@^10.3.0:
5358
  version "10.4.0"
5359
  resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz"
@@ -5372,16 +5478,16 @@ espree@^9.6.0, espree@^9.6.1:
5372
  acorn-jsx "^5.3.2"
5373
  eslint-visitor-keys "^3.4.1"
5374
 
5375
- esprima@1.2.2:
5376
- version "1.2.2"
5377
- resolved "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz"
5378
- integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==
5379
-
5380
  esprima@^4.0.0, esprima@^4.0.1:
5381
  version "4.0.1"
5382
  resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
5383
  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
5384
 
 
 
 
 
 
5385
  esquery@^1.4.2, esquery@^1.5.0:
5386
  version "1.6.0"
5387
  resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz"
@@ -5396,7 +5502,12 @@ esrecurse@^4.3.0:
5396
  dependencies:
5397
  estraverse "^5.2.0"
5398
 
5399
- estraverse@^4.1.1, estraverse@^4.2.0:
 
 
 
 
 
5400
  version "4.3.0"
5401
  resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
5402
  integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
@@ -5529,6 +5640,15 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
5529
  resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
5530
  integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
5531
 
 
 
 
 
 
 
 
 
 
5532
  fast-uri@^3.0.1:
5533
  version "3.1.0"
5534
  resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz"
@@ -5560,6 +5680,11 @@ fdir@^6.5.0:
5560
  resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz"
5561
  integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
5562
 
 
 
 
 
 
5563
  file-entry-cache@^6.0.1:
5564
  version "6.0.1"
5565
  resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz"
@@ -5630,7 +5755,15 @@ find-up@^3.0.0:
5630
  dependencies:
5631
  locate-path "^3.0.0"
5632
 
5633
- find-up@^4.0.0, find-up@^4.1.0:
 
 
 
 
 
 
 
 
5634
  version "4.1.0"
5635
  resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
5636
  integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
@@ -5750,7 +5883,17 @@ fs-extra@^10.0.0:
5750
  jsonfile "^6.0.1"
5751
  universalify "^2.0.0"
5752
 
5753
- fs-extra@^9.0.0, fs-extra@^9.0.1:
 
 
 
 
 
 
 
 
 
 
5754
  version "9.1.0"
5755
  resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz"
5756
  integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
@@ -5770,11 +5913,6 @@ fs.realpath@^1.0.0:
5770
  resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
5771
  integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
5772
 
5773
- fsevents@^2.3.2, fsevents@~2.3.2:
5774
- version "2.3.3"
5775
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
5776
- integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
5777
-
5778
  function-bind@^1.1.2:
5779
  version "1.1.2"
5780
  resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
@@ -5865,7 +6003,7 @@ get-symbol-description@^1.1.0:
5865
  es-errors "^1.3.0"
5866
  get-intrinsic "^1.2.6"
5867
 
5868
- glob-parent@^5.1.2, glob-parent@~5.1.2:
5869
  version "5.1.2"
5870
  resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
5871
  integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -5879,6 +6017,13 @@ glob-parent@^6.0.2:
5879
  dependencies:
5880
  is-glob "^4.0.3"
5881
 
 
 
 
 
 
 
 
5882
  glob-to-regexp@^0.4.1:
5883
  version "0.4.1"
5884
  resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz"
@@ -5912,11 +6057,6 @@ global-prefix@^3.0.0:
5912
  kind-of "^6.0.2"
5913
  which "^1.3.1"
5914
 
5915
- globals@15.15.0:
5916
- version "15.15.0"
5917
- resolved "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz"
5918
- integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==
5919
-
5920
  globals@^13.19.0:
5921
  version "13.24.0"
5922
  resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz"
@@ -5929,6 +6069,11 @@ globals@^14.0.0:
5929
  resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz"
5930
  integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
5931
 
 
 
 
 
 
5932
  globalthis@^1.0.4:
5933
  version "1.0.4"
5934
  resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz"
@@ -6090,6 +6235,14 @@ html-webpack-plugin@^5.5.0:
6090
  pretty-error "^4.0.0"
6091
  tapable "^2.0.0"
6092
 
 
 
 
 
 
 
 
 
6093
  htmlparser2@^6.1.0:
6094
  version "6.1.0"
6095
  resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz"
@@ -6173,19 +6326,26 @@ human-signals@^2.1.0:
6173
  resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz"
6174
  integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
6175
 
6176
- iconv-lite@0.4.24, iconv-lite@~0.4.24:
 
 
 
 
 
 
 
6177
  version "0.4.24"
6178
  resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
6179
  integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
6180
  dependencies:
6181
  safer-buffer ">= 2.1.2 < 3"
6182
 
6183
- iconv-lite@^0.6.3:
6184
- version "0.6.3"
6185
- resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
6186
- integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
6187
  dependencies:
6188
- safer-buffer ">= 2.1.2 < 3.0.0"
6189
 
6190
  icss-utils@^5.0.0, icss-utils@^5.1.0:
6191
  version "5.1.0"
@@ -6253,7 +6413,7 @@ inflight@^1.0.4:
6253
  once "^1.3.0"
6254
  wrappy "1"
6255
 
6256
- inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@~2.0.4:
6257
  version "2.0.4"
6258
  resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
6259
  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -6287,16 +6447,21 @@ internal-slot@^1.1.0:
6287
  resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz"
6288
  integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
6289
 
6290
- ipaddr.js@1.9.1:
6291
- version "1.9.1"
6292
- resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"
6293
- integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
6294
 
6295
  ipaddr.js@^2.0.1:
6296
  version "2.3.0"
6297
  resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz"
6298
  integrity sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==
6299
 
 
 
 
 
 
6300
  is-array-buffer@^3.0.4, is-array-buffer@^3.0.5:
6301
  version "3.0.5"
6302
  resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz"
@@ -7259,6 +7424,20 @@ jsonpointer@^5.0.0:
7259
  resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz"
7260
  integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==
7261
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7262
  "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5:
7263
  version "3.3.5"
7264
  resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz"
@@ -7337,7 +7516,12 @@ lilconfig@^2.0.3:
7337
  resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz"
7338
  integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==
7339
 
7340
- lilconfig@^3.1.1, lilconfig@^3.1.3:
 
 
 
 
 
7341
  version "3.1.3"
7342
  resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz"
7343
  integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==
@@ -7532,7 +7716,7 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8:
7532
  braces "^3.0.3"
7533
  picomatch "^2.3.1"
7534
 
7535
- mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
7536
  version "1.52.0"
7537
  resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
7538
  integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
@@ -7593,16 +7777,16 @@ mkdirp@~0.5.1:
7593
  dependencies:
7594
  minimist "^1.2.6"
7595
 
 
 
 
 
 
7596
  ms@2.0.0:
7597
  version "2.0.0"
7598
  resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
7599
  integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
7600
 
7601
- ms@2.1.3, ms@^2.1.1, ms@^2.1.3:
7602
- version "2.1.3"
7603
- resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
7604
- integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
7605
-
7606
  multicast-dns@^7.2.5:
7607
  version "7.2.5"
7608
  resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz"
@@ -7635,16 +7819,16 @@ natural-compare@^1.4.0:
7635
  resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
7636
  integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
7637
 
7638
- negotiator@0.6.3:
7639
- version "0.6.3"
7640
- resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
7641
- integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
7642
-
7643
  negotiator@~0.6.4:
7644
  version "0.6.4"
7645
  resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz"
7646
  integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
7647
 
 
 
 
 
 
7648
  neo-async@^2.6.2:
7649
  version "2.6.2"
7650
  resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz"
@@ -7871,7 +8055,14 @@ own-keys@^1.0.1:
7871
  object-keys "^1.1.1"
7872
  safe-push-apply "^1.0.0"
7873
 
7874
- p-limit@^2.0.0, p-limit@^2.2.0:
 
 
 
 
 
 
 
7875
  version "2.3.0"
7876
  resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"
7877
  integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
@@ -7919,6 +8110,11 @@ p-try@^2.0.0:
7919
  resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
7920
  integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
7921
 
 
 
 
 
 
7922
  param-case@^3.0.4:
7923
  version "3.0.4"
7924
  resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz"
@@ -9052,7 +9248,7 @@ regenerate@^1.4.2:
9052
  resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz"
9053
  integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
9054
 
9055
- regenerator-runtime@^0.13.9:
9056
  version "0.13.11"
9057
  resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz"
9058
  integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
@@ -9129,7 +9325,7 @@ requires-port@^1.0.0:
9129
  resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz"
9130
  integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
9131
 
9132
- reselect@5.1.1, reselect@^5.1.0:
9133
  version "5.1.1"
9134
  resolved "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz"
9135
  integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==
@@ -9195,6 +9391,11 @@ reusify@^1.0.4:
9195
  resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz"
9196
  integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==
9197
 
 
 
 
 
 
9198
  rimraf@^3.0.0, rimraf@^3.0.2:
9199
  version "3.0.2"
9200
  resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
@@ -9237,7 +9438,7 @@ safe-array-concat@^1.1.3:
9237
  has-symbols "^1.1.0"
9238
  isarray "^2.0.5"
9239
 
9240
- safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
9241
  version "5.2.1"
9242
  resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
9243
  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -9299,15 +9500,6 @@ scheduler@^0.27.0:
9299
  resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz"
9300
  integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==
9301
 
9302
- schema-utils@2.7.0:
9303
- version "2.7.0"
9304
- resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz"
9305
- integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==
9306
- dependencies:
9307
- "@types/json-schema" "^7.0.4"
9308
- ajv "^6.12.2"
9309
- ajv-keywords "^3.4.1"
9310
-
9311
  schema-utils@^2.6.5:
9312
  version "2.7.1"
9313
  resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz"
@@ -9336,6 +9528,15 @@ schema-utils@^4.0.0, schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3
9336
  ajv-formats "^2.1.1"
9337
  ajv-keywords "^5.1.0"
9338
 
 
 
 
 
 
 
 
 
 
9339
  select-hose@^2.0.0:
9340
  version "2.0.0"
9341
  resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz"
@@ -9354,7 +9555,27 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1:
9354
  resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
9355
  integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
9356
 
9357
- semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9358
  version "7.7.3"
9359
  resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"
9360
  integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==
@@ -9451,16 +9672,16 @@ set-proto@^1.0.0:
9451
  es-errors "^1.3.0"
9452
  es-object-atoms "^1.0.0"
9453
 
 
 
 
 
 
9454
  setprototypeof@1.1.0:
9455
  version "1.1.0"
9456
  resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz"
9457
  integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
9458
 
9459
- setprototypeof@1.2.0, setprototypeof@~1.2.0:
9460
- version "1.2.0"
9461
- resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz"
9462
- integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
9463
-
9464
  shallow-clone@^3.0.0:
9465
  version "3.0.1"
9466
  resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz"
@@ -9586,7 +9807,12 @@ source-map-support@^0.5.6, source-map-support@~0.5.20:
9586
  buffer-from "^1.0.0"
9587
  source-map "^0.6.0"
9588
 
9589
- source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
 
 
 
 
 
9590
  version "0.6.1"
9591
  resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
9592
  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -9603,6 +9829,16 @@ source-map@^0.8.0-beta.0:
9603
  dependencies:
9604
  whatwg-url "^7.0.0"
9605
 
 
 
 
 
 
 
 
 
 
 
9606
  sourcemap-codec@^1.4.8:
9607
  version "1.4.8"
9608
  resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz"
@@ -9648,6 +9884,11 @@ stack-utils@^2.0.3:
9648
  dependencies:
9649
  escape-string-regexp "^2.0.0"
9650
 
 
 
 
 
 
9651
  stackframe@^1.3.4:
9652
  version "1.3.4"
9653
  resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz"
@@ -9678,6 +9919,20 @@ stop-iteration-iterator@^1.1.0:
9678
  es-errors "^1.3.0"
9679
  internal-slot "^1.1.0"
9680
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9681
  string-length@^4.0.1:
9682
  version "4.0.2"
9683
  resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz"
@@ -9776,20 +10031,6 @@ string.prototype.trimstart@^1.0.8:
9776
  define-properties "^1.2.1"
9777
  es-object-atoms "^1.0.0"
9778
 
9779
- string_decoder@^1.1.1:
9780
- version "1.3.0"
9781
- resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
9782
- integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
9783
- dependencies:
9784
- safe-buffer "~5.2.0"
9785
-
9786
- string_decoder@~1.1.1:
9787
- version "1.1.1"
9788
- resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
9789
- integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
9790
- dependencies:
9791
- safe-buffer "~5.1.0"
9792
-
9793
  stringify-object@^3.3.0:
9794
  version "3.3.0"
9795
  resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz"
@@ -9903,6 +10144,11 @@ svg-parser@^2.0.2:
9903
  resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz"
9904
  integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==
9905
 
 
 
 
 
 
9906
  svgo@^1.2.2:
9907
  version "1.3.2"
9908
  resolved "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz"
@@ -10041,6 +10287,13 @@ test-exclude@^6.0.0:
10041
  glob "^7.1.4"
10042
  minimatch "^3.0.4"
10043
 
 
 
 
 
 
 
 
10044
  text-table@^0.2.0:
10045
  version "0.2.0"
10046
  resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
@@ -10417,6 +10670,13 @@ utils-merge@1.0.1:
10417
  resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"
10418
  integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
10419
 
 
 
 
 
 
 
 
10420
  uuid@^8.3.2:
10421
  version "8.3.2"
10422
  resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz"
@@ -10635,7 +10895,7 @@ webpack@^5.64.4:
10635
  watchpack "^2.4.4"
10636
  webpack-sources "^3.3.3"
10637
 
10638
- websocket-driver@>=0.5.1, websocket-driver@^0.7.4:
10639
  version "0.7.4"
10640
  resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz"
10641
  integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
 
318
  "@babel/helper-create-class-features-plugin" "^7.18.6"
319
  "@babel/helper-plugin-utils" "^7.18.6"
320
 
 
 
 
 
 
321
  "@babel/plugin-proposal-private-property-in-object@^7.16.7", "@babel/plugin-proposal-private-property-in-object@^7.21.11":
322
  version "7.21.11"
323
  resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz"
 
328
  "@babel/helper-plugin-utils" "^7.20.2"
329
  "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
330
 
331
+ "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2":
332
+ version "7.21.0-placeholder-for-preset-env.2"
333
+ resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz"
334
+ integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==
335
+
336
  "@babel/plugin-syntax-async-generators@^7.8.4":
337
  version "7.8.4"
338
  resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz"
 
1057
  "@babel/plugin-transform-modules-commonjs" "^7.27.1"
1058
  "@babel/plugin-transform-typescript" "^7.28.5"
1059
 
1060
+ "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.28.6":
1061
+ version "7.29.2"
1062
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz"
1063
+ integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==
1064
 
1065
  "@babel/template@^7.27.1", "@babel/template@^7.27.2", "@babel/template@^7.3.3":
1066
  version "7.27.2"
 
1652
  resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"
1653
  integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
1654
 
 
 
 
 
 
 
 
 
1655
  "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28":
1656
  version "0.3.31"
1657
  resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz"
 
1660
  "@jridgewell/resolve-uri" "^3.1.0"
1661
  "@jridgewell/sourcemap-codec" "^1.4.14"
1662
 
1663
+ "@jridgewell/trace-mapping@0.3.9":
1664
+ version "0.3.9"
1665
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz"
1666
+ integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
1667
+ dependencies:
1668
+ "@jridgewell/resolve-uri" "^3.0.3"
1669
+ "@jridgewell/sourcemap-codec" "^1.4.10"
1670
+
1671
  "@leichtgewicht/ip-codec@^2.0.1":
1672
  version "2.0.5"
1673
  resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz"
 
1688
  "@nodelib/fs.stat" "2.0.5"
1689
  run-parallel "^1.1.9"
1690
 
1691
+ "@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
1692
  version "2.0.5"
1693
  resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
1694
  integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
 
1790
  "@radix-ui/react-use-previous" "1.1.1"
1791
  "@radix-ui/react-use-size" "1.1.1"
1792
 
1793
+ "@radix-ui/react-collapsible@^1.1.8", "@radix-ui/react-collapsible@1.1.12":
1794
  version "1.1.12"
1795
  resolved "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz"
1796
  integrity sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==
 
1814
  "@radix-ui/react-primitive" "2.1.3"
1815
  "@radix-ui/react-slot" "1.2.3"
1816
 
1817
+ "@radix-ui/react-compose-refs@^1.1.1", "@radix-ui/react-compose-refs@1.1.2":
1818
  version "1.1.2"
1819
  resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz"
1820
  integrity sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==
 
1841
  resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.3.tgz"
1842
  integrity sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==
1843
 
1844
+ "@radix-ui/react-dialog@^1.1.1", "@radix-ui/react-dialog@^1.1.11", "@radix-ui/react-dialog@^1.1.6", "@radix-ui/react-dialog@1.1.15":
1845
  version "1.1.15"
1846
  resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz"
1847
  integrity sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==
 
1919
  "@radix-ui/react-primitive" "2.1.3"
1920
  "@radix-ui/react-use-controllable-state" "1.2.2"
1921
 
1922
+ "@radix-ui/react-id@^1.1.0", "@radix-ui/react-id@1.1.1":
1923
  version "1.1.1"
1924
  resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz"
1925
  integrity sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==
 
2046
  "@radix-ui/react-compose-refs" "1.1.2"
2047
  "@radix-ui/react-use-layout-effect" "1.1.1"
2048
 
2049
+ "@radix-ui/react-primitive@^2.0.2", "@radix-ui/react-primitive@2.1.3":
2050
  version "2.1.3"
2051
  resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz"
2052
  integrity sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==
 
2165
  "@radix-ui/react-use-previous" "1.1.1"
2166
  "@radix-ui/react-use-size" "1.1.1"
2167
 
2168
+ "@radix-ui/react-slot@^1.2.0", "@radix-ui/react-slot@1.2.4":
2169
+ version "1.2.4"
2170
+ resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz"
2171
+ integrity sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==
2172
+ dependencies:
2173
+ "@radix-ui/react-compose-refs" "1.1.2"
2174
+
2175
  "@radix-ui/react-slot@1.2.3":
2176
  version "1.2.3"
2177
  resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz"
 
2179
  dependencies:
2180
  "@radix-ui/react-compose-refs" "1.1.2"
2181
 
 
 
 
 
 
 
 
2182
  "@radix-ui/react-switch@^1.2.2":
2183
  version "1.2.6"
2184
  resolved "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.6.tgz"
 
2237
  "@radix-ui/react-toggle" "1.1.10"
2238
  "@radix-ui/react-use-controllable-state" "1.2.2"
2239
 
2240
+ "@radix-ui/react-toggle@^1.1.6", "@radix-ui/react-toggle@1.1.10":
2241
  version "1.1.10"
2242
  resolved "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz"
2243
  integrity sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==
 
2807
  dependencies:
2808
  undici-types "~7.16.0"
2809
 
2810
+ "@types/pako@^2.0.3":
2811
+ version "2.0.4"
2812
+ resolved "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz"
2813
+ integrity sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==
2814
+
2815
  "@types/parse-json@^4.0.0":
2816
  version "4.0.2"
2817
  resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz"
 
2832
  resolved "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz"
2833
  integrity sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==
2834
 
2835
+ "@types/raf@^3.4.0":
2836
+ version "3.4.3"
2837
+ resolved "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz"
2838
+ integrity sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==
2839
+
2840
  "@types/range-parser@*":
2841
  version "1.2.7"
2842
  resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz"
 
2902
  resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz"
2903
  integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==
2904
 
2905
+ "@types/trusted-types@^2.0.2", "@types/trusted-types@^2.0.7":
2906
  version "2.0.7"
2907
  resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz"
2908
  integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==
 
3007
  semver "^7.3.7"
3008
  tsutils "^3.21.0"
3009
 
3010
+ "@typescript-eslint/utils@^5.58.0", "@typescript-eslint/utils@5.62.0":
3011
  version "5.62.0"
3012
  resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz"
3013
  integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==
 
3034
  resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz"
3035
  integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==
3036
 
3037
+ "@webassemblyjs/ast@^1.14.1", "@webassemblyjs/ast@1.14.1":
3038
  version "1.14.1"
3039
  resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz"
3040
  integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==
 
3135
  "@webassemblyjs/wasm-gen" "1.14.1"
3136
  "@webassemblyjs/wasm-parser" "1.14.1"
3137
 
3138
+ "@webassemblyjs/wasm-parser@^1.14.1", "@webassemblyjs/wasm-parser@1.14.1":
3139
  version "1.14.1"
3140
  resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz"
3141
  integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==
 
3245
  dependencies:
3246
  ajv "^8.0.0"
3247
 
3248
+ ajv-keywords@^3.4.1:
3249
+ version "3.5.2"
3250
+ resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz"
3251
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
3252
+
3253
+ ajv-keywords@^3.5.2:
3254
  version "3.5.2"
3255
  resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz"
3256
  integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
 
3262
  dependencies:
3263
  fast-deep-equal "^3.1.3"
3264
 
3265
+ ajv@^6.12.2:
3266
+ version "6.15.0"
3267
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz"
3268
+ integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==
3269
+ dependencies:
3270
+ fast-deep-equal "^3.1.1"
3271
+ fast-json-stable-stringify "^2.0.0"
3272
+ json-schema-traverse "^0.4.1"
3273
+ uri-js "^4.2.2"
3274
+
3275
+ ajv@^6.12.4:
3276
+ version "6.15.0"
3277
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz"
3278
+ integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==
3279
+ dependencies:
3280
+ fast-deep-equal "^3.1.1"
3281
+ fast-json-stable-stringify "^2.0.0"
3282
+ json-schema-traverse "^0.4.1"
3283
+ uri-js "^4.2.2"
3284
+
3285
+ ajv@^6.12.5:
3286
+ version "6.15.0"
3287
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz"
3288
+ integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==
3289
  dependencies:
3290
  fast-deep-equal "^3.1.1"
3291
  fast-json-stable-stringify "^2.0.0"
3292
  json-schema-traverse "^0.4.1"
3293
  uri-js "^4.2.2"
3294
 
3295
+ ajv@^8.0.0, ajv@^8.20.0, ajv@^8.6.0, ajv@^8.9.0:
3296
+ version "8.20.0"
3297
+ resolved "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz"
3298
+ integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==
3299
  dependencies:
3300
  fast-deep-equal "^3.1.3"
3301
  fast-uri "^3.0.1"
 
3722
  resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
3723
  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
3724
 
3725
+ base64-arraybuffer@^1.0.2:
3726
+ version "1.0.2"
3727
+ resolved "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz"
3728
+ integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==
3729
+
3730
  baseline-browser-mapping@^2.9.0:
3731
  version "2.9.11"
3732
  resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz"
 
3849
  resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz"
3850
  integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==
3851
 
3852
+ bytes@~3.1.2, bytes@3.1.2:
3853
  version "3.1.2"
3854
  resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz"
3855
  integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
 
3923
  resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz"
3924
  integrity sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==
3925
 
3926
+ canvg@^3.0.11:
3927
+ version "3.0.11"
3928
+ resolved "https://registry.npmjs.org/canvg/-/canvg-3.0.11.tgz"
3929
+ integrity sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==
3930
+ dependencies:
3931
+ "@babel/runtime" "^7.12.5"
3932
+ "@types/raf" "^3.4.0"
3933
+ core-js "^3.8.3"
3934
+ raf "^3.4.1"
3935
+ regenerator-runtime "^0.13.7"
3936
+ rgbcolor "^1.0.1"
3937
+ stackblur-canvas "^2.0.0"
3938
+ svg-pathdata "^6.0.3"
3939
+
3940
  case-sensitive-paths-webpack-plugin@^2.4.0:
3941
  version "2.4.0"
3942
  resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz"
 
4084
  dependencies:
4085
  color-name "~1.1.4"
4086
 
 
 
 
 
 
4087
  color-name@~1.1.4:
4088
  version "1.1.4"
4089
  resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
4090
  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
4091
 
4092
+ color-name@1.1.3:
4093
+ version "1.1.3"
4094
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
4095
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
4096
+
4097
  colord@^2.9.1:
4098
  version "2.9.3"
4099
  resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz"
 
4188
  resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz"
4189
  integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
4190
 
4191
+ convert-source-map@^1.4.0:
4192
+ version "1.9.0"
4193
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"
4194
+ integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
4195
+
4196
+ convert-source-map@^1.6.0:
4197
+ version "1.9.0"
4198
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"
4199
+ integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
4200
+
4201
+ convert-source-map@^1.7.0:
4202
  version "1.9.0"
4203
  resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"
4204
  integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
 
4235
  resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.47.0.tgz"
4236
  integrity sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==
4237
 
4238
+ core-js@^3.19.2, core-js@^3.6.0, core-js@^3.8.3:
4239
  version "3.47.0"
4240
  resolved "https://registry.npmjs.org/core-js/-/core-js-3.47.0.tgz"
4241
  integrity sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==
 
4318
  dependencies:
4319
  postcss-selector-parser "^6.0.9"
4320
 
4321
+ css-line-break@^2.1.0:
4322
+ version "2.1.0"
4323
+ resolved "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz"
4324
+ integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==
4325
+ dependencies:
4326
+ utrie "^1.0.2"
4327
+
4328
  css-loader@^6.5.1:
4329
  version "6.11.0"
4330
  resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz"
 
4382
  domutils "^2.8.0"
4383
  nth-check "^2.0.1"
4384
 
4385
+ css-tree@^1.1.2:
4386
+ version "1.1.3"
4387
+ resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz"
4388
+ integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
4389
  dependencies:
4390
+ mdn-data "2.0.14"
4391
  source-map "^0.6.1"
4392
 
4393
+ css-tree@^1.1.3:
4394
  version "1.1.3"
4395
  resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz"
4396
  integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
 
4398
  mdn-data "2.0.14"
4399
  source-map "^0.6.1"
4400
 
4401
+ css-tree@1.0.0-alpha.37:
4402
+ version "1.0.0-alpha.37"
4403
+ resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz"
4404
+ integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==
4405
+ dependencies:
4406
+ mdn-data "2.0.4"
4407
+ source-map "^0.6.1"
4408
+
4409
  css-what@^3.2.1:
4410
  version "3.4.2"
4411
  resolved "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz"
 
4499
  dependencies:
4500
  cssom "~0.3.6"
4501
 
4502
+ d3-array@^3.1.6, "d3-array@2 - 3", "d3-array@2.10.0 - 3":
4503
  version "3.2.4"
4504
  resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"
4505
  integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
 
4521
  resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz"
4522
  integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==
4523
 
4524
+ d3-interpolate@^3.0.1, "d3-interpolate@1.2.0 - 3":
4525
  version "3.0.1"
4526
  resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz"
4527
  integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
 
4558
  dependencies:
4559
  d3-time "1 - 3"
4560
 
4561
+ d3-time@^3.0.0, "d3-time@1 - 3", "d3-time@2.1.1 - 3":
4562
  version "3.1.0"
4563
  resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz"
4564
  integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
 
4616
  resolved "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz"
4617
  integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==
4618
 
4619
+ debug@^2.6.0:
4620
  version "2.6.9"
4621
  resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
4622
  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
4623
  dependencies:
4624
  ms "2.0.0"
4625
 
4626
+ debug@^3.2.7:
4627
+ version "3.2.7"
4628
+ resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
4629
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
4630
+ dependencies:
4631
+ ms "^2.1.1"
4632
+
4633
+ debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.1, debug@4:
4634
  version "4.4.3"
4635
  resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"
4636
  integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
4637
  dependencies:
4638
  ms "^2.1.3"
4639
 
4640
+ debug@2.6.9:
4641
+ version "2.6.9"
4642
+ resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
4643
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
4644
  dependencies:
4645
+ ms "2.0.0"
4646
 
4647
  decimal.js-light@^2.5.1:
4648
  version "2.5.1"
 
4704
  resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
4705
  integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
4706
 
 
 
 
 
 
4707
  depd@~1.1.2:
4708
  version "1.1.2"
4709
  resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
4710
  integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
4711
 
4712
+ depd@~2.0.0, depd@2.0.0:
4713
+ version "2.0.0"
4714
+ resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"
4715
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
4716
+
4717
+ destroy@~1.2.0, destroy@1.2.0:
4718
  version "1.2.0"
4719
  resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz"
4720
  integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
 
4797
  dependencies:
4798
  utila "~0.4"
4799
 
 
 
 
 
 
 
 
 
4800
  dom-serializer@^1.0.1:
4801
  version "1.4.1"
4802
  resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz"
 
4806
  domhandler "^4.2.0"
4807
  entities "^2.0.0"
4808
 
4809
+ dom-serializer@0:
4810
+ version "0.2.2"
4811
+ resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz"
4812
+ integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
4813
+ dependencies:
4814
+ domelementtype "^2.0.1"
4815
+ entities "^2.0.0"
4816
 
4817
  domelementtype@^2.0.1, domelementtype@^2.2.0:
4818
  version "2.3.0"
4819
  resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz"
4820
  integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
4821
 
4822
+ domelementtype@1:
4823
+ version "1.3.1"
4824
+ resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz"
4825
+ integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
4826
+
4827
  domexception@^2.0.1:
4828
  version "2.0.1"
4829
  resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz"
 
4838
  dependencies:
4839
  domelementtype "^2.2.0"
4840
 
4841
+ dompurify@^3.3.1:
4842
+ version "3.4.2"
4843
+ resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.4.2.tgz"
4844
+ integrity sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==
4845
+ optionalDependencies:
4846
+ "@types/trusted-types" "^2.0.7"
4847
+
4848
  domutils@^1.7.0:
4849
  version "1.7.0"
4850
  resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz"
 
5218
  lodash "^4.17.21"
5219
  string-natural-compare "^3.0.1"
5220
 
5221
+ eslint-plugin-import@^2.25.3, eslint-plugin-import@2.31.0:
5222
  version "2.31.0"
5223
  resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz"
5224
  integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==
 
5250
  dependencies:
5251
  "@typescript-eslint/experimental-utils" "^5.0.0"
5252
 
5253
+ eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@6.10.2:
5254
  version "6.10.2"
5255
  resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz"
5256
  integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==
 
5271
  safe-regex-test "^1.0.3"
5272
  string.prototype.includes "^2.0.1"
5273
 
 
 
 
 
 
5274
  eslint-plugin-react-hooks@^4.3.0:
5275
  version "4.6.2"
5276
  resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz"
5277
  integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==
5278
 
5279
+ eslint-plugin-react-hooks@5.2.0:
5280
+ version "5.2.0"
5281
+ resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz"
5282
+ integrity sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==
5283
+
5284
+ eslint-plugin-react@^7.27.1, eslint-plugin-react@7.37.4:
5285
  version "7.37.4"
5286
  resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz"
5287
  integrity sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==
 
5312
  dependencies:
5313
  "@typescript-eslint/utils" "^5.58.0"
5314
 
5315
+ eslint-scope@^5.1.1:
5316
  version "5.1.1"
5317
  resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz"
5318
  integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
 
5336
  esrecurse "^4.3.0"
5337
  estraverse "^5.2.0"
5338
 
5339
+ eslint-scope@5.1.1:
5340
+ version "5.1.1"
5341
+ resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz"
5342
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
5343
+ dependencies:
5344
+ esrecurse "^4.3.0"
5345
+ estraverse "^4.1.1"
5346
+
5347
  eslint-visitor-keys@^2.1.0:
5348
  version "2.1.0"
5349
  resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz"
5350
  integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
5351
 
5352
+ eslint-visitor-keys@^3.3.0:
5353
+ version "3.4.3"
5354
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
5355
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
5356
+
5357
+ eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
5358
  version "3.4.3"
5359
  resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
5360
  integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
 
5375
  normalize-path "^3.0.0"
5376
  schema-utils "^4.0.0"
5377
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5378
  eslint@^8.3.0:
5379
  version "8.57.1"
5380
  resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz"
 
5419
  strip-ansi "^6.0.1"
5420
  text-table "^0.2.0"
5421
 
5422
+ eslint@9.23.0:
5423
+ version "9.23.0"
5424
+ resolved "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz"
5425
+ integrity sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==
5426
+ dependencies:
5427
+ "@eslint-community/eslint-utils" "^4.2.0"
5428
+ "@eslint-community/regexpp" "^4.12.1"
5429
+ "@eslint/config-array" "^0.19.2"
5430
+ "@eslint/config-helpers" "^0.2.0"
5431
+ "@eslint/core" "^0.12.0"
5432
+ "@eslint/eslintrc" "^3.3.1"
5433
+ "@eslint/js" "9.23.0"
5434
+ "@eslint/plugin-kit" "^0.2.7"
5435
+ "@humanfs/node" "^0.16.6"
5436
+ "@humanwhocodes/module-importer" "^1.0.1"
5437
+ "@humanwhocodes/retry" "^0.4.2"
5438
+ "@types/estree" "^1.0.6"
5439
+ "@types/json-schema" "^7.0.15"
5440
+ ajv "^6.12.4"
5441
+ chalk "^4.0.0"
5442
+ cross-spawn "^7.0.6"
5443
+ debug "^4.3.2"
5444
+ escape-string-regexp "^4.0.0"
5445
+ eslint-scope "^8.3.0"
5446
+ eslint-visitor-keys "^4.2.0"
5447
+ espree "^10.3.0"
5448
+ esquery "^1.5.0"
5449
+ esutils "^2.0.2"
5450
+ fast-deep-equal "^3.1.3"
5451
+ file-entry-cache "^8.0.0"
5452
+ find-up "^5.0.0"
5453
+ glob-parent "^6.0.2"
5454
+ ignore "^5.2.0"
5455
+ imurmurhash "^0.1.4"
5456
+ is-glob "^4.0.0"
5457
+ json-stable-stringify-without-jsonify "^1.0.1"
5458
+ lodash.merge "^4.6.2"
5459
+ minimatch "^3.1.2"
5460
+ natural-compare "^1.4.0"
5461
+ optionator "^0.9.3"
5462
+
5463
  espree@^10.0.1, espree@^10.3.0:
5464
  version "10.4.0"
5465
  resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz"
 
5478
  acorn-jsx "^5.3.2"
5479
  eslint-visitor-keys "^3.4.1"
5480
 
 
 
 
 
 
5481
  esprima@^4.0.0, esprima@^4.0.1:
5482
  version "4.0.1"
5483
  resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
5484
  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
5485
 
5486
+ esprima@1.2.2:
5487
+ version "1.2.2"
5488
+ resolved "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz"
5489
+ integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==
5490
+
5491
  esquery@^1.4.2, esquery@^1.5.0:
5492
  version "1.6.0"
5493
  resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz"
 
5502
  dependencies:
5503
  estraverse "^5.2.0"
5504
 
5505
+ estraverse@^4.1.1:
5506
+ version "4.3.0"
5507
+ resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
5508
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
5509
+
5510
+ estraverse@^4.2.0:
5511
  version "4.3.0"
5512
  resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
5513
  integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
 
5640
  resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
5641
  integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
5642
 
5643
+ fast-png@^6.2.0:
5644
+ version "6.4.0"
5645
+ resolved "https://registry.npmjs.org/fast-png/-/fast-png-6.4.0.tgz"
5646
+ integrity sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==
5647
+ dependencies:
5648
+ "@types/pako" "^2.0.3"
5649
+ iobuffer "^5.3.2"
5650
+ pako "^2.1.0"
5651
+
5652
  fast-uri@^3.0.1:
5653
  version "3.1.0"
5654
  resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz"
 
5680
  resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz"
5681
  integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
5682
 
5683
+ fflate@^0.8.1:
5684
+ version "0.8.2"
5685
+ resolved "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz"
5686
+ integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==
5687
+
5688
  file-entry-cache@^6.0.1:
5689
  version "6.0.1"
5690
  resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz"
 
5755
  dependencies:
5756
  locate-path "^3.0.0"
5757
 
5758
+ find-up@^4.0.0:
5759
+ version "4.1.0"
5760
+ resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
5761
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
5762
+ dependencies:
5763
+ locate-path "^5.0.0"
5764
+ path-exists "^4.0.0"
5765
+
5766
+ find-up@^4.1.0:
5767
  version "4.1.0"
5768
  resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
5769
  integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
 
5883
  jsonfile "^6.0.1"
5884
  universalify "^2.0.0"
5885
 
5886
+ fs-extra@^9.0.0:
5887
+ version "9.1.0"
5888
+ resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz"
5889
+ integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
5890
+ dependencies:
5891
+ at-least-node "^1.0.0"
5892
+ graceful-fs "^4.2.0"
5893
+ jsonfile "^6.0.1"
5894
+ universalify "^2.0.0"
5895
+
5896
+ fs-extra@^9.0.1:
5897
  version "9.1.0"
5898
  resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz"
5899
  integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
 
5913
  resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
5914
  integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
5915
 
 
 
 
 
 
5916
  function-bind@^1.1.2:
5917
  version "1.1.2"
5918
  resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
 
6003
  es-errors "^1.3.0"
6004
  get-intrinsic "^1.2.6"
6005
 
6006
+ glob-parent@^5.1.2:
6007
  version "5.1.2"
6008
  resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
6009
  integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
 
6017
  dependencies:
6018
  is-glob "^4.0.3"
6019
 
6020
+ glob-parent@~5.1.2:
6021
+ version "5.1.2"
6022
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
6023
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
6024
+ dependencies:
6025
+ is-glob "^4.0.1"
6026
+
6027
  glob-to-regexp@^0.4.1:
6028
  version "0.4.1"
6029
  resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz"
 
6057
  kind-of "^6.0.2"
6058
  which "^1.3.1"
6059
 
 
 
 
 
 
6060
  globals@^13.19.0:
6061
  version "13.24.0"
6062
  resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz"
 
6069
  resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz"
6070
  integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
6071
 
6072
+ globals@15.15.0:
6073
+ version "15.15.0"
6074
+ resolved "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz"
6075
+ integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==
6076
+
6077
  globalthis@^1.0.4:
6078
  version "1.0.4"
6079
  resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz"
 
6235
  pretty-error "^4.0.0"
6236
  tapable "^2.0.0"
6237
 
6238
+ html2canvas@^1.0.0-rc.5, html2canvas@^1.4.1:
6239
+ version "1.4.1"
6240
+ resolved "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz"
6241
+ integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==
6242
+ dependencies:
6243
+ css-line-break "^2.1.0"
6244
+ text-segmentation "^1.0.3"
6245
+
6246
  htmlparser2@^6.1.0:
6247
  version "6.1.0"
6248
  resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz"
 
6326
  resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz"
6327
  integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
6328
 
6329
+ iconv-lite@^0.6.3:
6330
+ version "0.6.3"
6331
+ resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz"
6332
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
6333
+ dependencies:
6334
+ safer-buffer ">= 2.1.2 < 3.0.0"
6335
+
6336
+ iconv-lite@~0.4.24:
6337
  version "0.4.24"
6338
  resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
6339
  integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
6340
  dependencies:
6341
  safer-buffer ">= 2.1.2 < 3"
6342
 
6343
+ iconv-lite@0.4.24:
6344
+ version "0.4.24"
6345
+ resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
6346
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
6347
  dependencies:
6348
+ safer-buffer ">= 2.1.2 < 3"
6349
 
6350
  icss-utils@^5.0.0, icss-utils@^5.1.0:
6351
  version "5.1.0"
 
6413
  once "^1.3.0"
6414
  wrappy "1"
6415
 
6416
+ inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@~2.0.4, inherits@2:
6417
  version "2.0.4"
6418
  resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
6419
  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 
6447
  resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz"
6448
  integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
6449
 
6450
+ iobuffer@^5.3.2:
6451
+ version "5.4.0"
6452
+ resolved "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz"
6453
+ integrity sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==
6454
 
6455
  ipaddr.js@^2.0.1:
6456
  version "2.3.0"
6457
  resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz"
6458
  integrity sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==
6459
 
6460
+ ipaddr.js@1.9.1:
6461
+ version "1.9.1"
6462
+ resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"
6463
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
6464
+
6465
  is-array-buffer@^3.0.4, is-array-buffer@^3.0.5:
6466
  version "3.0.5"
6467
  resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz"
 
7424
  resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz"
7425
  integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==
7426
 
7427
+ jspdf@^4.2.1:
7428
+ version "4.2.1"
7429
+ resolved "https://registry.npmjs.org/jspdf/-/jspdf-4.2.1.tgz"
7430
+ integrity sha512-YyAXyvnmjTbR4bHQRLzex3CuINCDlQnBqoSYyjJwTP2x9jDLuKDzy7aKUl0hgx3uhcl7xzg32agn5vlie6HIlQ==
7431
+ dependencies:
7432
+ "@babel/runtime" "^7.28.6"
7433
+ fast-png "^6.2.0"
7434
+ fflate "^0.8.1"
7435
+ optionalDependencies:
7436
+ canvg "^3.0.11"
7437
+ core-js "^3.6.0"
7438
+ dompurify "^3.3.1"
7439
+ html2canvas "^1.0.0-rc.5"
7440
+
7441
  "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5:
7442
  version "3.3.5"
7443
  resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz"
 
7516
  resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz"
7517
  integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==
7518
 
7519
+ lilconfig@^3.1.1:
7520
+ version "3.1.3"
7521
+ resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz"
7522
+ integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==
7523
+
7524
+ lilconfig@^3.1.3:
7525
  version "3.1.3"
7526
  resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz"
7527
  integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==
 
7716
  braces "^3.0.3"
7717
  picomatch "^2.3.1"
7718
 
7719
+ "mime-db@>= 1.43.0 < 2", mime-db@1.52.0:
7720
  version "1.52.0"
7721
  resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
7722
  integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
 
7777
  dependencies:
7778
  minimist "^1.2.6"
7779
 
7780
+ ms@^2.1.1, ms@^2.1.3, ms@2.1.3:
7781
+ version "2.1.3"
7782
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
7783
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
7784
+
7785
  ms@2.0.0:
7786
  version "2.0.0"
7787
  resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
7788
  integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
7789
 
 
 
 
 
 
7790
  multicast-dns@^7.2.5:
7791
  version "7.2.5"
7792
  resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz"
 
7819
  resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
7820
  integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
7821
 
 
 
 
 
 
7822
  negotiator@~0.6.4:
7823
  version "0.6.4"
7824
  resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz"
7825
  integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
7826
 
7827
+ negotiator@0.6.3:
7828
+ version "0.6.3"
7829
+ resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
7830
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
7831
+
7832
  neo-async@^2.6.2:
7833
  version "2.6.2"
7834
  resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz"
 
8055
  object-keys "^1.1.1"
8056
  safe-push-apply "^1.0.0"
8057
 
8058
+ p-limit@^2.0.0:
8059
+ version "2.3.0"
8060
+ resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"
8061
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
8062
+ dependencies:
8063
+ p-try "^2.0.0"
8064
+
8065
+ p-limit@^2.2.0:
8066
  version "2.3.0"
8067
  resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"
8068
  integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
 
8110
  resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
8111
  integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
8112
 
8113
+ pako@^2.1.0:
8114
+ version "2.1.0"
8115
+ resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz"
8116
+ integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==
8117
+
8118
  param-case@^3.0.4:
8119
  version "3.0.4"
8120
  resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz"
 
9248
  resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz"
9249
  integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
9250
 
9251
+ regenerator-runtime@^0.13.7, regenerator-runtime@^0.13.9:
9252
  version "0.13.11"
9253
  resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz"
9254
  integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
 
9325
  resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz"
9326
  integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
9327
 
9328
+ reselect@^5.1.0, reselect@5.1.1:
9329
  version "5.1.1"
9330
  resolved "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz"
9331
  integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==
 
9391
  resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz"
9392
  integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==
9393
 
9394
+ rgbcolor@^1.0.1:
9395
+ version "1.0.1"
9396
+ resolved "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz"
9397
+ integrity sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==
9398
+
9399
  rimraf@^3.0.0, rimraf@^3.0.2:
9400
  version "3.0.2"
9401
  resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
 
9438
  has-symbols "^1.1.0"
9439
  isarray "^2.0.5"
9440
 
9441
+ safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1:
9442
  version "5.2.1"
9443
  resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
9444
  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
 
9500
  resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz"
9501
  integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==
9502
 
 
 
 
 
 
 
 
 
 
9503
  schema-utils@^2.6.5:
9504
  version "2.7.1"
9505
  resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz"
 
9528
  ajv-formats "^2.1.1"
9529
  ajv-keywords "^5.1.0"
9530
 
9531
+ schema-utils@2.7.0:
9532
+ version "2.7.0"
9533
+ resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz"
9534
+ integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==
9535
+ dependencies:
9536
+ "@types/json-schema" "^7.0.4"
9537
+ ajv "^6.12.2"
9538
+ ajv-keywords "^3.4.1"
9539
+
9540
  select-hose@^2.0.0:
9541
  version "2.0.0"
9542
  resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz"
 
9555
  resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
9556
  integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
9557
 
9558
+ semver@^7.3.2:
9559
+ version "7.7.3"
9560
+ resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"
9561
+ integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==
9562
+
9563
+ semver@^7.3.5:
9564
+ version "7.7.3"
9565
+ resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"
9566
+ integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==
9567
+
9568
+ semver@^7.3.7:
9569
+ version "7.7.3"
9570
+ resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"
9571
+ integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==
9572
+
9573
+ semver@^7.5.3:
9574
+ version "7.7.3"
9575
+ resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"
9576
+ integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==
9577
+
9578
+ semver@^7.5.4:
9579
  version "7.7.3"
9580
  resolved "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"
9581
  integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==
 
9672
  es-errors "^1.3.0"
9673
  es-object-atoms "^1.0.0"
9674
 
9675
+ setprototypeof@~1.2.0, setprototypeof@1.2.0:
9676
+ version "1.2.0"
9677
+ resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz"
9678
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
9679
+
9680
  setprototypeof@1.1.0:
9681
  version "1.1.0"
9682
  resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz"
9683
  integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
9684
 
 
 
 
 
 
9685
  shallow-clone@^3.0.0:
9686
  version "3.0.1"
9687
  resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz"
 
9807
  buffer-from "^1.0.0"
9808
  source-map "^0.6.0"
9809
 
9810
+ source-map@^0.6.0:
9811
+ version "0.6.1"
9812
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
9813
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
9814
+
9815
+ source-map@^0.6.1, source-map@0.6.1:
9816
  version "0.6.1"
9817
  resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
9818
  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
 
9829
  dependencies:
9830
  whatwg-url "^7.0.0"
9831
 
9832
+ source-map@~0.6.0:
9833
+ version "0.6.1"
9834
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
9835
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
9836
+
9837
+ source-map@~0.6.1:
9838
+ version "0.6.1"
9839
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
9840
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
9841
+
9842
  sourcemap-codec@^1.4.8:
9843
  version "1.4.8"
9844
  resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz"
 
9884
  dependencies:
9885
  escape-string-regexp "^2.0.0"
9886
 
9887
+ stackblur-canvas@^2.0.0:
9888
+ version "2.7.0"
9889
+ resolved "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz"
9890
+ integrity sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==
9891
+
9892
  stackframe@^1.3.4:
9893
  version "1.3.4"
9894
  resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz"
 
9919
  es-errors "^1.3.0"
9920
  internal-slot "^1.1.0"
9921
 
9922
+ string_decoder@^1.1.1:
9923
+ version "1.3.0"
9924
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
9925
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
9926
+ dependencies:
9927
+ safe-buffer "~5.2.0"
9928
+
9929
+ string_decoder@~1.1.1:
9930
+ version "1.1.1"
9931
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
9932
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
9933
+ dependencies:
9934
+ safe-buffer "~5.1.0"
9935
+
9936
  string-length@^4.0.1:
9937
  version "4.0.2"
9938
  resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz"
 
10031
  define-properties "^1.2.1"
10032
  es-object-atoms "^1.0.0"
10033
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10034
  stringify-object@^3.3.0:
10035
  version "3.3.0"
10036
  resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz"
 
10144
  resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz"
10145
  integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==
10146
 
10147
+ svg-pathdata@^6.0.3:
10148
+ version "6.0.3"
10149
+ resolved "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz"
10150
+ integrity sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==
10151
+
10152
  svgo@^1.2.2:
10153
  version "1.3.2"
10154
  resolved "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz"
 
10287
  glob "^7.1.4"
10288
  minimatch "^3.0.4"
10289
 
10290
+ text-segmentation@^1.0.3:
10291
+ version "1.0.3"
10292
+ resolved "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz"
10293
+ integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==
10294
+ dependencies:
10295
+ utrie "^1.0.2"
10296
+
10297
  text-table@^0.2.0:
10298
  version "0.2.0"
10299
  resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
 
10670
  resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"
10671
  integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
10672
 
10673
+ utrie@^1.0.2:
10674
+ version "1.0.2"
10675
+ resolved "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz"
10676
+ integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==
10677
+ dependencies:
10678
+ base64-arraybuffer "^1.0.2"
10679
+
10680
  uuid@^8.3.2:
10681
  version "8.3.2"
10682
  resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz"
 
10895
  watchpack "^2.4.4"
10896
  webpack-sources "^3.3.3"
10897
 
10898
+ websocket-driver@^0.7.4, websocket-driver@>=0.5.1:
10899
  version "0.7.4"
10900
  resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz"
10901
  integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
hf_space/agents.py CHANGED
@@ -19,15 +19,21 @@ import httpx # async HTTP β€” lightweight, no extra deps beyond requirements
19
  # Or use the Jupyter proxy route: http://129.212.191.163/proxy/8000
20
  AMD_INFERENCE_URL = os.environ.get(
21
  "AMD_INFERENCE_URL",
22
- "http://129.212.191.163:8000"
23
  ).rstrip("/")
24
 
 
 
 
 
 
 
25
  # The model name vLLM is serving (used in the chat/completions request).
26
  # Override with AMD_MODEL_NAME env var if you deploy a different checkpoint.
27
  AMD_MODEL_NAME = os.environ.get("AMD_MODEL_NAME", "Qwen/Qwen2-VL-7B-Instruct")
28
 
29
  # Timeout (seconds) to wait for the AMD server before falling back to mock.
30
- AMD_TIMEOUT = float(os.environ.get("AMD_TIMEOUT", "30"))
31
 
32
  # ── System prompts ───────────────────────────────────────────────────────────
33
  INSPECTOR_SYSTEM = """You are the INSPECTOR agent of ForgeSight β€” a multimodal quality-control copilot
@@ -180,10 +186,13 @@ async def _call_amd_vllm(
180
  }
181
 
182
  url = f"{AMD_INFERENCE_URL}/v1/chat/completions"
 
 
 
183
 
184
  try:
185
  async with httpx.AsyncClient(timeout=AMD_TIMEOUT) as client:
186
- resp = await client.post(url, json=payload)
187
  resp.raise_for_status()
188
  data = resp.json()
189
  return data["choices"][0]["message"]["content"]
 
19
  # Or use the Jupyter proxy route: http://129.212.191.163/proxy/8000
20
  AMD_INFERENCE_URL = os.environ.get(
21
  "AMD_INFERENCE_URL",
22
+ "http://165.245.143.46:8000"
23
  ).rstrip("/")
24
 
25
+ # Token for the AMD inference server (if required)
26
+ AMD_INFERENCE_TOKEN = os.environ.get(
27
+ "AMD_INFERENCE_TOKEN",
28
+ "5peRa6unb0DdXvzB3Pbck48IgNTDmxeJSUvE4NdnhvW70FcaX"
29
+ )
30
+
31
  # The model name vLLM is serving (used in the chat/completions request).
32
  # Override with AMD_MODEL_NAME env var if you deploy a different checkpoint.
33
  AMD_MODEL_NAME = os.environ.get("AMD_MODEL_NAME", "Qwen/Qwen2-VL-7B-Instruct")
34
 
35
  # Timeout (seconds) to wait for the AMD server before falling back to mock.
36
+ AMD_TIMEOUT = float(os.environ.get("AMD_TIMEOUT", "60"))
37
 
38
  # ── System prompts ───────────────────────────────────────────────────────────
39
  INSPECTOR_SYSTEM = """You are the INSPECTOR agent of ForgeSight β€” a multimodal quality-control copilot
 
186
  }
187
 
188
  url = f"{AMD_INFERENCE_URL}/v1/chat/completions"
189
+ headers = {}
190
+ if AMD_INFERENCE_TOKEN:
191
+ headers["Authorization"] = f"Bearer {AMD_INFERENCE_TOKEN}"
192
 
193
  try:
194
  async with httpx.AsyncClient(timeout=AMD_TIMEOUT) as client:
195
+ resp = await client.post(url, json=payload, headers=headers)
196
  resp.raise_for_status()
197
  data = resp.json()
198
  return data["choices"][0]["message"]["content"]
hf_space_repo CHANGED
@@ -1 +1 @@
1
- Subproject commit fc45d46feb8d919eebc696edd5effd2295dbda13
 
1
+ Subproject commit 53cd64c92db6de4b88570e9f034bf0164c174619