diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f8815f4a..7d92c9ced 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,9 @@ All notable changes to Bambuddy will be documented in this file. ### Added - **VP MQTT bridge surfaces why `net.info[].ip` rewrite didn't arm (#1429 defensive)** — `MQTTBridge._refresh_ip_encoding` had 4 silent early-return paths (`target_client is None`, `printer client has no ip_address yet`, `no host interface shares a subnet with printer IP X and bind_address is 0.0.0.0/empty`, `invalid IPv4 …`). When the rewrite silently no-op'd on a user's setup, the only signal was the absence of the `MQTT bridge IP encoding armed` INFO line — diagnosing which path was firing meant grepping the source. Each path now emits one `MQTT bridge IP encoding NOT armed: ` INFO line; the message names the actual failure (target IP, the missing-interface case, etc.). Throttled via a `_not_armed_reason` dedup field so an idle unarmed bridge doesn't spam one line per 30s refresh tick — only state changes log. Cleared on successful arm so a regression (e.g. printer client unbinds) re-emits the diagnostic. 5 new tests in `TestNotArmedDiagnosticLogging` pin each path's specific reason text, the once-per-state-change throttle, and the arm-clears-dedup behaviour. **Not a fix for #1429 itself** — the bridge logic is unchanged; this just turns the silent failure into visible signal so the next "fix didn't work for me" report can be triaged in one round-trip instead of multiple. +### Changed +- **Inventory: `/reset-usage` renamed to `/reset-consumed-counter`; UI label is now "Reset counter"** — The old endpoint name implied that calling it would drop `weight_used` to 0; in practice it only stamps `weight_used_baseline = weight_used` so the Inventory page's "Total Consumed" widget (which renders `weight_used - baseline`) reads 0 going forward, while remaining (`label_weight - weight_used`) is preserved. Calling the endpoint via curl and seeing `weight_used` unchanged in the JSON response is confusing — the name didn't describe what the endpoint actually does. New paths: internal `/api/v1/inventory/spools/{id}/reset-consumed-counter` + `/spools/reset-consumed-counter-bulk`, Spoolman-mode `/api/v1/spoolman/inventory/spools/{id}/reset-consumed-counter` + `/spools/reset-consumed-counter-bulk`. **Behaviour is unchanged in both modes**: internal stamps the baseline directly; Spoolman-mode PATCHes upstream `used_weight=0` and the `_map_spoolman_spool` read mapping at `_spoolman_helpers.py:252-268` reconstructs the same `displayed consumed = 0, remaining unchanged` Bambuddy-visible shape — Bambuddy-side parity between modes (per [[feedback_inventory_modes_parity]]) was already in place before this rename and is preserved. The Spoolman-client method `reset_spool_usage` keeps its name because it describes what's sent upstream to Spoolman, which has not been renamed. **Frontend**: `api.resetSpoolUsage` / `bulkResetSpoolUsage` (and Spoolman variants) renamed to `resetSpoolConsumedCounter` / `bulkResetSpoolConsumedCounter`. Button labels switch from "Reset usage to 0" to "Reset counter" / "Reset all counters" — short and unambiguous; tooltips and confirm-modal bodies still spell out the full semantics ("zero the consumed-grams counter; remaining weight is not changed"). **i18n**: 9 keys renamed (`resetUsage*`, `resetAllUsage*`, `usageReset`, `allUsageReset`, `resetUsageFailed` → `resetConsumedCounter*`, `resetAllConsumedCounters*`, `consumedCounterReset`, `allConsumedCountersReset`, `resetConsumedCounterFailed`); real translations shipped in all 10 non-English locales (de / es / fr / it / ja / ko / pt-BR / tr / zh-CN / zh-TW) per the hard-rule against English fallbacks. **Tests**: `test_spool_reset_usage.py` (9 tests, internal mode) and 3 reset-related tests in `test_spoolman_inventory_api.py` updated to hit the new paths; behavioural assertions unchanged. **Breaking change for external API consumers** that already wired `/reset-usage` — no compat shim shipped because the old name actively misled callers; the migration is a one-line URL swap. + ### Fixed - **X2D archives lose 3MF metadata because FTPS handshake fails on firmware 01.01.00.00 (#1638, reported by @vasmarfas)** — Reporter's first archive entries from a brand-new X2D landed almost empty (only print time visible, no filament weight / layers / MakerWorld link / thumbnail), and Spoolman filament-usage tracking also went silent. The support bundle traces the symptom end-to-end: at print start `backend/app/main.py::on_print_start` tries the usual FTP-download dance for the 3MF, every connect attempt to the printer fails with `[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1032)`, and ~2 minutes later `Could not find 3MF file for print: /data/Metadata/plate_1.gcode` → `Created fallback archive N for (no 3MF available)`. The fallback path writes the row with `file_path=""`, `file_size=0`, `content_hash=NULL`, and no layers / filament / model-link fields — exactly the "almost empty card" in the reporter's screenshot. Spoolman tracking and reprint-grouping also degrade from the same root cause: both depend on metadata pulled out of the 3MF by `ThreeMFParser`. The proximate cause is the FTPS handshake: Python 3.13's default `ssl.create_default_context()` negotiates TLS 1.3, and the X2D's implicit-FTPS server on port 990 rejects the ClientHello with `WRONG_VERSION_NUMBER`. This is the same shape of symptom as the P2S 01.02.00.00 FTPS bug from #1401 — handshake / data-channel breakage triggered by the move to Python 3.13's TLS-1.3 default — but the wire-level failure mode is different (P2S completes the handshake and truncates mid-stream with 426; X2D fails the handshake outright). Both are addressed via the per-model registry that #1401 established: `backend/app/services/ftp_profiles.py` gains an `X2D` entry with `cap_tls_v1_2=True` plus a `N6 → X2D` SSDP alias, so the X2D's `ImplicitFTP_TLS` connection caps the SSL context's `maximum_version` to TLS 1.2 and the ClientHello looks like the one the firmware accepted before the Python upgrade. Deliberately conservative — every other model stays on negotiated TLS 1.3, only X2D-tagged sessions flip. **Honest caveat**: this ships as a hypothesis-driven trial rather than a confirmed root-cause fix. The TLS-1.2 cap is the most likely cure given the symptom's family resemblance to #1401, but `WRONG_VERSION_NUMBER` could equally describe the X2D switching to explicit FTPS (AUTH TLS on a plaintext greeting) or moving the FTPS service to a different port — both would need a different code path. The reporter has been asked to test this build; if the cap doesn't clear the error, the registry slot stays useful as a tuning anchor and the next round of diagnostics (`openssl s_client -connect :990 -tls1_2` from a network-adjacent host) will tell us which of (2)/(3) applies. **Tests**: 3 new in `test_ftp_profiles.py` mirroring the existing P2S coverage — `X2D` resolves to `cap_tls_v1_2=True`, `N6` SSDP code aliases to the X2D profile, lowercase `x2d` still hits the cap. Existing P2S + default + unknown-model + frozen-dataclass + non-capped-spot-check (X1C / H2D / P1S / A1) tests stay green. **Verified**: ruff clean; the integration test at `test_cap_tls_v1_2_actually_applied_to_ssl_context` already pins the profile→`ImplicitFTP_TLS`→`ssl_context.maximum_version` wiring so this entry can't silently fail to apply. diff --git a/backend/app/api/routes/inventory.py b/backend/app/api/routes/inventory.py index a1457df03..e3756bf44 100644 --- a/backend/app/api/routes/inventory.py +++ b/backend/app/api/routes/inventory.py @@ -1071,8 +1071,8 @@ async def restore_spool( return result.scalar_one() -@router.post("/spools/{spool_id}/reset-usage", response_model=SpoolResponse) -async def reset_spool_usage( +@router.post("/spools/{spool_id}/reset-consumed-counter", response_model=SpoolResponse) +async def reset_spool_consumed_counter( spool_id: int, db: AsyncSession = Depends(get_db), _: User | None = RequirePermissionIfAuthEnabled(Permission.INVENTORY_UPDATE), @@ -1084,6 +1084,12 @@ async def reset_spool_usage( weight_used` (remaining) is unchanged. weight_locked is also left alone — the spool keeps receiving AMS auto-sync updates. Matches Spoolman's split between used_weight and remaining_weight (#1390). + + The earlier name `/reset-usage` was misleading: callers reasonably + expected `weight_used` itself to drop to 0 and were surprised when + the response showed it unchanged. The current name describes what + the endpoint actually does — reset the "Total Consumed" counter + widget, not the lifetime weight_used field. """ result = await db.execute(select(Spool).where(Spool.id == spool_id)) spool = result.scalar_one_or_none() @@ -1097,8 +1103,8 @@ async def reset_spool_usage( return result.scalar_one() -@router.post("/spools/reset-usage-bulk") -async def bulk_reset_spool_usage( +@router.post("/spools/reset-consumed-counter-bulk") +async def bulk_reset_spool_consumed_counter( payload: dict, db: AsyncSession = Depends(get_db), _: User | None = RequirePermissionIfAuthEnabled(Permission.INVENTORY_UPDATE), diff --git a/backend/app/api/routes/spoolman_inventory.py b/backend/app/api/routes/spoolman_inventory.py index 0070d32c5..8eb7be390 100644 --- a/backend/app/api/routes/spoolman_inventory.py +++ b/backend/app/api/routes/spoolman_inventory.py @@ -865,13 +865,23 @@ async def restore_spool( raise HTTPException(status_code=502, detail="Spoolman returned malformed spool data") from exc -@router.post("/spools/{spool_id}/reset-usage") -async def reset_spool_usage( +@router.post("/spools/{spool_id}/reset-consumed-counter") +async def reset_spool_consumed_counter( spool_id: int = Path(..., gt=0), db: AsyncSession = Depends(get_db), _: User | None = RequirePermissionIfAuthEnabled(Permission.INVENTORY_UPDATE), ) -> dict: - """Zero the spool's used_weight in Spoolman without touching anything else.""" + """Zero the displayed "Total Consumed" counter for a Spoolman spool. + + Spoolman doesn't have a native "baseline" field, so the implementation + reaches for the closest equivalent: PATCH `used_weight=0` upstream. + The read mapping in ``_map_spoolman_spool`` then derives Bambuddy's + `weight_used = label - remaining_weight` and `baseline = weight_used - + real_used_weight`, so the Inventory page's `weight_used - baseline` + display lands at 0 while remaining (= label - weight_used) is preserved + — parity with the internal-mode endpoint (#1390, see also + ``backend/app/api/routes/inventory.py::reset_spool_consumed_counter``). + """ client = await _get_client(db) async with _translate_spoolman_errors(): spool = await client.reset_spool_usage(spool_id) @@ -882,13 +892,13 @@ async def reset_spool_usage( raise HTTPException(status_code=502, detail="Spoolman returned malformed spool data") from exc -@router.post("/spools/reset-usage-bulk") -async def bulk_reset_spool_usage( +@router.post("/spools/reset-consumed-counter-bulk") +async def bulk_reset_spool_consumed_counter( payload: dict = Body(...), db: AsyncSession = Depends(get_db), _: User | None = RequirePermissionIfAuthEnabled(Permission.INVENTORY_UPDATE), ) -> dict: - """Bulk-reset used_weight to 0 across the given Spoolman spool IDs. + """Bulk reset the "Total Consumed" counter across the given Spoolman spool IDs. Caller passes an explicit list of IDs — no "reset all" shortcut, since a typo on a wildcard would wipe the entire inventory's tracking. @@ -909,7 +919,7 @@ async def bulk_reset_spool_usage( await client.reset_spool_usage(spool_id) reset_count += 1 except HTTPException as exc: - logger.warning("Spoolman reset-usage failed for spool %s: %s", spool_id, exc.detail) + logger.warning("Spoolman reset-consumed-counter failed for spool %s: %s", spool_id, exc.detail) return {"reset": reset_count} diff --git a/backend/tests/integration/test_spool_reset_usage.py b/backend/tests/integration/test_spool_reset_usage.py index 3580264c9..b864715f8 100644 --- a/backend/tests/integration/test_spool_reset_usage.py +++ b/backend/tests/integration/test_spool_reset_usage.py @@ -1,4 +1,9 @@ -"""Reset-usage endpoint regressions (#1390 follow-up). +"""Reset-consumed-counter endpoint regressions (#1390 follow-up). + +Endpoint paths renamed from ``/reset-usage`` to ``/reset-consumed-counter`` +to match what the endpoint actually does (the previous name implied +``weight_used`` itself would drop to 0, which surprised callers reading +the JSON response — see the discussion that drove this rename). The per-spool and bulk reset endpoints stamp `weight_used_baseline = weight_used` instead of zeroing `weight_used` directly. This decouples @@ -60,7 +65,7 @@ class TestResetSpoolUsage: """ spool = await spool_factory(label_weight=1000, weight_used=456.0) - response = await async_client.post(f"/api/v1/inventory/spools/{spool.id}/reset-usage") + response = await async_client.post(f"/api/v1/inventory/spools/{spool.id}/reset-consumed-counter") assert response.status_code == 200 body = response.json() @@ -86,7 +91,7 @@ class TestResetSpoolUsage: """ spool = await spool_factory(weight_used=100.0, weight_locked=False) - response = await async_client.post(f"/api/v1/inventory/spools/{spool.id}/reset-usage") + response = await async_client.post(f"/api/v1/inventory/spools/{spool.id}/reset-consumed-counter") assert response.status_code == 200 await db_session.refresh(spool) @@ -100,7 +105,7 @@ class TestResetSpoolUsage: """If the user previously locked the spool, the lock is preserved.""" spool = await spool_factory(weight_used=500.0, weight_locked=True) - response = await async_client.post(f"/api/v1/inventory/spools/{spool.id}/reset-usage") + response = await async_client.post(f"/api/v1/inventory/spools/{spool.id}/reset-consumed-counter") assert response.status_code == 200 await db_session.refresh(spool) @@ -117,7 +122,7 @@ class TestResetSpoolUsage: counter while remaining keeps decrementing normally. """ spool = await spool_factory(label_weight=1000, weight_used=456.0) - await async_client.post(f"/api/v1/inventory/spools/{spool.id}/reset-usage") + await async_client.post(f"/api/v1/inventory/spools/{spool.id}/reset-consumed-counter") # Simulate a 50g print (usage_tracker increments weight_used). await db_session.refresh(spool) @@ -133,7 +138,7 @@ class TestResetSpoolUsage: @pytest.mark.asyncio @pytest.mark.integration async def test_reset_404_for_missing_spool(self, async_client: AsyncClient): - response = await async_client.post("/api/v1/inventory/spools/99999/reset-usage") + response = await async_client.post("/api/v1/inventory/spools/99999/reset-consumed-counter") assert response.status_code == 404 @@ -149,7 +154,7 @@ class TestBulkResetSpoolUsage: untouched = await spool_factory(weight_used=300.0) response = await async_client.post( - "/api/v1/inventory/spools/reset-usage-bulk", + "/api/v1/inventory/spools/reset-consumed-counter-bulk", json={"spool_ids": [target1.id, target2.id]}, ) @@ -173,7 +178,7 @@ class TestBulkResetSpoolUsage: async def test_bulk_reset_rejects_empty_list(self, async_client: AsyncClient): """Empty list must be rejected — guards against accidental wildcard wipes.""" response = await async_client.post( - "/api/v1/inventory/spools/reset-usage-bulk", + "/api/v1/inventory/spools/reset-consumed-counter-bulk", json={"spool_ids": []}, ) assert response.status_code == 400 @@ -183,7 +188,7 @@ class TestBulkResetSpoolUsage: async def test_bulk_reset_rejects_missing_field(self, async_client: AsyncClient): """Missing spool_ids field must be rejected.""" response = await async_client.post( - "/api/v1/inventory/spools/reset-usage-bulk", + "/api/v1/inventory/spools/reset-consumed-counter-bulk", json={}, ) assert response.status_code == 400 @@ -196,7 +201,7 @@ class TestBulkResetSpoolUsage: locked = await spool_factory(weight_used=200.0, weight_locked=True) response = await async_client.post( - "/api/v1/inventory/spools/reset-usage-bulk", + "/api/v1/inventory/spools/reset-consumed-counter-bulk", json={"spool_ids": [unlocked.id, locked.id]}, ) diff --git a/backend/tests/integration/test_spoolman_inventory_api.py b/backend/tests/integration/test_spoolman_inventory_api.py index ef183845c..94b3ba543 100644 --- a/backend/tests/integration/test_spoolman_inventory_api.py +++ b/backend/tests/integration/test_spoolman_inventory_api.py @@ -560,13 +560,13 @@ class TestSpoolmanInventoryCRUD: @pytest.mark.asyncio @pytest.mark.integration - async def test_reset_spool_usage( + async def test_reset_spool_consumed_counter( self, async_client: AsyncClient, spoolman_settings, mock_spoolman_client, ): - """POST /spoolman/inventory/spools/{id}/reset-usage zeroes used_weight in Spoolman. + """POST /spoolman/inventory/spools/{id}/reset-consumed-counter zeroes the displayed counter. Parity with internal mode (#1390): the InventorySpool response carries `weight_used = label - remaining` and @@ -575,7 +575,7 @@ class TestSpoolmanInventoryCRUD: while remaining (= label - weight_used) preserves Spoolman's independent remaining_weight field. """ - response = await async_client.post("/api/v1/spoolman/inventory/spools/42/reset-usage") + response = await async_client.post("/api/v1/spoolman/inventory/spools/42/reset-consumed-counter") assert response.status_code == 200 body = response.json() @@ -588,15 +588,15 @@ class TestSpoolmanInventoryCRUD: @pytest.mark.asyncio @pytest.mark.integration - async def test_bulk_reset_spool_usage( + async def test_bulk_reset_spool_consumed_counter( self, async_client: AsyncClient, spoolman_settings, mock_spoolman_client, ): - """Bulk endpoint resets each listed spool and returns the count.""" + """Bulk endpoint resets each listed spool's counter and returns the count.""" response = await async_client.post( - "/api/v1/spoolman/inventory/spools/reset-usage-bulk", + "/api/v1/spoolman/inventory/spools/reset-consumed-counter-bulk", json={"spool_ids": [1, 2, 3]}, ) @@ -614,7 +614,7 @@ class TestSpoolmanInventoryCRUD: ): """Empty list must be rejected — guards against accidental wildcard wipes.""" response = await async_client.post( - "/api/v1/spoolman/inventory/spools/reset-usage-bulk", + "/api/v1/spoolman/inventory/spools/reset-consumed-counter-bulk", json={"spool_ids": []}, ) diff --git a/frontend/src/__tests__/pages/InventoryPageArchivedConsumed.test.tsx b/frontend/src/__tests__/pages/InventoryPageArchivedConsumed.test.tsx index d5c57c6bb..b2957cf06 100644 --- a/frontend/src/__tests__/pages/InventoryPageArchivedConsumed.test.tsx +++ b/frontend/src/__tests__/pages/InventoryPageArchivedConsumed.test.tsx @@ -179,7 +179,7 @@ describe('InventoryPage — Total Consumed includes archived (#1390 follow-up)', }); }); - it('Reset-usage eraser is rendered for archived spools too', async () => { + it('Reset-consumed-counter eraser is rendered for archived spools too', async () => { // The per-card eraser is gated on weight_used > 0, NOT on archived_at, // so the archived spool above (weight_used=500) must render an eraser // button matching the localized tooltip. Multiple erasers exist on the @@ -191,19 +191,19 @@ describe('InventoryPage — Total Consumed includes archived (#1390 follow-up)', // surface archived spools first; the easiest assertion that doesn't // depend on chip clicks is via the bulk-reset wiring: when archived // are included in the resetable set, the total is non-zero — i.e. - // the "Reset all usage" button stays visible. The CHANGELOG entry + // the "Reset all counters" button stays visible. The CHANGELOG entry // walks through the per-card flow. render(); await waitFor(() => { - // Reset-all-usage button is gated on `totalConsumed > 0 && + // Reset-all-consumed-counters button is gated on `totalConsumed > 0 && // resetableSpoolIds.length > 0`. resetableSpoolIds now includes // archived spools — so even if every active spool had its baseline // == weight_used (consumed = 0), the button must remain visible // as long as ANY spool (archived included) still has unreset usage. // The 800g assertion already proves totalConsumed > 0; here we // just check the bulk-reset button rendered. - expect(screen.getByRole('button', { name: /reset all spool usage/i })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: /reset all counters/i })).toBeInTheDocument(); }); }); }); diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index d21edccc6..a3e7378b0 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -4883,10 +4883,10 @@ export const api = { request(`/inventory/spools/${id}/archive`, { method: 'POST' }), restoreSpool: (id: number) => request(`/inventory/spools/${id}/restore`, { method: 'POST' }), - resetSpoolUsage: (id: number) => - request(`/inventory/spools/${id}/reset-usage`, { method: 'POST' }), - bulkResetSpoolUsage: (spoolIds: number[]) => - request<{ reset: number }>(`/inventory/spools/reset-usage-bulk`, { + resetSpoolConsumedCounter: (id: number) => + request(`/inventory/spools/${id}/reset-consumed-counter`, { method: 'POST' }), + bulkResetSpoolConsumedCounter: (spoolIds: number[]) => + request<{ reset: number }>(`/inventory/spools/reset-consumed-counter-bulk`, { method: 'POST', body: JSON.stringify({ spool_ids: spoolIds }), }), @@ -5054,10 +5054,10 @@ export const api = { request(`/spoolman/inventory/spools/${id}/archive`, { method: 'POST' }), restoreSpoolmanInventorySpool: (id: number) => request(`/spoolman/inventory/spools/${id}/restore`, { method: 'POST' }), - resetSpoolmanInventorySpoolUsage: (id: number) => - request(`/spoolman/inventory/spools/${id}/reset-usage`, { method: 'POST' }), - bulkResetSpoolmanInventorySpoolUsage: (spoolIds: number[]) => - request<{ reset: number }>(`/spoolman/inventory/spools/reset-usage-bulk`, { + resetSpoolmanInventorySpoolConsumedCounter: (id: number) => + request(`/spoolman/inventory/spools/${id}/reset-consumed-counter`, { method: 'POST' }), + bulkResetSpoolmanInventorySpoolConsumedCounter: (spoolIds: number[]) => + request<{ reset: number }>(`/spoolman/inventory/spools/reset-consumed-counter-bulk`, { method: 'POST', body: JSON.stringify({ spool_ids: spoolIds }), }), diff --git a/frontend/src/i18n/locales/de.ts b/frontend/src/i18n/locales/de.ts index 00dd740de..bc7b03c2a 100644 --- a/frontend/src/i18n/locales/de.ts +++ b/frontend/src/i18n/locales/de.ts @@ -3829,15 +3829,15 @@ export default { inPrinter: 'Im Drucker', lowStock: 'Niedriger Bestand', sinceTracking: 'Seit Beginn der Erfassung', - resetUsage: 'Verbrauch auf 0 zurücksetzen', - resetUsageTooltip: 'Den verbrauchten Gramm-Zähler dieser Spule auf null setzen', - resetUsageConfirm: 'Verbrauchten Gramm-Zähler dieser Spule auf 0 zurücksetzen? Künftige Drucke zählen wieder ab null. Die Spule selbst, ihre Restgewichtsberechnung und Ihre Einstellungen bleiben unverändert.', - resetAllUsage: 'Verbrauch aller Spulen zurücksetzen', - resetAllUsageTooltip: 'Den verbrauchten Gramm-Zähler auf jeder Spule auf null setzen', - resetAllUsageConfirm: 'Verbrauchten Gramm-Zähler auf allen {{count}} Spulen (archivierte eingeschlossen) auf 0 zurücksetzen? Das löscht den Wert „Insgesamt verbraucht“, sodass künftige Drucke wieder ab null gezählt werden. Spulen und Restgewichte bleiben unverändert.', - usageReset: 'Spulenverbrauch auf 0 zurückgesetzt', - allUsageReset: '{{count}} Spule(n) zurückgesetzt', - resetUsageFailed: 'Zurücksetzen des Spulenverbrauchs fehlgeschlagen', + resetConsumedCounter: 'Zähler zurücksetzen', + resetConsumedCounterTooltip: 'Den verbrauchten Gramm-Zähler dieser Spule auf null setzen. Das Restgewicht bleibt unverändert.', + resetConsumedCounterConfirm: 'Verbrauchten Gramm-Zähler dieser Spule auf 0 zurücksetzen? Künftige Drucke zählen wieder ab null. Die Spule selbst, ihre Restgewichtsberechnung und Ihre Einstellungen bleiben unverändert.', + resetAllConsumedCounters: 'Alle Zähler zurücksetzen', + resetAllConsumedCountersTooltip: 'Den verbrauchten Gramm-Zähler auf jeder Spule auf null setzen. Die Restgewichte bleiben unverändert.', + resetAllConsumedCountersConfirm: 'Verbrauchten Gramm-Zähler auf allen {{count}} Spulen (archivierte eingeschlossen) auf 0 zurücksetzen? Das löscht den Wert „Insgesamt verbraucht“, sodass künftige Drucke wieder ab null gezählt werden. Spulen und Restgewichte bleiben unverändert.', + consumedCounterReset: 'Zähler zurückgesetzt', + allConsumedCountersReset: 'Zähler für {{count}} Spule(n) zurückgesetzt', + resetConsumedCounterFailed: 'Zähler konnte nicht zurückgesetzt werden', loadedInAms: 'Im AMS/Ext geladen', remaining: 'Verbleibend', weightCheck: 'Gewichtskontrolle', diff --git a/frontend/src/i18n/locales/en.ts b/frontend/src/i18n/locales/en.ts index 41fa201eb..51160f549 100644 --- a/frontend/src/i18n/locales/en.ts +++ b/frontend/src/i18n/locales/en.ts @@ -3841,15 +3841,15 @@ export default { inPrinter: 'In Printer', lowStock: 'Low Stock', sinceTracking: 'Since tracking started', - resetUsage: 'Reset usage to 0', - resetUsageTooltip: 'Zero the consumed-grams counter for this spool', - resetUsageConfirm: 'Reset this spool\'s consumed-grams counter to 0? Future prints will track from zero again. The spool itself, its remaining weight calculation, and your settings are not changed.', - resetAllUsage: 'Reset all spool usage', - resetAllUsageTooltip: 'Zero the consumed-grams counter on every spool', - resetAllUsageConfirm: 'Reset the consumed-grams counter to 0 on all {{count}} spools (archived ones included)? This clears the "Total Consumed" stat so future prints track from zero. Spools and remaining weights are not changed.', - usageReset: 'Spool usage reset to 0', - allUsageReset: 'Reset {{count}} spool(s)', - resetUsageFailed: 'Failed to reset spool usage', + resetConsumedCounter: 'Reset counter', + resetConsumedCounterTooltip: 'Zero the consumed-grams counter for this spool. Remaining weight is not changed.', + resetConsumedCounterConfirm: 'Reset this spool\'s consumed-grams counter to 0? Future prints will track from zero again. The spool itself, its remaining weight calculation, and your settings are not changed.', + resetAllConsumedCounters: 'Reset all counters', + resetAllConsumedCountersTooltip: 'Zero the consumed-grams counter on every spool. Remaining weights are not changed.', + resetAllConsumedCountersConfirm: 'Reset the consumed-grams counter to 0 on all {{count}} spools (archived ones included)? This clears the "Total Consumed" stat so future prints track from zero. Spools and remaining weights are not changed.', + consumedCounterReset: 'Counter reset', + allConsumedCountersReset: 'Counter reset for {{count}} spool(s)', + resetConsumedCounterFailed: 'Failed to reset counter', loadedInAms: 'Loaded in AMS/Ext', remaining: 'Remaining', weightCheck: 'Weight Check', diff --git a/frontend/src/i18n/locales/es.ts b/frontend/src/i18n/locales/es.ts index 1eaae0248..05e64bdef 100644 --- a/frontend/src/i18n/locales/es.ts +++ b/frontend/src/i18n/locales/es.ts @@ -3837,15 +3837,15 @@ export default { inPrinter: 'En la impresora', lowStock: 'Existencias bajas', sinceTracking: 'Desde que comenzó el seguimiento', - resetUsage: 'Restablecer el uso a 0', - resetUsageTooltip: 'Poner a cero el contador de gramos consumidos de esta bobina', - resetUsageConfirm: '¿Restablecer a 0 el contador de gramos consumidos de esta bobina? Las impresiones futuras volverán a contar desde cero. La bobina en sí, su cálculo de peso restante y sus ajustes no cambian.', - resetAllUsage: 'Restablecer el uso de todas las bobinas', - resetAllUsageTooltip: 'Poner a cero el contador de gramos consumidos de todas las bobinas', - resetAllUsageConfirm: '¿Restablecer a 0 el contador de gramos consumidos de las {{count}} bobinas (incluidas las archivadas)? Esto borra la estadística «Total consumido» para que las impresiones futuras cuenten desde cero. Las bobinas y los pesos restantes no cambian.', - usageReset: 'Uso de la bobina restablecido a 0', - allUsageReset: 'Se restablecieron {{count}} bobina(s)', - resetUsageFailed: 'Error al restablecer el uso de la bobina', + resetConsumedCounter: 'Restablecer contador', + resetConsumedCounterTooltip: 'Poner a cero el contador de gramos consumidos de esta bobina. El peso restante no cambia.', + resetConsumedCounterConfirm: '¿Restablecer a 0 el contador de gramos consumidos de esta bobina? Las impresiones futuras volverán a contar desde cero. La bobina en sí, su cálculo de peso restante y sus ajustes no cambian.', + resetAllConsumedCounters: 'Restablecer todos los contadores', + resetAllConsumedCountersTooltip: 'Poner a cero el contador de gramos consumidos de todas las bobinas. Los pesos restantes no cambian.', + resetAllConsumedCountersConfirm: '¿Restablecer a 0 el contador de gramos consumidos de las {{count}} bobinas (incluidas las archivadas)? Esto borra la estadística «Total consumido» para que las impresiones futuras cuenten desde cero. Las bobinas y los pesos restantes no cambian.', + consumedCounterReset: 'Contador restablecido', + allConsumedCountersReset: 'Contador restablecido para {{count}} bobina(s)', + resetConsumedCounterFailed: 'Error al restablecer el contador', loadedInAms: 'Cargada en AMS/ext.', remaining: 'Restante', weightCheck: 'Comprobación de peso', diff --git a/frontend/src/i18n/locales/fr.ts b/frontend/src/i18n/locales/fr.ts index b284fdb30..f6ce4b2a6 100644 --- a/frontend/src/i18n/locales/fr.ts +++ b/frontend/src/i18n/locales/fr.ts @@ -3818,15 +3818,15 @@ export default { inPrinter: 'Dans Imprimante', lowStock: 'Stock Bas', sinceTracking: 'Depuis le début du suivi', - resetUsage: 'Réinitialiser l\'usage à 0', - resetUsageTooltip: 'Remettre à zéro le compteur de grammes consommés pour cette bobine', - resetUsageConfirm: 'Remettre à 0 le compteur de grammes consommés de cette bobine ? Les futures impressions repartiront de zéro. La bobine, son calcul de poids restant et vos paramètres ne sont pas modifiés.', - resetAllUsage: 'Réinitialiser l\'usage de toutes les bobines', - resetAllUsageTooltip: 'Remettre à zéro le compteur de grammes consommés sur chaque bobine', - resetAllUsageConfirm: 'Remettre à 0 le compteur de grammes consommés sur les {{count}} bobines (archivées incluses) ? Cela efface la valeur « Total Consommé » pour que les futures impressions repartent de zéro. Les bobines et les poids restants ne sont pas modifiés.', - usageReset: 'Usage de la bobine remis à 0', - allUsageReset: '{{count}} bobine(s) réinitialisée(s)', - resetUsageFailed: 'Échec de la réinitialisation de l\'usage', + resetConsumedCounter: 'Réinitialiser le compteur', + resetConsumedCounterTooltip: 'Remettre à zéro le compteur de grammes consommés pour cette bobine. Le poids restant n\'est pas modifié.', + resetConsumedCounterConfirm: 'Remettre à 0 le compteur de grammes consommés de cette bobine ? Les futures impressions repartiront de zéro. La bobine, son calcul de poids restant et vos paramètres ne sont pas modifiés.', + resetAllConsumedCounters: 'Réinitialiser tous les compteurs', + resetAllConsumedCountersTooltip: 'Remettre à zéro le compteur de grammes consommés sur chaque bobine. Les poids restants ne sont pas modifiés.', + resetAllConsumedCountersConfirm: 'Remettre à 0 le compteur de grammes consommés sur les {{count}} bobines (archivées incluses) ? Cela efface la valeur « Total Consommé » pour que les futures impressions repartent de zéro. Les bobines et les poids restants ne sont pas modifiés.', + consumedCounterReset: 'Compteur réinitialisé', + allConsumedCountersReset: 'Compteur réinitialisé pour {{count}} bobine(s)', + resetConsumedCounterFailed: 'Échec de la réinitialisation du compteur', loadedInAms: 'Chargé dans AMS/Ext', remaining: 'Restant', weightCheck: 'Vérification poids', diff --git a/frontend/src/i18n/locales/it.ts b/frontend/src/i18n/locales/it.ts index 27f25cb49..2168cbb7b 100644 --- a/frontend/src/i18n/locales/it.ts +++ b/frontend/src/i18n/locales/it.ts @@ -3817,15 +3817,15 @@ export default { inPrinter: 'In stampante', lowStock: 'Scorta bassa', sinceTracking: 'Dall\'inizio del tracciamento', - resetUsage: 'Azzera utilizzo', - resetUsageTooltip: 'Azzera il contatore di grammi consumati per questa bobina', - resetUsageConfirm: 'Azzerare il contatore di grammi consumati di questa bobina? Le stampe future ripartiranno da zero. La bobina, il calcolo del peso rimanente e le impostazioni non vengono modificati.', - resetAllUsage: 'Azzera utilizzo di tutte le bobine', - resetAllUsageTooltip: 'Azzera il contatore di grammi consumati su ogni bobina', - resetAllUsageConfirm: 'Azzerare il contatore di grammi consumati su tutte le {{count}} bobine (incluse quelle archiviate)? La statistica "Totale Consumato" verrà azzerata e le stampe future ripartiranno da zero. Bobine e pesi rimanenti restano invariati.', - usageReset: 'Utilizzo della bobina azzerato', - allUsageReset: '{{count}} bobina/e azzerata/e', - resetUsageFailed: 'Impossibile azzerare l\'utilizzo della bobina', + resetConsumedCounter: 'Azzera contatore', + resetConsumedCounterTooltip: 'Azzera il contatore di grammi consumati per questa bobina. Il peso rimanente non viene modificato.', + resetConsumedCounterConfirm: 'Azzerare il contatore di grammi consumati di questa bobina? Le stampe future ripartiranno da zero. La bobina, il calcolo del peso rimanente e le impostazioni non vengono modificati.', + resetAllConsumedCounters: 'Azzera tutti i contatori', + resetAllConsumedCountersTooltip: 'Azzera il contatore di grammi consumati su ogni bobina. I pesi rimanenti non vengono modificati.', + resetAllConsumedCountersConfirm: 'Azzerare il contatore di grammi consumati su tutte le {{count}} bobine (incluse quelle archiviate)? La statistica "Totale Consumato" verrà azzerata e le stampe future ripartiranno da zero. Bobine e pesi rimanenti restano invariati.', + consumedCounterReset: 'Contatore azzerato', + allConsumedCountersReset: 'Contatore azzerato per {{count}} bobina/e', + resetConsumedCounterFailed: 'Impossibile azzerare il contatore', loadedInAms: 'Caricato in AMS/Est', remaining: 'Rimanente', weightCheck: 'Controllo Peso', diff --git a/frontend/src/i18n/locales/ja.ts b/frontend/src/i18n/locales/ja.ts index be3c9b914..6216cf37f 100644 --- a/frontend/src/i18n/locales/ja.ts +++ b/frontend/src/i18n/locales/ja.ts @@ -3829,15 +3829,15 @@ export default { inPrinter: 'プリンター内', lowStock: '残量少', sinceTracking: '追跡開始以降', - resetUsage: '使用量を0にリセット', - resetUsageTooltip: 'このスプールの消費量カウンタを0にする', - resetUsageConfirm: 'このスプールの消費量カウンタを0にリセットしますか?以降の印刷は再びゼロからカウントされます。スプール自体、残量計算、設定は変更されません。', - resetAllUsage: '全スプールの使用量をリセット', - resetAllUsageTooltip: 'すべてのスプールの消費量カウンタを0にする', - resetAllUsageConfirm: '{{count}}件すべてのスプール(アーカイブ済みを含む)の消費量カウンタを0にリセットしますか?「累計消費量」の値がクリアされ、以降の印刷はゼロからカウントされます。スプール自体と残量は変更されません。', - usageReset: 'スプールの使用量を0にリセットしました', - allUsageReset: '{{count}}件のスプールをリセットしました', - resetUsageFailed: 'スプールの使用量リセットに失敗しました', + resetConsumedCounter: 'カウンタをリセット', + resetConsumedCounterTooltip: 'このスプールの消費量カウンタを0にする。残量は変更されません。', + resetConsumedCounterConfirm: 'このスプールの消費量カウンタを0にリセットしますか?以降の印刷は再びゼロからカウントされます。スプール自体、残量計算、設定は変更されません。', + resetAllConsumedCounters: 'すべてのカウンタをリセット', + resetAllConsumedCountersTooltip: 'すべてのスプールの消費量カウンタを0にする。残量は変更されません。', + resetAllConsumedCountersConfirm: '{{count}}件すべてのスプール(アーカイブ済みを含む)の消費量カウンタを0にリセットしますか?「累計消費量」の値がクリアされ、以降の印刷はゼロからカウントされます。スプール自体と残量は変更されません。', + consumedCounterReset: 'カウンタをリセットしました', + allConsumedCountersReset: '{{count}}件のスプールのカウンタをリセットしました', + resetConsumedCounterFailed: 'カウンタのリセットに失敗しました', loadedInAms: 'AMS/Extに装填中', remaining: '残り', weightCheck: '重量チェック', diff --git a/frontend/src/i18n/locales/ko.ts b/frontend/src/i18n/locales/ko.ts index 8a0c07026..d25b3cde5 100644 --- a/frontend/src/i18n/locales/ko.ts +++ b/frontend/src/i18n/locales/ko.ts @@ -3679,15 +3679,15 @@ export default { spoolmanCatalogLoadFailed: 'Spoolman 필라멘트 카탈로그 불러오기 실패', subtitle: '스풀 관리', storageLocationNone: '위치 미설정', - resetUsage: '사용량을 0으로 초기화', - resetUsageTooltip: '이 스풀의 소비된 그램 카운터를 0으로 초기화합니다', - resetUsageConfirm: '이 스풀의 소비된 그램 카운터를 0으로 초기화하시겠습니까? 이후 인쇄는 처음부터 추적됩니다. 스풀 자체, 잔여 무게 계산 및 설정은 변경되지 않습니다.', - resetAllUsage: '모든 스풀 사용량 초기화', - resetAllUsageTooltip: '모든 스풀의 소비된 그램 카운터를 0으로 초기화합니다', - resetAllUsageConfirm: '{{count}}개 스풀(아카이브 포함)의 소비된 그램 카운터를 모두 0으로 초기화하시겠습니까? 이는 "총 소비량" 통계를 지워 이후 인쇄가 처음부터 추적되도록 합니다. 스풀과 잔여 무게는 변경되지 않습니다.', - usageReset: '스풀 사용량이 0으로 초기화되었습니다', - allUsageReset: '{{count}}개 스풀 초기화됨', - resetUsageFailed: '스풀 사용량 초기화 실패' + resetConsumedCounter: '카운터 초기화', + resetConsumedCounterTooltip: '이 스풀의 소비된 그램 카운터를 0으로 초기화합니다. 잔여 무게는 변경되지 않습니다.', + resetConsumedCounterConfirm: '이 스풀의 소비된 그램 카운터를 0으로 초기화하시겠습니까? 이후 인쇄는 처음부터 추적됩니다. 스풀 자체, 잔여 무게 계산 및 설정은 변경되지 않습니다.', + resetAllConsumedCounters: '모든 카운터 초기화', + resetAllConsumedCountersTooltip: '모든 스풀의 소비된 그램 카운터를 0으로 초기화합니다. 잔여 무게는 변경되지 않습니다.', + resetAllConsumedCountersConfirm: '{{count}}개 스풀(아카이브 포함)의 소비된 그램 카운터를 모두 0으로 초기화하시겠습니까? 이는 "총 소비량" 통계를 지워 이후 인쇄가 처음부터 추적되도록 합니다. 스풀과 잔여 무게는 변경되지 않습니다.', + consumedCounterReset: '카운터가 초기화되었습니다', + allConsumedCountersReset: '{{count}}개 스풀의 카운터가 초기화되었습니다', + resetConsumedCounterFailed: '카운터 초기화 실패' }, timelapse: { title: '타임랩스', diff --git a/frontend/src/i18n/locales/pt-BR.ts b/frontend/src/i18n/locales/pt-BR.ts index 33d7bdd2d..57edb9076 100644 --- a/frontend/src/i18n/locales/pt-BR.ts +++ b/frontend/src/i18n/locales/pt-BR.ts @@ -3817,15 +3817,15 @@ export default { inPrinter: 'Na Impressora', lowStock: 'Estoque Baixo', sinceTracking: 'Desde o início do rastreamento', - resetUsage: 'Zerar uso', - resetUsageTooltip: 'Zerar o contador de gramas consumidas desta bobina', - resetUsageConfirm: 'Zerar o contador de gramas consumidas desta bobina? As impressões futuras voltarão a contar do zero. A bobina em si, o cálculo do peso restante e as configurações não são alterados.', - resetAllUsage: 'Zerar uso de todas as bobinas', - resetAllUsageTooltip: 'Zerar o contador de gramas consumidas em todas as bobinas', - resetAllUsageConfirm: 'Zerar o contador de gramas consumidas nas {{count}} bobinas (incluindo as arquivadas)? Isso limpa o "Total Consumido" para que as impressões futuras contem do zero. Bobinas e pesos restantes não são alterados.', - usageReset: 'Uso da bobina zerado', - allUsageReset: '{{count}} bobina(s) zerada(s)', - resetUsageFailed: 'Falha ao zerar o uso da bobina', + resetConsumedCounter: 'Zerar contador', + resetConsumedCounterTooltip: 'Zerar o contador de gramas consumidas desta bobina. O peso restante não é alterado.', + resetConsumedCounterConfirm: 'Zerar o contador de gramas consumidas desta bobina? As impressões futuras voltarão a contar do zero. A bobina em si, o cálculo do peso restante e as configurações não são alterados.', + resetAllConsumedCounters: 'Zerar todos os contadores', + resetAllConsumedCountersTooltip: 'Zerar o contador de gramas consumidas em todas as bobinas. Os pesos restantes não são alterados.', + resetAllConsumedCountersConfirm: 'Zerar o contador de gramas consumidas nas {{count}} bobinas (incluindo as arquivadas)? Isso limpa o "Total Consumido" para que as impressões futuras contem do zero. Bobinas e pesos restantes não são alterados.', + consumedCounterReset: 'Contador zerado', + allConsumedCountersReset: 'Contador zerado em {{count}} bobina(s)', + resetConsumedCounterFailed: 'Falha ao zerar o contador', loadedInAms: 'Carregado no AMS/Ext', remaining: 'Restante', weightCheck: 'Verificação de Peso', diff --git a/frontend/src/i18n/locales/tr.ts b/frontend/src/i18n/locales/tr.ts index 48ba26a3e..a091268d7 100644 --- a/frontend/src/i18n/locales/tr.ts +++ b/frontend/src/i18n/locales/tr.ts @@ -3811,15 +3811,15 @@ export default { inPrinter: 'Yazıcıda', lowStock: 'Düşük Stok', sinceTracking: 'Takip başladığından beri', - resetUsage: 'Kullanımı 0\'a sıfırla', - resetUsageTooltip: 'Bu makara için tüketilen gram sayacını sıfırla', - resetUsageConfirm: 'Bu makaranın tüketilen gram sayacı 0\'a sıfırlansın mı? Gelecekteki baskılar sıfırdan tekrar takip edilecek. Makaranın kendisi, kalan ağırlık hesaplaması ve ayarlarınız değiştirilmez.', - resetAllUsage: 'Tüm makara kullanımını sıfırla', - resetAllUsageTooltip: 'Her makarada tüketilen gram sayacını sıfırla', - resetAllUsageConfirm: 'Tüm {{count}} makaradaki (arşivlenmişler dahil) tüketilen gram sayacı 0\'a sıfırlansın mı? Bu, "Toplam Tüketim" istatistiğini temizler, böylece gelecekteki baskılar sıfırdan takip edilir. Makaralar ve kalan ağırlıklar değiştirilmez.', - usageReset: 'Makara kullanımı 0\'a sıfırlandı', - allUsageReset: '{{count}} makara sıfırlandı', - resetUsageFailed: 'Makara kullanımı sıfırlanamadı', + resetConsumedCounter: 'Sayacı sıfırla', + resetConsumedCounterTooltip: 'Bu makara için tüketilen gram sayacını sıfırla. Kalan ağırlık değişmez.', + resetConsumedCounterConfirm: 'Bu makaranın tüketilen gram sayacı 0\'a sıfırlansın mı? Gelecekteki baskılar sıfırdan tekrar takip edilecek. Makaranın kendisi, kalan ağırlık hesaplaması ve ayarlarınız değiştirilmez.', + resetAllConsumedCounters: 'Tüm sayaçları sıfırla', + resetAllConsumedCountersTooltip: 'Her makarada tüketilen gram sayacını sıfırla. Kalan ağırlıklar değişmez.', + resetAllConsumedCountersConfirm: 'Tüm {{count}} makaradaki (arşivlenmişler dahil) tüketilen gram sayacı 0\'a sıfırlansın mı? Bu, "Toplam Tüketim" istatistiğini temizler, böylece gelecekteki baskılar sıfırdan takip edilir. Makaralar ve kalan ağırlıklar değiştirilmez.', + consumedCounterReset: 'Sayaç sıfırlandı', + allConsumedCountersReset: '{{count}} makaranın sayacı sıfırlandı', + resetConsumedCounterFailed: 'Sayaç sıfırlanamadı', loadedInAms: 'AMS/Ext\'te Yüklü', remaining: 'Kalan', weightCheck: 'Ağırlık Kontrolü', diff --git a/frontend/src/i18n/locales/zh-CN.ts b/frontend/src/i18n/locales/zh-CN.ts index 80a129dbc..52a0f6577 100644 --- a/frontend/src/i18n/locales/zh-CN.ts +++ b/frontend/src/i18n/locales/zh-CN.ts @@ -3823,15 +3823,15 @@ export default { inPrinter: '在打印机中', lowStock: '库存不足', sinceTracking: '自开始追踪', - resetUsage: '将用量重置为 0', - resetUsageTooltip: '将此料盘的已消耗克数计数器清零', - resetUsageConfirm: '将此料盘的已消耗克数计数器重置为 0?后续打印将从零开始计数。料盘本身、剩余重量计算和您的设置不会改变。', - resetAllUsage: '重置所有料盘的用量', - resetAllUsageTooltip: '将每个料盘的已消耗克数计数器清零', - resetAllUsageConfirm: '将全部 {{count}} 个料盘(含已归档)的已消耗克数计数器重置为 0?这将清空"累计消耗"统计值,后续打印从零开始计数。料盘和剩余重量不会改变。', - usageReset: '料盘用量已重置为 0', - allUsageReset: '已重置 {{count}} 个料盘', - resetUsageFailed: '重置料盘用量失败', + resetConsumedCounter: '重置计数器', + resetConsumedCounterTooltip: '将此料盘的已消耗克数计数器清零。剩余重量保持不变。', + resetConsumedCounterConfirm: '将此料盘的已消耗克数计数器重置为 0?后续打印将从零开始计数。料盘本身、剩余重量计算和您的设置不会改变。', + resetAllConsumedCounters: '重置所有计数器', + resetAllConsumedCountersTooltip: '将每个料盘的已消耗克数计数器清零。剩余重量保持不变。', + resetAllConsumedCountersConfirm: '将全部 {{count}} 个料盘(含已归档)的已消耗克数计数器重置为 0?这将清空"累计消耗"统计值,后续打印从零开始计数。料盘和剩余重量不会改变。', + consumedCounterReset: '计数器已重置', + allConsumedCountersReset: '已重置 {{count}} 个料盘的计数器', + resetConsumedCounterFailed: '重置计数器失败', loadedInAms: '已装载到 AMS/外置', remaining: '剩余', weightCheck: '重量检查', diff --git a/frontend/src/i18n/locales/zh-TW.ts b/frontend/src/i18n/locales/zh-TW.ts index 982d4edf4..c5d10274a 100644 --- a/frontend/src/i18n/locales/zh-TW.ts +++ b/frontend/src/i18n/locales/zh-TW.ts @@ -3823,15 +3823,15 @@ export default { inPrinter: '在印表機中', lowStock: '庫存不足', sinceTracking: '自開始追蹤', - resetUsage: '將用量重置為 0', - resetUsageTooltip: '將此料盤的已消耗克數計數器歸零', - resetUsageConfirm: '將此料盤的已消耗克數計數器重置為 0?後續列印將從零開始計算。料盤本身、剩餘重量計算與您的設定均不會變更。', - resetAllUsage: '重置所有料盤的用量', - resetAllUsageTooltip: '將每個料盤的已消耗克數計數器歸零', - resetAllUsageConfirm: '將全部 {{count}} 個料盤(含已封存)的已消耗克數計數器重置為 0?這將清空「累計消耗」統計值,後續列印從零開始計算。料盤與剩餘重量不會變更。', - usageReset: '料盤用量已重置為 0', - allUsageReset: '已重置 {{count}} 個料盤', - resetUsageFailed: '重置料盤用量失敗', + resetConsumedCounter: '重置計數器', + resetConsumedCounterTooltip: '將此料盤的已消耗克數計數器歸零。剩餘重量不會變更。', + resetConsumedCounterConfirm: '將此料盤的已消耗克數計數器重置為 0?後續列印將從零開始計算。料盤本身、剩餘重量計算與您的設定均不會變更。', + resetAllConsumedCounters: '重置所有計數器', + resetAllConsumedCountersTooltip: '將每個料盤的已消耗克數計數器歸零。剩餘重量不會變更。', + resetAllConsumedCountersConfirm: '將全部 {{count}} 個料盤(含已封存)的已消耗克數計數器重置為 0?這將清空「累計消耗」統計值,後續列印從零開始計算。料盤與剩餘重量不會變更。', + consumedCounterReset: '計數器已重置', + allConsumedCountersReset: '已重置 {{count}} 個料盤的計數器', + resetConsumedCounterFailed: '重置計數器失敗', loadedInAms: '已裝載到 AMS/外接', remaining: '剩餘', weightCheck: '重量檢查', diff --git a/frontend/src/pages/InventoryPage.tsx b/frontend/src/pages/InventoryPage.tsx index 4ad4df199..6699be1d6 100644 --- a/frontend/src/pages/InventoryPage.tsx +++ b/frontend/src/pages/InventoryPage.tsx @@ -467,8 +467,8 @@ function InventoryPage({ spoolmanMode = false, spoolmanModeReady = true }: { spo const [formModal, setFormModal] = useState<{ spool?: InventorySpool | null; mode: SpoolFormMode } | null>(null); const deepLinkHandled = useRef(false); const [confirmAction, setConfirmAction] = useState< - | { type: 'delete' | 'archive' | 'reset-usage'; spoolId: number } - | { type: 'reset-all-usage' } + | { type: 'delete' | 'archive' | 'reset-consumed-counter'; spoolId: number } + | { type: 'reset-all-consumed-counters' } | null >(null); // Label printing (#809). null = closed; otherwise the IDs to print labels for. @@ -687,27 +687,31 @@ function InventoryPage({ spoolmanMode = false, spoolmanModeReady = true }: { spo }, }); - const resetUsageMutation = useMutation({ + const resetConsumedCounterMutation = useMutation({ mutationFn: (id: number) => - spoolmanMode ? api.resetSpoolmanInventorySpoolUsage(id) : api.resetSpoolUsage(id), + spoolmanMode + ? api.resetSpoolmanInventorySpoolConsumedCounter(id) + : api.resetSpoolConsumedCounter(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: spoolsQueryKey }); - showToast(t('inventory.usageReset'), 'success'); + showToast(t('inventory.consumedCounterReset'), 'success'); }, onError: () => { - showToast(t('inventory.resetUsageFailed'), 'error'); + showToast(t('inventory.resetConsumedCounterFailed'), 'error'); }, }); - const bulkResetUsageMutation = useMutation({ + const bulkResetConsumedCounterMutation = useMutation({ mutationFn: (ids: number[]) => - spoolmanMode ? api.bulkResetSpoolmanInventorySpoolUsage(ids) : api.bulkResetSpoolUsage(ids), + spoolmanMode + ? api.bulkResetSpoolmanInventorySpoolConsumedCounter(ids) + : api.bulkResetSpoolConsumedCounter(ids), onSuccess: (data) => { queryClient.invalidateQueries({ queryKey: spoolsQueryKey }); - showToast(t('inventory.allUsageReset', { count: data.reset }), 'success'); + showToast(t('inventory.allConsumedCountersReset', { count: data.reset }), 'success'); }, onError: () => { - showToast(t('inventory.resetUsageFailed'), 'error'); + showToast(t('inventory.resetConsumedCounterFailed'), 'error'); }, }); @@ -1145,10 +1149,10 @@ function InventoryPage({ spoolmanMode = false, spoolmanModeReady = true }: { spo {stats.totalConsumed > 0 && resetableSpoolIds.length > 0 && ( @@ -1747,7 +1751,7 @@ function InventoryPage({ spoolmanMode = false, spoolmanModeReady = true }: { spo onArchive={(id) => setConfirmAction({ type: 'archive', spoolId: id })} onDelete={(id) => setConfirmAction({ type: 'delete', spoolId: id })} onPrintLabel={(id) => setLabelPickerSpoolIds([id])} - onResetUsage={(id) => setConfirmAction({ type: 'reset-usage', spoolId: id })} + onResetConsumedCounter={(id) => setConfirmAction({ type: 'reset-consumed-counter', spoolId: id })} visibleColumns={visibleColumns} assignmentMap={assignmentMap} catalogMap={catalogMap} @@ -1773,7 +1777,7 @@ function InventoryPage({ spoolmanMode = false, spoolmanModeReady = true }: { spo onArchive={() => setConfirmAction({ type: 'archive', spoolId: spool.id })} onDelete={() => setConfirmAction({ type: 'delete', spoolId: spool.id })} onPrintLabel={() => setLabelPickerSpoolIds([spool.id])} - onResetUsage={() => setConfirmAction({ type: 'reset-usage', spoolId: spool.id })} + onResetConsumedCounter={() => setConfirmAction({ type: 'reset-consumed-counter', spoolId: spool.id })} visibleColumns={visibleColumns} assignmentMap={assignmentMap} catalogMap={catalogMap} @@ -1874,25 +1878,25 @@ function InventoryPage({ spoolmanMode = false, spoolmanModeReady = true }: { spo /> )} - {/* Confirm Modal (delete / archive / reset-usage / reset-all-usage) */} + {/* Confirm Modal (delete / archive / reset-consumed-counter / reset-all-consumed-counters) */} {confirmAction && ( { @@ -1900,10 +1904,10 @@ function InventoryPage({ spoolmanMode = false, spoolmanModeReady = true }: { spo deleteMutation.mutate(confirmAction.spoolId); } else if (confirmAction.type === 'archive') { archiveMutation.mutate(confirmAction.spoolId); - } else if (confirmAction.type === 'reset-usage') { - resetUsageMutation.mutate(confirmAction.spoolId); + } else if (confirmAction.type === 'reset-consumed-counter') { + resetConsumedCounterMutation.mutate(confirmAction.spoolId); } else { - bulkResetUsageMutation.mutate(resetableSpoolIds); + bulkResetConsumedCounterMutation.mutate(resetableSpoolIds); } setConfirmAction(null); }} @@ -2115,7 +2119,7 @@ function SpoolCard({ /* Single spool row for table view */ function SpoolTableRow({ - spool, remaining, pct, onEdit, onCopy, onRestore, onArchive, onDelete, onPrintLabel, onResetUsage, + spool, remaining, pct, onEdit, onCopy, onRestore, onArchive, onDelete, onPrintLabel, onResetConsumedCounter, visibleColumns, assignmentMap, catalogMap, currencySymbol, dateFormat, t, onSyncWeight, }: { spool: InventorySpool; @@ -2127,7 +2131,7 @@ function SpoolTableRow({ onArchive: () => void; onDelete: () => void; onPrintLabel?: () => void; - onResetUsage?: () => void; + onResetConsumedCounter?: () => void; visibleColumns: string[]; assignmentMap: Record; catalogMap: Record; @@ -2163,12 +2167,12 @@ function SpoolTableRow({ )} - {onResetUsage && spool.weight_used > 0 && ( + {onResetConsumedCounter && spool.weight_used > 0 && ( // Eraser also shows on archived spools (#1390 follow-up): // archived consumed weight now counts in "Total Consumed", so // the user needs a way to zero an archived spool's tracking // counter individually without having to un-archive it first. - )} @@ -2193,7 +2197,7 @@ function SpoolTableRow({ /* Grouped spool rows for table view */ function SpoolTableGroup({ spools, headerSpool, remaining, pct, isExpanded, onToggle, - onEdit, onCopy, onArchive, onDelete, onPrintLabel, onResetUsage, + onEdit, onCopy, onArchive, onDelete, onPrintLabel, onResetConsumedCounter, visibleColumns, assignmentMap, catalogMap, currencySymbol, dateFormat, t, onSyncWeight, }: { spools: InventorySpool[]; @@ -2209,7 +2213,7 @@ function SpoolTableGroup({ onArchive: (id: number) => void; onDelete: (id: number) => void; onPrintLabel?: (spoolId: number) => void; - onResetUsage?: (id: number) => void; + onResetConsumedCounter?: (id: number) => void; visibleColumns: string[]; assignmentMap: Record; catalogMap: Record; @@ -2263,7 +2267,7 @@ function SpoolTableGroup({ onArchive={() => onArchive(spool.id)} onDelete={() => onDelete(spool.id)} onPrintLabel={onPrintLabel ? () => onPrintLabel(spool.id) : undefined} - onResetUsage={onResetUsage ? () => onResetUsage(spool.id) : undefined} + onResetConsumedCounter={onResetConsumedCounter ? () => onResetConsumedCounter(spool.id) : undefined} visibleColumns={visibleColumns} assignmentMap={assignmentMap} catalogMap={catalogMap} diff --git a/static/assets/index-6Wj7SYfZ.js b/static/assets/index-C7bMJs5u.js similarity index 90% rename from static/assets/index-6Wj7SYfZ.js rename to static/assets/index-C7bMJs5u.js index 165f64f65..84b5f7cb1 100644 --- a/static/assets/index-6Wj7SYfZ.js +++ b/static/assets/index-C7bMJs5u.js @@ -6,42 +6,42 @@ function lme(t,e){for(var a=0;a")&&(qt=qt.replace("",h.displayName)),qt}while(1<=M&&0<=W);break}}}finally{q=!1,Error.prepareStackTrace=_}return(_=h?h.displayName||h.name:"")?B(_):""}function X(h,w){switch(h.tag){case 26:case 27:case 5:return B(h.type);case 16:return B("Lazy");case 13:return h.child!==w&&w!==null?B("Suspense Fallback"):B("Suspense");case 19:return B("SuspenseList");case 0:case 15:return K(h.type,!1);case 11:return K(h.type.render,!1);case 1:return K(h.type,!0);case 31:return B("Activity");default:return""}}function ie(h){try{var w="",_=null;do w+=X(h,_),_=h,h=h.return;while(h);return w}catch(M){return` Error generating stack: `+M.message+` `+M.stack}}var se=Object.prototype.hasOwnProperty,he=t.unstable_scheduleCallback,le=t.unstable_cancelCallback,fe=t.unstable_shouldYield,$=t.unstable_requestPaint,z=t.unstable_now,ae=t.unstable_getCurrentPriorityLevel,ge=t.unstable_ImmediatePriority,xe=t.unstable_UserBlockingPriority,ve=t.unstable_NormalPriority,Te=t.unstable_LowPriority,Ce=t.unstable_IdlePriority,_e=t.log,qe=t.unstable_setDisableYieldValue,ke=null,Ie=null;function Fe(h){if(typeof _e=="function"&&qe(h),Ie&&typeof Ie.setStrictMode=="function")try{Ie.setStrictMode(ke,h)}catch{}}var He=Math.clz32?Math.clz32:Re,Le=Math.log,nt=Math.LN2;function Re(h){return h>>>=0,h===0?32:31-(Le(h)/nt|0)|0}var it=256,Me=262144,Xe=4194304;function $e(h){var w=h&42;if(w!==0)return w;switch(h&-h){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return h&261888;case 262144:case 524288:case 1048576:case 2097152:return h&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return h&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return h}}function Ne(h,w,_){var M=h.pendingLanes;if(M===0)return 0;var W=0,te=h.suspendedLanes,we=h.pingedLanes;h=h.warmLanes;var Ue=M&134217727;return Ue!==0?(M=Ue&~te,M!==0?W=$e(M):(we&=Ue,we!==0?W=$e(we):_||(_=Ue&~h,_!==0&&(W=$e(_))))):(Ue=M&~te,Ue!==0?W=$e(Ue):we!==0?W=$e(we):_||(_=M&~h,_!==0&&(W=$e(_)))),W===0?0:w!==0&&w!==W&&(w&te)===0&&(te=W&-W,_=w&-w,te>=_||te===32&&(_&4194048)!==0)?w:W}function Oe(h,w){return(h.pendingLanes&~(h.suspendedLanes&~h.pingedLanes)&w)===0}function et(h,w){switch(h){case 1:case 2:case 4:case 8:case 64:return w+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return w+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function We(){var h=Xe;return Xe<<=1,(Xe&62914560)===0&&(Xe=4194304),h}function Ae(h){for(var w=[],_=0;31>_;_++)w.push(h);return w}function st(h,w){h.pendingLanes|=w,w!==268435456&&(h.suspendedLanes=0,h.pingedLanes=0,h.warmLanes=0)}function tt(h,w,_,M,W,te){var we=h.pendingLanes;h.pendingLanes=_,h.suspendedLanes=0,h.pingedLanes=0,h.warmLanes=0,h.expiredLanes&=_,h.entangledLanes&=_,h.errorRecoveryDisabledLanes&=_,h.shellSuspendCounter=0;var Ue=h.entanglements,mt=h.expirationTimes,Et=h.hiddenUpdates;for(_=we&~_;0<_;){var qt=31-He(_),Wt=1<"u")return null;try{return h.activeElement||h.body}catch{return h.body}}var Ir=/[\n"\\]/g;function Oa(h){return h.replace(Ir,function(w){return"\\"+w.charCodeAt(0).toString(16)+" "})}function Un(h,w,_,M,W,te,we,Ue){h.name="",we!=null&&typeof we!="function"&&typeof we!="symbol"&&typeof we!="boolean"?h.type=we:h.removeAttribute("type"),w!=null?we==="number"?(w===0&&h.value===""||h.value!=w)&&(h.value=""+da(w)):h.value!==""+da(w)&&(h.value=""+da(w)):we!=="submit"&&we!=="reset"||h.removeAttribute("value"),w!=null?un(h,we,da(w)):_!=null?un(h,we,da(_)):M!=null&&h.removeAttribute("value"),W==null&&te!=null&&(h.defaultChecked=!!te),W!=null&&(h.checked=W&&typeof W!="function"&&typeof W!="symbol"),Ue!=null&&typeof Ue!="function"&&typeof Ue!="symbol"&&typeof Ue!="boolean"?h.name=""+da(Ue):h.removeAttribute("name")}function Ua(h,w,_,M,W,te,we,Ue){if(te!=null&&typeof te!="function"&&typeof te!="symbol"&&typeof te!="boolean"&&(h.type=te),w!=null||_!=null){if(!(te!=="submit"&&te!=="reset"||w!=null)){ma(h);return}_=_!=null?""+da(_):"",w=w!=null?""+da(w):_,Ue||w===h.value||(h.value=w),h.defaultValue=w}M=M??W,M=typeof M!="function"&&typeof M!="symbol"&&!!M,h.checked=Ue?h.checked:!!M,h.defaultChecked=!!M,we!=null&&typeof we!="function"&&typeof we!="symbol"&&typeof we!="boolean"&&(h.name=we),ma(h)}function un(h,w,_){w==="number"&&Za(h.ownerDocument)===h||h.defaultValue===""+_||(h.defaultValue=""+_)}function Mr(h,w,_,M){if(h=h.options,w){w={};for(var W=0;W<_.length;W++)w["$"+_[W]]=!0;for(_=0;_"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),bp=!1;if(Ja)try{var Cd={};Object.defineProperty(Cd,"passive",{get:function(){bp=!0}}),window.addEventListener("test",Cd,Cd),window.removeEventListener("test",Cd,Cd)}catch{bp=!1}var li=null,Eu=null,vi=null;function vf(){if(vi)return vi;var h,w=Eu,_=w.length,M,W="value"in li?li.value:li.textContent,te=W.length;for(h=0;h<_&&w[h]===W[h];h++);var we=_-h;for(M=1;M<=we&&w[_-M]===W[te-M];M++);return vi=W.slice(h,1=di),Sp=" ",Nb=!1;function ye(h,w){switch(h){case"keyup":return Cv.indexOf(w.keyCode)!==-1;case"keydown":return w.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Ot(h){return h=h.detail,typeof h=="object"&&"data"in h?h.data:null}var la=!1;function Ta(h,w){switch(h){case"compositionend":return Ot(w);case"keypress":return w.which!==32?null:(Nb=!0,Sp);case"textInput":return h=w.data,h===Sp&&Nb?null:h;default:return null}}function Ha(h,w){if(la)return h==="compositionend"||!il&&ye(h,w)?(h=vf(),vi=Eu=li=null,la=!1,h):null;switch(h){case"paste":return null;case"keypress":if(!(w.ctrlKey||w.altKey||w.metaKey)||w.ctrlKey&&w.altKey){if(w.char&&1=w)return{node:_,offset:w-h};h=M}e:{for(;_;){if(_.nextSibling){_=_.nextSibling;break e}_=_.parentNode}_=void 0}_=Eo(_)}}function Do(h,w){return h&&w?h===w?!0:h&&h.nodeType===3?!1:w&&w.nodeType===3?Do(h,w.parentNode):"contains"in h?h.contains(w):h.compareDocumentPosition?!!(h.compareDocumentPosition(w)&16):!1:!1}function uo(h){h=h!=null&&h.ownerDocument!=null&&h.ownerDocument.defaultView!=null?h.ownerDocument.defaultView:window;for(var w=Za(h.document);w instanceof h.HTMLIFrameElement;){try{var _=typeof w.contentWindow.location.href=="string"}catch{_=!1}if(_)h=w.contentWindow;else break;w=Za(h.document)}return w}function wi(h){var w=h&&h.nodeName&&h.nodeName.toLowerCase();return w&&(w==="input"&&(h.type==="text"||h.type==="search"||h.type==="tel"||h.type==="url"||h.type==="password")||w==="textarea"||h.contentEditable==="true")}var Md=Ja&&"documentMode"in document&&11>=document.documentMode,mi=null,fr=null,Er=null,Qn=!1;function kp(h,w,_){var M=_.window===_?_.document:_.nodeType===9?_:_.ownerDocument;Qn||mi==null||mi!==Za(M)||(M=mi,"selectionStart"in M&&wi(M)?M={start:M.selectionStart,end:M.selectionEnd}:(M=(M.ownerDocument&&M.ownerDocument.defaultView||window).getSelection(),M={anchorNode:M.anchorNode,anchorOffset:M.anchorOffset,focusNode:M.focusNode,focusOffset:M.focusOffset}),Er&&vs(Er,M)||(Er=M,M=f_(fr,"onSelect"),0>=we,W-=we,Dd=1<<32-He(w)+W|_<tr?(_r=Ca,Ca=null):_r=Ca.sibling;var Lr=Lt(kt,Ca,Mt[tr],$t);if(Lr===null){Ca===null&&(Ca=_r);break}h&&Ca&&Lr.alternate===null&&w(kt,Ca),xt=te(Lr,xt,tr),Fr===null?Da=Lr:Fr.sibling=Lr,Fr=Lr,Ca=_r}if(tr===Mt.length)return _(kt,Ca),Cr&&Bu(kt,tr),Da;if(Ca===null){for(;trtr?(_r=Ca,Ca=null):_r=Ca.sibling;var $p=Lt(kt,Ca,Lr.value,$t);if($p===null){Ca===null&&(Ca=_r);break}h&&Ca&&$p.alternate===null&&w(kt,Ca),xt=te($p,xt,tr),Fr===null?Da=$p:Fr.sibling=$p,Fr=$p,Ca=_r}if(Lr.done)return _(kt,Ca),Cr&&Bu(kt,tr),Da;if(Ca===null){for(;!Lr.done;tr++,Lr=Mt.next())Lr=Wt(kt,Lr.value,$t),Lr!==null&&(xt=te(Lr,xt,tr),Fr===null?Da=Lr:Fr.sibling=Lr,Fr=Lr);return Cr&&Bu(kt,tr),Da}for(Ca=M(Ca);!Lr.done;tr++,Lr=Mt.next())Lr=Bt(Ca,kt,tr,Lr.value,$t),Lr!==null&&(h&&Lr.alternate!==null&&Ca.delete(Lr.key===null?tr:Lr.key),xt=te(Lr,xt,tr),Fr===null?Da=Lr:Fr.sibling=Lr,Fr=Lr);return h&&Ca.forEach(function(ome){return w(kt,ome)}),Cr&&Bu(kt,tr),Da}function an(kt,xt,Mt,$t){if(typeof Mt=="object"&&Mt!==null&&Mt.type===v&&Mt.key===null&&(Mt=Mt.props.children),typeof Mt=="object"&&Mt!==null){switch(Mt.$$typeof){case f:e:{for(var Da=Mt.key;xt!==null;){if(xt.key===Da){if(Da=Mt.type,Da===v){if(xt.tag===7){_(kt,xt.sibling),$t=W(xt,Mt.props.children),$t.return=kt,kt=$t;break e}}else if(xt.elementType===Da||typeof Da=="object"&&Da!==null&&Da.$$typeof===D&&jf(Da)===xt.type){_(kt,xt.sibling),$t=W(xt,Mt.props),Ev($t,Mt),$t.return=kt,kt=$t;break e}_(kt,xt);break}else w(kt,xt);xt=xt.sibling}Mt.type===v?($t=Pf(Mt.props.children,kt.mode,$t,Mt.key),$t.return=kt,kt=$t):($t=Ek(Mt.type,Mt.key,Mt.props,null,kt.mode,$t),Ev($t,Mt),$t.return=kt,kt=$t)}return we(kt);case g:e:{for(Da=Mt.key;xt!==null;){if(xt.key===Da)if(xt.tag===4&&xt.stateNode.containerInfo===Mt.containerInfo&&xt.stateNode.implementation===Mt.implementation){_(kt,xt.sibling),$t=W(xt,Mt.children||[]),$t.return=kt,kt=$t;break e}else{_(kt,xt);break}else w(kt,xt);xt=xt.sibling}$t=Sj(Mt,kt.mode,$t),$t.return=kt,kt=$t}return we(kt);case D:return Mt=jf(Mt),an(kt,xt,Mt,$t)}if(Y(Mt))return wa(kt,xt,Mt,$t);if(I(Mt)){if(Da=I(Mt),typeof Da!="function")throw Error(n(150));return Mt=Da.call(Mt),za(kt,xt,Mt,$t)}if(typeof Mt.then=="function")return an(kt,xt,Ok(Mt),$t);if(Mt.$$typeof===k)return an(kt,xt,Lk(kt,Mt),$t);Bk(kt,Mt)}return typeof Mt=="string"&&Mt!==""||typeof Mt=="number"||typeof Mt=="bigint"?(Mt=""+Mt,xt!==null&&xt.tag===6?(_(kt,xt.sibling),$t=W(xt,Mt),$t.return=kt,kt=$t):(_(kt,xt),$t=wj(Mt,kt.mode,$t),$t.return=kt,kt=$t),we(kt)):_(kt,xt)}return function(kt,xt,Mt,$t){try{Mv=0;var Da=an(kt,xt,Mt,$t);return zb=null,Da}catch(Ca){if(Ca===Rb||Ca===zk)throw Ca;var Fr=sl(29,Ca,null,kt.mode);return Fr.lanes=$t,Fr.return=kt,Fr}}}var Ef=G5(!0),$5=G5(!1),Tp=!1;function Fj(h){h.updateQueue={baseState:h.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Lj(h,w){h=h.updateQueue,w.updateQueue===h&&(w.updateQueue={baseState:h.baseState,firstBaseUpdate:h.firstBaseUpdate,lastBaseUpdate:h.lastBaseUpdate,shared:h.shared,callbacks:null})}function Ap(h){return{lane:h,tag:0,payload:null,callback:null,next:null}}function jp(h,w,_){var M=h.updateQueue;if(M===null)return null;if(M=M.shared,(Br&2)!==0){var W=M.pending;return W===null?w.next=w:(w.next=W.next,W.next=w),M.pending=w,w=Mk(h),T5(h,null,_),w}return jk(h,M,w,_),Mk(h)}function Dv(h,w,_){if(w=w.updateQueue,w!==null&&(w=w.shared,(_&4194048)!==0)){var M=w.lanes;M&=h.pendingLanes,_|=M,w.lanes=_,Ut(h,_)}}function Rj(h,w){var _=h.updateQueue,M=h.alternate;if(M!==null&&(M=M.updateQueue,_===M)){var W=null,te=null;if(_=_.firstBaseUpdate,_!==null){do{var we={lane:_.lane,tag:_.tag,payload:_.payload,callback:null,next:null};te===null?W=te=we:te=te.next=we,_=_.next}while(_!==null);te===null?W=te=w:te=te.next=w}else W=te=w;_={baseState:M.baseState,firstBaseUpdate:W,lastBaseUpdate:te,shared:M.shared,callbacks:M.callbacks},h.updateQueue=_;return}h=_.lastBaseUpdate,h===null?_.firstBaseUpdate=w:h.next=w,_.lastBaseUpdate=w}var zj=!1;function Fv(){if(zj){var h=Lb;if(h!==null)throw h}}function Lv(h,w,_,M){zj=!1;var W=h.updateQueue;Tp=!1;var te=W.firstBaseUpdate,we=W.lastBaseUpdate,Ue=W.shared.pending;if(Ue!==null){W.shared.pending=null;var mt=Ue,Et=mt.next;mt.next=null,we===null?te=Et:we.next=Et,we=mt;var qt=h.alternate;qt!==null&&(qt=qt.updateQueue,Ue=qt.lastBaseUpdate,Ue!==we&&(Ue===null?qt.firstBaseUpdate=Et:Ue.next=Et,qt.lastBaseUpdate=mt))}if(te!==null){var Wt=W.baseState;we=0,qt=Et=mt=null,Ue=te;do{var Lt=Ue.lane&-536870913,Bt=Lt!==Ue.lane;if(Bt?(kr&Lt)===Lt:(M&Lt)===Lt){Lt!==0&&Lt===Fb&&(zj=!0),qt!==null&&(qt=qt.next={lane:0,tag:Ue.tag,payload:Ue.payload,callback:null,next:null});e:{var wa=h,za=Ue;Lt=w;var an=_;switch(za.tag){case 1:if(wa=za.payload,typeof wa=="function"){Wt=wa.call(an,Wt,Lt);break e}Wt=wa;break e;case 3:wa.flags=wa.flags&-65537|128;case 0:if(wa=za.payload,Lt=typeof wa=="function"?wa.call(an,Wt,Lt):wa,Lt==null)break e;Wt=m({},Wt,Lt);break e;case 2:Tp=!0}}Lt=Ue.callback,Lt!==null&&(h.flags|=64,Bt&&(h.flags|=8192),Bt=W.callbacks,Bt===null?W.callbacks=[Lt]:Bt.push(Lt))}else Bt={lane:Lt,tag:Ue.tag,payload:Ue.payload,callback:Ue.callback,next:null},qt===null?(Et=qt=Bt,mt=Wt):qt=qt.next=Bt,we|=Lt;if(Ue=Ue.next,Ue===null){if(Ue=W.shared.pending,Ue===null)break;Bt=Ue,Ue=Bt.next,Bt.next=null,W.lastBaseUpdate=Bt,W.shared.pending=null}}while(!0);qt===null&&(mt=Wt),W.baseState=mt,W.firstBaseUpdate=Et,W.lastBaseUpdate=qt,te===null&&(W.shared.lanes=0),Lp|=we,h.lanes=we,h.memoizedState=Wt}}function V5(h,w){if(typeof h!="function")throw Error(n(191,h));h.call(w)}function W5(h,w){var _=h.callbacks;if(_!==null)for(h.callbacks=null,h=0;h<_.length;h++)V5(_[h],w)}var Ib=Q(null),Uk=Q(0);function K5(h,w){h=Xu,pe(Uk,h),pe(Ib,w),Xu=h|w.baseLanes}function Ij(){pe(Uk,Xu),pe(Ib,Ib.current)}function Oj(){Xu=Uk.current,ne(Ib),ne(Uk)}var ol=Q(null),Yl=null;function Mp(h){var w=h.alternate;pe(pi,pi.current&1),pe(ol,h),Yl===null&&(w===null||Ib.current!==null||w.memoizedState!==null)&&(Yl=h)}function Bj(h){pe(pi,pi.current),pe(ol,h),Yl===null&&(Yl=h)}function Y5(h){h.tag===22?(pe(pi,pi.current),pe(ol,h),Yl===null&&(Yl=h)):Ep()}function Ep(){pe(pi,pi.current),pe(ol,ol.current)}function ll(h){ne(ol),Yl===h&&(Yl=null),ne(pi)}var pi=Q(0);function Hk(h){for(var w=h;w!==null;){if(w.tag===13){var _=w.memoizedState;if(_!==null&&(_=_.dehydrated,_===null||VM(_)||WM(_)))return w}else if(w.tag===19&&(w.memoizedProps.revealOrder==="forwards"||w.memoizedProps.revealOrder==="backwards"||w.memoizedProps.revealOrder==="unstable_legacy-backwards"||w.memoizedProps.revealOrder==="together")){if((w.flags&128)!==0)return w}else if(w.child!==null){w.child.return=w,w=w.child;continue}if(w===h)break;for(;w.sibling===null;){if(w.return===null||w.return===h)return null;w=w.return}w.sibling.return=w.return,w=w.sibling}return null}var qu=0,er=null,en=null,ki=null,qk=!1,Ob=!1,Df=!1,Gk=0,Rv=0,Bb=null,Xde=0;function Xn(){throw Error(n(321))}function Uj(h,w){if(w===null)return!1;for(var _=0;_te?te:8;var we=Z.T,Ue={};Z.T=Ue,aM(h,!1,w,_);try{var mt=W(),Et=Z.S;if(Et!==null&&Et(Ue,mt),mt!==null&&typeof mt=="object"&&typeof mt.then=="function"){var qt=Qde(mt,M);Iv(h,w,qt,ul(h))}else Iv(h,w,M,ul(h))}catch(Wt){Iv(h,w,{then:function(){},status:"rejected",reason:Wt},ul())}finally{J.p=te,we!==null&&Ue.types!==null&&(we.types=Ue.types),Z.T=we}}function aue(){}function eM(h,w,_,M){if(h.tag!==5)throw Error(n(476));var W=PU(h).queue;_U(h,W,w,ce,_===null?aue:function(){return CU(h),_(M)})}function PU(h){var w=h.memoizedState;if(w!==null)return w;w={memoizedState:ce,baseState:ce,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Gu,lastRenderedState:ce},next:null};var _={};return w.next={memoizedState:_,baseState:_,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Gu,lastRenderedState:_},next:null},h.memoizedState=w,h=h.alternate,h!==null&&(h.memoizedState=w),w}function CU(h){var w=PU(h);w.next===null&&(w=h.alternate.memoizedState),Iv(h,w.next.queue,{},ul())}function tM(){return Ss(t0)}function NU(){return hi().memoizedState}function TU(){return hi().memoizedState}function rue(h){for(var w=h.return;w!==null;){switch(w.tag){case 24:case 3:var _=ul();h=Ap(_);var M=jp(w,h,_);M!==null&&(Io(M,w,_),Dv(M,w,_)),w={cache:jj()},h.payload=w;return}w=w.return}}function nue(h,w,_){var M=ul();_={lane:M,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null},Qk(h)?jU(w,_):(_=yj(h,w,_,M),_!==null&&(Io(_,h,M),MU(_,w,M)))}function AU(h,w,_){var M=ul();Iv(h,w,_,M)}function Iv(h,w,_,M){var W={lane:M,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null};if(Qk(h))jU(w,W);else{var te=h.alternate;if(h.lanes===0&&(te===null||te.lanes===0)&&(te=w.lastRenderedReducer,te!==null))try{var we=w.lastRenderedState,Ue=te(we,_);if(W.hasEagerState=!0,W.eagerState=Ue,En(Ue,we))return jk(h,w,W,0),hn===null&&Ak(),!1}catch{}if(_=yj(h,w,W,M),_!==null)return Io(_,h,M),MU(_,w,M),!0}return!1}function aM(h,w,_,M){if(M={lane:2,revertLane:FM(),gesture:null,action:M,hasEagerState:!1,eagerState:null,next:null},Qk(h)){if(w)throw Error(n(479))}else w=yj(h,_,M,2),w!==null&&Io(w,h,2)}function Qk(h){var w=h.alternate;return h===er||w!==null&&w===er}function jU(h,w){Ob=qk=!0;var _=h.pending;_===null?w.next=w:(w.next=_.next,_.next=w),h.pending=w}function MU(h,w,_){if((_&4194048)!==0){var M=w.lanes;M&=h.pendingLanes,_|=M,w.lanes=_,Ut(h,_)}}var Ov={readContext:Ss,use:Vk,useCallback:Xn,useContext:Xn,useEffect:Xn,useImperativeHandle:Xn,useLayoutEffect:Xn,useInsertionEffect:Xn,useMemo:Xn,useReducer:Xn,useRef:Xn,useState:Xn,useDebugValue:Xn,useDeferredValue:Xn,useTransition:Xn,useSyncExternalStore:Xn,useId:Xn,useHostTransitionStatus:Xn,useFormState:Xn,useActionState:Xn,useOptimistic:Xn,useMemoCache:Xn,useCacheRefresh:Xn};Ov.useEffectEvent=Xn;var EU={readContext:Ss,use:Vk,useCallback:function(h,w){return mo().memoizedState=[h,w===void 0?null:w],h},useContext:Ss,useEffect:fU,useImperativeHandle:function(h,w,_){_=_!=null?_.concat([h]):null,Kk(4194308,4,yU.bind(null,w,h),_)},useLayoutEffect:function(h,w){return Kk(4194308,4,h,w)},useInsertionEffect:function(h,w){Kk(4,2,h,w)},useMemo:function(h,w){var _=mo();w=w===void 0?null:w;var M=h();if(Df){Fe(!0);try{h()}finally{Fe(!1)}}return _.memoizedState=[M,w],M},useReducer:function(h,w,_){var M=mo();if(_!==void 0){var W=_(w);if(Df){Fe(!0);try{_(w)}finally{Fe(!1)}}}else W=w;return M.memoizedState=M.baseState=W,h={pending:null,lanes:0,dispatch:null,lastRenderedReducer:h,lastRenderedState:W},M.queue=h,h=h.dispatch=nue.bind(null,er,h),[M.memoizedState,h]},useRef:function(h){var w=mo();return h={current:h},w.memoizedState=h},useState:function(h){h=Yj(h);var w=h.queue,_=AU.bind(null,er,w);return w.dispatch=_,[h.memoizedState,_]},useDebugValue:Zj,useDeferredValue:function(h,w){var _=mo();return Jj(_,h,w)},useTransition:function(){var h=Yj(!1);return h=_U.bind(null,er,h.queue,!0,!1),mo().memoizedState=h,[!1,h]},useSyncExternalStore:function(h,w,_){var M=er,W=mo();if(Cr){if(_===void 0)throw Error(n(407));_=_()}else{if(_=w(),hn===null)throw Error(n(349));(kr&127)!==0||J5(M,w,_)}W.memoizedState=_;var te={value:_,getSnapshot:w};return W.queue=te,fU(tU.bind(null,M,te,h),[h]),M.flags|=2048,Ub(9,{destroy:void 0},eU.bind(null,M,te,_,w),null),_},useId:function(){var h=mo(),w=hn.identifierPrefix;if(Cr){var _=Fd,M=Dd;_=(M&~(1<<32-He(M)-1)).toString(32)+_,w="_"+w+"R_"+_,_=Gk++,0<_&&(w+="H"+_.toString(32)),w+="_"}else _=Xde++,w="_"+w+"r_"+_.toString(32)+"_";return h.memoizedState=w},useHostTransitionStatus:tM,useFormState:dU,useActionState:dU,useOptimistic:function(h){var w=mo();w.memoizedState=w.baseState=h;var _={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return w.queue=_,w=aM.bind(null,er,!0,_),_.dispatch=w,[h,w]},useMemoCache:Vj,useCacheRefresh:function(){return mo().memoizedState=rue.bind(null,er)},useEffectEvent:function(h){var w=mo(),_={impl:h};return w.memoizedState=_,function(){if((Br&2)!==0)throw Error(n(440));return _.impl.apply(void 0,arguments)}}},rM={readContext:Ss,use:Vk,useCallback:wU,useContext:Ss,useEffect:Xj,useImperativeHandle:vU,useInsertionEffect:bU,useLayoutEffect:xU,useMemo:SU,useReducer:Wk,useRef:hU,useState:function(){return Wk(Gu)},useDebugValue:Zj,useDeferredValue:function(h,w){var _=hi();return kU(_,en.memoizedState,h,w)},useTransition:function(){var h=Wk(Gu)[0],w=hi().memoizedState;return[typeof h=="boolean"?h:zv(h),w]},useSyncExternalStore:Z5,useId:NU,useHostTransitionStatus:tM,useFormState:uU,useActionState:uU,useOptimistic:function(h,w){var _=hi();return nU(_,en,h,w)},useMemoCache:Vj,useCacheRefresh:TU};rM.useEffectEvent=gU;var DU={readContext:Ss,use:Vk,useCallback:wU,useContext:Ss,useEffect:Xj,useImperativeHandle:vU,useInsertionEffect:bU,useLayoutEffect:xU,useMemo:SU,useReducer:Kj,useRef:hU,useState:function(){return Kj(Gu)},useDebugValue:Zj,useDeferredValue:function(h,w){var _=hi();return en===null?Jj(_,h,w):kU(_,en.memoizedState,h,w)},useTransition:function(){var h=Kj(Gu)[0],w=hi().memoizedState;return[typeof h=="boolean"?h:zv(h),w]},useSyncExternalStore:Z5,useId:NU,useHostTransitionStatus:tM,useFormState:pU,useActionState:pU,useOptimistic:function(h,w){var _=hi();return en!==null?nU(_,en,h,w):(_.baseState=h,[h,_.queue.dispatch])},useMemoCache:Vj,useCacheRefresh:TU};DU.useEffectEvent=gU;function nM(h,w,_,M){w=h.memoizedState,_=_(M,w),_=_==null?w:m({},w,_),h.memoizedState=_,h.lanes===0&&(h.updateQueue.baseState=_)}var iM={enqueueSetState:function(h,w,_){h=h._reactInternals;var M=ul(),W=Ap(M);W.payload=w,_!=null&&(W.callback=_),w=jp(h,W,M),w!==null&&(Io(w,h,M),Dv(w,h,M))},enqueueReplaceState:function(h,w,_){h=h._reactInternals;var M=ul(),W=Ap(M);W.tag=1,W.payload=w,_!=null&&(W.callback=_),w=jp(h,W,M),w!==null&&(Io(w,h,M),Dv(w,h,M))},enqueueForceUpdate:function(h,w){h=h._reactInternals;var _=ul(),M=Ap(_);M.tag=2,w!=null&&(M.callback=w),w=jp(h,M,_),w!==null&&(Io(w,h,_),Dv(w,h,_))}};function FU(h,w,_,M,W,te,we){return h=h.stateNode,typeof h.shouldComponentUpdate=="function"?h.shouldComponentUpdate(M,te,we):w.prototype&&w.prototype.isPureReactComponent?!vs(_,M)||!vs(W,te):!0}function LU(h,w,_,M){h=w.state,typeof w.componentWillReceiveProps=="function"&&w.componentWillReceiveProps(_,M),typeof w.UNSAFE_componentWillReceiveProps=="function"&&w.UNSAFE_componentWillReceiveProps(_,M),w.state!==h&&iM.enqueueReplaceState(w,w.state,null)}function Ff(h,w){var _=w;if("ref"in w){_={};for(var M in w)M!=="ref"&&(_[M]=w[M])}if(h=h.defaultProps){_===w&&(_=m({},_));for(var W in h)_[W]===void 0&&(_[W]=h[W])}return _}function RU(h){Tk(h)}function zU(h){console.error(h)}function IU(h){Tk(h)}function Xk(h,w){try{var _=h.onUncaughtError;_(w.value,{componentStack:w.stack})}catch(M){setTimeout(function(){throw M})}}function OU(h,w,_){try{var M=h.onCaughtError;M(_.value,{componentStack:_.stack,errorBoundary:w.tag===1?w.stateNode:null})}catch(W){setTimeout(function(){throw W})}}function sM(h,w,_){return _=Ap(_),_.tag=3,_.payload={element:null},_.callback=function(){Xk(h,w)},_}function BU(h){return h=Ap(h),h.tag=3,h}function UU(h,w,_,M){var W=_.type.getDerivedStateFromError;if(typeof W=="function"){var te=M.value;h.payload=function(){return W(te)},h.callback=function(){OU(w,_,M)}}var we=_.stateNode;we!==null&&typeof we.componentDidCatch=="function"&&(h.callback=function(){OU(w,_,M),typeof W!="function"&&(Rp===null?Rp=new Set([this]):Rp.add(this));var Ue=M.stack;this.componentDidCatch(M.value,{componentStack:Ue!==null?Ue:""})})}function iue(h,w,_,M,W){if(_.flags|=32768,M!==null&&typeof M=="object"&&typeof M.then=="function"){if(w=_.alternate,w!==null&&Db(w,_,W,!0),_=ol.current,_!==null){switch(_.tag){case 31:case 13:return Yl===null?c_():_.alternate===null&&Zn===0&&(Zn=3),_.flags&=-257,_.flags|=65536,_.lanes=W,M===Ik?_.flags|=16384:(w=_.updateQueue,w===null?_.updateQueue=new Set([M]):w.add(M),MM(h,M,W)),!1;case 22:return _.flags|=65536,M===Ik?_.flags|=16384:(w=_.updateQueue,w===null?(w={transitions:null,markerInstances:null,retryQueue:new Set([M])},_.updateQueue=w):(_=w.retryQueue,_===null?w.retryQueue=new Set([M]):_.add(M)),MM(h,M,W)),!1}throw Error(n(435,_.tag))}return MM(h,M,W),c_(),!1}if(Cr)return w=ol.current,w!==null?((w.flags&65536)===0&&(w.flags|=256),w.flags|=65536,w.lanes=W,M!==Pj&&(h=Error(n(422),{cause:M}),Tv($l(h,_)))):(M!==Pj&&(w=Error(n(423),{cause:M}),Tv($l(w,_))),h=h.current.alternate,h.flags|=65536,W&=-W,h.lanes|=W,M=$l(M,_),W=sM(h.stateNode,M,W),Rj(h,W),Zn!==4&&(Zn=2)),!1;var te=Error(n(520),{cause:M});if(te=$l(te,_),Wv===null?Wv=[te]:Wv.push(te),Zn!==4&&(Zn=2),w===null)return!0;M=$l(M,_),_=w;do{switch(_.tag){case 3:return _.flags|=65536,h=W&-W,_.lanes|=h,h=sM(_.stateNode,M,h),Rj(_,h),!1;case 1:if(w=_.type,te=_.stateNode,(_.flags&128)===0&&(typeof w.getDerivedStateFromError=="function"||te!==null&&typeof te.componentDidCatch=="function"&&(Rp===null||!Rp.has(te))))return _.flags|=65536,W&=-W,_.lanes|=W,W=BU(W),UU(W,h,_,M),Rj(_,W),!1}_=_.return}while(_!==null);return!1}var oM=Error(n(461)),_i=!1;function ks(h,w,_,M){w.child=h===null?$5(w,null,_,M):Ef(w,h.child,_,M)}function HU(h,w,_,M,W){_=_.render;var te=w.ref;if("ref"in M){var we={};for(var Ue in M)Ue!=="ref"&&(we[Ue]=M[Ue])}else we=M;return Tf(w),M=Hj(h,w,_,we,te,W),Ue=qj(),h!==null&&!_i?(Gj(h,w,W),$u(h,w,W)):(Cr&&Ue&&kj(w),w.flags|=1,ks(h,w,M,W),w.child)}function qU(h,w,_,M,W){if(h===null){var te=_.type;return typeof te=="function"&&!vj(te)&&te.defaultProps===void 0&&_.compare===null?(w.tag=15,w.type=te,GU(h,w,te,M,W)):(h=Ek(_.type,null,M,w,w.mode,W),h.ref=w.ref,h.return=w,w.child=h)}if(te=h.child,!fM(h,W)){var we=te.memoizedProps;if(_=_.compare,_=_!==null?_:vs,_(we,M)&&h.ref===w.ref)return $u(h,w,W)}return w.flags|=1,h=Ou(te,M),h.ref=w.ref,h.return=w,w.child=h}function GU(h,w,_,M,W){if(h!==null){var te=h.memoizedProps;if(vs(te,M)&&h.ref===w.ref)if(_i=!1,w.pendingProps=M=te,fM(h,W))(h.flags&131072)!==0&&(_i=!0);else return w.lanes=h.lanes,$u(h,w,W)}return lM(h,w,_,M,W)}function $U(h,w,_,M){var W=M.children,te=h!==null?h.memoizedState:null;if(h===null&&w.stateNode===null&&(w.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),M.mode==="hidden"){if((w.flags&128)!==0){if(te=te!==null?te.baseLanes|_:_,h!==null){for(M=w.child=h.child,W=0;M!==null;)W=W|M.lanes|M.childLanes,M=M.sibling;M=W&~te}else M=0,w.child=null;return VU(h,w,te,_,M)}if((_&536870912)!==0)w.memoizedState={baseLanes:0,cachePool:null},h!==null&&Rk(w,te!==null?te.cachePool:null),te!==null?K5(w,te):Ij(),Y5(w);else return M=w.lanes=536870912,VU(h,w,te!==null?te.baseLanes|_:_,_,M)}else te!==null?(Rk(w,te.cachePool),K5(w,te),Ep(),w.memoizedState=null):(h!==null&&Rk(w,null),Ij(),Ep());return ks(h,w,W,_),w.child}function Bv(h,w){return h!==null&&h.tag===22||w.stateNode!==null||(w.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),w.sibling}function VU(h,w,_,M,W){var te=Ej();return te=te===null?null:{parent:Si._currentValue,pool:te},w.memoizedState={baseLanes:_,cachePool:te},h!==null&&Rk(w,null),Ij(),Y5(w),h!==null&&Db(h,w,M,!0),w.childLanes=W,null}function Zk(h,w){return w=e_({mode:w.mode,children:w.children},h.mode),w.ref=h.ref,h.child=w,w.return=h,w}function WU(h,w,_){return Ef(w,h.child,null,_),h=Zk(w,w.pendingProps),h.flags|=2,ll(w),w.memoizedState=null,h}function sue(h,w,_){var M=w.pendingProps,W=(w.flags&128)!==0;if(w.flags&=-129,h===null){if(Cr){if(M.mode==="hidden")return h=Zk(w,M),w.lanes=536870912,Bv(null,h);if(Bj(w),(h=Pn)?(h=iq(h,Kl),h=h!==null&&h.data==="&"?h:null,h!==null&&(w.memoizedState={dehydrated:h,treeContext:_p!==null?{id:Dd,overflow:Fd}:null,retryLane:536870912,hydrationErrors:null},_=j5(h),_.return=w,w.child=_,ws=w,Pn=null)):h=null,h===null)throw Cp(w);return w.lanes=536870912,null}return Zk(w,M)}var te=h.memoizedState;if(te!==null){var we=te.dehydrated;if(Bj(w),W)if(w.flags&256)w.flags&=-257,w=WU(h,w,_);else if(w.memoizedState!==null)w.child=h.child,w.flags|=128,w=null;else throw Error(n(558));else if(_i||Db(h,w,_,!1),W=(_&h.childLanes)!==0,_i||W){if(M=hn,M!==null&&(we=ft(M,_),we!==0&&we!==te.retryLane))throw te.retryLane=we,_f(h,we),Io(M,h,we),oM;c_(),w=WU(h,w,_)}else h=te.treeContext,Pn=Ql(we.nextSibling),ws=w,Cr=!0,Pp=null,Kl=!1,h!==null&&D5(w,h),w=Zk(w,M),w.flags|=4096;return w}return h=Ou(h.child,{mode:M.mode,children:M.children}),h.ref=w.ref,w.child=h,h.return=w,h}function Jk(h,w){var _=w.ref;if(_===null)h!==null&&h.ref!==null&&(w.flags|=4194816);else{if(typeof _!="function"&&typeof _!="object")throw Error(n(284));(h===null||h.ref!==_)&&(w.flags|=4194816)}}function lM(h,w,_,M,W){return Tf(w),_=Hj(h,w,_,M,void 0,W),M=qj(),h!==null&&!_i?(Gj(h,w,W),$u(h,w,W)):(Cr&&M&&kj(w),w.flags|=1,ks(h,w,_,W),w.child)}function KU(h,w,_,M,W,te){return Tf(w),w.updateQueue=null,_=X5(w,M,_,W),Q5(h),M=qj(),h!==null&&!_i?(Gj(h,w,te),$u(h,w,te)):(Cr&&M&&kj(w),w.flags|=1,ks(h,w,_,te),w.child)}function YU(h,w,_,M,W){if(Tf(w),w.stateNode===null){var te=Ab,we=_.contextType;typeof we=="object"&&we!==null&&(te=Ss(we)),te=new _(M,te),w.memoizedState=te.state!==null&&te.state!==void 0?te.state:null,te.updater=iM,w.stateNode=te,te._reactInternals=w,te=w.stateNode,te.props=M,te.state=w.memoizedState,te.refs={},Fj(w),we=_.contextType,te.context=typeof we=="object"&&we!==null?Ss(we):Ab,te.state=w.memoizedState,we=_.getDerivedStateFromProps,typeof we=="function"&&(nM(w,_,we,M),te.state=w.memoizedState),typeof _.getDerivedStateFromProps=="function"||typeof te.getSnapshotBeforeUpdate=="function"||typeof te.UNSAFE_componentWillMount!="function"&&typeof te.componentWillMount!="function"||(we=te.state,typeof te.componentWillMount=="function"&&te.componentWillMount(),typeof te.UNSAFE_componentWillMount=="function"&&te.UNSAFE_componentWillMount(),we!==te.state&&iM.enqueueReplaceState(te,te.state,null),Lv(w,M,te,W),Fv(),te.state=w.memoizedState),typeof te.componentDidMount=="function"&&(w.flags|=4194308),M=!0}else if(h===null){te=w.stateNode;var Ue=w.memoizedProps,mt=Ff(_,Ue);te.props=mt;var Et=te.context,qt=_.contextType;we=Ab,typeof qt=="object"&&qt!==null&&(we=Ss(qt));var Wt=_.getDerivedStateFromProps;qt=typeof Wt=="function"||typeof te.getSnapshotBeforeUpdate=="function",Ue=w.pendingProps!==Ue,qt||typeof te.UNSAFE_componentWillReceiveProps!="function"&&typeof te.componentWillReceiveProps!="function"||(Ue||Et!==we)&&LU(w,te,M,we),Tp=!1;var Lt=w.memoizedState;te.state=Lt,Lv(w,M,te,W),Fv(),Et=w.memoizedState,Ue||Lt!==Et||Tp?(typeof Wt=="function"&&(nM(w,_,Wt,M),Et=w.memoizedState),(mt=Tp||FU(w,_,mt,M,Lt,Et,we))?(qt||typeof te.UNSAFE_componentWillMount!="function"&&typeof te.componentWillMount!="function"||(typeof te.componentWillMount=="function"&&te.componentWillMount(),typeof te.UNSAFE_componentWillMount=="function"&&te.UNSAFE_componentWillMount()),typeof te.componentDidMount=="function"&&(w.flags|=4194308)):(typeof te.componentDidMount=="function"&&(w.flags|=4194308),w.memoizedProps=M,w.memoizedState=Et),te.props=M,te.state=Et,te.context=we,M=mt):(typeof te.componentDidMount=="function"&&(w.flags|=4194308),M=!1)}else{te=w.stateNode,Lj(h,w),we=w.memoizedProps,qt=Ff(_,we),te.props=qt,Wt=w.pendingProps,Lt=te.context,Et=_.contextType,mt=Ab,typeof Et=="object"&&Et!==null&&(mt=Ss(Et)),Ue=_.getDerivedStateFromProps,(Et=typeof Ue=="function"||typeof te.getSnapshotBeforeUpdate=="function")||typeof te.UNSAFE_componentWillReceiveProps!="function"&&typeof te.componentWillReceiveProps!="function"||(we!==Wt||Lt!==mt)&&LU(w,te,M,mt),Tp=!1,Lt=w.memoizedState,te.state=Lt,Lv(w,M,te,W),Fv();var Bt=w.memoizedState;we!==Wt||Lt!==Bt||Tp||h!==null&&h.dependencies!==null&&Fk(h.dependencies)?(typeof Ue=="function"&&(nM(w,_,Ue,M),Bt=w.memoizedState),(qt=Tp||FU(w,_,qt,M,Lt,Bt,mt)||h!==null&&h.dependencies!==null&&Fk(h.dependencies))?(Et||typeof te.UNSAFE_componentWillUpdate!="function"&&typeof te.componentWillUpdate!="function"||(typeof te.componentWillUpdate=="function"&&te.componentWillUpdate(M,Bt,mt),typeof te.UNSAFE_componentWillUpdate=="function"&&te.UNSAFE_componentWillUpdate(M,Bt,mt)),typeof te.componentDidUpdate=="function"&&(w.flags|=4),typeof te.getSnapshotBeforeUpdate=="function"&&(w.flags|=1024)):(typeof te.componentDidUpdate!="function"||we===h.memoizedProps&&Lt===h.memoizedState||(w.flags|=4),typeof te.getSnapshotBeforeUpdate!="function"||we===h.memoizedProps&&Lt===h.memoizedState||(w.flags|=1024),w.memoizedProps=M,w.memoizedState=Bt),te.props=M,te.state=Bt,te.context=mt,M=qt):(typeof te.componentDidUpdate!="function"||we===h.memoizedProps&&Lt===h.memoizedState||(w.flags|=4),typeof te.getSnapshotBeforeUpdate!="function"||we===h.memoizedProps&&Lt===h.memoizedState||(w.flags|=1024),M=!1)}return te=M,Jk(h,w),M=(w.flags&128)!==0,te||M?(te=w.stateNode,_=M&&typeof _.getDerivedStateFromError!="function"?null:te.render(),w.flags|=1,h!==null&&M?(w.child=Ef(w,h.child,null,W),w.child=Ef(w,null,_,W)):ks(h,w,_,W),w.memoizedState=te.state,h=w.child):h=$u(h,w,W),h}function QU(h,w,_,M){return Cf(),w.flags|=256,ks(h,w,_,M),w.child}var cM={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function dM(h){return{baseLanes:h,cachePool:O5()}}function uM(h,w,_){return h=h!==null?h.childLanes&~_:0,w&&(h|=dl),h}function XU(h,w,_){var M=w.pendingProps,W=!1,te=(w.flags&128)!==0,we;if((we=te)||(we=h!==null&&h.memoizedState===null?!1:(pi.current&2)!==0),we&&(W=!0,w.flags&=-129),we=(w.flags&32)!==0,w.flags&=-33,h===null){if(Cr){if(W?Mp(w):Ep(),(h=Pn)?(h=iq(h,Kl),h=h!==null&&h.data!=="&"?h:null,h!==null&&(w.memoizedState={dehydrated:h,treeContext:_p!==null?{id:Dd,overflow:Fd}:null,retryLane:536870912,hydrationErrors:null},_=j5(h),_.return=w,w.child=_,ws=w,Pn=null)):h=null,h===null)throw Cp(w);return WM(h)?w.lanes=32:w.lanes=536870912,null}var Ue=M.children;return M=M.fallback,W?(Ep(),W=w.mode,Ue=e_({mode:"hidden",children:Ue},W),M=Pf(M,W,_,null),Ue.return=w,M.return=w,Ue.sibling=M,w.child=Ue,M=w.child,M.memoizedState=dM(_),M.childLanes=uM(h,we,_),w.memoizedState=cM,Bv(null,M)):(Mp(w),mM(w,Ue))}var mt=h.memoizedState;if(mt!==null&&(Ue=mt.dehydrated,Ue!==null)){if(te)w.flags&256?(Mp(w),w.flags&=-257,w=pM(h,w,_)):w.memoizedState!==null?(Ep(),w.child=h.child,w.flags|=128,w=null):(Ep(),Ue=M.fallback,W=w.mode,M=e_({mode:"visible",children:M.children},W),Ue=Pf(Ue,W,_,null),Ue.flags|=2,M.return=w,Ue.return=w,M.sibling=Ue,w.child=M,Ef(w,h.child,null,_),M=w.child,M.memoizedState=dM(_),M.childLanes=uM(h,we,_),w.memoizedState=cM,w=Bv(null,M));else if(Mp(w),WM(Ue)){if(we=Ue.nextSibling&&Ue.nextSibling.dataset,we)var Et=we.dgst;we=Et,M=Error(n(419)),M.stack="",M.digest=we,Tv({value:M,source:null,stack:null}),w=pM(h,w,_)}else if(_i||Db(h,w,_,!1),we=(_&h.childLanes)!==0,_i||we){if(we=hn,we!==null&&(M=ft(we,_),M!==0&&M!==mt.retryLane))throw mt.retryLane=M,_f(h,M),Io(we,h,M),oM;VM(Ue)||c_(),w=pM(h,w,_)}else VM(Ue)?(w.flags|=192,w.child=h.child,w=null):(h=mt.treeContext,Pn=Ql(Ue.nextSibling),ws=w,Cr=!0,Pp=null,Kl=!1,h!==null&&D5(w,h),w=mM(w,M.children),w.flags|=4096);return w}return W?(Ep(),Ue=M.fallback,W=w.mode,mt=h.child,Et=mt.sibling,M=Ou(mt,{mode:"hidden",children:M.children}),M.subtreeFlags=mt.subtreeFlags&65011712,Et!==null?Ue=Ou(Et,Ue):(Ue=Pf(Ue,W,_,null),Ue.flags|=2),Ue.return=w,M.return=w,M.sibling=Ue,w.child=M,Bv(null,M),M=w.child,Ue=h.child.memoizedState,Ue===null?Ue=dM(_):(W=Ue.cachePool,W!==null?(mt=Si._currentValue,W=W.parent!==mt?{parent:mt,pool:mt}:W):W=O5(),Ue={baseLanes:Ue.baseLanes|_,cachePool:W}),M.memoizedState=Ue,M.childLanes=uM(h,we,_),w.memoizedState=cM,Bv(h.child,M)):(Mp(w),_=h.child,h=_.sibling,_=Ou(_,{mode:"visible",children:M.children}),_.return=w,_.sibling=null,h!==null&&(we=w.deletions,we===null?(w.deletions=[h],w.flags|=16):we.push(h)),w.child=_,w.memoizedState=null,_)}function mM(h,w){return w=e_({mode:"visible",children:w},h.mode),w.return=h,h.child=w}function e_(h,w){return h=sl(22,h,null,w),h.lanes=0,h}function pM(h,w,_){return Ef(w,h.child,null,_),h=mM(w,w.pendingProps.children),h.flags|=2,w.memoizedState=null,h}function ZU(h,w,_){h.lanes|=w;var M=h.alternate;M!==null&&(M.lanes|=w),Tj(h.return,w,_)}function hM(h,w,_,M,W,te){var we=h.memoizedState;we===null?h.memoizedState={isBackwards:w,rendering:null,renderingStartTime:0,last:M,tail:_,tailMode:W,treeForkCount:te}:(we.isBackwards=w,we.rendering=null,we.renderingStartTime=0,we.last=M,we.tail=_,we.tailMode=W,we.treeForkCount=te)}function JU(h,w,_){var M=w.pendingProps,W=M.revealOrder,te=M.tail;M=M.children;var we=pi.current,Ue=(we&2)!==0;if(Ue?(we=we&1|2,w.flags|=128):we&=1,pe(pi,we),ks(h,w,M,_),M=Cr?Nv:0,!Ue&&h!==null&&(h.flags&128)!==0)e:for(h=w.child;h!==null;){if(h.tag===13)h.memoizedState!==null&&ZU(h,_,w);else if(h.tag===19)ZU(h,_,w);else if(h.child!==null){h.child.return=h,h=h.child;continue}if(h===w)break e;for(;h.sibling===null;){if(h.return===null||h.return===w)break e;h=h.return}h.sibling.return=h.return,h=h.sibling}switch(W){case"forwards":for(_=w.child,W=null;_!==null;)h=_.alternate,h!==null&&Hk(h)===null&&(W=_),_=_.sibling;_=W,_===null?(W=w.child,w.child=null):(W=_.sibling,_.sibling=null),hM(w,!1,W,_,te,M);break;case"backwards":case"unstable_legacy-backwards":for(_=null,W=w.child,w.child=null;W!==null;){if(h=W.alternate,h!==null&&Hk(h)===null){w.child=W;break}h=W.sibling,W.sibling=_,_=W,W=h}hM(w,!0,_,null,te,M);break;case"together":hM(w,!1,null,null,void 0,M);break;default:w.memoizedState=null}return w.child}function $u(h,w,_){if(h!==null&&(w.dependencies=h.dependencies),Lp|=w.lanes,(_&w.childLanes)===0)if(h!==null){if(Db(h,w,_,!1),(_&w.childLanes)===0)return null}else return null;if(h!==null&&w.child!==h.child)throw Error(n(153));if(w.child!==null){for(h=w.child,_=Ou(h,h.pendingProps),w.child=_,_.return=w;h.sibling!==null;)h=h.sibling,_=_.sibling=Ou(h,h.pendingProps),_.return=w;_.sibling=null}return w.child}function fM(h,w){return(h.lanes&w)!==0?!0:(h=h.dependencies,!!(h!==null&&Fk(h)))}function oue(h,w,_){switch(w.tag){case 3:A(w,w.stateNode.containerInfo),Np(w,Si,h.memoizedState.cache),Cf();break;case 27:case 5:U(w);break;case 4:A(w,w.stateNode.containerInfo);break;case 10:Np(w,w.type,w.memoizedProps.value);break;case 31:if(w.memoizedState!==null)return w.flags|=128,Bj(w),null;break;case 13:var M=w.memoizedState;if(M!==null)return M.dehydrated!==null?(Mp(w),w.flags|=128,null):(_&w.child.childLanes)!==0?XU(h,w,_):(Mp(w),h=$u(h,w,_),h!==null?h.sibling:null);Mp(w);break;case 19:var W=(h.flags&128)!==0;if(M=(_&w.childLanes)!==0,M||(Db(h,w,_,!1),M=(_&w.childLanes)!==0),W){if(M)return JU(h,w,_);w.flags|=128}if(W=w.memoizedState,W!==null&&(W.rendering=null,W.tail=null,W.lastEffect=null),pe(pi,pi.current),M)break;return null;case 22:return w.lanes=0,$U(h,w,_,w.pendingProps);case 24:Np(w,Si,h.memoizedState.cache)}return $u(h,w,_)}function eH(h,w,_){if(h!==null)if(h.memoizedProps!==w.pendingProps)_i=!0;else{if(!fM(h,_)&&(w.flags&128)===0)return _i=!1,oue(h,w,_);_i=(h.flags&131072)!==0}else _i=!1,Cr&&(w.flags&1048576)!==0&&E5(w,Nv,w.index);switch(w.lanes=0,w.tag){case 16:e:{var M=w.pendingProps;if(h=jf(w.elementType),w.type=h,typeof h=="function")vj(h)?(M=Ff(h,M),w.tag=1,w=YU(null,w,h,M,_)):(w.tag=0,w=lM(null,w,h,M,_));else{if(h!=null){var W=h.$$typeof;if(W===C){w.tag=11,w=HU(null,w,h,M,_);break e}else if(W===j){w.tag=14,w=qU(null,w,h,M,_);break e}}throw w=L(h)||h,Error(n(306,w,""))}}return w;case 0:return lM(h,w,w.type,w.pendingProps,_);case 1:return M=w.type,W=Ff(M,w.pendingProps),YU(h,w,M,W,_);case 3:e:{if(A(w,w.stateNode.containerInfo),h===null)throw Error(n(387));M=w.pendingProps;var te=w.memoizedState;W=te.element,Lj(h,w),Lv(w,M,null,_);var we=w.memoizedState;if(M=we.cache,Np(w,Si,M),M!==te.cache&&Aj(w,[Si],_,!0),Fv(),M=we.element,te.isDehydrated)if(te={element:M,isDehydrated:!1,cache:we.cache},w.updateQueue.baseState=te,w.memoizedState=te,w.flags&256){w=QU(h,w,M,_);break e}else if(M!==W){W=$l(Error(n(424)),w),Tv(W),w=QU(h,w,M,_);break e}else for(h=w.stateNode.containerInfo,h.nodeType===9?h=h.body:h=h.nodeName==="HTML"?h.ownerDocument.body:h,Pn=Ql(h.firstChild),ws=w,Cr=!0,Pp=null,Kl=!0,_=$5(w,null,M,_),w.child=_;_;)_.flags=_.flags&-3|4096,_=_.sibling;else{if(Cf(),M===W){w=$u(h,w,_);break e}ks(h,w,M,_)}w=w.child}return w;case 26:return Jk(h,w),h===null?(_=uq(w.type,null,w.pendingProps,null))?w.memoizedState=_:Cr||(_=w.type,h=w.pendingProps,M=g_(G.current).createElement(_),M[vt]=w,M[Ct]=h,_s(M,_,h),ot(M),w.stateNode=M):w.memoizedState=uq(w.type,h.memoizedProps,w.pendingProps,h.memoizedState),null;case 27:return U(w),h===null&&Cr&&(M=w.stateNode=lq(w.type,w.pendingProps,G.current),ws=w,Kl=!0,W=Pn,Bp(w.type)?(KM=W,Pn=Ql(M.firstChild)):Pn=W),ks(h,w,w.pendingProps.children,_),Jk(h,w),h===null&&(w.flags|=4194304),w.child;case 5:return h===null&&Cr&&((W=M=Pn)&&(M=zue(M,w.type,w.pendingProps,Kl),M!==null?(w.stateNode=M,ws=w,Pn=Ql(M.firstChild),Kl=!1,W=!0):W=!1),W||Cp(w)),U(w),W=w.type,te=w.pendingProps,we=h!==null?h.memoizedProps:null,M=te.children,qM(W,te)?M=null:we!==null&&qM(W,we)&&(w.flags|=32),w.memoizedState!==null&&(W=Hj(h,w,Zde,null,null,_),t0._currentValue=W),Jk(h,w),ks(h,w,M,_),w.child;case 6:return h===null&&Cr&&((h=_=Pn)&&(_=Iue(_,w.pendingProps,Kl),_!==null?(w.stateNode=_,ws=w,Pn=null,h=!0):h=!1),h||Cp(w)),null;case 13:return XU(h,w,_);case 4:return A(w,w.stateNode.containerInfo),M=w.pendingProps,h===null?w.child=Ef(w,null,M,_):ks(h,w,M,_),w.child;case 11:return HU(h,w,w.type,w.pendingProps,_);case 7:return ks(h,w,w.pendingProps,_),w.child;case 8:return ks(h,w,w.pendingProps.children,_),w.child;case 12:return ks(h,w,w.pendingProps.children,_),w.child;case 10:return M=w.pendingProps,Np(w,w.type,M.value),ks(h,w,M.children,_),w.child;case 9:return W=w.type._context,M=w.pendingProps.children,Tf(w),W=Ss(W),M=M(W),w.flags|=1,ks(h,w,M,_),w.child;case 14:return qU(h,w,w.type,w.pendingProps,_);case 15:return GU(h,w,w.type,w.pendingProps,_);case 19:return JU(h,w,_);case 31:return sue(h,w,_);case 22:return $U(h,w,_,w.pendingProps);case 24:return Tf(w),M=Ss(Si),h===null?(W=Ej(),W===null&&(W=hn,te=jj(),W.pooledCache=te,te.refCount++,te!==null&&(W.pooledCacheLanes|=_),W=te),w.memoizedState={parent:M,cache:W},Fj(w),Np(w,Si,W)):((h.lanes&_)!==0&&(Lj(h,w),Lv(w,null,null,_),Fv()),W=h.memoizedState,te=w.memoizedState,W.parent!==M?(W={parent:M,cache:M},w.memoizedState=W,w.lanes===0&&(w.memoizedState=w.updateQueue.baseState=W),Np(w,Si,M)):(M=te.cache,Np(w,Si,M),M!==W.cache&&Aj(w,[Si],_,!0))),ks(h,w,w.pendingProps.children,_),w.child;case 29:throw w.pendingProps}throw Error(n(156,w.tag))}function Vu(h){h.flags|=4}function gM(h,w,_,M,W){if((w=(h.mode&32)!==0)&&(w=!1),w){if(h.flags|=16777216,(W&335544128)===W)if(h.stateNode.complete)h.flags|=8192;else if(NH())h.flags|=8192;else throw Mf=Ik,Dj}else h.flags&=-16777217}function tH(h,w){if(w.type!=="stylesheet"||(w.state.loading&4)!==0)h.flags&=-16777217;else if(h.flags|=16777216,!gq(w))if(NH())h.flags|=8192;else throw Mf=Ik,Dj}function t_(h,w){w!==null&&(h.flags|=4),h.flags&16384&&(w=h.tag!==22?We():536870912,h.lanes|=w,$b|=w)}function Uv(h,w){if(!Cr)switch(h.tailMode){case"hidden":w=h.tail;for(var _=null;w!==null;)w.alternate!==null&&(_=w),w=w.sibling;_===null?h.tail=null:_.sibling=null;break;case"collapsed":_=h.tail;for(var M=null;_!==null;)_.alternate!==null&&(M=_),_=_.sibling;M===null?w||h.tail===null?h.tail=null:h.tail.sibling=null:M.sibling=null}}function Cn(h){var w=h.alternate!==null&&h.alternate.child===h.child,_=0,M=0;if(w)for(var W=h.child;W!==null;)_|=W.lanes|W.childLanes,M|=W.subtreeFlags&65011712,M|=W.flags&65011712,W.return=h,W=W.sibling;else for(W=h.child;W!==null;)_|=W.lanes|W.childLanes,M|=W.subtreeFlags,M|=W.flags,W.return=h,W=W.sibling;return h.subtreeFlags|=M,h.childLanes=_,w}function lue(h,w,_){var M=w.pendingProps;switch(_j(w),w.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Cn(w),null;case 1:return Cn(w),null;case 3:return _=w.stateNode,M=null,h!==null&&(M=h.memoizedState.cache),w.memoizedState.cache!==M&&(w.flags|=2048),Hu(Si),F(),_.pendingContext&&(_.context=_.pendingContext,_.pendingContext=null),(h===null||h.child===null)&&(Eb(w)?Vu(w):h===null||h.memoizedState.isDehydrated&&(w.flags&256)===0||(w.flags|=1024,Cj())),Cn(w),null;case 26:var W=w.type,te=w.memoizedState;return h===null?(Vu(w),te!==null?(Cn(w),tH(w,te)):(Cn(w),gM(w,W,null,M,_))):te?te!==h.memoizedState?(Vu(w),Cn(w),tH(w,te)):(Cn(w),w.flags&=-16777217):(h=h.memoizedProps,h!==M&&Vu(w),Cn(w),gM(w,W,h,M,_)),null;case 27:if(V(w),_=G.current,W=w.type,h!==null&&w.stateNode!=null)h.memoizedProps!==M&&Vu(w);else{if(!M){if(w.stateNode===null)throw Error(n(166));return Cn(w),null}h=me.current,Eb(w)?F5(w):(h=lq(W,M,_),w.stateNode=h,Vu(w))}return Cn(w),null;case 5:if(V(w),W=w.type,h!==null&&w.stateNode!=null)h.memoizedProps!==M&&Vu(w);else{if(!M){if(w.stateNode===null)throw Error(n(166));return Cn(w),null}if(te=me.current,Eb(w))F5(w);else{var we=g_(G.current);switch(te){case 1:te=we.createElementNS("http://www.w3.org/2000/svg",W);break;case 2:te=we.createElementNS("http://www.w3.org/1998/Math/MathML",W);break;default:switch(W){case"svg":te=we.createElementNS("http://www.w3.org/2000/svg",W);break;case"math":te=we.createElementNS("http://www.w3.org/1998/Math/MathML",W);break;case"script":te=we.createElement("div"),te.innerHTML=" +