From fb5fbd31f38ca8a9ccc75440b868f03227b75d10 Mon Sep 17 00:00:00 2001 From: Gaurav <39389231+gsquared94@users.noreply.github.com> Date: Fri, 27 Feb 2026 10:18:16 -0800 Subject: [PATCH] feat: better error messages (#20577) Co-authored-by: Gal Zahavi <38544478+galz10@users.noreply.github.com> # Conflicts: # packages/cli/src/test-utils/render.tsx # packages/cli/src/ui/AppContainer.tsx # packages/cli/src/ui/contexts/UIActionsContext.tsx # packages/core/src/utils/errors.test.ts # packages/core/src/utils/errors.ts --- packages/cli/src/core/auth.test.ts | 53 +++- packages/cli/src/core/auth.ts | 34 ++- packages/cli/src/core/initializer.test.ts | 12 +- packages/cli/src/core/initializer.ts | 5 +- packages/cli/src/gemini.test.tsx | 1 + packages/cli/src/test-utils/AppRig.tsx | 3 + packages/cli/src/test-utils/render.tsx | 15 ++ packages/cli/src/ui/AppContainer.tsx | 20 +- .../src/ui/auth/BannedAccountDialog.test.tsx | 241 ++++++++++++++++++ .../cli/src/ui/auth/BannedAccountDialog.tsx | 138 ++++++++++ .../BannedAccountDialog.test.tsx.snap | 17 ++ packages/cli/src/ui/auth/useAuth.ts | 19 +- .../cli/src/ui/components/DialogManager.tsx | 17 ++ .../cli/src/ui/contexts/UIActionsContext.tsx | 5 + .../cli/src/ui/contexts/UIStateContext.tsx | 7 + packages/core/src/utils/errors.test.ts | 125 +++++++++ packages/core/src/utils/errors.ts | 46 +++- packages/devtools/src/_client-assets.ts | 9 + 18 files changed, 748 insertions(+), 19 deletions(-) create mode 100644 packages/cli/src/ui/auth/BannedAccountDialog.test.tsx create mode 100644 packages/cli/src/ui/auth/BannedAccountDialog.tsx create mode 100644 packages/cli/src/ui/auth/__snapshots__/BannedAccountDialog.test.tsx.snap create mode 100644 packages/devtools/src/_client-assets.ts diff --git a/packages/cli/src/core/auth.test.ts b/packages/cli/src/core/auth.test.ts index c844ee6f93..f28e826f49 100644 --- a/packages/cli/src/core/auth.test.ts +++ b/packages/cli/src/core/auth.test.ts @@ -17,7 +17,6 @@ vi.mock('@google/gemini-cli-core', async (importOriginal) => { await importOriginal(); return { ...actual, - getErrorMessage: (e: unknown) => (e as Error).message, }; }); @@ -32,7 +31,7 @@ describe('auth', () => { it('should return null if authType is undefined', async () => { const result = await performInitialAuth(mockConfig, undefined); - expect(result).toBeNull(); + expect(result).toEqual({ authError: null, accountSuspensionInfo: null }); expect(mockConfig.refreshAuth).not.toHaveBeenCalled(); }); @@ -41,7 +40,7 @@ describe('auth', () => { mockConfig, AuthType.LOGIN_WITH_GOOGLE, ); - expect(result).toBeNull(); + expect(result).toEqual({ authError: null, accountSuspensionInfo: null }); expect(mockConfig.refreshAuth).toHaveBeenCalledWith( AuthType.LOGIN_WITH_GOOGLE, ); @@ -54,7 +53,10 @@ describe('auth', () => { mockConfig, AuthType.LOGIN_WITH_GOOGLE, ); - expect(result).toBe('Failed to login. Message: Auth failed'); + expect(result).toEqual({ + authError: 'Failed to login. Message: Auth failed', + accountSuspensionInfo: null, + }); expect(mockConfig.refreshAuth).toHaveBeenCalledWith( AuthType.LOGIN_WITH_GOOGLE, ); @@ -68,7 +70,48 @@ describe('auth', () => { mockConfig, AuthType.LOGIN_WITH_GOOGLE, ); - expect(result).toBeNull(); + expect(result).toEqual({ authError: null, accountSuspensionInfo: null }); + expect(mockConfig.refreshAuth).toHaveBeenCalledWith( + AuthType.LOGIN_WITH_GOOGLE, + ); + }); + + it('should return accountSuspensionInfo for 403 TOS_VIOLATION error', async () => { + vi.mocked(mockConfig.refreshAuth).mockRejectedValue({ + response: { + data: { + error: { + code: 403, + message: + 'This service has been disabled for violation of Terms of Service.', + details: [ + { + '@type': 'type.googleapis.com/google.rpc.ErrorInfo', + reason: 'TOS_VIOLATION', + domain: 'example.googleapis.com', + metadata: { + appeal_url: 'https://example.com/appeal', + appeal_url_link_text: 'Appeal Here', + }, + }, + ], + }, + }, + }, + }); + const result = await performInitialAuth( + mockConfig, + AuthType.LOGIN_WITH_GOOGLE, + ); + expect(result).toEqual({ + authError: null, + accountSuspensionInfo: { + message: + 'This service has been disabled for violation of Terms of Service.', + appealUrl: 'https://example.com/appeal', + appealLinkText: 'Appeal Here', + }, + }); expect(mockConfig.refreshAuth).toHaveBeenCalledWith( AuthType.LOGIN_WITH_GOOGLE, ); diff --git a/packages/cli/src/core/auth.ts b/packages/cli/src/core/auth.ts index 7b1e8c8277..f49fdecf76 100644 --- a/packages/cli/src/core/auth.ts +++ b/packages/cli/src/core/auth.ts @@ -9,20 +9,28 @@ import { type Config, getErrorMessage, ValidationRequiredError, + isAccountSuspendedError, } from '@google/gemini-cli-core'; +import type { AccountSuspensionInfo } from '../ui/contexts/UIStateContext.js'; + +export interface InitialAuthResult { + authError: string | null; + accountSuspensionInfo: AccountSuspensionInfo | null; +} + /** * Handles the initial authentication flow. * @param config The application config. * @param authType The selected auth type. - * @returns An error message if authentication fails, otherwise null. + * @returns The auth result with error message and account suspension status. */ export async function performInitialAuth( config: Config, authType: AuthType | undefined, -): Promise { +): Promise { if (!authType) { - return null; + return { authError: null, accountSuspensionInfo: null }; } try { @@ -33,10 +41,24 @@ export async function performInitialAuth( if (e instanceof ValidationRequiredError) { // Don't treat validation required as a fatal auth error during startup. // This allows the React UI to load and show the ValidationDialog. - return null; + return { authError: null, accountSuspensionInfo: null }; } - return `Failed to login. Message: ${getErrorMessage(e)}`; + const suspendedError = isAccountSuspendedError(e); + if (suspendedError) { + return { + authError: null, + accountSuspensionInfo: { + message: suspendedError.message, + appealUrl: suspendedError.appealUrl, + appealLinkText: suspendedError.appealLinkText, + }, + }; + } + return { + authError: `Failed to login. Message: ${getErrorMessage(e)}`, + accountSuspensionInfo: null, + }; } - return null; + return { authError: null, accountSuspensionInfo: null }; } diff --git a/packages/cli/src/core/initializer.test.ts b/packages/cli/src/core/initializer.test.ts index 57f1c41551..e4fdb2cba5 100644 --- a/packages/cli/src/core/initializer.test.ts +++ b/packages/cli/src/core/initializer.test.ts @@ -72,7 +72,10 @@ describe('initializer', () => { vi.mocked(IdeClient.getInstance).mockResolvedValue( mockIdeClient as unknown as IdeClient, ); - vi.mocked(performInitialAuth).mockResolvedValue(null); + vi.mocked(performInitialAuth).mockResolvedValue({ + authError: null, + accountSuspensionInfo: null, + }); vi.mocked(validateTheme).mockReturnValue(null); }); @@ -84,6 +87,7 @@ describe('initializer', () => { expect(result).toEqual({ authError: null, + accountSuspensionInfo: null, themeError: null, shouldOpenAuthDialog: false, geminiMdFileCount: 5, @@ -103,6 +107,7 @@ describe('initializer', () => { expect(result).toEqual({ authError: null, + accountSuspensionInfo: null, themeError: null, shouldOpenAuthDialog: false, geminiMdFileCount: 5, @@ -116,7 +121,10 @@ describe('initializer', () => { }); it('should handle auth error', async () => { - vi.mocked(performInitialAuth).mockResolvedValue('Auth failed'); + vi.mocked(performInitialAuth).mockResolvedValue({ + authError: 'Auth failed', + accountSuspensionInfo: null, + }); const result = await initializeApp( mockConfig as unknown as Config, mockSettings, diff --git a/packages/cli/src/core/initializer.ts b/packages/cli/src/core/initializer.ts index e99efd90f6..f27e9a9511 100644 --- a/packages/cli/src/core/initializer.ts +++ b/packages/cli/src/core/initializer.ts @@ -17,9 +17,11 @@ import { import { type LoadedSettings } from '../config/settings.js'; import { performInitialAuth } from './auth.js'; import { validateTheme } from './theme.js'; +import type { AccountSuspensionInfo } from '../ui/contexts/UIStateContext.js'; export interface InitializationResult { authError: string | null; + accountSuspensionInfo: AccountSuspensionInfo | null; themeError: string | null; shouldOpenAuthDialog: boolean; geminiMdFileCount: number; @@ -37,7 +39,7 @@ export async function initializeApp( settings: LoadedSettings, ): Promise { const authHandle = startupProfiler.start('authenticate'); - const authError = await performInitialAuth( + const { authError, accountSuspensionInfo } = await performInitialAuth( config, settings.merged.security.auth.selectedType, ); @@ -60,6 +62,7 @@ export async function initializeApp( return { authError, + accountSuspensionInfo, themeError, shouldOpenAuthDialog, geminiMdFileCount: config.getGeminiMdFileCount(), diff --git a/packages/cli/src/gemini.test.tsx b/packages/cli/src/gemini.test.tsx index 9dac908a97..fe7e30b29e 100644 --- a/packages/cli/src/gemini.test.tsx +++ b/packages/cli/src/gemini.test.tsx @@ -1179,6 +1179,7 @@ describe('startInteractiveUI', () => { const mockWorkspaceRoot = '/root'; const mockInitializationResult = { authError: null, + accountSuspensionInfo: null, themeError: null, shouldOpenAuthDialog: false, geminiMdFileCount: 0, diff --git a/packages/cli/src/test-utils/AppRig.tsx b/packages/cli/src/test-utils/AppRig.tsx index b0db8b8ac6..5655d547c6 100644 --- a/packages/cli/src/test-utils/AppRig.tsx +++ b/packages/cli/src/test-utils/AppRig.tsx @@ -63,6 +63,8 @@ vi.mock('../ui/auth/useAuth.js', () => ({ onAuthError: vi.fn(), apiKeyDefaultValue: 'test-api-key', reloadApiKey: vi.fn().mockResolvedValue('test-api-key'), + accountSuspensionInfo: null, + setAccountSuspensionInfo: vi.fn(), }), validateAuthMethodWithSettings: () => null, })); @@ -277,6 +279,7 @@ export class AppRig { version="test-version" initializationResult={{ authError: null, + accountSuspensionInfo: null, themeError: null, shouldOpenAuthDialog: false, geminiMdFileCount: 0, diff --git a/packages/cli/src/test-utils/render.tsx b/packages/cli/src/test-utils/render.tsx index cb944b7c91..b4b6e14728 100644 --- a/packages/cli/src/test-utils/render.tsx +++ b/packages/cli/src/test-utils/render.tsx @@ -221,6 +221,21 @@ const mockUIActions: UIActions = { setAuthContext: vi.fn(), handleRestart: vi.fn(), handleNewAgentsSelect: vi.fn(), +<<<<<<< HEAD +======= + getPreferredEditor: vi.fn(), + clearAccountSuspension: vi.fn(), +}; + +let capturedOverflowState: OverflowState | undefined; +let capturedOverflowActions: OverflowActions | undefined; +const ContextCapture: React.FC<{ children: React.ReactNode }> = ({ + children, +}) => { + capturedOverflowState = useOverflowState(); + capturedOverflowActions = useOverflowActions(); + return <>{children}; +>>>>>>> ea48bd941 (feat: better error messages (#20577)) }; export const renderWithProviders = ( diff --git a/packages/cli/src/ui/AppContainer.tsx b/packages/cli/src/ui/AppContainer.tsx index b3fc1e3352..b0f4c768f4 100644 --- a/packages/cli/src/ui/AppContainer.tsx +++ b/packages/cli/src/ui/AppContainer.tsx @@ -625,7 +625,14 @@ export const AppContainer = (props: AppContainerProps) => { onAuthError, apiKeyDefaultValue, reloadApiKey, - } = useAuthCommand(settings, config, initializationResult.authError); + accountSuspensionInfo, + setAccountSuspensionInfo, + } = useAuthCommand( + settings, + config, + initializationResult.authError, + initializationResult.accountSuspensionInfo, + ); const [authContext, setAuthContext] = useState<{ requiresRestart?: boolean }>( {}, ); @@ -1977,6 +1984,7 @@ Logging in with Google... Restarting Gemini CLI to continue. isAuthenticating, isConfigInitialized, authError, + accountSuspensionInfo, isAuthDialogOpen, isAwaitingApiKeyInput: authState === AuthState.AwaitingApiKeyInput, apiKeyDefaultValue, @@ -2094,6 +2102,7 @@ Logging in with Google... Restarting Gemini CLI to continue. isAuthenticating, isConfigInitialized, authError, + accountSuspensionInfo, isAuthDialogOpen, editorError, isEditorDialogOpen, @@ -2288,6 +2297,14 @@ Logging in with Google... Restarting Gemini CLI to continue. } setNewAgents(null); }, +<<<<<<< HEAD +======= + getPreferredEditor, + clearAccountSuspension: () => { + setAccountSuspensionInfo(null); + setAuthState(AuthState.Updating); + }, +>>>>>>> ea48bd941 (feat: better error messages (#20577)) }), [ handleThemeSelect, @@ -2335,6 +2352,7 @@ Logging in with Google... Restarting Gemini CLI to continue. setActiveBackgroundShellPid, setIsBackgroundShellListOpen, setAuthContext, + setAccountSuspensionInfo, newAgents, config, historyManager, diff --git a/packages/cli/src/ui/auth/BannedAccountDialog.test.tsx b/packages/cli/src/ui/auth/BannedAccountDialog.test.tsx new file mode 100644 index 0000000000..692b249415 --- /dev/null +++ b/packages/cli/src/ui/auth/BannedAccountDialog.test.tsx @@ -0,0 +1,241 @@ +/** + * @license + * Copyright 2026 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import { describe, it, expect, vi, beforeEach, type Mock } from 'vitest'; +import { renderWithProviders } from '../../test-utils/render.js'; +import { waitFor } from '../../test-utils/async.js'; +import { BannedAccountDialog } from './BannedAccountDialog.js'; +import { RadioButtonSelect } from '../components/shared/RadioButtonSelect.js'; +import { useKeypress } from '../hooks/useKeypress.js'; +import { + openBrowserSecurely, + shouldLaunchBrowser, +} from '@google/gemini-cli-core'; +import { Text } from 'ink'; +import { runExitCleanup } from '../../utils/cleanup.js'; +import type { AccountSuspensionInfo } from '../contexts/UIStateContext.js'; + +vi.mock('@google/gemini-cli-core', async (importOriginal) => { + const actual = + await importOriginal(); + return { + ...actual, + openBrowserSecurely: vi.fn(), + shouldLaunchBrowser: vi.fn().mockReturnValue(true), + }; +}); + +vi.mock('../../utils/cleanup.js', () => ({ + runExitCleanup: vi.fn().mockResolvedValue(undefined), +})); + +vi.mock('../hooks/useKeypress.js', () => ({ + useKeypress: vi.fn(), +})); + +vi.mock('../components/shared/RadioButtonSelect.js', () => ({ + RadioButtonSelect: vi.fn(({ items }) => ( + <> + {items.map((item: { value: string; label: string }) => ( + {item.label} + ))} + + )), +})); + +const mockedRadioButtonSelect = RadioButtonSelect as Mock; +const mockedUseKeypress = useKeypress as Mock; +const mockedOpenBrowser = openBrowserSecurely as Mock; +const mockedShouldLaunchBrowser = shouldLaunchBrowser as Mock; +const mockedRunExitCleanup = runExitCleanup as Mock; + +const DEFAULT_SUSPENSION_INFO: AccountSuspensionInfo = { + message: + 'This service has been disabled in this account for violation of Terms of Service. Please submit an appeal to continue using this product.', + appealUrl: 'https://example.com/appeal', + appealLinkText: 'Appeal Here', +}; + +describe('BannedAccountDialog', () => { + let onExit: Mock; + let onChangeAuth: Mock; + + beforeEach(() => { + vi.resetAllMocks(); + mockedShouldLaunchBrowser.mockReturnValue(true); + mockedOpenBrowser.mockResolvedValue(undefined); + mockedRunExitCleanup.mockResolvedValue(undefined); + onExit = vi.fn(); + onChangeAuth = vi.fn(); + }); + + it('renders the suspension message from accountSuspensionInfo', async () => { + const { lastFrame, waitUntilReady, unmount } = renderWithProviders( + , + ); + await waitUntilReady(); + const frame = lastFrame(); + expect(frame).toContain('Account Suspended'); + expect(frame).toContain('violation of Terms of Service'); + expect(frame).toContain('Escape to exit'); + unmount(); + }); + + it('renders menu options with appeal link text from response', async () => { + const { waitUntilReady, unmount } = renderWithProviders( + , + ); + await waitUntilReady(); + const items = mockedRadioButtonSelect.mock.calls[0][0].items; + expect(items).toHaveLength(3); + expect(items[0].label).toBe('Appeal Here'); + expect(items[1].label).toBe('Change authentication'); + expect(items[2].label).toBe('Exit'); + unmount(); + }); + + it('hides form option when no appealUrl is provided', async () => { + const infoWithoutUrl: AccountSuspensionInfo = { + message: 'Account suspended.', + }; + const { waitUntilReady, unmount } = renderWithProviders( + , + ); + await waitUntilReady(); + const items = mockedRadioButtonSelect.mock.calls[0][0].items; + expect(items).toHaveLength(2); + expect(items[0].label).toBe('Change authentication'); + expect(items[1].label).toBe('Exit'); + unmount(); + }); + + it('uses default label when appealLinkText is not provided', async () => { + const infoWithoutLinkText: AccountSuspensionInfo = { + message: 'Account suspended.', + appealUrl: 'https://example.com/appeal', + }; + const { waitUntilReady, unmount } = renderWithProviders( + , + ); + await waitUntilReady(); + const items = mockedRadioButtonSelect.mock.calls[0][0].items; + expect(items[0].label).toBe('Open the Google Form'); + unmount(); + }); + + it('opens browser when appeal option is selected', async () => { + const { waitUntilReady, unmount } = renderWithProviders( + , + ); + await waitUntilReady(); + const { onSelect } = mockedRadioButtonSelect.mock.calls[0][0]; + await onSelect('open_form'); + expect(mockedOpenBrowser).toHaveBeenCalledWith( + 'https://example.com/appeal', + ); + expect(onExit).not.toHaveBeenCalled(); + unmount(); + }); + + it('shows URL when browser cannot be launched', async () => { + mockedShouldLaunchBrowser.mockReturnValue(false); + const { lastFrame, waitUntilReady, unmount } = renderWithProviders( + , + ); + await waitUntilReady(); + const { onSelect } = mockedRadioButtonSelect.mock.calls[0][0]; + onSelect('open_form'); + await waitFor(() => { + expect(lastFrame()).toContain('Please open this URL in a browser'); + }); + expect(mockedOpenBrowser).not.toHaveBeenCalled(); + unmount(); + }); + + it('calls onExit when "Exit" is selected', async () => { + const { waitUntilReady, unmount } = renderWithProviders( + , + ); + await waitUntilReady(); + const { onSelect } = mockedRadioButtonSelect.mock.calls[0][0]; + await onSelect('exit'); + expect(mockedRunExitCleanup).toHaveBeenCalled(); + expect(onExit).toHaveBeenCalled(); + unmount(); + }); + + it('calls onChangeAuth when "Change authentication" is selected', async () => { + const { waitUntilReady, unmount } = renderWithProviders( + , + ); + await waitUntilReady(); + const { onSelect } = mockedRadioButtonSelect.mock.calls[0][0]; + onSelect('change_auth'); + expect(onChangeAuth).toHaveBeenCalled(); + expect(onExit).not.toHaveBeenCalled(); + unmount(); + }); + + it('exits on escape key', async () => { + const { waitUntilReady, unmount } = renderWithProviders( + , + ); + await waitUntilReady(); + const keypressHandler = mockedUseKeypress.mock.calls[0][0]; + const result = keypressHandler({ name: 'escape' }); + expect(result).toBe(true); + unmount(); + }); + + it('renders snapshot correctly', async () => { + const { lastFrame, waitUntilReady, unmount } = renderWithProviders( + , + ); + await waitUntilReady(); + expect(lastFrame()).toMatchSnapshot(); + unmount(); + }); +}); diff --git a/packages/cli/src/ui/auth/BannedAccountDialog.tsx b/packages/cli/src/ui/auth/BannedAccountDialog.tsx new file mode 100644 index 0000000000..e051ba082b --- /dev/null +++ b/packages/cli/src/ui/auth/BannedAccountDialog.tsx @@ -0,0 +1,138 @@ +/** + * @license + * Copyright 2026 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import type React from 'react'; +import { useCallback, useMemo, useState } from 'react'; +import { Box, Text } from 'ink'; +import { theme } from '../semantic-colors.js'; +import { RadioButtonSelect } from '../components/shared/RadioButtonSelect.js'; +import { useKeypress } from '../hooks/useKeypress.js'; +import { + openBrowserSecurely, + shouldLaunchBrowser, +} from '@google/gemini-cli-core'; +import { runExitCleanup } from '../../utils/cleanup.js'; +import type { AccountSuspensionInfo } from '../contexts/UIStateContext.js'; + +interface BannedAccountDialogProps { + accountSuspensionInfo: AccountSuspensionInfo; + onExit: () => void; + onChangeAuth: () => void; +} + +export function BannedAccountDialog({ + accountSuspensionInfo, + onExit, + onChangeAuth, +}: BannedAccountDialogProps): React.JSX.Element { + const [errorMessage, setErrorMessage] = useState(null); + + const appealUrl = accountSuspensionInfo.appealUrl; + const appealLinkText = + accountSuspensionInfo.appealLinkText ?? 'Open the Google Form'; + + const items = useMemo(() => { + const menuItems = []; + if (appealUrl) { + menuItems.push({ + label: appealLinkText, + value: 'open_form' as const, + key: 'open_form', + }); + } + menuItems.push( + { + label: 'Change authentication', + value: 'change_auth' as const, + key: 'change_auth', + }, + { + label: 'Exit', + value: 'exit' as const, + key: 'exit', + }, + ); + return menuItems; + }, [appealUrl, appealLinkText]); + + useKeypress( + (key) => { + if (key.name === 'escape') { + void handleExit(); + return true; + } + return false; + }, + { isActive: true }, + ); + + const handleExit = useCallback(async () => { + await runExitCleanup(); + onExit(); + }, [onExit]); + + const handleSelect = useCallback( + async (choice: string) => { + if (choice === 'open_form' && appealUrl) { + if (!shouldLaunchBrowser()) { + setErrorMessage(`Please open this URL in a browser: ${appealUrl}`); + return; + } + + try { + await openBrowserSecurely(appealUrl); + } catch { + setErrorMessage(`Failed to open browser. Please visit: ${appealUrl}`); + } + } else if (choice === 'change_auth') { + onChangeAuth(); + } else { + await handleExit(); + } + }, + [handleExit, onChangeAuth, appealUrl], + ); + + return ( + + + Error: Account Suspended + + + + {accountSuspensionInfo.message} + + + {appealUrl && ( + <> + + Appeal URL: + + + [{appealUrl}] + + + )} + + {errorMessage && ( + + {errorMessage} + + )} + + + void handleSelect(choice)} + /> + + + + Escape to exit + + + ); +} diff --git a/packages/cli/src/ui/auth/__snapshots__/BannedAccountDialog.test.tsx.snap b/packages/cli/src/ui/auth/__snapshots__/BannedAccountDialog.test.tsx.snap new file mode 100644 index 0000000000..b95994692d --- /dev/null +++ b/packages/cli/src/ui/auth/__snapshots__/BannedAccountDialog.test.tsx.snap @@ -0,0 +1,17 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`BannedAccountDialog > renders snapshot correctly 1`] = ` +" + Error: Account Suspended + + This service has been disabled in this account for violation of Terms of Service. Please submit an + appeal to continue using this product. + + Appeal URL: + [https://example.com/appeal] + + Appeal HereChange authenticationExit + + Escape to exit +" +`; diff --git a/packages/cli/src/ui/auth/useAuth.ts b/packages/cli/src/ui/auth/useAuth.ts index effb17cdff..3faec2d5a8 100644 --- a/packages/cli/src/ui/auth/useAuth.ts +++ b/packages/cli/src/ui/auth/useAuth.ts @@ -11,6 +11,7 @@ import { type Config, loadApiKey, debugLogger, + isAccountSuspendedError, } from '@google/gemini-cli-core'; import { getErrorMessage } from '@google/gemini-cli-core'; import { AuthState } from '../types.js'; @@ -34,16 +35,21 @@ export function validateAuthMethodWithSettings( return validateAuthMethod(authType); } +import type { AccountSuspensionInfo } from '../contexts/UIStateContext.js'; + export const useAuthCommand = ( settings: LoadedSettings, config: Config, initialAuthError: string | null = null, + initialAccountSuspensionInfo: AccountSuspensionInfo | null = null, ) => { const [authState, setAuthState] = useState( initialAuthError ? AuthState.Updating : AuthState.Unauthenticated, ); const [authError, setAuthError] = useState(initialAuthError); + const [accountSuspensionInfo, setAccountSuspensionInfo] = + useState(initialAccountSuspensionInfo); const [apiKeyDefaultValue, setApiKeyDefaultValue] = useState< string | undefined >(undefined); @@ -130,7 +136,16 @@ export const useAuthCommand = ( setAuthError(null); setAuthState(AuthState.Authenticated); } catch (e) { - onAuthError(`Failed to login. Message: ${getErrorMessage(e)}`); + const suspendedError = isAccountSuspendedError(e); + if (suspendedError) { + setAccountSuspensionInfo({ + message: suspendedError.message, + appealUrl: suspendedError.appealUrl, + appealLinkText: suspendedError.appealLinkText, + }); + } else { + onAuthError(`Failed to login. Message: ${getErrorMessage(e)}`); + } } })(); }, [ @@ -150,5 +165,7 @@ export const useAuthCommand = ( onAuthError, apiKeyDefaultValue, reloadApiKey, + accountSuspensionInfo, + setAccountSuspensionInfo, }; }; diff --git a/packages/cli/src/ui/components/DialogManager.tsx b/packages/cli/src/ui/components/DialogManager.tsx index b28f5de218..4cb7094acf 100644 --- a/packages/cli/src/ui/components/DialogManager.tsx +++ b/packages/cli/src/ui/components/DialogManager.tsx @@ -13,6 +13,7 @@ import { ThemeDialog } from './ThemeDialog.js'; import { SettingsDialog } from './SettingsDialog.js'; import { AuthInProgress } from '../auth/AuthInProgress.js'; import { AuthDialog } from '../auth/AuthDialog.js'; +import { BannedAccountDialog } from '../auth/BannedAccountDialog.js'; import { ApiAuthDialog } from '../auth/ApiAuthDialog.js'; import { EditorSettingsDialog } from './EditorSettingsDialog.js'; import { PrivacyNotice } from '../privacy/PrivacyNotice.js'; @@ -284,6 +285,21 @@ export const DialogManager = ({ ); } + if (uiState.accountSuspensionInfo) { + return ( + + { + process.exit(1); + }} + onChangeAuth={() => { + uiActions.clearAccountSuspension(); + }} + /> + + ); + } if (uiState.isAuthenticating) { return ( ); } + if (uiState.isAuthDialogOpen) { return ( diff --git a/packages/cli/src/ui/contexts/UIActionsContext.tsx b/packages/cli/src/ui/contexts/UIActionsContext.tsx index c80507f9d7..95adb51c03 100644 --- a/packages/cli/src/ui/contexts/UIActionsContext.tsx +++ b/packages/cli/src/ui/contexts/UIActionsContext.tsx @@ -82,6 +82,11 @@ export interface UIActions { setAuthContext: (context: { requiresRestart?: boolean }) => void; handleRestart: () => void; handleNewAgentsSelect: (choice: NewAgentsChoice) => Promise; +<<<<<<< HEAD +======= + getPreferredEditor: () => EditorType | undefined; + clearAccountSuspension: () => void; +>>>>>>> ea48bd941 (feat: better error messages (#20577)) } export const UIActionsContext = createContext(null); diff --git a/packages/cli/src/ui/contexts/UIStateContext.tsx b/packages/cli/src/ui/contexts/UIStateContext.tsx index e64b5a1f99..e0f5d63634 100644 --- a/packages/cli/src/ui/contexts/UIStateContext.tsx +++ b/packages/cli/src/ui/contexts/UIStateContext.tsx @@ -62,6 +62,12 @@ export interface QuotaState { validationRequest: ValidationDialogRequest | null; } +export interface AccountSuspensionInfo { + message: string; + appealUrl?: string; + appealLinkText?: string; +} + export interface UIState { history: HistoryItem[]; historyManager: UseHistoryManagerReturn; @@ -72,6 +78,7 @@ export interface UIState { isAuthenticating: boolean; isConfigInitialized: boolean; authError: string | null; + accountSuspensionInfo: AccountSuspensionInfo | null; isAuthDialogOpen: boolean; isAwaitingApiKeyInput: boolean; apiKeyDefaultValue?: string; diff --git a/packages/core/src/utils/errors.test.ts b/packages/core/src/utils/errors.test.ts index 58c7004190..2cab277b36 100644 --- a/packages/core/src/utils/errors.test.ts +++ b/packages/core/src/utils/errors.test.ts @@ -11,6 +11,7 @@ import { toFriendlyError, BadRequestError, ForbiddenError, + AccountSuspendedError, getErrorMessage, } from './errors.js'; @@ -119,9 +120,86 @@ describe('toFriendlyError', () => { }; const result = toFriendlyError(error); expect(result).toBeInstanceOf(ForbiddenError); + expect(result).not.toBeInstanceOf(AccountSuspendedError); expect((result as ForbiddenError).message).toBe('Forbidden'); }); + it('should return AccountSuspendedError for 403 with TOS_VIOLATION reason in details', () => { + const error = { + response: { + data: { + error: { + code: 403, + message: + 'This service has been disabled in this account for violation of Terms of Service.', + details: [ + { + '@type': 'type.googleapis.com/google.rpc.ErrorInfo', + reason: 'TOS_VIOLATION', + domain: 'example.googleapis.com', + metadata: { + uiMessage: 'true', + appeal_url_link_text: 'Appeal Here', + appeal_url: 'https://example.com/appeal', + }, + }, + ], + }, + }, + }, + }; + const result = toFriendlyError(error); + expect(result).toBeInstanceOf(AccountSuspendedError); + expect(result).toBeInstanceOf(ForbiddenError); + const suspended = result as AccountSuspendedError; + expect(suspended.message).toBe( + 'This service has been disabled in this account for violation of Terms of Service.', + ); + expect(suspended.appealUrl).toBe('https://example.com/appeal'); + expect(suspended.appealLinkText).toBe('Appeal Here'); + }); + + it('should return ForbiddenError for 403 with violation message but no TOS_VIOLATION detail', () => { + const error = { + response: { + data: { + error: { + code: 403, + message: + 'This service has been disabled in this account for violation of Terms of Service.', + }, + }, + }, + }; + const result = toFriendlyError(error); + expect(result).toBeInstanceOf(ForbiddenError); + expect(result).not.toBeInstanceOf(AccountSuspendedError); + }); + + it('should return ForbiddenError for 403 with non-TOS_VIOLATION detail', () => { + const error = { + response: { + data: { + error: { + code: 403, + message: 'Forbidden', + details: [ + { + '@type': 'type.googleapis.com/google.rpc.ErrorInfo', + reason: 'ACCESS_DENIED', + domain: 'googleapis.com', + metadata: {}, + }, + ], + }, + }, + }, + }; + const result = toFriendlyError(error); + expect(result).toBeInstanceOf(ForbiddenError); + expect(result).not.toBeInstanceOf(AccountSuspendedError); + }); + it('should parse stringified JSON data', () => { const error = { response: { @@ -201,3 +279,50 @@ describe('toFriendlyError', () => { expect(toFriendlyError(error)).toBe(error); }); }); +<<<<<<< HEAD +======= + +describe('getErrorType', () => { + it('should return error name for standard errors', () => { + expect(getErrorType(new Error('test'))).toBe('Error'); + expect(getErrorType(new TypeError('test'))).toBe('TypeError'); + expect(getErrorType(new SyntaxError('test'))).toBe('SyntaxError'); + }); + + it('should return constructor name for custom errors', () => { + expect(getErrorType(new FatalAuthenticationError('test'))).toBe( + 'FatalAuthenticationError', + ); + expect(getErrorType(new FatalInputError('test'))).toBe('FatalInputError'); + expect(getErrorType(new FatalSandboxError('test'))).toBe( + 'FatalSandboxError', + ); + expect(getErrorType(new FatalConfigError('test'))).toBe('FatalConfigError'); + expect(getErrorType(new FatalTurnLimitedError('test'))).toBe( + 'FatalTurnLimitedError', + ); + expect(getErrorType(new FatalToolExecutionError('test'))).toBe( + 'FatalToolExecutionError', + ); + expect(getErrorType(new FatalCancellationError('test'))).toBe( + 'FatalCancellationError', + ); + expect(getErrorType(new ForbiddenError('test'))).toBe('ForbiddenError'); + expect(getErrorType(new AccountSuspendedError('test'))).toBe( + 'AccountSuspendedError', + ); + expect(getErrorType(new UnauthorizedError('test'))).toBe( + 'UnauthorizedError', + ); + expect(getErrorType(new BadRequestError('test'))).toBe('BadRequestError'); + }); + + it('should return "unknown" for non-Error objects', () => { + expect(getErrorType('string error')).toBe('unknown'); + expect(getErrorType(123)).toBe('unknown'); + expect(getErrorType({})).toBe('unknown'); + expect(getErrorType(null)).toBe('unknown'); + expect(getErrorType(undefined)).toBe('unknown'); + }); +}); +>>>>>>> ea48bd941 (feat: better error messages (#20577)) diff --git a/packages/core/src/utils/errors.ts b/packages/core/src/utils/errors.ts index 2bba4f8abe..5b0a804ccc 100644 --- a/packages/core/src/utils/errors.ts +++ b/packages/core/src/utils/errors.ts @@ -4,6 +4,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +import { parseGoogleApiError, type ErrorInfo } from './googleErrors.js'; + interface GaxiosError { response?: { data?: unknown; @@ -79,6 +81,17 @@ export class CanceledError extends Error { } export class ForbiddenError extends Error {} +export class AccountSuspendedError extends ForbiddenError { + readonly appealUrl?: string; + readonly appealLinkText?: string; + + constructor(message: string, metadata?: Record) { + super(message); + this.name = 'AccountSuspendedError'; + this.appealUrl = metadata?.['appeal_url']; + this.appealLinkText = metadata?.['appeal_url_link_text']; + } +} export class UnauthorizedError extends Error {} export class BadRequestError extends Error {} @@ -97,10 +110,33 @@ interface ResponseData { } export function toFriendlyError(error: unknown): unknown { +<<<<<<< HEAD if (error && typeof error === 'object' && 'response' in error) { // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion const gaxiosError = error as GaxiosError; const data = parseResponseData(gaxiosError); +======= + // First, try structured parsing for TOS_VIOLATION detection. + const googleApiError = parseGoogleApiError(error); + if (googleApiError && googleApiError.code === 403) { + const tosDetail = googleApiError.details.find( + (d): d is ErrorInfo => + d['@type'] === 'type.googleapis.com/google.rpc.ErrorInfo' && + 'reason' in d && + d.reason === 'TOS_VIOLATION', + ); + if (tosDetail) { + return new AccountSuspendedError( + googleApiError.message, + tosDetail.metadata, + ); + } + } + + // Fall back to basic Gaxios error parsing for other HTTP errors. + if (isGaxiosError(error)) { + const data = parseResponseData(error); +>>>>>>> ea48bd941 (feat: better error messages (#20577)) if (data && data.error && data.error.message && data.error.code) { switch (data.error.code) { case 400: @@ -108,9 +144,6 @@ export function toFriendlyError(error: unknown): unknown { case 401: return new UnauthorizedError(data.error.message); case 403: - // It's import to pass the message here since it might - // explain the cause like "the cloud project you're - // using doesn't have code assist enabled". return new ForbiddenError(data.error.message); default: } @@ -119,6 +152,13 @@ export function toFriendlyError(error: unknown): unknown { return error; } +export function isAccountSuspendedError( + error: unknown, +): AccountSuspendedError | null { + const friendly = toFriendlyError(error); + return friendly instanceof AccountSuspendedError ? friendly : null; +} + function parseResponseData(error: GaxiosError): ResponseData | undefined { // Inexplicably, Gaxios sometimes doesn't JSONify the response data. if (typeof error.response?.data === 'string') { diff --git a/packages/devtools/src/_client-assets.ts b/packages/devtools/src/_client-assets.ts new file mode 100644 index 0000000000..71342b1aad --- /dev/null +++ b/packages/devtools/src/_client-assets.ts @@ -0,0 +1,9 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +// Auto-generated by esbuild.client.js — do not edit +export const INDEX_HTML = "\n\n \n \n \n Gemini CLI DevTools\n \n \n \n
\n \n \n\n"; +export const CLIENT_JS = "var ty=Object.create;var Wf=Object.defineProperty;var ey=Object.getOwnPropertyDescriptor;var ay=Object.getOwnPropertyNames;var ny=Object.getPrototypeOf,uy=Object.prototype.hasOwnProperty;var Il=(l,t)=>()=>(t||l((t={exports:{}}).exports,t),t.exports);var iy=(l,t,e,a)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let n of ay(t))!uy.call(l,n)&&n!==e&&Wf(l,n,{get:()=>t[n],enumerable:!(a=ey(t,n))||a.enumerable});return l};var Mt=(l,t,e)=>(e=l!=null?ty(ny(l)):{},iy(t||!l||!l.__esModule?Wf(e,\"default\",{value:l,enumerable:!0}):e,l));var io=Il(U=>{\"use strict\";var ui=Symbol.for(\"react.transitional.element\"),cy=Symbol.for(\"react.portal\"),fy=Symbol.for(\"react.fragment\"),oy=Symbol.for(\"react.strict_mode\"),sy=Symbol.for(\"react.profiler\"),dy=Symbol.for(\"react.consumer\"),yy=Symbol.for(\"react.context\"),vy=Symbol.for(\"react.forward_ref\"),my=Symbol.for(\"react.suspense\"),ry=Symbol.for(\"react.memo\"),lo=Symbol.for(\"react.lazy\"),hy=Symbol.for(\"react.activity\"),$f=Symbol.iterator;function gy(l){return l===null||typeof l!=\"object\"?null:(l=$f&&l[$f]||l[\"@@iterator\"],typeof l==\"function\"?l:null)}var to={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},eo=Object.assign,ao={};function xe(l,t,e){this.props=l,this.context=t,this.refs=ao,this.updater=e||to}xe.prototype.isReactComponent={};xe.prototype.setState=function(l,t){if(typeof l!=\"object\"&&typeof l!=\"function\"&&l!=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,l,t,\"setState\")};xe.prototype.forceUpdate=function(l){this.updater.enqueueForceUpdate(this,l,\"forceUpdate\")};function no(){}no.prototype=xe.prototype;function ii(l,t,e){this.props=l,this.context=t,this.refs=ao,this.updater=e||to}var ci=ii.prototype=new no;ci.constructor=ii;eo(ci,xe.prototype);ci.isPureReactComponent=!0;var Ff=Array.isArray;function ni(){}var K={H:null,A:null,T:null,S:null},uo=Object.prototype.hasOwnProperty;function fi(l,t,e){var a=e.ref;return{$$typeof:ui,type:l,key:t,ref:a!==void 0?a:null,props:e}}function Sy(l,t){return fi(l.type,t,l.props)}function oi(l){return typeof l==\"object\"&&l!==null&&l.$$typeof===ui}function py(l){var t={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+l.replace(/[=:]/g,function(e){return t[e]})}var If=/\\/+/g;function ai(l,t){return typeof l==\"object\"&&l!==null&&l.key!=null?py(\"\"+l.key):t.toString(36)}function by(l){switch(l.status){case\"fulfilled\":return l.value;case\"rejected\":throw l.reason;default:switch(typeof l.status==\"string\"?l.then(ni,ni):(l.status=\"pending\",l.then(function(t){l.status===\"pending\"&&(l.status=\"fulfilled\",l.value=t)},function(t){l.status===\"pending\"&&(l.status=\"rejected\",l.reason=t)})),l.status){case\"fulfilled\":return l.value;case\"rejected\":throw l.reason}}throw l}function Te(l,t,e,a,n){var u=typeof l;(u===\"undefined\"||u===\"boolean\")&&(l=null);var i=!1;if(l===null)i=!0;else switch(u){case\"bigint\":case\"string\":case\"number\":i=!0;break;case\"object\":switch(l.$$typeof){case ui:case cy:i=!0;break;case lo:return i=l._init,Te(i(l._payload),t,e,a,n)}}if(i)return n=n(l),i=a===\"\"?\".\"+ai(l,0):a,Ff(n)?(e=\"\",i!=null&&(e=i.replace(If,\"$&/\")+\"/\"),Te(n,t,e,\"\",function(s){return s})):n!=null&&(oi(n)&&(n=Sy(n,e+(n.key==null||l&&l.key===n.key?\"\":(\"\"+n.key).replace(If,\"$&/\")+\"/\")+i)),t.push(n)),1;i=0;var c=a===\"\"?\".\":a+\":\";if(Ff(l))for(var f=0;f{\"use strict\";co.exports=io()});var So=Il($=>{\"use strict\";function vi(l,t){var e=l.length;l.push(t);l:for(;0>>1,n=l[a];if(0>>1;aMn(c,e))fMn(s,c)?(l[a]=s,l[f]=e,a=f):(l[a]=c,l[i]=e,a=i);else if(fMn(s,e))l[a]=s,l[f]=e,a=f;else break l}}return t}function Mn(l,t){var e=l.sortIndex-t.sortIndex;return e!==0?e:l.id-t.id}$.unstable_now=void 0;typeof performance==\"object\"&&typeof performance.now==\"function\"?(fo=performance,$.unstable_now=function(){return fo.now()}):(si=Date,oo=si.now(),$.unstable_now=function(){return si.now()-oo});var fo,si,oo,it=[],Ot=[],Ty=1,Ll=null,gl=3,mi=!1,pa=!1,ba=!1,ri=!1,vo=typeof setTimeout==\"function\"?setTimeout:null,mo=typeof clearTimeout==\"function\"?clearTimeout:null,so=typeof setImmediate<\"u\"?setImmediate:null;function On(l){for(var t=Pl(Ot);t!==null;){if(t.callback===null)_n(Ot);else if(t.startTime<=l)_n(Ot),t.sortIndex=t.expirationTime,vi(it,t);else break;t=Pl(Ot)}}function hi(l){if(ba=!1,On(l),!pa)if(Pl(it)!==null)pa=!0,Oe||(Oe=!0,Me());else{var t=Pl(Ot);t!==null&&gi(hi,t.startTime-l)}}var Oe=!1,za=-1,ro=5,ho=-1;function go(){return ri?!0:!($.unstable_now()-hol&&go());){var a=Ll.callback;if(typeof a==\"function\"){Ll.callback=null,gl=Ll.priorityLevel;var n=a(Ll.expirationTime<=l);if(l=$.unstable_now(),typeof n==\"function\"){Ll.callback=n,On(l),t=!0;break t}Ll===Pl(it)&&_n(it),On(l)}else _n(it);Ll=Pl(it)}if(Ll!==null)t=!0;else{var u=Pl(Ot);u!==null&&gi(hi,u.startTime-l),t=!1}}break l}finally{Ll=null,gl=e,mi=!1}t=void 0}}finally{t?Me():Oe=!1}}}var Me;typeof so==\"function\"?Me=function(){so(di)}:typeof MessageChannel<\"u\"?(yi=new MessageChannel,yo=yi.port2,yi.port1.onmessage=di,Me=function(){yo.postMessage(null)}):Me=function(){vo(di,0)};var yi,yo;function gi(l,t){za=vo(function(){l($.unstable_now())},t)}$.unstable_IdlePriority=5;$.unstable_ImmediatePriority=1;$.unstable_LowPriority=4;$.unstable_NormalPriority=3;$.unstable_Profiling=null;$.unstable_UserBlockingPriority=2;$.unstable_cancelCallback=function(l){l.callback=null};$.unstable_forceFrameRate=function(l){0>l||125a?(l.sortIndex=e,vi(Ot,l),Pl(it)===null&&l===Pl(Ot)&&(ba?(mo(za),za=-1):ba=!0,gi(hi,e-a))):(l.sortIndex=n,vi(it,l),pa||mi||(pa=!0,Oe||(Oe=!0,Me()))),l};$.unstable_shouldYield=go;$.unstable_wrapCallback=function(l){var t=gl;return function(){var e=gl;gl=t;try{return l.apply(this,arguments)}finally{gl=e}}}});var bo=Il((dr,po)=>{\"use strict\";po.exports=So()});var Eo=Il(pl=>{\"use strict\";var xy=Ae();function zo(l){var t=\"https://react.dev/errors/\"+l;if(1{\"use strict\";function To(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>\"u\"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=\"function\"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(To)}catch(l){console.error(l)}}To(),xo.exports=Eo()});var Y1=Il(li=>{\"use strict\";var fl=bo(),Fs=Ae(),Oy=Ao();function p(l){var t=\"https://react.dev/errors/\"+l;if(1Re||(l.current=ec[Re],ec[Re]=null,Re--)}function V(l,t){Re++,ec[Re]=l.current,l.current=t}var at=nt(null),ka=nt(null),jt=nt(null),ou=nt(null);function su(l,t){switch(V(jt,t),V(ka,l),V(at,null),t.nodeType){case 9:case 11:l=(l=t.documentElement)&&(l=l.namespaceURI)?Rs(l):0;break;default:if(l=t.tagName,t=t.namespaceURI)t=Rs(t),l=T1(t,l);else switch(l){case\"svg\":l=1;break;case\"math\":l=2;break;default:l=0}}dl(at),V(at,l)}function Ie(){dl(at),dl(ka),dl(jt)}function ac(l){l.memoizedState!==null&&V(ou,l);var t=at.current,e=T1(t,l.type);t!==e&&(V(ka,l),V(at,e))}function du(l){ka.current===l&&(dl(at),dl(ka)),ou.current===l&&(dl(ou),un._currentValue=ie)}var Si,_o;function ee(l){if(Si===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\\n( *(at )?)/);Si=t&&t[1]||\"\",_o=-1)\":-1n||f[a]!==s[n]){var v=`\n`+f[a].replace(\" at new \",\" at \");return l.displayName&&v.includes(\"\")&&(v=v.replace(\"\",l.displayName)),v}while(1<=a&&0<=n);break}}}finally{pi=!1,Error.prepareStackTrace=e}return(e=l?l.displayName||l.name:\"\")?ee(e):\"\"}function Cy(l,t){switch(l.tag){case 26:case 27:case 5:return ee(l.type);case 16:return ee(\"Lazy\");case 13:return l.child!==t&&t!==null?ee(\"Suspense Fallback\"):ee(\"Suspense\");case 19:return ee(\"SuspenseList\");case 0:case 15:return bi(l.type,!1);case 11:return bi(l.type.render,!1);case 1:return bi(l.type,!0);case 31:return ee(\"Activity\");default:return\"\"}}function Do(l){try{var t=\"\",e=null;do t+=Cy(l,e),e=l,l=l.return;while(l);return t}catch(a){return`\nError generating stack: `+a.message+`\n`+a.stack}}var nc=Object.prototype.hasOwnProperty,kc=fl.unstable_scheduleCallback,zi=fl.unstable_cancelCallback,Hy=fl.unstable_shouldYield,Ry=fl.unstable_requestPaint,Cl=fl.unstable_now,By=fl.unstable_getCurrentPriorityLevel,nd=fl.unstable_ImmediatePriority,ud=fl.unstable_UserBlockingPriority,yu=fl.unstable_NormalPriority,qy=fl.unstable_LowPriority,id=fl.unstable_IdlePriority,Yy=fl.log,Ly=fl.unstable_setDisableYieldValue,sn=null,Hl=null;function Bt(l){if(typeof Yy==\"function\"&&Ly(l),Hl&&typeof Hl.setStrictMode==\"function\")try{Hl.setStrictMode(sn,l)}catch{}}var Rl=Math.clz32?Math.clz32:Xy,Gy=Math.log,jy=Math.LN2;function Xy(l){return l>>>=0,l===0?32:31-(Gy(l)/jy|0)|0}var Nn=256,Cn=262144,Hn=4194304;function ae(l){var t=l&42;if(t!==0)return t;switch(l&-l){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 l&261888;case 262144:case 524288:case 1048576:case 2097152:return l&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return l&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return l}}function Lu(l,t,e){var a=l.pendingLanes;if(a===0)return 0;var n=0,u=l.suspendedLanes,i=l.pingedLanes;l=l.warmLanes;var c=a&134217727;return c!==0?(a=c&~u,a!==0?n=ae(a):(i&=c,i!==0?n=ae(i):e||(e=c&~l,e!==0&&(n=ae(e))))):(c=a&~u,c!==0?n=ae(c):i!==0?n=ae(i):e||(e=a&~l,e!==0&&(n=ae(e)))),n===0?0:t!==0&&t!==n&&(t&u)===0&&(u=n&-n,e=t&-t,u>=e||u===32&&(e&4194048)!==0)?t:n}function dn(l,t){return(l.pendingLanes&~(l.suspendedLanes&~l.pingedLanes)&t)===0}function Qy(l,t){switch(l){case 1:case 2:case 4:case 8:case 64:return t+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 t+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 cd(){var l=Hn;return Hn<<=1,(Hn&62914560)===0&&(Hn=4194304),l}function Ei(l){for(var t=[],e=0;31>e;e++)t.push(l);return t}function yn(l,t){l.pendingLanes|=t,t!==268435456&&(l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0)}function Zy(l,t,e,a,n,u){var i=l.pendingLanes;l.pendingLanes=e,l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0,l.expiredLanes&=e,l.entangledLanes&=e,l.errorRecoveryDisabledLanes&=e,l.shellSuspendCounter=0;var c=l.entanglements,f=l.expirationTimes,s=l.hiddenUpdates;for(e=i&~e;0\"u\")return null;try{return l.activeElement||l.body}catch{return l.body}}var Wy=/[\\n\"\\\\]/g;function Zl(l){return l.replace(Wy,function(t){return\"\\\\\"+t.charCodeAt(0).toString(16)+\" \"})}function cc(l,t,e,a,n,u,i,c){l.name=\"\",i!=null&&typeof i!=\"function\"&&typeof i!=\"symbol\"&&typeof i!=\"boolean\"?l.type=i:l.removeAttribute(\"type\"),t!=null?i===\"number\"?(t===0&&l.value===\"\"||l.value!=t)&&(l.value=\"\"+jl(t)):l.value!==\"\"+jl(t)&&(l.value=\"\"+jl(t)):i!==\"submit\"&&i!==\"reset\"||l.removeAttribute(\"value\"),t!=null?fc(l,i,jl(t)):e!=null?fc(l,i,jl(e)):a!=null&&l.removeAttribute(\"value\"),n==null&&u!=null&&(l.defaultChecked=!!u),n!=null&&(l.checked=n&&typeof n!=\"function\"&&typeof n!=\"symbol\"),c!=null&&typeof c!=\"function\"&&typeof c!=\"symbol\"&&typeof c!=\"boolean\"?l.name=\"\"+jl(c):l.removeAttribute(\"name\")}function hd(l,t,e,a,n,u,i,c){if(u!=null&&typeof u!=\"function\"&&typeof u!=\"symbol\"&&typeof u!=\"boolean\"&&(l.type=u),t!=null||e!=null){if(!(u!==\"submit\"&&u!==\"reset\"||t!=null)){ic(l);return}e=e!=null?\"\"+jl(e):\"\",t=t!=null?\"\"+jl(t):e,c||t===l.value||(l.value=t),l.defaultValue=t}a=a??n,a=typeof a!=\"function\"&&typeof a!=\"symbol\"&&!!a,l.checked=c?l.checked:!!a,l.defaultChecked=!!a,i!=null&&typeof i!=\"function\"&&typeof i!=\"symbol\"&&typeof i!=\"boolean\"&&(l.name=i),ic(l)}function fc(l,t,e){t===\"number\"&&vu(l.ownerDocument)===l||l.defaultValue===\"\"+e||(l.defaultValue=\"\"+e)}function Je(l,t,e,a){if(l=l.options,t){t={};for(var n=0;n\"u\"||typeof window.document>\"u\"||typeof window.document.createElement>\"u\"),sc=!1;if(bt)try{_e={},Object.defineProperty(_e,\"passive\",{get:function(){sc=!0}}),window.addEventListener(\"test\",_e,_e),window.removeEventListener(\"test\",_e,_e)}catch{sc=!1}var _e,qt=null,lf=null,$n=null;function zd(){if($n)return $n;var l,t=lf,e=t.length,a,n=\"value\"in qt?qt.value:qt.textContent,u=n.length;for(l=0;l=Ba),jo=\" \",Xo=!1;function Td(l,t){switch(l){case\"keyup\":return Tv.indexOf(t.keyCode)!==-1;case\"keydown\":return t.keyCode!==229;case\"keypress\":case\"mousedown\":case\"focusout\":return!0;default:return!1}}function xd(l){return l=l.detail,typeof l==\"object\"&&\"data\"in l?l.data:null}var Ye=!1;function Av(l,t){switch(l){case\"compositionend\":return xd(t);case\"keypress\":return t.which!==32?null:(Xo=!0,jo);case\"textInput\":return l=t.data,l===jo&&Xo?null:l;default:return null}}function Mv(l,t){if(Ye)return l===\"compositionend\"||!ef&&Td(l,t)?(l=zd(),$n=lf=qt=null,Ye=!1,l):null;switch(l){case\"paste\":return null;case\"keypress\":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:e,offset:t-l};l=a}l:{for(;e;){if(e.nextSibling){e=e.nextSibling;break l}e=e.parentNode}e=void 0}e=Ko(e)}}function _d(l,t){return l&&t?l===t?!0:l&&l.nodeType===3?!1:t&&t.nodeType===3?_d(l,t.parentNode):\"contains\"in l?l.contains(t):l.compareDocumentPosition?!!(l.compareDocumentPosition(t)&16):!1:!1}function Dd(l){l=l!=null&&l.ownerDocument!=null&&l.ownerDocument.defaultView!=null?l.ownerDocument.defaultView:window;for(var t=vu(l.document);t instanceof l.HTMLIFrameElement;){try{var e=typeof t.contentWindow.location.href==\"string\"}catch{e=!1}if(e)l=t.contentWindow;else break;t=vu(l.document)}return t}function af(l){var t=l&&l.nodeName&&l.nodeName.toLowerCase();return t&&(t===\"input\"&&(l.type===\"text\"||l.type===\"search\"||l.type===\"tel\"||l.type===\"url\"||l.type===\"password\")||t===\"textarea\"||l.contentEditable===\"true\")}var Rv=bt&&\"documentMode\"in document&&11>=document.documentMode,Le=null,dc=null,Ya=null,yc=!1;function wo(l,t,e){var a=e.window===e?e.document:e.nodeType===9?e:e.ownerDocument;yc||Le==null||Le!==vu(a)||(a=Le,\"selectionStart\"in a&&af(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}),Ya&&Fa(Ya,a)||(Ya=a,a=Nu(dc,\"onSelect\"),0>=i,n-=i,lt=1<<32-Rl(t)+n|e<A?(O=b,b=null):O=b.sibling;var _=d(y,b,h[A],m);if(_===null){b===null&&(b=O);break}l&&b&&_.alternate===null&&t(y,b),o=u(_,o,A),M===null?z=_:M.sibling=_,M=_,b=O}if(A===h.length)return e(y,b),q&&yt(y,A),z;if(b===null){for(;AA?(O=b,b=null):O=b.sibling;var ll=d(y,b,_.value,m);if(ll===null){b===null&&(b=O);break}l&&b&&ll.alternate===null&&t(y,b),o=u(ll,o,A),M===null?z=ll:M.sibling=ll,M=ll,b=O}if(_.done)return e(y,b),q&&yt(y,A),z;if(b===null){for(;!_.done;A++,_=h.next())_=g(y,_.value,m),_!==null&&(o=u(_,o,A),M===null?z=_:M.sibling=_,M=_);return q&&yt(y,A),z}for(b=a(b);!_.done;A++,_=h.next())_=r(b,y,A,_.value,m),_!==null&&(l&&_.alternate!==null&&b.delete(_.key===null?A:_.key),o=u(_,o,A),M===null?z=_:M.sibling=_,M=_);return l&&b.forEach(function(W){return t(y,W)}),q&&yt(y,A),z}function x(y,o,h,m){if(typeof h==\"object\"&&h!==null&&h.type===He&&h.key===null&&(h=h.props.children),typeof h==\"object\"&&h!==null){switch(h.$$typeof){case Un:l:{for(var z=h.key;o!==null;){if(o.key===z){if(z=h.type,z===He){if(o.tag===7){e(y,o.sibling),m=n(o,h.props.children),m.return=y,y=m;break l}}else if(o.elementType===z||typeof z==\"object\"&&z!==null&&z.$$typeof===Dt&&ne(z)===o.type){e(y,o.sibling),m=n(o,h.props),Aa(m,h),m.return=y,y=m;break l}e(y,o);break}else t(y,o);o=o.sibling}h.type===He?(m=ce(h.props.children,y.mode,m,h.key),m.return=y,y=m):(m=In(h.type,h.key,h.props,null,y.mode,m),Aa(m,h),m.return=y,y=m)}return i(y);case Ua:l:{for(z=h.key;o!==null;){if(o.key===z)if(o.tag===4&&o.stateNode.containerInfo===h.containerInfo&&o.stateNode.implementation===h.implementation){e(y,o.sibling),m=n(o,h.children||[]),m.return=y,y=m;break l}else{e(y,o);break}else t(y,o);o=o.sibling}m=Ui(h,y.mode,m),m.return=y,y=m}return i(y);case Dt:return h=ne(h),x(y,o,h,m)}if(Na(h))return T(y,o,h,m);if(Ta(h)){if(z=Ta(h),typeof z!=\"function\")throw Error(p(150));return h=z.call(h),E(y,o,h,m)}if(typeof h.then==\"function\")return x(y,o,Gn(h),m);if(h.$$typeof===mt)return x(y,o,Ln(y,h),m);jn(y,h)}return typeof h==\"string\"&&h!==\"\"||typeof h==\"number\"||typeof h==\"bigint\"?(h=\"\"+h,o!==null&&o.tag===6?(e(y,o.sibling),m=n(o,h),m.return=y,y=m):(e(y,o),m=Di(h,y.mode,m),m.return=y,y=m),i(y)):e(y,o)}return function(y,o,h,m){try{ln=0;var z=x(y,o,h,m);return We=null,z}catch(b){if(b===ya||b===Vu)throw b;var M=Ul(29,b,null,y.mode);return M.lanes=m,M.return=y,M}finally{}}}var ve=Vd(!0),Kd=Vd(!1),Ut=!1;function vf(l){l.updateQueue={baseState:l.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function pc(l,t){l=l.updateQueue,t.updateQueue===l&&(t.updateQueue={baseState:l.baseState,firstBaseUpdate:l.firstBaseUpdate,lastBaseUpdate:l.lastBaseUpdate,shared:l.shared,callbacks:null})}function Qt(l){return{lane:l,tag:0,payload:null,callback:null,next:null}}function Zt(l,t,e){var a=l.updateQueue;if(a===null)return null;if(a=a.shared,(Y&2)!==0){var n=a.pending;return n===null?t.next=t:(t.next=n.next,n.next=t),a.pending=t,t=ru(l),qd(l,null,e),t}return Zu(l,a,t,e),ru(l)}function Ga(l,t,e){if(t=t.updateQueue,t!==null&&(t=t.shared,(e&4194048)!==0)){var a=t.lanes;a&=l.pendingLanes,e|=a,t.lanes=e,od(l,e)}}function Ci(l,t){var e=l.updateQueue,a=l.alternate;if(a!==null&&(a=a.updateQueue,e===a)){var n=null,u=null;if(e=e.firstBaseUpdate,e!==null){do{var i={lane:e.lane,tag:e.tag,payload:e.payload,callback:null,next:null};u===null?n=u=i:u=u.next=i,e=e.next}while(e!==null);u===null?n=u=t:u=u.next=t}else n=u=t;e={baseState:a.baseState,firstBaseUpdate:n,lastBaseUpdate:u,shared:a.shared,callbacks:a.callbacks},l.updateQueue=e;return}l=e.lastBaseUpdate,l===null?e.firstBaseUpdate=t:l.next=t,e.lastBaseUpdate=t}var bc=!1;function ja(){if(bc){var l=ke;if(l!==null)throw l}}function Xa(l,t,e,a){bc=!1;var n=l.updateQueue;Ut=!1;var u=n.firstBaseUpdate,i=n.lastBaseUpdate,c=n.shared.pending;if(c!==null){n.shared.pending=null;var f=c,s=f.next;f.next=null,i===null?u=s:i.next=s,i=f;var v=l.alternate;v!==null&&(v=v.updateQueue,c=v.lastBaseUpdate,c!==i&&(c===null?v.firstBaseUpdate=s:c.next=s,v.lastBaseUpdate=f))}if(u!==null){var g=n.baseState;i=0,v=s=f=null,c=u;do{var d=c.lane&-536870913,r=d!==c.lane;if(r?(B&d)===d:(a&d)===d){d!==0&&d===ta&&(bc=!0),v!==null&&(v=v.next={lane:0,tag:c.tag,payload:c.payload,callback:null,next:null});l:{var T=l,E=c;d=t;var x=e;switch(E.tag){case 1:if(T=E.payload,typeof T==\"function\"){g=T.call(x,g,d);break l}g=T;break l;case 3:T.flags=T.flags&-65537|128;case 0:if(T=E.payload,d=typeof T==\"function\"?T.call(x,g,d):T,d==null)break l;g=k({},g,d);break l;case 2:Ut=!0}}d=c.callback,d!==null&&(l.flags|=64,r&&(l.flags|=8192),r=n.callbacks,r===null?n.callbacks=[d]:r.push(d))}else r={lane:d,tag:c.tag,payload:c.payload,callback:c.callback,next:null},v===null?(s=v=r,f=g):v=v.next=r,i|=d;if(c=c.next,c===null){if(c=n.shared.pending,c===null)break;r=c,c=r.next,r.next=null,n.lastBaseUpdate=r,n.shared.pending=null}}while(!0);v===null&&(f=g),n.baseState=f,n.firstBaseUpdate=s,n.lastBaseUpdate=v,u===null&&(n.shared.lanes=0),It|=i,l.lanes=i,l.memoizedState=g}}function Jd(l,t){if(typeof l!=\"function\")throw Error(p(191,l));l.call(t)}function wd(l,t){var e=l.callbacks;if(e!==null)for(l.callbacks=null,l=0;lu?u:8;var i=D.T,c={};D.T=c,Mf(l,!1,t,e);try{var f=n(),s=D.S;if(s!==null&&s(c,f),f!==null&&typeof f==\"object\"&&typeof f.then==\"function\"){var v=Zv(f,a);Qa(l,t,v,Bl(l))}else Qa(l,t,a,Bl(l))}catch(g){Qa(l,t,{then:function(){},status:\"rejected\",reason:g},Bl())}finally{L.p=u,i!==null&&c.types!==null&&(i.types=c.types),D.T=i}}function Wv(){}function Ac(l,t,e,a){if(l.tag!==5)throw Error(p(476));var n=S0(l).queue;g0(l,n,t,ie,e===null?Wv:function(){return p0(l),e(a)})}function S0(l){var t=l.memoizedState;if(t!==null)return t;t={memoizedState:ie,baseState:ie,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Et,lastRenderedState:ie},next:null};var e={};return t.next={memoizedState:e,baseState:e,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Et,lastRenderedState:e},next:null},l.memoizedState=t,l=l.alternate,l!==null&&(l.memoizedState=t),t}function p0(l){var t=S0(l);t.next===null&&(t=l.alternate.memoizedState),Qa(l,t.next.queue,{},Bl())}function Af(){return rl(un)}function b0(){return el().memoizedState}function z0(){return el().memoizedState}function $v(l){for(var t=l.return;t!==null;){switch(t.tag){case 24:case 3:var e=Bl();l=Qt(e);var a=Zt(t,l,e);a!==null&&(Al(a,t,e),Ga(a,t,e)),t={cache:sf()},l.payload=t;return}t=t.return}}function Fv(l,t,e){var a=Bl();e={lane:a,revertLane:0,gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null},ku(l)?T0(t,e):(e=uf(l,t,e,a),e!==null&&(Al(e,l,a),x0(e,t,a)))}function E0(l,t,e){var a=Bl();Qa(l,t,e,a)}function Qa(l,t,e,a){var n={lane:a,revertLane:0,gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null};if(ku(l))T0(t,n);else{var u=l.alternate;if(l.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var i=t.lastRenderedState,c=u(i,e);if(n.hasEagerState=!0,n.eagerState=c,ql(c,i))return Zu(l,t,n,0),Z===null&&Qu(),!1}catch{}finally{}if(e=uf(l,t,n,a),e!==null)return Al(e,l,a),x0(e,t,a),!0}return!1}function Mf(l,t,e,a){if(a={lane:2,revertLane:Bf(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},ku(l)){if(t)throw Error(p(479))}else t=uf(l,e,a,2),t!==null&&Al(t,l,2)}function ku(l){var t=l.alternate;return l===N||t!==null&&t===N}function T0(l,t){$e=zu=!0;var e=l.pending;e===null?t.next=t:(t.next=e.next,e.next=t),l.pending=t}function x0(l,t,e){if((e&4194048)!==0){var a=t.lanes;a&=l.pendingLanes,e|=a,t.lanes=e,od(l,e)}}var en={readContext:rl,use:Ju,useCallback:I,useContext:I,useEffect:I,useImperativeHandle:I,useLayoutEffect:I,useInsertionEffect:I,useMemo:I,useReducer:I,useRef:I,useState:I,useDebugValue:I,useDeferredValue:I,useTransition:I,useSyncExternalStore:I,useId:I,useHostTransitionStatus:I,useFormState:I,useActionState:I,useOptimistic:I,useMemoCache:I,useCacheRefresh:I};en.useEffectEvent=I;var A0={readContext:rl,use:Ju,useCallback:function(l,t){return bl().memoizedState=[l,t===void 0?null:t],l},useContext:rl,useEffect:fs,useImperativeHandle:function(l,t,e){e=e!=null?e.concat([l]):null,tu(4194308,4,y0.bind(null,t,l),e)},useLayoutEffect:function(l,t){return tu(4194308,4,l,t)},useInsertionEffect:function(l,t){tu(4,2,l,t)},useMemo:function(l,t){var e=bl();t=t===void 0?null:t;var a=l();if(me){Bt(!0);try{l()}finally{Bt(!1)}}return e.memoizedState=[a,t],a},useReducer:function(l,t,e){var a=bl();if(e!==void 0){var n=e(t);if(me){Bt(!0);try{e(t)}finally{Bt(!1)}}}else n=t;return a.memoizedState=a.baseState=n,l={pending:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:n},a.queue=l,l=l.dispatch=Fv.bind(null,N,l),[a.memoizedState,l]},useRef:function(l){var t=bl();return l={current:l},t.memoizedState=l},useState:function(l){l=Tc(l);var t=l.queue,e=E0.bind(null,N,t);return t.dispatch=e,[l.memoizedState,e]},useDebugValue:Tf,useDeferredValue:function(l,t){var e=bl();return xf(e,l,t)},useTransition:function(){var l=Tc(!1);return l=g0.bind(null,N,l.queue,!0,!1),bl().memoizedState=l,[!1,l]},useSyncExternalStore:function(l,t,e){var a=N,n=bl();if(q){if(e===void 0)throw Error(p(407));e=e()}else{if(e=t(),Z===null)throw Error(p(349));(B&127)!==0||Id(a,t,e)}n.memoizedState=e;var u={value:e,getSnapshot:t};return n.queue=u,fs(l0.bind(null,a,u,l),[l]),a.flags|=2048,aa(9,{destroy:void 0},Pd.bind(null,a,u,e,t),null),e},useId:function(){var l=bl(),t=Z.identifierPrefix;if(q){var e=tt,a=lt;e=(a&~(1<<32-Rl(a)-1)).toString(32)+e,t=\"_\"+t+\"R_\"+e,e=Eu++,0<\\/script>\",u=u.removeChild(u.firstChild);break;case\"select\":u=typeof a.is==\"string\"?i.createElement(\"select\",{is:a.is}):i.createElement(\"select\"),a.multiple?u.multiple=!0:a.size&&(u.size=a.size);break;default:u=typeof a.is==\"string\"?i.createElement(n,{is:a.is}):i.createElement(n)}}u[vl]=t,u[Ml]=a;l:for(i=t.child;i!==null;){if(i.tag===5||i.tag===6)u.appendChild(i.stateNode);else if(i.tag!==4&&i.tag!==27&&i.child!==null){i.child.return=i,i=i.child;continue}if(i===t)break l;for(;i.sibling===null;){if(i.return===null||i.return===t)break l;i=i.return}i.sibling.return=i.return,i=i.sibling}t.stateNode=u;l:switch(hl(u,n,a),n){case\"button\":case\"input\":case\"select\":case\"textarea\":a=!!a.autoFocus;break l;case\"img\":a=!0;break l;default:a=!1}a&&ft(t)}}return J(t),ji(t,t.type,l===null?null:l.memoizedProps,t.pendingProps,e),null;case 6:if(l&&t.stateNode!=null)l.memoizedProps!==a&&ft(t);else{if(typeof a!=\"string\"&&t.stateNode===null)throw Error(p(166));if(l=jt.current,De(t)){if(l=t.stateNode,e=t.memoizedProps,a=null,n=ml,n!==null)switch(n.tag){case 27:case 5:a=n.memoizedProps}l[vl]=t,l=!!(l.nodeValue===e||a!==null&&a.suppressHydrationWarning===!0||E1(l.nodeValue,e)),l||$t(t,!0)}else l=Cu(l).createTextNode(a),l[vl]=t,t.stateNode=l}return J(t),null;case 31:if(e=t.memoizedState,l===null||l.memoizedState!==null){if(a=De(t),e!==null){if(l===null){if(!a)throw Error(p(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(p(557));l[vl]=t}else de(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;J(t),l=!1}else e=Ni(),l!==null&&l.memoizedState!==null&&(l.memoizedState.hydrationErrors=e),l=!0;if(!l)return t.flags&256?(Dl(t),t):(Dl(t),null);if((t.flags&128)!==0)throw Error(p(558))}return J(t),null;case 13:if(a=t.memoizedState,l===null||l.memoizedState!==null&&l.memoizedState.dehydrated!==null){if(n=De(t),a!==null&&a.dehydrated!==null){if(l===null){if(!n)throw Error(p(318));if(n=t.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(p(317));n[vl]=t}else de(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;J(t),n=!1}else n=Ni(),l!==null&&l.memoizedState!==null&&(l.memoizedState.hydrationErrors=n),n=!0;if(!n)return t.flags&256?(Dl(t),t):(Dl(t),null)}return Dl(t),(t.flags&128)!==0?(t.lanes=e,t):(e=a!==null,l=l!==null&&l.memoizedState!==null,e&&(a=t.child,n=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(n=a.alternate.memoizedState.cachePool.pool),u=null,a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(u=a.memoizedState.cachePool.pool),u!==n&&(a.flags|=2048)),e!==l&&e&&(t.child.flags|=8192),Xn(t,t.updateQueue),J(t),null);case 4:return Ie(),l===null&&qf(t.stateNode.containerInfo),J(t),null;case 10:return St(t.type),J(t),null;case 19:if(dl(tl),a=t.memoizedState,a===null)return J(t),null;if(n=(t.flags&128)!==0,u=a.rendering,u===null)if(n)Ma(a,!1);else{if(P!==0||l!==null&&(l.flags&128)!==0)for(l=t.child;l!==null;){if(u=bu(l),u!==null){for(t.flags|=128,Ma(a,!1),l=u.updateQueue,t.updateQueue=l,Xn(t,l),t.subtreeFlags=0,l=e,e=t.child;e!==null;)Yd(e,l),e=e.sibling;return V(tl,tl.current&1|2),q&&yt(t,a.treeForkCount),t.child}l=l.sibling}a.tail!==null&&Cl()>Mu&&(t.flags|=128,n=!0,Ma(a,!1),t.lanes=4194304)}else{if(!n)if(l=bu(u),l!==null){if(t.flags|=128,n=!0,l=l.updateQueue,t.updateQueue=l,Xn(t,l),Ma(a,!0),a.tail===null&&a.tailMode===\"hidden\"&&!u.alternate&&!q)return J(t),null}else 2*Cl()-a.renderingStartTime>Mu&&e!==536870912&&(t.flags|=128,n=!0,Ma(a,!1),t.lanes=4194304);a.isBackwards?(u.sibling=t.child,t.child=u):(l=a.last,l!==null?l.sibling=u:t.child=u,a.last=u)}return a.tail!==null?(l=a.tail,a.rendering=l,a.tail=l.sibling,a.renderingStartTime=Cl(),l.sibling=null,e=tl.current,V(tl,n?e&1|2:e&1),q&&yt(t,a.treeForkCount),l):(J(t),null);case 22:case 23:return Dl(t),mf(),a=t.memoizedState!==null,l!==null?l.memoizedState!==null!==a&&(t.flags|=8192):a&&(t.flags|=8192),a?(e&536870912)!==0&&(t.flags&128)===0&&(J(t),t.subtreeFlags&6&&(t.flags|=8192)):J(t),e=t.updateQueue,e!==null&&Xn(t,e.retryQueue),e=null,l!==null&&l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(e=l.memoizedState.cachePool.pool),a=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(a=t.memoizedState.cachePool.pool),a!==e&&(t.flags|=2048),l!==null&&dl(fe),null;case 24:return e=null,l!==null&&(e=l.memoizedState.cache),t.memoizedState.cache!==e&&(t.flags|=2048),St(ul),J(t),null;case 25:return null;case 30:return null}throw Error(p(156,t.tag))}function em(l,t){switch(of(t),t.tag){case 1:return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 3:return St(ul),Ie(),l=t.flags,(l&65536)!==0&&(l&128)===0?(t.flags=l&-65537|128,t):null;case 26:case 27:case 5:return du(t),null;case 31:if(t.memoizedState!==null){if(Dl(t),t.alternate===null)throw Error(p(340));de()}return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 13:if(Dl(t),l=t.memoizedState,l!==null&&l.dehydrated!==null){if(t.alternate===null)throw Error(p(340));de()}return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 19:return dl(tl),null;case 4:return Ie(),null;case 10:return St(t.type),null;case 22:case 23:return Dl(t),mf(),l!==null&&dl(fe),l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 24:return St(ul),null;case 25:return null;default:return null}}function Y0(l,t){switch(of(t),t.tag){case 3:St(ul),Ie();break;case 26:case 27:case 5:du(t);break;case 4:Ie();break;case 31:t.memoizedState!==null&&Dl(t);break;case 13:Dl(t);break;case 19:dl(tl);break;case 10:St(t.type);break;case 22:case 23:Dl(t),mf(),l!==null&&dl(fe);break;case 24:St(ul)}}function gn(l,t){try{var e=t.updateQueue,a=e!==null?e.lastEffect:null;if(a!==null){var n=a.next;e=n;do{if((e.tag&l)===l){a=void 0;var u=e.create,i=e.inst;a=u(),i.destroy=a}e=e.next}while(e!==n)}}catch(c){j(t,t.return,c)}}function Ft(l,t,e){try{var a=t.updateQueue,n=a!==null?a.lastEffect:null;if(n!==null){var u=n.next;a=u;do{if((a.tag&l)===l){var i=a.inst,c=i.destroy;if(c!==void 0){i.destroy=void 0,n=t;var f=e,s=c;try{s()}catch(v){j(n,f,v)}}}a=a.next}while(a!==u)}}catch(v){j(t,t.return,v)}}function L0(l){var t=l.updateQueue;if(t!==null){var e=l.stateNode;try{wd(t,e)}catch(a){j(l,l.return,a)}}}function G0(l,t,e){e.props=re(l.type,l.memoizedProps),e.state=l.memoizedState;try{e.componentWillUnmount()}catch(a){j(l,t,a)}}function Za(l,t){try{var e=l.ref;if(e!==null){switch(l.tag){case 26:case 27:case 5:var a=l.stateNode;break;case 30:a=l.stateNode;break;default:a=l.stateNode}typeof e==\"function\"?l.refCleanup=e(a):e.current=a}}catch(n){j(l,t,n)}}function et(l,t){var e=l.ref,a=l.refCleanup;if(e!==null)if(typeof a==\"function\")try{a()}catch(n){j(l,t,n)}finally{l.refCleanup=null,l=l.alternate,l!=null&&(l.refCleanup=null)}else if(typeof e==\"function\")try{e(null)}catch(n){j(l,t,n)}else e.current=null}function j0(l){var t=l.type,e=l.memoizedProps,a=l.stateNode;try{l:switch(t){case\"button\":case\"input\":case\"select\":case\"textarea\":e.autoFocus&&a.focus();break l;case\"img\":e.src?a.src=e.src:e.srcSet&&(a.srcset=e.srcSet)}}catch(n){j(l,l.return,n)}}function Xi(l,t,e){try{var a=l.stateNode;Em(a,l.type,e,t),a[Ml]=t}catch(n){j(l,l.return,n)}}function X0(l){return l.tag===5||l.tag===3||l.tag===26||l.tag===27&&le(l.type)||l.tag===4}function Qi(l){l:for(;;){for(;l.sibling===null;){if(l.return===null||X0(l.return))return null;l=l.return}for(l.sibling.return=l.return,l=l.sibling;l.tag!==5&&l.tag!==6&&l.tag!==18;){if(l.tag===27&&le(l.type)||l.flags&2||l.child===null||l.tag===4)continue l;l.child.return=l,l=l.child}if(!(l.flags&2))return l.stateNode}}function Uc(l,t,e){var a=l.tag;if(a===5||a===6)l=l.stateNode,t?(e.nodeType===9?e.body:e.nodeName===\"HTML\"?e.ownerDocument.body:e).insertBefore(l,t):(t=e.nodeType===9?e.body:e.nodeName===\"HTML\"?e.ownerDocument.body:e,t.appendChild(l),e=e._reactRootContainer,e!=null||t.onclick!==null||(t.onclick=rt));else if(a!==4&&(a===27&&le(l.type)&&(e=l.stateNode,t=null),l=l.child,l!==null))for(Uc(l,t,e),l=l.sibling;l!==null;)Uc(l,t,e),l=l.sibling}function Au(l,t,e){var a=l.tag;if(a===5||a===6)l=l.stateNode,t?e.insertBefore(l,t):e.appendChild(l);else if(a!==4&&(a===27&&le(l.type)&&(e=l.stateNode),l=l.child,l!==null))for(Au(l,t,e),l=l.sibling;l!==null;)Au(l,t,e),l=l.sibling}function Q0(l){var t=l.stateNode,e=l.memoizedProps;try{for(var a=l.type,n=t.attributes;n.length;)t.removeAttributeNode(n[0]);hl(t,a,e),t[vl]=l,t[Ml]=e}catch(u){j(l,l.return,u)}}var vt=!1,nl=!1,Zi=!1,zs=typeof WeakSet==\"function\"?WeakSet:Set,ol=null;function am(l,t){if(l=l.containerInfo,Yc=qu,l=Dd(l),af(l)){if(\"selectionStart\"in l)var e={start:l.selectionStart,end:l.selectionEnd};else l:{e=(e=l.ownerDocument)&&e.defaultView||window;var a=e.getSelection&&e.getSelection();if(a&&a.rangeCount!==0){e=a.anchorNode;var n=a.anchorOffset,u=a.focusNode;a=a.focusOffset;try{e.nodeType,u.nodeType}catch{e=null;break l}var i=0,c=-1,f=-1,s=0,v=0,g=l,d=null;t:for(;;){for(var r;g!==e||n!==0&&g.nodeType!==3||(c=i+n),g!==u||a!==0&&g.nodeType!==3||(f=i+a),g.nodeType===3&&(i+=g.nodeValue.length),(r=g.firstChild)!==null;)d=g,g=r;for(;;){if(g===l)break t;if(d===e&&++s===n&&(c=i),d===u&&++v===a&&(f=i),(r=g.nextSibling)!==null)break;g=d,d=g.parentNode}g=r}e=c===-1||f===-1?null:{start:c,end:f}}else e=null}e=e||{start:0,end:0}}else e=null;for(Lc={focusedElem:l,selectionRange:e},qu=!1,ol=t;ol!==null;)if(t=ol,l=t.child,(t.subtreeFlags&1028)!==0&&l!==null)l.return=t,ol=l;else for(;ol!==null;){switch(t=ol,u=t.alternate,l=t.flags,t.tag){case 0:if((l&4)!==0&&(l=t.updateQueue,l=l!==null?l.events:null,l!==null))for(e=0;e title\"))),hl(u,a,e),u[vl]=l,sl(u),a=u;break l;case\"link\":var i=Zs(\"link\",\"href\",n).get(a+(e.href||\"\"));if(i){for(var c=0;cx&&(i=x,x=E,E=i);var y=Jo(c,E),o=Jo(c,x);if(y&&o&&(r.rangeCount!==1||r.anchorNode!==y.node||r.anchorOffset!==y.offset||r.focusNode!==o.node||r.focusOffset!==o.offset)){var h=g.createRange();h.setStart(y.node,y.offset),r.removeAllRanges(),E>x?(r.addRange(h),r.extend(o.node,o.offset)):(h.setEnd(o.node,o.offset),r.addRange(h))}}}}for(g=[],r=c;r=r.parentNode;)r.nodeType===1&&g.push({element:r,left:r.scrollLeft,top:r.scrollTop});for(typeof c.focus==\"function\"&&c.focus(),c=0;ce?32:e,D.T=null,e=Hc,Hc=null;var u=Kt,i=pt;if(cl=0,ua=Kt=null,pt=0,(Y&6)!==0)throw Error(p(331));var c=Y;if(Y|=4,P0(u.current),$0(u,u.current,i,e),Y=c,Sn(0,!1),Hl&&typeof Hl.onPostCommitFiberRoot==\"function\")try{Hl.onPostCommitFiberRoot(sn,u)}catch{}return!0}finally{L.p=n,D.T=a,m1(l,t)}}function As(l,t,e){t=Vl(e,t),t=Oc(l.stateNode,t,2),l=Zt(l,t,2),l!==null&&(yn(l,2),ut(l))}function j(l,t,e){if(l.tag===3)As(l,l,e);else for(;t!==null;){if(t.tag===3){As(t,l,e);break}else if(t.tag===1){var a=t.stateNode;if(typeof t.type.getDerivedStateFromError==\"function\"||typeof a.componentDidCatch==\"function\"&&(Vt===null||!Vt.has(a))){l=Vl(e,l),e=U0(2),a=Zt(t,e,2),a!==null&&(N0(e,a,t,l),yn(a,2),ut(a));break}}t=t.return}}function Ki(l,t,e){var a=l.pingCache;if(a===null){a=l.pingCache=new im;var n=new Set;a.set(t,n)}else n=a.get(t),n===void 0&&(n=new Set,a.set(t,n));n.has(e)||(Cf=!0,n.add(e),l=dm.bind(null,l,t,e),t.then(l,l))}function dm(l,t,e){var a=l.pingCache;a!==null&&a.delete(t),l.pingedLanes|=l.suspendedLanes&e,l.warmLanes&=~e,Z===l&&(B&e)===e&&(P===4||P===3&&(B&62914560)===B&&300>Cl()-Wu?(Y&2)===0&&ia(l,0):Hf|=e,na===B&&(na=0)),ut(l)}function h1(l,t){t===0&&(t=cd()),l=pe(l,t),l!==null&&(yn(l,t),ut(l))}function ym(l){var t=l.memoizedState,e=0;t!==null&&(e=t.retryLane),h1(l,e)}function vm(l,t){var e=0;switch(l.tag){case 31:case 13:var a=l.stateNode,n=l.memoizedState;n!==null&&(e=n.retryLane);break;case 19:a=l.stateNode;break;case 22:a=l.stateNode._retryCache;break;default:throw Error(p(314))}a!==null&&a.delete(t),h1(l,e)}function mm(l,t){return kc(l,t)}var Du=null,Ce=null,Bc=!1,Uu=!1,Ji=!1,Gt=0;function ut(l){l!==Ce&&l.next===null&&(Ce===null?Du=Ce=l:Ce=Ce.next=l),Uu=!0,Bc||(Bc=!0,hm())}function Sn(l,t){if(!Ji&&Uu){Ji=!0;do for(var e=!1,a=Du;a!==null;){if(!t)if(l!==0){var n=a.pendingLanes;if(n===0)var u=0;else{var i=a.suspendedLanes,c=a.pingedLanes;u=(1<<31-Rl(42|l)+1)-1,u&=n&~(i&~c),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(e=!0,Ms(a,u))}else u=B,u=Lu(a,a===Z?u:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(u&3)===0||dn(a,u)||(e=!0,Ms(a,u));a=a.next}while(e);Ji=!1}}function rm(){g1()}function g1(){Uu=Bc=!1;var l=0;Gt!==0&&xm()&&(l=Gt);for(var t=Cl(),e=null,a=Du;a!==null;){var n=a.next,u=S1(a,t);u===0?(a.next=null,e===null?Du=n:e.next=n,n===null&&(Ce=e)):(e=a,(l!==0||(u&3)!==0)&&(Uu=!0)),a=n}cl!==0&&cl!==5||Sn(l,!1),Gt!==0&&(Gt=0)}function S1(l,t){for(var e=l.suspendedLanes,a=l.pingedLanes,n=l.expirationTimes,u=l.pendingLanes&-62914561;0c)break;var v=f.transferSize,g=f.initiatorType;v&&Hs(g)&&(f=f.responseEnd,i+=v*(f\"u\"?null:document;function O1(l,t,e){var a=ma;if(a&&typeof t==\"string\"&&t){var n=Zl(t);n='link[rel=\"'+l+'\"][href=\"'+n+'\"]',typeof e==\"string\"&&(n+='[crossorigin=\"'+e+'\"]'),js.has(n)||(js.add(n),l={rel:l,crossOrigin:e,href:t},a.querySelector(n)===null&&(t=a.createElement(\"link\"),hl(t,\"link\",l),sl(t),a.head.appendChild(t)))}}function Hm(l){At.D(l),O1(\"dns-prefetch\",l,null)}function Rm(l,t){At.C(l,t),O1(\"preconnect\",l,t)}function Bm(l,t,e){At.L(l,t,e);var a=ma;if(a&&l&&t){var n='link[rel=\"preload\"][as=\"'+Zl(t)+'\"]';t===\"image\"&&e&&e.imageSrcSet?(n+='[imagesrcset=\"'+Zl(e.imageSrcSet)+'\"]',typeof e.imageSizes==\"string\"&&(n+='[imagesizes=\"'+Zl(e.imageSizes)+'\"]')):n+='[href=\"'+Zl(l)+'\"]';var u=n;switch(t){case\"style\":u=ca(l);break;case\"script\":u=ra(l)}kl.has(u)||(l=k({rel:\"preload\",href:t===\"image\"&&e&&e.imageSrcSet?void 0:l,as:t},e),kl.set(u,l),a.querySelector(n)!==null||t===\"style\"&&a.querySelector(pn(u))||t===\"script\"&&a.querySelector(bn(u))||(t=a.createElement(\"link\"),hl(t,\"link\",l),sl(t),a.head.appendChild(t)))}}function qm(l,t){At.m(l,t);var e=ma;if(e&&l){var a=t&&typeof t.as==\"string\"?t.as:\"script\",n='link[rel=\"modulepreload\"][as=\"'+Zl(a)+'\"][href=\"'+Zl(l)+'\"]',u=n;switch(a){case\"audioworklet\":case\"paintworklet\":case\"serviceworker\":case\"sharedworker\":case\"worker\":case\"script\":u=ra(l)}if(!kl.has(u)&&(l=k({rel:\"modulepreload\",href:l},t),kl.set(u,l),e.querySelector(n)===null)){switch(a){case\"audioworklet\":case\"paintworklet\":case\"serviceworker\":case\"sharedworker\":case\"worker\":case\"script\":if(e.querySelector(bn(u)))return}a=e.createElement(\"link\"),hl(a,\"link\",l),sl(a),e.head.appendChild(a)}}}function Ym(l,t,e){At.S(l,t,e);var a=ma;if(a&&l){var n=Ke(a).hoistableStyles,u=ca(l);t=t||\"default\";var i=n.get(u);if(!i){var c={loading:0,preload:null};if(i=a.querySelector(pn(u)))c.loading=5;else{l=k({rel:\"stylesheet\",href:l,\"data-precedence\":t},e),(e=kl.get(u))&&Yf(l,e);var f=i=a.createElement(\"link\");sl(f),hl(f,\"link\",l),f._p=new Promise(function(s,v){f.onload=s,f.onerror=v}),f.addEventListener(\"load\",function(){c.loading|=1}),f.addEventListener(\"error\",function(){c.loading|=2}),c.loading|=4,uu(i,t,a)}i={type:\"stylesheet\",instance:i,count:1,state:c},n.set(u,i)}}}function Lm(l,t){At.X(l,t);var e=ma;if(e&&l){var a=Ke(e).hoistableScripts,n=ra(l),u=a.get(n);u||(u=e.querySelector(bn(n)),u||(l=k({src:l,async:!0},t),(t=kl.get(n))&&Lf(l,t),u=e.createElement(\"script\"),sl(u),hl(u,\"link\",l),e.head.appendChild(u)),u={type:\"script\",instance:u,count:1,state:null},a.set(n,u))}}function Gm(l,t){At.M(l,t);var e=ma;if(e&&l){var a=Ke(e).hoistableScripts,n=ra(l),u=a.get(n);u||(u=e.querySelector(bn(n)),u||(l=k({src:l,async:!0,type:\"module\"},t),(t=kl.get(n))&&Lf(l,t),u=e.createElement(\"script\"),sl(u),hl(u,\"link\",l),e.head.appendChild(u)),u={type:\"script\",instance:u,count:1,state:null},a.set(n,u))}}function Xs(l,t,e,a){var n=(n=jt.current)?Hu(n):null;if(!n)throw Error(p(446));switch(l){case\"meta\":case\"title\":return null;case\"style\":return typeof e.precedence==\"string\"&&typeof e.href==\"string\"?(t=ca(e.href),e=Ke(n).hoistableStyles,a=e.get(t),a||(a={type:\"style\",instance:null,count:0,state:null},e.set(t,a)),a):{type:\"void\",instance:null,count:0,state:null};case\"link\":if(e.rel===\"stylesheet\"&&typeof e.href==\"string\"&&typeof e.precedence==\"string\"){l=ca(e.href);var u=Ke(n).hoistableStyles,i=u.get(l);if(i||(n=n.ownerDocument||n,i={type:\"stylesheet\",instance:null,count:0,state:{loading:0,preload:null}},u.set(l,i),(u=n.querySelector(pn(l)))&&!u._p&&(i.instance=u,i.state.loading=5),kl.has(l)||(e={rel:\"preload\",as:\"style\",href:e.href,crossOrigin:e.crossOrigin,integrity:e.integrity,media:e.media,hrefLang:e.hrefLang,referrerPolicy:e.referrerPolicy},kl.set(l,e),u||jm(n,l,e,i.state))),t&&a===null)throw Error(p(528,\"\"));return i}if(t&&a!==null)throw Error(p(529,\"\"));return null;case\"script\":return t=e.async,e=e.src,typeof e==\"string\"&&t&&typeof t!=\"function\"&&typeof t!=\"symbol\"?(t=ra(e),e=Ke(n).hoistableScripts,a=e.get(t),a||(a={type:\"script\",instance:null,count:0,state:null},e.set(t,a)),a):{type:\"void\",instance:null,count:0,state:null};default:throw Error(p(444,l))}}function ca(l){return'href=\"'+Zl(l)+'\"'}function pn(l){return'link[rel=\"stylesheet\"]['+l+\"]\"}function _1(l){return k({},l,{\"data-precedence\":l.precedence,precedence:null})}function jm(l,t,e,a){l.querySelector('link[rel=\"preload\"][as=\"style\"]['+t+\"]\")?a.loading=1:(t=l.createElement(\"link\"),a.preload=t,t.addEventListener(\"load\",function(){return a.loading|=1}),t.addEventListener(\"error\",function(){return a.loading|=2}),hl(t,\"link\",e),sl(t),l.head.appendChild(t))}function ra(l){return'[src=\"'+Zl(l)+'\"]'}function bn(l){return\"script[async]\"+l}function Qs(l,t,e){if(t.count++,t.instance===null)switch(t.type){case\"style\":var a=l.querySelector('style[data-href~=\"'+Zl(e.href)+'\"]');if(a)return t.instance=a,sl(a),a;var n=k({},e,{\"data-href\":e.href,\"data-precedence\":e.precedence,href:null,precedence:null});return a=(l.ownerDocument||l).createElement(\"style\"),sl(a),hl(a,\"style\",n),uu(a,e.precedence,l),t.instance=a;case\"stylesheet\":n=ca(e.href);var u=l.querySelector(pn(n));if(u)return t.state.loading|=4,t.instance=u,sl(u),u;a=_1(e),(n=kl.get(n))&&Yf(a,n),u=(l.ownerDocument||l).createElement(\"link\"),sl(u);var i=u;return i._p=new Promise(function(c,f){i.onload=c,i.onerror=f}),hl(u,\"link\",a),t.state.loading|=4,uu(u,e.precedence,l),t.instance=u;case\"script\":return u=ra(e.src),(n=l.querySelector(bn(u)))?(t.instance=n,sl(n),n):(a=e,(n=kl.get(u))&&(a=k({},e),Lf(a,n)),l=l.ownerDocument||l,n=l.createElement(\"script\"),sl(n),hl(n,\"link\",a),l.head.appendChild(n),t.instance=n);case\"void\":return null;default:throw Error(p(443,t.type))}else t.type===\"stylesheet\"&&(t.state.loading&4)===0&&(a=t.instance,t.state.loading|=4,uu(a,e.precedence,l));return t.instance}function uu(l,t,e){for(var a=e.querySelectorAll('link[rel=\"stylesheet\"][data-precedence],style[data-precedence]'),n=a.length?a[a.length-1]:null,u=n,i=0;i title\"):null)}function Xm(l,t,e){if(e===1||t.itemProp!=null)return!1;switch(l){case\"meta\":case\"title\":return!0;case\"style\":if(typeof t.precedence!=\"string\"||typeof t.href!=\"string\"||t.href===\"\")break;return!0;case\"link\":if(typeof t.rel!=\"string\"||typeof t.href!=\"string\"||t.href===\"\"||t.onLoad||t.onError)break;switch(t.rel){case\"stylesheet\":return l=t.disabled,typeof t.precedence==\"string\"&&l==null;default:return!0}case\"script\":if(t.async&&typeof t.async!=\"function\"&&typeof t.async!=\"symbol\"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==\"string\")return!0}return!1}function D1(l){return!(l.type===\"stylesheet\"&&(l.state.loading&3)===0)}function Qm(l,t,e,a){if(e.type===\"stylesheet\"&&(typeof a.media!=\"string\"||matchMedia(a.media).matches!==!1)&&(e.state.loading&4)===0){if(e.instance===null){var n=ca(a.href),u=t.querySelector(pn(n));if(u){t=u._p,t!==null&&typeof t==\"object\"&&typeof t.then==\"function\"&&(l.count++,l=Ru.bind(l),t.then(l,l)),e.state.loading|=4,e.instance=u,sl(u);return}u=t.ownerDocument||t,a=_1(a),(n=kl.get(n))&&Yf(a,n),u=u.createElement(\"link\"),sl(u);var i=u;i._p=new Promise(function(c,f){i.onload=c,i.onerror=f}),hl(u,\"link\",a),e.instance=u}l.stylesheets===null&&(l.stylesheets=new Map),l.stylesheets.set(e,t),(t=e.state.preload)&&(e.state.loading&3)===0&&(l.count++,e=Ru.bind(l),t.addEventListener(\"load\",e),t.addEventListener(\"error\",e))}}var $i=0;function Zm(l,t){return l.stylesheets&&l.count===0&&cu(l,l.stylesheets),0$i?50:800)+t);return l.unsuspend=e,function(){l.unsuspend=null,clearTimeout(a),clearTimeout(n)}}:null}function Ru(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)cu(this,this.stylesheets);else if(this.unsuspend){var l=this.unsuspend;this.unsuspend=null,l()}}}var Bu=null;function cu(l,t){l.stylesheets=null,l.unsuspend!==null&&(l.count++,Bu=new Map,t.forEach(Vm,l),Bu=null,Ru.call(l))}function Vm(l,t){if(!(t.state.loading&4)){var e=Bu.get(l);if(e)var a=e.get(null);else{e=new Map,Bu.set(l,e);for(var n=l.querySelectorAll(\"link[data-precedence],style[data-precedence]\"),u=0;u{\"use strict\";function L1(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>\"u\"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=\"function\"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(L1)}catch(l){console.error(l)}}L1(),G1.exports=Y1()});var Z1=Il(ti=>{\"use strict\";var Im=Symbol.for(\"react.transitional.element\"),Pm=Symbol.for(\"react.fragment\");function Q1(l,t,e){var a=null;if(e!==void 0&&(a=\"\"+e),t.key!==void 0&&(a=\"\"+t.key),\"key\"in t){e={};for(var n in t)n!==\"key\"&&(e[n]=t[n])}else e=t;return t=e.ref,{$$typeof:Im,type:l,key:a,ref:t!==void 0?t:null,props:e}}ti.Fragment=Pm;ti.jsx=Q1;ti.jsxs=Q1});var zn=Il((Sr,V1)=>{\"use strict\";V1.exports=Z1()});var I1=Mt(Ae(),1),P1=Mt(j1(),1);var C=Mt(Ae(),1);var ze=Mt(Ae(),1);function X1(){let[l,t]=(0,ze.useState)([]),[e,a]=(0,ze.useState)([]),[n,u]=(0,ze.useState)(!1),[i,c]=(0,ze.useState)([]);return(0,ze.useEffect)(()=>{let f=new EventSource(\"/events\");return f.onopen=()=>u(!0),f.onerror=()=>u(!1),f.addEventListener(\"snapshot\",s=>{try{let v=JSON.parse(s.data);t(g=>{if(v.networkLogs.length===0)return g;let d=new Map(g.map(r=>[r.id,r]));for(let r of v.networkLogs)d.set(r.id,r);return Array.from(d.values())}),a(g=>{if(v.consoleLogs.length===0)return g;let d=new Set(g.map(E=>E.id)),r=v.consoleLogs.filter(E=>!d.has(E.id)),T=[...g,...r];return T.length>5e3?T.slice(-5e3):T}),c(v.sessions)}catch{}}),f.addEventListener(\"network\",s=>{try{let v=JSON.parse(s.data);t(g=>{let d=g.findIndex(r=>r.id===v.id);if(d>-1){let r=[...g];return r[d]=v,r}return[...g,v]})}catch{}}),f.addEventListener(\"console\",s=>{try{let v=JSON.parse(s.data);a(g=>{let d=[...g,v];return d.length>5e3?d.slice(-5e3):d})}catch{}}),f.addEventListener(\"session\",s=>{try{c(JSON.parse(s.data))}catch{}}),()=>f.close()},[]),{networkLogs:l,consoleLogs:e,isConnected:n,connectedSessions:i}}var S=Mt(zn(),1);function Kf(){let[l,t]=(0,C.useState)(\"console\"),{networkLogs:e,consoleLogs:a,connectedSessions:n}=X1(),[u,i]=(0,C.useState)(null),[c,f]=(0,C.useState)(null),[s,v]=(0,C.useState)(null),[g,d]=(0,C.useState)(()=>{let b=localStorage.getItem(\"devtools-theme\");return b||null}),[r,T]=(0,C.useState)(window.matchMedia(\"(prefers-color-scheme: dark)\").matches);(0,C.useEffect)(()=>{let b=window.matchMedia(\"(prefers-color-scheme: dark)\"),A=O=>T(O.matches);return b.addEventListener(\"change\",A),()=>b.removeEventListener(\"change\",A)},[]);let E=g===null?r:g===\"dark\",x=(0,C.useMemo)(()=>({bg:E?\"#202124\":\"#ffffff\",bgSecondary:E?\"#292a2d\":\"#f3f3f3\",bgHover:E?\"#35363a\":\"#e8f0fe\",border:E?\"#3c4043\":\"#ccc\",text:E?\"#e8eaed\":\"#333\",textSecondary:E?\"#9aa0a6\":\"#666\",accent:E?\"#8ab4f8\":\"#1a73e8\",consoleBg:E?\"#1e1e1e\":\"#fff\",rowBorder:E?\"#303134\":\"#f0f0f0\",errorBg:E?\"#3c1e1e\":\"#fff0f0\",warnBg:E?\"#302a10\":\"#fff3cd\"}),[E]),y=()=>{let b=E?\"light\":\"dark\";d(b),localStorage.setItem(\"devtools-theme\",b)},o=b=>{let A=b.target.files?.[0];if(!A)return;let O=new FileReader;O.onload=_=>{let ll=_.target?.result;try{let W=new Map,Tn=[];ll.split(`\n`).filter(ha=>ha.trim()).forEach(ha=>{let ga=JSON.parse(ha),Sa=ga.payload||{},xn=ga.type,kf=ga.timestamp;if(xn===\"console\")Tn.push({...Sa,type:xn,timestamp:kf,id:Sa.id||Math.random().toString(36).substring(2,11)});else if(xn===\"network\"){let Ee=Sa.id;if(!Ee)return;if(!W.has(Ee))W.set(Ee,{...Sa,type:xn,timestamp:kf,id:Ee});else{let ei=W.get(Ee);W.set(Ee,{...ei,...Sa,type:ei.type,timestamp:ei.timestamp})}}});let wf=`[Imported] ${A.name}`,ly=Array.from(W.values()).sort((ha,ga)=>ha.timestamp-ga.timestamp);f({network:ly,console:Tn}),v(wf),i(wf)}catch(W){console.error(\"Import error:\",W),alert(\"Failed to parse session file. Ensure it is a valid JSONL file.\")}},O.readAsText(A),b.target.value=\"\"},h=()=>{if(!u)return;let b=[];z.forEach(W=>{b.push({timestamp:W.timestamp,data:{type:\"console\",payload:{type:W.type,content:W.content},sessionId:W.sessionId,timestamp:W.timestamp}})}),M.forEach(W=>{b.push({timestamp:W.timestamp,data:{type:\"network\",payload:W,sessionId:W.sessionId,timestamp:W.timestamp}})}),b.sort((W,Tn)=>W.timestamp-Tn.timestamp);let A=b.map(W=>JSON.stringify(W.data)).join(`\n`),O=new Blob([A],{type:\"application/jsonl\"}),_=URL.createObjectURL(O),ll=document.createElement(\"a\");ll.href=_,ll.download=`session-${u}.jsonl`,ll.click(),URL.revokeObjectURL(_)},m=(0,C.useMemo)(()=>{let b=new Map,A=_=>{if(!_.sessionId)return;let ll=b.get(_.sessionId)||0;_.timestamp>ll&&b.set(_.sessionId,_.timestamp)};e.forEach(A),a.forEach(A);let O=Array.from(b.entries()).sort((_,ll)=>ll[1]-_[1]).map(_=>_[0]);return s?[s,...O]:O},[e,a,s]);(0,C.useEffect)(()=>{m.length>0&&u===null&&i(m[0])},[m,u]);let z=(0,C.useMemo)(()=>u?u===s&&c?c.console:a.filter(b=>b.sessionId===u):[],[a,u,s,c]),M=(0,C.useMemo)(()=>u?u===s&&c?c.network:e.filter(b=>b.sessionId===u):[],[e,u,s,c]);return(0,S.jsxs)(\"div\",{style:{display:\"flex\",flexDirection:\"column\",height:\"100vh\",background:x.bg,color:x.text,transition:\"background 0.2s, color 0.2s\",fontFamily:'-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif'},children:[(0,S.jsx)(\"style\",{children:`\n ::-webkit-scrollbar { width: 8px; height: 8px; }\n ::-webkit-scrollbar-track { background: ${x.bgSecondary}; }\n ::-webkit-scrollbar-thumb { background: ${x.border}; border-radius: 4px; }\n ::-webkit-scrollbar-thumb:hover { background: ${x.textSecondary}; }\n [data-gutter]::selection, [data-gutter] *::selection { background: transparent; }\n [data-gutter] .fold-icon { opacity: 0; transition: opacity 0.15s; }\n [data-code-view]:has([data-gutter]:hover) .fold-icon { opacity: 1; }\n `}),(0,S.jsxs)(\"div\",{style:{display:\"flex\",background:x.bgSecondary,borderBottom:`1px solid ${x.border}`,height:\"36px\",alignItems:\"center\",padding:\"0 8px\",gap:\"12px\"},children:[(0,S.jsxs)(\"div\",{style:{display:\"flex\",height:\"100%\"},children:[(0,S.jsx)(K1,{active:l===\"console\",onClick:()=>t(\"console\"),label:\"Console\",t:x}),(0,S.jsx)(K1,{active:l===\"network\",onClick:()=>t(\"network\"),label:\"Network\",t:x})]}),(0,S.jsxs)(\"div\",{style:{marginLeft:\"auto\",fontSize:\"11px\",display:\"flex\",alignItems:\"center\",gap:\"12px\"},children:[u&&n.includes(u)&&(0,S.jsx)(\"button\",{onClick:h,style:{fontSize:\"11px\",padding:\"4px 8px\",border:`1px solid ${x.border}`,background:x.bg,color:x.text,borderRadius:\"4px\",cursor:\"pointer\",fontWeight:600},children:\"\\u{1F4E4} Export\"}),(0,S.jsxs)(\"label\",{style:{padding:\"2px 8px\",borderRadius:\"4px\",border:`1px solid ${x.border}`,background:x.bg,cursor:\"pointer\",display:\"flex\",alignItems:\"center\",gap:\"6px\",fontWeight:600,fontSize:\"11px\"},children:[(0,S.jsx)(\"span\",{children:\"\\u{1F4E5} Import\"}),(0,S.jsx)(\"input\",{type:\"file\",accept:\".jsonl\",onChange:o,style:{display:\"none\"}})]}),(0,S.jsxs)(\"div\",{style:{display:\"flex\",alignItems:\"center\",gap:\"6px\"},children:[(0,S.jsx)(\"span\",{style:{fontSize:\"11px\",color:x.textSecondary},children:\"Session:\"}),m.length>0?(0,S.jsx)(\"select\",{value:u||\"\",onChange:b=>i(b.target.value),style:{fontSize:\"11px\",padding:\"2px 8px\",background:x.bg,color:x.text,border:`1px solid ${x.border}`,borderRadius:\"3px\",minWidth:\"280px\",outline:\"none\"},children:m.map(b=>(0,S.jsxs)(\"option\",{value:b,children:[b,\" \",b===m[0]&&!b.startsWith(\"[Imported]\")?\"(Latest)\":\"\"]},b))}):(0,S.jsx)(\"span\",{style:{fontSize:\"11px\",color:x.textSecondary,fontStyle:\"italic\"},children:\"No Sessions\"}),u&&!u.startsWith(\"[Imported]\")&&(0,S.jsxs)(\"span\",{style:{display:\"flex\",alignItems:\"center\",gap:\"4px\",fontSize:\"11px\",marginLeft:\"8px\"},children:[(0,S.jsx)(\"span\",{style:{width:\"6px\",height:\"6px\",borderRadius:\"50%\",background:n.includes(u)?\"#34a853\":\"#ea4335\"}}),(0,S.jsx)(\"span\",{style:{color:x.textSecondary},children:n.includes(u)?\"Connected\":\"Disconnected\"})]})]}),(0,S.jsx)(\"button\",{onClick:y,style:{fontSize:\"14px\",padding:\"2px 8px\",border:`1px solid ${x.border}`,background:x.bg,color:x.text,borderRadius:\"4px\",cursor:\"pointer\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",height:\"24px\",width:\"32px\"},title:E?\"Switch to light mode\":\"Switch to dark mode\",children:E?\"\\u{1F319}\":\"\\u2600\\uFE0F\"})]})]}),(0,S.jsx)(\"div\",{style:{flex:1,overflow:\"hidden\",display:\"flex\",flexDirection:\"column\"},children:u?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(\"div\",{style:{display:l===\"console\"?\"flex\":\"none\",height:\"100%\"},children:(0,S.jsx)(tr,{logs:z,t:x})}),(0,S.jsx)(\"div\",{style:{display:l===\"network\"?\"flex\":\"none\",height:\"100%\"},children:(0,S.jsx)(er,{logs:M,t:x,isDark:E})})]}):(0,S.jsx)(\"div\",{style:{flex:1,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",color:x.textSecondary,fontSize:\"14px\"},children:\"Please start Gemini CLI to begin debugging\"})})]})}function K1({active:l,onClick:t,label:e,t:a}){return(0,S.jsx)(\"div\",{onClick:t,style:{padding:\"4px 16px\",cursor:\"pointer\",color:l?a.accent:a.textSecondary,fontWeight:600,fontSize:\"12px\",userSelect:\"none\",borderBottom:l?`2px solid ${a.accent}`:\"2px solid transparent\",height:\"100%\",boxSizing:\"border-box\",display:\"flex\",alignItems:\"center\",transition:\"all 0.2s\"},children:e})}function lr({log:l,t}){let[e,a]=(0,C.useState)(!1),n=l.content||\"\",u=n.split(`\n`),i=500,c=5,f=n.length>i,s=u.length>c,v=f||s,g=l.type===\"error\",d=l.type===\"warn\",r=g?t.errorBg:d?t.warnBg:\"transparent\",T=g?\"#f28b82\":d?\"#fdd663\":t.text,E=g?\"\\u274C\":d?\"\\u26A0\\uFE0F\":\" \",x=n;return v&&!e&&(s?x=u.slice(0,c).join(`\n`)+`\n...`:x=n.substring(0,i)+\"...\"),(0,S.jsxs)(\"div\",{style:{display:\"flex\",borderBottom:`1px solid ${t.rowBorder}`,padding:\"4px 12px\",backgroundColor:r,alignItems:\"flex-start\",gap:\"8px\"},children:[(0,S.jsx)(\"div\",{style:{width:\"16px\",textAlign:\"center\",flexShrink:0,fontSize:\"10px\",marginTop:\"2px\"},children:E}),(0,S.jsx)(\"div\",{style:{flex:1,display:\"flex\",flexDirection:\"column\"},children:(0,S.jsx)(\"div\",{style:{whiteSpace:\"pre-wrap\",wordBreak:\"break-all\",color:T,lineHeight:\"1.5\",fontSize:\"11px\"},children:x})}),(0,S.jsxs)(\"div\",{style:{display:\"flex\",alignItems:\"center\",gap:\"8px\",flexShrink:0},children:[v&&(0,S.jsx)(\"div\",{onClick:()=>a(!e),style:{fontSize:\"12px\",color:t.text,cursor:\"pointer\",fontWeight:\"bold\",userSelect:\"none\",width:\"20px\",height:\"20px\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",borderRadius:\"4px\",border:`1px solid ${t.border}`,background:t.bgSecondary,transition:\"all 0.1s\"},onMouseOver:y=>{y.currentTarget.style.background=t.bgHover},onMouseOut:y=>{y.currentTarget.style.background=t.bgSecondary},title:e?\"Collapse\":\"Expand\",children:e?\"\\u2212\":\"+\"}),(0,S.jsx)(\"div\",{style:{color:t.textSecondary,fontSize:\"10px\",userSelect:\"none\",textAlign:\"right\",minWidth:\"70px\"},children:new Date(l.timestamp).toLocaleTimeString([],{hour12:!1,hour:\"2-digit\",minute:\"2-digit\",second:\"2-digit\"})})]})]})}function tr({logs:l,t}){let e=(0,C.useRef)(null);return(0,C.useEffect)(()=>{e.current?.scrollIntoView({behavior:\"smooth\"})},[l.length]),l.length===0?(0,S.jsx)(\"div\",{style:{padding:\"20px\",color:t.textSecondary,fontSize:\"11px\",textAlign:\"center\",flex:1},children:\"No console logs in this session\"}):(0,S.jsxs)(\"div\",{style:{flex:1,overflowY:\"auto\",fontFamily:'SFMono-Regular, Consolas, \"Liberation Mono\", Menlo, monospace',background:t.consoleBg,fontSize:\"12px\"},children:[l.map(a=>(0,S.jsx)(lr,{log:a,t},a.id)),(0,S.jsx)(\"div\",{ref:e})]})}function er({logs:l,t,isDark:e}){let[a,n]=(0,C.useState)(null),[u,i]=(0,C.useState)(\"\"),[c,f]=(0,C.useState)(!0),[s,v]=(0,C.useState)({}),[g,d]=(0,C.useState)(400),r=(0,C.useRef)(!1);(0,C.useEffect)(()=>{let m=M=>{if(!r.current)return;let b=Math.max(200,Math.min(M.clientX,window.innerWidth-200));d(b)},z=()=>{r.current=!1,document.body.style.cursor=\"default\",document.body.style.userSelect=\"auto\"};return document.addEventListener(\"mousemove\",m),document.addEventListener(\"mouseup\",z),()=>{document.removeEventListener(\"mousemove\",m),document.removeEventListener(\"mouseup\",z)}},[]);let T=()=>{r.current=!0,document.body.style.cursor=\"col-resize\",document.body.style.userSelect=\"none\"},E=(0,C.useMemo)(()=>{let m=l;if(u){let z=u.toLowerCase();m=l.filter(M=>M.url.toLowerCase().includes(z))}return m},[l,u]),x=(0,C.useMemo)(()=>{if(!c)return null;let m={};return E.forEach(z=>{let M=\"Other\";try{let b=new URL(z.url),A=b.pathname.lastIndexOf(\"/\"),O=A!==-1?b.pathname.substring(0,A+1):\"/\";M=b.hostname+O}catch{}m[M]||(m[M]=[]),m[M].push(z)}),m},[E,c]);(0,C.useEffect)(()=>{x&&v(m=>{let z={...m};return Object.keys(x).forEach(M=>{z[M]===void 0&&(z[M]=!M.includes(\"play.googleapis.com\"))}),z})},[x]);let y=m=>{v(z=>({...z,[m]:!z[m]}))},o=l.find(m=>m.id===a),h=(m,z)=>{let M=m.pending,b=m.response?m.response.status:m.error?\"ERR\":\"...\",A=m.error||m.response&&m.response.status>=400,O=z||m.url;if(!z)try{let ll=new URL(m.url);O=ll.pathname+ll.search}catch{}let _=m.id===a;return(0,S.jsx)(\"div\",{onClick:()=>n(m.id),style:{padding:\"8px 12px\",cursor:\"pointer\",borderBottom:`1px solid ${t.rowBorder}`,display:\"flex\",flexDirection:\"column\",fontSize:\"12px\",backgroundColor:_?t.bgHover:\"transparent\",color:A?\"#f28b82\":t.text,paddingLeft:z?\"24px\":\"12px\"},children:(0,S.jsxs)(\"div\",{style:{display:\"flex\",alignItems:\"center\"},children:[(0,S.jsx)(\"span\",{style:{fontWeight:\"bold\",width:\"45px\",flexShrink:0,fontSize:\"10px\",color:e?\"#81c995\":\"#188038\"},children:m.method}),(0,S.jsx)(\"span\",{style:{flex:1,whiteSpace:\"nowrap\",overflow:\"hidden\",textOverflow:\"ellipsis\",margin:\"0 8px\",fontWeight:500},title:m.url,children:O}),(0,S.jsx)(\"span\",{style:{width:\"40px\",textAlign:\"right\",flexShrink:0,fontSize:\"11px\",color:M?t.accent:A?\"#f28b82\":\"#81c995\"},children:M?\"\\u23F3\":b})]})},m.id)};return l.length===0?(0,S.jsx)(\"div\",{style:{flex:1,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",color:t.textSecondary,fontSize:\"12px\"},children:\"No network activity in this session\"}):(0,S.jsxs)(\"div\",{style:{display:\"flex\",width:\"100%\",height:\"100%\"},children:[(0,S.jsxs)(\"div\",{style:{width:`${g}px`,display:\"flex\",flexDirection:\"column\",borderRight:`1px solid ${t.border}`,background:t.bg},children:[(0,S.jsxs)(\"div\",{style:{padding:\"6px\",background:t.bgSecondary,borderBottom:`1px solid ${t.border}`,display:\"flex\",gap:\"6px\"},children:[(0,S.jsx)(\"input\",{type:\"text\",placeholder:\"Filter...\",value:u,onChange:m=>i(m.target.value),style:{flex:1,boxSizing:\"border-box\",padding:\"4px 10px\",background:t.bg,color:t.text,border:`1px solid ${t.border}`,borderRadius:\"4px\",fontSize:\"12px\"}}),(0,S.jsx)(\"button\",{onClick:()=>f(!c),style:{background:c?t.accent:t.bg,color:c?\"#fff\":t.text,border:`1px solid ${t.border}`,borderRadius:\"4px\",cursor:\"pointer\",fontSize:\"12px\",padding:\"0 8px\"},title:\"Group by Domain\",children:\"\\u{1F4C2}\"})]}),(0,S.jsx)(\"div\",{style:{flex:1,overflowY:\"auto\"},children:c&&x?Object.keys(x).map(m=>(0,S.jsxs)(\"div\",{children:[(0,S.jsxs)(\"div\",{onClick:()=>y(m),style:{padding:\"6px 12px\",background:t.bgSecondary,fontWeight:\"bold\",fontSize:\"11px\",borderBottom:`1px solid ${t.rowBorder}`,wordBreak:\"break-all\",cursor:\"pointer\",display:\"flex\",alignItems:\"center\",userSelect:\"none\"},children:[(0,S.jsx)(\"span\",{style:{marginRight:\"8px\",fontSize:\"9px\",color:t.textSecondary},children:s[m]?\"\\u25BC\":\"\\u25B6\"}),m,(0,S.jsx)(\"span\",{style:{marginLeft:\"auto\",fontWeight:\"normal\",color:t.textSecondary,fontSize:\"10px\",background:t.bg,padding:\"0 6px\",borderRadius:\"10px\"},children:x[m].length})]}),s[m]&&x[m].map(z=>{let M=z.url;try{let b=new URL(z.url),A=b.pathname.lastIndexOf(\"/\");M=(b.pathname.substring(A+1)||\"/\")+b.search}catch{}return h(z,M)})]},m)):E.map(m=>h(m))})]}),(0,S.jsx)(\"div\",{onMouseDown:T,style:{width:\"2px\",cursor:\"col-resize\",background:t.border,flexShrink:0,zIndex:10}}),(0,S.jsx)(\"div\",{style:{flex:1,display:\"flex\",flexDirection:\"column\",overflow:\"hidden\",background:t.bg},children:o?(0,S.jsx)(ar,{log:o,t}):(0,S.jsx)(\"div\",{style:{padding:\"40px\",textAlign:\"center\",color:t.textSecondary,fontSize:\"14px\"},children:\"Select a request to view details\"})})]})}function ar({log:l,t}){let[e,a]=(0,C.useState)(\"headers\"),n=l.response?l.pending?\"\\u23F3\":l.response.status:l.error?\"Error\":\"\\u23F3\";return(0,S.jsxs)(\"div\",{style:{display:\"flex\",flexDirection:\"column\",height:\"100%\",overflow:\"hidden\"},children:[(0,S.jsxs)(\"div\",{style:{padding:\"12px 16px\",borderBottom:`1px solid ${t.border}`,background:t.bgSecondary},children:[(0,S.jsx)(\"div\",{style:{fontWeight:\"bold\",fontSize:\"13px\",marginBottom:\"6px\",wordBreak:\"break-all\",color:t.text},children:l.url}),(0,S.jsxs)(\"div\",{style:{fontSize:\"11px\",color:t.textSecondary,display:\"flex\",gap:\"8px\"},children:[(0,S.jsx)(\"span\",{style:{background:t.bg,padding:\"1px 6px\",borderRadius:\"3px\",fontWeight:\"bold\"},children:l.method}),(0,S.jsx)(\"span\",{children:\"\\u2022\"}),(0,S.jsx)(\"span\",{style:{color:l.error?\"#f28b82\":\"#81c995\"},children:n}),(0,S.jsx)(\"span\",{children:\"\\u2022\"}),(0,S.jsx)(\"span\",{children:new Date(l.timestamp).toLocaleTimeString()}),l.response&&(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(\"span\",{children:\"\\u2022\"}),(0,S.jsxs)(\"span\",{style:{color:t.accent},children:[l.response.durationMs,\"ms\"]})]})]})]}),(0,S.jsx)(\"div\",{style:{display:\"flex\",borderBottom:`1px solid ${t.border}`,background:t.bgSecondary,paddingLeft:\"8px\"},children:[\"headers\",\"payload\",\"response\"].map(u=>(0,S.jsx)(\"div\",{onClick:()=>a(u),style:{padding:\"8px 16px\",cursor:\"pointer\",fontWeight:600,fontSize:\"12px\",textTransform:\"capitalize\",borderBottom:e===u?`2px solid ${t.accent}`:\"2px solid transparent\",color:e===u?t.accent:t.textSecondary,transition:\"all 0.2s\"},children:u},u))}),(0,S.jsxs)(\"div\",{style:{flex:1,overflowY:\"auto\",background:t.bg},children:[e===\"headers\"&&(0,S.jsxs)(\"div\",{style:{padding:\"16px\"},children:[(0,S.jsxs)(Zf,{title:\"General\",t,children:[(0,S.jsx)(En,{k:\"Request URL\",v:l.url,t}),(0,S.jsx)(En,{k:\"Request Method\",v:l.method,t}),(0,S.jsx)(En,{k:\"Status Code\",v:String(l.response?l.response.status:\"Pending\"),t,color:l.error?\"#f28b82\":\"#81c995\"}),l.error&&(0,S.jsx)(En,{k:\"Error\",v:l.error,t,color:\"#f28b82\"})]}),(0,S.jsx)(Zf,{title:\"Response Headers\",t,children:l.response?(0,S.jsx)(J1,{headers:l.response.headers,t}):(0,S.jsx)(\"span\",{style:{fontStyle:\"italic\",color:t.textSecondary},children:\"(no response yet)\"})}),(0,S.jsx)(Zf,{title:\"Request Headers\",t,children:(0,S.jsx)(J1,{headers:l.headers,t})})]}),e===\"payload\"&&(0,S.jsx)(w1,{content:l.body,t}),e===\"response\"&&(0,S.jsx)(w1,{content:l.response?.body,chunks:l.chunks,t})]})]})}function Zf({title:l,children:t,t:e}){let[a,n]=(0,C.useState)(!1);return(0,S.jsxs)(\"div\",{style:{marginBottom:\"16px\",border:`1px solid ${e.border}`,borderRadius:\"6px\",overflow:\"hidden\"},children:[(0,S.jsxs)(\"div\",{onClick:()=>n(!a),style:{padding:\"8px 12px\",background:e.bgSecondary,fontWeight:\"bold\",fontSize:\"11px\",cursor:\"pointer\",userSelect:\"none\",display:\"flex\",alignItems:\"center\",gap:\"8px\"},children:[(0,S.jsx)(\"span\",{style:{fontSize:\"9px\",color:e.textSecondary},children:a?\"\\u25B6\":\"\\u25BC\"}),l]}),!a&&(0,S.jsx)(\"div\",{style:{padding:\"12px\",background:e.bg},children:t})]})}function En({k:l,v:t,color:e,t:a}){return(0,S.jsxs)(\"div\",{style:{display:\"flex\",fontSize:\"12px\",fontFamily:\"monospace\",marginBottom:\"4px\",lineHeight:\"1.4\"},children:[(0,S.jsxs)(\"div\",{style:{fontWeight:\"bold\",color:a.textSecondary,width:\"160px\",flexShrink:0},children:[l,\":\"]}),(0,S.jsx)(\"div\",{style:{flex:1,wordBreak:\"break-all\",color:e||a.text},children:t})]})}function J1({headers:l,t}){return l?(0,S.jsx)(S.Fragment,{children:Object.entries(l).map(([e,a])=>(0,S.jsx)(En,{k:e,v:String(a),t},e))}):(0,S.jsx)(\"div\",{style:{color:t.textSecondary},children:\"(none)\"})}function w1({content:l,chunks:t,t:e}){let[a,n]=(0,C.useState)(\"json\"),u=t&&t.length>0,i=u?t.map(g=>g.data).join(\"\"):l||\"\",c=()=>{try{return JSON.stringify(JSON.parse(i),null,2)}catch{return i}},f=()=>{navigator.clipboard.writeText(c()).catch(()=>{})},s=()=>{let g=new Blob([c()],{type:\"application/json\"}),d=URL.createObjectURL(g),r=document.createElement(\"a\");r.href=d,r.download=\"body.json\",r.click(),URL.revokeObjectURL(d)};if(!i&&!u)return(0,S.jsx)(\"div\",{style:{padding:\"40px\",color:e.textSecondary,textAlign:\"center\"},children:\"(No content)\"});let v={background:\"none\",border:\"none\",cursor:\"pointer\",color:e.textSecondary,padding:\"2px\",borderRadius:\"4px\",display:\"flex\",alignItems:\"center\"};return(0,S.jsxs)(\"div\",{style:{display:\"flex\",flexDirection:\"column\",height:\"100%\"},children:[(0,S.jsxs)(\"div\",{style:{padding:\"6px 12px\",background:e.bgSecondary,borderBottom:`1px solid ${e.border}`,display:\"flex\",gap:\"8px\",alignItems:\"center\"},children:[[\"json\",\"raw\"].map(g=>(0,S.jsx)(\"button\",{onClick:()=>n(g),style:{fontSize:\"11px\",padding:\"2px 8px\",borderRadius:\"4px\",border:`1px solid ${e.border}`,background:a===g?e.accent:e.bg,color:a===g?\"#fff\":e.text,cursor:\"pointer\",textTransform:\"uppercase\",fontWeight:\"bold\"},children:g},g)),(0,S.jsx)(\"div\",{style:{flex:1}}),(0,S.jsx)(\"button\",{onClick:f,style:v,title:\"Copy JSON\",children:(0,S.jsxs)(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 16 16\",fill:\"currentColor\",children:[(0,S.jsx)(\"path\",{d:\"M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 010 1.5h-1.5a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-1.5a.75.75 0 011.5 0v1.5A1.75 1.75 0 019.25 16h-7.5A1.75 1.75 0 010 14.25z\"}),(0,S.jsx)(\"path\",{d:\"M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0114.25 11h-7.5A1.75 1.75 0 015 9.25zm1.75-.25a.25.25 0 00-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 00.25-.25v-7.5a.25.25 0 00-.25-.25z\"})]})}),(0,S.jsx)(\"button\",{onClick:s,style:v,title:\"Download JSON\",children:(0,S.jsxs)(\"svg\",{width:\"14\",height:\"14\",viewBox:\"0 0 16 16\",fill:\"currentColor\",children:[(0,S.jsx)(\"path\",{d:\"M2.75 14A1.75 1.75 0 011 12.25v-2.5a.75.75 0 011.5 0v2.5c0 .138.112.25.25.25h10.5a.25.25 0 00.25-.25v-2.5a.75.75 0 011.5 0v2.5A1.75 1.75 0 0113.25 14z\"}),(0,S.jsx)(\"path\",{d:\"M7.25 7.689V2a.75.75 0 011.5 0v5.689l1.97-1.969a.749.749 0 111.06 1.06l-3.25 3.25a.749.749 0 01-1.06 0L4.22 6.78a.749.749 0 111.06-1.06z\"})]})})]}),(0,S.jsx)(\"div\",{style:{flex:1,overflow:\"auto\",padding:a===\"raw\"?\"16px\":0},children:u&&a===\"raw\"?(0,S.jsx)(\"div\",{children:t.map((g,d)=>(0,S.jsxs)(\"div\",{style:{marginBottom:\"12px\"},children:[(0,S.jsxs)(\"div\",{style:{fontSize:\"10px\",color:e.textSecondary,marginBottom:\"4px\"},children:[\"[\",new Date(g.timestamp).toLocaleTimeString(\"en-US\",{hour12:!1}),\".\",String(g.timestamp%1e3).padStart(3,\"0\"),\"]\"]}),(0,S.jsx)(\"pre\",{style:{margin:0,fontSize:\"12px\",fontFamily:\"SFMono-Regular, Consolas, monospace\",whiteSpace:\"pre-wrap\",wordBreak:\"break-all\",color:e.text,lineHeight:\"1.5\"},children:g.data})]},d))}):a===\"raw\"?(0,S.jsx)(\"pre\",{style:{margin:0,fontSize:\"12px\",fontFamily:\"SFMono-Regular, Consolas, monospace\",whiteSpace:\"pre-wrap\",wordBreak:\"break-all\",color:e.text,lineHeight:\"1.5\"},children:i}):(0,S.jsx)(nr,{content:i,t:e})})]})}function nr({content:l,t}){let e=l||\"\";if(e.includes(\"data:\")){let a=e.split(/\\n\\s*\\n/).map((n,u)=>({index:u+1,jsonStr:n.split(`\n`).filter(i=>i.trim().startsWith(\"data:\")).map(i=>i.trim().substring(5).trim()).join(\"\")})).filter(n=>n.jsonStr);if(a.length>0)return(0,S.jsx)(\"div\",{children:a.map(n=>(0,S.jsxs)(\"div\",{style:{marginBottom:\"12px\",borderLeft:`2px solid ${t.accent}`,paddingLeft:\"12px\",background:t.bgSecondary,borderRadius:\"0 4px 4px 0\",padding:\"8px 12px\"},children:[(0,S.jsxs)(\"div\",{style:{fontWeight:\"bold\",color:t.textSecondary,fontSize:\"10px\",marginBottom:\"4px\"},children:[\"CHUNK \",n.index]}),(0,S.jsx)(F1,{data:k1(n.jsonStr),t})]},n.index))})}return(0,S.jsx)(F1,{data:k1(e),t})}function k1(l){try{return JSON.parse(l)}catch{return l}}function ur(l){let t=typeof l==\"string\"&&!l.startsWith(\"{\")&&!l.startsWith(\"[\")?l:JSON.stringify(l,null,2);if(t==null)return[{text:\"undefined\",foldStart:!1,foldEnd:-1,closingBracket:\"\"}];let e=t.split(`\n`),a=e.map(u=>({text:u,foldStart:!1,foldEnd:-1,closingBracket:\"\"})),n=[];for(let u=0;u0&&n[n.length-1].bracket===s){let v=n.pop();a[v.index].foldStart=!0,a[v.index].foldEnd=u,a[v.index].closingBracket=v.bracket}}return a}var W1=/(\"(?:[^\"\\\\]|\\\\.)*\")\\s*(?=:)|(\"(?:[^\"\\\\]|\\\\.)*\")|(-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)|(\\btrue\\b|\\bfalse\\b)|(\\bnull\\b)|([{}[\\]:,])/g;function $1(l,t){let e=[],a=0,n;for(W1.lastIndex=0;(n=W1.exec(l))!==null;){n.index>a&&e.push(l.slice(a,n.index));let[u,i,c,f,s,v]=n;if(i)e.push((0,S.jsx)(\"span\",{style:{color:t.accent,fontWeight:\"bold\"},children:u},a));else if(c){let g;try{g=JSON.parse(u)}catch{g=u.slice(1,-1)}let d=g.split(`\n`);if(d.length<=1)e.push((0,S.jsx)(\"span\",{style:{color:\"#81c995\"},children:u},a));else{let r=\" \".repeat(n.index+1);e.push((0,S.jsx)(ir,{lines:d,indent:r,t},a))}}else f?e.push((0,S.jsx)(\"span\",{style:{color:\"#ad7fa8\"},children:u},a)):s?e.push((0,S.jsx)(\"span\",{style:{color:\"#fdd663\",fontWeight:\"bold\"},children:u},a)):v?e.push((0,S.jsx)(\"span\",{style:{color:\"#babdb6\",fontWeight:\"bold\"},children:u},a)):e.push((0,S.jsx)(\"span\",{children:u},a));a=n.index+u.length}return aVf,i=u&&!a?l.slice(0,Vf):l;return(0,S.jsxs)(\"span\",{style:{color:\"#81c995\"},children:['\"',i[0],i.slice(1).map((c,f)=>(0,S.jsxs)(C.default.Fragment,{children:[`\n`,t,c]},f)),u&&(0,S.jsxs)(S.Fragment,{children:[`\n`,t,(0,S.jsx)(\"span\",{onClick:()=>n(!a),style:{color:e.accent,cursor:\"pointer\",fontStyle:\"italic\",userSelect:\"none\"},children:a?\"\\u25B2 collapse\":`... ${l.length-Vf} more lines`})]}),'\"']})}function F1({data:l,t}){let e=(0,C.useMemo)(()=>ur(l),[l]),[a,n]=(0,C.useState)(()=>new Set),u=(0,C.useRef)(null),i=v=>{n(g=>{let d=new Set(g);return d.has(v)?d.delete(v):d.add(v),d})},c=v=>{if((v.metaKey||v.ctrlKey)&&v.key===\"a\"){v.preventDefault();let g=window.getSelection();if(g&&u.current){g.removeAllRanges();let d=document.createRange();d.selectNodeContents(u.current),g.addRange(d)}}},f=[],s=0;for(;s0&&(0,S.jsx)(\"span\",{children:d}),$1(r,t),(0,S.jsxs)(\"span\",{style:{color:t.textSecondary,fontStyle:\"italic\"},children:[\" \",\"... \",v.closingBracket]})]}),foldable:!0,isCollapsed:!0}),s=v.foldEnd+1}else f.push({index:s,content:$1(v.text,t),foldable:v.foldStart,isCollapsed:!1}),s++}return(0,S.jsx)(\"div\",{tabIndex:0,onKeyDown:c,ref:u,\"data-code-view\":!0,style:{display:\"grid\",gridTemplateColumns:\"20px 1fr\",fontFamily:'SFMono-Regular, Consolas, \"Liberation Mono\", Menlo, monospace',fontSize:\"12px\",lineHeight:\"1.5\",outline:\"none\"},children:f.map(v=>(0,S.jsxs)(C.default.Fragment,{children:[(0,S.jsx)(\"div\",{\"data-gutter\":!0,style:{userSelect:\"none\",textAlign:\"center\",color:t.textSecondary,borderRight:`1px solid ${t.border}`,paddingRight:\"2px\",cursor:v.foldable?\"pointer\":\"default\",fontSize:\"9px\",paddingTop:\"3px\"},onClick:v.foldable?()=>i(v.index):void 0,children:v.foldable?(0,S.jsx)(\"span\",{className:\"fold-icon\",children:v.isCollapsed?\"\\u25B6\":\"\\u25BC\"}):\"\"}),(0,S.jsx)(\"div\",{style:{whiteSpace:\"pre\",color:t.text,paddingLeft:\"8px\",minHeight:\"18px\"},children:v.content})]},v.index))})}var Jf=Mt(zn(),1);P1.default.createRoot(document.getElementById(\"root\")).render((0,Jf.jsx)(I1.default.StrictMode,{children:(0,Jf.jsx)(Kf,{})}));\n/**\n * @license\n * Copyright 2025 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n/*! Bundled license information:\n\nreact/cjs/react.production.js:\n (**\n * @license React\n * react.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n\nscheduler/cjs/scheduler.production.js:\n (**\n * @license React\n * scheduler.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n\nreact-dom/cjs/react-dom.production.js:\n (**\n * @license React\n * react-dom.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n\nreact-dom/cjs/react-dom-client.production.js:\n (**\n * @license React\n * react-dom-client.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n\nreact/cjs/react-jsx-runtime.production.js:\n (**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *)\n*/\n";