From 53a4933c361ff0fadac4101d618c1b1aba9b65ef Mon Sep 17 00:00:00 2001 From: maziggy Date: Sun, 15 Feb 2026 10:59:07 +0100 Subject: [PATCH] feat: add bed cooled notification after print completes (#378) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Notify users when the print bed cools below a configurable threshold (default 35°C) after a print finishes, so they know when to remove parts. - Backend: DB migration, model, schemas, notification template, service method, background cooldown monitor (polls every 15s, 30min timeout) - Frontend: event toggle in provider card/modal, threshold setting in Settings > Notifications, i18n keys for all 5 locales - Tests: 4 backend + 4 frontend tests - Docs: README, website, wiki updated --- CHANGELOG.md | 1 + README.md | 1 + backend/app/api/routes/notifications.py | 2 + backend/app/core/database.py | 6 + backend/app/main.py | 90 ++++++++++++ backend/app/models/notification.py | 3 + backend/app/models/notification_template.py | 6 + backend/app/schemas/notification.py | 6 + backend/app/schemas/notification_template.py | 10 ++ backend/app/schemas/settings.py | 6 + backend/app/services/notification_service.py | 24 ++++ backend/tests/conftest.py | 1 + .../services/test_notification_service.py | 130 ++++++++++++++++++ .../NotificationProviderCard.test.tsx | 32 +++++ .../src/__tests__/pages/SettingsPage.test.tsx | 1 + frontend/src/api/client.ts | 8 ++ .../src/components/AddNotificationModal.tsx | 9 ++ .../components/NotificationProviderCard.tsx | 14 ++ frontend/src/i18n/locales/de.ts | 2 + frontend/src/i18n/locales/en.ts | 2 + frontend/src/i18n/locales/fr.ts | 2 + frontend/src/i18n/locales/it.ts | 2 + frontend/src/i18n/locales/ja.ts | 2 + frontend/src/pages/SettingsPage.tsx | 28 +++- .../{index-DgABqL-m.js => index-BwlOtO_N.js} | 106 +++++++------- static/index.html | 2 +- 26 files changed, 441 insertions(+), 55 deletions(-) rename static/assets/{index-DgABqL-m.js => index-BwlOtO_N.js} (58%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c2780efe..a73203786 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All notable changes to Bambuddy will be documented in this file. ## [0.2.0b] - Not released ### New Features +- **Bed Cooled Notification** ([#378](https://github.com/maziggy/bambuddy/issues/378)) — New notification event that fires when the print bed cools below a configurable threshold (default 35°C) after a print completes. Useful for knowing when it's safe to remove parts. A background task polls the bed temperature every 15 seconds after print completion and sends a notification when it drops below the threshold. Automatically cancels if a new print starts or the printer disconnects. The threshold is configurable in Settings → Notifications. Includes a customizable notification template with printer name, bed temperature, and threshold variables. - **Spool Inventory — AMS Slot Assignment** — Assign inventory spools to AMS slots for filament tracking. Hover over any non-Bambu-Lab AMS slot to assign or unassign spools. The assign modal filters out Bambu Lab spools (tracked via RFID) and spools already assigned to other slots. Bambu Lab spool slots automatically hide assign/unassign UI since they are managed by the AMS. When a Bambu Lab spool is inserted into a slot with a manual assignment, the assignment is automatically unlinked. - **Spool Inventory — Remaining Weight Editing** — Edit the remaining filament weight when adding or editing a spool. The new "Remaining Weight" field in the Additional section shows current weight (label weight minus consumed) with a max reference. Edits are stored as `weight_used` internally. - **Spool Inventory — Unified 3MF-Based Usage Tracking** ([#336](https://github.com/maziggy/bambuddy/issues/336)) — All spools (Bambu Lab and third-party) now use 3MF slicer estimates as the primary tracking source. Per-filament `used_g` data from the archived 3MF file provides precise per-spool consumption. For failed or aborted prints, per-layer G-code analysis provides accurate partial usage up to the exact failure layer, with linear progress scaling as fallback. AMS remain% delta is the final fallback for G-code-only prints without an archived 3MF. Slot-to-tray mapping uses queue `ams_mapping` for queue-initiated prints and the printer's `tray_now` state for single-filament non-queue prints, ensuring the correct physical spool is always tracked. diff --git a/README.md b/README.md index 1c139a6f7..a986ea7b7 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,7 @@ Perfect for remote print farms, traveling makers, or accessing your home printer - Filament usage and progress in failed/cancelled print notifications - HMS error alerts (AMS, nozzle, etc.) - Build plate detection alerts +- Bed cooled alerts (configurable threshold) - Queue events (waiting, skipped, failed) ### 🧵 Spool Inventory diff --git a/backend/app/api/routes/notifications.py b/backend/app/api/routes/notifications.py index 4523a570a..efb0f908e 100644 --- a/backend/app/api/routes/notifications.py +++ b/backend/app/api/routes/notifications.py @@ -56,6 +56,8 @@ def _provider_to_dict(provider: NotificationProvider) -> dict: "on_ams_ht_temperature_high": provider.on_ams_ht_temperature_high, # Build plate detection "on_plate_not_empty": provider.on_plate_not_empty, + # Bed cooled + "on_bed_cooled": provider.on_bed_cooled, # Print queue events "on_queue_job_added": provider.on_queue_job_added, "on_queue_job_assigned": provider.on_queue_job_assigned, diff --git a/backend/app/core/database.py b/backend/app/core/database.py index d0e14bc3a..b34fef663 100644 --- a/backend/app/core/database.py +++ b/backend/app/core/database.py @@ -1209,6 +1209,12 @@ async def run_migrations(conn): except OperationalError: pass # Already applied + # Migration: Add bed cooled notification column to notification_providers + try: + await conn.execute(text("ALTER TABLE notification_providers ADD COLUMN on_bed_cooled BOOLEAN DEFAULT 0")) + except OperationalError: + pass # Already applied + async def seed_notification_templates(): """Seed default notification templates if they don't exist.""" diff --git a/backend/app/main.py b/backend/app/main.py index 0e15a99ce..65d262e4c 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -260,6 +260,9 @@ _notified_hms_errors: dict[int, set[str]] = {} # Used for snapshot-diff detection at print completion _timelapse_baselines: dict[int, set[str]] = {} +# Track active bed cooldown monitoring tasks: {printer_id: asyncio.Task} +_bed_cooldown_tasks: dict[int, asyncio.Task] = {} + async def _get_plug_energy(plug, db) -> dict | None: """Get energy from plug regardless of type (Tasmota, Home Assistant, or MQTT). @@ -991,6 +994,12 @@ async def on_print_start(printer_id: int, data: dict): logger.info("[CALLBACK] on_print_start called for printer %s, data keys: %s", printer_id, list(data.keys())) + # Cancel any active bed cooldown task for this printer + existing_task = _bed_cooldown_tasks.pop(printer_id, None) + if existing_task and not existing_task.done(): + existing_task.cancel() + logger.info("[BED-COOL] Cancelled bed cooldown monitor for printer %s (new print started)", printer_id) + # Clear cached cover images so the new print's thumbnail is fetched fresh from backend.app.api.routes.printers import clear_cover_cache @@ -2519,6 +2528,87 @@ async def on_print_complete(printer_id: int, data: dict): pass # Best-effort timelapse session cancellation on error asyncio.create_task(_background_layer_timelapse()) + + # Start bed cooldown monitor (polls bed temp until it drops below threshold) + async def _background_bed_cooldown(): + """Monitor bed temperature after print and notify when cooled.""" + try: + from backend.app.api.routes.settings import get_setting + + # Check threshold setting + async with async_session() as db: + threshold_str = await get_setting(db, "bed_cooled_threshold") + threshold = float(threshold_str) if threshold_str else 35.0 + + # Check if any provider has on_bed_cooled enabled (early exit if none) + async with async_session() as db: + providers = await notification_service._get_providers_for_event(db, "on_bed_cooled", printer_id) + if not providers: + logger.debug("[BED-COOL] No providers enabled for bed_cooled on printer %s", printer_id) + return + + logger.info("[BED-COOL] Monitoring bed temp for printer %s (threshold: %.0f°C)", printer_id, threshold) + + max_polls = 120 # 120 * 15s = 30 min timeout + for _ in range(max_polls): + await asyncio.sleep(15) + + # Check if printer is still connected + status = printer_manager.get_status(printer_id) + if status is None: + logger.info("[BED-COOL] Printer %s disconnected, stopping monitor", printer_id) + return + + # Check if a new print started (state == RUNNING) + if hasattr(status, "state") and status.state == "RUNNING": + logger.info("[BED-COOL] New print started on printer %s, stopping monitor", printer_id) + return + + # Get bed temperature + bed_temp = None + if hasattr(status, "temperatures") and status.temperatures: + bed_temp = status.temperatures.get("bed") + + if bed_temp is None: + continue + + if bed_temp <= threshold: + logger.info( + "[BED-COOL] Bed cooled to %.1f°C on printer %s (threshold: %.0f°C)", + bed_temp, + printer_id, + threshold, + ) + printer_info = printer_manager.get_printer(printer_id) + p_name = printer_info.name if printer_info else "Unknown" + async with async_session() as db: + await notification_service.on_bed_cooled( + printer_id=printer_id, + printer_name=p_name, + bed_temp=bed_temp, + threshold=threshold, + filename=filename or subtask_name or "", + db=db, + ) + return + + logger.info("[BED-COOL] Timeout waiting for bed to cool on printer %s", printer_id) + except asyncio.CancelledError: + logger.info("[BED-COOL] Bed cooldown monitor cancelled for printer %s", printer_id) + except Exception as e: + logger.warning("[BED-COOL] Failed: %s", e) + finally: + _bed_cooldown_tasks.pop(printer_id, None) + + # Only start bed cooldown for completed prints + if data.get("status") == "completed": + # Cancel any existing task for this printer + existing_task = _bed_cooldown_tasks.pop(printer_id, None) + if existing_task and not existing_task.done(): + existing_task.cancel() + task = asyncio.create_task(_background_bed_cooldown()) + _bed_cooldown_tasks[printer_id] = task + log_timing("All background tasks scheduled") # Auto-scan for timelapse if recording was active during the print diff --git a/backend/app/models/notification.py b/backend/app/models/notification.py index c04b140d7..c35e3eaba 100644 --- a/backend/app/models/notification.py +++ b/backend/app/models/notification.py @@ -83,6 +83,9 @@ class NotificationProvider(Base): # Event triggers - Build plate detection on_plate_not_empty = Column(Boolean, default=True) # Objects detected on plate before print + # Event triggers - Bed cooled after print + on_bed_cooled = Column(Boolean, default=False) # Bed cooled below threshold after print + # Event triggers - Print queue on_queue_job_added = Column(Boolean, default=False) # Job added to queue on_queue_job_assigned = Column(Boolean, default=False) # Model-based job assigned to printer diff --git a/backend/app/models/notification_template.py b/backend/app/models/notification_template.py index 811a034f2..c1a10a2c1 100644 --- a/backend/app/models/notification_template.py +++ b/backend/app/models/notification_template.py @@ -97,6 +97,12 @@ DEFAULT_TEMPLATES = [ "title_template": "AMS Temperature Alert", "body_template": "{printer} {ams_label}: Temperature {temperature}°C exceeds {threshold}°C threshold", }, + { + "event_type": "bed_cooled", + "name": "Bed Cooled", + "title_template": "Bed Cooled", + "body_template": "{printer}: Bed cooled to {bed_temp}°C (threshold: {threshold}°C)", + }, { "event_type": "test", "name": "Test Notification", diff --git a/backend/app/schemas/notification.py b/backend/app/schemas/notification.py index 785227f9e..4405251fe 100644 --- a/backend/app/schemas/notification.py +++ b/backend/app/schemas/notification.py @@ -53,6 +53,9 @@ class NotificationProviderBase(BaseModel): # Event triggers - Build plate detection on_plate_not_empty: bool = Field(default=True, description="Notify when objects detected on plate before print") + # Event triggers - Bed cooled + on_bed_cooled: bool = Field(default=False, description="Notify when bed cools after print") + # Event triggers - Print queue on_queue_job_added: bool = Field(default=False, description="Notify when job is added to queue") on_queue_job_assigned: bool = Field(default=False, description="Notify when model-based job is assigned to printer") @@ -129,6 +132,9 @@ class NotificationProviderUpdate(BaseModel): # Event triggers - Build plate detection on_plate_not_empty: bool | None = None + # Event triggers - Bed cooled + on_bed_cooled: bool | None = None + # Event triggers - Print queue on_queue_job_added: bool | None = None on_queue_job_assigned: bool | None = None diff --git a/backend/app/schemas/notification_template.py b/backend/app/schemas/notification_template.py index 9b09d40b2..15193261d 100644 --- a/backend/app/schemas/notification_template.py +++ b/backend/app/schemas/notification_template.py @@ -20,6 +20,7 @@ class EventType(StrEnum): MAINTENANCE_DUE = "maintenance_due" AMS_HUMIDITY_HIGH = "ams_humidity_high" AMS_TEMPERATURE_HIGH = "ams_temperature_high" + BED_COOLED = "bed_cooled" TEST = "test" @@ -66,6 +67,7 @@ EVENT_VARIABLES: dict[str, list[str]] = { "maintenance_due": ["printer", "items", "timestamp", "app_name"], "ams_humidity_high": ["printer", "ams_label", "humidity", "threshold", "timestamp", "app_name"], "ams_temperature_high": ["printer", "ams_label", "temperature", "threshold", "timestamp", "app_name"], + "bed_cooled": ["printer", "bed_temp", "threshold", "filename", "timestamp", "app_name"], "test": ["app_name", "timestamp"], # Queue notifications "queue_job_added": ["job_name", "target", "timestamp", "app_name"], @@ -172,6 +174,14 @@ SAMPLE_DATA: dict[str, dict[str, str]] = { "timestamp": "2024-01-15 14:30", "app_name": "Bambuddy", }, + "bed_cooled": { + "printer": "Bambu X1C", + "bed_temp": "34", + "threshold": "35", + "filename": "Benchy", + "timestamp": "2024-01-15 14:30", + "app_name": "Bambuddy", + }, "test": { "app_name": "Bambuddy", "timestamp": "2024-01-15 14:30", diff --git a/backend/app/schemas/settings.py b/backend/app/schemas/settings.py index 3c4df280a..995b3db0d 100644 --- a/backend/app/schemas/settings.py +++ b/backend/app/schemas/settings.py @@ -39,6 +39,11 @@ class AppSettings(BaseModel): # Language notification_language: str = Field(default="en", description="Language for push notifications (en, de)") + # Bed cooled notification threshold + bed_cooled_threshold: float = Field( + default=35.0, description="Bed temperature threshold for cooled notification (°C)" + ) + # AMS threshold settings for humidity and temperature coloring ams_humidity_good: int = Field(default=40, description="Humidity threshold for good (green): <= this value") ams_humidity_fair: int = Field( @@ -161,6 +166,7 @@ class AppSettingsUpdate(BaseModel): check_updates: bool | None = None check_printer_firmware: bool | None = None notification_language: str | None = None + bed_cooled_threshold: float | None = None ams_humidity_good: int | None = None ams_humidity_fair: int | None = None ams_temp_good: float | None = None diff --git a/backend/app/services/notification_service.py b/backend/app/services/notification_service.py index aba478def..646394ca2 100644 --- a/backend/app/services/notification_service.py +++ b/backend/app/services/notification_service.py @@ -1016,6 +1016,30 @@ class NotificationService: providers, title, message, db, "ams_ht_temperature_high", printer_id, printer_name, force_immediate=True ) + async def on_bed_cooled( + self, + printer_id: int, + printer_name: str, + bed_temp: float, + threshold: float, + filename: str, + db: AsyncSession, + ): + """Handle bed cooled event - bed temperature dropped below threshold after print.""" + providers = await self._get_providers_for_event(db, "on_bed_cooled", printer_id) + if not providers: + return + + variables = { + "printer": printer_name, + "bed_temp": f"{bed_temp:.0f}", + "threshold": f"{threshold:.0f}", + "filename": self._clean_filename(filename) if filename else "Unknown", + } + + title, message = await self._build_message_from_template(db, "bed_cooled", variables) + await self._send_to_providers(providers, title, message, db, "bed_cooled", printer_id, printer_name) + def clear_template_cache(self): """Clear the template cache. Call this when templates are updated.""" self._template_cache.clear() diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py index ed83cef41..89014c430 100644 --- a/backend/tests/conftest.py +++ b/backend/tests/conftest.py @@ -408,6 +408,7 @@ def notification_provider_factory(db_session): "on_maintenance_due": False, "on_ams_humidity_high": False, "on_ams_temperature_high": False, + "on_bed_cooled": False, "quiet_hours_enabled": False, "daily_digest_enabled": False, } diff --git a/backend/tests/unit/services/test_notification_service.py b/backend/tests/unit/services/test_notification_service.py index 1f8eb492a..104c6aac6 100644 --- a/backend/tests/unit/services/test_notification_service.py +++ b/backend/tests/unit/services/test_notification_service.py @@ -1191,3 +1191,133 @@ class TestPlateNotEmptyNotifications: assert captured_variables["printer"] == "X1 Carbon" assert captured_variables["difference_percent"] == "3.5" + + +class TestBedCooledNotifications: + """Tests for bed cooled (after print) notifications.""" + + @pytest.fixture + def service(self): + return NotificationService() + + @pytest.fixture + def mock_provider(self): + """Create a mock notification provider with bed cooled enabled.""" + provider = MagicMock() + provider.id = 1 + provider.name = "Test Provider" + provider.provider_type = "webhook" + provider.enabled = True + provider.config = json.dumps({"webhook_url": "http://test.local/webhook"}) + provider.on_bed_cooled = True + provider.quiet_hours_enabled = False + provider.daily_digest_enabled = False + provider.printer_id = None + return provider + + @pytest.fixture + def mock_db(self): + """Create a mock database session.""" + db = AsyncMock() + db.commit = AsyncMock() + return db + + @pytest.mark.asyncio + async def test_on_bed_cooled_sends_notification(self, service, mock_provider, mock_db): + """Verify bed cooled notification is sent when triggered.""" + with ( + patch.object(service, "_get_providers_for_event", new_callable=AsyncMock) as mock_get, + patch.object(service, "_send_to_providers", new_callable=AsyncMock) as mock_send, + patch.object(service, "_build_message_from_template", new_callable=AsyncMock) as mock_build, + ): + mock_get.return_value = [mock_provider] + mock_build.return_value = ("Bed Cooled", "Test Printer: Bed cooled to 30°C") + + await service.on_bed_cooled( + printer_id=1, + printer_name="Test Printer", + bed_temp=30.0, + threshold=35.0, + filename="benchy.3mf", + db=mock_db, + ) + + mock_get.assert_called_once() + mock_send.assert_called_once() + + @pytest.mark.asyncio + async def test_on_bed_cooled_skipped_when_no_providers(self, service, mock_db): + """Verify notification is skipped when no providers have bed cooled enabled.""" + with ( + patch.object(service, "_get_providers_for_event", new_callable=AsyncMock) as mock_get, + patch.object(service, "_send_to_providers", new_callable=AsyncMock) as mock_send, + ): + mock_get.return_value = [] + + await service.on_bed_cooled( + printer_id=1, + printer_name="Test Printer", + bed_temp=30.0, + threshold=35.0, + filename="benchy.3mf", + db=mock_db, + ) + + mock_send.assert_not_called() + + @pytest.mark.asyncio + async def test_on_bed_cooled_includes_correct_variables(self, service, mock_provider, mock_db): + """Verify bed temp, threshold, and filename are passed to template variables.""" + captured_variables = {} + + async def capture_build(db, event_type, variables): + captured_variables.update(variables) + return ("Test", "Test") + + with ( + patch.object(service, "_get_providers_for_event", new_callable=AsyncMock) as mock_get, + patch.object(service, "_send_to_providers", new_callable=AsyncMock), + patch.object(service, "_build_message_from_template", side_effect=capture_build), + ): + mock_get.return_value = [mock_provider] + + await service.on_bed_cooled( + printer_id=1, + printer_name="X1 Carbon", + bed_temp=28.7, + threshold=35.0, + filename="benchy.gcode.3mf", + db=mock_db, + ) + + assert captured_variables["printer"] == "X1 Carbon" + assert captured_variables["bed_temp"] == "29" + assert captured_variables["threshold"] == "35" + assert captured_variables["filename"] == "benchy" + + @pytest.mark.asyncio + async def test_on_bed_cooled_handles_none_filename(self, service, mock_provider, mock_db): + """Verify None filename is handled gracefully.""" + captured_variables = {} + + async def capture_build(db, event_type, variables): + captured_variables.update(variables) + return ("Test", "Test") + + with ( + patch.object(service, "_get_providers_for_event", new_callable=AsyncMock) as mock_get, + patch.object(service, "_send_to_providers", new_callable=AsyncMock), + patch.object(service, "_build_message_from_template", side_effect=capture_build), + ): + mock_get.return_value = [mock_provider] + + await service.on_bed_cooled( + printer_id=1, + printer_name="Test Printer", + bed_temp=30.0, + threshold=35.0, + filename=None, + db=mock_db, + ) + + assert captured_variables["filename"] == "Unknown" diff --git a/frontend/src/__tests__/components/NotificationProviderCard.test.tsx b/frontend/src/__tests__/components/NotificationProviderCard.test.tsx index 00d768c05..0a9ef8235 100644 --- a/frontend/src/__tests__/components/NotificationProviderCard.test.tsx +++ b/frontend/src/__tests__/components/NotificationProviderCard.test.tsx @@ -64,6 +64,7 @@ const createMockProvider = ( on_ams_ht_humidity_high: false, on_ams_ht_temperature_high: false, on_plate_not_empty: true, + on_bed_cooled: false, on_queue_job_added: false, on_queue_job_assigned: false, on_queue_job_started: false, @@ -370,3 +371,34 @@ describe('NotificationProviderCard Queue notifications', () => { }); }); }); + +describe('NotificationProviderCard Bed Cooled notifications', () => { + describe('bed cooled toggle', () => { + it('includes on_bed_cooled in provider data when enabled', () => { + const provider = createMockProvider({ on_bed_cooled: true }); + expect(provider.on_bed_cooled).toBe(true); + }); + + it('includes on_bed_cooled in provider data when disabled', () => { + const provider = createMockProvider({ on_bed_cooled: false }); + expect(provider.on_bed_cooled).toBe(false); + }); + + it('defaults on_bed_cooled to false', () => { + const provider = createMockProvider(); + expect(provider.on_bed_cooled).toBe(false); + }); + + it('bed cooled is independent from other print event toggles', () => { + const provider = createMockProvider({ + on_print_complete: true, + on_bed_cooled: true, + on_plate_not_empty: false, + }); + + expect(provider.on_print_complete).toBe(true); + expect(provider.on_bed_cooled).toBe(true); + expect(provider.on_plate_not_empty).toBe(false); + }); + }); +}); diff --git a/frontend/src/__tests__/pages/SettingsPage.test.tsx b/frontend/src/__tests__/pages/SettingsPage.test.tsx index c1856377c..2a4bfd15c 100644 --- a/frontend/src/__tests__/pages/SettingsPage.test.tsx +++ b/frontend/src/__tests__/pages/SettingsPage.test.tsx @@ -32,6 +32,7 @@ const mockSettings = { ha_token: '', check_updates: false, check_printer_firmware: false, + bed_cooled_threshold: 35, }; describe('SettingsPage', () => { diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index c487bbbb6..7da99aaaa 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -791,6 +791,8 @@ export interface AppSettings { // Prometheus metrics prometheus_enabled: boolean; prometheus_token: string; + // Bed cooled threshold + bed_cooled_threshold: number; } export type AppSettingsUpdate = Partial; @@ -1402,6 +1404,8 @@ export interface NotificationProvider { on_ams_ht_temperature_high: boolean; // Build plate detection on_plate_not_empty: boolean; + // Bed cooled + on_bed_cooled: boolean; // Print queue events on_queue_job_added: boolean; on_queue_job_assigned: boolean; @@ -1452,6 +1456,8 @@ export interface NotificationProviderCreate { on_ams_ht_temperature_high?: boolean; // Build plate detection on_plate_not_empty?: boolean; + // Bed cooled + on_bed_cooled?: boolean; // Print queue events on_queue_job_added?: boolean; on_queue_job_assigned?: boolean; @@ -1495,6 +1501,8 @@ export interface NotificationProviderUpdate { on_ams_ht_temperature_high?: boolean; // Build plate detection on_plate_not_empty?: boolean; + // Bed cooled + on_bed_cooled?: boolean; // Print queue events on_queue_job_added?: boolean; on_queue_job_assigned?: boolean; diff --git a/frontend/src/components/AddNotificationModal.tsx b/frontend/src/components/AddNotificationModal.tsx index adc572416..8c5c3ad2b 100644 --- a/frontend/src/components/AddNotificationModal.tsx +++ b/frontend/src/components/AddNotificationModal.tsx @@ -46,6 +46,7 @@ export function AddNotificationModal({ provider, onClose }: AddNotificationModal const [onPrinterError, setOnPrinterError] = useState(provider?.on_printer_error ?? false); const [onFilamentLow, setOnFilamentLow] = useState(provider?.on_filament_low ?? false); const [onMaintenanceDue, setOnMaintenanceDue] = useState(provider?.on_maintenance_due ?? false); + const [onBedCooled, setOnBedCooled] = useState(provider?.on_bed_cooled ?? false); // Provider-specific config const [config, setConfig] = useState>( @@ -145,6 +146,7 @@ export function AddNotificationModal({ provider, onClose }: AddNotificationModal on_printer_error: onPrinterError, on_filament_low: onFilamentLow, on_maintenance_due: onMaintenanceDue, + on_bed_cooled: onBedCooled, }; if (isEditing) { @@ -486,6 +488,13 @@ export function AddNotificationModal({ provider, onClose }: AddNotificationModal +
+
+ Bed Cooled + (after print completes) +
+ +
diff --git a/frontend/src/components/NotificationProviderCard.tsx b/frontend/src/components/NotificationProviderCard.tsx index 01a7e96b5..385595c6d 100644 --- a/frontend/src/components/NotificationProviderCard.tsx +++ b/frontend/src/components/NotificationProviderCard.tsx @@ -163,6 +163,9 @@ export function NotificationProviderCard({ provider, onEdit }: NotificationProvi {provider.on_ams_ht_temperature_high && ( AMS-HT Temp )} + {provider.on_bed_cooled && ( + Bed Cooled + )} {provider.quiet_hours_enabled && ( @@ -276,6 +279,17 @@ export function NotificationProviderCard({ provider, onEdit }: NotificationProvi /> +
+
+

Bed Cooled

+

Bed cooled below threshold after print

+
+ updateMutation.mutate({ on_bed_cooled: checked })} + /> +
+

Print Failed

+ {/* Bed Cooled Threshold Setting */} + + +
+
+

{t('settings.bedCooledThreshold')}

+

{t('settings.bedCooledThresholdDescription')}

+
+
+ updateSetting('bed_cooled_threshold', Number(e.target.value))} + className="w-16 px-2 py-1.5 bg-bambu-dark border border-bambu-dark-tertiary rounded text-white text-sm text-center focus:outline-none focus:ring-1 focus:ring-bambu-green" + /> + °C +
+
+
+
+ {/* Test All Results */} {testAllResult && ( @@ -2790,7 +2816,7 @@ export function SettingsPage() {
) : notificationTemplates && notificationTemplates.length > 0 ? (
- {notificationTemplates.map((template) => ( + {[...notificationTemplates].sort((a, b) => a.name.localeCompare(b.name)).map((template) => ( r[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(i){if(i.ep)return;i.ep=!0;const s=n(i);fetch(i.href,s)}})();var i_=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ec(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var jT={exports:{}},Yx={};var zU;function Toe(){if(zU)return Yx;zU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(r,i,s){var o=null;if(s!==void 0&&(o=""+s),i.key!==void 0&&(o=""+i.key),"key"in i){s={};for(var l in i)l!=="key"&&(s[l]=i[l])}else s=i;return i=s.ref,{$$typeof:t,type:r,key:o,ref:i!==void 0?i:null,props:s}}return Yx.Fragment=e,Yx.jsx=n,Yx.jsxs=n,Yx}var UU;function Eoe(){return UU||(UU=1,jT.exports=Toe()),jT.exports}var a=Eoe(),DT={exports:{}},kn={};var BU;function Poe(){if(BU)return kn;BU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),o=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),h=Symbol.for("react.activity"),f=Symbol.iterator;function p(V){return V===null||typeof V!="object"?null:(V=f&&V[f]||V["@@iterator"],typeof V=="function"?V:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v=Object.assign,b={};function y(V,Y,ne){this.props=V,this.context=Y,this.refs=b,this.updater=ne||x}y.prototype.isReactComponent={},y.prototype.setState=function(V,Y){if(typeof V!="object"&&typeof V!="function"&&V!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,V,Y,"setState")},y.prototype.forceUpdate=function(V){this.updater.enqueueForceUpdate(this,V,"forceUpdate")};function S(){}S.prototype=y.prototype;function N(V,Y,ne){this.props=V,this.context=Y,this.refs=b,this.updater=ne||x}var M=N.prototype=new S;M.constructor=N,v(M,y.prototype),M.isPureReactComponent=!0;var k=Array.isArray;function T(){}var C={H:null,A:null,T:null,S:null},j=Object.prototype.hasOwnProperty;function E(V,Y,ne){var ee=ne.ref;return{$$typeof:t,type:V,key:Y,ref:ee!==void 0?ee:null,props:ne}}function P(V,Y){return E(V.type,Y,V.props)}function U(V){return typeof V=="object"&&V!==null&&V.$$typeof===t}function L(V){var Y={"=":"=0",":":"=2"};return"$"+V.replace(/[=:]/g,function(ne){return Y[ne]})}var B=/\/+/g;function D(V,Y){return typeof V=="object"&&V!==null&&V.key!=null?L(""+V.key):Y.toString(36)}function H(V){switch(V.status){case"fulfilled":return V.value;case"rejected":throw V.reason;default:switch(typeof V.status=="string"?V.then(T,T):(V.status="pending",V.then(function(Y){V.status==="pending"&&(V.status="fulfilled",V.value=Y)},function(Y){V.status==="pending"&&(V.status="rejected",V.reason=Y)})),V.status){case"fulfilled":return V.value;case"rejected":throw V.reason}}throw V}function G(V,Y,ne,ee,ve){var fe=typeof V;(fe==="undefined"||fe==="boolean")&&(V=null);var de=!1;if(V===null)de=!0;else switch(fe){case"bigint":case"string":case"number":de=!0;break;case"object":switch(V.$$typeof){case t:case e:de=!0;break;case d:return de=V._init,G(de(V._payload),Y,ne,ee,ve)}}if(de)return ve=ve(V),de=ee===""?"."+D(V,0):ee,k(ve)?(ne="",de!=null&&(ne=de.replace(B,"$&/")+"/"),G(ve,Y,ne,"",function(le){return le})):ve!=null&&(U(ve)&&(ve=P(ve,ne+(ve.key==null||V&&V.key===ve.key?"":(""+ve.key).replace(B,"$&/")+"/")+de)),Y.push(ve)),1;de=0;var Re=ee===""?".":ee+":";if(k(V))for(var ue=0;ue>>1,ae=G[Q];if(0>>1;Qi(ne,K))eei(ve,ne)?(G[Q]=ve,G[ee]=K,Q=ee):(G[Q]=ne,G[Y]=K,Q=Y);else if(eei(ve,K))G[Q]=ve,G[ee]=K,Q=ee;else break e}}return I}function i(G,I){var K=G.sortIndex-I.sortIndex;return K!==0?K:G.id-I.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var s=performance;t.unstable_now=function(){return s.now()}}else{var o=Date,l=o.now();t.unstable_now=function(){return o.now()-l}}var c=[],u=[],d=1,h=null,f=3,p=!1,x=!1,v=!1,b=!1,y=typeof setTimeout=="function"?setTimeout:null,S=typeof clearTimeout=="function"?clearTimeout:null,N=typeof setImmediate<"u"?setImmediate:null;function M(G){for(var I=n(u);I!==null;){if(I.callback===null)r(u);else if(I.startTime<=G)r(u),I.sortIndex=I.expirationTime,e(c,I);else break;I=n(u)}}function k(G){if(v=!1,M(G),!x)if(n(c)!==null)x=!0,T||(T=!0,L());else{var I=n(u);I!==null&&H(k,I.startTime-G)}}var T=!1,C=-1,j=5,E=-1;function P(){return b?!0:!(t.unstable_now()-EG&&P());){var Q=h.callback;if(typeof Q=="function"){h.callback=null,f=h.priorityLevel;var ae=Q(h.expirationTime<=G);if(G=t.unstable_now(),typeof ae=="function"){h.callback=ae,M(G),I=!0;break t}h===n(c)&&r(c),M(G)}else r(c);h=n(c)}if(h!==null)I=!0;else{var V=n(u);V!==null&&H(k,V.startTime-G),I=!1}}break e}finally{h=null,f=K,p=!1}I=void 0}}finally{I?L():T=!1}}}var L;if(typeof N=="function")L=function(){N(U)};else if(typeof MessageChannel<"u"){var B=new MessageChannel,D=B.port2;B.port1.onmessage=U,L=function(){D.postMessage(null)}}else L=function(){y(U,0)};function H(G,I){C=y(function(){G(t.unstable_now())},I)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(G){G.callback=null},t.unstable_forceFrameRate=function(G){0>G||125Q?(G.sortIndex=K,e(u,G),n(c)===null&&G===n(u)&&(v?(S(C),C=-1):v=!0,H(k,K-Q))):(G.sortIndex=ae,e(c,G),x||p||(x=!0,T||(T=!0,L()))),G},t.unstable_shouldYield=P,t.unstable_wrapCallback=function(G){var I=f;return function(){var K=f;f=I;try{return G.apply(this,arguments)}finally{f=K}}}})(LT)),LT}var VU;function Roe(){return VU||(VU=1,FT.exports=Doe()),FT.exports}var OT={exports:{}},ls={};var GU;function Foe(){if(GU)return ls;GU=1;var t=Ib();function e(c){var u="https://react.dev/errors/"+c;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),OT.exports=Foe(),OT.exports}var WU;function Loe(){if(WU)return Qx;WU=1;var t=Roe(),e=Ib(),n=lK();function r(m){var g="https://react.dev/errors/"+m;if(1ae||(m.current=Q[ae],Q[ae]=null,ae--)}function ne(m,g){ae++,Q[ae]=m.current,m.current=g}var ee=V(null),ve=V(null),fe=V(null),de=V(null);function Re(m,g){switch(ne(fe,g),ne(ve,m),ne(ee,null),g.nodeType){case 9:case 11:m=(m=g.documentElement)&&(m=m.namespaceURI)?lU(m):0;break;default:if(m=g.tagName,g=g.namespaceURI)g=lU(g),m=cU(g,m);else switch(m){case"svg":m=1;break;case"math":m=2;break;default:m=0}}Y(ee),ne(ee,m)}function ue(){Y(ee),Y(ve),Y(fe)}function le(m){m.memoizedState!==null&&ne(de,m);var g=ee.current,_=cU(g,m.type);g!==_&&(ne(ve,m),ne(ee,_))}function Ne(m){ve.current===m&&(Y(ee),Y(ve)),de.current===m&&(Y(de),qx._currentValue=K)}var J,Le;function $(m){if(J===void 0)try{throw Error()}catch(_){var g=_.stack.trim().match(/\n( *(at )?)/);J=g&&g[1]||"",Le=-1<_.stack.indexOf(` +function Aoe(t,e){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}))}(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(i){if(i.ep)return;i.ep=!0;const s=n(i);fetch(i.href,s)}})();var i_=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function ec(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var jT={exports:{}},Yx={};var zU;function Toe(){if(zU)return Yx;zU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.fragment");function n(r,i,s){var o=null;if(s!==void 0&&(o=""+s),i.key!==void 0&&(o=""+i.key),"key"in i){s={};for(var l in i)l!=="key"&&(s[l]=i[l])}else s=i;return i=s.ref,{$$typeof:t,type:r,key:o,ref:i!==void 0?i:null,props:s}}return Yx.Fragment=e,Yx.jsx=n,Yx.jsxs=n,Yx}var UU;function Eoe(){return UU||(UU=1,jT.exports=Toe()),jT.exports}var a=Eoe(),DT={exports:{}},kn={};var BU;function Poe(){if(BU)return kn;BU=1;var t=Symbol.for("react.transitional.element"),e=Symbol.for("react.portal"),n=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),o=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),c=Symbol.for("react.suspense"),u=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),h=Symbol.for("react.activity"),f=Symbol.iterator;function p(V){return V===null||typeof V!="object"?null:(V=f&&V[f]||V["@@iterator"],typeof V=="function"?V:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},v=Object.assign,b={};function y(V,X,ne){this.props=V,this.context=X,this.refs=b,this.updater=ne||x}y.prototype.isReactComponent={},y.prototype.setState=function(V,X){if(typeof V!="object"&&typeof V!="function"&&V!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,V,X,"setState")},y.prototype.forceUpdate=function(V){this.updater.enqueueForceUpdate(this,V,"forceUpdate")};function S(){}S.prototype=y.prototype;function N(V,X,ne){this.props=V,this.context=X,this.refs=b,this.updater=ne||x}var M=N.prototype=new S;M.constructor=N,v(M,y.prototype),M.isPureReactComponent=!0;var k=Array.isArray;function T(){}var C={H:null,A:null,T:null,S:null},j=Object.prototype.hasOwnProperty;function E(V,X,ne){var te=ne.ref;return{$$typeof:t,type:V,key:X,ref:te!==void 0?te:null,props:ne}}function P(V,X){return E(V.type,X,V.props)}function U(V){return typeof V=="object"&&V!==null&&V.$$typeof===t}function L(V){var X={"=":"=0",":":"=2"};return"$"+V.replace(/[=:]/g,function(ne){return X[ne]})}var B=/\/+/g;function D(V,X){return typeof V=="object"&&V!==null&&V.key!=null?L(""+V.key):X.toString(36)}function H(V){switch(V.status){case"fulfilled":return V.value;case"rejected":throw V.reason;default:switch(typeof V.status=="string"?V.then(T,T):(V.status="pending",V.then(function(X){V.status==="pending"&&(V.status="fulfilled",V.value=X)},function(X){V.status==="pending"&&(V.status="rejected",V.reason=X)})),V.status){case"fulfilled":return V.value;case"rejected":throw V.reason}}throw V}function G(V,X,ne,te,_e){var me=typeof V;(me==="undefined"||me==="boolean")&&(V=null);var he=!1;if(V===null)he=!0;else switch(me){case"bigint":case"string":case"number":he=!0;break;case"object":switch(V.$$typeof){case t:case e:he=!0;break;case d:return he=V._init,G(he(V._payload),X,ne,te,_e)}}if(he)return _e=_e(V),he=te===""?"."+D(V,0):te,k(_e)?(ne="",he!=null&&(ne=he.replace(B,"$&/")+"/"),G(_e,X,ne,"",function(le){return le})):_e!=null&&(U(_e)&&(_e=P(_e,ne+(_e.key==null||V&&V.key===_e.key?"":(""+_e.key).replace(B,"$&/")+"/")+he)),X.push(_e)),1;he=0;var Re=te===""?".":te+":";if(k(V))for(var ue=0;ue>>1,ie=G[Z];if(0>>1;Zi(ne,W))tei(_e,ne)?(G[Z]=_e,G[te]=W,Z=te):(G[Z]=ne,G[X]=W,Z=X);else if(tei(_e,W))G[Z]=_e,G[te]=W,Z=te;else break e}}return I}function i(G,I){var W=G.sortIndex-I.sortIndex;return W!==0?W:G.id-I.id}if(t.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var s=performance;t.unstable_now=function(){return s.now()}}else{var o=Date,l=o.now();t.unstable_now=function(){return o.now()-l}}var c=[],u=[],d=1,h=null,f=3,p=!1,x=!1,v=!1,b=!1,y=typeof setTimeout=="function"?setTimeout:null,S=typeof clearTimeout=="function"?clearTimeout:null,N=typeof setImmediate<"u"?setImmediate:null;function M(G){for(var I=n(u);I!==null;){if(I.callback===null)r(u);else if(I.startTime<=G)r(u),I.sortIndex=I.expirationTime,e(c,I);else break;I=n(u)}}function k(G){if(v=!1,M(G),!x)if(n(c)!==null)x=!0,T||(T=!0,L());else{var I=n(u);I!==null&&H(k,I.startTime-G)}}var T=!1,C=-1,j=5,E=-1;function P(){return b?!0:!(t.unstable_now()-EG&&P());){var Z=h.callback;if(typeof Z=="function"){h.callback=null,f=h.priorityLevel;var ie=Z(h.expirationTime<=G);if(G=t.unstable_now(),typeof ie=="function"){h.callback=ie,M(G),I=!0;break t}h===n(c)&&r(c),M(G)}else r(c);h=n(c)}if(h!==null)I=!0;else{var V=n(u);V!==null&&H(k,V.startTime-G),I=!1}}break e}finally{h=null,f=W,p=!1}I=void 0}}finally{I?L():T=!1}}}var L;if(typeof N=="function")L=function(){N(U)};else if(typeof MessageChannel<"u"){var B=new MessageChannel,D=B.port2;B.port1.onmessage=U,L=function(){D.postMessage(null)}}else L=function(){y(U,0)};function H(G,I){C=y(function(){G(t.unstable_now())},I)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(G){G.callback=null},t.unstable_forceFrameRate=function(G){0>G||125Z?(G.sortIndex=W,e(u,G),n(c)===null&&G===n(u)&&(v?(S(C),C=-1):v=!0,H(k,W-Z))):(G.sortIndex=ie,e(c,G),x||p||(x=!0,T||(T=!0,L()))),G},t.unstable_shouldYield=P,t.unstable_wrapCallback=function(G){var I=f;return function(){var W=f;f=I;try{return G.apply(this,arguments)}finally{f=W}}}})(LT)),LT}var VU;function Roe(){return VU||(VU=1,FT.exports=Doe()),FT.exports}var OT={exports:{}},ls={};var GU;function Foe(){if(GU)return ls;GU=1;var t=Ib();function e(c){var u="https://react.dev/errors/"+c;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(e){console.error(e)}}return t(),OT.exports=Foe(),OT.exports}var WU;function Loe(){if(WU)return Qx;WU=1;var t=Roe(),e=Ib(),n=lK();function r(m){var g="https://react.dev/errors/"+m;if(1ie||(m.current=Z[ie],Z[ie]=null,ie--)}function ne(m,g){ie++,Z[ie]=m.current,m.current=g}var te=V(null),_e=V(null),me=V(null),he=V(null);function Re(m,g){switch(ne(me,g),ne(_e,m),ne(te,null),g.nodeType){case 9:case 11:m=(m=g.documentElement)&&(m=m.namespaceURI)?lU(m):0;break;default:if(m=g.tagName,g=g.namespaceURI)g=lU(g),m=cU(g,m);else switch(m){case"svg":m=1;break;case"math":m=2;break;default:m=0}}X(te),ne(te,m)}function ue(){X(te),X(_e),X(me)}function le(m){m.memoizedState!==null&&ne(he,m);var g=te.current,_=cU(g,m.type);g!==_&&(ne(_e,m),ne(te,_))}function Ne(m){_e.current===m&&(X(te),X(_e)),he.current===m&&(X(he),qx._currentValue=W)}var ee,Le;function $(m){if(ee===void 0)try{throw Error()}catch(_){var g=_.stack.trim().match(/\n( *(at )?)/);ee=g&&g[1]||"",Le=-1<_.stack.indexOf(` at`)?" ()":-1<_.stack.indexOf("@")?"@unknown:0:0":""}return` -`+J+m+Le}var X=!1;function ce(m,g){if(!m||X)return"";X=!0;var _=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var A={DetermineComponentFrameRoot:function(){try{if(g){var Ct=function(){throw Error()};if(Object.defineProperty(Ct.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(Ct,[])}catch(xt){var mt=xt}Reflect.construct(m,[],Ct)}else{try{Ct.call()}catch(xt){mt=xt}m.call(Ct.prototype)}}else{try{throw Error()}catch(xt){mt=xt}(Ct=m())&&typeof Ct.catch=="function"&&Ct.catch(function(){})}}catch(xt){if(xt&&mt&&typeof xt.stack=="string")return[xt.stack,mt.stack]}return[null,null]}};A.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var R=Object.getOwnPropertyDescriptor(A.DetermineComponentFrameRoot,"name");R&&R.configurable&&Object.defineProperty(A.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var O=A.DetermineComponentFrameRoot(),re=O[0],ke=O[1];if(re&&ke){var Be=re.split(` +`+ee+m+Le}var K=!1;function ce(m,g){if(!m||K)return"";K=!0;var _=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var A={DetermineComponentFrameRoot:function(){try{if(g){var kt=function(){throw Error()};if(Object.defineProperty(kt.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(kt,[])}catch(xt){var mt=xt}Reflect.construct(m,[],kt)}else{try{kt.call()}catch(xt){mt=xt}m.call(kt.prototype)}}else{try{throw Error()}catch(xt){mt=xt}(kt=m())&&typeof kt.catch=="function"&&kt.catch(function(){})}}catch(xt){if(xt&&mt&&typeof xt.stack=="string")return[xt.stack,mt.stack]}return[null,null]}};A.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var R=Object.getOwnPropertyDescriptor(A.DetermineComponentFrameRoot,"name");R&&R.configurable&&Object.defineProperty(A.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var O=A.DetermineComponentFrameRoot(),re=O[0],ke=O[1];if(re&&ke){var Be=re.split(` `),ut=ke.split(` `);for(R=A=0;AR||Be[A]!==ut[R]){var wt=` -`+Be[A].replace(" at new "," at ");return m.displayName&&wt.includes("")&&(wt=wt.replace("",m.displayName)),wt}while(1<=A&&0<=R);break}}}finally{X=!1,Error.prepareStackTrace=_}return(_=m?m.displayName||m.name:"")?$(_):""}function q(m,g){switch(m.tag){case 26:case 27:case 5:return $(m.type);case 16:return $("Lazy");case 13:return m.child!==g&&g!==null?$("Suspense Fallback"):$("Suspense");case 19:return $("SuspenseList");case 0:case 15:return ce(m.type,!1);case 11:return ce(m.type.render,!1);case 1:return ce(m.type,!0);case 31:return $("Activity");default:return""}}function ie(m){try{var g="",_=null;do g+=q(m,_),_=m,m=m.return;while(m);return g}catch(A){return` +`+Be[A].replace(" at new "," at ");return m.displayName&&wt.includes("")&&(wt=wt.replace("",m.displayName)),wt}while(1<=A&&0<=R);break}}}finally{K=!1,Error.prepareStackTrace=_}return(_=m?m.displayName||m.name:"")?$(_):""}function Q(m,g){switch(m.tag){case 26:case 27:case 5:return $(m.type);case 16:return $("Lazy");case 13:return m.child!==g&&g!==null?$("Suspense Fallback"):$("Suspense");case 19:return $("SuspenseList");case 0:case 15:return ce(m.type,!1);case 11:return ce(m.type.render,!1);case 1:return ce(m.type,!0);case 31:return $("Activity");default:return""}}function se(m){try{var g="",_=null;do g+=Q(m,_),_=m,m=m.return;while(m);return g}catch(A){return` Error generating stack: `+A.message+` -`+A.stack}}var te=Object.prototype.hasOwnProperty,he=t.unstable_scheduleCallback,ge=t.unstable_cancelCallback,Z=t.unstable_shouldYield,z=t.unstable_requestPaint,F=t.unstable_now,W=t.unstable_getCurrentPriorityLevel,me=t.unstable_ImmediatePriority,_e=t.unstable_UserBlockingPriority,be=t.unstable_NormalPriority,He=t.unstable_LowPriority,Se=t.unstable_IdlePriority,$e=t.log,Qe=t.unstable_setDisableYieldValue,ye=null,we=null;function Ce(m){if(typeof $e=="function"&&Qe(m),we&&typeof we.setStrictMode=="function")try{we.setStrictMode(ye,m)}catch{}}var Ue=Math.clz32?Math.clz32:Ae,je=Math.log,Ve=Math.LN2;function Ae(m){return m>>>=0,m===0?32:31-(je(m)/Ve|0)|0}var Ze=256,Pe=262144,Xe=4194304;function Fe(m){var g=m&42;if(g!==0)return g;switch(m&-m){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 m&261888;case 262144:case 524288:case 1048576:case 2097152:return m&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return m&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return m}}function Oe(m,g,_){var A=m.pendingLanes;if(A===0)return 0;var R=0,O=m.suspendedLanes,re=m.pingedLanes;m=m.warmLanes;var ke=A&134217727;return ke!==0?(A=ke&~O,A!==0?R=Fe(A):(re&=ke,re!==0?R=Fe(re):_||(_=ke&~m,_!==0&&(R=Fe(_))))):(ke=A&~O,ke!==0?R=Fe(ke):re!==0?R=Fe(re):_||(_=A&~m,_!==0&&(R=Fe(_)))),R===0?0:g!==0&&g!==R&&(g&O)===0&&(O=R&-R,_=g&-g,O>=_||O===32&&(_&4194048)!==0)?g:R}function Me(m,g){return(m.pendingLanes&~(m.suspendedLanes&~m.pingedLanes)&g)===0}function Je(m,g){switch(m){case 1:case 2:case 4:case 8:case 64:return g+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 g+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 yt(){var m=Xe;return Xe<<=1,(Xe&62914560)===0&&(Xe=4194304),m}function Mt(m){for(var g=[],_=0;31>_;_++)g.push(m);return g}function an(m,g){m.pendingLanes|=g,g!==268435456&&(m.suspendedLanes=0,m.pingedLanes=0,m.warmLanes=0)}function Pt(m,g,_,A,R,O){var re=m.pendingLanes;m.pendingLanes=_,m.suspendedLanes=0,m.pingedLanes=0,m.warmLanes=0,m.expiredLanes&=_,m.entangledLanes&=_,m.errorRecoveryDisabledLanes&=_,m.shellSuspendCounter=0;var ke=m.entanglements,Be=m.expirationTimes,ut=m.hiddenUpdates;for(_=re&~_;0<_;){var wt=31-Ue(_),Ct=1<"u")return null;try{return m.activeElement||m.body}catch{return m.body}}var qr=/[\n"\\]/g;function Dn(m){return m.replace(qr,function(g){return"\\"+g.charCodeAt(0).toString(16)+" "})}function _n(m,g,_,A,R,O,re,ke){m.name="",re!=null&&typeof re!="function"&&typeof re!="symbol"&&typeof re!="boolean"?m.type=re:m.removeAttribute("type"),g!=null?re==="number"?(g===0&&m.value===""||m.value!=g)&&(m.value=""+Tn(g)):m.value!==""+Tn(g)&&(m.value=""+Tn(g)):re!=="submit"&&re!=="reset"||m.removeAttribute("value"),g!=null?hi(m,re,Tn(g)):_!=null?hi(m,re,Tn(_)):A!=null&&m.removeAttribute("value"),R==null&&O!=null&&(m.defaultChecked=!!O),R!=null&&(m.checked=R&&typeof R!="function"&&typeof R!="symbol"),ke!=null&&typeof ke!="function"&&typeof ke!="symbol"&&typeof ke!="boolean"?m.name=""+Tn(ke):m.removeAttribute("name")}function Gn(m,g,_,A,R,O,re,ke){if(O!=null&&typeof O!="function"&&typeof O!="symbol"&&typeof O!="boolean"&&(m.type=O),g!=null||_!=null){if(!(O!=="submit"&&O!=="reset"||g!=null)){fn(m);return}_=_!=null?""+Tn(_):"",g=g!=null?""+Tn(g):_,ke||g===m.value||(m.value=g),m.defaultValue=g}A=A??R,A=typeof A!="function"&&typeof A!="symbol"&&!!A,m.checked=ke?m.checked:!!A,m.defaultChecked=!!A,re!=null&&typeof re!="function"&&typeof re!="symbol"&&typeof re!="boolean"&&(m.name=re),fn(m)}function hi(m,g,_){g==="number"&&Gr(m.ownerDocument)===m||m.defaultValue===""+_||(m.defaultValue=""+_)}function mr(m,g,_,A){if(m=m.options,g){g={};for(var R=0;R<_.length;R++)g["$"+_[R]]=!0;for(_=0;_"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Or=!1;if(Li)try{var Cl={};Object.defineProperty(Cl,"passive",{get:function(){Or=!0}}),window.addEventListener("test",Cl,Cl),window.removeEventListener("test",Cl,Cl)}catch{Or=!1}var Ba=null,wi=null,ic=null;function Wr(){if(ic)return ic;var m,g=wi,_=g.length,A,R="value"in Ba?Ba.value:Ba.textContent,O=R.length;for(m=0;m<_&&g[m]===R[m];m++);var re=_-m;for(A=1;A<=re&&g[_-A]===R[O-A];A++);return ic=R.slice(m,1=mx),pI=" ",gI=!1;function bI(m,g){switch(m){case"keyup":return Yae.indexOf(g.keyCode)!==-1;case"keydown":return g.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function xI(m){return m=m.detail,typeof m=="object"&&"data"in m?m.data:null}var up=!1;function Zae(m,g){switch(m){case"compositionend":return xI(g);case"keypress":return g.which!==32?null:(gI=!0,pI);case"textInput":return m=g.data,m===pI&&gI?null:m;default:return null}}function Jae(m,g){if(up)return m==="compositionend"||!IM&&bI(m,g)?(m=Wr(),ic=wi=Ba=null,up=!1,m):null;switch(m){case"paste":return null;case"keypress":if(!(g.ctrlKey||g.altKey||g.metaKey)||g.ctrlKey&&g.altKey){if(g.char&&1=g)return{node:_,offset:g-m};m=A}e:{for(;_;){if(_.nextSibling){_=_.nextSibling;break e}_=_.parentNode}_=void 0}_=kI(_)}}function AI(m,g){return m&&g?m===g?!0:m&&m.nodeType===3?!1:g&&g.nodeType===3?AI(m,g.parentNode):"contains"in m?m.contains(g):m.compareDocumentPosition?!!(m.compareDocumentPosition(g)&16):!1:!1}function TI(m){m=m!=null&&m.ownerDocument!=null&&m.ownerDocument.defaultView!=null?m.ownerDocument.defaultView:window;for(var g=Gr(m.document);g instanceof m.HTMLIFrameElement;){try{var _=typeof g.contentWindow.location.href=="string"}catch{_=!1}if(_)m=g.contentWindow;else break;g=Gr(m.document)}return g}function BM(m){var g=m&&m.nodeName&&m.nodeName.toLowerCase();return g&&(g==="input"&&(m.type==="text"||m.type==="search"||m.type==="tel"||m.type==="url"||m.type==="password")||g==="textarea"||m.contentEditable==="true")}var ose=Li&&"documentMode"in document&&11>=document.documentMode,dp=null,HM=null,bx=null,$M=!1;function EI(m,g,_){var A=_.window===_?_.document:_.nodeType===9?_:_.ownerDocument;$M||dp==null||dp!==Gr(A)||(A=dp,"selectionStart"in A&&BM(A)?A={start:A.selectionStart,end:A.selectionEnd}:(A=(A.ownerDocument&&A.ownerDocument.defaultView||window).getSelection(),A={anchorNode:A.anchorNode,anchorOffset:A.anchorOffset,focusNode:A.focusNode,focusOffset:A.focusOffset}),bx&&gx(bx,A)||(bx=A,A=$w(HM,"onSelect"),0>=re,R-=re,sc=1<<32-Ue(g)+R|_<jn?(Zn=Yt,Yt=null):Zn=Yt.sibling;var cr=mt(tt,Yt,ct[jn],St);if(cr===null){Yt===null&&(Yt=Zn);break}m&&Yt&&cr.alternate===null&&g(tt,Yt),qe=O(cr,qe,jn),lr===null?rn=cr:lr.sibling=cr,lr=cr,Yt=Zn}if(jn===ct.length)return _(tt,Yt),tr&&Zc(tt,jn),rn;if(Yt===null){for(;jnjn?(Zn=Yt,Yt=null):Zn=Yt.sibling;var Vd=mt(tt,Yt,cr.value,St);if(Vd===null){Yt===null&&(Yt=Zn);break}m&&Yt&&Vd.alternate===null&&g(tt,Yt),qe=O(Vd,qe,jn),lr===null?rn=Vd:lr.sibling=Vd,lr=Vd,Yt=Zn}if(cr.done)return _(tt,Yt),tr&&Zc(tt,jn),rn;if(Yt===null){for(;!cr.done;jn++,cr=ct.next())cr=Ct(tt,cr.value,St),cr!==null&&(qe=O(cr,qe,jn),lr===null?rn=cr:lr.sibling=cr,lr=cr);return tr&&Zc(tt,jn),rn}for(Yt=A(Yt);!cr.done;jn++,cr=ct.next())cr=xt(Yt,tt,jn,cr.value,St),cr!==null&&(m&&cr.alternate!==null&&Yt.delete(cr.key===null?jn:cr.key),qe=O(cr,qe,jn),lr===null?rn=cr:lr.sibling=cr,lr=cr);return m&&Yt.forEach(function(Moe){return g(tt,Moe)}),tr&&Zc(tt,jn),rn}function Ar(tt,qe,ct,St){if(typeof ct=="object"&&ct!==null&&ct.type===v&&ct.key===null&&(ct=ct.props.children),typeof ct=="object"&&ct!==null){switch(ct.$$typeof){case p:e:{for(var rn=ct.key;qe!==null;){if(qe.key===rn){if(rn=ct.type,rn===v){if(qe.tag===7){_(tt,qe.sibling),St=R(qe,ct.props.children),St.return=tt,tt=St;break e}}else if(qe.elementType===rn||typeof rn=="object"&&rn!==null&&rn.$$typeof===j&&Nm(rn)===qe.type){_(tt,qe.sibling),St=R(qe,ct.props),Sx(St,ct),St.return=tt,tt=St;break e}_(tt,qe);break}else g(tt,qe);qe=qe.sibling}ct.type===v?(St=ym(ct.props.children,tt.mode,St,ct.key),St.return=tt,tt=St):(St=sw(ct.type,ct.key,ct.props,null,tt.mode,St),Sx(St,ct),St.return=tt,tt=St)}return re(tt);case x:e:{for(rn=ct.key;qe!==null;){if(qe.key===rn)if(qe.tag===4&&qe.stateNode.containerInfo===ct.containerInfo&&qe.stateNode.implementation===ct.implementation){_(tt,qe.sibling),St=R(qe,ct.children||[]),St.return=tt,tt=St;break e}else{_(tt,qe);break}else g(tt,qe);qe=qe.sibling}St=YM(ct,tt.mode,St),St.return=tt,tt=St}return re(tt);case j:return ct=Nm(ct),Ar(tt,qe,ct,St)}if(H(ct))return Wt(tt,qe,ct,St);if(L(ct)){if(rn=L(ct),typeof rn!="function")throw Error(r(150));return ct=rn.call(ct),dn(tt,qe,ct,St)}if(typeof ct.then=="function")return Ar(tt,qe,mw(ct),St);if(ct.$$typeof===N)return Ar(tt,qe,cw(tt,ct),St);fw(tt,ct)}return typeof ct=="string"&&ct!==""||typeof ct=="number"||typeof ct=="bigint"?(ct=""+ct,qe!==null&&qe.tag===6?(_(tt,qe.sibling),St=R(qe,ct),St.return=tt,tt=St):(_(tt,qe),St=XM(ct,tt.mode,St),St.return=tt,tt=St),re(tt)):_(tt,qe)}return function(tt,qe,ct,St){try{_x=0;var rn=Ar(tt,qe,ct,St);return _p=null,rn}catch(Yt){if(Yt===wp||Yt===dw)throw Yt;var lr=ho(29,Yt,null,tt.mode);return lr.lanes=St,lr.return=tt,lr}}}var km=JI(!0),e5=JI(!1),Md=!1;function lA(m){m.updateQueue={baseState:m.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function cA(m,g){m=m.updateQueue,g.updateQueue===m&&(g.updateQueue={baseState:m.baseState,firstBaseUpdate:m.firstBaseUpdate,lastBaseUpdate:m.lastBaseUpdate,shared:m.shared,callbacks:null})}function Ad(m){return{lane:m,tag:0,payload:null,callback:null,next:null}}function Td(m,g,_){var A=m.updateQueue;if(A===null)return null;if(A=A.shared,(pr&2)!==0){var R=A.pending;return R===null?g.next=g:(g.next=R.next,R.next=g),A.pending=g,g=aw(m),OI(m,null,_),g}return iw(m,A,g,_),aw(m)}function Nx(m,g,_){if(g=g.updateQueue,g!==null&&(g=g.shared,(_&4194048)!==0)){var A=g.lanes;A&=m.pendingLanes,_|=A,g.lanes=_,gt(m,_)}}function uA(m,g){var _=m.updateQueue,A=m.alternate;if(A!==null&&(A=A.updateQueue,_===A)){var R=null,O=null;if(_=_.firstBaseUpdate,_!==null){do{var re={lane:_.lane,tag:_.tag,payload:_.payload,callback:null,next:null};O===null?R=O=re:O=O.next=re,_=_.next}while(_!==null);O===null?R=O=g:O=O.next=g}else R=O=g;_={baseState:A.baseState,firstBaseUpdate:R,lastBaseUpdate:O,shared:A.shared,callbacks:A.callbacks},m.updateQueue=_;return}m=_.lastBaseUpdate,m===null?_.firstBaseUpdate=g:m.next=g,_.lastBaseUpdate=g}var dA=!1;function Cx(){if(dA){var m=vp;if(m!==null)throw m}}function kx(m,g,_,A){dA=!1;var R=m.updateQueue;Md=!1;var O=R.firstBaseUpdate,re=R.lastBaseUpdate,ke=R.shared.pending;if(ke!==null){R.shared.pending=null;var Be=ke,ut=Be.next;Be.next=null,re===null?O=ut:re.next=ut,re=Be;var wt=m.alternate;wt!==null&&(wt=wt.updateQueue,ke=wt.lastBaseUpdate,ke!==re&&(ke===null?wt.firstBaseUpdate=ut:ke.next=ut,wt.lastBaseUpdate=Be))}if(O!==null){var Ct=R.baseState;re=0,wt=ut=Be=null,ke=O;do{var mt=ke.lane&-536870913,xt=mt!==ke.lane;if(xt?(Qn&mt)===mt:(A&mt)===mt){mt!==0&&mt===yp&&(dA=!0),wt!==null&&(wt=wt.next={lane:0,tag:ke.tag,payload:ke.payload,callback:null,next:null});e:{var Wt=m,dn=ke;mt=g;var Ar=_;switch(dn.tag){case 1:if(Wt=dn.payload,typeof Wt=="function"){Ct=Wt.call(Ar,Ct,mt);break e}Ct=Wt;break e;case 3:Wt.flags=Wt.flags&-65537|128;case 0:if(Wt=dn.payload,mt=typeof Wt=="function"?Wt.call(Ar,Ct,mt):Wt,mt==null)break e;Ct=h({},Ct,mt);break e;case 2:Md=!0}}mt=ke.callback,mt!==null&&(m.flags|=64,xt&&(m.flags|=8192),xt=R.callbacks,xt===null?R.callbacks=[mt]:xt.push(mt))}else xt={lane:mt,tag:ke.tag,payload:ke.payload,callback:ke.callback,next:null},wt===null?(ut=wt=xt,Be=Ct):wt=wt.next=xt,re|=mt;if(ke=ke.next,ke===null){if(ke=R.shared.pending,ke===null)break;xt=ke,ke=xt.next,xt.next=null,R.lastBaseUpdate=xt,R.shared.pending=null}}while(!0);wt===null&&(Be=Ct),R.baseState=Be,R.firstBaseUpdate=ut,R.lastBaseUpdate=wt,O===null&&(R.shared.lanes=0),Rd|=re,m.lanes=re,m.memoizedState=Ct}}function t5(m,g){if(typeof m!="function")throw Error(r(191,m));m.call(g)}function n5(m,g){var _=m.callbacks;if(_!==null)for(m.callbacks=null,m=0;m<_.length;m++)t5(_[m],g)}var Sp=V(null),pw=V(0);function r5(m,g){m=cu,ne(pw,m),ne(Sp,g),cu=m|g.baseLanes}function hA(){ne(pw,cu),ne(Sp,Sp.current)}function mA(){cu=pw.current,Y(Sp),Y(pw)}var mo=V(null),$o=null;function Ed(m){var g=m.alternate;ne(Oi,Oi.current&1),ne(mo,m),$o===null&&(g===null||Sp.current!==null||g.memoizedState!==null)&&($o=m)}function fA(m){ne(Oi,Oi.current),ne(mo,m),$o===null&&($o=m)}function i5(m){m.tag===22?(ne(Oi,Oi.current),ne(mo,m),$o===null&&($o=m)):Pd()}function Pd(){ne(Oi,Oi.current),ne(mo,mo.current)}function fo(m){Y(mo),$o===m&&($o=null),Y(Oi)}var Oi=V(0);function gw(m){for(var g=m;g!==null;){if(g.tag===13){var _=g.memoizedState;if(_!==null&&(_=_.dehydrated,_===null||vT(_)||wT(_)))return g}else if(g.tag===19&&(g.memoizedProps.revealOrder==="forwards"||g.memoizedProps.revealOrder==="backwards"||g.memoizedProps.revealOrder==="unstable_legacy-backwards"||g.memoizedProps.revealOrder==="together")){if((g.flags&128)!==0)return g}else if(g.child!==null){g.child.return=g,g=g.child;continue}if(g===m)break;for(;g.sibling===null;){if(g.return===null||g.return===m)return null;g=g.return}g.sibling.return=g.return,g=g.sibling}return null}var tu=0,En=null,kr=null,Wi=null,bw=!1,Np=!1,Mm=!1,xw=0,Mx=0,Cp=null,bse=0;function Si(){throw Error(r(321))}function pA(m,g){if(g===null)return!1;for(var _=0;_O?O:8;var re=G.T,ke={};G.T=ke,EA(m,!1,g,_);try{var Be=R(),ut=G.S;if(ut!==null&&ut(ke,Be),Be!==null&&typeof Be=="object"&&typeof Be.then=="function"){var wt=gse(Be,A);Tx(m,g,wt,bo(m))}else Tx(m,g,A,bo(m))}catch(Ct){Tx(m,g,{then:function(){},status:"rejected",reason:Ct},bo())}finally{I.p=O,re!==null&&ke.types!==null&&(re.types=ke.types),G.T=re}}function _se(){}function AA(m,g,_,A){if(m.tag!==5)throw Error(r(476));var R=R5(m).queue;D5(m,R,g,K,_===null?_se:function(){return F5(m),_(A)})}function R5(m){var g=m.memoizedState;if(g!==null)return g;g={memoizedState:K,baseState:K,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:nu,lastRenderedState:K},next:null};var _={};return g.next={memoizedState:_,baseState:_,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:nu,lastRenderedState:_},next:null},m.memoizedState=g,m=m.alternate,m!==null&&(m.memoizedState=g),g}function F5(m){var g=R5(m);g.next===null&&(g=m.alternate.memoizedState),Tx(m,g.next.queue,{},bo())}function TA(){return $a(qx)}function L5(){return Ii().memoizedState}function O5(){return Ii().memoizedState}function Sse(m){for(var g=m.return;g!==null;){switch(g.tag){case 24:case 3:var _=bo();m=Ad(_);var A=Td(g,m,_);A!==null&&(qs(A,g,_),Nx(A,g,_)),g={cache:iA()},m.payload=g;return}g=g.return}}function Nse(m,g,_){var A=bo();_={lane:A,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null},Nw(m)?z5(g,_):(_=WM(m,g,_,A),_!==null&&(qs(_,m,A),U5(_,g,A)))}function I5(m,g,_){var A=bo();Tx(m,g,_,A)}function Tx(m,g,_,A){var R={lane:A,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null};if(Nw(m))z5(g,R);else{var O=m.alternate;if(m.lanes===0&&(O===null||O.lanes===0)&&(O=g.lastRenderedReducer,O!==null))try{var re=g.lastRenderedState,ke=O(re,_);if(R.hasEagerState=!0,R.eagerState=ke,uo(ke,re))return iw(m,g,R,0),Ir===null&&rw(),!1}catch{}if(_=WM(m,g,R,A),_!==null)return qs(_,m,A),U5(_,g,A),!0}return!1}function EA(m,g,_,A){if(A={lane:2,revertLane:lT(),gesture:null,action:A,hasEagerState:!1,eagerState:null,next:null},Nw(m)){if(g)throw Error(r(479))}else g=WM(m,_,A,2),g!==null&&qs(g,m,2)}function Nw(m){var g=m.alternate;return m===En||g!==null&&g===En}function z5(m,g){Np=bw=!0;var _=m.pending;_===null?g.next=g:(g.next=_.next,_.next=g),m.pending=g}function U5(m,g,_){if((_&4194048)!==0){var A=g.lanes;A&=m.pendingLanes,_|=A,g.lanes=_,gt(m,_)}}var Ex={readContext:$a,use:vw,useCallback:Si,useContext:Si,useEffect:Si,useImperativeHandle:Si,useLayoutEffect:Si,useInsertionEffect:Si,useMemo:Si,useReducer:Si,useRef:Si,useState:Si,useDebugValue:Si,useDeferredValue:Si,useTransition:Si,useSyncExternalStore:Si,useId:Si,useHostTransitionStatus:Si,useFormState:Si,useActionState:Si,useOptimistic:Si,useMemoCache:Si,useCacheRefresh:Si};Ex.useEffectEvent=Si;var B5={readContext:$a,use:vw,useCallback:function(m,g){return ks().memoizedState=[m,g===void 0?null:g],m},useContext:$a,useEffect:N5,useImperativeHandle:function(m,g,_){_=_!=null?_.concat([m]):null,_w(4194308,4,A5.bind(null,g,m),_)},useLayoutEffect:function(m,g){return _w(4194308,4,m,g)},useInsertionEffect:function(m,g){_w(4,2,m,g)},useMemo:function(m,g){var _=ks();g=g===void 0?null:g;var A=m();if(Mm){Ce(!0);try{m()}finally{Ce(!1)}}return _.memoizedState=[A,g],A},useReducer:function(m,g,_){var A=ks();if(_!==void 0){var R=_(g);if(Mm){Ce(!0);try{_(g)}finally{Ce(!1)}}}else R=g;return A.memoizedState=A.baseState=R,m={pending:null,lanes:0,dispatch:null,lastRenderedReducer:m,lastRenderedState:R},A.queue=m,m=m.dispatch=Nse.bind(null,En,m),[A.memoizedState,m]},useRef:function(m){var g=ks();return m={current:m},g.memoizedState=m},useState:function(m){m=SA(m);var g=m.queue,_=I5.bind(null,En,g);return g.dispatch=_,[m.memoizedState,_]},useDebugValue:kA,useDeferredValue:function(m,g){var _=ks();return MA(_,m,g)},useTransition:function(){var m=SA(!1);return m=D5.bind(null,En,m.queue,!0,!1),ks().memoizedState=m,[!1,m]},useSyncExternalStore:function(m,g,_){var A=En,R=ks();if(tr){if(_===void 0)throw Error(r(407));_=_()}else{if(_=g(),Ir===null)throw Error(r(349));(Qn&127)!==0||l5(A,g,_)}R.memoizedState=_;var O={value:_,getSnapshot:g};return R.queue=O,N5(u5.bind(null,A,O,m),[m]),A.flags|=2048,kp(9,{destroy:void 0},c5.bind(null,A,O,_,g),null),_},useId:function(){var m=ks(),g=Ir.identifierPrefix;if(tr){var _=oc,A=sc;_=(A&~(1<<32-Ue(A)-1)).toString(32)+_,g="_"+g+"R_"+_,_=xw++,0<_&&(g+="H"+_.toString(32)),g+="_"}else _=bse++,g="_"+g+"r_"+_.toString(32)+"_";return m.memoizedState=g},useHostTransitionStatus:TA,useFormState:y5,useActionState:y5,useOptimistic:function(m){var g=ks();g.memoizedState=g.baseState=m;var _={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return g.queue=_,g=EA.bind(null,En,!0,_),_.dispatch=g,[m,g]},useMemoCache:vA,useCacheRefresh:function(){return ks().memoizedState=Sse.bind(null,En)},useEffectEvent:function(m){var g=ks(),_={impl:m};return g.memoizedState=_,function(){if((pr&2)!==0)throw Error(r(440));return _.impl.apply(void 0,arguments)}}},PA={readContext:$a,use:vw,useCallback:E5,useContext:$a,useEffect:CA,useImperativeHandle:T5,useInsertionEffect:k5,useLayoutEffect:M5,useMemo:P5,useReducer:ww,useRef:S5,useState:function(){return ww(nu)},useDebugValue:kA,useDeferredValue:function(m,g){var _=Ii();return j5(_,kr.memoizedState,m,g)},useTransition:function(){var m=ww(nu)[0],g=Ii().memoizedState;return[typeof m=="boolean"?m:Ax(m),g]},useSyncExternalStore:o5,useId:L5,useHostTransitionStatus:TA,useFormState:v5,useActionState:v5,useOptimistic:function(m,g){var _=Ii();return m5(_,kr,m,g)},useMemoCache:vA,useCacheRefresh:O5};PA.useEffectEvent=C5;var H5={readContext:$a,use:vw,useCallback:E5,useContext:$a,useEffect:CA,useImperativeHandle:T5,useInsertionEffect:k5,useLayoutEffect:M5,useMemo:P5,useReducer:_A,useRef:S5,useState:function(){return _A(nu)},useDebugValue:kA,useDeferredValue:function(m,g){var _=Ii();return kr===null?MA(_,m,g):j5(_,kr.memoizedState,m,g)},useTransition:function(){var m=_A(nu)[0],g=Ii().memoizedState;return[typeof m=="boolean"?m:Ax(m),g]},useSyncExternalStore:o5,useId:L5,useHostTransitionStatus:TA,useFormState:_5,useActionState:_5,useOptimistic:function(m,g){var _=Ii();return kr!==null?m5(_,kr,m,g):(_.baseState=m,[m,_.queue.dispatch])},useMemoCache:vA,useCacheRefresh:O5};H5.useEffectEvent=C5;function jA(m,g,_,A){g=m.memoizedState,_=_(A,g),_=_==null?g:h({},g,_),m.memoizedState=_,m.lanes===0&&(m.updateQueue.baseState=_)}var DA={enqueueSetState:function(m,g,_){m=m._reactInternals;var A=bo(),R=Ad(A);R.payload=g,_!=null&&(R.callback=_),g=Td(m,R,A),g!==null&&(qs(g,m,A),Nx(g,m,A))},enqueueReplaceState:function(m,g,_){m=m._reactInternals;var A=bo(),R=Ad(A);R.tag=1,R.payload=g,_!=null&&(R.callback=_),g=Td(m,R,A),g!==null&&(qs(g,m,A),Nx(g,m,A))},enqueueForceUpdate:function(m,g){m=m._reactInternals;var _=bo(),A=Ad(_);A.tag=2,g!=null&&(A.callback=g),g=Td(m,A,_),g!==null&&(qs(g,m,_),Nx(g,m,_))}};function $5(m,g,_,A,R,O,re){return m=m.stateNode,typeof m.shouldComponentUpdate=="function"?m.shouldComponentUpdate(A,O,re):g.prototype&&g.prototype.isPureReactComponent?!gx(_,A)||!gx(R,O):!0}function V5(m,g,_,A){m=g.state,typeof g.componentWillReceiveProps=="function"&&g.componentWillReceiveProps(_,A),typeof g.UNSAFE_componentWillReceiveProps=="function"&&g.UNSAFE_componentWillReceiveProps(_,A),g.state!==m&&DA.enqueueReplaceState(g,g.state,null)}function Am(m,g){var _=g;if("ref"in g){_={};for(var A in g)A!=="ref"&&(_[A]=g[A])}if(m=m.defaultProps){_===g&&(_=h({},_));for(var R in m)_[R]===void 0&&(_[R]=m[R])}return _}function G5(m){nw(m)}function q5(m){console.error(m)}function W5(m){nw(m)}function Cw(m,g){try{var _=m.onUncaughtError;_(g.value,{componentStack:g.stack})}catch(A){setTimeout(function(){throw A})}}function K5(m,g,_){try{var A=m.onCaughtError;A(_.value,{componentStack:_.stack,errorBoundary:g.tag===1?g.stateNode:null})}catch(R){setTimeout(function(){throw R})}}function RA(m,g,_){return _=Ad(_),_.tag=3,_.payload={element:null},_.callback=function(){Cw(m,g)},_}function X5(m){return m=Ad(m),m.tag=3,m}function Y5(m,g,_,A){var R=_.type.getDerivedStateFromError;if(typeof R=="function"){var O=A.value;m.payload=function(){return R(O)},m.callback=function(){K5(g,_,A)}}var re=_.stateNode;re!==null&&typeof re.componentDidCatch=="function"&&(m.callback=function(){K5(g,_,A),typeof R!="function"&&(Fd===null?Fd=new Set([this]):Fd.add(this));var ke=A.stack;this.componentDidCatch(A.value,{componentStack:ke!==null?ke:""})})}function Cse(m,g,_,A,R){if(_.flags|=32768,A!==null&&typeof A=="object"&&typeof A.then=="function"){if(g=_.alternate,g!==null&&xp(g,_,R,!0),_=mo.current,_!==null){switch(_.tag){case 31:case 13:return $o===null?Ow():_.alternate===null&&Ni===0&&(Ni=3),_.flags&=-257,_.flags|=65536,_.lanes=R,A===hw?_.flags|=16384:(g=_.updateQueue,g===null?_.updateQueue=new Set([A]):g.add(A),aT(m,A,R)),!1;case 22:return _.flags|=65536,A===hw?_.flags|=16384:(g=_.updateQueue,g===null?(g={transitions:null,markerInstances:null,retryQueue:new Set([A])},_.updateQueue=g):(_=g.retryQueue,_===null?g.retryQueue=new Set([A]):_.add(A)),aT(m,A,R)),!1}throw Error(r(435,_.tag))}return aT(m,A,R),Ow(),!1}if(tr)return g=mo.current,g!==null?((g.flags&65536)===0&&(g.flags|=256),g.flags|=65536,g.lanes=R,A!==JM&&(m=Error(r(422),{cause:A}),yx(zo(m,_)))):(A!==JM&&(g=Error(r(423),{cause:A}),yx(zo(g,_))),m=m.current.alternate,m.flags|=65536,R&=-R,m.lanes|=R,A=zo(A,_),R=RA(m.stateNode,A,R),uA(m,R),Ni!==4&&(Ni=2)),!1;var O=Error(r(520),{cause:A});if(O=zo(O,_),Ix===null?Ix=[O]:Ix.push(O),Ni!==4&&(Ni=2),g===null)return!0;A=zo(A,_),_=g;do{switch(_.tag){case 3:return _.flags|=65536,m=R&-R,_.lanes|=m,m=RA(_.stateNode,A,m),uA(_,m),!1;case 1:if(g=_.type,O=_.stateNode,(_.flags&128)===0&&(typeof g.getDerivedStateFromError=="function"||O!==null&&typeof O.componentDidCatch=="function"&&(Fd===null||!Fd.has(O))))return _.flags|=65536,R&=-R,_.lanes|=R,R=X5(R),Y5(R,m,_,A),uA(_,R),!1}_=_.return}while(_!==null);return!1}var FA=Error(r(461)),Ki=!1;function Va(m,g,_,A){g.child=m===null?e5(g,null,_,A):km(g,m.child,_,A)}function Q5(m,g,_,A,R){_=_.render;var O=g.ref;if("ref"in A){var re={};for(var ke in A)ke!=="ref"&&(re[ke]=A[ke])}else re=A;return _m(g),A=gA(m,g,_,re,O,R),ke=bA(),m!==null&&!Ki?(xA(m,g,R),ru(m,g,R)):(tr&&ke&&QM(g),g.flags|=1,Va(m,g,A,R),g.child)}function Z5(m,g,_,A,R){if(m===null){var O=_.type;return typeof O=="function"&&!KM(O)&&O.defaultProps===void 0&&_.compare===null?(g.tag=15,g.type=O,J5(m,g,O,A,R)):(m=sw(_.type,null,A,g,g.mode,R),m.ref=g.ref,m.return=g,g.child=m)}if(O=m.child,!$A(m,R)){var re=O.memoizedProps;if(_=_.compare,_=_!==null?_:gx,_(re,A)&&m.ref===g.ref)return ru(m,g,R)}return g.flags|=1,m=Qc(O,A),m.ref=g.ref,m.return=g,g.child=m}function J5(m,g,_,A,R){if(m!==null){var O=m.memoizedProps;if(gx(O,A)&&m.ref===g.ref)if(Ki=!1,g.pendingProps=A=O,$A(m,R))(m.flags&131072)!==0&&(Ki=!0);else return g.lanes=m.lanes,ru(m,g,R)}return LA(m,g,_,A,R)}function ez(m,g,_,A){var R=A.children,O=m!==null?m.memoizedState:null;if(m===null&&g.stateNode===null&&(g.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),A.mode==="hidden"){if((g.flags&128)!==0){if(O=O!==null?O.baseLanes|_:_,m!==null){for(A=g.child=m.child,R=0;A!==null;)R=R|A.lanes|A.childLanes,A=A.sibling;A=R&~O}else A=0,g.child=null;return tz(m,g,O,_,A)}if((_&536870912)!==0)g.memoizedState={baseLanes:0,cachePool:null},m!==null&&uw(g,O!==null?O.cachePool:null),O!==null?r5(g,O):hA(),i5(g);else return A=g.lanes=536870912,tz(m,g,O!==null?O.baseLanes|_:_,_,A)}else O!==null?(uw(g,O.cachePool),r5(g,O),Pd(),g.memoizedState=null):(m!==null&&uw(g,null),hA(),Pd());return Va(m,g,R,_),g.child}function Px(m,g){return m!==null&&m.tag===22||g.stateNode!==null||(g.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),g.sibling}function tz(m,g,_,A,R){var O=sA();return O=O===null?null:{parent:qi._currentValue,pool:O},g.memoizedState={baseLanes:_,cachePool:O},m!==null&&uw(g,null),hA(),i5(g),m!==null&&xp(m,g,A,!0),g.childLanes=R,null}function kw(m,g){return g=Aw({mode:g.mode,children:g.children},m.mode),g.ref=m.ref,m.child=g,g.return=m,g}function nz(m,g,_){return km(g,m.child,null,_),m=kw(g,g.pendingProps),m.flags|=2,fo(g),g.memoizedState=null,m}function kse(m,g,_){var A=g.pendingProps,R=(g.flags&128)!==0;if(g.flags&=-129,m===null){if(tr){if(A.mode==="hidden")return m=kw(g,A),g.lanes=536870912,Px(null,m);if(fA(g),(m=ei)?(m=fU(m,Ho),m=m!==null&&m.data==="&"?m:null,m!==null&&(g.memoizedState={dehydrated:m,treeContext:Sd!==null?{id:sc,overflow:oc}:null,retryLane:536870912,hydrationErrors:null},_=zI(m),_.return=g,g.child=_,Ha=g,ei=null)):m=null,m===null)throw Cd(g);return g.lanes=536870912,null}return kw(g,A)}var O=m.memoizedState;if(O!==null){var re=O.dehydrated;if(fA(g),R)if(g.flags&256)g.flags&=-257,g=nz(m,g,_);else if(g.memoizedState!==null)g.child=m.child,g.flags|=128,g=null;else throw Error(r(558));else if(Ki||xp(m,g,_,!1),R=(_&m.childLanes)!==0,Ki||R){if(A=Ir,A!==null&&(re=Qt(A,_),re!==0&&re!==O.retryLane))throw O.retryLane=re,xm(m,re),qs(A,m,re),FA;Ow(),g=nz(m,g,_)}else m=O.treeContext,ei=Vo(re.nextSibling),Ha=g,tr=!0,Nd=null,Ho=!1,m!==null&&HI(g,m),g=kw(g,A),g.flags|=4096;return g}return m=Qc(m.child,{mode:A.mode,children:A.children}),m.ref=g.ref,g.child=m,m.return=g,m}function Mw(m,g){var _=g.ref;if(_===null)m!==null&&m.ref!==null&&(g.flags|=4194816);else{if(typeof _!="function"&&typeof _!="object")throw Error(r(284));(m===null||m.ref!==_)&&(g.flags|=4194816)}}function LA(m,g,_,A,R){return _m(g),_=gA(m,g,_,A,void 0,R),A=bA(),m!==null&&!Ki?(xA(m,g,R),ru(m,g,R)):(tr&&A&&QM(g),g.flags|=1,Va(m,g,_,R),g.child)}function rz(m,g,_,A,R,O){return _m(g),g.updateQueue=null,_=s5(g,A,_,R),a5(m),A=bA(),m!==null&&!Ki?(xA(m,g,O),ru(m,g,O)):(tr&&A&&QM(g),g.flags|=1,Va(m,g,_,O),g.child)}function iz(m,g,_,A,R){if(_m(g),g.stateNode===null){var O=fp,re=_.contextType;typeof re=="object"&&re!==null&&(O=$a(re)),O=new _(A,O),g.memoizedState=O.state!==null&&O.state!==void 0?O.state:null,O.updater=DA,g.stateNode=O,O._reactInternals=g,O=g.stateNode,O.props=A,O.state=g.memoizedState,O.refs={},lA(g),re=_.contextType,O.context=typeof re=="object"&&re!==null?$a(re):fp,O.state=g.memoizedState,re=_.getDerivedStateFromProps,typeof re=="function"&&(jA(g,_,re,A),O.state=g.memoizedState),typeof _.getDerivedStateFromProps=="function"||typeof O.getSnapshotBeforeUpdate=="function"||typeof O.UNSAFE_componentWillMount!="function"&&typeof O.componentWillMount!="function"||(re=O.state,typeof O.componentWillMount=="function"&&O.componentWillMount(),typeof O.UNSAFE_componentWillMount=="function"&&O.UNSAFE_componentWillMount(),re!==O.state&&DA.enqueueReplaceState(O,O.state,null),kx(g,A,O,R),Cx(),O.state=g.memoizedState),typeof O.componentDidMount=="function"&&(g.flags|=4194308),A=!0}else if(m===null){O=g.stateNode;var ke=g.memoizedProps,Be=Am(_,ke);O.props=Be;var ut=O.context,wt=_.contextType;re=fp,typeof wt=="object"&&wt!==null&&(re=$a(wt));var Ct=_.getDerivedStateFromProps;wt=typeof Ct=="function"||typeof O.getSnapshotBeforeUpdate=="function",ke=g.pendingProps!==ke,wt||typeof O.UNSAFE_componentWillReceiveProps!="function"&&typeof O.componentWillReceiveProps!="function"||(ke||ut!==re)&&V5(g,O,A,re),Md=!1;var mt=g.memoizedState;O.state=mt,kx(g,A,O,R),Cx(),ut=g.memoizedState,ke||mt!==ut||Md?(typeof Ct=="function"&&(jA(g,_,Ct,A),ut=g.memoizedState),(Be=Md||$5(g,_,Be,A,mt,ut,re))?(wt||typeof O.UNSAFE_componentWillMount!="function"&&typeof O.componentWillMount!="function"||(typeof O.componentWillMount=="function"&&O.componentWillMount(),typeof O.UNSAFE_componentWillMount=="function"&&O.UNSAFE_componentWillMount()),typeof O.componentDidMount=="function"&&(g.flags|=4194308)):(typeof O.componentDidMount=="function"&&(g.flags|=4194308),g.memoizedProps=A,g.memoizedState=ut),O.props=A,O.state=ut,O.context=re,A=Be):(typeof O.componentDidMount=="function"&&(g.flags|=4194308),A=!1)}else{O=g.stateNode,cA(m,g),re=g.memoizedProps,wt=Am(_,re),O.props=wt,Ct=g.pendingProps,mt=O.context,ut=_.contextType,Be=fp,typeof ut=="object"&&ut!==null&&(Be=$a(ut)),ke=_.getDerivedStateFromProps,(ut=typeof ke=="function"||typeof O.getSnapshotBeforeUpdate=="function")||typeof O.UNSAFE_componentWillReceiveProps!="function"&&typeof O.componentWillReceiveProps!="function"||(re!==Ct||mt!==Be)&&V5(g,O,A,Be),Md=!1,mt=g.memoizedState,O.state=mt,kx(g,A,O,R),Cx();var xt=g.memoizedState;re!==Ct||mt!==xt||Md||m!==null&&m.dependencies!==null&&lw(m.dependencies)?(typeof ke=="function"&&(jA(g,_,ke,A),xt=g.memoizedState),(wt=Md||$5(g,_,wt,A,mt,xt,Be)||m!==null&&m.dependencies!==null&&lw(m.dependencies))?(ut||typeof O.UNSAFE_componentWillUpdate!="function"&&typeof O.componentWillUpdate!="function"||(typeof O.componentWillUpdate=="function"&&O.componentWillUpdate(A,xt,Be),typeof O.UNSAFE_componentWillUpdate=="function"&&O.UNSAFE_componentWillUpdate(A,xt,Be)),typeof O.componentDidUpdate=="function"&&(g.flags|=4),typeof O.getSnapshotBeforeUpdate=="function"&&(g.flags|=1024)):(typeof O.componentDidUpdate!="function"||re===m.memoizedProps&&mt===m.memoizedState||(g.flags|=4),typeof O.getSnapshotBeforeUpdate!="function"||re===m.memoizedProps&&mt===m.memoizedState||(g.flags|=1024),g.memoizedProps=A,g.memoizedState=xt),O.props=A,O.state=xt,O.context=Be,A=wt):(typeof O.componentDidUpdate!="function"||re===m.memoizedProps&&mt===m.memoizedState||(g.flags|=4),typeof O.getSnapshotBeforeUpdate!="function"||re===m.memoizedProps&&mt===m.memoizedState||(g.flags|=1024),A=!1)}return O=A,Mw(m,g),A=(g.flags&128)!==0,O||A?(O=g.stateNode,_=A&&typeof _.getDerivedStateFromError!="function"?null:O.render(),g.flags|=1,m!==null&&A?(g.child=km(g,m.child,null,R),g.child=km(g,null,_,R)):Va(m,g,_,R),g.memoizedState=O.state,m=g.child):m=ru(m,g,R),m}function az(m,g,_,A){return vm(),g.flags|=256,Va(m,g,_,A),g.child}var OA={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function IA(m){return{baseLanes:m,cachePool:KI()}}function zA(m,g,_){return m=m!==null?m.childLanes&~_:0,g&&(m|=go),m}function sz(m,g,_){var A=g.pendingProps,R=!1,O=(g.flags&128)!==0,re;if((re=O)||(re=m!==null&&m.memoizedState===null?!1:(Oi.current&2)!==0),re&&(R=!0,g.flags&=-129),re=(g.flags&32)!==0,g.flags&=-33,m===null){if(tr){if(R?Ed(g):Pd(),(m=ei)?(m=fU(m,Ho),m=m!==null&&m.data!=="&"?m:null,m!==null&&(g.memoizedState={dehydrated:m,treeContext:Sd!==null?{id:sc,overflow:oc}:null,retryLane:536870912,hydrationErrors:null},_=zI(m),_.return=g,g.child=_,Ha=g,ei=null)):m=null,m===null)throw Cd(g);return wT(m)?g.lanes=32:g.lanes=536870912,null}var ke=A.children;return A=A.fallback,R?(Pd(),R=g.mode,ke=Aw({mode:"hidden",children:ke},R),A=ym(A,R,_,null),ke.return=g,A.return=g,ke.sibling=A,g.child=ke,A=g.child,A.memoizedState=IA(_),A.childLanes=zA(m,re,_),g.memoizedState=OA,Px(null,A)):(Ed(g),UA(g,ke))}var Be=m.memoizedState;if(Be!==null&&(ke=Be.dehydrated,ke!==null)){if(O)g.flags&256?(Ed(g),g.flags&=-257,g=BA(m,g,_)):g.memoizedState!==null?(Pd(),g.child=m.child,g.flags|=128,g=null):(Pd(),ke=A.fallback,R=g.mode,A=Aw({mode:"visible",children:A.children},R),ke=ym(ke,R,_,null),ke.flags|=2,A.return=g,ke.return=g,A.sibling=ke,g.child=A,km(g,m.child,null,_),A=g.child,A.memoizedState=IA(_),A.childLanes=zA(m,re,_),g.memoizedState=OA,g=Px(null,A));else if(Ed(g),wT(ke)){if(re=ke.nextSibling&&ke.nextSibling.dataset,re)var ut=re.dgst;re=ut,A=Error(r(419)),A.stack="",A.digest=re,yx({value:A,source:null,stack:null}),g=BA(m,g,_)}else if(Ki||xp(m,g,_,!1),re=(_&m.childLanes)!==0,Ki||re){if(re=Ir,re!==null&&(A=Qt(re,_),A!==0&&A!==Be.retryLane))throw Be.retryLane=A,xm(m,A),qs(re,m,A),FA;vT(ke)||Ow(),g=BA(m,g,_)}else vT(ke)?(g.flags|=192,g.child=m.child,g=null):(m=Be.treeContext,ei=Vo(ke.nextSibling),Ha=g,tr=!0,Nd=null,Ho=!1,m!==null&&HI(g,m),g=UA(g,A.children),g.flags|=4096);return g}return R?(Pd(),ke=A.fallback,R=g.mode,Be=m.child,ut=Be.sibling,A=Qc(Be,{mode:"hidden",children:A.children}),A.subtreeFlags=Be.subtreeFlags&65011712,ut!==null?ke=Qc(ut,ke):(ke=ym(ke,R,_,null),ke.flags|=2),ke.return=g,A.return=g,A.sibling=ke,g.child=A,Px(null,A),A=g.child,ke=m.child.memoizedState,ke===null?ke=IA(_):(R=ke.cachePool,R!==null?(Be=qi._currentValue,R=R.parent!==Be?{parent:Be,pool:Be}:R):R=KI(),ke={baseLanes:ke.baseLanes|_,cachePool:R}),A.memoizedState=ke,A.childLanes=zA(m,re,_),g.memoizedState=OA,Px(m.child,A)):(Ed(g),_=m.child,m=_.sibling,_=Qc(_,{mode:"visible",children:A.children}),_.return=g,_.sibling=null,m!==null&&(re=g.deletions,re===null?(g.deletions=[m],g.flags|=16):re.push(m)),g.child=_,g.memoizedState=null,_)}function UA(m,g){return g=Aw({mode:"visible",children:g},m.mode),g.return=m,m.child=g}function Aw(m,g){return m=ho(22,m,null,g),m.lanes=0,m}function BA(m,g,_){return km(g,m.child,null,_),m=UA(g,g.pendingProps.children),m.flags|=2,g.memoizedState=null,m}function oz(m,g,_){m.lanes|=g;var A=m.alternate;A!==null&&(A.lanes|=g),nA(m.return,g,_)}function HA(m,g,_,A,R,O){var re=m.memoizedState;re===null?m.memoizedState={isBackwards:g,rendering:null,renderingStartTime:0,last:A,tail:_,tailMode:R,treeForkCount:O}:(re.isBackwards=g,re.rendering=null,re.renderingStartTime=0,re.last=A,re.tail=_,re.tailMode=R,re.treeForkCount=O)}function lz(m,g,_){var A=g.pendingProps,R=A.revealOrder,O=A.tail;A=A.children;var re=Oi.current,ke=(re&2)!==0;if(ke?(re=re&1|2,g.flags|=128):re&=1,ne(Oi,re),Va(m,g,A,_),A=tr?xx:0,!ke&&m!==null&&(m.flags&128)!==0)e:for(m=g.child;m!==null;){if(m.tag===13)m.memoizedState!==null&&oz(m,_,g);else if(m.tag===19)oz(m,_,g);else if(m.child!==null){m.child.return=m,m=m.child;continue}if(m===g)break e;for(;m.sibling===null;){if(m.return===null||m.return===g)break e;m=m.return}m.sibling.return=m.return,m=m.sibling}switch(R){case"forwards":for(_=g.child,R=null;_!==null;)m=_.alternate,m!==null&&gw(m)===null&&(R=_),_=_.sibling;_=R,_===null?(R=g.child,g.child=null):(R=_.sibling,_.sibling=null),HA(g,!1,R,_,O,A);break;case"backwards":case"unstable_legacy-backwards":for(_=null,R=g.child,g.child=null;R!==null;){if(m=R.alternate,m!==null&&gw(m)===null){g.child=R;break}m=R.sibling,R.sibling=_,_=R,R=m}HA(g,!0,_,null,O,A);break;case"together":HA(g,!1,null,null,void 0,A);break;default:g.memoizedState=null}return g.child}function ru(m,g,_){if(m!==null&&(g.dependencies=m.dependencies),Rd|=g.lanes,(_&g.childLanes)===0)if(m!==null){if(xp(m,g,_,!1),(_&g.childLanes)===0)return null}else return null;if(m!==null&&g.child!==m.child)throw Error(r(153));if(g.child!==null){for(m=g.child,_=Qc(m,m.pendingProps),g.child=_,_.return=g;m.sibling!==null;)m=m.sibling,_=_.sibling=Qc(m,m.pendingProps),_.return=g;_.sibling=null}return g.child}function $A(m,g){return(m.lanes&g)!==0?!0:(m=m.dependencies,!!(m!==null&&lw(m)))}function Mse(m,g,_){switch(g.tag){case 3:Re(g,g.stateNode.containerInfo),kd(g,qi,m.memoizedState.cache),vm();break;case 27:case 5:le(g);break;case 4:Re(g,g.stateNode.containerInfo);break;case 10:kd(g,g.type,g.memoizedProps.value);break;case 31:if(g.memoizedState!==null)return g.flags|=128,fA(g),null;break;case 13:var A=g.memoizedState;if(A!==null)return A.dehydrated!==null?(Ed(g),g.flags|=128,null):(_&g.child.childLanes)!==0?sz(m,g,_):(Ed(g),m=ru(m,g,_),m!==null?m.sibling:null);Ed(g);break;case 19:var R=(m.flags&128)!==0;if(A=(_&g.childLanes)!==0,A||(xp(m,g,_,!1),A=(_&g.childLanes)!==0),R){if(A)return lz(m,g,_);g.flags|=128}if(R=g.memoizedState,R!==null&&(R.rendering=null,R.tail=null,R.lastEffect=null),ne(Oi,Oi.current),A)break;return null;case 22:return g.lanes=0,ez(m,g,_,g.pendingProps);case 24:kd(g,qi,m.memoizedState.cache)}return ru(m,g,_)}function cz(m,g,_){if(m!==null)if(m.memoizedProps!==g.pendingProps)Ki=!0;else{if(!$A(m,_)&&(g.flags&128)===0)return Ki=!1,Mse(m,g,_);Ki=(m.flags&131072)!==0}else Ki=!1,tr&&(g.flags&1048576)!==0&&BI(g,xx,g.index);switch(g.lanes=0,g.tag){case 16:e:{var A=g.pendingProps;if(m=Nm(g.elementType),g.type=m,typeof m=="function")KM(m)?(A=Am(m,A),g.tag=1,g=iz(null,g,m,A,_)):(g.tag=0,g=LA(null,g,m,A,_));else{if(m!=null){var R=m.$$typeof;if(R===M){g.tag=11,g=Q5(null,g,m,A,_);break e}else if(R===C){g.tag=14,g=Z5(null,g,m,A,_);break e}}throw g=D(m)||m,Error(r(306,g,""))}}return g;case 0:return LA(m,g,g.type,g.pendingProps,_);case 1:return A=g.type,R=Am(A,g.pendingProps),iz(m,g,A,R,_);case 3:e:{if(Re(g,g.stateNode.containerInfo),m===null)throw Error(r(387));A=g.pendingProps;var O=g.memoizedState;R=O.element,cA(m,g),kx(g,A,null,_);var re=g.memoizedState;if(A=re.cache,kd(g,qi,A),A!==O.cache&&rA(g,[qi],_,!0),Cx(),A=re.element,O.isDehydrated)if(O={element:A,isDehydrated:!1,cache:re.cache},g.updateQueue.baseState=O,g.memoizedState=O,g.flags&256){g=az(m,g,A,_);break e}else if(A!==R){R=zo(Error(r(424)),g),yx(R),g=az(m,g,A,_);break e}else for(m=g.stateNode.containerInfo,m.nodeType===9?m=m.body:m=m.nodeName==="HTML"?m.ownerDocument.body:m,ei=Vo(m.firstChild),Ha=g,tr=!0,Nd=null,Ho=!0,_=e5(g,null,A,_),g.child=_;_;)_.flags=_.flags&-3|4096,_=_.sibling;else{if(vm(),A===R){g=ru(m,g,_);break e}Va(m,g,A,_)}g=g.child}return g;case 26:return Mw(m,g),m===null?(_=vU(g.type,null,g.pendingProps,null))?g.memoizedState=_:tr||(_=g.type,m=g.pendingProps,A=Vw(fe.current).createElement(_),A[Xt]=g,A[or]=m,Ga(A,_,m),Ge(A),g.stateNode=A):g.memoizedState=vU(g.type,m.memoizedProps,g.pendingProps,m.memoizedState),null;case 27:return le(g),m===null&&tr&&(A=g.stateNode=bU(g.type,g.pendingProps,fe.current),Ha=g,Ho=!0,R=ei,zd(g.type)?(_T=R,ei=Vo(A.firstChild)):ei=R),Va(m,g,g.pendingProps.children,_),Mw(m,g),m===null&&(g.flags|=4194304),g.child;case 5:return m===null&&tr&&((R=A=ei)&&(A=roe(A,g.type,g.pendingProps,Ho),A!==null?(g.stateNode=A,Ha=g,ei=Vo(A.firstChild),Ho=!1,R=!0):R=!1),R||Cd(g)),le(g),R=g.type,O=g.pendingProps,re=m!==null?m.memoizedProps:null,A=O.children,bT(R,O)?A=null:re!==null&&bT(R,re)&&(g.flags|=32),g.memoizedState!==null&&(R=gA(m,g,xse,null,null,_),qx._currentValue=R),Mw(m,g),Va(m,g,A,_),g.child;case 6:return m===null&&tr&&((m=_=ei)&&(_=ioe(_,g.pendingProps,Ho),_!==null?(g.stateNode=_,Ha=g,ei=null,m=!0):m=!1),m||Cd(g)),null;case 13:return sz(m,g,_);case 4:return Re(g,g.stateNode.containerInfo),A=g.pendingProps,m===null?g.child=km(g,null,A,_):Va(m,g,A,_),g.child;case 11:return Q5(m,g,g.type,g.pendingProps,_);case 7:return Va(m,g,g.pendingProps,_),g.child;case 8:return Va(m,g,g.pendingProps.children,_),g.child;case 12:return Va(m,g,g.pendingProps.children,_),g.child;case 10:return A=g.pendingProps,kd(g,g.type,A.value),Va(m,g,A.children,_),g.child;case 9:return R=g.type._context,A=g.pendingProps.children,_m(g),R=$a(R),A=A(R),g.flags|=1,Va(m,g,A,_),g.child;case 14:return Z5(m,g,g.type,g.pendingProps,_);case 15:return J5(m,g,g.type,g.pendingProps,_);case 19:return lz(m,g,_);case 31:return kse(m,g,_);case 22:return ez(m,g,_,g.pendingProps);case 24:return _m(g),A=$a(qi),m===null?(R=sA(),R===null&&(R=Ir,O=iA(),R.pooledCache=O,O.refCount++,O!==null&&(R.pooledCacheLanes|=_),R=O),g.memoizedState={parent:A,cache:R},lA(g),kd(g,qi,R)):((m.lanes&_)!==0&&(cA(m,g),kx(g,null,null,_),Cx()),R=m.memoizedState,O=g.memoizedState,R.parent!==A?(R={parent:A,cache:A},g.memoizedState=R,g.lanes===0&&(g.memoizedState=g.updateQueue.baseState=R),kd(g,qi,A)):(A=O.cache,kd(g,qi,A),A!==R.cache&&rA(g,[qi],_,!0))),Va(m,g,g.pendingProps.children,_),g.child;case 29:throw g.pendingProps}throw Error(r(156,g.tag))}function iu(m){m.flags|=4}function VA(m,g,_,A,R){if((g=(m.mode&32)!==0)&&(g=!1),g){if(m.flags|=16777216,(R&335544128)===R)if(m.stateNode.complete)m.flags|=8192;else if(Lz())m.flags|=8192;else throw Cm=hw,oA}else m.flags&=-16777217}function uz(m,g){if(g.type!=="stylesheet"||(g.state.loading&4)!==0)m.flags&=-16777217;else if(m.flags|=16777216,!CU(g))if(Lz())m.flags|=8192;else throw Cm=hw,oA}function Tw(m,g){g!==null&&(m.flags|=4),m.flags&16384&&(g=m.tag!==22?yt():536870912,m.lanes|=g,Ep|=g)}function jx(m,g){if(!tr)switch(m.tailMode){case"hidden":g=m.tail;for(var _=null;g!==null;)g.alternate!==null&&(_=g),g=g.sibling;_===null?m.tail=null:_.sibling=null;break;case"collapsed":_=m.tail;for(var A=null;_!==null;)_.alternate!==null&&(A=_),_=_.sibling;A===null?g||m.tail===null?m.tail=null:m.tail.sibling=null:A.sibling=null}}function ti(m){var g=m.alternate!==null&&m.alternate.child===m.child,_=0,A=0;if(g)for(var R=m.child;R!==null;)_|=R.lanes|R.childLanes,A|=R.subtreeFlags&65011712,A|=R.flags&65011712,R.return=m,R=R.sibling;else for(R=m.child;R!==null;)_|=R.lanes|R.childLanes,A|=R.subtreeFlags,A|=R.flags,R.return=m,R=R.sibling;return m.subtreeFlags|=A,m.childLanes=_,g}function Ase(m,g,_){var A=g.pendingProps;switch(ZM(g),g.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return ti(g),null;case 1:return ti(g),null;case 3:return _=g.stateNode,A=null,m!==null&&(A=m.memoizedState.cache),g.memoizedState.cache!==A&&(g.flags|=2048),eu(qi),ue(),_.pendingContext&&(_.context=_.pendingContext,_.pendingContext=null),(m===null||m.child===null)&&(bp(g)?iu(g):m===null||m.memoizedState.isDehydrated&&(g.flags&256)===0||(g.flags|=1024,eA())),ti(g),null;case 26:var R=g.type,O=g.memoizedState;return m===null?(iu(g),O!==null?(ti(g),uz(g,O)):(ti(g),VA(g,R,null,A,_))):O?O!==m.memoizedState?(iu(g),ti(g),uz(g,O)):(ti(g),g.flags&=-16777217):(m=m.memoizedProps,m!==A&&iu(g),ti(g),VA(g,R,m,A,_)),null;case 27:if(Ne(g),_=fe.current,R=g.type,m!==null&&g.stateNode!=null)m.memoizedProps!==A&&iu(g);else{if(!A){if(g.stateNode===null)throw Error(r(166));return ti(g),null}m=ee.current,bp(g)?$I(g):(m=bU(R,A,_),g.stateNode=m,iu(g))}return ti(g),null;case 5:if(Ne(g),R=g.type,m!==null&&g.stateNode!=null)m.memoizedProps!==A&&iu(g);else{if(!A){if(g.stateNode===null)throw Error(r(166));return ti(g),null}if(O=ee.current,bp(g))$I(g);else{var re=Vw(fe.current);switch(O){case 1:O=re.createElementNS("http://www.w3.org/2000/svg",R);break;case 2:O=re.createElementNS("http://www.w3.org/1998/Math/MathML",R);break;default:switch(R){case"svg":O=re.createElementNS("http://www.w3.org/2000/svg",R);break;case"math":O=re.createElementNS("http://www.w3.org/1998/Math/MathML",R);break;case"script":O=re.createElement("div"),O.innerHTML=" +