From 60e31634b8bff1a46fa252850a720d354956512e Mon Sep 17 00:00:00 2001 From: maziggy Date: Tue, 9 Jun 2026 12:08:37 +0200 Subject: [PATCH] feat(diagnostic): add "Store sent files on external storage" check (install step 4) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Detects the printer-side variant of install step 4 — many users (esp. on clean installs) forget to enable this and only notice when their archive cards have no thumbnails. The diagnostic now catches it upfront. Detection: read state.store_to_sdcard, which Bambuddy already parses from MQTT push_status home_flag bit 11 (bambu_mqtt.py:153). Instant, no I/O. An FTP upload-and-verify probe was tried first and rejected. /cache is always writable from Bambuddy regardless of the slicer setting — only BambuStudio's own behaviour changes when the toggle flips, not the printer's acceptance policy. Confirmed empirically against X1C + H2D with the slicer option toggled off: probe succeeded, home_flag bit 11 stayed True. So the only reliable signal is what the printer actually reports about its own state. Limitation: the printer-side variant only exists on newer firmware (P2S 01.02 / Bambu Studio 2.6+). On older versions the toggle lives only in the slicer and the printer never hears about it, so this check will pass even when the user is missing step 4 in BambuStudio. The skip-text and the wiki call this out explicitly. A reactive banner on the no-3MF archive-fallback path is planned as a follow-up to cover that case. Statuses: - pass: state.store_to_sdcard is True - fail: state.store_to_sdcard is False (-> overall escalates to problems) - skip: no live state, disconnected, or field never populated --- CHANGELOG.md | 2 + backend/app/services/printer_diagnostic.py | 29 ++- .../unit/services/test_printer_diagnostic.py | 65 +++++- frontend/src/i18n/locales/de.ts | 6 + frontend/src/i18n/locales/en.ts | 6 + frontend/src/i18n/locales/es.ts | 6 + frontend/src/i18n/locales/fr.ts | 6 + frontend/src/i18n/locales/it.ts | 6 + frontend/src/i18n/locales/ja.ts | 6 + frontend/src/i18n/locales/ko.ts | 6 + frontend/src/i18n/locales/pt-BR.ts | 6 + frontend/src/i18n/locales/tr.ts | 6 + frontend/src/i18n/locales/zh-CN.ts | 6 + frontend/src/i18n/locales/zh-TW.ts | 6 + .../{index-DGbY3_Tm.js => index-DInAXQkE.js} | 192 +++++++++--------- static/index.html | 2 +- 16 files changed, 255 insertions(+), 101 deletions(-) rename static/assets/{index-DGbY3_Tm.js => index-DInAXQkE.js} (77%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 142c7394f..76bdc06ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ All notable changes to Bambuddy will be documented in this file. ## [0.2.5b1] - Unreleased ### Added +- **Connection diagnostic now verifies install step 4 ("Store sent files on external storage")** — Many users miss this setting when adding their first printer; without it BambuStudio / OrcaSlicer never leave a `.gcode.3mf` on the printer's SD card, every archived print falls back to no-thumbnail / no-metadata, and the cause is invisible until the user notices the archive is empty. **The trap with detecting this**: on newer firmware (P2S 01.02 / Bambu Studio 2.6+) the toggle moved onto the printer itself and is pushed on MQTT `home_flag` bit 11 (Bambuddy already parses this into `state.store_to_sdcard`). On older versions it's a purely slicer-side preference invisible to the printer. An FTP upload-probe approach was tried first — it always passed regardless of the slicer toggle because the `/cache` directory is always writable from Bambuddy's perspective; the slicer toggle only controls what BambuStudio chooses to do, not what the printer accepts from other clients. Confirmed empirically against an X1C + H2D with the slicer option toggled off (probe still succeeded, `home_flag` bit 11 stayed True). **Fix**: new `external_storage` check reads `state.store_to_sdcard` directly. Pass when the printer reports the bit on, fail when off, skip when no live MQTT state or the field has never been populated (older firmware that doesn't push `home_flag`). Localised fix-text points at install step 4 with both the printer-side and slicer-side variants spelled out; the `skip` text explicitly calls out the older-slicer limitation so users on that path know to verify manually. Slot in the check list sits between `port_ftps` and `mqtt_auth`. 5 new tests (`TestExternalStorageCheck`) cover pass-on-true, fail-on-false, skip-on-disconnect, skip-on-pre-add (no state), skip-on-missing-field. The reactive symptom-side detection — a one-time banner the first time the archiver records `extra_data.no_3mf_available=True` after a slicer-initiated print — is planned as a separate follow-up to cover the slicer-only setting case. Wiki updated on the System page (`features/system-info.md`) and the Troubleshooting page (`reference/troubleshooting.md`). i18n: 4 new keys (title, pass, fail, skip) localised to all 11 locales (de, en, es, fr, it, ja, ko, pt-BR, tr, zh-CN, zh-TW) — no English fallbacks. + - **"Open in Slicer" desktop target is now configurable separately from the API sidecar slicer (#1329, reported by @hasmar04)** — Reporter wanted to slice via the Bambu Studio sidecar but open files locally in OrcaSlicer; the existing `preferred_slicer` setting drove both, so picking one forced the other. The slicer-URI flow on Workflow → Slicer literally swapped the BambuStudio handler for the OrcaSlicer one whenever the user switched the API choice. **Fix: new `open_in_slicer` setting** (`'bambu_studio' | 'orcaslicer' | null`) drives only the desktop "Open in Slicer" URI handoff; the in-app SliceModal + sidecar URL routing in `library.py`, `archives.py`, `slicer_presets.py` continue to use `preferred_slicer` exactly as before. Default is `null` — the frontend falls back to `preferred_slicer` so existing installs behave identically until a user changes it (no migration, no churn). **Storage** lives in the existing `app_settings` key/value table; the PUT path serialises a Python None as the literal string `"None"`, and the GET path normalises it back via a new branch in `_build_settings_response` matching the existing `default_printer_id` convention — without that normalization the frontend can't tell "explicit override absent" from "explicit override set to a bogus value". **Frontend**: Settings → Slicer card relabels the existing dropdown's description ("Slicer used for in-app slicing via the API sidecar"), adds a new "Open in Slicer" dropdown below it with three options — "Same as API slicer" (the inherit-from-preferred default), "Bambu Studio", "OrcaSlicer". `ArchivesPage` (5 `openInSlicerWithToken` call sites), `MakerworldPage` (the URI handoff branch when `useSlicerApi=false`), and `ModelViewerModal` (4 `openInSlicer(...)` call sites) all switched from reading `settings?.preferred_slicer` to `settings?.open_in_slicer ?? settings?.preferred_slicer`. MakerworldPage's "Slice in {{slicer}}" button label additionally branches on `useSlicerApi`: when on, the label reflects the API slicer; when off, the desktop slicer — so the button text always matches what the button actually does. The OrcaSlicer "known CLI bugs" warning stays attached to the API dropdown (where it belongs — it's about the sidecar's CLI). **i18n**: 3 new keys in all 11 locales (de/en/es/fr/it/ja/ko/pt-BR/tr/zh-CN/zh-TW) — `settings.openInSlicerLabel`, `settings.openInSlicerInherit`, `settings.openInSlicerDescription` — plus an updated `settings.preferredSlicerDescription` everywhere (the old wording "Choose which slicer application to open files with" became wrong once the field stopped driving the desktop handoff). No English fallbacks per the project's hard rule. **Tests**: 3 new in `TestOpenInSlicerOverride` pin the contract — default is null, override persists across GET, explicit reset to null round-trips correctly without leaving the `"None"` string leak. Full backend suite green (5798/5798); frontend ESLint + build clean; vitest on SettingsPage + MakerworldPage 48/48 green; i18n parity 5095 leaves × 11 locales green. - **Queue items + Print modal now show the build plate type, per-plate accurate (#1281, reported by @CMW-ISS)** — Reporter on a multi-printer farm with 40+-plate runs needed to walk to the printer with the right physical plate; the archive card had recently grown a bed-type badge, but the queue and the scheduling modal didn't. They were having to open the source 3MF in the slicer to look up which plate each queued / scheduled job needs. **Backend**: new `extract_bed_type_from_3mf(file_path, plate_id)` helper in `utils/threemf_tools.py`, alongside the existing `extract_filament_usage_from_3mf` shape — reads `Metadata/slice_info.config`, finds the `` with the matching `index`, returns its `curr_bed_type`. When `plate_id` is None it returns the first plate's value (matches the archive-level capture convention). `PrintQueueItemResponse` gains a `bed_type: str | None` field; `_enrich_response` populates it from `archive.bed_type` / `library_file.file_metadata["bed_type"]` as the file-level default, then overrides per-plate via the new helper when `item.plate_id` is set. This matters because `archive.bed_type` is captured at ingest as the FIRST plate's value only (see `services/archive.py:235`) — a 40-plate 3MF mixing PEI + Engineering returns "PEI" for every plate at the archive level, even though the user's plate 17 actually needs Engineering. The per-plate override re-reads the 3MF and returns the truth. **`/archives/{id}/plates`** (and the library-file equivalent) now include `bed_type` in each plate object so the PrintModal's plate selector can render the badge inline. **Frontend**: queue card meta row gains a bed badge after filament weight — uses the existing `getBedTypeInfo(bed_type)` helper from `utils/bedType.ts` (the same one the archive card uses, so all 11 canonical bed labels + icons are covered including the BambuStudio / OrcaSlicer spelling drift). PrintModal's per-plate `PlateSelector` shows the bed badge under each plate's filament line; the modal header carries a bed badge for the selected (or sole) plate, surfaced before the user hits Schedule. `PlateInfo` + `PlateMetadata` types both get an optional `bed_type` field. No new i18n keys needed — `getBedTypeInfo` returns the canonical English plate name as the human label, matching the archive card's existing convention. **Tests**: 8 new unit cases in `test_threemf_tools.py::TestExtractBedTypeFrom3mf` pin the helper (single-plate, multi-plate per-plate, no-plate-id defaults to first, unknown-plate-id → None, plate-without-bed-type → None (no fall-through to another plate's value), missing slice_info, invalid file, whitespace trim). Full backend suite green (3848/3848); frontend build clean; ESLint clean; vitest on touched pages 81/81; i18n parity 5092 leaves × 11 locales green. diff --git a/backend/app/services/printer_diagnostic.py b/backend/app/services/printer_diagnostic.py index 5f04d4a13..203608c27 100644 --- a/backend/app/services/printer_diagnostic.py +++ b/backend/app/services/printer_diagnostic.py @@ -160,8 +160,35 @@ async def run_connection_diagnostic( ) ) - # --- MQTT credentials / connection --- + # --- External storage (printer-side "Store sent files on external storage") --- + # Install step 4. The setting has two variants depending on + # firmware/slicer combo: on newer firmware the toggle lives on the + # printer (P2S 01.02 / BambuStudio 2.6+), on older versions it's + # purely a slicer-side preference. + # + # For the printer-side variant, `home_flag` bit 11 is pushed on every + # status report and parsed into state.store_to_sdcard (bambu_mqtt.py + # line 153). That's the signal here — instant, no FTP I/O. + # + # For the slicer-side variant, the printer never hears about it and + # this check will pass even when the user is missing step 4. That gap + # is covered separately by the "no_3mf_available" archive-fallback + # banner. An FTP upload-and-verify probe was tried and rejected — the + # /cache directory is always writable from Bambuddy regardless of + # either toggle, so the probe always passes and detects nothing. state = printer_manager.get_status(printer.id) if printer else None + if state is None or not state.connected: + checks.append(DiagnosticCheck(id="external_storage", status="skip")) + elif getattr(state, "store_to_sdcard", None) is True: + checks.append(DiagnosticCheck(id="external_storage", status="pass")) + elif getattr(state, "store_to_sdcard", None) is False: + checks.append(DiagnosticCheck(id="external_storage", status="fail")) + else: + # State exists but the field was never populated — skip rather than + # report a false fail. + checks.append(DiagnosticCheck(id="external_storage", status="skip")) + + # --- MQTT credentials / connection --- if not mqtt_ok: # Can't reach the broker at all — the port check already reported it. checks.append(DiagnosticCheck(id="mqtt_auth", status="skip")) diff --git a/backend/tests/unit/services/test_printer_diagnostic.py b/backend/tests/unit/services/test_printer_diagnostic.py index 1d1f213ca..3adc5abb2 100644 --- a/backend/tests/unit/services/test_printer_diagnostic.py +++ b/backend/tests/unit/services/test_printer_diagnostic.py @@ -30,8 +30,12 @@ def _port_probe(overrides=None): return _probe -def _state(*, connected=True, developer_mode=True): - return types.SimpleNamespace(connected=connected, developer_mode=developer_mode) +def _state(*, connected=True, developer_mode=True, store_to_sdcard=True): + return types.SimpleNamespace( + connected=connected, + developer_mode=developer_mode, + store_to_sdcard=store_to_sdcard, + ) class _Env: @@ -101,7 +105,10 @@ class TestSameSubnet: class TestExistingPrinter: async def test_all_healthy(self): - with _Env(state=_state(connected=True, developer_mode=True), report_messages_since_connect=42): + with _Env( + state=_state(connected=True, developer_mode=True, store_to_sdcard=True), + report_messages_since_connect=42, + ): result = await run_connection_diagnostic("192.168.1.50", printer=_printer()) s = _statuses(result) assert result.overall == "ok" @@ -111,6 +118,7 @@ class TestExistingPrinter: "port_rtsps": "pass", "network_mode": "pass", "subnet": "pass", + "external_storage": "pass", "mqtt_auth": "pass", "developer_mode": "pass", "printer_publishing": "pass", @@ -236,3 +244,54 @@ class TestPreAddFlow: with _Env(): result = await run_connection_diagnostic("192.168.1.50") assert _statuses(result)["mqtt_auth"] == "skip" + + +class TestExternalStorageCheck: + """Install step 4 — "Store sent files on external storage". + + Detected via ``state.store_to_sdcard`` (parsed from MQTT push_status + ``home_flag`` bit 11). Only catches the printer-side variant of the + setting on newer firmware (P2S 01.02 / Studio 2.6+) — the older + slicer-side variant is undetectable from outside the slicer and is + covered separately by the no-3MF archive-fallback banner. + """ + + async def test_passes_when_store_to_sdcard_true(self): + with _Env(state=_state(store_to_sdcard=True)): + result = await run_connection_diagnostic("192.168.1.50", printer=_printer()) + assert _statuses(result)["external_storage"] == "pass" + + async def test_fails_when_store_to_sdcard_false(self): + # Bit 11 reported as 0 -> printer-side toggle is off. Overall + # escalates to "problems" because a fail is present. + with _Env(state=_state(store_to_sdcard=False)): + result = await run_connection_diagnostic("192.168.1.50", printer=_printer()) + assert _statuses(result)["external_storage"] == "fail" + assert result.overall == "problems" + + async def test_skips_when_disconnected(self): + # State exists (we have a saved printer) but the MQTT connection + # dropped, so the latest store_to_sdcard value can't be trusted. + with _Env(state=_state(connected=False, store_to_sdcard=True)): + result = await run_connection_diagnostic("192.168.1.50", printer=_printer()) + assert _statuses(result)["external_storage"] == "skip" + + async def test_skips_pre_add_flow(self): + # No saved printer -> no state -> nothing to read. The check has + # to skip; pre-add can't probe this without a live MQTT session. + with _Env(): + result = await run_connection_diagnostic( + "192.168.1.50", + serial_number="01P", + access_code="probe-code", + ) + assert _statuses(result)["external_storage"] == "skip" + + async def test_skips_when_field_missing(self): + # State exists and is connected but store_to_sdcard was never + # populated (firmware that doesn't push home_flag). Skip rather + # than fabricate a False from a missing field. + bare = types.SimpleNamespace(connected=True, developer_mode=True) + with _Env(state=bare): + result = await run_connection_diagnostic("192.168.1.50", printer=_printer()) + assert _statuses(result)["external_storage"] == "skip" diff --git a/frontend/src/i18n/locales/de.ts b/frontend/src/i18n/locales/de.ts index e6d1c8153..4182b569a 100644 --- a/frontend/src/i18n/locales/de.ts +++ b/frontend/src/i18n/locales/de.ts @@ -5662,6 +5662,12 @@ export default { pass: 'Erreichbar — das Senden von Druckdateien funktioniert.', warn: 'Port 990 ist nicht erreichbar. Die Überwachung funktioniert möglicherweise weiterhin, aber das Senden von Drucken an den Drucker schlägt fehl. Stellen Sie sicher, dass Port 990 nicht blockiert ist.', }, + external_storage: { + title: 'Gesendete Dateien auf externem Speicher speichern (Installationsschritt 4)', + pass: 'Der Drucker meldet, dass diese Option aktiv ist — gesendete Dateien werden auf der SD-Karte gespeichert und Archive enthalten Vorschaubilder und Slicer-Metadaten.', + fail: 'Der Drucker meldet, dass diese Option deaktiviert ist. Aktivieren Sie "Gesendete Dateien auf externem Speicher speichern" — bei neuer Firmware (P2S 01.02 / Bambu Studio 2.6+) liegt der Schalter in den Druckeinstellungen des Druckers, bei älteren Versionen im Geräte-Tab von Bambu Studio / OrcaSlicer. Ohne diese Option fehlen jedem archivierten Druck Vorschaubild und Slicer-Metadaten.', + skip: 'Nicht geprüft — eine aktive MQTT-Verbindung ist erforderlich. Bei älteren Slicern, in denen diese Einstellung nur im Slicer existiert, meldet sie der Drucker nicht — diese Prüfung besteht auch dann, wenn die Option deaktiviert ist. Prüfen Sie Installationsschritt 4 in diesem Fall manuell.', + }, port_rtsps: { title: 'Kameraport (RTSPS 322)', pass: 'Erreichbar — der Kamerastream funktioniert.', diff --git a/frontend/src/i18n/locales/en.ts b/frontend/src/i18n/locales/en.ts index 3fac750c3..852a2c133 100644 --- a/frontend/src/i18n/locales/en.ts +++ b/frontend/src/i18n/locales/en.ts @@ -5675,6 +5675,12 @@ export default { pass: 'Reachable — sending print files will work.', warn: 'Port 990 is unreachable. Monitoring may still work, but sending prints to the printer will fail. Make sure port 990 is not blocked.', }, + external_storage: { + title: 'Store sent files on external storage (install step 4)', + pass: 'The printer reports this option is on — sent files will be stored on the SD card and archives will have thumbnails and slicer metadata.', + fail: 'The printer reports this option is off. Enable "Store sent files on external storage" — on newer firmware (P2S 01.02 / Bambu Studio 2.6+) the toggle lives on the printer\'s Print Settings; on older versions it\'s in Bambu Studio / OrcaSlicer\'s Device tab. Without it, every archived print is missing its thumbnail and slicer metadata.', + skip: 'Not checked — needs a live MQTT connection. On older slicers where this setting lives only in the slicer the printer never reports it, so this check will pass even when the option is off — verify install step 4 manually.', + }, port_rtsps: { title: 'Camera port (RTSPS 322)', pass: 'Reachable — the camera stream will work.', diff --git a/frontend/src/i18n/locales/es.ts b/frontend/src/i18n/locales/es.ts index 093ea46bd..efc5f2ca7 100644 --- a/frontend/src/i18n/locales/es.ts +++ b/frontend/src/i18n/locales/es.ts @@ -5671,6 +5671,12 @@ export default { pass: 'Accesible — el envío de archivos de impresión funcionará.', warn: 'El puerto 990 no es accesible. La supervisión puede seguir funcionando, pero el envío de impresiones a la impresora fallará. Asegúrese de que el puerto 990 no esté bloqueado.', }, + external_storage: { + title: 'Almacenar archivos enviados en almacenamiento externo (paso 4 de instalación)', + pass: 'La impresora informa que esta opción está activada — los archivos enviados se guardarán en la tarjeta SD y los archivos tendrán miniaturas y metadatos del slicer.', + fail: 'La impresora informa que esta opción está desactivada. Active "Almacenar archivos enviados en almacenamiento externo" — en firmware reciente (P2S 01.02 / Bambu Studio 2.6+) el conmutador está en los Ajustes de Impresión de la impresora; en versiones anteriores está en la pestaña Dispositivo de Bambu Studio / OrcaSlicer. Sin esta opción, cada impresión archivada queda sin miniatura ni metadatos del slicer.', + skip: 'No comprobado — se necesita una conexión MQTT activa. En slicers más antiguos donde este ajuste solo existe en el slicer, la impresora no lo reporta, así que esta comprobación pasa aunque la opción esté desactivada — verifique el paso 4 de la instalación manualmente.', + }, port_rtsps: { title: 'Puerto de la cámara (RTSPS 322)', pass: 'Accesible — la transmisión de la cámara funcionará.', diff --git a/frontend/src/i18n/locales/fr.ts b/frontend/src/i18n/locales/fr.ts index eb4f628f8..74e0428cc 100644 --- a/frontend/src/i18n/locales/fr.ts +++ b/frontend/src/i18n/locales/fr.ts @@ -5652,6 +5652,12 @@ export default { pass: 'Accessible — l\'envoi de fichiers d\'impression fonctionnera.', warn: 'Le port 990 est inaccessible. La surveillance peut toujours fonctionner, mais l\'envoi d\'impressions vers l\'imprimante échouera. Assurez-vous que le port 990 n\'est pas bloqué.', }, + external_storage: { + title: 'Stocker les fichiers envoyés sur stockage externe (étape 4 de l\'installation)', + pass: 'L\'imprimante signale que cette option est activée — les fichiers envoyés seront stockés sur la carte SD et les archives auront des miniatures et des métadonnées slicer.', + fail: 'L\'imprimante signale que cette option est désactivée. Activez « Stocker les fichiers envoyés sur stockage externe » — sur les firmwares récents (P2S 01.02 / Bambu Studio 2.6+) l\'interrupteur se trouve dans les Paramètres d\'impression de l\'imprimante ; sur les versions antérieures, il est dans l\'onglet Périphérique de Bambu Studio / OrcaSlicer. Sans cette option, chaque impression archivée est dépourvue de miniature et de métadonnées slicer.', + skip: 'Non vérifié — une connexion MQTT active est requise. Sur les slicers plus anciens où ce paramètre n\'existe que dans le slicer, l\'imprimante ne le signale pas, donc cette vérification passe même si l\'option est désactivée — vérifiez l\'étape 4 de l\'installation manuellement.', + }, port_rtsps: { title: 'Port caméra (RTSPS 322)', pass: 'Accessible — le flux de la caméra fonctionnera.', diff --git a/frontend/src/i18n/locales/it.ts b/frontend/src/i18n/locales/it.ts index 4dfbad2f4..ac9555df2 100644 --- a/frontend/src/i18n/locales/it.ts +++ b/frontend/src/i18n/locales/it.ts @@ -5651,6 +5651,12 @@ export default { pass: 'Raggiungibile — l\'invio dei file di stampa funzionerà.', warn: 'La porta 990 non è raggiungibile. Il monitoraggio potrebbe ancora funzionare, ma l\'invio delle stampe alla stampante fallirà. Assicurati che la porta 990 non sia bloccata.', }, + external_storage: { + title: 'Memorizza file inviati su archiviazione esterna (passo 4 dell\'installazione)', + pass: 'La stampante segnala che questa opzione è attiva — i file inviati saranno memorizzati sulla scheda SD e gli archivi avranno miniature e metadati dello slicer.', + fail: 'La stampante segnala che questa opzione è disattivata. Abilita "Memorizza file inviati su archiviazione esterna" — nei firmware recenti (P2S 01.02 / Bambu Studio 2.6+) l\'interruttore si trova nelle Impostazioni di stampa della stampante; nelle versioni precedenti è nella scheda Dispositivo di Bambu Studio / OrcaSlicer. Senza questa opzione, ogni stampa archiviata è priva di miniatura e di metadati dello slicer.', + skip: 'Non verificato — è necessaria una connessione MQTT attiva. Negli slicer più vecchi dove questa impostazione esiste solo nello slicer, la stampante non la segnala, quindi questo controllo passa anche se l\'opzione è disattivata — verifica manualmente il passo 4 dell\'installazione.', + }, port_rtsps: { title: 'Porta fotocamera (RTSPS 322)', pass: 'Raggiungibile — lo streaming della fotocamera funzionerà.', diff --git a/frontend/src/i18n/locales/ja.ts b/frontend/src/i18n/locales/ja.ts index fd7128b2d..d876abef7 100644 --- a/frontend/src/i18n/locales/ja.ts +++ b/frontend/src/i18n/locales/ja.ts @@ -5663,6 +5663,12 @@ export default { pass: '到達可能 — 印刷ファイルの送信は機能します。', warn: 'ポート990に到達できません。監視は引き続き機能する場合がありますが、プリンターへの印刷送信は失敗します。ポート990がブロックされていないことを確認してください。', }, + external_storage: { + title: '送信ファイルを外部ストレージに保存 (インストール手順4)', + pass: 'プリンターはこのオプションが有効と報告しています — 送信されたファイルはSDカードに保存され、アーカイブにはサムネイルとスライサーメタデータが含まれます。', + fail: 'プリンターはこのオプションが無効と報告しています。「送信ファイルを外部ストレージに保存」を有効にしてください — 新しいファームウェア (P2S 01.02 / Bambu Studio 2.6以降) ではプリンター本体の印刷設定にトグルがあります。古いバージョンでは Bambu Studio / OrcaSlicer のデバイスタブにあります。この設定がないと、アーカイブされた印刷にはサムネイルもスライサーメタデータも残りません。', + skip: '未確認 — アクティブなMQTT接続が必要です。古いスライサーでこの設定がスライサー側のみに存在する場合、プリンターはそれを報告しないため、オプションが無効でもこのチェックは通過します — インストール手順4を手動で確認してください。', + }, port_rtsps: { title: 'カメラポート (RTSPS 322)', pass: '到達可能 — カメラストリームは機能します。', diff --git a/frontend/src/i18n/locales/ko.ts b/frontend/src/i18n/locales/ko.ts index c0f2c7b79..c3e761dd2 100644 --- a/frontend/src/i18n/locales/ko.ts +++ b/frontend/src/i18n/locales/ko.ts @@ -5712,6 +5712,12 @@ export default { pass: '연결 가능 — 인쇄 파일 전송이 작동합니다.', warn: '포트 990에 연결할 수 없습니다. 모니터링은 작동할 수 있지만 프린터로 파일 전송에 실패합니다. 포트 990이 차단되지 않았는지 확인하세요.' }, + external_storage: { + title: '전송된 파일을 외부 저장소에 저장 (설치 단계 4)', + pass: '프린터가 이 옵션이 켜져 있다고 보고합니다 — 전송된 파일이 SD 카드에 저장되며 아카이브에 썸네일과 슬라이서 메타데이터가 포함됩니다.', + fail: '프린터가 이 옵션이 꺼져 있다고 보고합니다. "전송된 파일을 외부 저장소에 저장"을 활성화하세요 — 최신 펌웨어 (P2S 01.02 / Bambu Studio 2.6 이상)에서는 프린터의 인쇄 설정에 토글이 있고, 이전 버전에서는 Bambu Studio / OrcaSlicer의 장치 탭에 있습니다. 이 옵션이 없으면 아카이브된 모든 인쇄물에 썸네일과 슬라이서 메타데이터가 없습니다.', + skip: '확인되지 않음 — 활성 MQTT 연결이 필요합니다. 이 설정이 슬라이서에만 존재하는 이전 슬라이서에서는 프린터가 보고하지 않으므로, 옵션이 꺼져 있어도 이 검사는 통과합니다 — 설치 단계 4를 수동으로 확인하세요.' + }, port_rtsps: { title: '카메라 포트 (RTSPS 322)', pass: '연결 가능 — 카메라 스트림이 작동합니다.', diff --git a/frontend/src/i18n/locales/pt-BR.ts b/frontend/src/i18n/locales/pt-BR.ts index f6b5661ab..584e917bb 100644 --- a/frontend/src/i18n/locales/pt-BR.ts +++ b/frontend/src/i18n/locales/pt-BR.ts @@ -5651,6 +5651,12 @@ export default { pass: 'Acessível — o envio de arquivos de impressão funcionará.', warn: 'A porta 990 está inacessível. O monitoramento ainda pode funcionar, mas o envio de impressões para a impressora falhará. Verifique se a porta 990 não está bloqueada.', }, + external_storage: { + title: 'Armazenar arquivos enviados no armazenamento externo (passo 4 da instalação)', + pass: 'A impressora informa que esta opção está ligada — os arquivos enviados serão armazenados no cartão SD e os arquivos terão miniaturas e metadados do fatiador.', + fail: 'A impressora informa que esta opção está desligada. Ative "Armazenar arquivos enviados no armazenamento externo" — em firmwares recentes (P2S 01.02 / Bambu Studio 2.6+) o interruptor fica nas Configurações de Impressão da impressora; em versões mais antigas, está na aba Dispositivo do Bambu Studio / OrcaSlicer. Sem essa opção, cada impressão arquivada fica sem miniatura nem metadados do fatiador.', + skip: 'Não verificado — é necessária uma conexão MQTT ativa. Em fatiadores mais antigos onde essa configuração existe apenas no fatiador, a impressora não a reporta, então esta verificação passa mesmo com a opção desligada — verifique o passo 4 da instalação manualmente.', + }, port_rtsps: { title: 'Porta da câmera (RTSPS 322)', pass: 'Acessível — o streaming da câmera funcionará.', diff --git a/frontend/src/i18n/locales/tr.ts b/frontend/src/i18n/locales/tr.ts index 46b59e082..66e90eaa2 100644 --- a/frontend/src/i18n/locales/tr.ts +++ b/frontend/src/i18n/locales/tr.ts @@ -5601,6 +5601,12 @@ export default { pass: 'Erişilebilir — baskı dosyaları gönderme çalışacak.', warn: 'Port 990 erişilemez. İzleme yine çalışabilir, ancak yazıcıya baskı gönderme başarısız olacak. Port 990\'ın engellenmediğinden emin olun.', }, + external_storage: { + title: 'Gönderilen dosyaları harici depolamada sakla (kurulum adımı 4)', + pass: 'Yazıcı bu seçeneğin açık olduğunu bildiriyor — gönderilen dosyalar SD kartta saklanacak ve arşivler küçük resim ve dilimleyici meta verileri içerecek.', + fail: 'Yazıcı bu seçeneğin kapalı olduğunu bildiriyor. "Gönderilen dosyaları harici depolamada sakla" seçeneğini etkinleştirin — yeni donanım yazılımlarında (P2S 01.02 / Bambu Studio 2.6+) düğme yazıcının Baskı Ayarları\'nda; eski sürümlerde Bambu Studio / OrcaSlicer\'in Cihaz sekmesindedir. Bu seçenek olmadan, arşivlenen her baskıda küçük resim ve dilimleyici meta verisi olmayacak.', + skip: 'Kontrol edilmedi — etkin bir MQTT bağlantısı gerekli. Bu ayarın yalnızca dilimleyicide bulunduğu eski dilimleyicilerde yazıcı bunu bildirmez, bu nedenle seçenek kapalı olsa bile bu kontrol geçer — kurulum adımı 4\'ü manuel olarak doğrulayın.', + }, port_rtsps: { title: 'Kamera portu (RTSPS 322)', pass: 'Erişilebilir — kamera akışı çalışacak.', diff --git a/frontend/src/i18n/locales/zh-CN.ts b/frontend/src/i18n/locales/zh-CN.ts index 67c826789..20d6d7c4f 100644 --- a/frontend/src/i18n/locales/zh-CN.ts +++ b/frontend/src/i18n/locales/zh-CN.ts @@ -5650,6 +5650,12 @@ export default { pass: '可达 — 发送打印文件将正常工作。', warn: '端口 990 不可达。监控可能仍然有效,但向打印机发送打印任务将失败。请确保端口 990 未被阻止。', }, + external_storage: { + title: '将发送的文件存储在外部存储中(安装步骤 4)', + pass: '打印机报告此选项已开启 — 发送的文件将存储在 SD 卡上,归档将包含缩略图和切片机元数据。', + fail: '打印机报告此选项已关闭。请启用"将发送的文件存储在外部存储中" — 在较新固件 (P2S 01.02 / Bambu Studio 2.6+) 中,开关位于打印机的打印设置中;在较旧版本中位于 Bambu Studio / OrcaSlicer 的设备选项卡中。如果不启用此选项,每次归档的打印都将没有缩略图也没有切片机元数据。', + skip: '未检查 — 需要有效的 MQTT 连接。在该设置仅存在于切片机中的较旧切片机上,打印机不会报告此设置,因此即使选项已关闭,此检查也会通过 — 请手动验证安装步骤 4。', + }, port_rtsps: { title: '摄像头端口(RTSPS 322)', pass: '可达 — 摄像头视频流将正常工作。', diff --git a/frontend/src/i18n/locales/zh-TW.ts b/frontend/src/i18n/locales/zh-TW.ts index 28f48d614..fea0eb5c1 100644 --- a/frontend/src/i18n/locales/zh-TW.ts +++ b/frontend/src/i18n/locales/zh-TW.ts @@ -5650,6 +5650,12 @@ export default { pass: '可達 — 傳送列印檔案將正常運作。', warn: '連接埠 990 無法連線。監控可能仍然有效,但向印表機傳送列印工作將失敗。請確保連接埠 990 未被封鎖。', }, + external_storage: { + title: '將傳送的檔案儲存在外部儲存中(安裝步驟 4)', + pass: '印表機回報此選項已開啟 — 傳送的檔案將儲存在 SD 卡上,封存將包含縮圖和切片機中繼資料。', + fail: '印表機回報此選項已關閉。請啟用「將傳送的檔案儲存在外部儲存中」 — 在較新韌體 (P2S 01.02 / Bambu Studio 2.6+) 中,開關位於印表機的列印設定中;在較舊版本中位於 Bambu Studio / OrcaSlicer 的裝置分頁中。如果未啟用此選項,每次封存的列印都將沒有縮圖也沒有切片機中繼資料。', + skip: '未檢查 — 需要有效的 MQTT 連線。在該設定僅存在於切片機中的較舊切片機上,印表機不會回報此設定,因此即使選項已關閉,此檢查也會通過 — 請手動驗證安裝步驟 4。', + }, port_rtsps: { title: '攝影機連接埠(RTSPS 322)', pass: '可達 — 攝影機串流將正常運作。', diff --git a/static/assets/index-DGbY3_Tm.js b/static/assets/index-DInAXQkE.js similarity index 77% rename from static/assets/index-DGbY3_Tm.js rename to static/assets/index-DInAXQkE.js index b611d5f2c..3f7a5c2a7 100644 --- a/static/assets/index-DGbY3_Tm.js +++ b/static/assets/index-DInAXQkE.js @@ -6,42 +6,42 @@ function hme(t,e){for(var a=0;a")&&(Bt=Bt.replace("",h.displayName)),Bt}while(1<=M&&0<=W);break}}}finally{q=!1,Error.prepareStackTrace=_}return(_=h?h.displayName||h.name:"")?B(_):""}function ee(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 Z(h.type,!1);case 11:return Z(h.type.render,!1);case 1:return Z(h.type,!0);case 31:return B("Activity");default:return""}}function re(h){try{var w="",_=null;do w+=ee(h,_),_=h,h=h.return;while(h);return w}catch(M){return` Error generating stack: `+M.message+` `+M.stack}}var se=Object.prototype.hasOwnProperty,fe=t.unstable_scheduleCallback,ue=t.unstable_cancelCallback,he=t.unstable_shouldYield,G=t.unstable_requestPaint,L=t.unstable_now,ae=t.unstable_getCurrentPriorityLevel,ge=t.unstable_ImmediatePriority,be=t.unstable_UserBlockingPriority,ve=t.unstable_NormalPriority,Fe=t.unstable_LowPriority,Me=t.unstable_IdlePriority,Te=t.log,Ue=t.unstable_setDisableYieldValue,Ne=null,Ie=null;function Re(h){if(typeof Te=="function"&&Ue(h),Ie&&typeof Ie.setStrictMode=="function")try{Ie.setStrictMode(Ne,h)}catch{}}var He=Math.clz32?Math.clz32:Oe,ze=Math.log,rt=Math.LN2;function Oe(h){return h>>>=0,h===0?32:31-(ze(h)/rt|0)|0}var tt=256,Ee=262144,Je=4194304;function Ve(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 je(h,w,_){var M=h.pendingLanes;if(M===0)return 0;var W=0,te=h.suspendedLanes,ke=h.pingedLanes;h=h.warmLanes;var qe=M&134217727;return qe!==0?(M=qe&~te,M!==0?W=Ve(M):(ke&=qe,ke!==0?W=Ve(ke):_||(_=qe&~h,_!==0&&(W=Ve(_))))):(qe=M&~te,qe!==0?W=Ve(qe):ke!==0?W=Ve(ke):_||(_=M&~h,_!==0&&(W=Ve(_)))),W===0?0:w!==0&&w!==W&&(w&te)===0&&(te=W&-W,_=w&-w,te>=_||te===32&&(_&4194048)!==0)?w:W}function Be(h,w){return(h.pendingLanes&~(h.suspendedLanes&~h.pingedLanes)&w)===0}function Ze(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 Ge(){var h=Je;return Je<<=1,(Je&62914560)===0&&(Je=4194304),h}function De(h){for(var w=[],_=0;31>_;_++)w.push(h);return w}function nt(h,w){h.pendingLanes|=w,w!==268435456&&(h.suspendedLanes=0,h.pingedLanes=0,h.warmLanes=0)}function Qe(h,w,_,M,W,te){var ke=h.pendingLanes;h.pendingLanes=_,h.suspendedLanes=0,h.pingedLanes=0,h.warmLanes=0,h.expiredLanes&=_,h.entangledLanes&=_,h.errorRecoveryDisabledLanes&=_,h.shellSuspendCounter=0;var qe=h.entanglements,mt=h.expirationTimes,Et=h.hiddenUpdates;for(_=ke&~_;0<_;){var Bt=31-He(_),Wt=1<"u")return null;try{return h.activeElement||h.body}catch{return h.body}}var sr=/[\n"\\]/g;function Ye(h){return h.replace(sr,function(w){return"\\"+w.charCodeAt(0).toString(16)+" "})}function ta(h,w,_,M,W,te,ke,qe){h.name="",ke!=null&&typeof ke!="function"&&typeof ke!="symbol"&&typeof ke!="boolean"?h.type=ke:h.removeAttribute("type"),w!=null?ke==="number"?(w===0&&h.value===""||h.value!=w)&&(h.value=""+sa(w)):h.value!==""+sa(w)&&(h.value=""+sa(w)):ke!=="submit"&&ke!=="reset"||h.removeAttribute("value"),w!=null?Xa(h,ke,sa(w)):_!=null?Xa(h,ke,sa(_)):M!=null&&h.removeAttribute("value"),W==null&&te!=null&&(h.defaultChecked=!!te),W!=null&&(h.checked=W&&typeof W!="function"&&typeof W!="symbol"),qe!=null&&typeof qe!="function"&&typeof qe!="symbol"&&typeof qe!="boolean"?h.name=""+sa(qe):h.removeAttribute("name")}function ha(h,w,_,M,W,te,ke,qe){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)){Jt(h);return}_=_!=null?""+sa(_):"",w=w!=null?""+sa(w):_,qe||w===h.value||(h.value=w),h.defaultValue=w}M=M??W,M=typeof M!="function"&&typeof M!="symbol"&&!!M,h.checked=qe?h.checked:!!M,h.defaultChecked=!!M,ke!=null&&typeof ke!="function"&&typeof ke!="symbol"&&typeof ke!="boolean"&&(h.name=ke),Jt(h)}function Xa(h,w,_){w==="number"&&Ba(h.ownerDocument)===h||h.defaultValue===""+_||(h.defaultValue=""+_)}function Tr(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(tr)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 mi=null,Du=null,wi=null;function Sf(){if(wi)return wi;var h,w=Du,_=w.length,M,W="value"in mi?mi.value:mi.textContent,te=W.length;for(h=0;h<_&&w[h]===W[h];h++);var ke=_-h;for(M=1;M<=ke&&w[_-M]===W[te-M];M++);return wi=W.slice(h,1=hi),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 Rt(h){return h=h.detail,typeof h=="object"&&"data"in h?h.data:null}var pa=!1;function Ma(h,w){switch(h){case"compositionend":return Rt(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 Va(h,w){if(pa)return h==="compositionend"||!ll&&ye(h,w)?(h=Sf(),wi=Du=mi=null,pa=!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}_=Do(_)}}function Fo(h,w){return h&&w?h===w?!0:h&&h.nodeType===3?!1:w&&w.nodeType===3?Fo(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=Ba(h.document);w instanceof h.HTMLIFrameElement;){try{var _=typeof w.contentWindow.location.href=="string"}catch{_=!1}if(_)h=w.contentWindow;else break;w=Ba(h.document)}return w}function ki(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=tr&&"documentMode"in document&&11>=document.documentMode,fi=null,xr=null,Rr=null,Zn=!1;function kp(h,w,_){var M=_.window===_?_.document:_.nodeType===9?_:_.ownerDocument;Zn||fi==null||fi!==Ba(M)||(M=fi,"selectionStart"in M&&ki(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}),Rr&&ws(Rr,M)||(Rr=M,M=x_(xr,"onSelect"),0>=ke,W-=ke,Dd=1<<32-He(w)+W|_<rr?(Cr=ja,ja=null):Cr=ja.sibling;var Ir=Dt(_t,ja,Mt[rr],$t);if(Ir===null){ja===null&&(ja=Cr);break}h&&ja&&Ir.alternate===null&&w(_t,ja),gt=te(Ir,gt,rr),zr===null?Ra=Ir:zr.sibling=Ir,zr=Ir,ja=Cr}if(rr===Mt.length)return _(_t,ja),jr&&Uu(_t,rr),Ra;if(ja===null){for(;rrrr?(Cr=ja,ja=null):Cr=ja.sibling;var Gp=Dt(_t,ja,Ir.value,$t);if(Gp===null){ja===null&&(ja=Cr);break}h&&ja&&Gp.alternate===null&&w(_t,ja),gt=te(Gp,gt,rr),zr===null?Ra=Gp:zr.sibling=Gp,zr=Gp,ja=Cr}if(Ir.done)return _(_t,ja),jr&&Uu(_t,rr),Ra;if(ja===null){for(;!Ir.done;rr++,Ir=Mt.next())Ir=Wt(_t,Ir.value,$t),Ir!==null&&(gt=te(Ir,gt,rr),zr===null?Ra=Ir:zr.sibling=Ir,zr=Ir);return jr&&Uu(_t,rr),Ra}for(ja=M(ja);!Ir.done;rr++,Ir=Mt.next())Ir=zt(ja,_t,rr,Ir.value,$t),Ir!==null&&(h&&Ir.alternate!==null&&ja.delete(Ir.key===null?rr:Ir.key),gt=te(Ir,gt,rr),zr===null?Ra=Ir:zr.sibling=Ir,zr=Ir);return h&&ja.forEach(function(pme){return w(_t,pme)}),jr&&Uu(_t,rr),Ra}function sn(_t,gt,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 Ra=Mt.key;gt!==null;){if(gt.key===Ra){if(Ra=Mt.type,Ra===v){if(gt.tag===7){_(_t,gt.sibling),$t=W(gt,Mt.props.children),$t.return=_t,_t=$t;break e}}else if(gt.elementType===Ra||typeof Ra=="object"&&Ra!==null&&Ra.$$typeof===D&&Ef(Ra)===gt.type){_(_t,gt.sibling),$t=W(gt,Mt.props),Ev($t,Mt),$t.return=_t,_t=$t;break e}_(_t,gt);break}else w(_t,gt);gt=gt.sibling}Mt.type===v?($t=Nf(Mt.props.children,_t.mode,$t,Mt.key),$t.return=_t,_t=$t):($t=Lk(Mt.type,Mt.key,Mt.props,null,_t.mode,$t),Ev($t,Mt),$t.return=_t,_t=$t)}return ke(_t);case g:e:{for(Ra=Mt.key;gt!==null;){if(gt.key===Ra)if(gt.tag===4&>.stateNode.containerInfo===Mt.containerInfo&>.stateNode.implementation===Mt.implementation){_(_t,gt.sibling),$t=W(gt,Mt.children||[]),$t.return=_t,_t=$t;break e}else{_(_t,gt);break}else w(_t,gt);gt=gt.sibling}$t=Pj(Mt,_t.mode,$t),$t.return=_t,_t=$t}return ke(_t);case D:return Mt=Ef(Mt),sn(_t,gt,Mt,$t)}if(K(Mt))return Ca(_t,gt,Mt,$t);if(I(Mt)){if(Ra=I(Mt),typeof Ra!="function")throw Error(n(150));return Mt=Ra.call(Mt),Ha(_t,gt,Mt,$t)}if(typeof Mt.then=="function")return sn(_t,gt,Hk(Mt),$t);if(Mt.$$typeof===k)return sn(_t,gt,Ik(_t,Mt),$t);qk(_t,Mt)}return typeof Mt=="string"&&Mt!==""||typeof Mt=="number"||typeof Mt=="bigint"?(Mt=""+Mt,gt!==null&>.tag===6?(_(_t,gt.sibling),$t=W(gt,Mt),$t.return=_t,_t=$t):(_(_t,gt),$t=_j(Mt,_t.mode,$t),$t.return=_t,_t=$t),ke(_t)):_(_t,gt)}return function(_t,gt,Mt,$t){try{Mv=0;var Ra=sn(_t,gt,Mt,$t);return zb=null,Ra}catch(ja){if(ja===Rb||ja===Bk)throw ja;var zr=cl(29,ja,null,_t.mode);return zr.lanes=$t,zr.return=_t,zr}}}var Ff=K5(!0),Y5=K5(!1),Tp=!1;function zj(h){h.updateQueue={baseState:h.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Ij(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,(qr&2)!==0){var W=M.pending;return W===null?w.next=w:(w.next=W.next,W.next=w),M.pending=w,w=Fk(h),E5(h,null,_),w}return Dk(h,M,w,_),Fk(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=_,qt(h,_)}}function Oj(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 ke={lane:_.lane,tag:_.tag,payload:_.payload,callback:null,next:null};te===null?W=te=ke:te=te.next=ke,_=_.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 Bj=!1;function Fv(){if(Bj){var h=Lb;if(h!==null)throw h}}function Lv(h,w,_,M){Bj=!1;var W=h.updateQueue;Tp=!1;var te=W.firstBaseUpdate,ke=W.lastBaseUpdate,qe=W.shared.pending;if(qe!==null){W.shared.pending=null;var mt=qe,Et=mt.next;mt.next=null,ke===null?te=Et:ke.next=Et,ke=mt;var Bt=h.alternate;Bt!==null&&(Bt=Bt.updateQueue,qe=Bt.lastBaseUpdate,qe!==ke&&(qe===null?Bt.firstBaseUpdate=Et:qe.next=Et,Bt.lastBaseUpdate=mt))}if(te!==null){var Wt=W.baseState;ke=0,Bt=Et=mt=null,qe=te;do{var Dt=qe.lane&-536870913,zt=Dt!==qe.lane;if(zt?(Pr&Dt)===Dt:(M&Dt)===Dt){Dt!==0&&Dt===Fb&&(Bj=!0),Bt!==null&&(Bt=Bt.next={lane:0,tag:qe.tag,payload:qe.payload,callback:null,next:null});e:{var Ca=h,Ha=qe;Dt=w;var sn=_;switch(Ha.tag){case 1:if(Ca=Ha.payload,typeof Ca=="function"){Wt=Ca.call(sn,Wt,Dt);break e}Wt=Ca;break e;case 3:Ca.flags=Ca.flags&-65537|128;case 0:if(Ca=Ha.payload,Dt=typeof Ca=="function"?Ca.call(sn,Wt,Dt):Ca,Dt==null)break e;Wt=m({},Wt,Dt);break e;case 2:Tp=!0}}Dt=qe.callback,Dt!==null&&(h.flags|=64,zt&&(h.flags|=8192),zt=W.callbacks,zt===null?W.callbacks=[Dt]:zt.push(Dt))}else zt={lane:Dt,tag:qe.tag,payload:qe.payload,callback:qe.callback,next:null},Bt===null?(Et=Bt=zt,mt=Wt):Bt=Bt.next=zt,ke|=Dt;if(qe=qe.next,qe===null){if(qe=W.shared.pending,qe===null)break;zt=qe,qe=zt.next,zt.next=null,W.lastBaseUpdate=zt,W.shared.pending=null}}while(!0);Bt===null&&(mt=Wt),W.baseState=mt,W.firstBaseUpdate=Et,W.lastBaseUpdate=Bt,te===null&&(W.shared.lanes=0),Lp|=ke,h.lanes=ke,h.memoizedState=Wt}}function Q5(h,w){if(typeof h!="function")throw Error(n(191,h));h.call(w)}function X5(h,w){var _=h.callbacks;if(_!==null)for(h.callbacks=null,h=0;h<_.length;h++)Q5(_[h],w)}var Ib=Y(null),Vk=Y(0);function Z5(h,w){h=Zu,me(Vk,h),me(Ib,w),Zu=h|w.baseLanes}function Uj(){me(Vk,Zu),me(Ib,Ib.current)}function Hj(){Zu=Vk.current,ne(Ib),ne(Vk)}var dl=Y(null),Zl=null;function Mp(h){var w=h.alternate;me(gi,gi.current&1),me(dl,h),Zl===null&&(w===null||Ib.current!==null||w.memoizedState!==null)&&(Zl=h)}function qj(h){me(gi,gi.current),me(dl,h),Zl===null&&(Zl=h)}function J5(h){h.tag===22?(me(gi,gi.current),me(dl,h),Zl===null&&(Zl=h)):Ep()}function Ep(){me(gi,gi.current),me(dl,dl.current)}function ul(h){ne(dl),Zl===h&&(Zl=null),ne(gi)}var gi=Y(0);function Gk(h){for(var w=h;w!==null;){if(w.tag===13){var _=w.memoizedState;if(_!==null&&(_=_.dehydrated,_===null||YM(_)||QM(_)))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 Vu=0,ar=null,rn=null,Pi=null,$k=!1,Ob=!1,Lf=!1,Wk=0,Rv=0,Bb=null,rue=0;function Jn(){throw Error(n(321))}function Vj(h,w){if(w===null)return!1;for(var _=0;_te?te:8;var ke=J.T,qe={};J.T=qe,iM(h,!1,w,_);try{var mt=W(),Et=J.S;if(Et!==null&&Et(qe,mt),mt!==null&&typeof mt=="object"&&typeof mt.then=="function"){var Bt=aue(mt,M);Iv(h,w,Bt,hl(h))}else Iv(h,w,M,hl(h))}catch(Wt){Iv(h,w,{then:function(){},status:"rejected",reason:Wt},hl())}finally{X.p=te,ke!==null&&qe.types!==null&&(ke.types=qe.types),J.T=ke}}function lue(){}function rM(h,w,_,M){if(h.tag!==5)throw Error(n(476));var W=AU(h).queue;TU(h,W,w,ce,_===null?lue:function(){return jU(h),_(M)})}function AU(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 jU(h){var w=AU(h);w.next===null&&(w=h.alternate.memoizedState),Iv(h,w.next.queue,{},hl())}function nM(){return ks(t0)}function MU(){return bi().memoizedState}function EU(){return bi().memoizedState}function cue(h){for(var w=h.return;w!==null;){switch(w.tag){case 24:case 3:var _=hl();h=Ap(_);var M=jp(w,h,_);M!==null&&(Oo(M,w,_),Dv(M,w,_)),w={cache:Dj()},h.payload=w;return}w=w.return}}function due(h,w,_){var M=hl();_={lane:M,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null},Jk(h)?FU(w,_):(_=Sj(h,w,_,M),_!==null&&(Oo(_,h,M),LU(_,w,M)))}function DU(h,w,_){var M=hl();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(Jk(h))FU(w,W);else{var te=h.alternate;if(h.lanes===0&&(te===null||te.lanes===0)&&(te=w.lastRenderedReducer,te!==null))try{var ke=w.lastRenderedState,qe=te(ke,_);if(W.hasEagerState=!0,W.eagerState=qe,Dn(qe,ke))return Dk(h,w,W,0),bn===null&&Ek(),!1}catch{}if(_=Sj(h,w,W,M),_!==null)return Oo(_,h,M),LU(_,w,M),!0}return!1}function iM(h,w,_,M){if(M={lane:2,revertLane:zM(),gesture:null,action:M,hasEagerState:!1,eagerState:null,next:null},Jk(h)){if(w)throw Error(n(479))}else w=Sj(h,_,M,2),w!==null&&Oo(w,h,2)}function Jk(h){var w=h.alternate;return h===ar||w!==null&&w===ar}function FU(h,w){Ob=$k=!0;var _=h.pending;_===null?w.next=w:(w.next=_.next,_.next=w),h.pending=w}function LU(h,w,_){if((_&4194048)!==0){var M=w.lanes;M&=h.pendingLanes,_|=M,w.lanes=_,qt(h,_)}}var Ov={readContext:ks,use:Yk,useCallback:Jn,useContext:Jn,useEffect:Jn,useImperativeHandle:Jn,useLayoutEffect:Jn,useInsertionEffect:Jn,useMemo:Jn,useReducer:Jn,useRef:Jn,useState:Jn,useDebugValue:Jn,useDeferredValue:Jn,useTransition:Jn,useSyncExternalStore:Jn,useId:Jn,useHostTransitionStatus:Jn,useFormState:Jn,useActionState:Jn,useOptimistic:Jn,useMemoCache:Jn,useCacheRefresh:Jn};Ov.useEffectEvent=Jn;var RU={readContext:ks,use:Yk,useCallback:function(h,w){return mo().memoizedState=[h,w===void 0?null:w],h},useContext:ks,useEffect:yU,useImperativeHandle:function(h,w,_){_=_!=null?_.concat([h]):null,Xk(4194308,4,kU.bind(null,w,h),_)},useLayoutEffect:function(h,w){return Xk(4194308,4,h,w)},useInsertionEffect:function(h,w){Xk(4,2,h,w)},useMemo:function(h,w){var _=mo();w=w===void 0?null:w;var M=h();if(Lf){Re(!0);try{h()}finally{Re(!1)}}return _.memoizedState=[M,w],M},useReducer:function(h,w,_){var M=mo();if(_!==void 0){var W=_(w);if(Lf){Re(!0);try{_(w)}finally{Re(!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=due.bind(null,ar,h),[M.memoizedState,h]},useRef:function(h){var w=mo();return h={current:h},w.memoizedState=h},useState:function(h){h=Zj(h);var w=h.queue,_=DU.bind(null,ar,w);return w.dispatch=_,[h.memoizedState,_]},useDebugValue:tM,useDeferredValue:function(h,w){var _=mo();return aM(_,h,w)},useTransition:function(){var h=Zj(!1);return h=TU.bind(null,ar,h.queue,!0,!1),mo().memoizedState=h,[!1,h]},useSyncExternalStore:function(h,w,_){var M=ar,W=mo();if(jr){if(_===void 0)throw Error(n(407));_=_()}else{if(_=w(),bn===null)throw Error(n(349));(Pr&127)!==0||rU(M,w,_)}W.memoizedState=_;var te={value:_,getSnapshot:w};return W.queue=te,yU(iU.bind(null,M,te,h),[h]),M.flags|=2048,Ub(9,{destroy:void 0},nU.bind(null,M,te,_,w),null),_},useId:function(){var h=mo(),w=bn.identifierPrefix;if(jr){var _=Fd,M=Dd;_=(M&~(1<<32-He(M)-1)).toString(32)+_,w="_"+w+"R_"+_,_=Wk++,0<_&&(w+="H"+_.toString(32)),w+="_"}else _=rue++,w="_"+w+"r_"+_.toString(32)+"_";return h.memoizedState=w},useHostTransitionStatus:nM,useFormState:hU,useActionState:hU,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=iM.bind(null,ar,!0,_),_.dispatch=w,[h,w]},useMemoCache:Yj,useCacheRefresh:function(){return mo().memoizedState=cue.bind(null,ar)},useEffectEvent:function(h){var w=mo(),_={impl:h};return w.memoizedState=_,function(){if((qr&2)!==0)throw Error(n(440));return _.impl.apply(void 0,arguments)}}},sM={readContext:ks,use:Yk,useCallback:PU,useContext:ks,useEffect:eM,useImperativeHandle:_U,useInsertionEffect:wU,useLayoutEffect:SU,useMemo:CU,useReducer:Qk,useRef:xU,useState:function(){return Qk(Gu)},useDebugValue:tM,useDeferredValue:function(h,w){var _=bi();return NU(_,rn.memoizedState,h,w)},useTransition:function(){var h=Qk(Gu)[0],w=bi().memoizedState;return[typeof h=="boolean"?h:zv(h),w]},useSyncExternalStore:aU,useId:MU,useHostTransitionStatus:nM,useFormState:fU,useActionState:fU,useOptimistic:function(h,w){var _=bi();return lU(_,rn,h,w)},useMemoCache:Yj,useCacheRefresh:EU};sM.useEffectEvent=vU;var zU={readContext:ks,use:Yk,useCallback:PU,useContext:ks,useEffect:eM,useImperativeHandle:_U,useInsertionEffect:wU,useLayoutEffect:SU,useMemo:CU,useReducer:Xj,useRef:xU,useState:function(){return Xj(Gu)},useDebugValue:tM,useDeferredValue:function(h,w){var _=bi();return rn===null?aM(_,h,w):NU(_,rn.memoizedState,h,w)},useTransition:function(){var h=Xj(Gu)[0],w=bi().memoizedState;return[typeof h=="boolean"?h:zv(h),w]},useSyncExternalStore:aU,useId:MU,useHostTransitionStatus:nM,useFormState:bU,useActionState:bU,useOptimistic:function(h,w){var _=bi();return rn!==null?lU(_,rn,h,w):(_.baseState=h,[h,_.queue.dispatch])},useMemoCache:Yj,useCacheRefresh:EU};zU.useEffectEvent=vU;function oM(h,w,_,M){w=h.memoizedState,_=_(M,w),_=_==null?w:m({},w,_),h.memoizedState=_,h.lanes===0&&(h.updateQueue.baseState=_)}var lM={enqueueSetState:function(h,w,_){h=h._reactInternals;var M=hl(),W=Ap(M);W.payload=w,_!=null&&(W.callback=_),w=jp(h,W,M),w!==null&&(Oo(w,h,M),Dv(w,h,M))},enqueueReplaceState:function(h,w,_){h=h._reactInternals;var M=hl(),W=Ap(M);W.tag=1,W.payload=w,_!=null&&(W.callback=_),w=jp(h,W,M),w!==null&&(Oo(w,h,M),Dv(w,h,M))},enqueueForceUpdate:function(h,w){h=h._reactInternals;var _=hl(),M=Ap(_);M.tag=2,w!=null&&(M.callback=w),w=jp(h,M,_),w!==null&&(Oo(w,h,_),Dv(w,h,_))}};function IU(h,w,_,M,W,te,ke){return h=h.stateNode,typeof h.shouldComponentUpdate=="function"?h.shouldComponentUpdate(M,te,ke):w.prototype&&w.prototype.isPureReactComponent?!ws(_,M)||!ws(W,te):!0}function OU(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&&lM.enqueueReplaceState(w,w.state,null)}function Rf(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 BU(h){Mk(h)}function UU(h){console.error(h)}function HU(h){Mk(h)}function e_(h,w){try{var _=h.onUncaughtError;_(w.value,{componentStack:w.stack})}catch(M){setTimeout(function(){throw M})}}function qU(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 cM(h,w,_){return _=Ap(_),_.tag=3,_.payload={element:null},_.callback=function(){e_(h,w)},_}function VU(h){return h=Ap(h),h.tag=3,h}function GU(h,w,_,M){var W=_.type.getDerivedStateFromError;if(typeof W=="function"){var te=M.value;h.payload=function(){return W(te)},h.callback=function(){qU(w,_,M)}}var ke=_.stateNode;ke!==null&&typeof ke.componentDidCatch=="function"&&(h.callback=function(){qU(w,_,M),typeof W!="function"&&(Rp===null?Rp=new Set([this]):Rp.add(this));var qe=M.stack;this.componentDidCatch(M.value,{componentStack:qe!==null?qe:""})})}function uue(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),_=dl.current,_!==null){switch(_.tag){case 31:case 13:return Zl===null?m_():_.alternate===null&&ei===0&&(ei=3),_.flags&=-257,_.flags|=65536,_.lanes=W,M===Uk?_.flags|=16384:(w=_.updateQueue,w===null?_.updateQueue=new Set([M]):w.add(M),FM(h,M,W)),!1;case 22:return _.flags|=65536,M===Uk?_.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)),FM(h,M,W)),!1}throw Error(n(435,_.tag))}return FM(h,M,W),m_(),!1}if(jr)return w=dl.current,w!==null?((w.flags&65536)===0&&(w.flags|=256),w.flags|=65536,w.lanes=W,M!==Tj&&(h=Error(n(422),{cause:M}),Tv(Kl(h,_)))):(M!==Tj&&(w=Error(n(423),{cause:M}),Tv(Kl(w,_))),h=h.current.alternate,h.flags|=65536,W&=-W,h.lanes|=W,M=Kl(M,_),W=cM(h.stateNode,M,W),Oj(h,W),ei!==4&&(ei=2)),!1;var te=Error(n(520),{cause:M});if(te=Kl(te,_),Wv===null?Wv=[te]:Wv.push(te),ei!==4&&(ei=2),w===null)return!0;M=Kl(M,_),_=w;do{switch(_.tag){case 3:return _.flags|=65536,h=W&-W,_.lanes|=h,h=cM(_.stateNode,M,h),Oj(_,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=VU(W),GU(W,h,_,M),Oj(_,W),!1}_=_.return}while(_!==null);return!1}var dM=Error(n(461)),Ci=!1;function _s(h,w,_,M){w.child=h===null?Y5(w,null,_,M):Ff(w,h.child,_,M)}function $U(h,w,_,M,W){_=_.render;var te=w.ref;if("ref"in M){var ke={};for(var qe in M)qe!=="ref"&&(ke[qe]=M[qe])}else ke=M;return jf(w),M=Gj(h,w,_,ke,te,W),qe=$j(),h!==null&&!Ci?(Wj(h,w,W),$u(h,w,W)):(jr&&qe&&Cj(w),w.flags|=1,_s(h,w,M,W),w.child)}function WU(h,w,_,M,W){if(h===null){var te=_.type;return typeof te=="function"&&!kj(te)&&te.defaultProps===void 0&&_.compare===null?(w.tag=15,w.type=te,KU(h,w,te,M,W)):(h=Lk(_.type,null,M,w,w.mode,W),h.ref=w.ref,h.return=w,w.child=h)}if(te=h.child,!xM(h,W)){var ke=te.memoizedProps;if(_=_.compare,_=_!==null?_:ws,_(ke,M)&&h.ref===w.ref)return $u(h,w,W)}return w.flags|=1,h=Bu(te,M),h.ref=w.ref,h.return=w,w.child=h}function KU(h,w,_,M,W){if(h!==null){var te=h.memoizedProps;if(ws(te,M)&&h.ref===w.ref)if(Ci=!1,w.pendingProps=M=te,xM(h,W))(h.flags&131072)!==0&&(Ci=!0);else return w.lanes=h.lanes,$u(h,w,W)}return uM(h,w,_,M,W)}function YU(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 QU(h,w,te,_,M)}if((_&536870912)!==0)w.memoizedState={baseLanes:0,cachePool:null},h!==null&&Ok(w,te!==null?te.cachePool:null),te!==null?Z5(w,te):Uj(),J5(w);else return M=w.lanes=536870912,QU(h,w,te!==null?te.baseLanes|_:_,_,M)}else te!==null?(Ok(w,te.cachePool),Z5(w,te),Ep(),w.memoizedState=null):(h!==null&&Ok(w,null),Uj(),Ep());return _s(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 QU(h,w,_,M,W){var te=Lj();return te=te===null?null:{parent:_i._currentValue,pool:te},w.memoizedState={baseLanes:_,cachePool:te},h!==null&&Ok(w,null),Uj(),J5(w),h!==null&&Db(h,w,M,!0),w.childLanes=W,null}function t_(h,w){return w=r_({mode:w.mode,children:w.children},h.mode),w.ref=h.ref,h.child=w,w.return=h,w}function XU(h,w,_){return Ff(w,h.child,null,_),h=t_(w,w.pendingProps),h.flags|=2,ul(w),w.memoizedState=null,h}function mue(h,w,_){var M=w.pendingProps,W=(w.flags&128)!==0;if(w.flags&=-129,h===null){if(jr){if(M.mode==="hidden")return h=t_(w,M),w.lanes=536870912,Bv(null,h);if(qj(w),(h=Cn)?(h=cq(h,Xl),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},_=F5(h),_.return=w,w.child=_,Ss=w,Cn=null)):h=null,h===null)throw Cp(w);return w.lanes=536870912,null}return t_(w,M)}var te=h.memoizedState;if(te!==null){var ke=te.dehydrated;if(qj(w),W)if(w.flags&256)w.flags&=-257,w=XU(h,w,_);else if(w.memoizedState!==null)w.child=h.child,w.flags|=128,w=null;else throw Error(n(558));else if(Ci||Db(h,w,_,!1),W=(_&h.childLanes)!==0,Ci||W){if(M=bn,M!==null&&(ke=ht(M,_),ke!==0&&ke!==te.retryLane))throw te.retryLane=ke,Cf(h,ke),Oo(M,h,ke),dM;m_(),w=XU(h,w,_)}else h=te.treeContext,Cn=Jl(ke.nextSibling),Ss=w,jr=!0,Pp=null,Xl=!1,h!==null&&z5(w,h),w=t_(w,M),w.flags|=4096;return w}return h=Bu(h.child,{mode:M.mode,children:M.children}),h.ref=w.ref,w.child=h,h.return=w,h}function a_(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 uM(h,w,_,M,W){return jf(w),_=Gj(h,w,_,M,void 0,W),M=$j(),h!==null&&!Ci?(Wj(h,w,W),$u(h,w,W)):(jr&&M&&Cj(w),w.flags|=1,_s(h,w,_,W),w.child)}function ZU(h,w,_,M,W,te){return jf(w),w.updateQueue=null,_=tU(w,M,_,W),eU(h),M=$j(),h!==null&&!Ci?(Wj(h,w,te),$u(h,w,te)):(jr&&M&&Cj(w),w.flags|=1,_s(h,w,_,te),w.child)}function JU(h,w,_,M,W){if(jf(w),w.stateNode===null){var te=Ab,ke=_.contextType;typeof ke=="object"&&ke!==null&&(te=ks(ke)),te=new _(M,te),w.memoizedState=te.state!==null&&te.state!==void 0?te.state:null,te.updater=lM,w.stateNode=te,te._reactInternals=w,te=w.stateNode,te.props=M,te.state=w.memoizedState,te.refs={},zj(w),ke=_.contextType,te.context=typeof ke=="object"&&ke!==null?ks(ke):Ab,te.state=w.memoizedState,ke=_.getDerivedStateFromProps,typeof ke=="function"&&(oM(w,_,ke,M),te.state=w.memoizedState),typeof _.getDerivedStateFromProps=="function"||typeof te.getSnapshotBeforeUpdate=="function"||typeof te.UNSAFE_componentWillMount!="function"&&typeof te.componentWillMount!="function"||(ke=te.state,typeof te.componentWillMount=="function"&&te.componentWillMount(),typeof te.UNSAFE_componentWillMount=="function"&&te.UNSAFE_componentWillMount(),ke!==te.state&&lM.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 qe=w.memoizedProps,mt=Rf(_,qe);te.props=mt;var Et=te.context,Bt=_.contextType;ke=Ab,typeof Bt=="object"&&Bt!==null&&(ke=ks(Bt));var Wt=_.getDerivedStateFromProps;Bt=typeof Wt=="function"||typeof te.getSnapshotBeforeUpdate=="function",qe=w.pendingProps!==qe,Bt||typeof te.UNSAFE_componentWillReceiveProps!="function"&&typeof te.componentWillReceiveProps!="function"||(qe||Et!==ke)&&OU(w,te,M,ke),Tp=!1;var Dt=w.memoizedState;te.state=Dt,Lv(w,M,te,W),Fv(),Et=w.memoizedState,qe||Dt!==Et||Tp?(typeof Wt=="function"&&(oM(w,_,Wt,M),Et=w.memoizedState),(mt=Tp||IU(w,_,mt,M,Dt,Et,ke))?(Bt||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=ke,M=mt):(typeof te.componentDidMount=="function"&&(w.flags|=4194308),M=!1)}else{te=w.stateNode,Ij(h,w),ke=w.memoizedProps,Bt=Rf(_,ke),te.props=Bt,Wt=w.pendingProps,Dt=te.context,Et=_.contextType,mt=Ab,typeof Et=="object"&&Et!==null&&(mt=ks(Et)),qe=_.getDerivedStateFromProps,(Et=typeof qe=="function"||typeof te.getSnapshotBeforeUpdate=="function")||typeof te.UNSAFE_componentWillReceiveProps!="function"&&typeof te.componentWillReceiveProps!="function"||(ke!==Wt||Dt!==mt)&&OU(w,te,M,mt),Tp=!1,Dt=w.memoizedState,te.state=Dt,Lv(w,M,te,W),Fv();var zt=w.memoizedState;ke!==Wt||Dt!==zt||Tp||h!==null&&h.dependencies!==null&&zk(h.dependencies)?(typeof qe=="function"&&(oM(w,_,qe,M),zt=w.memoizedState),(Bt=Tp||IU(w,_,Bt,M,Dt,zt,mt)||h!==null&&h.dependencies!==null&&zk(h.dependencies))?(Et||typeof te.UNSAFE_componentWillUpdate!="function"&&typeof te.componentWillUpdate!="function"||(typeof te.componentWillUpdate=="function"&&te.componentWillUpdate(M,zt,mt),typeof te.UNSAFE_componentWillUpdate=="function"&&te.UNSAFE_componentWillUpdate(M,zt,mt)),typeof te.componentDidUpdate=="function"&&(w.flags|=4),typeof te.getSnapshotBeforeUpdate=="function"&&(w.flags|=1024)):(typeof te.componentDidUpdate!="function"||ke===h.memoizedProps&&Dt===h.memoizedState||(w.flags|=4),typeof te.getSnapshotBeforeUpdate!="function"||ke===h.memoizedProps&&Dt===h.memoizedState||(w.flags|=1024),w.memoizedProps=M,w.memoizedState=zt),te.props=M,te.state=zt,te.context=mt,M=Bt):(typeof te.componentDidUpdate!="function"||ke===h.memoizedProps&&Dt===h.memoizedState||(w.flags|=4),typeof te.getSnapshotBeforeUpdate!="function"||ke===h.memoizedProps&&Dt===h.memoizedState||(w.flags|=1024),M=!1)}return te=M,a_(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=Ff(w,h.child,null,W),w.child=Ff(w,null,_,W)):_s(h,w,_,W),w.memoizedState=te.state,h=w.child):h=$u(h,w,W),h}function eH(h,w,_,M){return Tf(),w.flags|=256,_s(h,w,_,M),w.child}var mM={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function pM(h){return{baseLanes:h,cachePool:q5()}}function hM(h,w,_){return h=h!==null?h.childLanes&~_:0,w&&(h|=pl),h}function tH(h,w,_){var M=w.pendingProps,W=!1,te=(w.flags&128)!==0,ke;if((ke=te)||(ke=h!==null&&h.memoizedState===null?!1:(gi.current&2)!==0),ke&&(W=!0,w.flags&=-129),ke=(w.flags&32)!==0,w.flags&=-33,h===null){if(jr){if(W?Mp(w):Ep(),(h=Cn)?(h=cq(h,Xl),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},_=F5(h),_.return=w,w.child=_,Ss=w,Cn=null)):h=null,h===null)throw Cp(w);return QM(h)?w.lanes=32:w.lanes=536870912,null}var qe=M.children;return M=M.fallback,W?(Ep(),W=w.mode,qe=r_({mode:"hidden",children:qe},W),M=Nf(M,W,_,null),qe.return=w,M.return=w,qe.sibling=M,w.child=qe,M=w.child,M.memoizedState=pM(_),M.childLanes=hM(h,ke,_),w.memoizedState=mM,Bv(null,M)):(Mp(w),fM(w,qe))}var mt=h.memoizedState;if(mt!==null&&(qe=mt.dehydrated,qe!==null)){if(te)w.flags&256?(Mp(w),w.flags&=-257,w=gM(h,w,_)):w.memoizedState!==null?(Ep(),w.child=h.child,w.flags|=128,w=null):(Ep(),qe=M.fallback,W=w.mode,M=r_({mode:"visible",children:M.children},W),qe=Nf(qe,W,_,null),qe.flags|=2,M.return=w,qe.return=w,M.sibling=qe,w.child=M,Ff(w,h.child,null,_),M=w.child,M.memoizedState=pM(_),M.childLanes=hM(h,ke,_),w.memoizedState=mM,w=Bv(null,M));else if(Mp(w),QM(qe)){if(ke=qe.nextSibling&&qe.nextSibling.dataset,ke)var Et=ke.dgst;ke=Et,M=Error(n(419)),M.stack="",M.digest=ke,Tv({value:M,source:null,stack:null}),w=gM(h,w,_)}else if(Ci||Db(h,w,_,!1),ke=(_&h.childLanes)!==0,Ci||ke){if(ke=bn,ke!==null&&(M=ht(ke,_),M!==0&&M!==mt.retryLane))throw mt.retryLane=M,Cf(h,M),Oo(ke,h,M),dM;YM(qe)||m_(),w=gM(h,w,_)}else YM(qe)?(w.flags|=192,w.child=h.child,w=null):(h=mt.treeContext,Cn=Jl(qe.nextSibling),Ss=w,jr=!0,Pp=null,Xl=!1,h!==null&&z5(w,h),w=fM(w,M.children),w.flags|=4096);return w}return W?(Ep(),qe=M.fallback,W=w.mode,mt=h.child,Et=mt.sibling,M=Bu(mt,{mode:"hidden",children:M.children}),M.subtreeFlags=mt.subtreeFlags&65011712,Et!==null?qe=Bu(Et,qe):(qe=Nf(qe,W,_,null),qe.flags|=2),qe.return=w,M.return=w,M.sibling=qe,w.child=M,Bv(null,M),M=w.child,qe=h.child.memoizedState,qe===null?qe=pM(_):(W=qe.cachePool,W!==null?(mt=_i._currentValue,W=W.parent!==mt?{parent:mt,pool:mt}:W):W=q5(),qe={baseLanes:qe.baseLanes|_,cachePool:W}),M.memoizedState=qe,M.childLanes=hM(h,ke,_),w.memoizedState=mM,Bv(h.child,M)):(Mp(w),_=h.child,h=_.sibling,_=Bu(_,{mode:"visible",children:M.children}),_.return=w,_.sibling=null,h!==null&&(ke=w.deletions,ke===null?(w.deletions=[h],w.flags|=16):ke.push(h)),w.child=_,w.memoizedState=null,_)}function fM(h,w){return w=r_({mode:"visible",children:w},h.mode),w.return=h,h.child=w}function r_(h,w){return h=cl(22,h,null,w),h.lanes=0,h}function gM(h,w,_){return Ff(w,h.child,null,_),h=fM(w,w.pendingProps.children),h.flags|=2,w.memoizedState=null,h}function aH(h,w,_){h.lanes|=w;var M=h.alternate;M!==null&&(M.lanes|=w),Mj(h.return,w,_)}function bM(h,w,_,M,W,te){var ke=h.memoizedState;ke===null?h.memoizedState={isBackwards:w,rendering:null,renderingStartTime:0,last:M,tail:_,tailMode:W,treeForkCount:te}:(ke.isBackwards=w,ke.rendering=null,ke.renderingStartTime=0,ke.last=M,ke.tail=_,ke.tailMode=W,ke.treeForkCount=te)}function rH(h,w,_){var M=w.pendingProps,W=M.revealOrder,te=M.tail;M=M.children;var ke=gi.current,qe=(ke&2)!==0;if(qe?(ke=ke&1|2,w.flags|=128):ke&=1,me(gi,ke),_s(h,w,M,_),M=jr?Nv:0,!qe&&h!==null&&(h.flags&128)!==0)e:for(h=w.child;h!==null;){if(h.tag===13)h.memoizedState!==null&&aH(h,_,w);else if(h.tag===19)aH(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&&Gk(h)===null&&(W=_),_=_.sibling;_=W,_===null?(W=w.child,w.child=null):(W=_.sibling,_.sibling=null),bM(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&&Gk(h)===null){w.child=W;break}h=W.sibling,W.sibling=_,_=W,W=h}bM(w,!0,_,null,te,M);break;case"together":bM(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,_=Bu(h,h.pendingProps),w.child=_,_.return=w;h.sibling!==null;)h=h.sibling,_=_.sibling=Bu(h,h.pendingProps),_.return=w;_.sibling=null}return w.child}function xM(h,w){return(h.lanes&w)!==0?!0:(h=h.dependencies,!!(h!==null&&zk(h)))}function pue(h,w,_){switch(w.tag){case 3:A(w,w.stateNode.containerInfo),Np(w,_i,h.memoizedState.cache),Tf();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,qj(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?tH(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 rH(h,w,_);w.flags|=128}if(W=w.memoizedState,W!==null&&(W.rendering=null,W.tail=null,W.lastEffect=null),me(gi,gi.current),M)break;return null;case 22:return w.lanes=0,YU(h,w,_,w.pendingProps);case 24:Np(w,_i,h.memoizedState.cache)}return $u(h,w,_)}function nH(h,w,_){if(h!==null)if(h.memoizedProps!==w.pendingProps)Ci=!0;else{if(!xM(h,_)&&(w.flags&128)===0)return Ci=!1,pue(h,w,_);Ci=(h.flags&131072)!==0}else Ci=!1,jr&&(w.flags&1048576)!==0&&R5(w,Nv,w.index);switch(w.lanes=0,w.tag){case 16:e:{var M=w.pendingProps;if(h=Ef(w.elementType),w.type=h,typeof h=="function")kj(h)?(M=Rf(h,M),w.tag=1,w=JU(null,w,h,M,_)):(w.tag=0,w=uM(null,w,h,M,_));else{if(h!=null){var W=h.$$typeof;if(W===C){w.tag=11,w=$U(null,w,h,M,_);break e}else if(W===j){w.tag=14,w=WU(null,w,h,M,_);break e}}throw w=R(h)||h,Error(n(306,w,""))}}return w;case 0:return uM(h,w,w.type,w.pendingProps,_);case 1:return M=w.type,W=Rf(M,w.pendingProps),JU(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,Ij(h,w),Lv(w,M,null,_);var ke=w.memoizedState;if(M=ke.cache,Np(w,_i,M),M!==te.cache&&Ej(w,[_i],_,!0),Fv(),M=ke.element,te.isDehydrated)if(te={element:M,isDehydrated:!1,cache:ke.cache},w.updateQueue.baseState=te,w.memoizedState=te,w.flags&256){w=eH(h,w,M,_);break e}else if(M!==W){W=Kl(Error(n(424)),w),Tv(W),w=eH(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,Cn=Jl(h.firstChild),Ss=w,jr=!0,Pp=null,Xl=!0,_=Y5(w,null,M,_),w.child=_;_;)_.flags=_.flags&-3|4096,_=_.sibling;else{if(Tf(),M===W){w=$u(h,w,_);break e}_s(h,w,M,_)}w=w.child}return w;case 26:return a_(h,w),h===null?(_=fq(w.type,null,w.pendingProps,null))?w.memoizedState=_:jr||(_=w.type,h=w.pendingProps,M=y_(V.current).createElement(_),M[yt]=w,M[Ct]=h,Ps(M,_,h),et(M),w.stateNode=M):w.memoizedState=fq(w.type,h.memoizedProps,w.pendingProps,h.memoizedState),null;case 27:return U(w),h===null&&jr&&(M=w.stateNode=mq(w.type,w.pendingProps,V.current),Ss=w,Xl=!0,W=Cn,Bp(w.type)?(XM=W,Cn=Jl(M.firstChild)):Cn=W),_s(h,w,w.pendingProps.children,_),a_(h,w),h===null&&(w.flags|=4194304),w.child;case 5:return h===null&&jr&&((W=M=Cn)&&(M=que(M,w.type,w.pendingProps,Xl),M!==null?(w.stateNode=M,Ss=w,Cn=Jl(M.firstChild),Xl=!1,W=!0):W=!1),W||Cp(w)),U(w),W=w.type,te=w.pendingProps,ke=h!==null?h.memoizedProps:null,M=te.children,$M(W,te)?M=null:ke!==null&&$M(W,ke)&&(w.flags|=32),w.memoizedState!==null&&(W=Gj(h,w,nue,null,null,_),t0._currentValue=W),a_(h,w),_s(h,w,M,_),w.child;case 6:return h===null&&jr&&((h=_=Cn)&&(_=Vue(_,w.pendingProps,Xl),_!==null?(w.stateNode=_,Ss=w,Cn=null,h=!0):h=!1),h||Cp(w)),null;case 13:return tH(h,w,_);case 4:return A(w,w.stateNode.containerInfo),M=w.pendingProps,h===null?w.child=Ff(w,null,M,_):_s(h,w,M,_),w.child;case 11:return $U(h,w,w.type,w.pendingProps,_);case 7:return _s(h,w,w.pendingProps,_),w.child;case 8:return _s(h,w,w.pendingProps.children,_),w.child;case 12:return _s(h,w,w.pendingProps.children,_),w.child;case 10:return M=w.pendingProps,Np(w,w.type,M.value),_s(h,w,M.children,_),w.child;case 9:return W=w.type._context,M=w.pendingProps.children,jf(w),W=ks(W),M=M(W),w.flags|=1,_s(h,w,M,_),w.child;case 14:return WU(h,w,w.type,w.pendingProps,_);case 15:return KU(h,w,w.type,w.pendingProps,_);case 19:return rH(h,w,_);case 31:return mue(h,w,_);case 22:return YU(h,w,_,w.pendingProps);case 24:return jf(w),M=ks(_i),h===null?(W=Lj(),W===null&&(W=bn,te=Dj(),W.pooledCache=te,te.refCount++,te!==null&&(W.pooledCacheLanes|=_),W=te),w.memoizedState={parent:M,cache:W},zj(w),Np(w,_i,W)):((h.lanes&_)!==0&&(Ij(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,_i,M)):(M=te.cache,Np(w,_i,M),M!==W.cache&&Ej(w,[_i],_,!0))),_s(h,w,w.pendingProps.children,_),w.child;case 29:throw w.pendingProps}throw Error(n(156,w.tag))}function Wu(h){h.flags|=4}function yM(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(MH())h.flags|=8192;else throw Df=Uk,Rj}else h.flags&=-16777217}function iH(h,w){if(w.type!=="stylesheet"||(w.state.loading&4)!==0)h.flags&=-16777217;else if(h.flags|=16777216,!vq(w))if(MH())h.flags|=8192;else throw Df=Uk,Rj}function n_(h,w){w!==null&&(h.flags|=4),h.flags&16384&&(w=h.tag!==22?Ge():536870912,h.lanes|=w,Gb|=w)}function Uv(h,w){if(!jr)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 Nn(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 hue(h,w,_){var M=w.pendingProps;switch(Nj(w),w.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Nn(w),null;case 1:return Nn(w),null;case 3:return _=w.stateNode,M=null,h!==null&&(M=h.memoizedState.cache),w.memoizedState.cache!==M&&(w.flags|=2048),qu(_i),F(),_.pendingContext&&(_.context=_.pendingContext,_.pendingContext=null),(h===null||h.child===null)&&(Eb(w)?Wu(w):h===null||h.memoizedState.isDehydrated&&(w.flags&256)===0||(w.flags|=1024,Aj())),Nn(w),null;case 26:var W=w.type,te=w.memoizedState;return h===null?(Wu(w),te!==null?(Nn(w),iH(w,te)):(Nn(w),yM(w,W,null,M,_))):te?te!==h.memoizedState?(Wu(w),Nn(w),iH(w,te)):(Nn(w),w.flags&=-16777217):(h=h.memoizedProps,h!==M&&Wu(w),Nn(w),yM(w,W,h,M,_)),null;case 27:if($(w),_=V.current,W=w.type,h!==null&&w.stateNode!=null)h.memoizedProps!==M&&Wu(w);else{if(!M){if(w.stateNode===null)throw Error(n(166));return Nn(w),null}h=pe.current,Eb(w)?I5(w):(h=mq(W,M,_),w.stateNode=h,Wu(w))}return Nn(w),null;case 5:if($(w),W=w.type,h!==null&&w.stateNode!=null)h.memoizedProps!==M&&Wu(w);else{if(!M){if(w.stateNode===null)throw Error(n(166));return Nn(w),null}if(te=pe.current,Eb(w))I5(w);else{var ke=y_(V.current);switch(te){case 1:te=ke.createElementNS("http://www.w3.org/2000/svg",W);break;case 2:te=ke.createElementNS("http://www.w3.org/1998/Math/MathML",W);break;default:switch(W){case"svg":te=ke.createElementNS("http://www.w3.org/2000/svg",W);break;case"math":te=ke.createElementNS("http://www.w3.org/1998/Math/MathML",W);break;case"script":te=ke.createElement("div"),te.innerHTML=" +