From a0098bd961d8253ed303de17bbe8990fdc01d191 Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Mon, 20 Apr 2026 09:12:37 -0400 Subject: [PATCH 1/4] fix(web): dedupe archive lifecycle toasts --- apps/fabro-web/app/routes/run-detail.test.ts | 172 ++++++++++++- apps/fabro-web/app/routes/run-detail.tsx | 142 +++++++++-- .../{entry-qp59a2b0.js => entry-28syddrz.js} | 238 +++++++++--------- lib/crates/fabro-spa/assets/index.html | 2 +- 4 files changed, 409 insertions(+), 145 deletions(-) rename lib/crates/fabro-spa/assets/assets/{entry-qp59a2b0.js => entry-28syddrz.js} (62%) diff --git a/apps/fabro-web/app/routes/run-detail.test.ts b/apps/fabro-web/app/routes/run-detail.test.ts index fc9f3cc73..00b3a4c75 100644 --- a/apps/fabro-web/app/routes/run-detail.test.ts +++ b/apps/fabro-web/app/routes/run-detail.test.ts @@ -1,6 +1,8 @@ import { afterEach, describe, expect, test } from "bun:test"; -import { action, lifecycleActionVisibility, loader } from "./run-detail"; +import * as runDetailModule from "./run-detail"; + +const { action, lifecycleActionVisibility, loader } = runDetailModule; type StubFetchEntry = { status: number; @@ -196,3 +198,171 @@ describe("lifecycleActionVisibility", () => { expect(lifecycleActionVisibility("blocked").showBlockedNotice).toBe(true); }); }); + +describe("run detail archive toast handling", () => { + test("replaying the same archive success result does not enqueue a duplicate archive toast", () => { + const handleArchiveToastResult = ( + runDetailModule as Record + ).handleArchiveToastResult as + | (( + result: runDetailModule.RunDetailActionResult | undefined, + state: { + activeArchiveToastId: string | null; + lastArchiveResultKey: string | null; + lastUnarchiveResultKey: string | null; + }, + toastApi: { + push: (toast: unknown) => string; + dismiss: (id: string) => void; + }, + onUnarchive: () => void, + ) => { + activeArchiveToastId: string | null; + lastArchiveResultKey: string | null; + lastUnarchiveResultKey: string | null; + }) + | undefined; + + expect(handleArchiveToastResult).toBeDefined(); + + const pushedToasts: Array<{ message: string; action?: { label: string; onClick: () => void } }> = []; + const dismissedToastIds: string[] = []; + let unarchiveClicks = 0; + const result: runDetailModule.RunDetailActionResult = { + intent: "archive", + ok: true, + run: { + id: "run-1", + status: "archived", + created_at: "2026-04-20T12:00:00Z", + }, + }; + + const firstState = handleArchiveToastResult!( + result, + { + activeArchiveToastId: null, + lastArchiveResultKey: null, + lastUnarchiveResultKey: null, + }, + { + push: (toast) => { + pushedToasts.push(toast as (typeof pushedToasts)[number]); + return `toast-${pushedToasts.length}`; + }, + dismiss: (id) => { + dismissedToastIds.push(id); + }, + }, + () => { + unarchiveClicks += 1; + }, + ); + + expect(pushedToasts).toHaveLength(1); + expect(pushedToasts[0]?.message).toBe("Run archived."); + expect(pushedToasts[0]?.action?.label).toBe("Unarchive"); + pushedToasts[0]?.action?.onClick(); + expect(unarchiveClicks).toBe(1); + expect(firstState.activeArchiveToastId).toBe("toast-1"); + expect(dismissedToastIds).toEqual([]); + + const replayedState = handleArchiveToastResult!( + result, + firstState, + { + push: (toast) => { + pushedToasts.push(toast as (typeof pushedToasts)[number]); + return `toast-${pushedToasts.length}`; + }, + dismiss: (id) => { + dismissedToastIds.push(id); + }, + }, + () => { + unarchiveClicks += 1; + }, + ); + + expect(pushedToasts).toHaveLength(1); + expect(replayedState).toEqual(firstState); + expect(dismissedToastIds).toEqual([]); + }); + + test("successful unarchive dismisses the active archive toast before showing restore feedback", () => { + const handleUnarchiveToastResult = ( + runDetailModule as Record + ).handleUnarchiveToastResult as + | (( + result: runDetailModule.RunDetailActionResult | undefined, + state: { + activeArchiveToastId: string | null; + lastArchiveResultKey: string | null; + lastUnarchiveResultKey: string | null; + }, + toastApi: { + push: (toast: unknown) => string; + dismiss: (id: string) => void; + }, + ) => { + activeArchiveToastId: string | null; + lastArchiveResultKey: string | null; + lastUnarchiveResultKey: string | null; + }) + | undefined; + + expect(handleUnarchiveToastResult).toBeDefined(); + + const pushedToasts: Array<{ message: string }> = []; + const dismissedToastIds: string[] = []; + const result: runDetailModule.RunDetailActionResult = { + intent: "unarchive", + ok: true, + run: { + id: "run-1", + status: "succeeded", + created_at: "2026-04-20T12:00:00Z", + }, + }; + + const nextState = handleUnarchiveToastResult!( + result, + { + activeArchiveToastId: "toast-9", + lastArchiveResultKey: "archive:ok:run-1:archived::2026-04-20T12:00:00Z", + lastUnarchiveResultKey: null, + }, + { + push: (toast) => { + pushedToasts.push(toast as (typeof pushedToasts)[number]); + return `toast-${pushedToasts.length}`; + }, + dismiss: (id) => { + dismissedToastIds.push(id); + }, + }, + ); + + expect(dismissedToastIds).toEqual(["toast-9"]); + expect(pushedToasts).toEqual([{ message: "Run restored." }]); + expect(nextState.activeArchiveToastId).toBeNull(); + + const replayedState = handleUnarchiveToastResult!( + result, + nextState, + { + push: (toast) => { + pushedToasts.push(toast as (typeof pushedToasts)[number]); + return `toast-${pushedToasts.length}`; + }, + dismiss: (id) => { + dismissedToastIds.push(id); + }, + }, + ); + + expect(dismissedToastIds).toEqual(["toast-9"]); + expect(pushedToasts).toEqual([{ message: "Run restored." }]); + expect(replayedState).toEqual(nextState); + }); +}); diff --git a/apps/fabro-web/app/routes/run-detail.tsx b/apps/fabro-web/app/routes/run-detail.tsx index c5f9f87e2..1facb9271 100644 --- a/apps/fabro-web/app/routes/run-detail.tsx +++ b/apps/fabro-web/app/routes/run-detail.tsx @@ -1,4 +1,4 @@ -import { useEffect } from "react"; +import { useEffect, useRef } from "react"; import { ArrowPathIcon, ChevronRightIcon } from "@heroicons/react/20/solid"; import { Link, Outlet, useFetcher, useLocation } from "react-router"; import type { @@ -95,6 +95,14 @@ type LifecycleActionResult = export type RunDetailActionResult = PreviewActionResult | LifecycleActionResult; +interface ArchiveToastState { + activeArchiveToastId: string | null; + lastArchiveResultKey: string | null; + lastUnarchiveResultKey: string | null; +} + +type ToastApi = Pick, "push" | "dismiss">; + export function lifecycleActionVisibility(status: string | null | undefined) { return { showPrimaryCancel: canCancel(status), @@ -175,9 +183,14 @@ export default function RunDetail({ loaderData, params }: { loaderData: RunDetai const cancelFetcher = useFetcher(); const archiveFetcher = useFetcher(); const unarchiveFetcher = useFetcher(); - const { push } = useToast(); + const { push, dismiss } = useToast(); const demoMode = useDemoMode(); const tabs = allTabs.filter((t) => !t.demoOnly || demoMode); + const archiveToastStateRef = useRef({ + activeArchiveToastId: null, + lastArchiveResultKey: null, + lastUnarchiveResultKey: null, + }); useRunEventSource(run?.id ?? undefined, { allowlist: RUN_DETAIL_EVENTS, @@ -205,30 +218,21 @@ export default function RunDetail({ loaderData, params }: { loaderData: RunDetai }, [cancelFetcher.data, push]); useEffect(() => { - const result = archiveFetcher.data; - if (!result || result.intent !== "archive") return; - if (isLifecycleActionFailure(result)) { - push({ message: mapError(result.error, "archive"), tone: "error" }); - return; - } - push({ - message: "Run archived.", - action: { - label: "Unarchive", - onClick: () => submitIntent(unarchiveFetcher, "unarchive"), - }, - }); - }, [archiveFetcher, archiveFetcher.data, push, unarchiveFetcher]); + archiveToastStateRef.current = handleArchiveToastResult( + archiveFetcher.data, + archiveToastStateRef.current, + { push, dismiss }, + () => submitIntent(unarchiveFetcher, "unarchive"), + ); + }, [archiveFetcher.data, dismiss, push, unarchiveFetcher]); useEffect(() => { - const result = unarchiveFetcher.data; - if (!result || result.intent !== "unarchive") return; - if (isLifecycleActionFailure(result)) { - push({ message: mapError(result.error, "unarchive"), tone: "error" }); - return; - } - push({ message: "Run restored." }); - }, [push, unarchiveFetcher.data]); + archiveToastStateRef.current = handleUnarchiveToastResult( + unarchiveFetcher.data, + archiveToastStateRef.current, + { push, dismiss }, + ); + }, [dismiss, push, unarchiveFetcher.data]); if (!run) { return ( @@ -458,6 +462,96 @@ function isLifecycleActionFailure( return value.ok === false; } +function lifecycleResultKey(result: RunDetailActionResult | undefined): string | null { + if (!result || result.intent === "preview") return null; + + if (isLifecycleActionFailure(result)) { + return [ + result.intent, + "error", + String(result.error?.status ?? ""), + result.error?.errors[0]?.detail ?? "", + ].join(":"); + } + + return [ + result.intent, + "ok", + result.run.id, + result.run.status, + result.run.status_reason ?? "", + result.run.created_at ?? "", + ].join(":"); +} + +export function handleArchiveToastResult( + result: RunDetailActionResult | undefined, + state: ArchiveToastState, + toastApi: ToastApi, + onUnarchive: () => void, +): ArchiveToastState { + if (!result || result.intent !== "archive") return state; + + const resultKey = lifecycleResultKey(result); + if (state.lastArchiveResultKey === resultKey) return state; + + const nextState = { + ...state, + lastArchiveResultKey: resultKey, + }; + + if (isLifecycleActionFailure(result)) { + toastApi.push({ message: mapError(result.error, "archive"), tone: "error" }); + return nextState; + } + + if (state.activeArchiveToastId) { + toastApi.dismiss(state.activeArchiveToastId); + } + + return { + ...nextState, + activeArchiveToastId: toastApi.push({ + message: "Run archived.", + action: { + label: "Unarchive", + onClick: onUnarchive, + }, + }), + }; +} + +export function handleUnarchiveToastResult( + result: RunDetailActionResult | undefined, + state: ArchiveToastState, + toastApi: ToastApi, +): ArchiveToastState { + if (!result || result.intent !== "unarchive") return state; + + const resultKey = lifecycleResultKey(result); + if (state.lastUnarchiveResultKey === resultKey) return state; + + const nextState = { + ...state, + lastUnarchiveResultKey: resultKey, + }; + + if (isLifecycleActionFailure(result)) { + toastApi.push({ message: mapError(result.error, "unarchive"), tone: "error" }); + return nextState; + } + + if (state.activeArchiveToastId) { + toastApi.dismiss(state.activeArchiveToastId); + } + toastApi.push({ message: "Run restored." }); + + return { + ...nextState, + activeArchiveToastId: null, + }; +} + function submitIntent( fetcher: { submit: (target: FormData, options: { method: "post" }) => void }, intent: LifecycleAction, diff --git a/lib/crates/fabro-spa/assets/assets/entry-qp59a2b0.js b/lib/crates/fabro-spa/assets/assets/entry-28syddrz.js similarity index 62% rename from lib/crates/fabro-spa/assets/assets/entry-qp59a2b0.js rename to lib/crates/fabro-spa/assets/assets/entry-28syddrz.js index 7d201e7de..1f77dd531 100644 --- a/lib/crates/fabro-spa/assets/assets/entry-qp59a2b0.js +++ b/lib/crates/fabro-spa/assets/assets/entry-28syddrz.js @@ -1,4 +1,4 @@ -import{X as k,Y as R3,Z as g5,_ as S}from"./chunk-q07bg6gn.js";var n=R3((bl,EW)=>{(function(){function Z(E,t){Object.defineProperty(z.prototype,E,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",t[0],t[1])}})}function Y(E){if(E===null||typeof E!=="object")return null;return E=h1&&E[h1]||E["@@iterator"],typeof E==="function"?E:null}function J(E,t){E=(E=E.constructor)&&(E.displayName||E.name)||"ReactClass";var F0=E+"."+t;b0[F0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",t,E),b0[F0]=!0)}function z(E,t,F0){this.props=E,this.context=t,this.refs=s5,this.updater=F0||l1}function q(){}function U(E,t,F0){this.props=E,this.context=t,this.refs=s5,this.updater=F0||l1}function K(){}function W(E){return""+E}function G(E){try{W(E);var t=!1}catch(x0){t=!0}if(t){t=console;var F0=t.error,C0=typeof Symbol==="function"&&Symbol.toStringTag&&E[Symbol.toStringTag]||E.constructor.name||"Object";return F0.call(t,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",C0),W(E)}}function M(E){if(E==null)return null;if(typeof E==="function")return E.$$typeof===l6?null:E.displayName||E.name||null;if(typeof E==="string")return E;switch(E){case M0:return"Fragment";case $0:return"Profiler";case x:return"StrictMode";case X1:return"Suspense";case O0:return"SuspenseList";case o1:return"Activity"}if(typeof E==="object")switch(typeof E.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),E.$$typeof){case Y0:return"Portal";case K0:return E.displayName||"Context";case W0:return(E._context.displayName||"Context")+".Consumer";case f0:var t=E.render;return E=E.displayName,E||(E=t.displayName||t.name||"",E=E!==""?"ForwardRef("+E+")":"ForwardRef"),E;case K1:return t=E.displayName||null,t!==null?t:M(E.type)||"Memo";case L1:t=E._payload,E=E._init;try{return M(E(t))}catch(F0){}}return null}function N(E){if(E===M0)return"<>";if(typeof E==="object"&&E!==null&&E.$$typeof===L1)return"<...>";try{var t=M(E);return t?"<"+t+">":"<...>"}catch(F0){return"<...>"}}function O(){var E=z1.A;return E===null?null:E.getOwner()}function F(){return Error("react-stack-top-frame")}function _(E){if(G4.call(E,"key")){var t=Object.getOwnPropertyDescriptor(E,"key").get;if(t&&t.isReactWarning)return!1}return E.key!==void 0}function R(E,t){function F0(){N6||(N6=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",t))}F0.isReactWarning=!0,Object.defineProperty(E,"key",{get:F0,configurable:!0})}function C(){var E=M(this.type);return u4[E]||(u4[E]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),E=this.props.ref,E!==void 0?E:null}function b(E,t,F0,C0,x0,t0){var k0=F0.ref;return E={$$typeof:B0,type:E,key:t,props:F0,_owner:C0},(k0!==void 0?k0:null)!==null?Object.defineProperty(E,"ref",{enumerable:!1,get:C}):Object.defineProperty(E,"ref",{enumerable:!1,value:null}),E._store={},Object.defineProperty(E._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(E,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(E,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:x0}),Object.defineProperty(E,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:t0}),Object.freeze&&(Object.freeze(E.props),Object.freeze(E)),E}function V(E,t){return t=b(E.type,t,E.props,E._owner,E._debugStack,E._debugTask),E._store&&(t._store.validated=E._store.validated),t}function L(E){v(E)?E._store&&(E._store.validated=1):typeof E==="object"&&E!==null&&E.$$typeof===L1&&(E._payload.status==="fulfilled"?v(E._payload.value)&&E._payload.value._store&&(E._payload.value._store.validated=1):E._store&&(E._store.validated=1))}function v(E){return typeof E==="object"&&E!==null&&E.$$typeof===B0}function D(E){var t={"=":"=0",":":"=2"};return"$"+E.replace(/[=:]/g,function(F0){return t[F0]})}function f(E,t){return typeof E==="object"&&E!==null&&E.key!=null?(G(E.key),D(""+E.key)):t.toString(36)}function u(E){switch(E.status){case"fulfilled":return E.value;case"rejected":throw E.reason;default:switch(typeof E.status==="string"?E.then(K,K):(E.status="pending",E.then(function(t){E.status==="pending"&&(E.status="fulfilled",E.value=t)},function(t){E.status==="pending"&&(E.status="rejected",E.reason=t)})),E.status){case"fulfilled":return E.value;case"rejected":throw E.reason}}throw E}function I(E,t,F0,C0,x0){var t0=typeof E;if(t0==="undefined"||t0==="boolean")E=null;var k0=!1;if(E===null)k0=!0;else switch(t0){case"bigint":case"string":case"number":k0=!0;break;case"object":switch(E.$$typeof){case B0:case Y0:k0=!0;break;case L1:return k0=E._init,I(k0(E._payload),t,F0,C0,x0)}}if(k0){k0=E,x0=x0(k0);var e0=C0===""?"."+f(k0,0):C0;return G1(x0)?(F0="",e0!=null&&(F0=e0.replace(t2,"$&/")+"/"),I(x0,t,F0,"",function(M5){return M5})):x0!=null&&(v(x0)&&(x0.key!=null&&(k0&&k0.key===x0.key||G(x0.key)),F0=V(x0,F0+(x0.key==null||k0&&k0.key===x0.key?"":(""+x0.key).replace(t2,"$&/")+"/")+e0),C0!==""&&k0!=null&&v(k0)&&k0.key==null&&k0._store&&!k0._store.validated&&(F0._store.validated=2),x0=F0),t.push(x0)),1}if(k0=0,e0=C0===""?".":C0+":",G1(E))for(var E0=0;E0{(function(){function Z(E,t){Object.defineProperty(z.prototype,E,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",t[0],t[1])}})}function Y(E){if(E===null||typeof E!=="object")return null;return E=g1&&E[g1]||E["@@iterator"],typeof E==="function"?E:null}function J(E,t){E=(E=E.constructor)&&(E.displayName||E.name)||"ReactClass";var F0=E+"."+t;b0[F0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",t,E),b0[F0]=!0)}function z(E,t,F0){this.props=E,this.context=t,this.refs=s5,this.updater=F0||l1}function q(){}function U(E,t,F0){this.props=E,this.context=t,this.refs=s5,this.updater=F0||l1}function K(){}function W(E){return""+E}function G(E){try{W(E);var t=!1}catch(x0){t=!0}if(t){t=console;var F0=t.error,C0=typeof Symbol==="function"&&Symbol.toStringTag&&E[Symbol.toStringTag]||E.constructor.name||"Object";return F0.call(t,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",C0),W(E)}}function M(E){if(E==null)return null;if(typeof E==="function")return E.$$typeof===d6?null:E.displayName||E.name||null;if(typeof E==="string")return E;switch(E){case M0:return"Fragment";case $0:return"Profiler";case x:return"StrictMode";case X1:return"Suspense";case O0:return"SuspenseList";case o1:return"Activity"}if(typeof E==="object")switch(typeof E.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),E.$$typeof){case Y0:return"Portal";case K0:return E.displayName||"Context";case W0:return(E._context.displayName||"Context")+".Consumer";case f0:var t=E.render;return E=E.displayName,E||(E=t.displayName||t.name||"",E=E!==""?"ForwardRef("+E+")":"ForwardRef"),E;case K1:return t=E.displayName||null,t!==null?t:M(E.type)||"Memo";case L1:t=E._payload,E=E._init;try{return M(E(t))}catch(F0){}}return null}function N(E){if(E===M0)return"<>";if(typeof E==="object"&&E!==null&&E.$$typeof===L1)return"<...>";try{var t=M(E);return t?"<"+t+">":"<...>"}catch(F0){return"<...>"}}function O(){var E=z1.A;return E===null?null:E.getOwner()}function F(){return Error("react-stack-top-frame")}function _(E){if(G4.call(E,"key")){var t=Object.getOwnPropertyDescriptor(E,"key").get;if(t&&t.isReactWarning)return!1}return E.key!==void 0}function R(E,t){function F0(){M6||(M6=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",t))}F0.isReactWarning=!0,Object.defineProperty(E,"key",{get:F0,configurable:!0})}function C(){var E=M(this.type);return u4[E]||(u4[E]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),E=this.props.ref,E!==void 0?E:null}function b(E,t,F0,C0,x0,t0){var k0=F0.ref;return E={$$typeof:B0,type:E,key:t,props:F0,_owner:C0},(k0!==void 0?k0:null)!==null?Object.defineProperty(E,"ref",{enumerable:!1,get:C}):Object.defineProperty(E,"ref",{enumerable:!1,value:null}),E._store={},Object.defineProperty(E._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(E,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(E,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:x0}),Object.defineProperty(E,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:t0}),Object.freeze&&(Object.freeze(E.props),Object.freeze(E)),E}function V(E,t){return t=b(E.type,t,E.props,E._owner,E._debugStack,E._debugTask),E._store&&(t._store.validated=E._store.validated),t}function L(E){v(E)?E._store&&(E._store.validated=1):typeof E==="object"&&E!==null&&E.$$typeof===L1&&(E._payload.status==="fulfilled"?v(E._payload.value)&&E._payload.value._store&&(E._payload.value._store.validated=1):E._store&&(E._store.validated=1))}function v(E){return typeof E==="object"&&E!==null&&E.$$typeof===B0}function y(E){var t={"=":"=0",":":"=2"};return"$"+E.replace(/[=:]/g,function(F0){return t[F0]})}function S(E,t){return typeof E==="object"&&E!==null&&E.key!=null?(G(E.key),y(""+E.key)):t.toString(36)}function u(E){switch(E.status){case"fulfilled":return E.value;case"rejected":throw E.reason;default:switch(typeof E.status==="string"?E.then(K,K):(E.status="pending",E.then(function(t){E.status==="pending"&&(E.status="fulfilled",E.value=t)},function(t){E.status==="pending"&&(E.status="rejected",E.reason=t)})),E.status){case"fulfilled":return E.value;case"rejected":throw E.reason}}throw E}function I(E,t,F0,C0,x0){var t0=typeof E;if(t0==="undefined"||t0==="boolean")E=null;var k0=!1;if(E===null)k0=!0;else switch(t0){case"bigint":case"string":case"number":k0=!0;break;case"object":switch(E.$$typeof){case B0:case Y0:k0=!0;break;case L1:return k0=E._init,I(k0(E._payload),t,F0,C0,x0)}}if(k0){k0=E,x0=x0(k0);var e0=C0===""?"."+S(k0,0):C0;return G1(x0)?(F0="",e0!=null&&(F0=e0.replace(t2,"$&/")+"/"),I(x0,t,F0,"",function(M5){return M5})):x0!=null&&(v(x0)&&(x0.key!=null&&(k0&&k0.key===x0.key||G(x0.key)),F0=V(x0,F0+(x0.key==null||k0&&k0.key===x0.key?"":(""+x0.key).replace(t2,"$&/")+"/")+e0),C0!==""&&k0!=null&&v(k0)&&k0.key==null&&k0._store&&!k0._store.validated&&(F0._store.validated=2),x0=F0),t.push(x0)),1}if(k0=0,e0=C0===""?".":C0+":",G1(E))for(var E0=0;E0 import('./MyComponent')) @@ -10,44 +10,44 @@ Your code should look like: 1. You might have mismatching versions of React and the renderer (such as React DOM) 2. You might be breaking the Rules of Hooks 3. You might have more than one copy of React in the same app -See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),E}function o(){z1.asyncTransitions--}function G0(E){if(H4===null)try{var t=("require"+Math.random()).slice(0,7);H4=(EW&&EW[t]).call(EW,"timers").setImmediate}catch(F0){H4=function(C0){U2===!1&&(U2=!0,typeof MessageChannel>"u"&&console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var x0=new MessageChannel;x0.port1.onmessage=C0,x0.port2.postMessage(void 0)}}return H4(E)}function H0(E){return 1 ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),{then:function(E0,M5){x0=!0,k0.then(function(X5){if(Z0(t,F0),F0===0){try{X0(C0),G0(function(){return p(X5,E0,M5)})}catch(t5){z1.thrownErrors.push(t5)}if(0 ...)"))}),z1.actQueue=null),0z1.recentlyCreatedOwnerStacks++;return b(E,x0,C0,O(),E0?Error("react-stack-top-frame"):f2,E0?E1(N(E)):O6)},bl.createRef=function(){var E={current:null};return Object.seal(E),E},bl.forwardRef=function(E){E!=null&&E.$$typeof===K1?console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof E!=="function"?console.error("forwardRef requires a render function but was given %s.",E===null?"null":typeof E):E.length!==0&&E.length!==2&&console.error("forwardRef render functions accept exactly two parameters: props and ref. %s",E.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),E!=null&&E.defaultProps!=null&&console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");var t={$$typeof:f0,render:E},F0;return Object.defineProperty(t,"displayName",{enumerable:!1,configurable:!0,get:function(){return F0},set:function(C0){F0=C0,E.name||E.displayName||(Object.defineProperty(E,"name",{value:C0}),E.displayName=C0)}}),t},bl.isValidElement=v,bl.lazy=function(E){E={_status:-1,_result:E};var t={$$typeof:L1,_payload:E,_init:Q0},F0={name:"lazy",start:-1,end:-1,value:null,owner:null,debugStack:Error("react-stack-top-frame"),debugTask:console.createTask?console.createTask("lazy()"):null};return E._ioInfo=F0,t._debugInfo=[{awaited:F0}],t},bl.memo=function(E,t){E==null&&console.error("memo: The first argument must be a component. Instead received: %s",E===null?"null":typeof E),t={$$typeof:K1,type:E,compare:t===void 0?null:t};var F0;return Object.defineProperty(t,"displayName",{enumerable:!1,configurable:!0,get:function(){return F0},set:function(C0){F0=C0,E.name||E.displayName||(Object.defineProperty(E,"name",{value:C0}),E.displayName=C0)}}),t},bl.startTransition=function(E){var t=z1.T,F0={};F0._updatedFibers=new Set,z1.T=F0;try{var C0=E(),x0=z1.S;x0!==null&&x0(F0,C0),typeof C0==="object"&&C0!==null&&typeof C0.then==="function"&&(z1.asyncTransitions++,C0.then(o,o),C0.then(K,L5))}catch(t0){L5(t0)}finally{t===null&&F0._updatedFibers&&(E=F0._updatedFibers.size,F0._updatedFibers.clear(),10{(function(){function Z(){if(D=!1,l){var p=yl.unstable_now();o=p;var X0=!0;try{Z:{L=!1,v&&(v=!1,u(Q0),Q0=-1),V=!0;var B0=b;try{Y:{U(p);for(C=J(F);C!==null&&!(C.expirationTime>p&&W());){var Y0=C.callback;if(typeof Y0==="function"){C.callback=null,b=C.priorityLevel;var M0=Y0(C.expirationTime<=p);if(p=yl.unstable_now(),typeof M0==="function"){C.callback=M0,U(p),X0=!0;break Y}C===J(F)&&z(F),U(p)}else z(F);C=J(F)}if(C!==null)X0=!0;else{var x=J(_);x!==null&&G(K,x.startTime-p),X0=!1}}break Z}finally{C=null,b=B0,V=!1}X0=void 0}}finally{X0?G0():l=!1}}}function Y(p,X0){var B0=p.length;p.push(X0);Z:for(;0>>1,M0=p[Y0];if(0>>1;Y0q(W0,B0))K0q(f0,W0)?(p[Y0]=f0,p[K0]=B0,Y0=K0):(p[Y0]=W0,p[$0]=B0,Y0=$0);else if(K0q(f0,B0))p[Y0]=f0,p[K0]=B0,Y0=K0;else break Z}}return X0}function q(p,X0){var B0=p.sortIndex-X0.sortIndex;return B0!==0?B0:p.id-X0.id}function U(p){for(var X0=J(_);X0!==null;){if(X0.callback===null)z(_);else if(X0.startTime<=p)z(_),X0.sortIndex=X0.expirationTime,Y(F,X0);else break;X0=J(_)}}function K(p){if(v=!1,U(p),!L)if(J(F)!==null)L=!0,l||(l=!0,G0());else{var X0=J(_);X0!==null&&G(K,X0.startTime-p)}}function W(){return D?!0:yl.unstable_now()-op||125Y0?(p.sortIndex=B0,Y(_,p),J(F)===null&&p===J(_)&&(v?(u(Q0),Q0=-1):v=!0,G(K,B0-Y0))):(p.sortIndex=M0,Y(F,p),L||V||(L=!0,l||(l=!0,G0()))),p},yl.unstable_shouldYield=W,yl.unstable_wrapCallback=function(p){var X0=b;return function(){var B0=b;b=X0;try{return p.apply(this,arguments)}finally{b=B0}}},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop==="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()});var uD=R3((Dl)=>{var eA=k(n());(function(){function Z(){}function Y(N){return""+N}function J(N,O,F){var _=3"u"&&console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var x0=new MessageChannel;x0.port1.onmessage=C0,x0.port2.postMessage(void 0)}}return H4(E)}function H0(E){return 1 ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),{then:function(E0,M5){x0=!0,k0.then(function(X5){if(Z0(t,F0),F0===0){try{X0(C0),G0(function(){return p(X5,E0,M5)})}catch(t5){z1.thrownErrors.push(t5)}if(0 ...)"))}),z1.actQueue=null),0z1.recentlyCreatedOwnerStacks++;return b(E,x0,C0,O(),E0?Error("react-stack-top-frame"):f2,E0?E1(N(E)):N6)},Dl.createRef=function(){var E={current:null};return Object.seal(E),E},Dl.forwardRef=function(E){E!=null&&E.$$typeof===K1?console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof E!=="function"?console.error("forwardRef requires a render function but was given %s.",E===null?"null":typeof E):E.length!==0&&E.length!==2&&console.error("forwardRef render functions accept exactly two parameters: props and ref. %s",E.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),E!=null&&E.defaultProps!=null&&console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");var t={$$typeof:f0,render:E},F0;return Object.defineProperty(t,"displayName",{enumerable:!1,configurable:!0,get:function(){return F0},set:function(C0){F0=C0,E.name||E.displayName||(Object.defineProperty(E,"name",{value:C0}),E.displayName=C0)}}),t},Dl.isValidElement=v,Dl.lazy=function(E){E={_status:-1,_result:E};var t={$$typeof:L1,_payload:E,_init:Q0},F0={name:"lazy",start:-1,end:-1,value:null,owner:null,debugStack:Error("react-stack-top-frame"),debugTask:console.createTask?console.createTask("lazy()"):null};return E._ioInfo=F0,t._debugInfo=[{awaited:F0}],t},Dl.memo=function(E,t){E==null&&console.error("memo: The first argument must be a component. Instead received: %s",E===null?"null":typeof E),t={$$typeof:K1,type:E,compare:t===void 0?null:t};var F0;return Object.defineProperty(t,"displayName",{enumerable:!1,configurable:!0,get:function(){return F0},set:function(C0){F0=C0,E.name||E.displayName||(Object.defineProperty(E,"name",{value:C0}),E.displayName=C0)}}),t},Dl.startTransition=function(E){var t=z1.T,F0={};F0._updatedFibers=new Set,z1.T=F0;try{var C0=E(),x0=z1.S;x0!==null&&x0(F0,C0),typeof C0==="object"&&C0!==null&&typeof C0.then==="function"&&(z1.asyncTransitions++,C0.then(o,o),C0.then(K,L5))}catch(t0){L5(t0)}finally{t===null&&F0._updatedFibers&&(E=F0._updatedFibers.size,F0._updatedFibers.clear(),10{(function(){function Z(){if(y=!1,l){var p=El.unstable_now();o=p;var X0=!0;try{Z:{L=!1,v&&(v=!1,u(Q0),Q0=-1),V=!0;var B0=b;try{Y:{U(p);for(C=J(F);C!==null&&!(C.expirationTime>p&&W());){var Y0=C.callback;if(typeof Y0==="function"){C.callback=null,b=C.priorityLevel;var M0=Y0(C.expirationTime<=p);if(p=El.unstable_now(),typeof M0==="function"){C.callback=M0,U(p),X0=!0;break Y}C===J(F)&&z(F),U(p)}else z(F);C=J(F)}if(C!==null)X0=!0;else{var x=J(_);x!==null&&G(K,x.startTime-p),X0=!1}}break Z}finally{C=null,b=B0,V=!1}X0=void 0}}finally{X0?G0():l=!1}}}function Y(p,X0){var B0=p.length;p.push(X0);Z:for(;0>>1,M0=p[Y0];if(0>>1;Y0q(W0,B0))K0q(f0,W0)?(p[Y0]=f0,p[K0]=B0,Y0=K0):(p[Y0]=W0,p[$0]=B0,Y0=$0);else if(K0q(f0,B0))p[Y0]=f0,p[K0]=B0,Y0=K0;else break Z}}return X0}function q(p,X0){var B0=p.sortIndex-X0.sortIndex;return B0!==0?B0:p.id-X0.id}function U(p){for(var X0=J(_);X0!==null;){if(X0.callback===null)z(_);else if(X0.startTime<=p)z(_),X0.sortIndex=X0.expirationTime,Y(F,X0);else break;X0=J(_)}}function K(p){if(v=!1,U(p),!L)if(J(F)!==null)L=!0,l||(l=!0,G0());else{var X0=J(_);X0!==null&&G(K,X0.startTime-p)}}function W(){return y?!0:El.unstable_now()-op||125Y0?(p.sortIndex=B0,Y(_,p),J(F)===null&&p===J(_)&&(v?(u(Q0),Q0=-1):v=!0,G(K,B0-Y0))):(p.sortIndex=M0,Y(F,p),L||V||(L=!0,l||(l=!0,G0()))),p},El.unstable_shouldYield=W,El.unstable_wrapCallback=function(p){var X0=b;return function(){var B0=b;b=X0;try{return p.apply(this,arguments)}finally{b=B0}}},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop==="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()});var jD=_3((Il)=>{var eA=k(n());(function(){function Z(){}function Y(N){return""+N}function J(N,O,F){var _=3` tag.%s',F),typeof N==="string"&&typeof O==="object"&&O!==null&&typeof O.as==="string"){F=O.as;var _=z(F,O.crossOrigin);W.d.L(N,F,{crossOrigin:_,integrity:typeof O.integrity==="string"?O.integrity:void 0,nonce:typeof O.nonce==="string"?O.nonce:void 0,type:typeof O.type==="string"?O.type:void 0,fetchPriority:typeof O.fetchPriority==="string"?O.fetchPriority:void 0,referrerPolicy:typeof O.referrerPolicy==="string"?O.referrerPolicy:void 0,imageSrcSet:typeof O.imageSrcSet==="string"?O.imageSrcSet:void 0,imageSizes:typeof O.imageSizes==="string"?O.imageSizes:void 0,media:typeof O.media==="string"?O.media:void 0})}},Dl.preloadModule=function(N,O){var F="";typeof N==="string"&&N||(F+=" The `href` argument encountered was "+q(N)+"."),O!==void 0&&typeof O!=="object"?F+=" The `options` argument encountered was "+q(O)+".":O&&("as"in O)&&typeof O.as!=="string"&&(F+=" The `as` option encountered was "+q(O.as)+"."),F&&console.error('ReactDOM.preloadModule(): Expected two arguments, a non-empty `href` string and, optionally, an `options` object with an `as` property valid for a `` tag.%s',F),typeof N==="string"&&(O?(F=z(O.as,O.crossOrigin),W.d.m(N,{as:typeof O.as==="string"&&O.as!=="script"?O.as:void 0,crossOrigin:F,integrity:typeof O.integrity==="string"?O.integrity:void 0})):W.d.m(N))},Dl.requestFormReset=function(N){W.d.r(N)},Dl.unstable_batchedUpdates=function(N,O){return N(O)},Dl.useFormState=function(N,O,F){return K().useFormState(N,O,F)},Dl.useFormStatus=function(){return K().useHostTransitionStatus()},Dl.version="19.2.4",typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop==="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()});var C3=R3((pZ0,hD)=>{var El=k(uD());hD.exports=El});var gD=R3((Il)=>{var r1=k(jD()),bJ=k(n()),ZF=k(C3());(function(){function Z(Q,X){for(Q=Q.memoizedState;Q!==null&&0=X.length)return $;var H=X[B],w=C2(Q)?Q.slice():v1({},Q);return w[H]=Y(Q[H],X,B+1,$),w}function J(Q,X,B){if(X.length!==B.length)console.warn("copyWithRename() expects paths of the same length");else{for(var $=0;$U8?console.error("Unexpected pop."):(X!==EO[U8]&&console.error("Unexpected Fiber popped."),Q.current=DO[U8],DO[U8]=null,EO[U8]=null,U8--)}function H0(Q,X,B){U8++,DO[U8]=Q.current,EO[U8]=B,Q.current=X}function Z0(Q){return Q===null&&console.error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."),Q}function p(Q,X){H0(F9,X,Q),H0(CB,Q,Q),H0(A9,null,Q);var B=X.nodeType;switch(B){case 9:case 11:B=B===9?"#document":"#fragment",X=(X=X.documentElement)?(X=X.namespaceURI)?_v(X):R8:R8;break;default:if(B=X.tagName,X=X.namespaceURI)X=_v(X),X=Pv(X,B);else switch(B){case"svg":X=TJ;break;case"math":X=LW;break;default:X=R8}}B=B.toLowerCase(),B=wL(null,B),B={context:X,ancestorInfo:B},G0(A9,Q),H0(A9,B,Q)}function X0(Q){G0(A9,Q),G0(CB,Q),G0(F9,Q)}function B0(){return Z0(A9.current)}function Y0(Q){Q.memoizedState!==null&&H0(v$,Q,Q);var X=Z0(A9.current),B=Q.type,$=Pv(X.context,B);B=wL(X.ancestorInfo,B),$={context:$,ancestorInfo:B},X!==$&&(H0(CB,Q,Q),H0(A9,$,Q))}function M0(Q){CB.current===Q&&(G0(A9,Q),G0(CB,Q)),v$.current===Q&&(G0(v$,Q),wq._currentValue=FY)}function x(){}function $0(){if(LB===0){tv=console.log,nv=console.info,ev=console.warn,Zb=console.error,Yb=console.group,Qb=console.groupCollapsed,Jb=console.groupEnd;var Q={configurable:!0,enumerable:!0,value:x,writable:!0};Object.defineProperties(console,{info:Q,log:Q,warn:Q,error:Q,group:Q,groupCollapsed:Q,groupEnd:Q})}LB++}function W0(){if(LB--,LB===0){var Q={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:v1({},Q,{value:tv}),info:v1({},Q,{value:nv}),warn:v1({},Q,{value:ev}),error:v1({},Q,{value:Zb}),group:v1({},Q,{value:Yb}),groupCollapsed:v1({},Q,{value:Qb}),groupEnd:v1({},Q,{value:Jb})})}0>LB&&console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}function K0(Q){var X=Error.prepareStackTrace;if(Error.prepareStackTrace=void 0,Q=Q.stack,Error.prepareStackTrace=X,Q.startsWith(`Error: react-stack-top-frame +See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),N}typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart==="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());var W={d:{f:Z,r:function(){throw Error("Invalid form element. requestFormReset must be passed a form that was rendered by React.")},D:Z,C:Z,L:Z,m:Z,X:Z,S:Z,M:Z},p:0,findDOMNode:null},G=Symbol.for("react.portal"),M=eA.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;typeof Map==="function"&&Map.prototype!=null&&typeof Map.prototype.forEach==="function"&&typeof Set==="function"&&Set.prototype!=null&&typeof Set.prototype.clear==="function"&&typeof Set.prototype.forEach==="function"||console.error("React depends on Map and Set built-in types. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),Il.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=W,Il.createPortal=function(N,O){var F=2` tag.%s',F),typeof N==="string"&&typeof O==="object"&&O!==null&&typeof O.as==="string"){F=O.as;var _=z(F,O.crossOrigin);W.d.L(N,F,{crossOrigin:_,integrity:typeof O.integrity==="string"?O.integrity:void 0,nonce:typeof O.nonce==="string"?O.nonce:void 0,type:typeof O.type==="string"?O.type:void 0,fetchPriority:typeof O.fetchPriority==="string"?O.fetchPriority:void 0,referrerPolicy:typeof O.referrerPolicy==="string"?O.referrerPolicy:void 0,imageSrcSet:typeof O.imageSrcSet==="string"?O.imageSrcSet:void 0,imageSizes:typeof O.imageSizes==="string"?O.imageSizes:void 0,media:typeof O.media==="string"?O.media:void 0})}},Il.preloadModule=function(N,O){var F="";typeof N==="string"&&N||(F+=" The `href` argument encountered was "+q(N)+"."),O!==void 0&&typeof O!=="object"?F+=" The `options` argument encountered was "+q(O)+".":O&&("as"in O)&&typeof O.as!=="string"&&(F+=" The `as` option encountered was "+q(O.as)+"."),F&&console.error('ReactDOM.preloadModule(): Expected two arguments, a non-empty `href` string and, optionally, an `options` object with an `as` property valid for a `` tag.%s',F),typeof N==="string"&&(O?(F=z(O.as,O.crossOrigin),W.d.m(N,{as:typeof O.as==="string"&&O.as!=="script"?O.as:void 0,crossOrigin:F,integrity:typeof O.integrity==="string"?O.integrity:void 0})):W.d.m(N))},Il.requestFormReset=function(N){W.d.r(N)},Il.unstable_batchedUpdates=function(N,O){return N(O)},Il.useFormState=function(N,O,F){return K().useFormState(N,O,F)},Il.useFormStatus=function(){return K().useHostTransitionStatus()},Il.version="19.2.4",typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop==="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()});var P3=_3((aZ0,uD)=>{var Sl=k(jD());uD.exports=Sl});var gD=_3((fl)=>{var r1=k(kD()),bJ=k(n()),ZF=k(P3());(function(){function Z(Q,X){for(Q=Q.memoizedState;Q!==null&&0=X.length)return $;var H=X[B],w=C2(Q)?Q.slice():v1({},Q);return w[H]=Y(Q[H],X,B+1,$),w}function J(Q,X,B){if(X.length!==B.length)console.warn("copyWithRename() expects paths of the same length");else{for(var $=0;$q8?console.error("Unexpected pop."):(X!==EO[q8]&&console.error("Unexpected Fiber popped."),Q.current=DO[q8],DO[q8]=null,EO[q8]=null,q8--)}function H0(Q,X,B){q8++,DO[q8]=Q.current,EO[q8]=B,Q.current=X}function Z0(Q){return Q===null&&console.error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."),Q}function p(Q,X){H0(A9,X,Q),H0(LB,Q,Q),H0(O9,null,Q);var B=X.nodeType;switch(B){case 9:case 11:B=B===9?"#document":"#fragment",X=(X=X.documentElement)?(X=X.namespaceURI)?Fv(X):P8:P8;break;default:if(B=X.tagName,X=X.namespaceURI)X=Fv(X),X=_v(X,B);else switch(B){case"svg":X=TJ;break;case"math":X=LW;break;default:X=P8}}B=B.toLowerCase(),B=HL(null,B),B={context:X,ancestorInfo:B},G0(O9,Q),H0(O9,B,Q)}function X0(Q){G0(O9,Q),G0(LB,Q),G0(A9,Q)}function B0(){return Z0(O9.current)}function Y0(Q){Q.memoizedState!==null&&H0(v$,Q,Q);var X=Z0(O9.current),B=Q.type,$=_v(X.context,B);B=HL(X.ancestorInfo,B),$={context:$,ancestorInfo:B},X!==$&&(H0(LB,Q,Q),H0(O9,$,Q))}function M0(Q){LB.current===Q&&(G0(O9,Q),G0(LB,Q)),v$.current===Q&&(G0(v$,Q),Mq._currentValue=AY)}function x(){}function $0(){if(VB===0){sv=console.log,tv=console.info,nv=console.warn,ev=console.error,Zb=console.group,Yb=console.groupCollapsed,Qb=console.groupEnd;var Q={configurable:!0,enumerable:!0,value:x,writable:!0};Object.defineProperties(console,{info:Q,log:Q,warn:Q,error:Q,group:Q,groupCollapsed:Q,groupEnd:Q})}VB++}function W0(){if(VB--,VB===0){var Q={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:v1({},Q,{value:sv}),info:v1({},Q,{value:tv}),warn:v1({},Q,{value:nv}),error:v1({},Q,{value:ev}),group:v1({},Q,{value:Zb}),groupCollapsed:v1({},Q,{value:Yb}),groupEnd:v1({},Q,{value:Qb})})}0>VB&&console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}function K0(Q){var X=Error.prepareStackTrace;if(Error.prepareStackTrace=void 0,Q=Q.stack,Error.prepareStackTrace=X,Q.startsWith(`Error: react-stack-top-frame `)&&(Q=Q.slice(29)),X=Q.indexOf(` `),X!==-1&&(Q=Q.slice(X+1)),X=Q.indexOf("react_stack_bottom_frame"),X!==-1&&(X=Q.lastIndexOf(` -`,X)),X!==-1)Q=Q.slice(0,X);else return"";return Q}function f0(Q){if(IO===void 0)try{throw Error()}catch(B){var X=B.stack.trim().match(/\n( *(at )?)/);IO=X&&X[1]||"",Xb=-1)":-1A||y[w]!==a[A]){var i=` -`+y[w].replace(" at new "," at ");return Q.displayName&&i.includes("")&&(i=i.replace("",Q.displayName)),typeof Q==="function"&&fO.set(Q,i),i}while(1<=w&&0<=A);break}}}finally{SO=!1,U0.H=$,W0(),Error.prepareStackTrace=B}return y=(y=Q?Q.displayName||Q.name:"")?f0(y):"",typeof Q==="function"&&fO.set(Q,y),y}function O0(Q,X){switch(Q.tag){case 26:case 27:case 5:return f0(Q.type);case 16:return f0("Lazy");case 13:return Q.child!==X&&X!==null?f0("Suspense Fallback"):f0("Suspense");case 19:return f0("SuspenseList");case 0:case 15:return X1(Q.type,!1);case 11:return X1(Q.type.render,!1);case 1:return X1(Q.type,!0);case 31:return f0("Activity");default:return""}}function K1(Q){try{var X="",B=null;do{X+=O0(Q,B);var $=Q._debugInfo;if($)for(var H=$.length-1;0<=H;H--){var w=$[H];if(typeof w.name==="string"){var A=X;Z:{var{name:P,env:T,debugLocation:y}=w;if(y!=null){var a=K0(y),i=a.lastIndexOf(` +`);for(A=w=0;wA||D[w]!==a[A]){var i=` +`+D[w].replace(" at new "," at ");return Q.displayName&&i.includes("")&&(i=i.replace("",Q.displayName)),typeof Q==="function"&&fO.set(Q,i),i}while(1<=w&&0<=A);break}}}finally{SO=!1,U0.H=$,W0(),Error.prepareStackTrace=B}return D=(D=Q?Q.displayName||Q.name:"")?f0(D):"",typeof Q==="function"&&fO.set(Q,D),D}function O0(Q,X){switch(Q.tag){case 26:case 27:case 5:return f0(Q.type);case 16:return f0("Lazy");case 13:return Q.child!==X&&X!==null?f0("Suspense Fallback"):f0("Suspense");case 19:return f0("SuspenseList");case 0:case 15:return X1(Q.type,!1);case 11:return X1(Q.type.render,!1);case 1:return X1(Q.type,!0);case 31:return f0("Activity");default:return""}}function K1(Q){try{var X="",B=null;do{X+=O0(Q,B);var $=Q._debugInfo;if($)for(var H=$.length-1;0<=H;H--){var w=$[H];if(typeof w.name==="string"){var A=X;Z:{var{name:P,env:T,debugLocation:D}=w;if(D!=null){var a=K0(D),i=a.lastIndexOf(` `),m=i===-1?a:a.slice(i+1);if(m.indexOf(P)!==-1){var J0=` `+m;break Z}}J0=f0(P+(T?" ["+T+"]":""))}X=A+J0}}B=Q,Q=Q.return}while(Q);return X}catch(L0){return` Error generating stack: `+L0.message+` -`+L0.stack}}function L1(Q){return(Q=Q?Q.displayName||Q.name:"")?f0(Q):""}function o1(){if(R4===null)return null;var Q=R4._debugOwner;return Q!=null?Q0(Q):null}function h1(){if(R4===null)return"";var Q=R4;try{var X="";switch(Q.tag===6&&(Q=Q.return),Q.tag){case 26:case 27:case 5:X+=f0(Q.type);break;case 13:X+=f0("Suspense");break;case 19:X+=f0("SuspenseList");break;case 31:X+=f0("Activity");break;case 30:case 0:case 15:case 1:Q._debugOwner||X!==""||(X+=L1(Q.type));break;case 11:Q._debugOwner||X!==""||(X+=L1(Q.type.render))}for(;Q;)if(typeof Q.tag==="number"){var B=Q;Q=B._debugOwner;var $=B._debugStack;if(Q&&$){var H=K0($);H!==""&&(X+=` +`+L0.stack}}function L1(Q){return(Q=Q?Q.displayName||Q.name:"")?f0(Q):""}function o1(){if(R4===null)return null;var Q=R4._debugOwner;return Q!=null?Q0(Q):null}function g1(){if(R4===null)return"";var Q=R4;try{var X="";switch(Q.tag===6&&(Q=Q.return),Q.tag){case 26:case 27:case 5:X+=f0(Q.type);break;case 13:X+=f0("Suspense");break;case 19:X+=f0("SuspenseList");break;case 31:X+=f0("Activity");break;case 30:case 0:case 15:case 1:Q._debugOwner||X!==""||(X+=L1(Q.type));break;case 11:Q._debugOwner||X!==""||(X+=L1(Q.type.render))}for(;Q;)if(typeof Q.tag==="number"){var B=Q;Q=B._debugOwner;var $=B._debugStack;if(Q&&$){var H=K0($);H!==""&&(X+=` `+H)}}else if(Q.debugStack!=null){var w=Q.debugStack;(Q=Q.owner)&&w&&(X+=` `+K0(w))}else break;var A=X}catch(P){A=` Error generating stack: `+P.message+` -`+P.stack}return A}function b0(Q,X,B,$,H,w,A){var P=R4;l1(Q);try{return Q!==null&&Q._debugTask?Q._debugTask.run(X.bind(null,B,$,H,w,A)):X(B,$,H,w,A)}finally{l1(P)}throw Error("runWithFiberInDEV should never be called in production. This is a bug in React.")}function l1(Q){U0.getCurrentStack=Q===null?null:h1,G3=!1,R4=Q}function o5(Q){return typeof Symbol==="function"&&Symbol.toStringTag&&Q[Symbol.toStringTag]||Q.constructor.name||"Object"}function s5(Q){try{return w5(Q),!1}catch(X){return!0}}function w5(Q){return""+Q}function G1(Q,X){if(s5(Q))return console.error("The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.",X,o5(Q)),w5(Q)}function l6(Q,X){if(s5(Q))return console.error("The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.",X,o5(Q)),w5(Q)}function z1(Q){if(s5(Q))return console.error("Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.",o5(Q)),w5(Q)}function G4(Q){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")return!1;var X=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(X.isDisabled)return!0;if(!X.supportsFiber)return console.error("The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools"),!0;try{iQ=X.inject(Q),N7=X}catch(B){console.error("React instrumentation encountered an error: %o.",B)}return X.checkDCE?!0:!1}function E1(Q){if(typeof ld==="function"&&rd(Q),N7&&typeof N7.setStrictMode==="function")try{N7.setStrictMode(iQ,Q)}catch(X){H3||(H3=!0,console.error("React instrumentation encountered an error: %o",X))}}function N6(Q){return Q>>>=0,Q===0?32:31-(ad(Q)/id|0)|0}function s2(Q){var X=Q&42;if(X!==0)return X;switch(Q&-Q){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 Q&261888;case 262144:case 524288:case 1048576:case 2097152:return Q&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return Q&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return console.error("Should have found matching lanes. This is a bug in React."),Q}}function u4(Q,X,B){var $=Q.pendingLanes;if($===0)return 0;var H=0,w=Q.suspendedLanes,A=Q.pingedLanes;Q=Q.warmLanes;var P=$&134217727;return P!==0?($=P&~w,$!==0?H=s2($):(A&=P,A!==0?H=s2(A):B||(B=P&~Q,B!==0&&(H=s2(B))))):(P=$&~w,P!==0?H=s2(P):A!==0?H=s2(A):B||(B=$&~Q,B!==0&&(H=s2(B)))),H===0?0:X!==0&&X!==H&&(X&w)===0&&(w=H&-H,B=X&-X,w>=B||w===32&&(B&4194048)!==0)?X:H}function f2(Q,X){return(Q.pendingLanes&~(Q.suspendedLanes&~Q.pingedLanes)&X)===0}function O6(Q,X){switch(Q){case 1:case 2:case 4:case 8:case 64:return X+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 X+5000;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return console.error("Should have found matching lanes. This is a bug in React."),-1}}function A6(){var Q=D$;return D$<<=1,(D$&62914560)===0&&(D$=4194304),Q}function t2(Q){for(var X=[],B=0;31>B;B++)X.push(Q);return X}function L5(Q,X){Q.pendingLanes|=X,X!==268435456&&(Q.suspendedLanes=0,Q.pingedLanes=0,Q.warmLanes=0)}function U2(Q,X,B,$,H,w){var A=Q.pendingLanes;Q.pendingLanes=B,Q.suspendedLanes=0,Q.pingedLanes=0,Q.warmLanes=0,Q.expiredLanes&=B,Q.entangledLanes&=B,Q.errorRecoveryDisabledLanes&=B,Q.shellSuspendCounter=0;var{entanglements:P,expirationTimes:T,hiddenUpdates:y}=Q;for(B=A&~B;0"u")return null;try{return Q.activeElement||Q.body}catch(X){return Q.body}}function S0(Q){return Q.replace(ed,function(X){return"\\"+X.charCodeAt(0).toString(16)+" "})}function c0(Q,X){X.checked===void 0||X.defaultChecked===void 0||$b||(console.error("%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components",o1()||"A component",X.type),$b=!0),X.value===void 0||X.defaultValue===void 0||Kb||(console.error("%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components",o1()||"A component",X.type),Kb=!0)}function p0(Q,X,B,$,H,w,A,P){if(Q.name="",A!=null&&typeof A!=="function"&&typeof A!=="symbol"&&typeof A!=="boolean"?(G1(A,"type"),Q.type=A):Q.removeAttribute("type"),X!=null)if(A==="number"){if(X===0&&Q.value===""||Q.value!=X)Q.value=""+s(X)}else Q.value!==""+s(X)&&(Q.value=""+s(X));else A!=="submit"&&A!=="reset"||Q.removeAttribute("value");X!=null?d0(Q,A,s(X)):B!=null?d0(Q,A,s(B)):$!=null&&Q.removeAttribute("value"),H==null&&w!=null&&(Q.defaultChecked=!!w),H!=null&&(Q.checked=H&&typeof H!=="function"&&typeof H!=="symbol"),P!=null&&typeof P!=="function"&&typeof P!=="symbol"&&typeof P!=="boolean"?(G1(P,"name"),Q.name=""+s(P)):Q.removeAttribute("name")}function n0(Q,X,B,$,H,w,A,P){if(w!=null&&typeof w!=="function"&&typeof w!=="symbol"&&typeof w!=="boolean"&&(G1(w,"type"),Q.type=w),X!=null||B!=null){if(!(w!=="submit"&&w!=="reset"||X!==void 0&&X!==null)){P0(Q);return}B=B!=null?""+s(B):"",X=X!=null?""+s(X):B,P||X===Q.value||(Q.value=X),Q.defaultValue=X}$=$!=null?$:H,$=typeof $!=="function"&&typeof $!=="symbol"&&!!$,Q.checked=P?Q.checked:!!$,Q.defaultChecked=!!$,A!=null&&typeof A!=="function"&&typeof A!=="symbol"&&typeof A!=="boolean"&&(G1(A,"name"),Q.name=A),P0(Q)}function d0(Q,X,B){X==="number"&&I0(Q.ownerDocument)===Q||Q.defaultValue===""+B||(Q.defaultValue=""+B)}function g1(Q,X){X.value==null&&(typeof X.children==="object"&&X.children!==null?bJ.Children.forEach(X.children,function(B){B==null||typeof B==="string"||typeof B==="number"||typeof B==="bigint"||Gb||(Gb=!0,console.error("Cannot infer the option value of complex children. Pass a `value` prop or use a plain string as children to