@rango-dev/widget-embedded 0.32.2-next.7 → 0.32.2-next.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/components/StatefulConnectModal/StatefulConnectModal.tsx", "../src/hooks/useStatefulConnect/useStatefulConnect.ts", "../src/hooks/useStatefulConnect/useStatefulConnect.helpers.ts", "../src/hooks/useStatefulConnect/useStatefulConnect.state.ts", "../src/hooks/useWalletList.ts", "../src/store/AppStore.tsx", "../src/store/app.ts", "../src/services/cacheService.ts", "../src/utils/meta.ts", "../src/store/utils/data.ts", "../src/store/slices/config.ts", "../src/constants/customTokens.ts", "../src/services/httpService.ts", "../src/constants/index.ts", "../src/utils/wallets.ts", "../src/constants/numbers.ts", "../src/constants/wallets.ts", "../src/utils/common.ts", "../src/constants/fonts.ts", "../src/utils/numbers.ts", "../src/utils/configs.ts", "../src/utils/settings.ts", "../src/store/slices/data.ts", "../src/constants/languages.ts", "../src/constants/swapSettings.ts", "../src/store/slices/settings.ts", "../src/store/wallets.ts", "../src/services/eventEmitter.ts", "../src/types/event.ts", "../src/store/selectors.ts", "../src/utils/providers.ts", "../src/components/common/WatermarkedModal/WatermarkedModal.tsx", "../src/store/ui.ts", "../src/libs/tabManager/tabManager.constants.ts", "../src/libs/tabManager/tabManager.ts", "../src/components/WalletStatefulConnect/Namespaces.tsx", "../src/components/HeaderButtons/HeaderButtons.styles.ts", "../src/components/WalletStatefulConnect/ConnectStatus.styles.ts", "../src/components/WalletStatefulConnect/Namespaces.helpers.ts", "../src/components/WalletStatefulConnect/Namespaces.styles.ts", "../src/components/WalletStatefulConnect/DerivationPath.tsx", "../src/components/WalletStatefulConnect/DerivationPath.helpers.ts", "../src/components/WalletStatefulConnect/DerivationPath.styles.ts", "../src/components/WalletStatefulConnect/ConnectStatus.tsx", "../src/components/WalletStatefulConnect/ExperimentalChain.tsx", "../src/components/StatefulConnectModal/helpers.ts", "../src/containers/Wallets/Wallets.tsx", "../src/hooks/useWalletProviders/useWalletProviders.ts", "../src/hooks/useWalletProviders/useWalletProviders.helpers.ts", "../src/containers/Widget/Widget.tsx", "../src/components/AppRouter.tsx", "../src/containers/App/App.tsx", "../src/components/AppRoutes.tsx", "../src/constants/navigationRoutes.ts", "../src/hooks/useSyncStoresWithConfig.ts", "../src/store/quote.ts", "../src/utils/quote.ts", "../src/constants/quote.ts", "../src/utils/swap.ts", "../src/constants/errors.ts", "../src/constants/messages.ts", "../src/hooks/useSyncUrlAndStore/useSyncUrlAndStore.ts", "../src/hooks/useSyncUrlAndStore/useSyncUrlAndStore.helpers.ts", "../src/pages/AddCustomTokenPage.tsx", "../src/components/BlockchainSelectorButton/BlockchainSelectorButton.tsx", "../src/components/BlockchainSelectorButton/BlockchainSelectorButton.styles.ts", "../src/components/CustomTokenModal/CustomTokenModal.tsx", "../src/components/CustomTokenModal/CustomTokenModal.helpers.ts", "../src/components/CustomTokenModal/CustomTokenModal.styles.ts", "../src/components/Layout/Layout.tsx", "../src/hooks/useIframe/useIframe.ts", "../src/hooks/useIframe/useIframe.helpers.ts", "../src/hooks/useNavigateBack.ts", "../src/hooks/useTheme.ts", "../src/utils/ui.ts", "../src/utils/colors.ts", "../src/utils/hash.ts", "../src/utils/queue.ts", "../src/components/common/ActivateTabAlert/ActivateTabAlert.tsx", "../src/components/common/ActivateTabModal/ActivateTabModal.tsx", "../src/components/HeaderButtons/BackButton.tsx", "../src/components/HeaderButtons/CancelButton.tsx", "../src/components/HeaderButtons/WalletButton.tsx", "../src/components/HeaderButtons/HeaderButtons.tsx", "../src/components/NotificationContent/NotificationContent.tsx", "../src/store/notification.ts", "../src/components/HeaderButtons/InProgressTransactionBadge.tsx", "../src/components/HeaderButtons/NotificationsBadge.tsx", "../src/components/HeaderButtons/RefreshButton.tsx", "../src/components/RefreshModal/RefreshModal.tsx", "../src/components/RefreshModal/RefreshModal.styles.ts", "../src/components/Layout/Layout.helpers.ts", "../src/components/Layout/Layout.styles.ts", "../src/components/Layout/ScrollableArea.tsx", "../src/components/Layout/PageContainer.tsx", "../src/hooks/useFetchCustomToken.ts", "../src/pages/ConfirmSwapPage.tsx", "../src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx", "../src/constants/warnings.ts", "../src/components/CustomDestination/CustomDestination.tsx", "../src/components/CustomCollapsible/CustomCollapsible.tsx", "../src/components/CustomCollapsible/CustomCollapsible.styles.ts", "../src/components/CustomDestination/CustomDestination.styles.ts", "../src/components/ConfirmWalletsModal/ConfirmWallets.styles.ts", "../src/components/ConfirmWalletsModal/WalletList.tsx", "../src/components/WalletStatefulConnect/ExperimentalChainStatus.tsx", "../src/components/ConfirmWalletsModal/WalletList.styles.ts", "../src/components/WalletStatefulConnect/ExperimentalChainStatus.helpers.ts", "../src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.tsx", "../src/components/NoResult/NoResult.tsx", "../src/components/NoResult/NoResult.helpers.ts", "../src/components/NoResult/NoResult.styles.ts", "../src/components/QuoteWarningsAndErrors/HighValueLossWarningModal.tsx", "../src/components/QuoteWarningsAndErrors/QuoteErrorsModalItem.tsx", "../src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.styles.ts", "../src/components/QuoteWarningsAndErrors/QuoteWarningsAndErrors.helpers.ts", "../src/components/QuoteWarningsAndErrors/SlippageWariningModal.tsx", "../src/components/QuoteWarningsAndErrors/UnknownPriceWarningModal.tsx", "../src/containers/QuoteInfo/QuoteInfo.tsx", "../src/components/Quote/Quote.tsx", "../src/containers/QuoteInfo/QuoteInfo.styles.ts", "../src/components/Quote/Quote.styles.ts", "../src/components/Quote/QuoteCostDetails.tsx", "../src/components/Quote/QuoteCostDetails.styles.ts", "../src/components/Quote/QuoteSummary.tsx", "../src/components/Quote/QuoteSummary.styles.ts", "../src/components/Quote/QuoteTrigger.tsx", "../src/hooks/useScreenDetect.ts", "../src/components/QuoteSkeleton/QuoteSkeleton.tsx", "../src/components/QuoteSkeleton/QuoteSkeleton.styles.ts", "../src/components/QuoteSkeleton/QuoteSummarySkeleton.tsx", "../src/components/QuoteSkeleton/QuoteSummarySkeleton.styles.ts", "../src/components/QuoteSkeleton/StepSkeleton.tsx", "../src/components/QuoteSkeleton/StepSkeleton.styles.ts", "../src/hooks/useConfirmSwap/useConfirmSwap.ts", "../src/hooks/useFetch.ts", "../src/hooks/useFetchConfirmQuote.ts", "../src/hooks/useConfirmSwap/useConfirmSwap.helpers.ts", "../src/pages/CustomTokensPage.tsx", "../src/components/SearchInput/SearchInput.tsx", "../src/components/SearchInput/SearchInput.styles.ts", "../src/components/TokenList/TokenList.tsx", "../src/hooks/useObserveBalanceChanges/useObserveBalanceChanges.ts", "../src/components/TokenList/LoadingTokenList.tsx", "../src/components/TokenList/TokenList.styles.ts", "../src/pages/HistoryPage.tsx", "../src/components/FilterSelector/FilterSelector.tsx", "../src/components/FilterSelector/FilterSelector.style.ts", "../src/components/FilterSelector/FilterSelectorContent.tsx", "../src/components/HistoryGroupedList/HistoryGroupedList.tsx", "../src/components/HistoryGroupedList/HistoryGroupedList.helpers.ts", "../src/components/HistoryGroupedList/HistoryGroupedList.styles.ts", "../src/utils/date.ts", "../src/pages/Home.tsx", "../src/containers/ExpandedQuotes/ExpandedQuotes.tsx", "../src/components/Quotes/Quotes.tsx", "../src/components/Quotes/Quotes.styles.ts", "../src/components/Quotes/SelectStrategy.tsx", "../src/containers/ExpandedQuotes/ExpandedQuotes.styles.ts", "../src/containers/Inputs/Inputs.tsx", "../src/components/SwitchFromAndTo/SwitchFromAndTo.tsx", "../src/components/SwitchFromAndTo/SwitchFromAndTo.styles.ts", "../src/containers/Inputs/Inputs.styles.ts", "../src/hooks/useSwapInput.ts", "../src/hooks/useFetchAllQuotes.ts", "../src/utils/events.ts", "../src/pages/LanguagePage.tsx", "../src/hooks/useLanguage.ts", "../src/pages/LiquiditySourcePage.tsx", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.tsx", "../src/components/SettingsContainer/SettingsContainer.style.ts", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.ts", "../src/pages/Routes.tsx", "../src/pages/SelectBlockchainPage.tsx", "../src/components/BlockchainList/BlockchainList.tsx", "../src/components/BlockchainList/BlockchainList.helpers.ts", "../src/components/BlockchainList/BlockchainList.styles.ts", "../src/components/BlockchainList/LoadingBlockchainList.tsx", "../src/pages/SelectSwapItemsPage.tsx", "../src/components/BlockchainsSection/BlockchainsSection.tsx", "../src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.ts", "../src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.constants.ts", "../src/hooks/usePrepareBlockchainList/usePrepareBlockchainList.helpers.ts", "../src/components/BlockchainsSection/BlockchainsSection.styles.ts", "../src/pages/SettingsPage.tsx", "../src/components/Slippage/Slippage.tsx", "../src/components/Slippage/Slippage.styles.ts", "../src/components/Slippage/SlippageTooltipContent.tsx", "../src/containers/Settings/Lists.tsx", "../src/pages/SwapDetailsPage.tsx", "../src/components/SwapDetails/SwapDetails.tsx", "../src/utils/time.ts", "../src/components/SwapDetailsModal/SwapDetailsModal.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.Cancel.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.Delete.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.helpers.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.WalletState.tsx", "../src/components/SwapDetailsModal/SwapDetailsModal.styles.ts", "../src/components/SwapDetailsModal/SwapDetailsCompleteModal.tsx", "../src/components/SwapDetails/SwapDetails.helpers.tsx", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.tsx", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.Failed.tsx", "../src/components/SwapDetails/SwapDetails.styles.ts", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.styles.ts", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.Warning.tsx", "../src/components/SwapDetails/SwapDetails.Placeholder.tsx", "../src/components/LoadingSwapDetails/LoadingSwapDetails.tsx", "../src/components/LoadingSwapDetails/LoadingSwapDetails.styles.ts", "../src/pages/WalletsPage.tsx", "../src/hooks/useBootstrap/useBootstrap.ts", "../src/globalStyles.ts", "../src/hooks/useFetchApiConfig.ts", "../src/hooks/useForceAutoConnect.ts", "../src/hooks/useSubscribeToWidgetEvents/useSubscribeToWidgetEvents.ts", "../src/hooks/useSyncNotifications/useSyncNotifications.ts", "../src/containers/App/App.styles.ts", "../src/containers/WidgetProvider/WidgetProvider.tsx", "../src/hooks/useFontLoader.ts", "../src/QueueManager.tsx", "../src/containers/WidgetInfo/WidgetInfo.tsx", "../src/hooks/useUpdateQuoteInputs/useUpdateQuoteInputs.ts", "../src/containers/WidgetInfo/WidgetInfo.helpers.ts", "../src/hooks/useWidgetEvents/useWidgetEvents.ts"],
4
- "sourcesContent": ["import type { WidgetProps } from './containers/Widget';\nimport type { ConnectedWallet } from './store/wallets';\nimport type {\n BlockchainAndTokenConfig,\n QuoteEventData,\n Tokens,\n UiEventData,\n WalletEventData,\n WalletInfoWithExtra,\n WidgetColors,\n WidgetColorsKeys,\n WidgetConfig,\n WidgetTheme,\n WidgetVariant,\n} from './types';\nimport type {\n PendingSwapWithQueueID,\n Route,\n RouteEvent,\n RouteEventData,\n RouteExecutionEvents,\n RouteFailedEvent,\n RouteStartedEvent,\n RouteSucceededEvent,\n Step,\n StepApprovalTxSucceededEvent,\n StepCheckStatusEvent,\n StepEvent,\n StepEventData,\n StepFailedEvent,\n StepOutputRevealedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepTxExecutionBlockedEvent,\n StepTxExecutionUpdatedEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport type {\n LegacyEventHandler as HandleWalletsUpdate,\n LegacyProviderInterface as ProviderInterface,\n} from '@rango-dev/wallets-core/legacy';\nimport type {\n WalletInfo,\n WalletState,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport {\n EventSeverity,\n RouteEventType,\n StepEventType,\n StepExecutionBlockedEventStatus,\n StepExecutionEventStatus,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { legacyReadAccountAddress as readAccountAddress } from '@rango-dev/wallets-core/legacy';\nimport { useWallets, Events as WalletEvents } from '@rango-dev/wallets-react';\nimport { Networks, WalletTypes } from '@rango-dev/wallets-shared';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nimport {\n isOnDerivationPath,\n isOnNamespace,\n} from './components/StatefulConnectModal';\nimport { DerivationPath, Namespaces } from './components/WalletStatefulConnect';\nimport { WIDGET_UI_ID as UI_ID } from './constants';\nimport { SUPPORTED_FONTS } from './constants/fonts';\nimport { WidgetWallets } from './containers/Wallets';\nimport { Widget } from './containers/Widget';\nimport { useWidget } from './containers/WidgetInfo';\nimport { WidgetProvider } from './containers/WidgetProvider';\nimport { useStatefulConnect } from './hooks/useStatefulConnect';\nimport { useWalletList } from './hooks/useWalletList';\nimport { useWidgetEvents } from './hooks/useWidgetEvents';\nimport { widgetEventEmitter } from './services/eventEmitter';\nimport {\n WidgetEvents as MainEvents,\n QuoteEventTypes,\n UiEventTypes,\n WalletEventTypes,\n WidgetEvents,\n} from './types';\nimport { customizedThemeTokens } from './utils/ui';\n\nexport const StatefulConnect = {\n DerivationPath,\n Namespaces,\n isOnDerivationPath,\n isOnNamespace,\n};\n\nexport type {\n WidgetConfig,\n WalletType,\n WidgetTheme,\n WidgetColors,\n WidgetColorsKeys,\n ProviderInterface,\n BlockchainAndTokenConfig,\n WidgetProps,\n RouteEvent,\n RouteEventData,\n StepEvent,\n StepEventData,\n Route,\n Step,\n RouteStartedEvent,\n RouteSucceededEvent,\n RouteFailedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepFailedEvent,\n StepTxExecutionUpdatedEvent,\n StepTxExecutionBlockedEvent,\n StepCheckStatusEvent,\n StepApprovalTxSucceededEvent,\n StepOutputRevealedEvent,\n HandleWalletsUpdate,\n ConnectedWallet,\n Tokens,\n WidgetVariant,\n WalletEventData,\n QuoteEventData,\n UiEventData,\n WalletInfoWithExtra,\n};\nexport {\n Widget,\n /**\n * @deprecated Use `WidgetProvider` instead. This component will be removed in future versions.\n */\n WidgetWallets,\n WidgetProvider,\n useWidget,\n useWallets,\n useStatefulConnect,\n /**\n * @deprecated Use `widgetEventEmitter` instead. This hook will be removed in future versions.\n */\n useWidgetEvents,\n useWalletList,\n customizedThemeTokens,\n widgetEventEmitter,\n WidgetEvents,\n /**\n * @deprecated Use `WidgetEvents` instead. This enum will be removed in future versions.\n */\n MainEvents,\n QuoteEventTypes,\n WalletEventTypes,\n UiEventTypes,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n UI_ID,\n SUPPORTED_FONTS,\n};\n\n// Internal type exports for Rango\nexport type {\n WalletState,\n WalletInfo,\n PendingSwap,\n PendingSwapWithQueueID,\n PendingSwapStep,\n RouteExecutionEvents,\n};\n\n// Internal function and enum exports for Rango\nexport {\n readAccountAddress,\n Networks,\n WalletEvents,\n WalletTypes,\n PendingSwapNetworkStatus,\n EventSeverity,\n};\n", "import type { Result } from '../../hooks/useStatefulConnect';\nimport type { WalletInfoWithExtra } from '../../types';\nimport type { Namespace } from '@rango-dev/wallets-shared';\n\nimport { Divider } from '@rango-dev/ui';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport {\n ResultStatus,\n useStatefulConnect,\n} from '../../hooks/useStatefulConnect';\nimport { useWalletList } from '../../hooks/useWalletList';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport {\n ConnectStatus,\n DerivationPath,\n Namespaces,\n} from '../WalletStatefulConnect';\n\nimport { isOnDerivationPath, isOnNamespace, isOnStatus } from './helpers';\n\nconst KEEP_SUCCESS_MODAL_FOR = 3_000;\nconst DELAY_SHOWING_MODAL_FOR = 300;\n\ninterface PropTypes {\n wallet: WalletInfoWithExtra | undefined;\n onClose: () => void;\n // When `handleConnect` runs **successfully**, this will be called afterwards.\n onConnect?: (result: Result) => void;\n}\n\nexport function StatefulConnectModal(props: PropTypes) {\n const successModalTimerId = useRef<ReturnType<typeof setTimeout>>();\n const [isConnecting, setIsConnecting] = useState(false);\n const [error, setError] = useState<string>();\n const catchErrorOnHandle = (error: Error) => {\n setError(error.message);\n };\n const { terminateConnectingWallets } = useWalletList();\n\n const {\n handleConnect,\n handleDerivationPath,\n handleNamespace,\n getState,\n resetState,\n } = useStatefulConnect();\n\n const handleConfirmNamespaces = (selectedNamespaces: Namespace[]) => {\n handleNamespace(props.wallet!, selectedNamespaces).catch(\n catchErrorOnHandle\n );\n };\n\n const handleDerivationPathConfirm = (derivationPath: string) => {\n if (!derivationPath) {\n throw new Error(\n \"Derivation path is empty. Please make sure you've filled the field correctly.\"\n );\n }\n\n handleDerivationPath(derivationPath).catch(catchErrorOnHandle);\n };\n\n const handleClosingModal = () => {\n setIsConnecting(false);\n };\n\n const resetModalState = () => {\n setError(undefined);\n resetState();\n setIsConnecting(false);\n\n if (successModalTimerId.current) {\n clearTimeout(successModalTimerId.current);\n }\n };\n\n useEffect(() => {\n if (props.wallet) {\n resetModalState();\n let isConnected = false;\n /*\n * If connecting to wallet is happening quickly, we shouldn't show a modal.\n * by default we are assuming we can connect quickly, but if it passes an certain amount of time\n * We set his flag as false which means we a modal has been opened (showing a connection status or Namespace/Derivation path modal)\n */\n let isImmediatelyConnected = true;\n\n const beforeConnecting = () => {\n setTimeout(() => {\n isImmediatelyConnected = false;\n if (!isConnected) {\n setIsConnecting(true);\n }\n }, DELAY_SHOWING_MODAL_FOR);\n };\n\n const afterConnected = (result: Result) => {\n const resultIsConnected = result.status === ResultStatus.Connected;\n const resultIsDisconnected = [\n ResultStatus.Disconnected,\n ResultStatus.DisconnectedUnhandled,\n ].includes(result.status);\n const resultIsNeedMoreStepsToConnect = [\n ResultStatus.Namespace,\n ResultStatus.DerivationPath,\n ].includes(result.status);\n\n if (!resultIsNeedMoreStepsToConnect) {\n isConnected = true;\n }\n\n if (resultIsConnected && !isImmediatelyConnected) {\n successModalTimerId.current = setTimeout(\n handleClosingModal,\n KEEP_SUCCESS_MODAL_FOR\n );\n } else if (resultIsDisconnected) {\n handleClosingModal();\n }\n\n if (props.onConnect) {\n props.onConnect(result);\n }\n };\n\n beforeConnecting();\n handleConnect(props.wallet, {\n disconnectIfConnected: true,\n })\n .then(afterConnected)\n .catch(catchErrorOnHandle);\n }\n }, [props.wallet]);\n\n return (\n <WatermarkedModal\n open={isConnecting}\n onClose={handleClosingModal}\n onExit={() => {\n resetModalState();\n terminateConnectingWallets();\n if (props.onClose) {\n props.onClose();\n }\n }}\n container={getContainer()}>\n {isOnStatus(getState, props.wallet) && (\n <>\n <ConnectStatus\n wallet={{\n type: props.wallet.type,\n image: props.wallet.image,\n }}\n error={error}\n />\n <Divider direction=\"vertical\" size={32} />\n </>\n )}\n {isOnNamespace(getState) && (\n <Namespaces\n onConfirm={handleConfirmNamespaces}\n value={getState().namespace}\n />\n )}\n {isOnDerivationPath(getState) && (\n <DerivationPath\n onConfirm={handleDerivationPathConfirm}\n value={getState().derivationPath}\n />\n )}\n </WatermarkedModal>\n );\n}\n", "import type { HandleConnectOptions, Result } from './useStatefulConnect.types';\nimport type { WalletInfoWithExtra } from '../../types';\nimport type {\n Namespace,\n NamespaceData,\n WalletType,\n} from '@rango-dev/wallets-shared';\n\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { useReducer } from 'react';\n\nimport {\n isStateOnDerivationPathStep,\n isStateOnNamespace,\n} from './useStatefulConnect.helpers';\nimport { initState, reducer, type State } from './useStatefulConnect.state';\nimport { ResultStatus } from './useStatefulConnect.types';\n\ninterface UseStatefulConnect {\n handleConnect: (\n wallet: WalletInfoWithExtra,\n options?: HandleConnectOptions\n ) => Promise<Result>;\n handleNamespace: (\n wallet: WalletInfoWithExtra,\n selectedNamespaces: Namespace[]\n ) => Promise<Result>;\n handleDerivationPath: (path: string) => Promise<Result>;\n handleDisconnect: (type: WalletType) => Promise<Result>;\n getState(): State;\n resetState(section?: 'derivation'): void;\n}\n\n/**\n *\n * This hook maintains state of wallet and checks if additional information\n * is required to call the `connect` method of `core` package properly.\n *\n * The final goal is running `runConnect` which calls `wallets/core`'s `connect` method.\n * But sometimes it needs to get more information like what namespace it should be connected to,\n * or what derivation path should be used for.\n *\n */\nexport function useStatefulConnect(): UseStatefulConnect {\n const { state, disconnect, connect } = useWallets();\n\n const [connectState, dispatch] = useReducer(reducer, initState);\n\n const runConnect = async (\n type: WalletType,\n namespaces?: NamespaceData[],\n _options?: HandleConnectOptions\n ): Promise<{ status: ResultStatus }> => {\n /*\n * When running this function, it means all optional steps (like namespace and derivation path) has passed, or wallet doesn't need them at all.\n * By resetting state, we will make sure when user tries to connect other wallets, it doesn't have unexpected states.\n */\n dispatch({\n type: 'reset',\n });\n\n try {\n await connect(type, undefined, namespaces);\n\n return { status: ResultStatus.Connected };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n const message = e?.message\n ? `Error: ${e.message}`\n : 'An unknown error happened during connecting wallet.';\n\n throw new Error(message, { cause: e });\n }\n };\n\n const handleConnect = async (\n wallet: WalletInfoWithExtra,\n options?: HandleConnectOptions\n ): Promise<{\n status: ResultStatus;\n }> => {\n const isDisconnected = wallet.state === WalletState.DISCONNECTED;\n\n if (isDisconnected) {\n if (!wallet.namespaces) {\n return await runConnect(wallet.type, undefined, options);\n }\n\n const needsNamespace = wallet.namespaces.length > 1;\n const needsDerivationPath = wallet.needsDerivationPath;\n\n if (needsNamespace) {\n dispatch({\n type: 'needsNamespace',\n payload: {\n providerType: wallet.type,\n providerImage: wallet.image,\n availableNamespaces: wallet.namespaces,\n singleNamespace: wallet.singleNamespace,\n },\n });\n return { status: ResultStatus.Namespace };\n } else if (needsDerivationPath) {\n dispatch({\n type: 'needsDerivationPath',\n payload: {\n providerType: wallet.type,\n providerImage: wallet.image,\n namespace: wallet.namespaces[0],\n },\n });\n return { status: ResultStatus.DerivationPath };\n }\n\n return await runConnect(\n wallet.type,\n wallet.namespaces.map((namespace) => ({ namespace })),\n options\n );\n }\n\n if (options?.disconnectIfConnected) {\n await handleDisconnect(wallet.type);\n return { status: ResultStatus.Disconnected };\n }\n\n return { status: ResultStatus.DisconnectedUnhandled };\n };\n\n const handleNamespace = async (\n wallet: WalletInfoWithExtra,\n selectedNamespaces: Namespace[]\n ): Promise<Result> => {\n const isSingleNamespace = wallet.singleNamespace;\n const needsDerivationPath = wallet.needsDerivationPath;\n const firstSelectedNamespace = selectedNamespaces[0];\n\n if (!firstSelectedNamespace) {\n throw new Error(\n 'To confirm a namespace, you should select at least one namespace.'\n );\n }\n\n /*\n * Currently we support derivation path only for single namespace wallets.\n *\n * Basically Single namespace is a list with radio buttons to let the user select one value within the list.\n */\n if (isSingleNamespace && needsDerivationPath) {\n dispatch({\n type: 'needsDerivationPath',\n payload: {\n providerType: wallet.type,\n providerImage: wallet.image,\n namespace: firstSelectedNamespace,\n },\n });\n\n return { status: ResultStatus.DerivationPath };\n }\n\n /**\n * If execution reaches here, means we don't have any more optional step (like namespace and derivation)\n * So we should start connecting wallet.\n */\n\n if (!isStateOnNamespace(connectState)) {\n // Unreachable code.\n throw new Error(\n 'Something went wrong on handling namespace. Please retry.'\n );\n }\n\n const type = connectState.namespace.providerType;\n const namespaces = selectedNamespaces.map((namespace) => ({\n namespace,\n }));\n\n return await runConnect(type, namespaces);\n };\n\n const handleDerivationPath = async (\n derivationPath: string\n ): Promise<Result> => {\n if (!derivationPath) {\n throw new Error(\n \"Derivation path is empty. Please make sure you've filled the field correctly.\"\n );\n }\n\n if (!isStateOnDerivationPathStep(connectState)) {\n throw new Error(\n 'It seems you are filling derivation path without setting namespace before doing that. Please retry to connect.'\n );\n }\n const type = connectState.derivationPath.providerType;\n const selectedNamespace = connectState.derivationPath.namespace;\n const namespaces = [{ namespace: selectedNamespace, derivationPath }];\n\n return await runConnect(type, namespaces);\n };\n\n const handleDisconnect = async (type: WalletType): Promise<Result> => {\n const wallet = state(type);\n if (wallet.connected || wallet.connecting) {\n await disconnect(type);\n return { status: ResultStatus.Disconnected };\n }\n\n return { status: ResultStatus.Noop };\n };\n\n return {\n handleConnect,\n handleDisconnect,\n handleNamespace,\n handleDerivationPath,\n getState: () => connectState,\n resetState: (section?: 'derivation') => {\n if (section === 'derivation') {\n dispatch({\n type: 'resetDerivation',\n });\n } else {\n dispatch({\n type: 'reset',\n });\n }\n },\n };\n}\n", "import type { State } from './useStatefulConnect.state';\n\nexport function isStateOnDerivationPathStep(\n state: State\n): state is State & { derivationPath: NonNullable<State['derivationPath']> } {\n return !!state.derivationPath;\n}\n\nexport function isStateOnNamespace(\n state: State\n): state is State & { namespace: NonNullable<State['namespace']> } {\n return !!state.namespace;\n}\n", "import type {\n Actions,\n NeedsDerivationPathState,\n NeedsNamespacesState,\n} from './useStatefulConnect.types';\n\nexport interface State {\n status: 'init' | 'namespace' | 'derivationPath';\n namespace: NeedsNamespacesState | null;\n derivationPath: NeedsDerivationPathState | null;\n}\n\nexport const initState: State = {\n status: 'init',\n namespace: null,\n derivationPath: null,\n};\n\nexport function reducer(state: State, action: Actions): State {\n switch (action.type) {\n case 'needsNamespace':\n return {\n ...state,\n status: 'namespace',\n namespace: action.payload,\n derivationPath: null,\n };\n case 'needsDerivationPath':\n return {\n ...state,\n status: 'derivationPath',\n derivationPath: action.payload,\n };\n case 'reset':\n return initState;\n case 'resetDerivation':\n if (state.namespace) {\n return {\n ...state,\n derivationPath: null,\n status: 'namespace',\n };\n }\n return initState;\n default:\n throw new Error(`Action hasn't been defined.`);\n }\n}\n", "import type { WalletInfoWithExtra } from '../types';\nimport type { WalletInfo } from '@rango-dev/ui';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n detectMobileScreens,\n KEPLR_COMPATIBLE_WALLETS,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { useCallback, useEffect } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useWalletsStore } from '../store/wallets';\nimport { configWalletsToWalletName } from '../utils/providers';\nimport {\n hashWalletsState,\n isExperimentalChain,\n mapWalletTypesToWalletInfo,\n sortWalletsBasedOnConnectionState,\n} from '../utils/wallets';\n\nimport { useStatefulConnect } from './useStatefulConnect/useStatefulConnect';\n\nconst ALL_SUPPORTED_WALLETS = Object.values(WalletTypes);\n\ninterface Params {\n chain?: string;\n}\n\ninterface API {\n list: WalletInfoWithExtra[];\n terminateConnectingWallets: () => void;\n}\n\n/**\n *\n * Returning list of wallets which has a applied sorting and filtering (some of wallet can be excluded).\n * It can have some functionality on list itself,\n * now it only has a method to disconnect the wallets that has `connecting` status. This is useful for exiting page and terminating wallet connection.\n *\n */\nexport function useWalletList(params?: Params): API {\n const { chain } = params || {};\n const { config } = useAppStore();\n const { state, getWalletInfo } = useWallets();\n const { connectedWallets } = useWalletsStore();\n const blockchains = useAppStore().blockchains();\n const { handleDisconnect } = useStatefulConnect();\n\n /** It can be what has been set by widget config or as a fallback we use all the supported wallets by our library */\n const listAvailableWalletTypes =\n configWalletsToWalletName(config?.wallets, {\n trezorManifest: config?.trezorManifest,\n walletConnectProjectId: config?.walletConnectProjectId,\n walletConnectListedDesktopWalletLink:\n config.__UNSTABLE_OR_INTERNAL__?.walletConnectListedDesktopWalletLink,\n }) || ALL_SUPPORTED_WALLETS;\n\n let wallets = mapWalletTypesToWalletInfo(\n state,\n getWalletInfo,\n listAvailableWalletTypes,\n chain\n );\n\n wallets = detectMobileScreens()\n ? wallets.filter(\n (wallet) =>\n wallet.showOnMobile !== false && state(wallet.type).installed\n )\n : wallets;\n\n const sortedWallets = sortWalletsBasedOnConnectionState(wallets);\n\n const isExperimentalChainNotAdded = (walletType: string) =>\n !connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.chain === chain\n );\n\n const terminateConnectingWallets = useCallback(() => {\n const connectingWallets =\n wallets?.filter((wallet) => wallet.state === WalletState.CONNECTING) ||\n [];\n for (const wallet of connectingWallets) {\n void handleDisconnect(wallet.type);\n }\n }, [hashWalletsState(wallets)]);\n\n useEffect(() => {\n return () => {\n terminateConnectingWallets();\n };\n }, []);\n\n /*\n * Atm, we only support default injected wallet for the EVM\n * so we show default wallet when there is no other evm wallet installed\n * but we have ethereum injected\n */\n const shouldShowDefaultInjectedWallet = (wallets: WalletInfo[]) => {\n // don't show default injected wallet when it's not installed\n const defaultWallet = wallets.find(\n (wallet) => wallet.type === WalletTypes.DEFAULT\n );\n if (!defaultWallet || defaultWallet.state === WalletState.NOT_INSTALLED) {\n return false;\n }\n\n /*\n * if we have another evm wallet installed (except wallet connect),\n * there is no need to show default injected wallet anymore\n */\n const isEvmWalletInstalledExceptDefault = wallets.filter(\n (wallet) =>\n wallet.state != WalletState.NOT_INSTALLED &&\n ![\n WalletTypes.DEFAULT,\n WalletTypes.WALLET_CONNECT_2,\n WalletTypes.LEDGER,\n ].includes(wallet.type as WalletTypes) &&\n getWalletInfo(wallet.type).supportedChains.filter(\n (blockchain) => blockchain.type == 'EVM'\n ).length > 0\n );\n return isEvmWalletInstalledExceptDefault.length == 0;\n };\n\n const shouldExcludeWallet = (\n walletType: string,\n chain: string,\n blockchains: BlockchainMeta[]\n ) => {\n return (\n (isExperimentalChain(blockchains, chain) &&\n isExperimentalChainNotAdded(walletType) &&\n !KEPLR_COMPATIBLE_WALLETS.includes(walletType)) ||\n (walletType == WalletTypes.DEFAULT &&\n !shouldShowDefaultInjectedWallet(wallets))\n );\n };\n\n return {\n list: sortedWallets.filter(\n (wallet) => !shouldExcludeWallet(wallet.type, chain ?? '', blockchains)\n ),\n terminateConnectingWallets,\n };\n}\n", "import type { WidgetConfig } from '../types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { createContext, useContext, useEffect, useRef } from 'react';\n\nimport { createAppStore } from './app';\n\ntype AppStore = ReturnType<typeof createAppStore>;\ntype AppStoreProviderProps = PropsWithChildren<{ config?: WidgetConfig }>;\n\nexport const AppStoreContext = createContext<AppStore | null>(null);\n\nexport function useAppStore() {\n const store = useContext(AppStoreContext);\n\n useEffect(() => {\n if (store && !store.persist.hasHydrated()) {\n void store.persist.rehydrate();\n }\n }, []);\n\n if (!store) {\n throw new Error('Missing AppStoreContext.Provider in the tree');\n }\n\n return store();\n}\n\nexport function AppStoreProvider(props: AppStoreProviderProps) {\n const appStoreRef = useRef<AppStore>();\n\n if (!appStoreRef.current) {\n appStoreRef.current = createAppStore(props.config);\n }\n\n return (\n <AppStoreContext.Provider value={appStoreRef.current}>\n {props.children}\n </AppStoreContext.Provider>\n );\n}\n", "import type { ConfigSlice } from './slices/config';\nimport type { DataSlice } from './slices/data';\nimport type { SettingsSlice } from './slices/settings';\nimport type { WidgetConfig } from '../types';\nimport type { StateCreator } from 'zustand';\n\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\nimport { createConfigSlice } from './slices/config';\nimport { createDataSlice } from './slices/data';\nimport { createSettingsSlice } from './slices/settings';\n\nexport type StateCreatorWithInitialData<\n T extends Partial<WidgetConfig>,\n R extends Partial<AppStoreState>,\n V extends Partial<AppStoreState>\n> = (\n initialData: T | undefined,\n ...rest: Parameters<StateCreator<R, [], [], V>>\n) => ReturnType<StateCreator<R, [], [], V>>;\n\nexport type AppStoreState = DataSlice & ConfigSlice & SettingsSlice;\n\nexport function createAppStore(initialData?: WidgetConfig) {\n return create<AppStoreState>()(\n persist(\n (...a) => ({\n ...createDataSlice(...a),\n ...createSettingsSlice(...a),\n ...createConfigSlice(initialData, ...a),\n }),\n {\n name: 'user-settings',\n skipHydration: true,\n partialize: (state) => {\n return {\n _customTokens: state._customTokens,\n theme: state.theme,\n language: state.language,\n affiliatePercent: state.affiliatePercent,\n affiliateRef: state.affiliateRef,\n affiliateWallets: state.affiliateWallets,\n slippage: state.slippage,\n customSlippage: state.customSlippage,\n infiniteApprove: state.infiniteApprove,\n preferredBlockchains: state.preferredBlockchains,\n disabledLiquiditySources: state.disabledLiquiditySources,\n };\n },\n }\n )\n );\n}\n", "import type { Token } from 'rango-sdk';\n\ninterface CacheServiceInterface<V> {\n get<K extends keyof V>(key: K): V[K] | undefined;\n set<K extends keyof V>(key: K, value: V[K]): void;\n remove<K extends keyof V>(key: K): void;\n clear(): void;\n}\n\nclass CacheService<T> implements CacheServiceInterface<T> {\n #cache: Map<string, T[keyof T]> = new Map();\n\n get<K extends keyof T>(key: K): T[K] | undefined {\n return this.#cache.get(key as string) as T[K];\n }\n\n set<K extends keyof T>(key: K, value: T[K]): void {\n this.#cache.set(key as string, value);\n }\n\n remove<K extends keyof T>(key: K): void {\n this.#cache.delete(key as string);\n }\n\n clear(): void {\n this.#cache.clear();\n }\n}\n\nexport type CachedEntries = {\n supportedSourceTokens: Token[];\n supportedDestinationTokens: Token[];\n};\n\nexport const cacheService = new CacheService<CachedEntries>();\n", "import type { TokenHash } from '../types';\nimport type { Asset, BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\n\nexport function getBlockchainDisplayNameFor(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.displayName;\n}\nexport function getBlockchainShortNameFor(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.shortName;\n}\n\nexport function getBlockchainImage(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.logo;\n}\n\nexport function getSwapperDisplayName(\n swapperId: string,\n swappers: SwapperMeta[]\n) {\n return swappers.find((swapper) => swapper.id === swapperId)?.title;\n}\n\nexport function findBlockchain(name: string, blockchains: BlockchainMeta[]) {\n return blockchains.find((blockchain) => blockchain.name === name) ?? null;\n}\n\nexport function isTokenNative(\n token: Token,\n blockchain: BlockchainMeta | undefined\n) {\n if (!blockchain || !token) {\n return false;\n }\n\n for (const feeAsset of blockchain.feeAssets) {\n if (\n token?.blockchain === feeAsset?.blockchain &&\n token?.symbol === feeAsset?.symbol &&\n token?.address === feeAsset?.address\n ) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function createTokenHash(asset: Asset): TokenHash {\n return `${asset.blockchain.toLowerCase()}-${asset.symbol.toLowerCase()}-${(\n asset.address ?? ''\n ).toLowerCase()}`;\n}\n\nexport function isValidTokenAddress(\n chain: BlockchainMeta,\n address: string\n): boolean {\n const regex = chain.addressPatterns;\n const valid = regex.filter((r) => new RegExp(r).test(address)).length > 0;\n return valid;\n}\n", "import type {\n BlockchainAndTokenConfig,\n TokenHash,\n WidgetConfig,\n} from '../../types';\nimport type { DataSlice } from '../slices/data';\nimport type { Asset, Token } from 'rango-sdk';\n\nimport { createTokenHash } from '../../utils/meta';\n\n/**\n * This function retrieves tokens and blockchains from the widget configuration and combines them with token data from the meta response to determine which tokens should be displayed in the widget.\n * To optimize performance, the function minimizes unnecessary iterations over the meta tokens.\n * The result of this function should be cached and recalculated whenever the widget configuration changes.\n */\nexport function matchTokensFromConfigWithMeta(params: {\n type: 'source' | 'destination';\n config: {\n blockchains: BlockchainAndTokenConfig['blockchains'];\n tokens: BlockchainAndTokenConfig['tokens'];\n };\n meta: {\n tokensMapByTokenHash: DataSlice['_tokensMapByTokenHash'];\n tokensMapByBlockchainName: DataSlice['_tokensMapByBlockchainName'];\n };\n}): Token[] {\n const { config, meta } = params;\n const result: Record<TokenHash, Token> = {};\n const configTokens = config.tokens;\n\n // Helper function to add tokens to result\n const addTokens = (tokens: (Asset | TokenHash)[]) => {\n tokens.forEach((item) => {\n if (typeof item !== 'string') {\n item = createTokenHash(item);\n }\n const tokenFromMeta = meta.tokensMapByTokenHash.get(item);\n if (tokenFromMeta) {\n result[item] = tokenFromMeta;\n }\n });\n };\n\n /**\n * We support two types of configurations for passing tokens in the widget config.\n * We check the type of configuration and calculate the result based on that.\n */\n if (Array.isArray(configTokens)) {\n /**\n * If \"config.tokens\" is an array,\n * we iterate through it and include any token that exists in the meta data in the result.\n */\n if (configTokens.length > 0) {\n addTokens(configTokens);\n return Object.values(result);\n }\n return Array.from(meta.tokensMapByTokenHash.values());\n }\n\n /**\n * From this point onward,\n * the function handles the other type of widget configuration.\n */\n if (!configTokens) {\n return Array.from(meta.tokensMapByTokenHash.values());\n }\n\n let configBlockchains: string[];\n\n if (config.blockchains?.length) {\n configBlockchains = config.blockchains;\n } else {\n /**\n * If config.blockchains does not exist,\n * we include all tokens from every blockchain in the meta data that are not specified in the tokens from the config.\n */\n configBlockchains = Object.keys(configTokens);\n const configBlockchainsSet = new Set(configBlockchains);\n\n Object.keys(meta.tokensMapByBlockchainName).forEach((blockchain) => {\n if (!configBlockchainsSet.has(blockchain)) {\n addTokens(meta.tokensMapByBlockchainName[blockchain]);\n }\n });\n }\n //We iterate over each blockchain and retrieve the related tokens for each one from the configuration.\n configBlockchains.forEach((blockchain) => {\n const targetTokensForBlockchain = configTokens[blockchain];\n /**\n * If no tokens exist for a blockchain,\n * we include all tokens for that blockchain from the meta response.\n */\n if (\n !targetTokensForBlockchain &&\n meta.tokensMapByBlockchainName?.[blockchain]\n ) {\n addTokens(meta.tokensMapByBlockchainName[blockchain]);\n return;\n }\n\n if (targetTokensForBlockchain) {\n if (targetTokensForBlockchain.isExcluded) {\n /**\n * If tokens are excluded,\n * we first include all tokens from the meta for that blockchain,\n * then remove the excluded tokens from the result.\n */\n addTokens(meta.tokensMapByBlockchainName[blockchain]);\n targetTokensForBlockchain.tokens.forEach((token) => {\n const tokenHash = createTokenHash(token);\n delete result[tokenHash];\n });\n } else {\n //We retrieve the corresponding token from the meta and include it in the result.\n addTokens(targetTokensForBlockchain.tokens);\n }\n }\n });\n\n return Object.values(result);\n}\n\nexport function getSupportedBlockchainsFromConfig(params: {\n config: WidgetConfig;\n}): string[] {\n const { config } = params;\n const configFromBlockchains = config.from?.blockchains || [];\n const configToBlockchains = config.to?.blockchains || [];\n\n /*\n * Empty array means all blockchains. So if any of to or from has an empty array,\n * it means all blockchains is available to use and there is no limitation from config.\n */\n if (!configFromBlockchains.length || !configToBlockchains.length) {\n return [];\n }\n const blockchains = [...configFromBlockchains, ...configToBlockchains];\n\n const supportedBlockchains = new Set(blockchains);\n\n return Array.from(supportedBlockchains);\n}\n", "import type { DataSlice } from './data';\nimport type { SettingsSlice } from './settings';\nimport type { WidgetConfig } from '../../types';\nimport type { StateCreatorWithInitialData } from '../app';\n\nimport { cacheService } from '../../services/cacheService';\nimport { matchTokensFromConfigWithMeta } from '../utils';\n\nexport const DEFAULT_CONFIG: WidgetConfig = {\n apiKey: '',\n title: undefined,\n multiWallets: true,\n excludeLiquiditySources: true,\n customDestination: true,\n variant: 'default',\n trezorManifest: {\n appUrl: 'https://widget.rango.exchange/',\n email: 'hi+trezorwidget@rango.exchange',\n },\n};\n\ninterface IframeConfigs {\n clientUrl?: string;\n}\n\ninterface CampaignMode {\n liquiditySources?: string[];\n}\n\nconst DEFAULT_IFRAME_CONFIGS: IframeConfigs = {\n clientUrl: undefined,\n};\n\nconst DEFAULT_CAMPAIGN_MODE: CampaignMode = {\n liquiditySources: undefined,\n};\n\nexport interface ConfigSlice {\n // What user can set directly.\n config: WidgetConfig;\n campaignMode: CampaignMode;\n isInCampaignMode: () => boolean;\n getLiquiditySources: () => string[];\n getDisabledLiquiditySources: () => string[];\n excludeLiquiditySources: () => boolean;\n updateConfig: (config: WidgetConfig) => void;\n updateCampaignMode: <K extends keyof CampaignMode>(\n name: K,\n value: CampaignMode[K]\n ) => void;\n // What we are setting based on environments.\n iframe: { clientUrl?: string };\n updateIframe: <K extends keyof IframeConfigs>(\n name: K,\n value: IframeConfigs[K]\n ) => void;\n}\n\nexport const createConfigSlice: StateCreatorWithInitialData<\n WidgetConfig,\n ConfigSlice & SettingsSlice & DataSlice,\n ConfigSlice\n> = (initialData, set, get) => {\n return {\n config: { ...DEFAULT_CONFIG, ...initialData },\n iframe: DEFAULT_IFRAME_CONFIGS,\n campaignMode: DEFAULT_CAMPAIGN_MODE,\n getLiquiditySources: () => {\n const { config, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? campaignMode.liquiditySources\n : config.liquiditySources ?? [];\n },\n getDisabledLiquiditySources: () => {\n const { disabledLiquiditySources, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? []\n : disabledLiquiditySources;\n },\n excludeLiquiditySources: () => {\n const { config, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? false\n : !!config.excludeLiquiditySources;\n },\n isInCampaignMode: () => {\n const { campaignMode } = get();\n return !!campaignMode.liquiditySources?.length;\n },\n\n // Actions\n updateConfig: (nextConfig: WidgetConfig) => {\n const currentConfig = get().config;\n const {\n _tokensMapByTokenHash: tokensMapByTokenHash,\n _tokensMapByBlockchainName: tokensMapByBlockchainName,\n } = get();\n\n const supportedSourceTokens = matchTokensFromConfigWithMeta({\n type: 'source',\n config: {\n blockchains: nextConfig.from?.blockchains,\n tokens: nextConfig.from?.tokens,\n },\n meta: {\n tokensMapByBlockchainName,\n tokensMapByTokenHash,\n },\n });\n\n const supportedDestinationTokens = matchTokensFromConfigWithMeta({\n type: 'destination',\n config: {\n blockchains: nextConfig.to?.blockchains,\n tokens: nextConfig.to?.tokens,\n },\n meta: {\n tokensMapByBlockchainName,\n tokensMapByTokenHash,\n },\n });\n\n cacheService.set('supportedSourceTokens', supportedSourceTokens);\n cacheService.set(\n 'supportedDestinationTokens',\n supportedDestinationTokens\n );\n\n set({\n config: {\n ...currentConfig,\n ...nextConfig,\n },\n });\n },\n\n updateCampaignMode: (name, value) => {\n const currentCampaignMode = get().campaignMode;\n\n set({\n campaignMode: {\n ...currentCampaignMode,\n [name]: value,\n },\n });\n },\n\n updateIframe: (name, value) => {\n const currentIframeConfig = get().iframe;\n\n set({\n iframe: {\n ...currentIframeConfig,\n [name]: value,\n },\n });\n },\n };\n};\n", "import { TransactionType } from 'rango-types';\n\nexport const ACTIVE_BLOCKCHAINS_FOR_CUSTOM_TOKENS: string[] = [\n TransactionType.EVM,\n TransactionType.SOLANA,\n];\n", "import { RangoClient } from 'rango-sdk';\n\nimport { getConfig } from '../utils/configs';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) {\n return rango;\n }\n rango = new RangoClient(getConfig('API_KEY'), getConfig('BASE_URL'));\n return rango;\n};\n", "import { UI_ID } from '@rango-dev/ui';\n\nexport const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\nexport const DEFAULT_BASE_URL = 'https://api.rango.exchange';\nexport const SCANNER_BASE_URL = 'https://explorer.rango.exchange';\n\nexport const WIDGET_UI_ID = {\n SWAP_BOX_ID: 'rango-swap-box',\n EXPANDED_BOX_ID: 'rango-expanded-box',\n ...UI_ID,\n};\n", "import type { FindToken } from '../store/slices/data';\nimport type { ConnectedWallet, TokenBalance } from '../store/wallets';\nimport type {\n Balance,\n SelectedQuote,\n TokensBalance,\n Wallet,\n WalletInfoWithExtra,\n} from '../types';\nimport type { WalletInfo as ModalWalletInfo } from '@rango-dev/ui';\nimport type {\n Network,\n WalletInfo,\n WalletState,\n WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport type {\n BlockchainMeta,\n Token,\n TransactionType,\n WalletDetail,\n} from 'rango-sdk';\n\nimport {\n BlockchainCategories,\n WalletState as WalletStatus,\n} from '@rango-dev/ui';\nimport { legacyReadAccountAddress as readAccountAddress } from '@rango-dev/wallets-core/legacy';\nimport {\n detectInstallLink,\n getCosmosExperimentalChainInfo,\n isEvmAddress,\n KEPLR_COMPATIBLE_WALLETS,\n Networks,\n} from '@rango-dev/wallets-shared';\nimport BigNumber from 'bignumber.js';\nimport { isCosmosBlockchain } from 'rango-types';\n\nimport { ZERO } from '../constants/numbers';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../constants/routing';\nimport { EXCLUDED_WALLETS } from '../constants/wallets';\n\nimport { isBlockchainTypeInCategory, removeDuplicateFrom } from './common';\nimport { createTokenHash } from './meta';\nimport { numberToString } from './numbers';\n\nexport function mapStatusToWalletState(state: WalletState): WalletStatus {\n switch (true) {\n case state.connected:\n return WalletStatus.CONNECTED;\n case state.connecting:\n return WalletStatus.CONNECTING;\n case !state.installed:\n return WalletStatus.NOT_INSTALLED;\n default:\n return WalletStatus.DISCONNECTED;\n }\n}\n\nexport function mapWalletTypesToWalletInfo(\n getState: (type: WalletType) => WalletState,\n getWalletInfo: (type: WalletType) => WalletInfo,\n list: WalletType[],\n chain?: string\n): WalletInfoWithExtra[] {\n return list\n .filter((wallet) => !EXCLUDED_WALLETS.includes(wallet as WalletTypes))\n .filter((wallet) => {\n const { supportedChains, isContractWallet } = getWalletInfo(wallet);\n\n const { installed, network } = getState(wallet);\n const filterContractWallets =\n isContractWallet && (!installed || (!!chain && network !== chain));\n if (filterContractWallets) {\n return false;\n }\n if (chain) {\n return !!supportedChains.find(\n (supportedChain) => supportedChain.name === chain\n );\n }\n return true;\n })\n .map((type) => {\n const {\n name,\n img: image,\n installLink,\n showOnMobile,\n namespaces,\n singleNamespace,\n supportedChains,\n needsDerivationPath,\n } = getWalletInfo(type);\n const blockchainTypes = removeDuplicateFrom(\n supportedChains.map((item) => item.type)\n );\n\n const state = mapStatusToWalletState(getState(type));\n return {\n title: name,\n image,\n link: detectInstallLink(installLink),\n state,\n type,\n showOnMobile,\n namespaces,\n singleNamespace,\n blockchainTypes,\n needsDerivationPath,\n };\n });\n}\n\nexport function walletAndSupportedChainsNames(\n supportedBlockchains: BlockchainMeta[]\n): Network[] | null {\n if (!supportedBlockchains) {\n return null;\n }\n let walletAndSupportedChainsNames: Network[] = [];\n walletAndSupportedChainsNames = supportedBlockchains.map(\n (blockchainMeta) => blockchainMeta.name\n );\n\n return walletAndSupportedChainsNames;\n}\n\nexport function prepareAccountsForWalletStore(\n wallet: WalletType,\n accounts: string[],\n evmBasedChains: string[],\n supportedChainNames: Network[] | null,\n isContractWallet: boolean\n): Wallet[] {\n const result: Wallet[] = [];\n\n function addAccount(network: Network, address: string) {\n const accountForChainAlreadyExists = !!result.find(\n (account) => account.chain === network\n );\n if (!accountForChainAlreadyExists) {\n const newAccount: Wallet = {\n address,\n chain: network,\n walletType: wallet,\n };\n\n result.push(newAccount);\n }\n }\n\n const supportedBlockchains = supportedChainNames || [];\n\n accounts.forEach((account) => {\n const { address, network } = readAccountAddress(account);\n\n const hasLimitation = supportedBlockchains.length > 0;\n const isSupported = supportedBlockchains.includes(network);\n const isUnknown = network === Networks.Unknown;\n const notSupportedNetworkByWallet =\n hasLimitation && !isSupported && !isUnknown;\n\n /*\n * Here we check given `network` is not supported by wallet\n * And also the network is known.\n */\n if (notSupportedNetworkByWallet) {\n return;\n }\n\n /*\n * In some cases we can handle unknown network by checking its address\n * pattern and act on it.\n * Example: showing our evm compatible network when the unknown network is evm.\n * Otherwise, we stop executing this function.\n */\n const isUnknownAndEvmBased =\n network === Networks.Unknown && isEvmAddress(address);\n if (isUnknown && !isUnknownAndEvmBased) {\n return;\n }\n\n const isEvmBasedChain = evmBasedChains.includes(network);\n\n // If it's an evm network, we will add the address to all the evm chains.\n if (isEvmBasedChain || isUnknownAndEvmBased) {\n if (isContractWallet) {\n /*\n * for contract wallets like Safe wallet, we should add only account for the\n * current connected blockchain not all of the supported blockchains\n */\n addAccount(network, address.toLowerCase());\n } else {\n /*\n * all evm chains are not supported in wallets, so we are adding\n * only to those that are supported by wallet.\n */\n const evmChainsSupportedByWallet = supportedBlockchains.filter(\n (chain) => evmBasedChains.includes(chain)\n );\n\n evmChainsSupportedByWallet.forEach((network) => {\n /*\n * EVM addresses are not case sensitive.\n * Some wallets like Binance-chain return some letters in uppercase which produces bugs in our wallet state.\n */\n addAccount(network, address.toLowerCase());\n });\n }\n } else {\n addAccount(network, address);\n }\n });\n\n return result;\n}\n\nexport function getQuoteWallets(params: {\n filter: 'all' | 'required';\n quote: SelectedQuote | null;\n}): string[] {\n const { filter, quote } = params;\n const wallets = new Set<string>();\n\n quote?.swaps.forEach((swap, swapIndex) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n wallets.add(currentStepFromBlockchain);\n\n // Check if internalSwaps array exists\n if (swap.internalSwaps) {\n const { internalSwaps } = swap;\n internalSwaps.forEach((internalSwap, internalSwapIndex) => {\n const internalStepFromBlockchain = internalSwap.from.blockchain;\n const internalStepToBlockchain = internalSwap.to.blockchain;\n const isLastStep = swapIndex === quote.swaps.length - 1;\n const isLastInternalStep =\n internalSwapIndex === internalSwaps.length - 1;\n\n if (\n (!isLastStep && !isLastInternalStep) ||\n (isLastStep &&\n currentStepToBlockchain !== internalStepFromBlockchain) ||\n filter === 'all'\n ) {\n wallets.add(internalStepFromBlockchain);\n }\n if (filter === 'all') {\n wallets.add(internalStepToBlockchain);\n }\n });\n }\n\n if (filter === 'all') {\n wallets.add(currentStepToBlockchain);\n }\n });\n return Array.from(wallets);\n}\n\ntype Blockchain = { name: string; accounts: ConnectedWallet[] };\n\nexport function isAccountAndWalletMatched(\n account: Wallet,\n connectedWallet: ConnectedWallet\n) {\n return (\n account.address === connectedWallet.address &&\n account.chain === connectedWallet.chain &&\n account.walletType === connectedWallet.walletType\n );\n}\n\nexport function makeBalanceFor(\n retrievedBalance: WalletDetail,\n findToken: FindToken\n): TokenBalance[] {\n const { blockChain: chain, balances = [] } = retrievedBalance;\n return (\n balances?.map((tokenBalance) => ({\n chain,\n symbol: tokenBalance.asset.symbol,\n ticker: tokenBalance.asset.symbol,\n address: tokenBalance.asset.address || null,\n rawAmount: tokenBalance.amount.amount,\n decimal: tokenBalance.amount.decimals,\n amount: new BigNumber(tokenBalance.amount.amount)\n .shiftedBy(-tokenBalance.amount.decimals)\n .toFixed(),\n logo: '',\n usdPrice: findToken(tokenBalance.asset)?.usdPrice || null,\n })) || []\n );\n}\n\nexport function resetConnectedWalletState(\n connectedWallet: ConnectedWallet\n): ConnectedWallet {\n return { ...connectedWallet, loading: false, error: true };\n}\n\nexport const calculateWalletUsdValue = (connectedWallet: ConnectedWallet[]) => {\n const uniqueAccountAddresses = new Set<string | null>();\n const uniqueBalance: ConnectedWallet[] = connectedWallet?.reduce(\n (acc: ConnectedWallet[], current: ConnectedWallet) => {\n return acc.findIndex(\n (i) => i.address === current.address && i.chain === current.chain\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n ) === -1\n ? [...acc, current]\n : acc;\n },\n []\n );\n\n const modifiedWalletBlockchains = uniqueBalance?.map((chain) => {\n const modifiedWalletBlockchain: Blockchain = {\n name: chain.chain,\n accounts: [],\n };\n if (!uniqueAccountAddresses.has(chain.address)) {\n uniqueAccountAddresses.add(chain.address);\n }\n uniqueAccountAddresses.forEach((accountAddress) => {\n if (chain.address === accountAddress) {\n modifiedWalletBlockchain.accounts.push(chain);\n }\n });\n return modifiedWalletBlockchain;\n });\n const total = numberToString(\n modifiedWalletBlockchains\n ?.flatMap((b) => b.accounts)\n ?.flatMap((a) => a?.balances)\n ?.map((b) =>\n new BigNumber(b?.amount || ZERO).multipliedBy(b?.usdPrice || 0)\n )\n ?.reduce((a, b) => a.plus(b), ZERO) || ZERO\n ).toString();\n\n return numberWithThousandSeparator(total);\n};\n\nfunction numberWithThousandSeparator(number: string | number): string {\n const parts = number.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return parts.join('.');\n}\n\nexport const isExperimentalChain = (\n blockchains: BlockchainMeta[],\n wallet: string\n): boolean => {\n const cosmosExperimentalChainInfo = getCosmosExperimentalChainInfo(\n Object.entries(blockchains)\n .map(([, blockchainMeta]) => blockchainMeta)\n .filter(isCosmosBlockchain)\n );\n return (\n cosmosExperimentalChainInfo &&\n cosmosExperimentalChainInfo[wallet]?.experimental\n );\n};\n\nexport const getKeplrCompatibleConnectedWallets = (\n selectableWallets: Wallet[]\n): WalletType[] => {\n const connectedWalletTypes = new Set(\n selectableWallets.map((wallet) => {\n return wallet.walletType;\n })\n );\n\n return KEPLR_COMPATIBLE_WALLETS.filter((compatibleWallet) =>\n connectedWalletTypes.has(compatibleWallet)\n );\n};\n\nexport function formatBalance(balance: Balance | null): Balance | null {\n const formattedBalance: Balance | null = balance\n ? {\n ...balance,\n amount: numberToString(\n balance.amount,\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n ),\n usdValue: numberToString(\n balance.usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n }\n : null;\n\n return formattedBalance;\n}\n\nexport function compareTokenBalance(\n token1Balance: Balance | null,\n token2Balance: Balance | null\n): number {\n if (token1Balance?.usdValue || token2Balance?.usdValue) {\n return (\n parseFloat(token2Balance?.usdValue || '0') -\n parseFloat(token1Balance?.usdValue || '0')\n );\n }\n\n if (token1Balance?.amount || token2Balance?.amount) {\n return (\n parseFloat(token2Balance?.amount || '0') -\n parseFloat(token1Balance?.amount || '0')\n );\n }\n\n return 0;\n}\n\nexport function areTokensEqual(\n tokenA: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null,\n tokenB: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null\n) {\n return (\n tokenA?.blockchain === tokenB?.blockchain &&\n tokenA?.symbol.toLowerCase() === tokenB?.symbol.toLowerCase() &&\n tokenA?.address?.toLowerCase() === tokenB?.address?.toLowerCase()\n );\n}\n\nexport function sortWalletsBasedOnConnectionState(\n wallets: WalletInfoWithExtra[]\n): WalletInfoWithExtra[] {\n return wallets.sort(\n (a, b) =>\n Number(b.state === WalletStatus.CONNECTED) -\n Number(a.state === WalletStatus.CONNECTED) ||\n Number(\n b.state === WalletStatus.DISCONNECTED ||\n b.state === WalletStatus.CONNECTING\n ) -\n Number(\n a.state === WalletStatus.DISCONNECTED ||\n a.state === WalletStatus.CONNECTING\n )\n );\n}\n\nexport function getConciseAddress(\n address: string,\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n maxChars = 8,\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n ellipsisLength = 3\n): string {\n if (address.length < 2 * maxChars + ellipsisLength) {\n return address;\n }\n const start = address.slice(0, maxChars);\n const end = address.slice(-maxChars);\n return `${start}${'.'.repeat(ellipsisLength)}${end}`;\n}\n\nexport function getAddress({\n chain,\n connectedWallets,\n walletType,\n}: {\n connectedWallets: ConnectedWallet[];\n walletType: string;\n chain: string;\n}): string | undefined {\n return connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.chain === chain\n )?.address;\n}\n\nexport function makeTokensBalance(connectedWallets: ConnectedWallet[]) {\n return connectedWallets\n .flatMap((wallet) => wallet.balances)\n .reduce((balances: TokensBalance, balance) => {\n const currentBalance = {\n amount: balance?.amount ?? '',\n decimals: balance?.decimal ?? 0,\n usdValue: balance?.usdPrice\n ? new BigNumber(balance?.usdPrice ?? ZERO)\n .multipliedBy(balance?.amount)\n .toString()\n : '',\n };\n\n const tokenHash = balance\n ? createTokenHash({\n symbol: balance.symbol,\n blockchain: balance.chain,\n address: balance.address,\n })\n : null;\n\n const prevBalance = tokenHash ? balances[tokenHash] : null;\n\n const shouldUpdateBalance =\n tokenHash &&\n (!prevBalance ||\n (prevBalance && prevBalance.amount < currentBalance.amount));\n\n if (shouldUpdateBalance) {\n balances[tokenHash] = currentBalance;\n }\n\n return balances;\n }, {});\n}\n\nexport const isFetchingBalance = (\n connectedWallets: ConnectedWallet[],\n blockchain: string\n) =>\n !!connectedWallets.find(\n (wallet) => wallet.chain === blockchain && wallet.loading\n );\n\nexport function hashWalletsState(walletsInfo: ModalWalletInfo[]) {\n return walletsInfo.map((w) => w.state).join('-');\n}\n\nexport function filterBlockchainsByWalletTypes(\n wallets: ModalWalletInfo[],\n blockchains: BlockchainMeta[]\n) {\n const uniqueBlockchainTypes = new Set<TransactionType>();\n wallets.forEach((wallet) => {\n wallet.blockchainTypes.forEach((type) => {\n uniqueBlockchainTypes.add(type);\n });\n });\n const filteredBlockchains = blockchains.filter((blockchain) =>\n uniqueBlockchainTypes.has(blockchain.type)\n );\n\n return filteredBlockchains;\n}\n\nexport function filterWalletsByCategory(\n wallets: WalletInfoWithExtra[],\n category: string\n) {\n if (category === BlockchainCategories.ALL) {\n return wallets;\n }\n\n return wallets.filter((wallet) => {\n for (const type of wallet.blockchainTypes) {\n if (isBlockchainTypeInCategory(type, category)) {\n return true;\n }\n }\n return false;\n });\n}\n", "import BigNumber from 'bignumber.js';\n\nexport const ZERO = new BigNumber(0);\n", "import { WalletTypes } from '@rango-dev/wallets-shared';\n\nexport const EXCLUDED_WALLETS = [WalletTypes.LEAP];\n", "import type { WalletInfoWithExtra } from '../types';\nimport type { Token } from 'rango-sdk';\n\nimport { BlockchainCategories, WalletState } from '@rango-dev/ui';\nimport { TransactionType } from 'rango-sdk';\n\nimport { WIDGET_UI_ID } from '../constants';\nimport { SUPPORTED_FONTS } from '../constants/fonts';\nimport {\n MIN_LENGTH_SYMBOL_CONTAINS,\n MIN_LENGTH_SYMBOL_START_WITH,\n MIN_LENGTH_TOKEN_ADDRESS_CONTAINS,\n MIN_LENGTH_TOKEN_NAME_CONTAINS,\n MIN_LENGTH_TOKEN_NAME_EXACT_MATCH,\n} from '../constants/searchFor';\n\nexport function removeDuplicateFrom<T>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function areEqual(\n array1: (number | string)[],\n array2: (number | string)[]\n) {\n return (\n array1.length === array2.length && array1.every((v, i) => v === array2[i])\n );\n}\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function debounce(fn: Function, time: number) {\n let timeoutId: ReturnType<typeof setTimeout> | null;\n return wrapper;\n function wrapper(...args: any) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n timeoutId = null;\n fn(...args);\n }, time);\n }\n}\n\nexport function containsText(text: string, searchText: string): boolean {\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n return text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n}\n\nexport function exactText(text: string, searchText: string): boolean {\n return text.toLowerCase() === searchText.toLowerCase();\n}\n\nexport function startWithText(text: string, searchText: string): boolean {\n return text.toLowerCase().startsWith(searchText.toLowerCase());\n}\n\nexport const getContainer = () =>\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) as HTMLElement;\n\nexport const getExpanded = () =>\n document.getElementById(WIDGET_UI_ID.EXPANDED_BOX_ID) as HTMLElement;\n\nfunction compareExactMatchText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const exactMatchA = !!textA && exactText(textA, searchFor);\n const exactMatchB = !!textB && exactText(textB, searchFor);\n if (exactMatchA !== exactMatchB) {\n return exactMatchA ? -1 : 1;\n }\n\n return 0;\n}\n\nfunction compareContainsText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const textContainsA = !!textA && containsText(textA, searchFor);\n const textContainsB = !!textB && containsText(textB, searchFor);\n if (textContainsA !== textContainsB) {\n return textContainsA ? -1 : 1;\n }\n\n // If both texts contains the searched term, The shorter one has priority\n if (textContainsA && textContainsB && textA?.length !== textB?.length) {\n return textA?.length - textB?.length;\n }\n\n return 0;\n}\n\nfunction compareStartWithText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const textStartWithA = !!textA && startWithText(textA, searchFor);\n const textStartWithB = !!textB && startWithText(textB, searchFor);\n if (textStartWithA !== textStartWithB) {\n return textStartWithA ? -1 : 1;\n }\n\n // If both texts start with the searched term, The shorter one has priority\n if (textStartWithA && textStartWithB && textA?.length !== textB?.length) {\n return textA?.length - textB?.length;\n }\n\n return 0;\n}\n\nexport function compareWithSearchFor(\n tokenA: Token,\n tokenB: Token,\n searchFor?: string\n): number {\n if (!searchFor) {\n return 0;\n }\n\n // 1: Check the order to exact match the symbol\n const symbolExactMatchCompare = compareExactMatchText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n if (symbolExactMatchCompare) {\n return symbolExactMatchCompare;\n }\n\n // 2: Check the order to exact match the token name\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_EXACT_MATCH) {\n const tokenNameExactMatchCompare = compareExactMatchText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n if (tokenNameExactMatchCompare) {\n return tokenNameExactMatchCompare;\n }\n }\n\n // 3: Check symbol start with searchFor\n if (searchFor.length >= MIN_LENGTH_SYMBOL_START_WITH) {\n const symbolStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n\n if (symbolStartWithCompare) {\n return symbolStartWithCompare;\n }\n }\n\n // 4: Check symbol Contains searchFor\n if (searchFor.length >= MIN_LENGTH_SYMBOL_CONTAINS) {\n const symbolContainsCompare = compareContainsText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n\n if (symbolContainsCompare) {\n return symbolContainsCompare;\n }\n }\n\n // 5: Check token name start with searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_CONTAINS) {\n const tokenNameStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n\n if (tokenNameStartWithCompare) {\n return tokenNameStartWithCompare;\n }\n }\n\n // 6: Check token name Contains searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_CONTAINS) {\n const tokenNameContainsCompare = compareContainsText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n\n if (tokenNameContainsCompare !== 0) {\n return tokenNameContainsCompare;\n }\n }\n\n // 7: Check address start with searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_ADDRESS_CONTAINS) {\n const addressStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.address,\n tokenB.address\n );\n\n if (addressStartWithCompare) {\n return addressStartWithCompare;\n }\n }\n\n // 8: Check address Contains searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_ADDRESS_CONTAINS) {\n const addressContainCompare = compareContainsText(\n searchFor,\n tokenA.address,\n tokenB.address\n );\n\n if (addressContainCompare !== 0) {\n return addressContainCompare;\n }\n }\n\n return 0;\n}\n\nexport const isBlockchainTypeInCategory = (\n blockchainType: TransactionType,\n category: string\n): boolean => {\n switch (category) {\n case BlockchainCategories.ALL:\n return true;\n case BlockchainCategories.UTXO:\n return blockchainType === TransactionType.TRANSFER;\n case BlockchainCategories.OTHER:\n return (\n blockchainType !== TransactionType.TRANSFER &&\n blockchainType !== TransactionType.COSMOS &&\n blockchainType !== TransactionType.EVM\n );\n default:\n return blockchainType === category;\n }\n};\n\nexport const getFontUrlByName = (fontName: string) => {\n const font = SUPPORTED_FONTS.find((font) => font.value === fontName);\n return font?.url;\n};\n\nexport function isSingleWalletActive(\n wallets: WalletInfoWithExtra[],\n multiWallets?: boolean\n) {\n const atLeastOneWalletIsConnected = !!wallets.find(\n (w) => w.state === WalletState.CONNECTED\n );\n return multiWallets === false && atLeastOneWalletIsConnected;\n}\n", "export const DEFAULT_FONT_FAMILY = 'Roboto';\n\nexport const SUPPORTED_FONTS = [\n {\n name: 'Roboto',\n value: 'Roboto',\n url: '',\n },\n {\n name: 'Times New Roman',\n value: 'Times New Roman',\n url: 'https://fonts.cdnfonts.com/css/times-new-roman',\n },\n {\n name: 'Arial',\n value: 'Arial',\n url: '',\n },\n {\n name: 'Open Sans',\n value: 'Open Sans',\n url: 'https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap',\n },\n {\n name: 'Noto Sans',\n value: 'Noto Sans',\n url: 'https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap',\n },\n {\n name: 'Montserrat',\n value: 'Montserrat',\n url: 'https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap',\n },\n {\n name: 'Poppins',\n value: 'Poppins',\n url: 'https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap',\n },\n {\n name: 'Roboto Condensed',\n value: 'Roboto Condensed',\n url: 'https://fonts.googleapis.com/css2?family=Roboto+Condensed:ital,wght@0,100..900;1,100..900&display=swap',\n },\n\n {\n name: 'Roboto Mono',\n value: 'Roboto Mono',\n url: 'https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap',\n },\n {\n name: 'Oswald',\n value: 'Oswald',\n url: 'https://fonts.googleapis.com/css2?family=Oswald:wght@200..700&display=swap',\n },\n {\n name: 'Raleway',\n value: 'Raleway',\n url: 'https://fonts.googleapis.com/css2?family=Raleway:ital,wght@0,100..900;1,100..900&display=swap',\n },\n {\n name: 'Sedan',\n value: 'Sedan',\n url: 'https://fonts.googleapis.com/css2?family=Sedan:ital@0;1&display=swap',\n },\n {\n name: 'Inter',\n value: 'Inter',\n url: 'https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap',\n },\n {\n name: 'Rubik',\n value: 'Rubik',\n url: 'https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,300..900;1,300..900&display=swap',\n },\n {\n name: 'Lora',\n value: 'Lora',\n url: 'https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400..700;1,400..700&display=swap',\n },\n {\n name: 'Barlow Condensed',\n value: 'Barlow Condensed',\n url: 'https://fonts.googleapis.com/css2?family=Barlow+Condensed:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap',\n },\n];\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n\nimport type { BestRouteResponse } from 'rango-sdk';\n\nimport { BigNumber } from 'bignumber.js';\n\n/*\n * if time > 1h -> rounded with 5 minutes precision\n * if time < 1h -> rounded with 15 seconds precision\n */\nexport const roundedSecondsToString = (s: number): string => {\n const seconds = Math.floor((s % 60) / 15) * 15;\n const minutes = parseInt((s / 60).toString());\n if (minutes >= 60) {\n return `${Math.floor(minutes / 5) * 5}:00`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds\n .toString()\n .padStart(2, '0')}`;\n};\n\nexport const numberToString = (\n number: BigNumber | string | number | null | undefined,\n minDecimals: number | null = null,\n maxDecimals: number | null = null\n): string => {\n if (number === null || number === undefined) {\n return '';\n }\n if (number === '') {\n return '';\n }\n const n = new BigNumber(number);\n const roundingMode = 1;\n let maxI = 1000;\n for (let i = 0; i < 60; i++) {\n if (new BigNumber(n.toFixed(i, roundingMode)).eq(n)) {\n maxI = i;\n break;\n }\n }\n\n if (n.gte(10000)) {\n return n.toFormat(0, roundingMode);\n }\n if (n.gte(1000)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n }\n if (n.gte(100)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n }\n if (n.gte(1)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 2))\n ),\n roundingMode\n );\n }\n if (n.gte(0.01)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 4))\n ),\n roundingMode\n );\n }\n for (let i = minDecimals || 4; i < 17; i++) {\n if (n.gte(Math.pow(10, -i))) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, i))\n ),\n roundingMode\n );\n }\n }\n if (n.isEqualTo(0)) {\n return '0';\n }\n\n return n.toFormat(\n Math.min(maxI, Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 8))),\n roundingMode\n );\n};\n\nexport const uint8ArrayToHex = (buffer: Uint8Array): string => {\n // buffer is an ArrayBuffer\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return [...buffer].map((x) => x.toString(16).padStart(2, '0')).join('');\n};\n\nexport const totalArrivalTime = (\n data: { estimatedTimeInSeconds: number | null }[] | undefined\n) => data?.reduce((a, b) => a + (b.estimatedTimeInSeconds ?? 0), 0) || 0;\n\nexport const rawFees = (data: BestRouteResponse): string =>\n (\n data?.result?.swaps?.flatMap((s) =>\n s.fee.map((f) => ({ swapperId: s.swapperId, fee: f }))\n ) || []\n )\n .reduce((partialSum, a) => partialSum + parseFloat(a.fee.amount), 0)\n .toFixed(3);\n\nexport const containsText = (text: string, searchText: string) =>\n text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n\nexport const isPositiveNumber = (text?: string) =>\n !!text && parseFloat(text) > 0;\n", "import type { Tokens, WidgetVariant } from '../types';\nimport type { Asset, BlockchainMeta, Token } from 'rango-sdk';\n\nimport { RANGO_PUBLIC_API_KEY } from '../constants';\n\nimport { areTokensEqual } from './wallets';\n\nexport interface Configs {\n API_KEY: string;\n BASE_URL?: string;\n}\n\ntype TokensConfig =\n | Asset[]\n | {\n [blockchain: string]: Tokens;\n };\n\nlet configs: Configs = {\n API_KEY: RANGO_PUBLIC_API_KEY,\n};\n\nexport function getConfig(name: keyof Configs) {\n return configs[name] || '';\n}\n\nexport function setConfig(name: keyof Configs, value: any) {\n configs[name] = value;\n\n return value;\n}\n\n/**\n * Getting new configs from params and reset the value of global `configs` with provided param.\n */\nexport function initConfig(nextConfigs: Configs) {\n let clonedConfigs;\n if (typeof structuredClone === 'function') {\n clonedConfigs = structuredClone(nextConfigs);\n } else {\n clonedConfigs = JSON.parse(JSON.stringify(nextConfigs));\n }\n configs = clonedConfigs;\n return configs;\n}\n\nexport const DEFAULT_PRIMARY_RADIUS = 20;\nexport const DEFAULT_SECONDARY_RADIUS = 25;\n\nexport const THEME_CLASS_NAME_PREFIX = `theme-widget`;\n\nexport const isTokenExcludedInConfig = (\n token: Token | null,\n tokensConfig?: TokensConfig\n) => {\n let result = false;\n if (tokensConfig && token) {\n if (Array.isArray(tokensConfig)) {\n result = !tokensConfig.some((asset) => areTokensEqual(asset, token));\n } else if (!Array.isArray(tokensConfig) && tokensConfig[token.blockchain]) {\n result = tokensConfig[token.blockchain].tokens.some((asset) =>\n areTokensEqual(asset, token)\n );\n const isExcluded = tokensConfig[token.blockchain].isExcluded;\n return (!isExcluded && !result) || (isExcluded && result);\n }\n }\n return result;\n};\n\nexport const isBlockchainExcludedInConfig = (\n blockchain: BlockchainMeta | null,\n blockchainsConfig?: string[]\n) => {\n return (\n blockchain &&\n blockchainsConfig &&\n !blockchainsConfig.includes(blockchain.name)\n );\n};\n\nexport const isVariantExpandable = (\n isLargeScreen: boolean,\n isExtraLargeScreen: boolean,\n variant?: WidgetVariant\n) => {\n return (\n (variant === 'expanded' && (isLargeScreen || isExtraLargeScreen)) ||\n (variant === 'full-expanded' && isExtraLargeScreen)\n );\n};\n", "import type { Features } from '../types';\nimport type { SwapperMeta, SwapperType, Token } from 'rango-sdk';\n\nimport { removeDuplicateFrom } from './common';\n\nexport type UniqueSwappersGroupType = {\n id: string;\n groupTitle: string;\n logo: string;\n type: SwapperType;\n selected: boolean;\n};\n\nexport function getUniqueSwappersGroups(\n swappers: SwapperMeta[],\n disabledLiquiditySources: string[]\n): UniqueSwappersGroupType[] {\n const supportedSwappers = swappers.map((swapper) => swapper.swapperGroup);\n\n const uniqueSupportedSwappersGroups: Array<UniqueSwappersGroupType> = [];\n\n const uniqueGroup = removeDuplicateFrom(swappers.map((s) => s.swapperGroup));\n\n uniqueGroup.map((uniqueGroupItem) => {\n const swapperItem = swappers.find(\n (swapper) => swapper.swapperGroup === uniqueGroupItem\n );\n\n if (swapperItem) {\n let isSupportedSwapper = true;\n if (supportedSwappers) {\n isSupportedSwapper = supportedSwappers.some(\n (supportedItem) => supportedItem === swapperItem.swapperGroup\n );\n }\n\n if (isSupportedSwapper) {\n swapperItem.types.map((swapperTypeItem) => {\n uniqueSupportedSwappersGroups.push({\n id: swapperItem.swapperGroup,\n groupTitle: swapperItem.swapperGroup,\n logo: swapperItem.logo,\n type: swapperTypeItem,\n selected: !disabledLiquiditySources.includes(\n swapperItem.swapperGroup\n ),\n });\n });\n }\n }\n });\n\n return uniqueSupportedSwappersGroups;\n}\n\nexport function sortLiquiditySourcesByGroupTitle(\n a: SwapperMeta,\n b: SwapperMeta\n) {\n if (a.swapperGroup < b.swapperGroup) {\n return -1;\n }\n\n if (a.swapperGroup > b.swapperGroup) {\n return 1;\n }\n\n return 0;\n}\n\nexport function isFeatureHidden(feature: keyof Features, features?: Features) {\n return features?.[feature] === 'hidden';\n}\n\nexport function isFeatureEnabled(feature: keyof Features, features?: Features) {\n return features?.[feature] === 'enabled';\n}\n\nexport const addCustomTokensToSupportedTokens = (\n supportedTokens: Token[],\n customTokens: Token[],\n features?: Features\n) => {\n const isCustomTokensHidden = isFeatureHidden('customTokens', features);\n\n return isCustomTokensHidden\n ? supportedTokens\n : supportedTokens.concat(customTokens);\n};\n", "// We keep all the received data from server in this slice\n\nimport type { ConfigSlice } from './config';\nimport type { SettingsSlice } from './settings';\nimport type { CachedEntries } from '../../services/cacheService';\nimport type { Balance, Blockchain, TokenHash } from '../../types';\nimport type { StateCreator } from 'zustand';\n\nimport {\n type Asset,\n type BlockchainMeta,\n type SwapperMeta,\n type Token,\n} from 'rango-sdk';\n\nimport { ACTIVE_BLOCKCHAINS_FOR_CUSTOM_TOKENS } from '../../constants/customTokens';\nimport { cacheService } from '../../services/cacheService';\nimport { httpService as sdk } from '../../services/httpService';\nimport { compareWithSearchFor, containsText } from '../../utils/common';\nimport { createTokenHash, isTokenNative } from '../../utils/meta';\nimport {\n addCustomTokensToSupportedTokens,\n sortLiquiditySourcesByGroupTitle,\n} from '../../utils/settings';\nimport { areTokensEqual, compareTokenBalance } from '../../utils/wallets';\nimport {\n getSupportedBlockchainsFromConfig,\n matchTokensFromConfigWithMeta,\n} from '../utils';\n\ntype BlockchainOptions = {\n type?: 'source' | 'destination' | 'custom-token';\n};\n\ntype TokenOptions = {\n type: 'source' | 'destination';\n // filter by an specific blockchain\n blockchain?: string;\n searchFor?: string;\n getBalanceFor?: (token: Token) => Balance | null;\n};\n\nexport type FindToken = (asset: Asset) => Token | undefined;\n\nexport type FetchStatus = 'loading' | 'success' | 'failed';\nexport interface DataSlice {\n _blockchainsMapByName: Map<string, BlockchainMeta>;\n _tokensMapByTokenHash: Map<TokenHash, Token>;\n _tokensMapByBlockchainName: Record<Blockchain, TokenHash[]>;\n _popularTokens: Token[];\n _swappers: SwapperMeta[];\n fetchStatus: FetchStatus;\n blockchains: (options?: BlockchainOptions) => BlockchainMeta[];\n tokens: (options?: TokenOptions) => Token[];\n swappers: () => SwapperMeta[];\n isTokenPinned: (token: Token, type: 'source' | 'destination') => boolean;\n findToken: FindToken;\n fetch: () => Promise<void>;\n}\n\nexport const createDataSlice: StateCreator<\n DataSlice & ConfigSlice & SettingsSlice,\n [],\n [],\n DataSlice\n> = (set, get) => ({\n // State\n _blockchainsMapByName: new Map(),\n _tokensMapByTokenHash: new Map(),\n _tokensMapByBlockchainName: {},\n _popularTokens: [],\n _swappers: [],\n fetchStatus: 'loading',\n // Selectors\n blockchains: (options) => {\n const blockchainsMapByName = get()._blockchainsMapByName;\n const blockchainsFromState = Array.from(\n blockchainsMapByName?.values() || []\n );\n\n if (!options || !options?.type) {\n return blockchainsFromState;\n }\n const config = get().config;\n\n if (options.type === 'custom-token') {\n const supportedBlockchainsFromConfig = getSupportedBlockchainsFromConfig({\n config,\n });\n\n let supportedBlockchains: BlockchainMeta[] = blockchainsFromState;\n\n /*\n * Supported blockchains can be configured and be limited.\n * In this case, we only keep those active blockchains which exist in config.\n */\n if (supportedBlockchainsFromConfig.length > 0) {\n supportedBlockchains = supportedBlockchains.filter((blockchain) =>\n supportedBlockchainsFromConfig.includes(blockchain.name)\n );\n }\n\n return supportedBlockchains.filter((blockchain) =>\n ACTIVE_BLOCKCHAINS_FOR_CUSTOM_TOKENS.includes(blockchain.type)\n );\n }\n\n const supportedBlockchainsFromConfig =\n (options.type === 'source'\n ? config.from?.blockchains\n : config.to?.blockchains) ?? [];\n\n const list = blockchainsFromState.filter((blockchain) => {\n if (\n supportedBlockchainsFromConfig.length > 0 &&\n !supportedBlockchainsFromConfig.includes(blockchain.name)\n ) {\n return false;\n }\n\n return true;\n });\n\n return list;\n },\n tokens: (options) => {\n const {\n _tokensMapByTokenHash,\n _tokensMapByBlockchainName,\n config,\n _customTokens,\n } = get();\n const tokensFromState = Array.from(_tokensMapByTokenHash.values());\n const blockchainsMapByName = get()._blockchainsMapByName;\n if (!options || !options.type) {\n return tokensFromState;\n }\n\n const configType = options.type === 'source' ? 'from' : 'to';\n const cacheKey: keyof CachedEntries =\n options.type === 'source'\n ? 'supportedSourceTokens'\n : 'supportedDestinationTokens';\n\n let supportedTokens = cacheService.get(cacheKey);\n if (!supportedTokens?.length) {\n supportedTokens = matchTokensFromConfigWithMeta({\n type: options.type,\n config: {\n blockchains: config[configType]?.blockchains,\n tokens: config[configType]?.tokens,\n },\n meta: {\n tokensMapByTokenHash: _tokensMapByTokenHash,\n tokensMapByBlockchainName: _tokensMapByBlockchainName,\n },\n });\n cacheService.set(cacheKey, supportedTokens);\n }\n\n supportedTokens = addCustomTokensToSupportedTokens(\n supportedTokens,\n _customTokens,\n config.features\n );\n\n const blockchains = get().blockchains({\n type: options.type,\n });\n\n const list = supportedTokens\n .filter((token) => {\n // If a specific blockchain has passed, we only keep that blockchain's tokens.\n if (!!options.blockchain && token.blockchain !== options.blockchain) {\n return false;\n }\n\n // Check only available blockchains\n if (\n !blockchains.some((blockchain) => {\n return blockchain.name === token.blockchain;\n })\n ) {\n return false;\n }\n\n // Search functionality\n if (options.searchFor) {\n if (\n containsText(token.symbol, options.searchFor) ||\n containsText(token.address || '', options.searchFor) ||\n containsText(token.name || '', options.searchFor)\n ) {\n return true;\n }\n\n return false;\n }\n\n return true;\n })\n .sort((tokenA, tokenB) => {\n //1. sort by pinned tokens\n const isToken1Pinned = get().isTokenPinned(tokenA, options.type);\n const isToken2Pinned = get().isTokenPinned(tokenB, options.type);\n if (isToken1Pinned !== isToken2Pinned) {\n return isToken1Pinned ? -1 : 1;\n }\n\n //2. sort by balance\n if (options.getBalanceFor) {\n const token1Balance = options.getBalanceFor(tokenA);\n const token2Balance = options.getBalanceFor(tokenB);\n const balanceCompare = compareTokenBalance(\n token1Balance,\n token2Balance\n );\n if (balanceCompare !== 0) {\n return balanceCompare;\n }\n }\n\n const blockChainA = blockchainsMapByName.get(tokenA.blockchain);\n const blockChainB = blockchainsMapByName.get(tokenB.blockchain);\n\n //3. sort by native token\n const isNativeTokenA = isTokenNative(tokenA, blockChainA);\n const isNativeTokenB = isTokenNative(tokenB, blockChainB);\n if (isNativeTokenA !== isNativeTokenB) {\n return isNativeTokenA ? -1 : 1;\n }\n\n //4. sort by token popularity\n if (tokenA.isPopular !== tokenB.isPopular) {\n return tokenA.isPopular ? -1 : 1;\n }\n\n //5. sort by search phrase\n if (options.searchFor) {\n const symbolSearchForCompare = compareWithSearchFor(\n tokenA,\n tokenB,\n options.searchFor\n );\n if (symbolSearchForCompare) {\n return symbolSearchForCompare;\n }\n }\n\n //6. sort by token isSecondary\n if (tokenA.isSecondaryCoin !== tokenB.isSecondaryCoin) {\n return tokenA.isSecondaryCoin ? 1 : -1;\n }\n\n //7. sort by blockchain order\n if (!!blockChainA && !!blockChainB) {\n return blockChainA.sort - blockChainB.sort;\n }\n\n return 0;\n });\n\n return list;\n },\n findToken: (asset) => {\n const tokensMapByHashToken = get()._tokensMapByTokenHash;\n const customTokens = get().customTokens();\n const tokenHash = createTokenHash(asset);\n let token = tokensMapByHashToken.get(tokenHash);\n if (!token) {\n token = customTokens.find(\n (customToken) => createTokenHash(customToken) === tokenHash\n );\n }\n return token;\n },\n isTokenPinned: (token, type) => {\n const pinnedTokens =\n type === 'source'\n ? get().config.from?.pinnedTokens\n : get().config.to?.pinnedTokens;\n const pinned = !!pinnedTokens?.some((pinnedToken) =>\n areTokensEqual(pinnedToken, token)\n );\n return pinned;\n },\n swappers: () => {\n const { config, campaignMode } = get();\n\n const campaignModeLiquiditySource = campaignMode.liquiditySources?.length\n ? campaignMode.liquiditySources\n : null;\n\n const liquiditySources =\n campaignModeLiquiditySource ?? config.liquiditySources;\n\n const excludeLiquiditySources = campaignModeLiquiditySource\n ? false\n : config.excludeLiquiditySources;\n\n /*\n * If the excludeLiquiditySources flag is set to true, we return all swappers that are not included in the config.\n * Otherwise, we return all swappers that are included in the config.\n */\n const swappers = get()._swappers.filter((swapper) => {\n const swapperGroupIncludedInLiquiditySources = liquiditySources?.includes(\n swapper.swapperGroup\n );\n\n const shouldExcludeLiquiditySources =\n excludeLiquiditySources ||\n !liquiditySources ||\n liquiditySources.length === 0;\n\n return shouldExcludeLiquiditySources\n ? !swapperGroupIncludedInLiquiditySources\n : swapperGroupIncludedInLiquiditySources;\n });\n\n const sortedSwappers = swappers.sort(sortLiquiditySourcesByGroupTitle);\n\n return sortedSwappers;\n },\n // Actions\n fetch: async () => {\n try {\n const { enableCentralizedSwappers } = get().config;\n const response = await sdk().getAllMetadata({\n enableCentralizedSwappers,\n });\n set({ fetchStatus: 'success' });\n const blockchainsMapByName: Map<string, BlockchainMeta> = new Map<\n string,\n BlockchainMeta\n >();\n\n const tokensMapByTokenHash: Map<TokenHash, Token> = new Map<\n TokenHash,\n Token\n >();\n const tokensMapByBlockchainName: DataSlice['_tokensMapByBlockchainName'] =\n {};\n const tokens: Token[] = [];\n const popularTokens: Token[] = response.popularTokens;\n const swappers: SwapperMeta[] = response.swappers;\n\n const blockchainsWithAtLeastOneToken = new Set();\n\n response.tokens.forEach((token) => {\n blockchainsWithAtLeastOneToken.add(token.blockchain);\n\n tokens.push(token);\n });\n\n const sortedBlockchain = response.blockchains.sort(\n (a, b) => a.sort - b.sort\n );\n\n sortedBlockchain.forEach((blockchain) => {\n if (\n blockchain.enabled &&\n blockchainsWithAtLeastOneToken.has(blockchain.name)\n ) {\n blockchainsMapByName.set(blockchain.name, blockchain);\n }\n });\n\n tokens.forEach((token) => {\n const tokenHash = createTokenHash(token);\n if (!tokensMapByBlockchainName[token.blockchain]) {\n tokensMapByBlockchainName[token.blockchain] = [];\n }\n tokensMapByTokenHash.set(tokenHash, token);\n tokensMapByBlockchainName[token.blockchain].push(tokenHash);\n });\n\n set({\n _blockchainsMapByName: blockchainsMapByName,\n _tokensMapByTokenHash: tokensMapByTokenHash,\n _tokensMapByBlockchainName: tokensMapByBlockchainName,\n _popularTokens: popularTokens,\n _swappers: swappers,\n });\n } catch (error) {\n set({ fetchStatus: 'failed' });\n throw error;\n }\n },\n});\n", "import type { FlagPropTypes, Language } from '@rango-dev/ui';\n\nimport {\n Chinese,\n English,\n Finland,\n French,\n German,\n Greece,\n Italian,\n Japanese,\n Netherlands,\n Poland,\n Portuguese,\n Russian,\n Spanish,\n Swedish,\n Ukrainian,\n} from '@rango-dev/ui';\n\nexport type LanguageItem = {\n title: string;\n label: string;\n local: Language;\n SVGFlag: React.ComponentType<FlagPropTypes>;\n};\n\nexport const LANGUAGES: LanguageItem[] = [\n { title: 'English', label: 'English', local: 'en', SVGFlag: English },\n { title: 'Spanish', label: 'Espa\u00F1ol', local: 'es', SVGFlag: Spanish },\n { title: 'French', label: 'Fran\u00E7ais', local: 'fr', SVGFlag: French },\n { title: 'Japanese', label: '\u65E5\u672C\u8A9E', local: 'ja', SVGFlag: Japanese },\n { title: 'Portuguese', label: 'Portugu\u00EAs', local: 'pt', SVGFlag: Portuguese },\n { title: 'Chinese', label: '\u4E2D\u56FD\u4EBA', local: 'zh', SVGFlag: Chinese },\n { title: 'Russian', label: '\u0420\u0443\u0441\u0441\u043A\u0438\u0439', local: 'ru', SVGFlag: Russian },\n { title: 'German', label: 'Deutsch', local: 'de', SVGFlag: German },\n { title: 'Ukrainian', label: '\u0423\u043A\u0440\u0430\u0457\u043D\u0456', local: 'uk', SVGFlag: Ukrainian },\n { title: 'Swedish', label: 'svenska', local: 'sv', SVGFlag: Swedish },\n { title: 'Finnish', label: 'Suomalainen', local: 'fi', SVGFlag: Finland },\n { title: 'Dutch', label: 'Nederlands', local: 'nl', SVGFlag: Netherlands },\n { title: 'Greek', label: 'Grieks', local: 'el', SVGFlag: Greece },\n { title: 'Italian', label: 'Italiana', local: 'it', SVGFlag: Italian },\n { title: 'Polish', label: 'Polski', local: 'pl', SVGFlag: Poland },\n];\n\nexport const DEFAULT_LANGUAGE = 'en';\n", "const LOW = 0.5;\nconst MEDIUM = 1;\nconst HIGH = 3;\n\nexport const SLIPPAGES = [LOW, MEDIUM, HIGH];\n\nexport const DEFAULT_SLIPPAGE = 1;\n\nexport const HIGH_SLIPPAGE = 5;\n\nexport const MAX_SLIPPAGE = 100;\n\nexport const MIN_SLIPPGAE = 0;\n", "import type { ConfigSlice } from './config';\nimport type { DataSlice } from './data';\nimport type { WidgetConfig } from '../../types';\nimport type { SwapperMeta, Token } from 'rango-sdk';\nimport type { StateCreator } from 'zustand';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { BLOCKCHAIN_LIST_SIZE } from '../../constants/configs';\nimport { DEFAULT_LANGUAGE } from '../../constants/languages';\nimport { DEFAULT_SLIPPAGE } from '../../constants/swapSettings';\nimport { removeDuplicateFrom } from '../../utils/common';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { getSupportedBlockchainsFromConfig } from '../utils';\n\nexport type ThemeMode = 'auto' | 'dark' | 'light';\n\nexport interface SettingsSlice {\n theme: ThemeMode;\n language: Language | null;\n disabledLiquiditySources: string[];\n /** Keeping a history of blockchains that user has selected (in Swap process) */\n preferredBlockchains: string[];\n slippage: number;\n customSlippage: number | null;\n infiniteApprove: boolean;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n _customTokens: Token[];\n\n setSlippage: (slippage: number) => void;\n setCustomSlippage: (customSlippage: number | null) => void;\n toggleInfiniteApprove: () => void;\n toggleLiquiditySource: (name: string) => void;\n setTheme: (theme: ThemeMode) => void;\n setLanguage: (language: Language | null) => void;\n toggleAllLiquiditySources: (\n swappers: SwapperMeta[],\n shouldReset?: boolean\n ) => void;\n setAffiliateRef: (affiliateRef: string | null) => void;\n setAffiliatePercent: (affiliatePercent: number | null) => void;\n setAffiliateWallets: (\n affiliateWallets: { [key: string]: string } | null\n ) => void;\n addPreferredBlockchain: (blockchain: string) => void;\n updateSettings: (config: WidgetConfig) => void;\n setCustomToken: (token: Token) => void;\n deleteCustomToken: (token: Token) => void;\n customTokens: () => Token[];\n}\n\nexport const createSettingsSlice: StateCreator<\n SettingsSlice & DataSlice & ConfigSlice,\n [],\n [],\n SettingsSlice\n> = (set, get) => ({\n disabledLiquiditySources: [],\n theme: 'auto',\n language: null,\n preferredBlockchains: [],\n slippage: DEFAULT_SLIPPAGE,\n customSlippage: null,\n infiniteApprove: false,\n affiliateRef: null,\n affiliatePercent: null,\n affiliateWallets: null,\n _customTokens: [],\n\n addPreferredBlockchain: (blockchain) => {\n const currentPreferredBlockchains = get().preferredBlockchains;\n\n const noNeedToDoAnything = currentPreferredBlockchains.find(\n (preferredBlockchain, index) => {\n const isSameBlockchain = preferredBlockchain === blockchain;\n const isInVisibleList = index <= BLOCKCHAIN_LIST_SIZE - 1;\n\n return isSameBlockchain && isInVisibleList;\n }\n );\n\n if (noNeedToDoAnything) {\n return;\n }\n\n const nextPreferredBlockchains: string[] =\n currentPreferredBlockchains.filter((preferredBlockchain) => {\n const isSameBlockchain = preferredBlockchain === blockchain;\n\n return !isSameBlockchain;\n });\n\n set(() => ({\n preferredBlockchains: [blockchain, ...nextPreferredBlockchains],\n }));\n },\n setSlippage: (slippage) =>\n set(() => ({\n slippage: slippage,\n })),\n\n setCustomSlippage: (customSlippage) =>\n set(() => ({\n customSlippage: customSlippage,\n })),\n setAffiliateRef: (affiliateRef) =>\n set(() => ({\n affiliateRef,\n })),\n setAffiliatePercent: (affiliatePercent) =>\n set(() => ({\n affiliatePercent,\n })),\n\n setAffiliateWallets: (affiliateWallets) =>\n set(() => ({\n affiliateWallets,\n })),\n toggleAllLiquiditySources: (swappers, shouldReset) =>\n set((state) => {\n if (shouldReset) {\n return { disabledLiquiditySources: [] };\n }\n const swappersGroup = removeDuplicateFrom(\n swappers.map((swapper) => swapper.swapperGroup)\n );\n\n if (swappersGroup.length === state.disabledLiquiditySources.length) {\n return { disabledLiquiditySources: [] };\n }\n\n return {\n disabledLiquiditySources: swappersGroup,\n };\n }),\n toggleInfiniteApprove: () =>\n set((state) => ({\n infiniteApprove: !state.infiniteApprove,\n })),\n\n toggleLiquiditySource: (name) =>\n set((state) => {\n if (state.disabledLiquiditySources.includes(name)) {\n return {\n disabledLiquiditySources: state.disabledLiquiditySources.filter(\n (liquiditySource) => liquiditySource != name\n ),\n };\n }\n return {\n disabledLiquiditySources: state.disabledLiquiditySources.concat(name),\n };\n }),\n setTheme: (theme) =>\n set(() => ({\n theme,\n })),\n setLanguage: (language) =>\n set(() => ({\n language,\n })),\n updateSettings: (nextConfig: WidgetConfig) => {\n const { features, theme } = nextConfig;\n\n const isThemeHidden = isFeatureHidden('theme', features);\n const isLanguageHidden = isFeatureHidden('language', features);\n const isLiquidityHidden = isFeatureHidden('liquiditySource', features);\n const singleTheme = theme?.singleTheme;\n const autoUpdateSettings =\n nextConfig?.__UNSTABLE_OR_INTERNAL__?.autoUpdateSettings;\n\n set({\n ...(isThemeHidden && { theme: nextConfig.theme?.mode || 'auto' }),\n ...(singleTheme && { theme: nextConfig.theme?.mode || 'light' }),\n ...(isLanguageHidden && {\n language: nextConfig.language || DEFAULT_LANGUAGE,\n }),\n ...(isLiquidityHidden && {\n disabledLiquiditySources: nextConfig.liquiditySources || [],\n }),\n ...(autoUpdateSettings && {\n // For the time being, we have added the language; if more are needed later, we can add other parameters.\n language: nextConfig.language || DEFAULT_LANGUAGE,\n }),\n });\n },\n setCustomToken: (token) =>\n set((state) => ({\n _customTokens: [token, ...state._customTokens],\n })),\n deleteCustomToken: (token) =>\n set((state) => ({\n _customTokens: state._customTokens.filter(\n (customToken) => customToken.address !== token.address\n ),\n })),\n customTokens: () => {\n const config = get().config;\n\n const customTokens = get()._customTokens;\n const supportedBlockchainsFromConfig = getSupportedBlockchainsFromConfig({\n config,\n });\n\n return !supportedBlockchainsFromConfig.length\n ? customTokens\n : customTokens.filter((token) =>\n supportedBlockchainsFromConfig.includes(token.blockchain)\n );\n },\n});\n", "import type { FindToken } from './slices/data';\nimport type { Balance, TokensBalance, Wallet } from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type { Token } from 'rango-sdk';\n\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport { eventEmitter } from '../services/eventEmitter';\nimport { httpService } from '../services/httpService';\nimport { WalletEventTypes, WidgetEvents } from '../types';\nimport { createTokenHash } from '../utils/meta';\nimport {\n isAccountAndWalletMatched,\n makeBalanceFor,\n makeTokensBalance,\n resetConnectedWalletState,\n} from '../utils/wallets';\n\nimport createSelectors from './selectors';\n\nexport type TokenBalance = {\n chain: string;\n symbol: string;\n ticker: string;\n address: string | null;\n rawAmount: string;\n decimal: number | null;\n amount: string;\n logo: string | null;\n usdPrice: number | null;\n};\n\nexport interface ConnectedWallet extends Wallet {\n balances: TokenBalance[] | null;\n explorerUrl: string | null;\n selected: boolean;\n loading: boolean;\n error: boolean;\n}\ninterface WalletsStore {\n connectedWallets: ConnectedWallet[];\n balances: TokensBalance;\n loading: boolean;\n connectWallet: (accounts: Wallet[], findToken: FindToken) => void;\n disconnectWallet: (walletType: WalletType) => void;\n selectWallets: (wallets: { walletType: string; chain: string }[]) => void;\n clearConnectedWallet: () => void;\n getWalletsDetails: (\n accounts: Wallet[],\n findToken: FindToken,\n shouldRetry?: boolean\n ) => void;\n getBalanceFor: (token: Token) => Balance | null;\n}\n\nexport const useWalletsStore = createSelectors(\n create<WalletsStore>()(\n subscribeWithSelector((set, get) => {\n return {\n connectedWallets: [],\n balances: {},\n loading: false,\n connectWallet: (accounts, findToken) => {\n eventEmitter.emit(WidgetEvents.WalletEvent, {\n type: WalletEventTypes.CONNECT,\n payload: { walletType: accounts[0].walletType, accounts },\n });\n\n const getWalletsDetails = get().getWalletsDetails;\n set((state) => ({\n loading: true,\n connectedWallets: state.connectedWallets\n .filter((wallet) => wallet.walletType !== accounts[0].walletType)\n .concat(\n accounts.map((account) => {\n const shouldMarkWalletAsSelected =\n !state.connectedWallets.some(\n (connectedWallet) =>\n connectedWallet.chain === account.chain &&\n connectedWallet.selected &&\n /**\n * Sometimes, the connect function can be called multiple times for a particular wallet type when using the auto-connect feature.\n * This check is there to make sure the chosen wallet doesn't end up unselected.\n */\n connectedWallet.walletType !== account.walletType\n );\n return {\n balances: [],\n address: account.address,\n chain: account.chain,\n explorerUrl: null,\n walletType: account.walletType,\n selected: shouldMarkWalletAsSelected,\n loading: true,\n error: false,\n };\n })\n ),\n }));\n getWalletsDetails(accounts, findToken);\n },\n disconnectWallet: (walletType) => {\n set((state) => {\n if (\n state.connectedWallets.find(\n (wallet) => wallet.walletType === walletType\n )\n ) {\n eventEmitter.emit(WidgetEvents.WalletEvent, {\n type: WalletEventTypes.DISCONNECT,\n payload: { walletType },\n });\n }\n\n const selectedWallets = state.connectedWallets\n .filter(\n (connectedWallet) =>\n connectedWallet.selected &&\n connectedWallet.walletType !== walletType\n )\n .map((selectedWallet) => selectedWallet.chain);\n\n const connectedWallets = state.connectedWallets\n .filter(\n (connectedWallet) => connectedWallet.walletType !== walletType\n )\n .map((connectedWallet) => {\n const anyWalletSelectedForBlockchain = selectedWallets.includes(\n connectedWallet.chain\n );\n if (anyWalletSelectedForBlockchain) {\n return connectedWallet;\n }\n selectedWallets.push(connectedWallet.chain);\n return { ...connectedWallet, selected: true };\n });\n\n const balances = makeTokensBalance(connectedWallets);\n\n return {\n balances,\n connectedWallets,\n };\n });\n },\n selectWallets: (wallets) =>\n set((state) => ({\n connectedWallets: state.connectedWallets.map((connectedWallet) => {\n const walletSelected = !!wallets.find(\n (wallet) =>\n wallet.chain === connectedWallet.chain &&\n wallet.walletType !== connectedWallet.walletType &&\n connectedWallet.selected\n );\n const walletNotSelected = !!wallets.find(\n (wallet) =>\n wallet.chain === connectedWallet.chain &&\n wallet.walletType === connectedWallet.walletType &&\n !connectedWallet.selected\n );\n if (walletSelected) {\n return { ...connectedWallet, selected: false };\n } else if (walletNotSelected) {\n return { ...connectedWallet, selected: true };\n }\n\n return connectedWallet;\n }),\n })),\n clearConnectedWallet: () =>\n set(() => ({\n connectedWallets: [],\n selectedWallets: [],\n })),\n getWalletsDetails: async (accounts, findToken, shouldRetry = true) => {\n const getWalletsDetails = get().getWalletsDetails;\n set((state) => ({\n loading: true,\n connectedWallets: state.connectedWallets.map((wallet) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, wallet)\n )\n ? { ...wallet, loading: true }\n : wallet;\n }),\n }));\n try {\n const data = accounts.map(({ address, chain }) => ({\n address,\n blockchain: chain,\n }));\n const response = await httpService().getWalletsDetails(data);\n const retrievedBalance = response.wallets;\n if (retrievedBalance) {\n set((state) => {\n const connectedWallets = state.connectedWallets.map(\n (connectedWallet) => {\n const matchedAccount = accounts.find((account) =>\n isAccountAndWalletMatched(account, connectedWallet)\n );\n const retrievedBalanceAccount = retrievedBalance.find(\n (balance) =>\n balance.address === connectedWallet.address &&\n balance.blockChain === connectedWallet.chain\n );\n if (\n retrievedBalanceAccount?.failed &&\n matchedAccount &&\n shouldRetry\n ) {\n getWalletsDetails([matchedAccount], findToken, false);\n }\n return matchedAccount && retrievedBalanceAccount\n ? {\n ...connectedWallet,\n explorerUrl: retrievedBalanceAccount.explorerUrl,\n balances: makeBalanceFor(\n retrievedBalanceAccount,\n findToken\n ),\n loading: false,\n error: false,\n }\n : connectedWallet;\n }\n );\n\n const balances = makeTokensBalance(connectedWallets);\n return {\n loading: false,\n balances,\n connectedWallets,\n };\n });\n } else {\n throw new Error('Wallet not found');\n }\n } catch (error) {\n set((state) => {\n const connectedWallets = state.connectedWallets.map((balance) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, balance)\n )\n ? resetConnectedWalletState(balance)\n : balance;\n });\n\n const balances = makeTokensBalance(connectedWallets);\n\n return {\n loading: false,\n balances,\n connectedWallets,\n };\n });\n }\n },\n getBalanceFor: (token) => {\n const { balances } = get();\n const tokenHash = createTokenHash(token);\n const balance = balances[tokenHash];\n return balance ?? null;\n },\n };\n })\n )\n);\n", "import type { Events, WidgetEventEmitter } from '../types';\n\nimport mitt from 'mitt';\n\nexport const eventEmitter = mitt<Events>();\n\n// To be exported for Dapps\nexport const widgetEventEmitter: WidgetEventEmitter = {\n on: eventEmitter.on,\n off: eventEmitter.off,\n};\n", "import type { SelectedQuote } from './quote';\nimport type { Wallet } from './wallets';\nimport type {\n RouteEventData,\n StepEventData,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { WidgetEvents as QueueManagerEvents } from '@rango-dev/queue-manager-rango-preset';\n\ntype EventData<\n T extends QuoteEventTypes | WalletEventTypes | UiEventTypes,\n U extends Record<string, unknown> | null\n> = { type: T; payload: U };\n\nexport type PreventableEventPayload<\n T extends Record<string, unknown> = Record<string, unknown>\n> = {\n preventDefault: () => void;\n} & T;\n\ntype Account = Wallet;\n\nexport enum QuoteEventTypes {\n QUOTE_INPUT_UPDATE = 'quoteInputUpdate',\n QUOTE_OUTPUT_UPDATE = 'quoteOutputUpdate',\n}\n\nexport enum WalletEventTypes {\n CONNECT = 'connect',\n DISCONNECT = 'disconnect',\n}\n\n/**\n * We use a prefix for interaction type and a name for defining the event name: INTERACTION_EVENT_NAME\n * e.g. CLICK_X_BUTTON or NAVIGATE_WALLET_PAGE\n */\nexport enum UiEventTypes {\n CLICK_CONNECT_WALLET = 'clickConnectWallet',\n}\n\nexport type QuoteInputUpdateEventPayload = {\n fromBlockchain?: string;\n toBlockchain?: string;\n fromToken?: { symbol: string; name: string | null; address: string | null };\n toToken?: { symbol: string; name: string | null; address: string | null };\n requestAmount?: string;\n};\n\nexport type QuoteUpdateEventPayload = Pick<\n SelectedQuote,\n 'requestAmount' | 'swaps' | 'outputAmount' | 'resultType' | 'tags'\n> | null;\n\nexport type ConnectWalletEventPayload = {\n walletType: string;\n accounts: Account[];\n};\n\nexport type DisconnectWalletEventPayload = {\n walletType: string;\n};\n\nexport type ClickConnectWalletPayload = PreventableEventPayload;\n\nexport type QuoteEventData =\n | EventData<QuoteEventTypes.QUOTE_INPUT_UPDATE, QuoteInputUpdateEventPayload>\n | EventData<QuoteEventTypes.QUOTE_OUTPUT_UPDATE, QuoteUpdateEventPayload>;\n\nexport type WalletEventData =\n | EventData<WalletEventTypes.CONNECT, ConnectWalletEventPayload>\n | EventData<WalletEventTypes.DISCONNECT, DisconnectWalletEventPayload>;\n\nexport type UiEventData = EventData<\n UiEventTypes.CLICK_CONNECT_WALLET,\n ClickConnectWalletPayload\n>;\n\nexport enum WidgetEvents {\n RouteEvent = QueueManagerEvents.RouteEvent,\n StepEvent = QueueManagerEvents.StepEvent,\n QuoteEvent = 'quoteEvent',\n WalletEvent = 'walletEvent',\n UiEvent = 'uiEvent',\n}\n\nexport type Events = {\n [WidgetEvents.RouteEvent]: RouteEventData;\n [WidgetEvents.StepEvent]: StepEventData;\n [WidgetEvents.QuoteEvent]: QuoteEventData;\n [WidgetEvents.WalletEvent]: WalletEventData;\n [WidgetEvents.UiEvent]: UiEventData;\n};\n\ndeclare type EventHandler<T = unknown> = (event: T) => void;\n\nexport type WidgetEventEmitter = {\n on<Key extends WidgetEvents>(\n type: Key,\n handler: EventHandler<Events[Key]>\n ): void;\n off<Key extends WidgetEvents>(\n type: Key,\n handler?: EventHandler<Events[Key]>\n ): void;\n};\n", "import type { StoreApi, UseBoundStore } from 'zustand';\n\ntype State = object;\n\ntype WithSelectors<S> = S extends { getState: () => infer T }\n ? S & { use: { [K in keyof T]: () => T[K] } }\n : never;\n\nconst createSelectors = <S extends UseBoundStore<StoreApi<State>>>(\n _store: S\n) => {\n const store = _store as WithSelectors<typeof _store>;\n store.use = {};\n for (const k of Object.keys(store.getState())) {\n (store.use as any)[k] = () => store((s) => s[k as keyof typeof s]);\n }\n\n return store;\n};\n\nexport default createSelectors;\n", "import type { WidgetConfig } from '../types';\nimport type { ProviderInterface } from '@rango-dev/wallets-react';\n\nimport { allProviders } from '@rango-dev/provider-all';\n\nexport interface ProvidersOptions {\n walletConnectProjectId?: WidgetConfig['walletConnectProjectId'];\n walletConnectListedDesktopWalletLink?: NonNullable<\n WidgetConfig['__UNSTABLE_OR_INTERNAL__']\n >['walletConnectListedDesktopWalletLink'];\n trezorManifest: WidgetConfig['trezorManifest'];\n}\n\n/**\n *\n * Generate a list of providers by passing a provider name (e.g. metamask) or a custom provider which implemented ProviderInterface.\n * @returns ProviderInterface[] a list of ProviderInterface\n *\n */\nexport function matchAndGenerateProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): ProviderInterface[] {\n const all = allProviders({\n walletconnect2: {\n WC_PROJECT_ID: options?.walletConnectProjectId || '',\n DISABLE_MODAL_AND_OPEN_LINK:\n options?.walletConnectListedDesktopWalletLink,\n },\n selectedProviders: providers,\n trezor: options?.trezorManifest\n ? { manifest: options.trezorManifest }\n : undefined,\n });\n\n if (providers) {\n const selectedProviders: ProviderInterface[] = [];\n\n providers.forEach((requestedProvider) => {\n /*\n * There are two types of provider we get, the first one is only passing the wallet name\n * then we will match the wallet name with our providers (@rango-dev/provider-*).\n * The second way is passing a custom provider which implemented ProviderInterface.\n */\n if (typeof requestedProvider === 'string') {\n const result: ProviderInterface | undefined = all.find((provider) => {\n return provider.config.type === requestedProvider;\n });\n if (result) {\n selectedProviders.push(result);\n } else {\n console.warn(\n `Couldn't find ${requestedProvider} provider. Please make sure you are passing the correct name.`\n );\n }\n } else {\n // It's a custom provider so we directly push it to the list.\n selectedProviders.push(requestedProvider);\n }\n });\n return selectedProviders;\n }\n\n return all;\n}\n\nexport function configWalletsToWalletName(\n config: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): string[] {\n const providers = matchAndGenerateProviders(config, options);\n const names = providers.map((provider) => {\n return provider.config.type;\n });\n return names;\n}\n", "import type { ModalPropTypes } from '@rango-dev/ui';\nimport type { PropsWithChildren } from 'react';\n\nimport { Modal } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useUiStore } from '../../../store/ui';\n\nexport function WatermarkedModal(props: PropsWithChildren<ModalPropTypes>) {\n const { watermark } = useUiStore();\n\n const hasWatermark = watermark === 'FULL';\n return (\n <Modal hasWatermark={hasWatermark} {...props}>\n {props.children}\n </Modal>\n );\n}\n", "import type { Watermark } from '../hooks/useFetchApiConfig';\nimport type { TabManagerInterface } from '../libs/tabManager';\n\nimport { create } from 'zustand';\n\nimport { TabManager } from '../libs/tabManager';\n\nimport createSelectors from './selectors';\n\ninterface UiState {\n isActiveTab: boolean;\n tabManagerInitiated: boolean;\n showActivateTabModal: boolean;\n watermark: Watermark;\n activateCurrentTab: (\n setCurrentTabAsActive: () => void,\n hasRunningSwaps: boolean\n ) => void;\n setShowActivateTabModal: (flag: boolean) => void;\n setWatermark: (watermark: Watermark) => void;\n}\n\nexport const useUiStore = createSelectors(\n create<UiState>()((set, get) => ({\n isActiveTab: false,\n tabManagerInitiated: false,\n showActivateTabModal: false,\n watermark: 'NONE',\n fetchingApiConfig: false,\n activateCurrentTab: (setCurrentTabAsActive, hasRunningSwaps) => {\n const { showActivateTabModal } = get();\n\n if (!showActivateTabModal && hasRunningSwaps) {\n set({ showActivateTabModal: true });\n } else if (showActivateTabModal || !hasRunningSwaps) {\n setCurrentTabAsActive();\n }\n },\n setShowActivateTabModal: (flag) => {\n set({ showActivateTabModal: flag });\n },\n setWatermark: (watermark) => {\n set({ watermark });\n },\n }))\n);\n\nexport const tabManager: TabManagerInterface = new TabManager({\n onInit: () => useUiStore.setState({ tabManagerInitiated: true }),\n onClaim: () =>\n useUiStore.setState({ isActiveTab: true, showActivateTabModal: false }),\n onRelease: () => useUiStore.setState({ isActiveTab: false }),\n});\n", "export const TIMEOUT = 300;\nexport const MAXIMUM_TAB_ID = 100_000;\nexport const CHANNEL_NAME = 'rango-widget';\n", "import type {\n Events,\n ID,\n Message,\n TabManagerInterface,\n} from './tabManager.types';\n\nimport { CHANNEL_NAME, MAXIMUM_TAB_ID, TIMEOUT } from './tabManager.constants';\n\nexport class TabManager implements TabManagerInterface {\n private tabId: ID;\n private state: 'not-initiated' | 'not-claimed' | 'claimed' = 'not-initiated';\n private lastTryClaim: number | undefined;\n private events: Events = {};\n private channel: BroadcastChannel;\n\n constructor(events: Events) {\n this.channel = new BroadcastChannel(CHANNEL_NAME);\n this.tabId = Math.trunc(Math.random() * MAXIMUM_TAB_ID);\n this.events = events;\n }\n\n init = () => {\n this.initEvents();\n void this.tryClaim();\n };\n\n /**\n * This is applicable when a user in an inactive tab seeks to activate that tab.\n */\n forceClaim = () => {\n if (!this.isClaimed()) {\n const message: Message = { name: 'force-claim', candidateId: this.tabId };\n this.channel.postMessage(message);\n setTimeout(() => {\n if (!this.isClaimed()) {\n this.claim();\n }\n }, TIMEOUT);\n }\n };\n\n isClaimed = () => {\n return this.state === 'claimed';\n };\n\n /**\n * remove event listeners\n */\n destroy = () => {\n this.channel.removeEventListener('message', this.handleMessageEvent);\n document.removeEventListener(\n 'visibilitychange',\n this.handleVisibilityChange\n );\n document.removeEventListener('resume', this.handleResume);\n };\n\n /**\n * Reacting to messages and window events to claim.\n */\n private initEvents() {\n this.channel.addEventListener('message', this.handleMessageEvent);\n\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n\n /**\n * The \"resume\" event is currently supported only in certain browsers.\n * It is triggered when a previously frozen tab is unfrozen and resumes execution.\n * To avoid having multiple active tabs,\n * if the current tab is active after the \"resume\" event,\n * we send a signal to other tabs to verify if any of them currently claim to be active.\n * If this is the case, we deactivate the current tab.\n * https://developer.chrome.com/docs/web-platform/page-lifecycle-api\n */\n document.addEventListener('resume', this.handleResume);\n }\n\n /**\n * Runs after a `ping` message and checks if current tab is claimed the tabs,\n * if yes, it responds with `pong`, If not, it doesn't do anything.\n *\n * Note 1: If we receive a `ping` message,\n * it means a tab is trying to claim tabs directly, usually it's the active tab.\n *\n * Note 2: If multiple tabs are opening at once, all of them are broadcasting `ping`\n * and eventually all of them will `claim` the queue after the TIMEOUT.\n * For avoiding this, we will accepts the oldest broadcasted ping. (`isPingSentBefore`)\n */\n private claimedByCurrentTab(pingAt: number) {\n const isPingSentBefore = this.lastTryClaim && this.lastTryClaim < pingAt;\n\n if (this.isClaimed() || isPingSentBefore) {\n const message: Message = {\n name: 'pong',\n };\n this.channel.postMessage(message);\n return;\n }\n }\n\n private handleMessageEvent = (event: MessageEvent<Message>) => {\n const name = event.data.name;\n\n switch (name) {\n case 'ping':\n this.claimedByCurrentTab(event.data.pingAt);\n break;\n\n case 'pong':\n this.alreadyClaimedByAnotherTab();\n break;\n\n case 'force-claim':\n this.forceRelease(event.data.candidateId);\n break;\n\n case 'force-release':\n if (this.tabId === event.data.candidateId) {\n this.claim();\n }\n break;\n\n default:\n throw new Error(`${name} is not supported.`);\n }\n };\n\n private handleVisibilityChange = async () => {\n if (document.visibilityState === 'visible') {\n await this.tryClaim();\n }\n };\n\n private handleResume = async () => {\n if (this.isClaimed()) {\n await this.tryClaim();\n if (!this.isClaimed()) {\n this.events.onRelease?.();\n }\n }\n };\n /**\n * Runs after receiving `pong` message, which means one of tabs already claimed the tabs.\n */\n private alreadyClaimedByAnotherTab() {\n this.resetLastCheck();\n }\n\n /**\n * Try to send a `ping` message to know if the tabs `claimed` or not.\n * On constructing instance, or whenever page is active we will try.\n */\n private async tryClaim() {\n /**\n * Try to ask from possible other running tabs.\n */\n this.setLastCheck();\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n this.check();\n resolve();\n }, TIMEOUT);\n });\n }\n\n /**\n * If `lastCheck` is exist, it means there is no other tabs which `claimed` the tabs.\n * And we mark the current tab as `claimed`\n */\n private check() {\n if (this.state === 'not-initiated') {\n this.events.onInit?.();\n }\n /**\n *it means we didn't get any response from other tabs, this tab can claim.\n */\n if (this.lastTryClaim) {\n this.claim();\n this.resetLastCheck();\n } else {\n this.state = 'not-claimed';\n }\n }\n\n private claim() {\n this.state = 'claimed';\n this.events.onClaim?.();\n }\n\n /**\n * Setting current time as `lastCheck` and broadcast a `ping` message event.\n */\n private setLastCheck() {\n this.lastTryClaim = Date.now();\n const message: Message = {\n name: 'ping',\n pingAt: this.lastTryClaim,\n };\n this.channel.postMessage(message);\n }\n\n private resetLastCheck() {\n this.lastTryClaim = undefined;\n }\n\n /**\n * Upon receipt of a \"force-claim\" message,\n * the presently active tab is expected to deactivate itself and initiate any attached callback associated with this event.\n */\n private forceRelease(nextActiveTab: ID) {\n if (this.isClaimed()) {\n this.state = 'not-claimed';\n\n this.events.onRelease?.();\n\n const message: Message = {\n name: 'force-release',\n candidateId: nextActiveTab,\n };\n\n this.channel.postMessage(message);\n }\n }\n}\n", "import type { PropTypes } from './Namespaces.types';\nimport type { Namespace } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Checkbox,\n Divider,\n Image,\n ListItemButton,\n MessageBox,\n Radio,\n RadioRoot,\n} from '@rango-dev/ui';\nimport { namespaces } from '@rango-dev/wallets-shared';\nimport React, { useMemo, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { WalletImageContainer } from '../HeaderButtons/HeaderButtons.styles';\n\nimport { LogoContainer, Spinner } from './ConnectStatus.styles';\nimport { getBlockchainLogo } from './Namespaces.helpers';\nimport { NamespaceList } from './Namespaces.styles';\n\nexport function Namespaces(props: PropTypes) {\n const { singleNamespace, availableNamespaces, providerImage } = props.value;\n\n const [selectedNamespaces, setSelectedNamespaces] = useState<Namespace[]>([]);\n\n const blockchains = useAppStore().blockchains();\n\n const namespacesInfo = useMemo(\n () =>\n availableNamespaces?.map((namespace) => ({\n name: namespace,\n logo: getBlockchainLogo(\n blockchains,\n namespaces[namespace].mainBlockchain\n ),\n title: namespaces[namespace].title,\n })),\n [availableNamespaces]\n );\n\n const onSelect = (namespace: Namespace) => {\n if (singleNamespace) {\n setSelectedNamespaces([namespace]);\n } else {\n setSelectedNamespaces((selectedNamespaces) =>\n selectedNamespaces.includes(namespace)\n ? selectedNamespaces.filter((item) => item !== namespace)\n : selectedNamespaces.concat(namespace)\n );\n }\n };\n\n const wrapRadioRoot = (children: React.ReactNode) => {\n if (singleNamespace) {\n return <RadioRoot value={selectedNamespaces?.[0]}>{children}</RadioRoot>;\n }\n\n return <>{children}</>;\n };\n\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"info\"\n title={i18n.t('Select chain types')}\n description={i18n.t(\n `This wallet supports multiple chains. Select which chain you'd like to connect to.`\n )}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={providerImage} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n <NamespaceList>\n {wrapRadioRoot(\n <>\n {namespacesInfo?.map((namespaceInfoItem) => (\n <ListItemButton\n key={namespaceInfoItem.name}\n id={namespaceInfoItem.name}\n title={namespaceInfoItem.title}\n hasDivider\n style={{ height: 60 }}\n onClick={() => onSelect(namespaceInfoItem.name)}\n start={<Image src={namespaceInfoItem.logo} size={22} />}\n end={\n singleNamespace ? (\n <Radio value={namespaceInfoItem.name} />\n ) : (\n <Checkbox\n checked={selectedNamespaces.includes(\n namespaceInfoItem.name\n )}\n />\n )\n }\n />\n ))}\n </>\n )}\n </NamespaceList>\n <Button\n type=\"primary\"\n disabled={!selectedNamespaces.length}\n onClick={() => props.onConfirm(selectedNamespaces)}>\n {i18n.t('Confirm')}\n </Button>\n </>\n );\n}\n", "import { css, darkTheme, IconButton, styled } from '@rango-dev/ui';\n\nexport const HeaderButton = styled(IconButton, {\n width: '$24',\n position: 'relative',\n padding: '0',\n overflow: 'unset',\n '&:hover': {\n backgroundColor: '$secondary100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral',\n },\n },\n});\n\nexport const ConnectedIcon = styled('div', {\n position: 'absolute',\n background: '$secondary500',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary250',\n },\n width: '$6',\n height: '$6',\n borderRadius: '$lg',\n right: '$4',\n border: '1px solid $surface100',\n});\n\nexport const SuffixContainer = styled('div', {\n display: 'flex',\n justifyContent: 'flex-end',\n minWidth: '$40',\n button: {\n padding: 0,\n },\n});\n\nexport const NotificationsBadgeContainer = styled('div', {\n position: 'absolute',\n width: '14px',\n height: '14px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: '7px',\n top: '$0',\n right: '$0',\n variants: {\n isSever: {\n true: {\n backgroundColor: '$error500',\n },\n false: {\n backgroundColor: '$secondary500',\n },\n },\n },\n});\n\nexport const ProgressIcon = styled('div', {\n padding: '$2',\n variants: {\n isRefetched: {\n true: {\n transform: `rotate(360deg)`,\n transition: 'transform 1s ease-in-out',\n },\n },\n },\n});\n\nexport const InProgressTransactionBadgeContainer = styled('div', {\n position: 'absolute',\n right: '$4',\n top: '$4',\n backgroundColor: '$background',\n borderRadius: '100%',\n});\n\nexport const rowStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const WalletImageContainer = styled('div', {\n borderRadius: '100%',\n border: '1.5px transparent solid',\n '&:not(:first-child)': {\n marginLeft: '-$6',\n },\n img: {\n borderRadius: '100%',\n },\n});\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const IconContainer = styled('div', {\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n backgroundColor: '$success300',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const LogoContainer = styled('div', {\n position: 'relative',\n});\n\nconst spin = keyframes({\n '0%': {\n transform: 'rotate(0deg)',\n },\n '100%': {\n transform: 'rotate(360deg)',\n },\n});\n\nexport const Spinner = styled('div', {\n position: 'absolute',\n border: '2px solid rgba(0, 0, 0, 0.1)',\n borderTop: '2px solid $info500',\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n animation: `${spin} 1s linear infinite`,\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n});\n\nexport const WalletImageContainer = styled('div', {\n '& img': {\n borderRadius: '50%',\n },\n});\n", "import type { BlockchainMeta } from 'rango-types';\n\nexport function getBlockchainLogo(\n blockchains: BlockchainMeta[],\n blockchainName: string\n) {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.logo;\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const NamespaceList = styled('ul', {\n padding: 0,\n paddingTop: '$4',\n paddingBottom: '$4',\n});\n", "import type { PropTypes } from './DerivationPath.types';\nimport type { DerivationPath } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n Image,\n MessageBox,\n Select,\n TextField,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './ConnectStatus.styles';\nimport {\n CUSTOM_DERIVATION_PATH,\n getDerivationPaths,\n} from './DerivationPath.helpers';\nimport {\n derivationPathInputStyles,\n InputLabel,\n InputsContainer,\n} from './DerivationPath.styles';\n\nconst DEFAULT_DERIVATION_PATH_INDEX = '0';\n\nexport function DerivationPath(props: PropTypes) {\n const { onConfirm } = props;\n const {\n namespace: selectedNamespace,\n providerImage: image,\n providerType: type,\n } = props.value;\n\n const [selectedDerivationPathId, setSelectedDerivationPathId] = useState<\n string | null\n >(null);\n const [derivationPathIndex, setDerivationPathIndex] = useState(\n DEFAULT_DERIVATION_PATH_INDEX\n );\n\n const isCustomOptionSelected =\n selectedDerivationPathId === CUSTOM_DERIVATION_PATH.id;\n\n const derivationPaths = getDerivationPaths(selectedNamespace);\n\n const handleDerivationPathItemClick = ({ value }: { value: string }) => {\n const selectedDerivationPath = derivationPaths?.find(\n (derivationPath) => derivationPath.id === value\n );\n\n if (selectedDerivationPath) {\n /*\n * Custom mode accepts string, but other modes only accepts number,\n * Here we are checking if user is on custom mode and trying to switch to another mode\n * if it's an string we will keep it, if not we will reset the value to default\n */\n if (\n selectedDerivationPathId === CUSTOM_DERIVATION_PATH.id &&\n Number.isNaN(Number(derivationPathIndex))\n ) {\n setDerivationPathIndex(DEFAULT_DERIVATION_PATH_INDEX);\n }\n\n setSelectedDerivationPathId(selectedDerivationPath.id);\n }\n };\n\n const handleConfirm = () => {\n const selectedDerivationPath = derivationPaths.find(\n (derivationPath) => derivationPath.id === selectedDerivationPathId\n );\n if (selectedDerivationPath) {\n onConfirm(\n selectedDerivationPath.generateDerivationPath(derivationPathIndex)\n );\n } else {\n // Unreachable code\n throw new Error('selectedDerivationPath can not be undefined');\n }\n };\n\n useEffect(() => {\n setSelectedDerivationPathId(\n getDerivationPaths(selectedNamespace)[0]?.id || null\n );\n }, [selectedNamespace]);\n\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"info\"\n title={i18n.t('Select Derivation Path')}\n description={i18n.t(\n `In order to connect to ${type}, you must first select a Derivation Path`\n )}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n\n <InputsContainer>\n <InputLabel variant=\"body\" size=\"xsmall\" color=\"$neutral600\">\n {i18n.t('Choose Derivation Path Template')}\n </InputLabel>\n <Select\n value={selectedDerivationPathId || ''}\n options={derivationPaths.map((derivationPath) => ({\n value: derivationPath.id,\n label: derivationPath.label,\n }))}\n variant=\"filled\"\n handleItemClick={handleDerivationPathItemClick}\n styles={{ trigger: derivationPathInputStyles }}\n />\n <Divider size={20} />\n <InputLabel variant=\"body\" size=\"xsmall\" color=\"$neutral600\">\n {isCustomOptionSelected\n ? i18n.t('Enter Path')\n : i18n.t('Enter Index')}\n </InputLabel>\n <TextField\n type={isCustomOptionSelected ? 'text' : 'number'}\n variant=\"contained\"\n value={derivationPathIndex}\n onChange={(event) => setDerivationPathIndex(event.target.value)}\n style={derivationPathInputStyles}\n />\n </InputsContainer>\n\n <Button\n type=\"primary\"\n onClick={handleConfirm}\n disabled={\n !derivationPaths || !selectedDerivationPathId || !derivationPathIndex\n }>\n {i18n.t('Confirm')}\n </Button>\n </>\n );\n}\n", "import type { DerivationPath, Namespace } from '@rango-dev/wallets-shared';\n\nimport { namespaces } from '@rango-dev/wallets-shared';\n\nexport const CUSTOM_DERIVATION_PATH: DerivationPath = {\n id: 'custom',\n label: 'Custom',\n generateDerivationPath: (index: string) => index,\n};\n\nexport function getDerivationPaths(\n selectedNamespace?: Namespace\n): DerivationPath[] {\n const selectedNamespaceDerivationPaths = selectedNamespace\n ? namespaces[selectedNamespace].derivationPaths\n : null;\n\n const derivationPaths: DerivationPath[] = !!selectedNamespaceDerivationPaths\n ? [...selectedNamespaceDerivationPaths, CUSTOM_DERIVATION_PATH]\n : [];\n\n return derivationPaths;\n}\n", "import { styled, Typography } from '@rango-dev/ui';\n\nexport const InputsContainer = styled('div', {\n paddingTop: '$30',\n paddingBottom: '$30',\n zIndex: 10, // This property is added to solve inconsistency between Select child of this component and subsequent button\n});\n\nexport const InputLabel = styled(Typography, {\n paddingLeft: '$10',\n});\n\nexport const derivationPathInputStyles = {\n height: '$40',\n backgroundColor: '$neutral200',\n borderRadius: '$sm',\n};\n", "import type { ConnectStatusProps } from './ConnectStatus.types';\n\nimport { i18n } from '@lingui/core';\nimport { Image, MessageBox, WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React from 'react';\n\nimport { mapStatusToWalletState } from '../../utils/wallets';\n\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './ConnectStatus.styles';\n\nexport function ConnectStatus(props: ConnectStatusProps) {\n // See `wallet` notes on its type definition\n const { wallet, error } = props;\n const { type, image } = wallet;\n const { state } = useWallets();\n const walletState = mapStatusToWalletState(state(type));\n\n if (walletState === WalletState.CONNECTED) {\n return (\n <MessageBox\n type=\"success\"\n title={i18n.t('Wallet Connected')}\n description={i18n.t(\n 'Your wallet is connected, you can use it to swap.'\n )}\n />\n );\n }\n\n if (error) {\n return (\n <MessageBox\n type=\"error\"\n title={i18n.t('Failed to Connect')}\n description={\n error || i18n.t('Your wallet is not connected. Please try again.')\n }\n />\n );\n }\n\n return (\n <MessageBox\n type=\"loading\"\n title={i18n.t('Connecting to your wallet')}\n description={i18n.t('Click connect in your wallet popup.')}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\ninterface PropTypes {\n displayName?: string;\n onConfirm: () => void;\n}\n\nexport function ExperimentalChain(props: PropTypes) {\n const { displayName, onConfirm } = props;\n\n return (\n <MessageBox\n title={i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName: displayName },\n })}\n type=\"warning\"\n description={i18n.t({\n id: 'You should connect a {blockchainDisplayName} supported wallet or choose a different {blockchainDisplayName} address',\n values: { blockchainDisplayName: displayName },\n })}>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n onClick={onConfirm}\n variant=\"outlined\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n );\n}\n", "import type { State } from '../../hooks/useStatefulConnect';\nimport type { WalletInfoWithExtra } from '../../types';\n\nexport function isOnStatus(\n getState: () => State,\n wallet?: WalletInfoWithExtra\n): wallet is WalletInfoWithExtra {\n return getState().status === 'init' && !!wallet;\n}\n\nexport function isOnNamespace(\n getState: () => State\n): getState is () => State & { namespace: NonNullable<State['namespace']> } {\n return getState().status === 'namespace';\n}\n\nexport function isOnDerivationPath(\n getState: () => State\n): getState is () => State & {\n derivationPath: NonNullable<State['derivationPath']>;\n} {\n return getState().status === 'derivationPath';\n}\n", "import type {\n OnWalletConnectionChange,\n PropTypes,\n WidgetContextInterface,\n} from './Wallets.types';\nimport type { ProvidersOptions } from '../../utils/providers';\nimport type { LegacyEventHandler as EventHandler } from '@rango-dev/wallets-core/legacy';\nimport type { PropsWithChildren } from 'react';\n\nimport { Events, Provider } from '@rango-dev/wallets-react';\nimport { type Network } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport React, { createContext, useEffect, useMemo, useRef } from 'react';\n\nimport { useWalletProviders } from '../../hooks/useWalletProviders';\nimport { AppStoreProvider, useAppStore } from '../../store/AppStore';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport {\n prepareAccountsForWalletStore,\n walletAndSupportedChainsNames,\n} from '../../utils/wallets';\n\nexport const WidgetContext = createContext<WidgetContextInterface>({\n onConnectWallet: () => {\n return;\n },\n onDisconnectWallet: () => {\n return;\n },\n});\n\nfunction Main(props: PropsWithChildren<PropTypes>) {\n const {\n updateConfig,\n updateSettings,\n fetch: fetchMeta,\n fetchStatus,\n } = useAppStore();\n const blockchains = useAppStore().blockchains();\n const { findToken } = useAppStore();\n const config = useAppStore().config;\n\n const walletOptions: ProvidersOptions = {\n walletConnectProjectId: config?.walletConnectProjectId,\n trezorManifest: config?.trezorManifest,\n walletConnectListedDesktopWalletLink:\n props.config.__UNSTABLE_OR_INTERNAL__\n ?.walletConnectListedDesktopWalletLink,\n };\n const { providers } = useWalletProviders(config.wallets, walletOptions);\n const { connectWallet, disconnectWallet } = useWalletsStore();\n const onConnectWalletHandler = useRef<OnWalletConnectionChange>();\n const onDisconnectWalletHandler = useRef<OnWalletConnectionChange>();\n\n useEffect(() => {\n void fetchMeta().catch(console.log);\n }, []);\n\n useEffect(() => {\n if (props.config) {\n updateConfig(props.config);\n updateSettings(props.config);\n window['__rango'] = {\n config,\n dappConfig: props.config,\n };\n }\n }, [props.config, fetchStatus]);\n\n const evmBasedChainNames = blockchains\n .filter(isEvmBlockchain)\n .map((chain) => chain.name);\n\n const onUpdateState: EventHandler = (type, event, value, state, meta) => {\n if (event === Events.ACCOUNTS) {\n if (value) {\n const supportedChainNames: Network[] | null =\n walletAndSupportedChainsNames(meta.supportedBlockchains);\n const data = prepareAccountsForWalletStore(\n type,\n value,\n evmBasedChainNames,\n supportedChainNames,\n meta.isContractWallet\n );\n if (data.length) {\n connectWallet(data, findToken);\n }\n } else {\n disconnectWallet(type);\n if (!!onDisconnectWalletHandler.current) {\n onDisconnectWalletHandler.current(type);\n } else {\n console.warn(\n `onDisconnectWallet handler hasn't been set. Are you sure?`\n );\n }\n }\n }\n if (event === Events.ACCOUNTS && state.connected) {\n const key = `${type}-${state.network}-${value}`;\n\n if (state.connected) {\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(key);\n } else {\n console.warn(\n `onConnectWallet handler hasn't been set. Are you sure?`\n );\n }\n }\n }\n\n if (event === Events.NETWORK && state.network) {\n const key = `${type}-${state.network}`;\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(key);\n } else {\n console.warn(`onConnectWallet handler hasn't been set. Are you sure?`);\n }\n }\n\n // propagate updates for Dapps using external wallets\n if (props.onUpdateState) {\n props.onUpdateState(type, event, value, state, meta);\n }\n };\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const handlers = useMemo(\n () => ({\n onConnectWallet: (handler: OnWalletConnectionChange) => {\n onConnectWalletHandler.current = handler;\n },\n onDisconnectWallet: (handler: OnWalletConnectionChange) => {\n onDisconnectWalletHandler.current = handler;\n },\n }),\n []\n );\n\n return (\n <WidgetContext.Provider value={handlers}>\n <Provider\n allBlockChains={blockchains}\n providers={providers}\n onUpdateState={onUpdateState}\n autoConnect={!!isActiveTab}>\n {props.children}\n </Provider>\n </WidgetContext.Provider>\n );\n}\n\nexport function WidgetWallets(props: PropsWithChildren<PropTypes>) {\n const { config, ...otherProps } = props;\n return (\n <AppStoreProvider config={config}>\n <Main {...otherProps} config={config} />\n </AppStoreProvider>\n );\n}\n", "import type { WidgetConfig } from '../../types';\nimport type { ProvidersOptions } from '../../utils/providers';\nimport type { ProviderInterface } from '@rango-dev/wallets-react';\n\nimport { useEffect } from 'react';\n\nimport { useWalletsStore } from '../../store/wallets';\nimport { matchAndGenerateProviders } from '../../utils/providers';\n\nimport { hashProviders } from './useWalletProviders.helpers';\n\nexport function useWalletProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n) {\n const clearConnectedWallet = useWalletsStore.use.clearConnectedWallet();\n let generateProviders: ProviderInterface[] = matchAndGenerateProviders(\n providers,\n options\n );\n\n useEffect(() => {\n clearConnectedWallet();\n generateProviders = matchAndGenerateProviders(providers, options);\n }, [\n hashProviders(providers ?? []),\n options?.walletConnectProjectId,\n options?.walletConnectListedDesktopWalletLink,\n ]);\n\n return {\n providers: generateProviders,\n };\n}\n", "import type { ProviderInterface } from '@rango-dev/wallets-react';\n\nexport function hashProviders(\n providers: (string | ProviderInterface)[]\n): string {\n return providers\n .map((provider) => {\n if (typeof provider === 'string') {\n return provider;\n }\n return provider.config.type;\n })\n .join('-');\n}\n", "import type { WidgetProps } from './Widget.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React from 'react';\n\nimport { AppRouter } from '../../components/AppRouter';\nimport { DEFAULT_CONFIG } from '../../store/slices/config';\nimport { Main } from '../App';\nimport { WidgetProvider } from '../WidgetProvider';\n\nexport function Widget(props: PropsWithChildren<WidgetProps>) {\n const isExternalWalletsEnabled = props.config?.externalWallets;\n\n return (\n <AppRouter>\n {isExternalWalletsEnabled ? (\n <Main />\n ) : (\n <WidgetProvider config={props.config ?? DEFAULT_CONFIG}>\n <Main />\n </WidgetProvider>\n )}\n </AppRouter>\n );\n}\n", "import type { PropsWithChildren } from 'react';\n\nimport React, { Fragment } from 'react';\nimport { MemoryRouter, useInRouterContext } from 'react-router';\n\nexport function AppRouter({ children }: PropsWithChildren) {\n const isRouterInContext = useInRouterContext();\n const Router = isRouterInContext ? Fragment : MemoryRouter;\n\n return <Router>{children}</Router>;\n}\n", "import { I18nManager } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { AppRoutes } from '../../components/AppRoutes';\nimport { useBootstrap } from '../../hooks/useBootstrap';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\n\nimport { MainContainer } from './App.styles';\n\nexport function Main() {\n useBootstrap();\n const { config } = useAppStore();\n const { activeTheme } = useTheme(config?.theme || {});\n const { activeLanguage } = useLanguage();\n\n return (\n <I18nManager language={activeLanguage}>\n <MainContainer id=\"swap-container\" className={activeTheme()}>\n <AppRoutes />\n </MainContainer>\n </I18nManager>\n );\n}\n", "import React from 'react';\nimport { useRoutes } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useSyncStoresWithConfig } from '../hooks/useSyncStoresWithConfig';\nimport { useSyncUrlAndStore } from '../hooks/useSyncUrlAndStore';\nimport { AddCustomTokenPage } from '../pages/AddCustomTokenPage';\nimport { ConfirmSwapPage } from '../pages/ConfirmSwapPage';\nimport { CustomTokensPage } from '../pages/CustomTokensPage';\nimport { HistoryPage } from '../pages/HistoryPage';\nimport { Home } from '../pages/Home';\nimport { LanguagePage } from '../pages/LanguagePage';\nimport { LiquiditySourcePage } from '../pages/LiquiditySourcePage';\nimport { RoutesPage } from '../pages/Routes';\nimport { SelectBlockchainPage } from '../pages/SelectBlockchainPage';\nimport { SelectSwapItemsPage } from '../pages/SelectSwapItemsPage';\nimport { SettingsPage } from '../pages/SettingsPage';\nimport { SwapDetailsPage } from '../pages/SwapDetailsPage';\nimport { WalletsPage } from '../pages/WalletsPage';\n\nexport function AppRoutes() {\n /**\n * The configuration of the widget should initially be applied to the widget state.\n * If search parameters exist in the URL,\n * they should be applied later and take precedence over the widget configuration.\n * To achieve this, it is crucial to execute these hooks in the correct sequence.\n */\n useSyncStoresWithConfig();\n useSyncUrlAndStore();\n\n return useRoutes([\n {\n path: navigationRoutes.home,\n element: <Home />,\n },\n {\n path: navigationRoutes.routes,\n element: <RoutesPage />,\n },\n {\n path: navigationRoutes.fromSwap,\n children: [\n {\n index: true,\n element: <SelectSwapItemsPage type=\"source\" />,\n },\n {\n path: navigationRoutes.blockchains,\n element: <SelectBlockchainPage type=\"source\" />,\n },\n ],\n },\n {\n path: navigationRoutes.toSwap,\n children: [\n {\n index: true,\n element: <SelectSwapItemsPage type=\"destination\" />,\n },\n {\n path: navigationRoutes.blockchains,\n element: <SelectBlockchainPage type=\"destination\" />,\n },\n ],\n },\n {\n path: navigationRoutes.settings,\n children: [\n {\n index: true,\n element: <SettingsPage />,\n },\n {\n path: navigationRoutes.languages,\n element: <LanguagePage />,\n },\n {\n path: navigationRoutes.exchanges,\n element: <LiquiditySourcePage sourceType=\"Exchanges\" />,\n },\n {\n path: navigationRoutes.bridges,\n element: <LiquiditySourcePage sourceType=\"Bridges\" />,\n },\n {\n path: navigationRoutes.customTokens,\n children: [\n {\n index: true,\n element: <CustomTokensPage />,\n },\n {\n path: navigationRoutes.addCustomTokens,\n children: [\n {\n index: true,\n element: <AddCustomTokenPage />,\n },\n {\n path: navigationRoutes.blockchains,\n element: (\n <SelectBlockchainPage\n hideCategory={true}\n type=\"custom-token\"\n />\n ),\n },\n ],\n },\n ],\n },\n ],\n },\n\n {\n path: navigationRoutes.swaps,\n children: [\n {\n index: true,\n element: <HistoryPage />,\n },\n {\n path: navigationRoutes.swapDetails,\n element: <SwapDetailsPage />,\n },\n ],\n },\n {\n path: navigationRoutes.wallets,\n element: <WalletsPage />,\n },\n {\n path: navigationRoutes.confirmSwap,\n element: <ConfirmSwapPage />,\n },\n ]);\n}\n", "export const navigationRoutes = {\n home: '/',\n fromSwap: 'from-swap',\n toSwap: 'to-swap',\n blockchains: 'blockchains',\n settings: 'settings',\n customTokens: 'custom-tokens',\n addCustomTokens: 'add-custom-tokens',\n liquiditySources: 'liquidity-sources',\n bridges: 'bridges',\n exchanges: 'exchanges',\n languages: 'languages',\n swaps: 'swaps',\n wallets: 'wallets',\n confirmSwap: 'confirm-swap',\n swapDetails: ':requestId',\n routes: 'routes',\n};\n", "import type { Asset } from 'rango-sdk';\n\nimport { useEffect, useRef } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport {\n isBlockchainExcludedInConfig,\n isTokenExcludedInConfig,\n} from '../utils/configs';\n\nexport function useSyncStoresWithConfig() {\n const {\n setInputAmount,\n setToToken,\n setToBlockchain,\n setFromBlockchain,\n resetQuote,\n setFromToken,\n fromToken,\n toToken,\n fromBlockchain,\n toBlockchain,\n } = useQuoteStore();\n\n const config = useAppStore().config;\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const { findToken } = useAppStore();\n\n const { setAffiliateRef, setAffiliatePercent, setAffiliateWallets } =\n useAppStore();\n\n const fromTokensConfig = config?.from?.tokens;\n const fromBlockchainsConfig = config?.from?.blockchains;\n const toTokensConfig = config?.to?.tokens;\n const toBlockchainsConfig = config?.to?.blockchains;\n const prevConfigFromToken = useRef<Asset | undefined>(undefined);\n const prevConfigToToken = useRef<Asset | undefined>(undefined);\n const prevConfigFromBlockchain = useRef<string | undefined>(undefined);\n const prevConfigToBlockchain = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n if (typeof config.amount !== 'undefined') {\n setInputAmount(config.amount.toString());\n }\n }, [config?.amount]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n resetQuote();\n const chain = blockchains.find(\n (chain) => chain.name === config?.from?.blockchain\n );\n const fromToken = config?.from?.token;\n const token = fromToken && findToken(fromToken);\n\n if (chain || (!chain && prevConfigFromBlockchain.current)) {\n setFromBlockchain(chain ?? null);\n }\n\n if (token) {\n setFromToken({ token, meta: { blockchains, tokens } });\n } else if (!token && prevConfigFromToken.current) {\n setFromToken({ token: null });\n }\n\n prevConfigFromBlockchain.current = config?.from?.blockchain;\n prevConfigFromToken.current = config?.from?.token;\n }\n }, [\n config?.from?.token?.symbol,\n config?.from?.token?.address,\n config?.from?.token?.blockchain,\n config?.from?.blockchain,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n if (isTokenExcludedInConfig(fromToken, fromTokensConfig)) {\n setFromToken({ token: null });\n }\n\n if (isBlockchainExcludedInConfig(fromBlockchain, fromBlockchainsConfig)) {\n setFromBlockchain(null);\n }\n }, [fromTokensConfig, fromBlockchainsConfig]);\n\n useEffect(() => {\n if (isTokenExcludedInConfig(toToken, toTokensConfig)) {\n setFromToken({ token: null });\n }\n if (isBlockchainExcludedInConfig(toBlockchain, toBlockchainsConfig)) {\n setToBlockchain(null);\n }\n }, [toTokensConfig, toBlockchainsConfig]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n resetQuote();\n const chain = blockchains.find(\n (chain) => chain.name === config?.to?.blockchain\n );\n\n const toToken = config?.to?.token;\n const token = toToken && findToken(toToken);\n\n if (chain || (!chain && prevConfigToBlockchain.current)) {\n setToBlockchain(chain ?? null);\n }\n\n if (token) {\n setToToken({ token, meta: { blockchains, tokens } });\n } else if (!token && prevConfigToToken.current) {\n setToToken({ token: null });\n }\n\n prevConfigToBlockchain.current = config?.to?.blockchain;\n prevConfigToToken.current = config?.to?.token;\n }\n }, [\n config?.to?.token?.symbol,\n config?.to?.token?.address,\n config?.to?.token?.blockchain,\n config?.to?.blockchain,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n setAffiliateRef(config?.affiliate?.ref ?? null);\n setAffiliatePercent(config?.affiliate?.percent ?? null);\n setAffiliateWallets(config?.affiliate?.wallets ?? null);\n }, [\n config?.affiliate?.ref,\n config?.affiliate?.percent,\n config?.affiliate?.wallets,\n ]);\n}\n", "import type {\n BlockchainMeta,\n MetaResponse,\n MultiRouteResponse,\n PreferenceType,\n Token,\n} from 'rango-sdk';\n\nimport BigNumber from 'bignumber.js';\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport { ZERO } from '../constants/numbers';\nimport { eventEmitter } from '../services/eventEmitter';\nimport {\n type QuoteError,\n QuoteEventTypes,\n type QuoteWarning,\n type SelectedQuote,\n type Wallet,\n WidgetEvents,\n} from '../types';\nimport { isPositiveNumber } from '../utils/numbers';\nimport {\n getQuoteFromTokenUsdPrice,\n getQuoteToTokenUsdPrice,\n} from '../utils/quote';\nimport { calcOutputUsdValue } from '../utils/swap';\n\nimport createSelectors from './selectors';\n\nexport const getUsdValue = (\n token: Token | null,\n amount: string\n): BigNumber | null =>\n token?.usdPrice\n ? new BigNumber(amount || ZERO).multipliedBy(token?.usdPrice || 0)\n : null;\n\nexport type Meta = Pick<MetaResponse, 'blockchains' | 'tokens'>;\n\nexport type SetTokenParams = { token: Token; meta: Meta } | { token: null };\n\ntype SomeQuoteState = {\n quotes: MultiRouteResponse | null;\n sortStrategy: PreferenceType;\n refetchQuote: boolean;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n};\nexport type RetryQuote = {\n fromBlockchain: BlockchainMeta | null;\n fromToken?: Token;\n toBlockchain: BlockchainMeta | null;\n toToken?: Token;\n inputAmount: string;\n};\nexport interface QuoteState {\n fromBlockchain: BlockchainMeta | null;\n toBlockchain: BlockchainMeta | null;\n inputAmount: string;\n inputUsdValue: BigNumber | null;\n outputAmount: BigNumber | null;\n outputUsdValue: BigNumber | null;\n fromToken: Token | null;\n sortStrategy: PreferenceType;\n toToken: Token | null;\n quoteWalletsConfirmed: boolean;\n selectedWallets: Wallet[];\n quoteWarningsConfirmed: boolean;\n refetchQuote: boolean;\n selectedQuote: SelectedQuote | null;\n quotes: MultiRouteResponse | null;\n customDestination: string | null;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n resetQuote: () => void;\n resetAlerts: () => void;\n\n resetToBlockchain: () => void;\n resetFromBlockchain: () => void;\n setFromBlockchain: (chain: BlockchainMeta | null) => void;\n setToBlockchain: (chian: BlockchainMeta | null) => void;\n setFromToken: (params: SetTokenParams) => void;\n setToToken: (params: SetTokenParams) => void;\n updateQuotePartialState: <K extends keyof SomeQuoteState>(\n key: K,\n value: SomeQuoteState[K]\n ) => void;\n setInputAmount: (amount: string) => void;\n setSelectedQuote: (quote: SelectedQuote | null) => void;\n retry: (retryQuote: RetryQuote) => void;\n switchFromAndTo: () => void;\n setQuoteWalletConfirmed: (flag: boolean) => void;\n setSelectedWallets: (wallets: Wallet[]) => void;\n setCustomDestination: (address: string | null) => void;\n resetQuoteWallets: () => void;\n setQuoteWarningsConfirmed: (flag: boolean) => void;\n}\n\nexport const useQuoteStore = createSelectors(\n create<QuoteState>()(\n subscribeWithSelector((set) => ({\n fromBlockchain: null,\n fromToken: null,\n inputAmount: '',\n outputAmount: null,\n inputUsdValue: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n toBlockchain: null,\n toToken: null,\n refetchQuote: true,\n sortStrategy: 'SMART',\n selectedQuote: null,\n quotes: null,\n error: null,\n warning: null,\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: null,\n quoteWarningsConfirmed: false,\n updateQuotePartialState: (key, value) =>\n set((state) => ({\n ...state,\n [key]: value,\n })),\n setSelectedQuote: (quote) =>\n set((state) => {\n let outputAmount: BigNumber | null = null;\n let outputUsdValue: BigNumber = ZERO;\n\n let inputUsdValue = state.inputUsdValue;\n if (!isPositiveNumber(state.inputAmount)) {\n return {};\n }\n if (!!quote) {\n outputAmount = !!quote?.outputAmount\n ? new BigNumber(quote?.outputAmount)\n : null;\n inputUsdValue = calcOutputUsdValue(\n state.inputAmount,\n getQuoteFromTokenUsdPrice(quote) || state.fromToken?.usdPrice\n );\n outputUsdValue = calcOutputUsdValue(\n quote.outputAmount,\n getQuoteToTokenUsdPrice(quote) || state.toToken?.usdPrice\n );\n }\n return {\n selectedQuote: quote,\n ...(!!quote && {\n outputAmount,\n outputUsdValue,\n inputUsdValue,\n }),\n };\n }),\n resetAlerts: () =>\n set(() => ({\n error: null,\n warning: null,\n })),\n resetQuote: () =>\n set(() => ({\n selectedQuote: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n quotes: null,\n refetchQuote: true,\n error: null,\n warning: null,\n })),\n setFromBlockchain: (chain) => {\n set((state) => {\n if (state.fromBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n fromBlockchain: chain,\n inputUsdValue: new BigNumber(0),\n ...(state.fromToken && {\n selectedQuote: null,\n fromToken: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n }),\n };\n });\n },\n setFromToken: (params) => {\n return set((state) => ({\n fromToken: params.token,\n ...(params.token && {\n fromBlockchain:\n params.meta.blockchains.find(\n (blockchain) => blockchain.name === params.token.blockchain\n ) ?? null,\n }),\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(params.token, state.inputAmount),\n }),\n }));\n },\n setToBlockchain: (chain) => {\n set((state) => {\n if (state.toBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n toBlockchain: chain,\n ...(state.toToken && {\n selectedQuote: null,\n toToken: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n }),\n };\n });\n },\n setToToken: (params) => {\n return set(() => ({\n toToken: params.token,\n ...(params.token && {\n toBlockchain:\n params.meta.blockchains.find(\n (blockchain) => blockchain.name === params.token.blockchain\n ) ?? null,\n }),\n }));\n },\n setInputAmount: (amount) => {\n set((state) => ({\n inputAmount: amount,\n ...(!amount && {\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n selectedQuote: null,\n }),\n ...(!!state.fromToken && {\n inputUsdValue: getUsdValue(state.fromToken, amount),\n }),\n }));\n },\n retry: (retryQuote) => {\n const {\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n inputAmount,\n } = retryQuote;\n\n set({\n fromBlockchain,\n fromToken,\n inputAmount,\n outputAmount: null,\n inputUsdValue: getUsdValue(fromToken ?? null, inputAmount),\n outputUsdValue: new BigNumber(0),\n toBlockchain,\n toToken,\n selectedQuote: null,\n });\n },\n switchFromAndTo: () =>\n set((state) => ({\n fromBlockchain: state.toBlockchain,\n fromToken: state.toToken,\n toBlockchain: state.fromBlockchain,\n toToken: state.fromToken,\n inputAmount: state.outputAmount?.toString() || '',\n inputUsdValue: state.toToken\n ? getUsdValue(state.toToken, state.outputAmount?.toString() || '')\n : new BigNumber(0),\n })),\n resetFromBlockchain: () =>\n set(() => ({\n fromToken: null,\n fromBlockchain: null,\n outputUsdValue: new BigNumber(0),\n inputUsdValue: new BigNumber(0),\n inputAmount: '',\n outputAmount: null,\n selectedQuote: null,\n })),\n resetToBlockchain: () =>\n set(() => ({\n toToken: null,\n toBlockchain: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n selectedQuote: null,\n })),\n setQuoteWalletConfirmed: (flag) =>\n set({\n quoteWalletsConfirmed: flag,\n }),\n setSelectedWallets: (wallets) => set({ selectedWallets: wallets }),\n setCustomDestination: (address) => set({ customDestination: address }),\n resetQuoteWallets: () =>\n set({\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: null,\n }),\n setQuoteWarningsConfirmed: (flag) =>\n set({ quoteWarningsConfirmed: flag }),\n }))\n )\n);\n\nexport const unsubscribeQuoteStore = useQuoteStore.subscribe(\n (selectedState, previousSelectedState) => {\n if (\n selectedState.fromBlockchain !== previousSelectedState.fromBlockchain ||\n selectedState.fromToken !== previousSelectedState.fromToken ||\n selectedState.toBlockchain !== previousSelectedState.toBlockchain ||\n selectedState.toToken !== previousSelectedState.toToken ||\n selectedState.inputAmount !== previousSelectedState.inputAmount\n ) {\n // useEffect hook can not be used in Zustand subscribe\n eventEmitter.emit(WidgetEvents.QuoteEvent, {\n type: QuoteEventTypes.QUOTE_INPUT_UPDATE,\n payload: {\n fromBlockchain: selectedState.fromBlockchain?.name,\n toBlockchain: selectedState.toBlockchain?.name,\n fromToken: selectedState.fromToken\n ? {\n symbol: selectedState.fromToken.symbol,\n name: selectedState.fromToken.name,\n address: selectedState.fromToken.address,\n }\n : undefined,\n toToken: selectedState.toToken\n ? {\n symbol: selectedState.toToken.symbol,\n name: selectedState.toToken.name,\n address: selectedState.toToken.address,\n }\n : undefined,\n requestAmount: selectedState.inputAmount,\n },\n });\n }\n\n if (\n selectedState.selectedQuote?.requestId !==\n previousSelectedState.selectedQuote?.requestId\n ) {\n eventEmitter.emit(WidgetEvents.QuoteEvent, {\n type: QuoteEventTypes.QUOTE_OUTPUT_UPDATE,\n payload: selectedState.selectedQuote\n ? {\n requestAmount: selectedState.selectedQuote.requestAmount,\n swaps: selectedState.selectedQuote.swaps,\n outputAmount: selectedState.selectedQuote.outputAmount,\n resultType: selectedState.selectedQuote.resultType,\n tags: selectedState.selectedQuote.tags,\n }\n : null,\n });\n }\n }\n);\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { RetryQuote } from '../store/quote';\nimport type { FindToken } from '../store/slices/data';\nimport type { QuoteWarning, SelectedQuote, Wallet } from '../types';\nimport type {\n PriceImpactWarningLevel,\n SimulationAssetAndAmount,\n SimulationValidationStatus,\n Step,\n} from '@rango-dev/ui';\nimport type {\n Asset,\n BlockchainMeta,\n MultiRouteResponse,\n MultiRouteSimulationResult,\n PreferenceType,\n RouteTag,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap } from 'rango-types';\n\nimport { getLastSuccessfulStep } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\n\nimport { HIGH_PRIORITY_TAGS } from '../constants/quote';\nimport { HIGHT_PRICE_IMPACT, LOW_PRICE_IMPACT } from '../constants/routing';\nimport { HIGH_SLIPPAGE } from '../constants/swapSettings';\nimport { QuoteWarningType } from '../types';\n\nimport { areEqual } from './common';\nimport { createTokenHash, findBlockchain } from './meta';\nimport {\n calcOutputUsdValue,\n checkSlippageWarnings,\n getMinRequiredSlippage,\n getPercentageChange,\n getTotalFeeInUsd,\n hasHighValueLoss,\n hasProperSlippage,\n} from './swap';\n\nexport function getQuoteToTokenUsdPrice(\n quote: SelectedQuote | null\n): number | null | undefined {\n const swaps = quote?.swaps || [];\n return swaps[swaps.length - 1].to.usdPrice;\n}\n\nexport function getQuoteFromTokenUsdPrice(\n quote: SelectedQuote | null\n): number | null | undefined {\n const swaps = quote?.swaps || [];\n return swaps[0].from.usdPrice;\n}\n\nexport function isNumberOfSwapsChanged(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteASwaps = quoteA?.swaps || [];\n const quoteBSwaps = quoteB?.swaps || [];\n return quoteASwaps.length !== quoteBSwaps.length;\n}\n\nexport function isQuoteSwappersUpdated(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteASwappers = quoteA?.swaps.map((swap) => swap.swapperId) || [];\n const quoteBSwappers = quoteB?.swaps.map((swap) => swap.swapperId) || [];\n return !areEqual(quoteASwappers, quoteBSwappers);\n}\n\nexport function isQuoteInternalCoinsUpdated(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteAInternalCoins = quoteA?.swaps.map((swap) => swap.to.symbol) || [];\n const quoteBInternalCoins = quoteB?.swaps.map((swap) => swap.to.symbol) || [];\n return !areEqual(quoteAInternalCoins, quoteBInternalCoins);\n}\n\nexport function isQuoteChanged(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n): boolean {\n return (\n isNumberOfSwapsChanged(quoteA, quoteB) ||\n isQuoteSwappersUpdated(quoteA, quoteB) ||\n isQuoteInternalCoinsUpdated(quoteA, quoteB)\n );\n}\n\nexport function outToRatioHasWarning(\n fromUsdValue: BigNumber | null,\n outToInRatio: BigNumber | 0\n) {\n return (\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -10 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(200)))) ||\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -5 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(1000))))\n );\n}\n\nexport function getRequiredBalanceOfWallet(\n selectedWallet: Wallet,\n fee: SimulationValidationStatus[] | null\n): SimulationAssetAndAmount[] | null {\n if (fee === null) {\n return null;\n }\n const relatedFeeStatus = fee\n ?.find((item) => item.blockchain === selectedWallet.chain)\n ?.wallets.find(\n (wallet) =>\n wallet.address?.toLowerCase() === selectedWallet.address.toLowerCase()\n );\n if (!relatedFeeStatus) {\n return null;\n }\n return relatedFeeStatus.requiredAssets;\n}\n\nexport function getPriceImpactLevel(\n priceImpact: number\n): PriceImpactWarningLevel {\n let warningLevel: PriceImpactWarningLevel = undefined;\n if (priceImpact <= LOW_PRICE_IMPACT && priceImpact > HIGHT_PRICE_IMPACT) {\n warningLevel = 'low';\n } else if (priceImpact <= HIGHT_PRICE_IMPACT) {\n warningLevel = 'high';\n }\n\n return warningLevel;\n}\n\nexport function findCommonTokens<T extends Asset[], R extends Asset[]>(\n listA: T,\n listB: R\n) {\n const set = new Set();\n\n listA.forEach((token) => set.add(createTokenHash(token)));\n\n return listB.filter((token) => set.has(createTokenHash(token))) as R;\n}\n\nexport function createRetryQuote(\n pendingSwap: PendingSwap,\n blockchains: BlockchainMeta[],\n findToken: FindToken\n): RetryQuote {\n const firstStep = pendingSwap.steps[0];\n const lastStep = pendingSwap.steps[pendingSwap.steps.length - 1];\n const lastSuccessfulStep = getLastSuccessfulStep(pendingSwap.steps);\n\n const toToken = {\n blockchain: lastStep.toBlockchain,\n symbol: lastStep.toSymbol,\n address: lastStep.toSymbolAddress,\n };\n\n const fromBlockchainMeta = findBlockchain(\n lastSuccessfulStep\n ? lastSuccessfulStep.toBlockchain\n : firstStep.fromBlockchain,\n blockchains\n );\n const toBlockchainMeta = findBlockchain(lastStep.toBlockchain, blockchains);\n const fromTokenMeta = findToken(\n lastSuccessfulStep\n ? {\n blockchain: fromBlockchainMeta?.name ?? '',\n symbol: lastSuccessfulStep.toSymbol,\n address: lastSuccessfulStep.toSymbolAddress,\n }\n : {\n blockchain: fromBlockchainMeta?.name ?? '',\n symbol: firstStep.fromSymbol,\n address: firstStep.fromSymbolAddress,\n }\n );\n const toTokenMeta = findToken(toToken);\n const inputAmount = lastSuccessfulStep\n ? lastSuccessfulStep.outputAmount ?? ''\n : pendingSwap.inputAmount;\n\n return {\n fromBlockchain: fromBlockchainMeta,\n fromToken: fromTokenMeta,\n toBlockchain: toBlockchainMeta,\n toToken: toTokenMeta,\n inputAmount,\n };\n}\n\nexport function generateQuoteWarnings(\n quote: SelectedQuote,\n params: {\n fromToken: Token;\n toToken: Token;\n findToken: FindToken;\n userSlippage: number;\n }\n): QuoteWarning | null {\n const { fromToken, toToken, findToken, userSlippage } = params;\n const inputUsdValue = calcOutputUsdValue(\n quote.requestAmount,\n getQuoteFromTokenUsdPrice(quote) || fromToken?.usdPrice\n );\n const outputUsdValue = calcOutputUsdValue(\n quote.outputAmount,\n getQuoteToTokenUsdPrice(quote) || toToken?.usdPrice\n );\n\n if (!!quote && inputUsdValue && outputUsdValue) {\n const priceImpact = getPriceImpact(\n inputUsdValue.toString(),\n outputUsdValue.toString()\n );\n const highValueLoss =\n !!priceImpact && hasHighValueLoss(inputUsdValue, priceImpact);\n\n if (highValueLoss) {\n const totalFee = getTotalFeeInUsd(quote?.swaps, findToken);\n const warningLevel = getPriceImpactLevel(priceImpact);\n return {\n type: QuoteWarningType.HIGH_VALUE_LOSS,\n inputUsdValue,\n outputUsdValue,\n priceImpact,\n totalFee,\n warningLevel,\n };\n }\n } else if (quote && (!inputUsdValue || !outputUsdValue)) {\n return { type: QuoteWarningType.UNKNOWN_PRICE };\n }\n\n const minRequiredSlippage = getMinRequiredSlippage(quote.swaps);\n const highSlippage = userSlippage > HIGH_SLIPPAGE;\n\n if (!hasProperSlippage(params.userSlippage.toString(), minRequiredSlippage)) {\n return {\n type: QuoteWarningType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages: checkSlippageWarnings(quote, userSlippage),\n minRequiredSlippage: minRequiredSlippage,\n };\n } else if (\n highSlippage &&\n parseFloat(minRequiredSlippage ?? '0') < userSlippage\n ) {\n return {\n type: QuoteWarningType.HIGH_SLIPPAGE,\n slippage: userSlippage.toString(),\n };\n }\n\n return null;\n}\n\nexport function getPriceImpact(\n inputUsdValue: BigNumber | string | null,\n outputUsdValue: BigNumber | string | null\n): number | null {\n const outputUsdValueIsInvalid =\n typeof outputUsdValue === 'string'\n ? parseFloat(outputUsdValue) <= 0\n : !outputUsdValue?.gt(0);\n const percentageChange =\n !inputUsdValue || !outputUsdValue || outputUsdValueIsInvalid\n ? null\n : getPercentageChange(\n inputUsdValue.toString(),\n outputUsdValue.toString()\n );\n\n return percentageChange && percentageChange < 0 ? percentageChange : null;\n}\n\nexport const getUniqueBlockchains = (steps: Step[]) => {\n const set = new Set();\n const result: { displayName: string; image: string }[] = [];\n steps.forEach((step) => {\n if (!set.has(step.from.chain.displayName)) {\n set.add(step.from.chain.displayName);\n result.push(step.from.chain);\n }\n if (!set.has(step.to.chain.displayName)) {\n set.add(step.to.chain.displayName);\n result.push(step.to.chain);\n }\n });\n\n return result;\n};\n\nexport const sortQuotesBy = (\n strategy: PreferenceType,\n quotes: MultiRouteResponse['results']\n): MultiRouteResponse['results'] => {\n return quotes.sort((quote1, quote2) => {\n const getScore = (route: MultiRouteSimulationResult) =>\n route.scores?.find((score) => score.preferenceType === strategy)?.score ??\n 0;\n\n const quote1Score = getScore(quote1);\n const quote2Score = getScore(quote2);\n\n if (quote1Score !== quote2Score) {\n return quote2Score - quote1Score;\n }\n\n const lowerQuoteId1 = quote1.requestId.toLowerCase();\n const lowerQuoteId2 = quote2.requestId.toLowerCase();\n\n return lowerQuoteId1.localeCompare(lowerQuoteId2);\n });\n};\n\nexport const getDefaultQuote = (\n currentQuote: SelectedQuote | null,\n quotes: MultiRouteSimulationResult[],\n requestAmount: string\n): SelectedQuote | null => {\n if (!quotes.length) {\n return null;\n }\n if (!currentQuote) {\n // Handle the case where currentQuote is null\n return {\n requestAmount: requestAmount,\n ...quotes[0], // Return the first quote from the quotes array\n };\n }\n // Create a set of swapperIds from the currentQuote swaps\n const currentQuoteSwapperIds = new Set(\n currentQuote.swaps.map((swap) => swap.swapperId)\n );\n\n // Find a quote that matches the currentQuote's swapperIds\n const matchedQuote = quotes.find((quote) => {\n // Create a set of swapperIds from the quote swaps\n const quoteSwapperIds = new Set(quote.swaps.map((swap) => swap.swapperId));\n\n // Check if all swapperIds from the currentQuote are present in the quoteSwapperIds\n return Array.from(currentQuoteSwapperIds).every((swapperId) =>\n quoteSwapperIds.has(swapperId)\n );\n });\n\n // Return the matchedQuote if found, otherwise return the first quote from the quotes array\n return {\n requestAmount: requestAmount,\n ...(matchedQuote || quotes[0]),\n };\n};\n\nexport const sortTags = (tags: RouteTag[]): RouteTag[] => {\n const customSort = (a: RouteTag, b: RouteTag) => {\n const indexA = HIGH_PRIORITY_TAGS.indexOf(a.value);\n const indexB = HIGH_PRIORITY_TAGS.indexOf(b.value);\n\n if (indexA !== -1 && indexB !== -1) {\n return indexA - indexB;\n }\n\n if (indexA !== -1) {\n return -1;\n } else if (indexB !== -1) {\n return 1;\n }\n\n return 0;\n };\n\n return tags.sort(customSort);\n};\n", "import type { I18n } from '@lingui/core';\nimport type { SwapFee, TagValue } from 'rango-sdk';\n\nexport type NameOfFees =\n | 'Swapper Fee'\n | 'Affiliate Fee'\n | 'Outbound network fee'\n | 'Rango Fee'\n | 'Network Fee';\n\nexport function getFeeLabel(fee: NameOfFees, t: I18n['t']): string {\n const data: Record<NameOfFees, string> = {\n 'Network Fee': t('Network Fee'),\n 'Swapper Fee': t('Protocol Fee'),\n 'Affiliate Fee': t('Affiliate Fee'),\n 'Outbound network fee': t('Outbound Fee'),\n 'Rango Fee': t('Rango Fee'),\n };\n return data[fee];\n}\n\nexport type FeesGroup = {\n payable: { [key in NameOfFees]?: SwapFee[] };\n nonePayable: { [key in NameOfFees]?: SwapFee[] };\n};\n\nexport const HIGH_PRIORITY_TAGS: TagValue[] = [\n 'RECOMMENDED',\n 'CENTRALIZED',\n 'LOWEST_FEE',\n 'FASTEST',\n 'HIGH_IMPACT',\n];\n\nexport const GAS_FEE_MAX = 30;\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { FeesGroup, NameOfFees } from '../constants/quote';\nimport type { FetchStatus, FindToken } from '../store/slices/data';\nimport type { ConnectedWallet } from '../store/wallets';\nimport type {\n ConvertedToken,\n QuoteError,\n QuoteWarning,\n RecommendedSlippages,\n SelectedQuote,\n SwapButtonState,\n Wallet,\n} from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type {\n BestRouteRequest,\n BlockchainMeta,\n RecommendedSlippage,\n SwapFee,\n SwapResult,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport {\n type RouteEvent,\n RouteEventType,\n type StepEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nimport { errorMessages } from '../constants/errors';\nimport { swapButtonTitles } from '../constants/messages';\nimport { ZERO } from '../constants/numbers';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../constants/routing';\n\nimport { getBlockchainShortNameFor, isValidTokenAddress } from './meta';\nimport { numberToString } from './numbers';\nimport { getPriceImpact, getRequiredBalanceOfWallet } from './quote';\nimport { getQuoteWallets } from './wallets';\n\nexport function getOutputRatio(\n inputUsdValue: BigNumber | null,\n outputUsdValue: BigNumber | null\n) {\n if (\n !inputUsdValue ||\n !outputUsdValue ||\n inputUsdValue.lte(ZERO) ||\n outputUsdValue.lte(ZERO)\n ) {\n return 0;\n }\n return outputUsdValue\n .div(inputUsdValue)\n .minus(1)\n .multipliedBy(100)\n .toNumber();\n}\n\nexport function hasHighValueLoss(\n inputUsdValue: BigNumber | null,\n priceImpact: number\n): boolean {\n return (\n ((parseInt(priceImpact.toFixed(2) || '0') <= -10 &&\n inputUsdValue?.gte(new BigNumber(400))) ||\n (parseInt(priceImpact.toFixed(2) || '0') <= -5 &&\n inputUsdValue?.gte(new BigNumber(1000)))) ??\n false\n );\n}\n\nexport function hasLimitError(swaps: SwapResult[]): boolean {\n return (\n (swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n }\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n }).length > 0\n );\n}\n\nexport function getLimitErrorMessage(swaps: SwapResult[]): {\n swap: SwapResult;\n fromAmountRangeError: string;\n recommendation: string;\n} {\n const swap = (swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n }\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n })[0];\n\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n\n let fromAmountRangeError = '';\n let recommendation = '';\n if (!isExclusive && !!minimum && minimum.gt(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: >= {min} {symbol}',\n values: {\n min: numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.increaseAmount;\n } else if (isExclusive && !!minimum && minimum.gte(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: > {min} {symbol}',\n values: {\n min: numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.increaseAmount;\n }\n\n if (!isExclusive && !!maximum && maximum.lt(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: <= {max} {symbol}',\n values: {\n max: numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.decreaseAmount;\n } else if (isExclusive && !!maximum && maximum.lte(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: < {max} {symbol}',\n values: {\n max: numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.decreaseAmount;\n }\n\n return { swap, fromAmountRangeError, recommendation };\n}\n\nexport function getSwapButtonState(params: {\n fetchMetaStatus: FetchStatus;\n anyWalletConnected: boolean;\n fetchingQuote: boolean;\n inputAmount: string;\n quote: SelectedQuote | null;\n warning: QuoteWarning | null;\n error: QuoteError | null;\n needsToWarnEthOnPath: boolean;\n}): SwapButtonState {\n const {\n fetchMetaStatus,\n anyWalletConnected,\n fetchingQuote,\n inputAmount,\n quote,\n warning,\n error,\n needsToWarnEthOnPath,\n } = params;\n if (fetchMetaStatus !== 'success') {\n return {\n title: swapButtonTitles().connectWallet,\n action: 'connect-wallet',\n disabled: true,\n };\n }\n if (!anyWalletConnected) {\n return {\n title: swapButtonTitles().connectWallet,\n action: 'connect-wallet',\n disabled: false,\n };\n }\n if (fetchingQuote || !quote || error || !inputAmount || inputAmount === '0') {\n return {\n title: swapButtonTitles().swap,\n action: 'confirm-swap',\n disabled: true,\n };\n } else if (warning) {\n return {\n title: swapButtonTitles().swapAnyway,\n action: 'confirm-warning',\n disabled: false,\n };\n } else if (needsToWarnEthOnPath) {\n return {\n title: swapButtonTitles().ethWarning,\n action: 'confirm-warning',\n disabled: false,\n };\n }\n return {\n title: swapButtonTitles().swap,\n action: 'confirm-swap',\n disabled: false,\n };\n}\n\nexport function canComputePriceImpact(\n quote: SelectedQuote | null,\n inputAmount: string,\n usdValue: BigNumber | null\n) {\n const inputAmountNumber = parseFloat(inputAmount || '0');\n\n return !(\n quote &&\n (!usdValue || usdValue.lte(ZERO)) &&\n inputAmount &&\n inputAmount !== '0' &&\n inputAmountNumber !== 0\n );\n}\n\nexport function getUsdFeeOfStep(\n step: SwapResult,\n findToken: FindToken\n): BigNumber {\n let totalFeeInUsd = ZERO;\n for (let i = 0; i < step.fee.length; i++) {\n const fee = step.fee[i];\n if (fee.expenseType === 'DECREASE_FROM_OUTPUT') {\n continue;\n }\n\n const unitPrice = findToken(fee.asset)?.usdPrice || null;\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(unitPrice || 0)\n );\n }\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeeInUsd(\n swaps: SwapResult[],\n findToken: FindToken\n): BigNumber {\n return swaps.reduce(\n (totalFee: BigNumber, step) =>\n totalFee.plus(getUsdFeeOfStep(step, findToken)),\n ZERO\n );\n}\n\nexport function getUsdFee(fee: SwapFee): BigNumber {\n let totalFeeInUsd = ZERO;\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(fee.price || 0)\n );\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeesInUsd(fees: SwapFee[]): BigNumber {\n return fees.reduce(\n (totalFee: BigNumber, fee) => totalFee.plus(getUsdFee(fee)),\n ZERO\n );\n}\nexport function getFeesGroup(swaps: SwapResult[]): FeesGroup {\n return swaps.reduce(\n (result, swap) => {\n for (const fee of swap.fee) {\n const name = fee.name as NameOfFees;\n const feeGroup =\n fee.expenseType !== 'DECREASE_FROM_OUTPUT'\n ? result.payable\n : result.nonePayable;\n\n feeGroup[name] = [...(feeGroup[name] || []), fee];\n }\n return result;\n },\n { payable: {}, nonePayable: {} } as FeesGroup\n );\n}\n\nexport function hasHighFee(totalFeeInUsd: BigNumber | null) {\n if (!totalFeeInUsd) {\n return false;\n }\n return !totalFeeInUsd.lt(new BigNumber(30));\n}\n\nexport function hasSlippageError(\n slippages: (RecommendedSlippage | null)[] | undefined\n) {\n return (slippages?.filter((s) => !!s?.error)?.length || 0) > 0;\n}\n\nexport function checkSlippageErrors(\n swaps: SwapResult[]\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n swaps.forEach((swap, index) => {\n if (swap.recommendedSlippage?.error) {\n recommendedSlippages.set(index, swap.recommendedSlippage.slippage);\n }\n });\n if (recommendedSlippages.size > 0) {\n return recommendedSlippages;\n }\n return null;\n}\n\nexport function checkSlippageWarnings(\n quote: SelectedQuote,\n userSlippage: number\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n quote?.swaps.forEach((swap, index) => {\n if (\n swap.recommendedSlippage?.slippage &&\n parseFloat(swap.recommendedSlippage.slippage) > userSlippage\n ) {\n recommendedSlippages.set(index, swap.recommendedSlippage.slippage);\n }\n });\n if (recommendedSlippages.size > 0) {\n return recommendedSlippages;\n }\n return null;\n}\n\nexport function getMinRequiredSlippage(swaps: SwapResult[]): string | null {\n const slippages = swaps.map((slippage) => slippage.recommendedSlippage);\n return (\n slippages\n ?.map((s) => s?.slippage || '0')\n ?.filter((s) => parseFloat(s) > 0)\n ?.sort((a, b) => parseFloat(b) - parseFloat(a))\n ?.find(() => true) || null\n );\n}\n\nexport function hasProperSlippage(\n userSlippage: string,\n minRequiredSlippage: string | null\n) {\n if (!minRequiredSlippage) {\n return true;\n }\n return parseFloat(userSlippage) >= parseFloat(minRequiredSlippage);\n}\n\nexport function hasEnoughBalance(\n quote: SelectedQuote,\n selectedWallets: Wallet[]\n) {\n const fee = quote.validationStatus;\n\n if (fee === null || fee.length === 0) {\n return true;\n }\n\n for (const wallet of selectedWallets) {\n const requiredAssets = getRequiredBalanceOfWallet(wallet, fee);\n if (!requiredAssets) {\n continue;\n }\n\n const enoughBalanceInWallet = requiredAssets\n .map((asset) => asset.ok)\n .reduce((previous, current) => previous && current);\n if (!enoughBalanceInWallet) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function hasEnoughBalanceAndProperSlippage(\n quote: SelectedQuote,\n selectedWallets: Wallet[],\n userSlippage: string,\n minRequiredSlippage: string | null\n): boolean {\n return (\n hasEnoughBalance(quote, selectedWallets) &&\n hasProperSlippage(userSlippage, minRequiredSlippage)\n );\n}\n\nexport function createQuoteRequestBody(params: {\n fromToken: Token;\n toToken: Token;\n inputAmount: string;\n wallets?: ConnectedWallet[];\n selectedWallets?: Wallet[];\n liquiditySources?: string[];\n excludeLiquiditySources?: boolean;\n disabledLiquiditySources: string[];\n slippage: number;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n destination?: string;\n enableCentralizedSwappers?: boolean;\n}): BestRouteRequest {\n const {\n fromToken,\n toToken,\n inputAmount,\n wallets,\n selectedWallets,\n disabledLiquiditySources,\n liquiditySources,\n excludeLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n destination,\n enableCentralizedSwappers,\n } = params;\n const selectedWalletsMap = selectedWallets?.reduce(\n (\n selectedWalletsMap: BestRouteRequest['selectedWallets'],\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = selectedWallet.address),\n selectedWalletsMap\n ),\n {}\n );\n\n const connectedWallets: BestRouteRequest['connectedWallets'] = [];\n\n wallets?.forEach((wallet) => {\n connectedWallets.push({\n blockchain: wallet.chain,\n addresses: [wallet.address],\n });\n });\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const requestBody: BestRouteRequest = {\n amount: inputAmount.toString(),\n affiliateRef: affiliateRef ?? undefined,\n affiliatePercent: affiliatePercent ?? undefined,\n affiliateWallets: affiliateWallets ?? undefined,\n from: {\n address: fromToken.address,\n blockchain: fromToken.blockchain,\n symbol: fromToken.symbol,\n },\n to: {\n address: toToken.address,\n blockchain: toToken.blockchain,\n symbol: toToken.symbol,\n },\n connectedWallets,\n selectedWallets: selectedWalletsMap ?? {},\n slippage: slippage.toString(),\n ...(destination && { destination: destination }),\n ...(excludeLiquiditySources && {\n swapperGroups: disabledLiquiditySources.concat(liquiditySources ?? []),\n swappersGroupsExclude: true,\n }),\n ...(!excludeLiquiditySources && {\n swapperGroups: liquiditySources?.filter(\n (liquiditySource) => !disabledLiquiditySources.includes(liquiditySource)\n ),\n swappersGroupsExclude: false,\n }),\n enableCentralizedSwappers,\n };\n return requestBody;\n}\n\nexport function getWalletsForNewSwap(selectedWallets: Wallet[]) {\n const wallets = selectedWallets.reduce(\n (\n selectedWalletsMap: {\n [p: string]: { address: string; walletType: WalletType };\n },\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = {\n address: selectedWallet.address,\n walletType: selectedWallet.walletType,\n }),\n selectedWalletsMap\n ),\n {}\n );\n\n return wallets;\n}\n\nexport function getQuoteOutputAmount(quote: SelectedQuote) {\n return quote?.outputAmount || null;\n}\n\nexport function getPercentageChange(input: string, output: string) {\n return new BigNumber(output)\n .div(new BigNumber(input))\n .minus(1)\n .multipliedBy(100)\n .toNumber();\n}\n\nexport function isOutputAmountChangedALot(\n oldQuote: SelectedQuote,\n newQuote: SelectedQuote\n) {\n const oldOutputAmount = getQuoteOutputAmount(oldQuote);\n const newOutputAmount = getQuoteOutputAmount(newQuote);\n if (!oldOutputAmount || !newOutputAmount) {\n return false;\n }\n const percentageChange = getPriceImpact(oldOutputAmount, newOutputAmount);\n if (!percentageChange) {\n return true;\n }\n\n return percentageChange <= -1;\n}\n\nexport function generateBalanceWarnings(\n quote: SelectedQuote,\n selectedWallets: Wallet[],\n blockchains: BlockchainMeta[]\n) {\n const fee = quote.validationStatus;\n const requiredWallets = getQuoteWallets({ filter: 'required', quote });\n const walletsSortedByRequiredWallets = selectedWallets.sort(\n (selectedWallet1, selectedWallet2) =>\n requiredWallets.indexOf(selectedWallet1.chain) -\n requiredWallets.indexOf(selectedWallet2.chain)\n );\n\n return walletsSortedByRequiredWallets\n .flatMap((wallet) => getRequiredBalanceOfWallet(wallet, fee) || [])\n .filter((asset) => !asset.ok)\n .map((asset) => {\n const symbol = asset.asset.symbol;\n const currentAmount = numberToString(\n new BigNumber(asset.currentAmount.amount).shiftedBy(\n -asset.currentAmount.decimals\n ),\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n const requiredAmount = numberToString(\n new BigNumber(asset.requiredAmount.amount).shiftedBy(\n -asset.requiredAmount.decimals\n ),\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n let reason = '';\n if (asset.reason === 'FEE') {\n reason = i18n.t(' for network fee');\n }\n if (asset.reason === 'INPUT_ASSET') {\n reason = i18n.t(' for swap');\n }\n if (asset.reason === 'FEE_AND_INPUT_ASSET') {\n reason = i18n.t(' for input and network fee');\n }\n const warningMessage = i18n.t({\n id: `Needs \u2248 {requiredAmount} {symbol}{reason}, but you have {currentAmount} {symbol} in your {blockchain} wallet.`,\n values: {\n requiredAmount,\n symbol,\n reason,\n currentAmount,\n blockchain: getBlockchainShortNameFor(\n asset.asset.blockchain,\n blockchains\n ),\n },\n });\n return warningMessage;\n });\n}\n\nexport function calcOutputUsdValue(\n outputAmount?: string,\n tokenPrice?: number | null\n) {\n const amount = !!outputAmount ? new BigNumber(outputAmount) : ZERO;\n\n return amount.multipliedBy(tokenPrice || 0);\n}\n\nexport function isNetworkStatusInWarningState(\n pendingSwapStep: PendingSwapStep | null\n): boolean {\n return (\n !!pendingSwapStep &&\n pendingSwapStep.networkStatus !== null &&\n pendingSwapStep.networkStatus !== PendingSwapNetworkStatus.NetworkChanged\n );\n}\n\nexport function getSwapMessages(\n pendingSwap: PendingSwap,\n currentStep: PendingSwapStep | null\n): {\n shortMessage: string;\n detailedMessage: { content: string; long: boolean };\n} {\n const textForRemove = 'bellow button or';\n let message = pendingSwap.extraMessage;\n let detailedMessage = pendingSwap.extraMessageDetail;\n\n if (pendingSwap.networkStatusExtraMessageDetail?.includes(textForRemove)) {\n pendingSwap.networkStatusExtraMessageDetail =\n pendingSwap.networkStatusExtraMessageDetail.replace(textForRemove, '');\n }\n\n const networkWarningState = isNetworkStatusInWarningState(currentStep);\n\n if (networkWarningState) {\n message = pendingSwap.networkStatusExtraMessage || '';\n detailedMessage = pendingSwap.networkStatusExtraMessageDetail || '';\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n switch (currentStep?.networkStatus) {\n case PendingSwapNetworkStatus.WaitingForConnectingWallet:\n message = message || i18n.t('Waiting for connecting wallet');\n break;\n case PendingSwapNetworkStatus.WaitingForQueue:\n message =\n message || i18n.t('Waiting for other running tasks to be finished');\n break;\n case PendingSwapNetworkStatus.WaitingForNetworkChange:\n message = message || i18n.t('Waiting for changing wallet network');\n break;\n default:\n message = message || '';\n break;\n }\n }\n detailedMessage = detailedMessage || '';\n message = message || '';\n const isRpc =\n message?.indexOf('code') !== -1 && message?.indexOf('reason') !== -1;\n\n return {\n shortMessage: message,\n detailedMessage: { content: detailedMessage, long: isRpc },\n };\n}\n\nexport function getLastConvertedTokenInFailedSwap(\n pendingSwap: PendingSwap\n): ConvertedToken {\n let resultToken: ConvertedToken = null;\n if (pendingSwap.status === 'failed') {\n const lastSuccessStep = pendingSwap.steps\n .slice()\n .reverse()\n .filter((step) => step.status === 'success')[0];\n\n if (lastSuccessStep) {\n resultToken = {\n blockchain: lastSuccessStep.toBlockchain,\n symbol: lastSuccessStep.toSymbol,\n outputAmount: lastSuccessStep.outputAmount,\n address: lastSuccessStep.toSymbolAddress,\n };\n }\n }\n return resultToken;\n}\n\nexport function shouldRetrySwap(pendingSwap: PendingSwap) {\n return pendingSwap.status === 'failed';\n}\n\nexport function isConfirmSwapDisabled(\n fetching: boolean,\n isCustomDestinationOpen: boolean,\n customDestination: string | null,\n quote: SelectedQuote | null,\n selectedWallets: { walletType: string; chain: string }[],\n lastStepToBlockchain: BlockchainMeta | undefined\n): boolean {\n if (!quote || fetching) {\n return true;\n }\n\n const allWallets = getQuoteWallets({ filter: 'all', quote });\n\n const requiredWallets = getQuoteWallets({ filter: 'required', quote });\n\n const everyWalletSelected = allWallets.every((blockchain) =>\n selectedWallets.some(\n (selectedWallet) => selectedWallet.chain === blockchain\n )\n );\n\n const everyRequiredWalletSelected = requiredWallets.every((wallet) =>\n selectedWallets.some((selectedWallet) => selectedWallet.chain === wallet)\n );\n\n const customDestinationIsValid =\n customDestination && lastStepToBlockchain\n ? isValidTokenAddress(lastStepToBlockchain, customDestination)\n : false;\n\n return (\n (!isCustomDestinationOpen && !everyWalletSelected) ||\n (isCustomDestinationOpen && !customDestination) ||\n (isCustomDestinationOpen &&\n !!customDestination &&\n (!customDestinationIsValid || !everyRequiredWalletSelected))\n );\n}\n\nexport function isTokensIdentical(tokenA: Token, tokenB: Token) {\n return (\n tokenA.blockchain === tokenB.blockchain &&\n tokenA.symbol === tokenB.symbol &&\n tokenA.address === tokenB.address\n );\n}\n\nexport function isSwapFinished(event: RouteEvent | StepEvent) {\n return (\n event.type === RouteEventType.FAILED ||\n event.type === RouteEventType.SUCCEEDED\n );\n}\n", "import type { QuoteError } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { QuoteErrorType } from '../types';\n\nexport const errorMessages = () => {\n return {\n genericServerError: i18n.t('Failed Network, Please retry your swap.'),\n liquiditySourcesError: {\n title: i18n.t('Please reset your liquidity sources.'),\n description: i18n.t(\n 'You have limited the liquidity sources and this might result in Rango finding no routes. Please consider resetting your liquidity sources.'\n ),\n },\n noResultError: {\n title: i18n.t('No Routes Found.'),\n description: i18n.t(\n \"Reasons why Rango couldn't find a route: low liquidity on token, very low input amount or no routes available for the selected input/output token combination.\"\n ),\n },\n bridgeLimitErrors: {\n increaseAmount: i18n.t(\n 'Bridge Limit Error: Please increase your amount.'\n ),\n decreaseAmount: i18n.t(\n 'Bridge Limit Error: Please decrease your amount.'\n ),\n },\n highValueLossError: {\n impactTitle: i18n.t('High Price Impact'),\n title: i18n.t('Price impact is too high!'),\n description: i18n.t(\n 'The price impact is significantly higher than the allowed amount.'\n ),\n confirmMessage: i18n.t('Confirm high price impact'),\n },\n quoteUpdatedWithHighValueLoss: {\n title: i18n.t(\n 'Route updated and price impact is too high, try again later!'\n ),\n },\n unknownPriceError: {\n impactTitle: i18n.t('USD Price Unknown'),\n title: i18n.t('USD Price Unknown, Cannot calculate Price Impact.'),\n description: i18n.t(\n 'USD Price Unknown, Cannot calculate Price Impact. The price impact may be higher than usual. Are you sure to continue the Swap?'\n ),\n confirmMessage: i18n.t('Confirm USD Price Unknown'),\n },\n };\n};\n\nexport function getQuoteErrorMessage(error: QuoteError) {\n switch (error.type) {\n case QuoteErrorType.NO_RESULT:\n return error.diagnosisMessage ?? errorMessages().noResultError.title;\n case QuoteErrorType.REQUEST_FAILED:\n return errorMessages().genericServerError;\n default:\n return '';\n }\n}\n", "import { i18n } from '@lingui/core';\n\nexport const swapButtonTitles = () => {\n return {\n connectWallet: i18n.t('Connect Wallet'),\n swap: i18n.t('Swap'),\n swapAnyway: i18n.t('Swap anyway'),\n ethWarning: i18n.t('The route goes through Ethereum. Continue?'),\n };\n};\n", "import { useEffect, useRef } from 'react';\nimport {\n useInRouterContext,\n useLocation,\n useSearchParams,\n} from 'react-router-dom';\n\nimport { SearchParams } from '../../constants/searchParams';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\n\nimport {\n convertTokenSearchParamToAsset,\n tokenToSearchParam,\n} from './useSyncUrlAndStore.helpers';\n\nexport function useSyncUrlAndStore() {\n const location = useLocation();\n const [searchParams, setSearchParams] = useSearchParams();\n const {\n fromBlockchain,\n toBlockchain,\n fromToken,\n toToken,\n inputAmount,\n setFromBlockchain,\n setToBlockchain,\n setFromToken,\n setToToken,\n setInputAmount,\n } = useQuoteStore();\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const isInRouterContext = useInRouterContext();\n const { updateIframe, updateCampaignMode } = useAppStore();\n const campaignMode = useAppStore().isInCampaignMode();\n const liquiditySourcesParamsRef = useRef<string>();\n const { findToken } = useAppStore();\n const getUrlSearchParams = () => {\n const utmQueryParams: Record<string, string> = {};\n\n for (const [key, value] of searchParams.entries()) {\n if (key.startsWith('utm_')) {\n utmQueryParams[key] = value;\n }\n }\n const fromAmount = searchParams.get(SearchParams.FROM_AMOUNT);\n const fromBlockchain = searchParams.get(SearchParams.FROM_BLOCKCHAIN);\n const fromToken = searchParams.get(SearchParams.FROM_TOKEN);\n const toBlockchain = searchParams.get(SearchParams.TO_BLOCKCHAIN);\n const toToken = searchParams.get(SearchParams.TO_TOKEN);\n const autoConnect = searchParams.get(SearchParams.AUTO_CONNECT);\n const clientUrl = searchParams.get(SearchParams.CLIENT_URL);\n const liquiditySources = searchParams.get(SearchParams.LIQUIDITY_SOURCES);\n\n const blockchain = searchParams.get(SearchParams.BLOCKCHAIN);\n\n return {\n fromAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n autoConnect,\n clientUrl,\n liquiditySources,\n utmQueryParams,\n blockchain,\n };\n };\n\n const updateUrlSearchParams = (\n searchParams: Record<string, string | undefined>\n ) => {\n for (const property in searchParams) {\n if (!searchParams[property]) {\n delete searchParams[property];\n }\n }\n setSearchParams(searchParams as Record<string, string>, { replace: true });\n };\n\n useEffect(() => {\n const { autoConnect, clientUrl, utmQueryParams, blockchain } =\n getUrlSearchParams();\n if (isInRouterContext && fetchMetaStatus === 'success') {\n updateUrlSearchParams({\n [SearchParams.FROM_BLOCKCHAIN]: fromBlockchain?.name,\n [SearchParams.FROM_TOKEN]: tokenToSearchParam(fromToken),\n [SearchParams.TO_BLOCKCHAIN]: toBlockchain?.name,\n [SearchParams.TO_TOKEN]: tokenToSearchParam(toToken),\n [SearchParams.FROM_AMOUNT]: inputAmount,\n [SearchParams.AUTO_CONNECT]: autoConnect ?? undefined,\n [SearchParams.CLIENT_URL]: clientUrl ?? undefined,\n [SearchParams.BLOCKCHAIN]: blockchain ?? undefined,\n [SearchParams.LIQUIDITY_SOURCES]: campaignMode\n ? liquiditySourcesParamsRef.current\n : undefined,\n ...utmQueryParams,\n });\n }\n }, [\n location.pathname,\n inputAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n campaignMode,\n ]);\n\n useEffect(() => {\n if (!isInRouterContext) {\n return;\n }\n\n const searchParams = getUrlSearchParams();\n\n if (!liquiditySourcesParamsRef.current && searchParams.liquiditySources) {\n liquiditySourcesParamsRef.current = searchParams.liquiditySources;\n }\n\n if (searchParams.fromAmount) {\n setInputAmount(searchParams.fromAmount);\n }\n\n if (fetchMetaStatus === 'success') {\n const fromBlockchain = blockchains.find(\n (blockchain) => blockchain.name === searchParams.fromBlockchain\n );\n\n const fromToken =\n searchParams.fromToken && fromBlockchain\n ? findToken(\n convertTokenSearchParamToAsset(\n searchParams.fromToken,\n fromBlockchain\n )\n )\n : undefined;\n const toBlockchain = blockchains.find(\n (blockchain) => blockchain.name === searchParams.toBlockchain\n );\n\n const toToken =\n searchParams.toToken && toBlockchain\n ? findToken(\n convertTokenSearchParamToAsset(searchParams.toToken, toBlockchain)\n )\n : undefined;\n\n if (!!fromBlockchain) {\n setFromBlockchain(fromBlockchain);\n if (!!fromToken) {\n setFromToken({\n token: fromToken,\n meta: {\n blockchains: blockchains,\n tokens: tokens,\n },\n });\n }\n }\n\n if (!!toBlockchain) {\n setToBlockchain(toBlockchain);\n if (!!toToken) {\n setToToken({\n token: toToken,\n meta: { blockchains: blockchains, tokens: tokens },\n });\n }\n }\n }\n }, [fetchMetaStatus]);\n\n useEffect(() => {\n const { clientUrl, liquiditySources } = getUrlSearchParams();\n // We run this only once, because if the app is embedded into an iframe, the data in url for iframe will not change.\n updateIframe('clientUrl', clientUrl || undefined);\n\n updateCampaignMode(\n 'liquiditySources',\n liquiditySources?.split(',') ?? undefined\n );\n }, []);\n}\n", "import type { Asset, BlockchainMeta, Token } from 'rango-sdk';\n\nexport function convertTokenSearchParamToAsset(\n searchParam: string,\n chain: BlockchainMeta\n): Asset {\n const symbolAndAddress = searchParam.split('--');\n\n return {\n blockchain: chain.name,\n address: symbolAndAddress?.[1] || null,\n symbol: symbolAndAddress[0],\n };\n}\n\nexport function tokenToSearchParam(token: Token | null): string | undefined {\n if (token) {\n return `${token.symbol}${token.address ? `--${token.address}` : ''}`;\n }\n return undefined;\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Alert,\n Button,\n darkTheme,\n Divider,\n DoneIcon,\n MessageBox,\n styled,\n TextField,\n Typography,\n} from '@rango-dev/ui';\nimport { type Token } from 'rango-sdk';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\n\nimport { BlockchainSelectorButton } from '../components/BlockchainSelectorButton';\nimport { WatermarkedModal } from '../components/common/WatermarkedModal';\nimport { CustomTokenModal } from '../components/CustomTokenModal';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { SearchParams } from '../constants/searchParams';\nimport { useFetchCustomToken } from '../hooks/useFetchCustomToken';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { getContainer } from '../utils/common';\nimport { findBlockchain, isValidTokenAddress } from '../utils/meta';\n\nconst Content = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n flexDirection: 'column',\n flex: 1,\n '& ._text-field': {\n padding: '$4 $10',\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n borderRadius: '$sm',\n height: '$40',\n },\n});\nconst CUSTOM_TOKEN_REFRESH_DELAY = 1000;\n\nexport function AddCustomTokenPage() {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const navigateBack = useNavigateBack();\n const { setCustomToken } = useAppStore();\n const blockchains = useAppStore().blockchains();\n\n const blockchainName = searchParams.get(SearchParams.BLOCKCHAIN) || '';\n const blockchain = findBlockchain(blockchainName, blockchains);\n const [address, setAddress] = useState('');\n const [isOpenErrorModal, setIsOpenErrorModal] = useState<boolean>(false);\n const [token, setToken] = useState<Token>();\n const { fetchCustomToken, loading, error } = useFetchCustomToken();\n const [networkError, setNetworkError] = useState('');\n const isValidAddress =\n !!blockchain && isValidTokenAddress(blockchain, address);\n const isImportDisabled = !blockchain || !address || !isValidAddress;\n\n const getCustomToken = async () => {\n if (blockchain) {\n try {\n const res = await fetchCustomToken({\n blockchain: blockchainName,\n tokenAddress: address,\n });\n setNetworkError('');\n if (!!res) {\n setToken(res);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (error.message === 'Failed to fetch') {\n setNetworkError(i18n.t('Network Error'));\n setIsOpenErrorModal(true);\n }\n }\n }\n };\n\n const closeErrorModal = () => {\n if (!!error) {\n setAddress('');\n }\n setIsOpenErrorModal(false);\n };\n\n const handleErrorModalButtonClick = async () => {\n if (!!networkError) {\n setTimeout(async () => {\n await getCustomToken();\n }, CUSTOM_TOKEN_REFRESH_DELAY);\n }\n closeErrorModal();\n };\n\n useEffect(() => {\n if (!!error) {\n setIsOpenErrorModal(true);\n }\n }, [error]);\n return (\n <Layout\n header={{\n title: i18n.t('Add Custom Token'),\n }}>\n <PageContainer>\n <Content>\n <div>\n <BlockchainSelectorButton\n onClick={() =>\n navigate(navigationRoutes.blockchains, { replace: true })\n }\n hasLogo={!!blockchain?.logo}\n value={\n !!blockchain\n ? {\n name: blockchain.displayName,\n logo: blockchain.logo,\n }\n : undefined\n }\n title={i18n.t('Select chain')}\n placeholder={i18n.t('Select chain')}\n />\n <Divider size={'24'} />\n <Typography size=\"large\" variant=\"label\">\n {i18n.t('Enter Address')}\n </Typography>\n <Divider size={10} />\n <TextField\n fullWidth\n disabled={!blockchain}\n variant=\"contained\"\n placeholder={i18n.t('Enter token address')}\n size=\"large\"\n value={address}\n suffix={\n !!address &&\n isValidAddress && <DoneIcon color=\"success\" size={12} />\n }\n onChange={(e) => setAddress(e.target.value)}\n />\n {!isValidAddress && !!address && (\n <>\n <Divider size={4} />\n <Alert type=\"error\" variant=\"alarm\" title=\"Invalid Address\" />\n </>\n )}\n </div>\n\n <Button\n disabled={isImportDisabled}\n type=\"primary\"\n variant=\"contained\"\n loading={loading}\n size=\"large\"\n onClick={getCustomToken}>\n {i18n.t('Import')}\n </Button>\n </Content>\n <WatermarkedModal\n open={isOpenErrorModal}\n dismissible\n onClose={closeErrorModal}\n container={getContainer()}>\n <MessageBox\n title={error?.title || networkError}\n type=\"error\"\n description={\n error?.message || i18n.t('Failed Network, Please retry.')\n }>\n <Divider size={40} />\n <Divider size={10} />\n\n <Button\n variant=\"contained\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={handleErrorModalButtonClick}>\n {networkError\n ? i18n.t('Retry')\n : i18n.t('Add another custom token')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n {blockchain && token && (\n <CustomTokenModal\n blockchain={blockchain}\n token={token}\n onSubmitClick={() => {\n if (token) {\n setCustomToken(token);\n setToken(undefined);\n navigateBack();\n }\n }}\n onClose={() => setToken(undefined)}\n open={!!blockchain && !!token}\n />\n )}\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './BlockchainSelectorButton.types';\n\nimport { ChevronRightIcon, Divider, Image, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n Container,\n FlexContainer,\n InputContainer,\n} from './BlockchainSelectorButton.styles';\n\nexport function BlockchainSelectorButton(props: PropTypes) {\n const { onClick, value, title, hasLogo, placeholder, disabled } = props;\n\n return (\n <Container>\n <Typography size=\"large\" variant=\"label\">\n {title}\n </Typography>\n <Divider size={10} />\n <InputContainer\n onClick={disabled ? undefined : onClick}\n disabled={disabled}>\n <FlexContainer>\n {hasLogo && (\n <>\n <Image\n src={value?.logo}\n size={16}\n useAsPlaceholder={!value?.logo}\n type=\"circular\"\n />\n <Divider size={4} direction=\"horizontal\" />\n </>\n )}\n <Typography\n className=\"title_typography\"\n size=\"medium\"\n variant=\"label\">\n {value?.name || placeholder}\n </Typography>\n </FlexContainer>\n <ChevronRightIcon size={12} color=\"black\" />\n </InputContainer>\n </Container>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const InputContainer = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n height: '$40',\n padding: '$4 $10',\n borderRadius: '$sm',\n cursor: 'pointer',\n alignItems: 'center',\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n\n '&:hover': {\n backgroundColor: '$secondary100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral500',\n },\n },\n variants: {\n disabled: {\n true: {\n cursor: 'default',\n '&:hover': {\n borderColor: '$neutral300',\n '& svg': {\n color: '$neutral700',\n },\n },\n },\n },\n },\n});\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n '.title_typography': {\n textTransform: 'capitalize',\n },\n});\n\nexport const FlexContainer = styled('div', {\n display: 'flex',\n});\n", "import type { PropTypes } from './CustomTokenModal.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n ExternalLinkIcon,\n Image,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { generateExplorerLink } from './CustomTokenModal.helpers';\nimport { Container, StyledLink } from './CustomTokenModal.styles';\n\nexport function CustomTokenModal(props: PropTypes) {\n const { open, onClose, token, onSubmitClick, blockchain } = props;\n\n const explorerLink = generateExplorerLink(token.address, blockchain);\n\n return (\n <WatermarkedModal\n open={open}\n dismissible\n onClose={onClose}\n container={getContainer()}>\n <Container>\n <Image src={token.image} size={45} type=\"circular\" />\n <Typography variant=\"title\" size=\"medium\">\n {token.name}\n </Typography>\n <Typography variant=\"body\" size=\"small\" className=\"_blockchain-name\">\n {blockchain.displayName}\n </Typography>\n <Divider size={4} />\n\n <Typography variant=\"body\" size=\"medium\">\n {!!explorerLink ? (\n <StyledLink\n hasHover\n href={explorerLink}\n target=\"_blank\"\n rel=\"nofollow noreferrer\">\n {token.address}\n <ExternalLinkIcon size={12} color=\"gray\" />\n </StyledLink>\n ) : (\n <StyledLink>{token.address}</StyledLink>\n )}\n </Typography>\n\n <Divider size={4} />\n\n {token.coinSource && (\n <Typography className=\"_coin-source\" variant=\"body\" size=\"xsmall\">\n {i18n.t('via')}{' '}\n <Typography\n className=\"_coin-source-name\"\n variant=\"body\"\n size=\"xsmall\">\n {token.coinSource}\n </Typography>\n </Typography>\n )}\n <Divider size={'32'} />\n\n <Typography\n size=\"medium\"\n variant=\"body\"\n className=\"_custom-token-description\">\n {i18n.t(\n `This token doesn't appear on the active token list(s). Make sure this is the token that you want to trade.`\n )}\n </Typography>\n </Container>\n <Divider size={40} />\n <Divider size={10} />\n\n <Button\n variant=\"contained\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onSubmitClick}>\n {i18n.t('Import')}\n </Button>\n </WatermarkedModal>\n );\n}\n", "import type { BlockchainMeta } from 'rango-types';\n\nexport function generateExplorerLink(\n address: string | null,\n blockchain: BlockchainMeta\n): string {\n // We don't have Cosmos explorer url in API.\n if (blockchain.type === 'COSMOS') {\n return '';\n }\n\n const explorerLinkPattern = blockchain.info?.addressUrl;\n\n if (!explorerLinkPattern || !address) {\n return '';\n }\n\n return explorerLinkPattern.replace('{wallet}', address);\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const StyledLink = styled('a', {\n textDecoration: 'none',\n color: '$colors$neutral700',\n [`.${darkTheme} &`]: {\n color: '$colors$neutral900',\n },\n\n '& svg': {\n marginLeft: '$4',\n color: '$colors$neutral700',\n [`.${darkTheme} &`]: {\n color: '$colors$neutral900',\n },\n },\n\n variants: {\n hasHover: {\n true: {\n '&:hover': {\n color: '$colors$secondary550',\n [`.${darkTheme} &`]: {\n color: '$colors$secondary500',\n },\n '& svg': {\n color: '$colors$secondary550',\n [`.${darkTheme} &`]: {\n color: '$colors$secondary500',\n },\n },\n },\n },\n false: {},\n },\n },\n});\n\nexport const Container = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n alignItems: 'center',\n textAlign: 'center',\n '& ._blockchain-name, & ._coin-source': {\n color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n color: '$colors$neutral800',\n },\n },\n '& ._coin-source-name, & ._custom-token-description': {\n color: '$colors$neutral700',\n [`.${darkTheme} &`]: {\n color: '$colors$neutral900',\n },\n },\n});\n", "import type { PropTypes } from './Layout.types';\nimport type { PendingSwap } from 'rango-types';\nimport type { PropsWithChildren } from 'react';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { BottomLogo, Divider, Header } from '@rango-dev/ui';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useIframe } from '../../hooks/useIframe';\nimport { isAppLoadedIntoIframe } from '../../hooks/useIframe/useIframe.helpers';\nimport { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\nimport { tabManager, useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { getPendingSwaps } from '../../utils/queue';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { ActivateTabAlert } from '../common/ActivateTabAlert';\nimport { ActivateTabModal } from '../common/ActivateTabModal';\nimport { BackButton, CancelButton, WalletButton } from '../HeaderButtons';\nimport { RefreshModal } from '../RefreshModal';\n\nimport { onScrollContentAttachStatusToContainer } from './Layout.helpers';\nimport { Container, Content, Footer, LayoutContainer } from './Layout.styles';\n\nfunction Layout(props: PropsWithChildren<PropTypes>) {\n const { connectHeightObserver, disconnectHeightObserver } = useIframe();\n const { children, header, footer, height = 'fixed' } = props;\n const { fetchStatus } = useAppStore();\n const [openRefreshModal, setOpenRefreshModal] = useState(false);\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const {\n config: { features, theme },\n } = useAppStore();\n const { watermark } = useUiStore();\n\n const hasWatermark = watermark === 'FULL';\n const { activeTheme } = useTheme(theme || {});\n\n const isConnectWalletHidden = isFeatureHidden(\n 'connectWalletButton',\n features\n );\n\n const {\n isActiveTab,\n tabManagerInitiated,\n showActivateTabModal,\n setShowActivateTabModal,\n activateCurrentTab,\n } = useUiStore();\n const navigateBack = useNavigateBack();\n const { manager } = useManager();\n const pendingSwaps: PendingSwap[] = getPendingSwaps(manager).map(\n ({ swap }) => swap\n );\n const hasRunningSwap = pendingSwaps.some((swap) => swap.status === 'running');\n\n const onActivateTab = () =>\n activateCurrentTab(tabManager.forceClaim, hasRunningSwap);\n\n const onConnectWallet = () => {\n header.onWallet?.();\n };\n\n const showBackButton =\n typeof header.hasBackButton === 'undefined' || header.hasBackButton;\n\n const scrollViewRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const isIframe = isAppLoadedIntoIframe();\n\n // This feature only will be available in an iframe context.\n if (isIframe && containerRef.current) {\n connectHeightObserver(containerRef.current);\n }\n\n return () => {\n disconnectHeightObserver();\n };\n }, []);\n\n useEffect(() => {\n scrollViewRef.current?.addEventListener(\n 'scroll',\n onScrollContentAttachStatusToContainer\n );\n return () => {\n scrollViewRef.current?.removeEventListener(\n 'scroll',\n onScrollContentAttachStatusToContainer\n );\n };\n }, []);\n\n useEffect(() => {\n setOpenRefreshModal(fetchStatus === 'failed');\n }, [fetchStatus]);\n\n return (\n <Container\n height={height}\n id={WIDGET_UI_ID.SWAP_BOX_ID}\n className={`${activeTheme()} ${LayoutContainer()}`}\n ref={containerRef}>\n <Header\n prefix={\n showBackButton ? (\n <BackButton\n onClick={() => {\n navigateBack();\n // As an example, used in routes page to add a custom logic when navigating back to the home page.\n header.onBack && header.onBack();\n }}\n />\n ) : null\n }\n title={header.title}\n suffix={\n <>\n {header.suffix}\n {header.onWallet && !isConnectWalletHidden && (\n <WalletButton\n container={getContainer()}\n onClick={onConnectWallet}\n isConnected={!!connectedWallets?.length}\n />\n )}\n {header.onCancel && <CancelButton onClick={header.onCancel} />}\n </>\n }\n />\n <Content ref={scrollViewRef}>{children}</Content>\n <ActivateTabModal\n open={showActivateTabModal}\n onClose={() => setShowActivateTabModal(false)}\n onConfirm={onActivateTab}\n />\n\n <Footer>\n <div className=\"footer__content\">\n {tabManagerInitiated && !isActiveTab && (\n <div className=\"footer__alert\">\n <ActivateTabAlert onActivateTab={onActivateTab} />\n <Divider size={10} />\n </div>\n )}\n {footer}\n </div>\n\n <Divider size={12} />\n\n <div\n className={`footer__logo ${\n hasWatermark ? 'logo__show' : 'logo__hidden'\n }`}>\n <BottomLogo />\n </div>\n </Footer>\n <RefreshModal\n open={openRefreshModal}\n onClose={() => setOpenRefreshModal(false)}\n />\n </Container>\n );\n}\nexport { Layout };\n", "import type { Messages } from './useIframe.types';\n\nimport { useRef } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { isAppLoadedIntoIframe } from './useIframe.helpers';\n\ninterface UseIframe {\n send: (message: Messages) => void;\n connectHeightObserver: (element: HTMLElement) => void;\n disconnectHeightObserver: () => void;\n}\n\nfunction useIframe(): UseIframe {\n const heightObserver = useRef<ResizeObserver | null>(null);\n const { iframe } = useAppStore();\n const isMessagePassingAvailable = isAppLoadedIntoIframe() && iframe.clientUrl;\n\n const send = (message: Messages) => {\n if (isMessagePassingAvailable) {\n window.top?.postMessage(message, iframe.clientUrl!);\n }\n };\n\n const connectHeightObserver = (element: HTMLElement) => {\n heightObserver.current = new ResizeObserver((entries) => {\n for (const entry of entries) {\n send({\n type: 'widget_height',\n data: {\n height: entry.contentRect.height,\n },\n });\n }\n });\n\n heightObserver.current.observe(element);\n };\n\n const disconnectHeightObserver = () => {\n if (heightObserver.current) {\n heightObserver.current.disconnect();\n heightObserver.current = null;\n }\n };\n\n return {\n send,\n connectHeightObserver,\n disconnectHeightObserver,\n };\n}\n\nexport { useIframe };\n", "export function isAppLoadedIntoIframe() {\n return window.self !== window.top;\n}\n", "import { useNavigate } from 'react-router-dom';\n\nexport function useNavigateBack(): () => void {\n const navigate = useNavigate();\n return () => navigate(-1);\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport {\n createTheme,\n darkTheme as defaultDarkTheme,\n lightTheme as defaultLightTheme,\n} from '@rango-dev/ui';\nimport { useEffect, useState } from 'react';\n\nimport { DEFAULT_FONT_FAMILY } from '../constants/fonts';\nimport { useAppStore } from '../store/AppStore';\nimport { type WidgetTheme } from '../types';\nimport {\n DEFAULT_PRIMARY_RADIUS,\n DEFAULT_SECONDARY_RADIUS,\n} from '../utils/configs';\nimport { customizedThemeTokens } from '../utils/ui';\n\nfunction doesWindowPreferDarkColorScheme() {\n return (\n window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches\n );\n}\n\nexport function useTheme(props: WidgetTheme) {\n const {\n colors,\n fontFamily = DEFAULT_FONT_FAMILY,\n borderRadius = DEFAULT_PRIMARY_RADIUS,\n secondaryBorderRadius = DEFAULT_SECONDARY_RADIUS,\n } = props;\n\n const [OSTheme, setOSTheme] = useState(\n doesWindowPreferDarkColorScheme() ? 'dark' : 'light'\n );\n\n const { theme } = useAppStore();\n\n const { dark, light } = customizedThemeTokens(colors);\n\n const baseTheme = createTheme({\n shadows: props.shadows || {},\n radii: {\n primary: `${borderRadius}px`,\n secondary: `${secondaryBorderRadius}px`,\n },\n fonts: {\n widget: fontFamily,\n },\n });\n const lightThemeClasses = [baseTheme.className, defaultLightTheme.className];\n const darkThemeClasses = [baseTheme.className, defaultDarkTheme.className];\n\n /*\n * If theme has been customized, we will push the customized theme to override the default themes.\n * To be overridden, it should be last thing that has been pushed.\n */\n if (light) {\n const customizedLightTheme = createTheme(light.id, light.tokens);\n lightThemeClasses.push(customizedLightTheme.className);\n }\n if (dark) {\n const customizedDarkTheme = createTheme(dark.id, dark.tokens);\n darkThemeClasses.push(customizedDarkTheme.className);\n }\n\n useEffect(() => {\n const switchThemeListener = (event: MediaQueryListEvent) => {\n if (event.matches) {\n setOSTheme('dark');\n } else {\n setOSTheme('light');\n }\n };\n\n if (doesWindowPreferDarkColorScheme()) {\n setOSTheme('dark');\n }\n\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .addEventListener('change', switchThemeListener);\n return () => {\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .removeEventListener('change', switchThemeListener);\n };\n }, []);\n\n const getActiveTheme = () => {\n const lightClassNames = lightThemeClasses.join(' ');\n const darkClassNames = darkThemeClasses.join(' ');\n if (theme === 'auto') {\n return OSTheme === 'dark' ? darkClassNames : lightClassNames;\n }\n\n return theme === 'dark' ? darkClassNames : lightClassNames;\n };\n\n return {\n activeTheme: getActiveTheme,\n mode: theme === 'auto' ? OSTheme : theme,\n };\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { WidgetTheme } from '../types';\nimport type { createTheme } from '@rango-dev/ui';\n\nimport {\n theme as baseThemeTokens,\n darkColors as defaultDarkColors,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { expandToGenerateThemeColors } from '../utils/colors';\nimport { toHash } from '../utils/hash';\n\nimport { THEME_CLASS_NAME_PREFIX } from './configs';\n\ntype Tokens = Parameters<typeof createTheme>[0];\ninterface CustomizedThemeValues {\n id: string;\n tokens: Tokens;\n}\n\ninterface CustomizedTheme {\n light: undefined | CustomizedThemeValues;\n dark: undefined | CustomizedThemeValues;\n}\n\nexport function customizedThemeTokens(\n colors: WidgetTheme['colors']\n): CustomizedTheme {\n const baseColors = baseThemeTokens.colors;\n const baseDarkColors = {\n ...baseColors,\n ...defaultDarkColors,\n };\n let lightTheme: CustomizedTheme['light'] = undefined;\n let darkTheme: CustomizedTheme['dark'] = undefined;\n\n if (colors?.light) {\n const lightColors = expandToGenerateThemeColors(baseColors, colors.light);\n const tokens = { colors: lightColors };\n const id = `${THEME_CLASS_NAME_PREFIX}-light-${toHash(tokens)}`;\n lightTheme = {\n id,\n tokens: tokens as Tokens,\n };\n }\n\n if (colors?.dark) {\n const darkColors = expandToGenerateThemeColors(\n baseDarkColors,\n colors.dark,\n {\n reverseNeutralRange: true,\n }\n );\n const tokens = { colors: darkColors };\n const id = `${THEME_CLASS_NAME_PREFIX}-dark-${toHash(tokens)}`;\n darkTheme = {\n id,\n tokens: tokens as Tokens,\n };\n }\n\n return {\n light: lightTheme,\n dark: darkTheme,\n };\n}\n\nexport function joinList(\n list: { element: React.JSX.Element; key: string }[],\n divider: React.JSX.Element\n) {\n if (list.length <= 1) {\n return list.map(({ element, key }) => React.cloneElement(element, { key }));\n }\n\n const output: React.JSX.Element[] = [];\n list.forEach((item, index) => {\n const { element, key } = item;\n output.push(React.cloneElement(element, { key }));\n if (index < list.length - 1) {\n const key = `divider-${index}`;\n output.push(React.cloneElement(divider, { key }));\n }\n });\n\n return output;\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n// Types\nimport type { ThemeColors, WidgetColors, WidgetColorsKeys } from '../types';\n\ntype RGB = {\n red: number;\n green: number;\n blue: number;\n};\n\ntype ShadeOrTintFunction = (rgb: RGB, step: number) => RGB;\n\nconst HEX_BASE = 16;\nconst MAX_COLOR_VALUE = 255;\nconst PERCENT = 0.11;\n\n// Utility Functions\n\nfunction expandShortHexColor(hexColor: string) {\n // Remove '#' if it exists\n if (hexColor.startsWith('#')) {\n hexColor = hexColor.slice(1);\n }\n\n // Check if the hexColor has a length of 3\n if (hexColor.length === 3) {\n // Convert the string to an array of characters\n const characters = hexColor.split('');\n\n // Duplicate each character and combine them into a single string\n const expandedHex = characters.reduce(function (acc, char) {\n return acc + char + char;\n }, '');\n\n // Return the resulting 6-character hex color\n return `#${expandedHex}`;\n }\n\n // Return the original hexColor if it's not 3 characters\n return `#${hexColor}`;\n}\n\n/*\n * We letting users to override some specific colors (e.g. `primary550`, `secondary100`).\n * So we are generating a range of colors if `primary` (or other keys) has passed but if user is passing a specific color,\n * we will override the user color to generated range.\n */\nfunction isOverridingColor(colorKey: string): boolean {\n return /[0-9]+$/.test(colorKey);\n}\n\n// pad a hexadecimal string with zeros if it needs it\nfunction pad(number: string, length: number) {\n return number.padStart(length, '0');\n}\n\n// Convert an integer to a 2-character hex string\nfunction intToHex(value: number) {\n const clampedValue = Math.min(\n Math.max(Math.round(value), 0),\n MAX_COLOR_VALUE\n );\n return pad(clampedValue.toString(HEX_BASE), 2);\n}\n\n// convert one of our rgb color objects to a full hex color string\nfunction rgbToHex(rgb: RGB) {\n return `#${intToHex(rgb.red)}${intToHex(rgb.green)}${intToHex(rgb.blue)}`;\n}\n\n// Convert a hex color string to an RGB object\nfunction hexToRGB(hex: string): RGB {\n const red = parseInt(hex.slice(1, 3), HEX_BASE);\n const green = parseInt(hex.slice(3, 5), HEX_BASE);\n const blue = parseInt(hex.slice(5, 7), HEX_BASE);\n\n return { red, green, blue };\n}\n\n// Generate a shade of a given RGB color\nfunction generateShade(rgb: RGB, step: number): RGB {\n const factor = 1 - PERCENT * step;\n return {\n red: rgb.red * factor,\n green: rgb.green * factor,\n blue: rgb.blue * factor,\n };\n}\n\n// Generate a tint of a given RGB color\nfunction generateTint(rgb: RGB, step: number): RGB {\n const factor = PERCENT * step;\n return {\n red: rgb.red + (MAX_COLOR_VALUE - rgb.red) * factor,\n green: rgb.green + (MAX_COLOR_VALUE - rgb.green) * factor,\n blue: rgb.blue + (MAX_COLOR_VALUE - rgb.blue) * factor,\n };\n}\n\n// Main Functions\n\n// Calculate an array of shades from a hex color string\nexport function calculateShades(hex: string): string[] {\n return calculateColors(hex, generateShade);\n}\n\n// Calculate an array of tints from a hex color string\nexport function calculateTints(hex: string): string[] {\n return calculateColors(hex, generateTint);\n}\n\n// General function to calculate shades or tints\nfunction calculateColors(\n hex: string,\n generateColor: ShadeOrTintFunction\n): string[] {\n const rgb = hexToRGB(hex);\n const colors: string[] = [];\n for (let i = 1; i < 9; i++) {\n colors.push(rgbToHex(generateColor(rgb, i)));\n }\n return colors;\n}\n\n// Create tints and shades for a given color\nexport function createTintsAndShades(\n hex: string,\n colorKey: string,\n isReversed?: boolean\n): { [key: string]: string } {\n const BASE_INDEX = 100;\n const STEP = 50;\n\n const tints = calculateTints(hex).reverse().concat(hex);\n const shades = calculateShades(hex);\n const combinedColors = tints.concat(shades);\n\n const colorMap: { [key: string]: string } = {};\n const length = combinedColors.length;\n\n for (let i = 0; i < length; i++) {\n const index = BASE_INDEX + (isReversed ? length - 1 - i : i) * STEP;\n colorMap[`${colorKey}${index}`] = combinedColors[i];\n }\n\n return colorMap;\n}\n\n// Generate a color palette based on base colors and \"Expand Colors\"\nexport function expandToGenerateThemeColors(\n baseColors: ThemeColors,\n expandColors: WidgetColors,\n options?: { reverseNeutralRange?: boolean }\n): ThemeColors {\n const output = { ...baseColors };\n\n for (const colorKey in expandColors) {\n const expandColor = expandColors[colorKey as WidgetColorsKeys] as string;\n const isNeutralReversed =\n colorKey === 'neutral' && !!options?.reverseNeutralRange;\n /*\n *Most of the colors are range but there are some colors that should be a single value e.g.\n *{\n * // single value\n * background: \"#fff\",\n * // range\n * primary: '#1C3CF1',\n * primary500: '#1C3CF1',\n * primary550: '#0B27C4',\n *}\n */\n const isSingleColor = ['background', 'foreground'].includes(colorKey);\n\n if (!isSingleColor && !isOverridingColor(colorKey)) {\n const expandedHexColor = expandShortHexColor(expandColor);\n Object.assign(\n output,\n createTintsAndShades(expandedHexColor, colorKey, isNeutralReversed)\n );\n }\n }\n\n return { ...output, ...expandColors };\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n// Original Code: https://github.com/stitchesjs/stitches/blob/canary/packages/core/src/convert/toHash.js\n\nconst toAlphabeticChar = (code: number) =>\n String.fromCharCode(code + (code > 25 ? 39 : 97));\n\nconst toAlphabeticName = (code: number) => {\n let name = '';\n let x;\n\n for (x = Math.abs(code); x > 52; x = (x / 52) | 0) {\n name = toAlphabeticChar(x % 52) + name;\n }\n\n return toAlphabeticChar(x % 52) + name;\n};\n\nconst toPhash = (h: number, x: string) => {\n let i = x.length;\n while (i) {\n h = (h * 33) ^ x.charCodeAt(--i);\n }\n return h;\n};\n\nexport const toHash = (value: object) =>\n toAlphabeticName(toPhash(5381, JSON.stringify(value)) >>> 0);\n", "import type { Manager } from '@rango-dev/queue-manager-core';\nimport type {\n PendingSwapWithQueueID,\n SwapStorage,\n} from '@rango-dev/queue-manager-rango-preset';\n\nexport const getPendingSwaps = (manager: Manager | undefined) => {\n const result: PendingSwapWithQueueID[] = [];\n\n manager?.getAll().forEach((q, id) => {\n const storage = q.list.getStorage() as SwapStorage;\n\n if (storage?.swapDetails) {\n result.push({\n id,\n swap: storage?.swapDetails,\n });\n }\n });\n\n return result.sort(\n (a, b) => Number(b.swap.creationTime) - Number(a.swap.creationTime)\n );\n};\n", "import type { PropTypes } from './ActivateTabAlert.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button } from '@rango-dev/ui';\nimport React from 'react';\n\nexport function ActivateTabAlert(props: PropTypes) {\n return (\n <Alert\n action={\n <Button\n onClick={props.onActivateTab}\n variant=\"contained\"\n size=\"xxsmall\"\n type=\"warning\">\n {i18n.t('Activate this tab')}\n </Button>\n }\n type=\"warning\"\n variant=\"alarm\"\n title={i18n.t('Another tab is open and handles transactions.')}\n />\n );\n}\n", "import type { PropTypes } from './ActivateTabModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../../utils/common';\nimport { WatermarkedModal } from '../WatermarkedModal';\n\nexport function ActivateTabModal(props: PropTypes) {\n const { open, onClose, onConfirm } = props;\n\n return (\n <WatermarkedModal\n open={open}\n dismissible\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Activate current tab')}\n type=\"warning\"\n description={i18n.t(\n 'Currently, some transactions are running and being handled by other browser tab. If you activate this tab, all transactions that are already in the transaction sign step will expire.'\n )}>\n <Divider size={20} />\n <Button\n variant=\"contained\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirm}>\n {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { ChevronLeftIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { HeaderButton } from './HeaderButtons.styles';\n\nfunction BackButton(props: PropTypes) {\n return (\n <HeaderButton variant=\"ghost\" size=\"small\" onClick={props.onClick}>\n <ChevronLeftIcon color=\"black\" size={16} />\n </HeaderButton>\n );\n}\n\nexport { BackButton };\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SuffixContainer } from './HeaderButtons.styles';\n\nfunction CancelButton(props: PropTypes) {\n return (\n <SuffixContainer>\n <Button variant=\"ghost\" onClick={props.onClick} size=\"xsmall\">\n <Typography variant=\"label\" size=\"medium\" color=\"error500\">\n {i18n.t('Cancel')}\n </Typography>\n </Button>\n </SuffixContainer>\n );\n}\n\nexport { CancelButton };\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport { Image, Tooltip, WalletIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useWalletList } from '../../hooks/useWalletList';\n\nimport {\n ConnectedIcon,\n HeaderButton,\n rowStyles,\n WalletImageContainer,\n} from './HeaderButtons.styles';\n\nfunction WalletButton(props: PropTypes) {\n const { list } = useWalletList();\n const connectedWallets = list.filter(\n (wallet) => wallet.state === 'connected'\n );\n const content = !connectedWallets.length ? (\n i18n.t('Connect Wallet')\n ) : (\n <div className={rowStyles()}>\n {connectedWallets.map((wallet) => (\n <WalletImageContainer key={wallet.title}>\n <Image src={wallet.image} size={14} />\n </WalletImageContainer>\n ))}\n </div>\n );\n\n return (\n <Tooltip container={props.container} side=\"bottom\" content={content}>\n <HeaderButton variant=\"ghost\" size=\"small\" onClick={props.onClick}>\n {props.isConnected && <ConnectedIcon />}\n <WalletIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n );\n}\n\nexport { WalletButton };\n", "import type { HeaderButtonsPropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n NotificationsIcon,\n Popover,\n SettingsIcon,\n Tooltip,\n TransactionIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { NotificationContent } from '../NotificationContent';\n\nimport { HeaderButton } from './HeaderButtons.styles';\nimport InProgressTransactionBadge from './InProgressTransactionBadge';\nimport { NotificationsBadge } from './NotificationsBadge';\nimport { RefreshButton } from './RefreshButton';\n\nexport function HeaderButtons(props: HeaderButtonsPropTypes) {\n const {\n onClickRefresh,\n onClickHistory,\n onClickSettings,\n hidden = [],\n container,\n } = props;\n\n const {\n config: { features },\n } = useAppStore();\n\n const isNotificationsHidden =\n isFeatureHidden('notification', features) ||\n hidden.includes('notifications');\n\n return (\n <>\n {!hidden.includes('refresh') && (\n <Tooltip\n container={container || getContainer()}\n side=\"top\"\n content={i18n.t('Refresh')}>\n <RefreshButton onClick={onClickRefresh} />\n </Tooltip>\n )}\n\n {!isNotificationsHidden && (\n <Popover\n align=\"end\"\n alignOffset={-88}\n sideOffset={15}\n collisionPadding={{ right: 20, left: 20 }}\n container={getContainer()}\n content={<NotificationContent />}>\n <div>\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Notifications')}>\n <HeaderButton size=\"small\" variant=\"ghost\">\n <NotificationsIcon size={18} color=\"black\" />\n <NotificationsBadge />\n </HeaderButton>\n </Tooltip>\n </div>\n </Popover>\n )}\n {!hidden.includes('settings') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Settings')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickSettings}>\n <SettingsIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n )}\n {!hidden.includes('history') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Transactions History')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickHistory}>\n <TransactionIcon size={18} color=\"black\" />\n <InProgressTransactionBadge />\n </HeaderButton>\n </Tooltip>\n )}\n </>\n );\n}\n", "import type { Notification } from '../../types/notification';\n\nimport { Notifications } from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { getBlockchainImage } from '../../utils/meta';\n\nexport function NotificationContent() {\n const navigate = useNavigate();\n\n const { getNotifications, clearNotifications } = useNotificationStore();\n\n const notifications: Notification[] = getNotifications();\n const blockchains = useAppStore().blockchains();\n const { findToken } = useAppStore();\n\n const onClickItem = (requestId: Notification['requestId']) => {\n navigate(`${navigationRoutes.swaps}/${requestId}`);\n };\n\n return (\n <Notifications\n list={notifications}\n getBlockchainImage={(blockchain) =>\n getBlockchainImage(blockchain, blockchains) ?? ''\n }\n getTokenImage={(token) => findToken(token)?.image ?? ''}\n onClickItem={onClickItem}\n onClearAll={clearNotifications}\n />\n );\n}\n", "import type { Notification } from '../types/notification';\n\nimport {\n type PendingSwapWithQueueID,\n type Route,\n type RouteEvent,\n type StepEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\n\nimport createSelectors from './selectors';\n\nexport interface NotificationState {\n isSynced: boolean;\n notifications: Notification[];\n setNotification: (event: RouteEvent | StepEvent, route: Route) => void;\n removeNotification: (requestId: Notification['requestId']) => void;\n getNotifications: () => Notification[];\n syncNotifications: (swaps: PendingSwapWithQueueID[]) => void;\n clearNotifications: () => void;\n}\n\nexport const useNotificationStore = createSelectors(\n create<NotificationState>()(\n persist(\n subscribeWithSelector((set, get) => ({\n isSynced: false,\n notifications: [],\n setNotification: (event, route) => {\n const fromStep = route.steps[0];\n const toStep = route.steps[route.steps.length - 1];\n\n const notification: Notification = {\n event,\n creationTime: Date.now(),\n requestId: route.requestId,\n route: {\n creationTime: parseInt(route.creationTime),\n from: {\n blockchain: fromStep.fromBlockchain,\n address: fromStep.fromSymbolAddress,\n symbol: fromStep.fromSymbol,\n },\n to: {\n blockchain: toStep.toBlockchain,\n address: toStep.toSymbolAddress,\n symbol: toStep.toSymbol,\n },\n },\n };\n\n const excludedList = get().notifications.filter(\n (notificationItem) => notificationItem.requestId !== route.requestId\n );\n\n set(() => ({\n notifications: [...excludedList, notification],\n }));\n },\n removeNotification: (requestId) => {\n set((state) => ({\n notifications: state.notifications.filter(\n (notification) => notification.requestId !== requestId\n ),\n }));\n },\n getNotifications: () => {\n const { isSynced, notifications } = get();\n return isSynced\n ? notifications.sort((a, b) => {\n if (a.route.creationTime && !b.route.creationTime) {\n return -1;\n }\n if (!a.route.creationTime && b.route.creationTime) {\n return 1;\n }\n if (!a.route.creationTime && !b.route.creationTime) {\n return b.creationTime - a.creationTime;\n }\n return b.route.creationTime - a.route.creationTime;\n })\n : [];\n },\n syncNotifications: (swaps) => {\n const { isSynced, notifications } = get();\n\n if (!isSynced) {\n const nextNotifications: Notification[] = [];\n notifications.forEach((notification) => {\n const swapExist = swaps.some(\n (swap) => swap.swap.requestId === notification.requestId\n );\n if (swapExist) {\n nextNotifications.push(notification);\n }\n });\n\n set({ isSynced: true, notifications: nextNotifications });\n }\n },\n clearNotifications: () => set({ notifications: [] }),\n })),\n\n {\n name: 'notification',\n skipHydration: true,\n partialize: ({ isSynced, ...otherProps }) => otherProps,\n version: 1,\n migrate: (persistedState, version) => {\n if (version === 0) {\n /**\n * Eliminate the persistence of read notifications,\n * and remove the \"read\" flag from other notifications to align with the current modifications in the notification store structure.\n */\n const oldNotifications = (\n persistedState as {\n notifications: (Notification & { read: boolean })[];\n }\n ).notifications;\n\n (persistedState as NotificationState).notifications =\n oldNotifications\n .filter(\n (notification: Notification & { read: boolean }) =>\n !notification.read\n )\n .map(({ read, ...otherProps }) => otherProps);\n }\n\n return persistedState as NotificationState;\n },\n }\n )\n )\n);\n", "import type { PendingSwap } from 'rango-types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { InProgressIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getPendingSwaps } from '../../utils/queue';\n\nimport { InProgressTransactionBadgeContainer } from './HeaderButtons.styles';\n\nconst InProgressTransactionBadge = () => {\n const { manager } = useManager();\n const list: PendingSwap[] = getPendingSwaps(manager).map(({ swap }) => swap);\n\n if (!list.find((swap) => swap.status === 'running')) {\n return null;\n }\n\n return (\n <InProgressTransactionBadgeContainer>\n <InProgressIcon color=\"info\" size={6} />\n </InProgressTransactionBadgeContainer>\n );\n};\n\nexport default InProgressTransactionBadge;\n", "import { EventSeverity } from '@rango-dev/queue-manager-rango-preset';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useNotificationStore } from '../../store/notification';\n\nimport { NotificationsBadgeContainer } from './HeaderButtons.styles';\n\nexport function NotificationsBadge() {\n const { getNotifications } = useNotificationStore();\n\n const notificationsList = getNotifications();\n\n const notificationsCount = notificationsList.length;\n\n const hasSeverNotification = !!notificationsList.find(\n (notificationItem) =>\n notificationItem.event.messageSeverity === EventSeverity.WARNING\n );\n\n return notificationsCount ? (\n <NotificationsBadgeContainer isSever={hasSeverNotification}>\n <Typography variant=\"body\" size=\"xsmall\" color=\"$background\">\n {notificationsCount}\n </Typography>\n </NotificationsBadgeContainer>\n ) : null;\n}\n", "import { RefreshProgressButton } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { HeaderButton, ProgressIcon } from './HeaderButtons.styles';\n\nconst REFRESH_INTERVAL = 1000;\nconst MAX_ELAPSED_TIME = 60;\nconst MAX_PERCENTAGE = 100;\n\nfunction RefreshButton({ onClick }: { onClick: (() => void) | undefined }) {\n const [elapsedTime, setElapsedTime] = useState(0);\n const [isRefetched, setIsRefetched] = useState(false);\n\n const handleVisibilityChange = (interval?: number) => {\n if (document.hidden && interval) {\n // Tab is inactive, clear the interval\n clearTimeout(interval);\n }\n };\n\n useEffect(() => {\n let interval: number | undefined;\n if (onClick) {\n interval = window.setInterval(() => {\n setElapsedTime((prevTime) => prevTime + 1);\n\n if (elapsedTime === MAX_ELAPSED_TIME) {\n handleRefreshClick();\n }\n }, REFRESH_INTERVAL);\n } else {\n clearTimeout(interval);\n }\n\n document.addEventListener('visibilitychange', () =>\n handleVisibilityChange(interval)\n );\n\n return () => {\n document.removeEventListener('visibilitychange', () =>\n handleVisibilityChange(interval)\n );\n if (interval) {\n clearInterval(interval);\n }\n };\n }, [elapsedTime, onClick]);\n\n const clearTimeout = (interval?: number) => {\n if (interval) {\n clearInterval(interval);\n }\n setElapsedTime(0);\n };\n\n const handleRefreshClick = () => {\n onClick?.();\n setElapsedTime(0);\n setIsRefetched(true);\n };\n\n return (\n <HeaderButton\n variant=\"ghost\"\n size=\"small\"\n style={{ paddingTop: 0, paddingBottom: 0 }}\n onClick={handleRefreshClick}\n disabled={!onClick}>\n <ProgressIcon\n onTransitionEnd={() => setIsRefetched(false)}\n isRefetched={isRefetched}>\n <RefreshProgressButton\n size={22}\n color={!onClick ? 'gray' : 'black'}\n progress={(elapsedTime / MAX_ELAPSED_TIME) * MAX_PERCENTAGE}\n />\n </ProgressIcon>\n </HeaderButton>\n );\n}\n\nexport { RefreshButton };\n", "import type { PropTypes } from './RefreshModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, MessageBox, RefreshIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { RefreshButton } from './RefreshModal.styles';\n\nexport function RefreshModal(props: PropTypes) {\n const { open, onClose } = props;\n\n return (\n <WatermarkedModal\n open={open}\n dismissible\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Something went wrong')}\n type=\"error\"\n description={i18n.t('Something went wrong. Please refresh the app.')}>\n <Divider size={30} />\n <RefreshButton\n variant=\"outlined\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={() => location.reload()}>\n <RefreshIcon size={20} color=\"primary\" />\n <Divider size={4} direction=\"horizontal\" />\n {i18n.t('Refresh')}\n </RefreshButton>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import { Button, styled } from '@rango-dev/ui';\n\nexport const RefreshButton = styled(Button, {\n '& span': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n});\n", "import { getContainer } from '../../utils/common';\n\nexport function onScrollContentAttachStatusToContainer(e: Event) {\n const contentElement = e.target as HTMLElement | null;\n\n if (contentElement) {\n const fromTop = contentElement.scrollTop;\n const container = getContainer();\n\n if (fromTop > 1) {\n container.classList.add('rng-scrolled');\n } else {\n container.classList.remove('rng-scrolled');\n }\n }\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nconst WIDGET_HEIGHT = '700px';\n\nexport const LayoutContainer = css({\n borderRadius: '$primary',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n boxShadow: '$mainContainer',\n});\n\nexport const Container = styled('div', {\n position: 'relative',\n width: '100vw',\n minWidth: '300px',\n maxWidth: '390px',\n backgroundColor: '$background',\n variants: {\n height: {\n auto: {\n height: 'auto',\n maxHeight: WIDGET_HEIGHT,\n },\n fixed: {\n height: WIDGET_HEIGHT,\n },\n },\n },\n});\n\nexport const Content = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n padding: 0,\n overflowY: 'auto',\n});\n\nexport const Footer = styled('div', {\n padding: '0 $20 $10',\n '& .footer__alert': {\n paddingTop: '$10',\n },\n '& .footer__logo': {\n opacity: 0,\n transition: 'opacity 1s ease-in-out',\n '&.logo__show': {\n opacity: 1,\n },\n '&.logo__hidden': {\n visibility: 'hidden',\n },\n },\n});\n", "import { styled } from '@rango-dev/ui';\n\nconst CONTENT_PADDING = '$20 $20 $10 $20';\n\nconst ScrollableArea = styled('div', {\n padding: CONTENT_PADDING,\n overflowY: 'auto',\n flexGrow: 1,\n});\n\nexport { ScrollableArea, CONTENT_PADDING };\n", "import { styled } from '@rango-dev/ui';\n\nconst PageContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n padding: '20px 20px 10px',\n flexGrow: 1,\n\n variants: {\n view: {\n true: {\n flexGrow: 1,\n overflow: 'hidden',\n },\n },\n compact: {\n true: {\n padding: 0,\n },\n },\n },\n});\n\nexport { PageContainer };\n", "import type { Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { getConfig } from '../utils/configs';\n\ntype ErrorType = {\n title: string;\n message: string;\n};\n\ninterface UseFetchCustomToken {\n fetchCustomToken: ({\n blockchain,\n tokenAddress,\n }: {\n blockchain: string;\n tokenAddress: string;\n }) => Promise<Token>;\n loading: boolean;\n error?: ErrorType;\n}\n\nexport function useFetchCustomToken(): UseFetchCustomToken {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<undefined | ErrorType>(undefined);\n const { findToken } = useAppStore();\n const customTokens = useAppStore().customTokens();\n\n function produceErrorMessage(\n type: 'duplicated' | 'not-found' | 'token-exist',\n blockchain?: string\n ) {\n switch (type) {\n case 'duplicated':\n return {\n title: i18n.t('Duplicate Token'),\n message: i18n.t(\n 'The address you entered is duplicate, please enter a new address.'\n ),\n };\n case 'token-exist':\n return {\n title: i18n.t('Token Already Exists'),\n message: i18n.t(\n `There's no need to add this token again because it already exists and is supported by us.`\n ),\n };\n case 'not-found':\n return {\n title: i18n.t('Token Not Found'),\n message: i18n.t(\n `Sorry, no token was found on ${blockchain} blockchain with the provided address. please make sure you have entered the right token address.`\n ),\n };\n }\n }\n\n const fetchCustomToken: UseFetchCustomToken['fetchCustomToken'] = async ({\n blockchain,\n tokenAddress,\n }) => {\n setLoading(true);\n try {\n // Check for duplicate token in customTokens\n const isDuplicate = customTokens.some(\n (token) => token.address?.toLowerCase() === tokenAddress.toLowerCase()\n );\n if (isDuplicate) {\n const errorMessage = produceErrorMessage('duplicated');\n setError(errorMessage);\n return undefined;\n }\n\n const res = await fetch(\n `${getConfig('BASE_URL')}/meta/token?apiKey=${getConfig(\n 'API_KEY'\n )}&blockchain=${blockchain}&address=${tokenAddress}`\n );\n const contentType = res.headers.get('content-type');\n const response =\n contentType &&\n contentType.includes('application/json') &&\n (await res.json());\n if (!response || response.error) {\n const errorMessage = produceErrorMessage('not-found', blockchain);\n setError(errorMessage);\n return undefined;\n }\n\n // Check if token is already in the system\n const isTokenFound = findToken({\n blockchain: response.blockchain,\n address: response.address,\n symbol: response.symbol,\n });\n if (isTokenFound) {\n const errorMessage = produceErrorMessage('token-exist');\n setError(errorMessage);\n return undefined;\n }\n\n return response;\n } catch (error: any) {\n setError(undefined);\n throw new Error(error.message);\n } finally {\n setLoading(false);\n }\n };\n return { fetchCustomToken, loading, error };\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type {\n ConfirmSwap,\n ConfirmSwapFetchResult,\n} from '../hooks/useConfirmSwap/useConfirmSwap.types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport {\n Alert,\n Button,\n css,\n Divider,\n IconButton,\n styled,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { ConfirmWalletsModal } from '../components/ConfirmWalletsModal/ConfirmWalletsModal';\nimport { RefreshButton } from '../components/HeaderButtons/RefreshButton';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { getQuoteUpdateWarningMessage } from '../constants/warnings';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport { useConfirmSwap } from '../hooks/useConfirmSwap';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { joinList } from '../utils/ui';\n\nconst Buttons = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'space-between',\n [`& ${IconButton}`]: {\n width: '$48',\n height: '$48',\n },\n});\n\nconst confirmBtnStyles = css({\n flexGrow: 1,\n paddingRight: '$10',\n});\n\nconst iconStyles = css({\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nconst descriptionStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport function ConfirmSwapPage() {\n //TODO: move component's logics to a custom hook\n const {\n selectedQuote,\n setInputAmount,\n selectedWallets,\n quoteWalletsConfirmed,\n customDestination,\n quoteWarningsConfirmed,\n } = useQuoteStore();\n const navigate = useNavigate();\n const [dbErrorMessage, setDbErrorMessage] = useState<string>('');\n\n const showWalletsOnInit = !quoteWalletsConfirmed;\n const [showWallets, setShowWallets] = useState(false);\n const [isConfirming, setIsConfirming] = useState(false);\n const { isActiveTab } = useUiStore();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const prevDisabledLiquiditySources = useRef(disabledLiquiditySources);\n const { manager } = useManager();\n const {\n fetch: confirmSwap,\n loading: fetchingConfirmationQuote,\n cancelFetch,\n } = useConfirmSwap();\n const [confirmSwapResult, setConfirmSwapResult] =\n useState<ConfirmSwapFetchResult>({\n swap: null,\n error: null,\n warnings: null,\n });\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n\n const onConfirmSwap: ConfirmSwap['fetch'] = async ({\n selectedWallets,\n customDestination,\n }) => {\n const result = await confirmSwap?.({ selectedWallets, customDestination });\n\n setConfirmSwapResult(result);\n return result;\n };\n\n const addNewSwap = async () => {\n if (confirmSwapResult.swap && quoteWalletsConfirmed) {\n try {\n await manager?.create(\n 'swap',\n { swapDetails: confirmSwapResult.swap },\n { id: confirmSwapResult.swap.requestId }\n );\n\n const swap_url = `../${navigationRoutes.swaps}/${confirmSwapResult.swap.requestId}`;\n navigate(swap_url, {\n replace: true,\n });\n setTimeout(() => {\n setInputAmount('');\n }, 0);\n } catch (e) {\n setDbErrorMessage('Error: ' + (e as any)?.message);\n }\n }\n };\n\n const onConfirm = async () => {\n setIsConfirming(true);\n await addNewSwap();\n setIsConfirming(false);\n };\n\n const onStartConfirmSwap = async () => {\n if (confirmSwapResult?.warnings?.quote && !quoteWarningsConfirmed) {\n setShowQuoteWarningModal(true);\n } else {\n await onConfirm();\n }\n };\n\n const onRefresh = async () => {\n setConfirmSwapResult({\n error: null,\n swap: null,\n warnings: null,\n });\n confirmSwap({ selectedWallets, customDestination })\n .then((res) => {\n setConfirmSwapResult(res);\n })\n .catch((error) => console.error(error));\n };\n\n useEffect(() => {\n const disabledLiquiditySourceReset =\n !!prevDisabledLiquiditySources.current.length &&\n !disabledLiquiditySources.length;\n if (disabledLiquiditySourceReset) {\n void onRefresh();\n }\n prevDisabledLiquiditySources.current = disabledLiquiditySources;\n }, [disabledLiquiditySources.length]);\n\n useEffect(() => {\n if (showWalletsOnInit) {\n cancelFetch();\n }\n }, [showWalletsOnInit]);\n\n useEffect(() => {\n if (showWalletsOnInit) {\n setShowWallets(showWalletsOnInit);\n }\n }, [showWalletsOnInit]);\n\n useEffect(() => {\n if (!showWalletsOnInit) {\n confirmSwap({ selectedWallets, customDestination })\n .then((result) => setConfirmSwapResult(result))\n .catch((error) => console.error(error));\n }\n }, []);\n\n useLayoutEffect(() => {\n if (!selectedQuote?.requestId) {\n navigate(`../${location.search}`);\n }\n }, [selectedQuote?.requestId]);\n\n const quoteWarning = confirmSwapResult.warnings?.quote ?? null;\n const quoteError = confirmSwapResult.error;\n const alerts = [];\n if (dbErrorMessage) {\n alerts.push(<Alert type=\"error\" variant=\"alarm\" title={dbErrorMessage} />);\n }\n\n if (confirmSwapResult.warnings?.quoteUpdate) {\n alerts.push(\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={\n confirmSwapResult.warnings.quoteUpdate &&\n getQuoteUpdateWarningMessage(confirmSwapResult.warnings.quoteUpdate)\n }\n />\n );\n }\n\n if (quoteWarning || quoteError) {\n const settings_url = `../${navigationRoutes.settings}`;\n alerts.push(\n <QuoteWarningsAndErrors\n warning={quoteWarning}\n error={quoteError}\n couldChangeSettings={false}\n refetchQuote={onRefresh}\n showWarningModal={showQuoteWarningModal}\n confirmationDisabled={!isActiveTab}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={async () => {\n setShowQuoteWarningModal(false);\n await addNewSwap();\n }}\n onChangeSettings={() => navigate(settings_url)}\n />\n );\n }\n\n return (\n <Layout\n header={{\n title: i18n.t('Confirm Swap'),\n onWallet: () => {\n const wallets_url = `../${navigationRoutes.wallets}`;\n navigate(wallets_url);\n },\n }}\n footer={\n <Buttons>\n <div className={confirmBtnStyles()}>\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n fullWidth\n loading={fetchingConfirmationQuote || isConfirming}\n disabled={!!confirmSwapResult.error || !isActiveTab}\n onClick={onStartConfirmSwap}>\n {i18n.t('Start Swap')}\n </Button>\n </div>\n <IconButton\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n loading={fetchingConfirmationQuote || isConfirming}\n disabled={!isActiveTab}\n onClick={setShowWallets.bind(null, true)}>\n <WalletIcon size={24} />\n </IconButton>\n </Buttons>\n }>\n {showWallets && (\n <ConfirmWalletsModal\n open={showWallets}\n onClose={() => setShowWallets(false)}\n onCancel={cancelFetch}\n loading={fetchingConfirmationQuote}\n onCheckBalance={onConfirmSwap}\n />\n )}\n\n <PageContainer>\n <div className={descriptionStyles()}>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('You get')}\n </Typography>\n <div className={iconStyles()}>\n <RefreshButton\n onClick={\n !fetchingConfirmationQuote &&\n !showWallets &&\n !showQuoteWarningModal\n ? onRefresh\n : undefined\n }\n />\n </div>\n </div>\n <Divider size=\"12\" />\n\n {joinList(\n alerts.map((alert, index) => ({\n element: alert,\n key: `alert-${index}`,\n })),\n <Divider size={10} />\n )}\n {alerts.length > 0 ? <Divider size={10} /> : null}\n\n <QuoteInfo\n quote={selectedQuote}\n type=\"swap-preview\"\n expanded\n tagHidden\n error={confirmSwapResult.error}\n loading={fetchingConfirmationQuote}\n warning={confirmSwapResult.warnings?.quote ?? null}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './ConfirmWalletsModal.types';\nimport type { ConnectedWallet } from '../../store/wallets';\nimport type { ConfirmSwapWarnings, Wallet } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n BalanceErrors,\n Button,\n ChevronLeftIcon,\n Divider,\n MessageBox,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { getQuoteErrorMessage } from '../../constants/errors';\nimport { getQuoteUpdateWarningMessage } from '../../constants/warnings';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainShortNameFor } from '../../utils/meta';\nimport { isConfirmSwapDisabled } from '../../utils/swap';\nimport { getQuoteWallets } from '../../utils/wallets';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomDestination } from '../CustomDestination/CustomDestination';\n\nimport {\n ConfirmButton,\n ListContainer,\n NavigateBack,\n ShowMoreHeader,\n Title,\n Wallets,\n WalletsContainer,\n walletsListStyles,\n} from './ConfirmWallets.styles';\nimport { WalletList } from './WalletList';\n\nconst NUMBER_OF_WALLETS_TO_DISPLAY = 2;\n\nexport function ConfirmWalletsModal(props: PropTypes) {\n //TODO: move component's logics to a custom hook\n const { open, onClose, onCancel, onCheckBalance, loading } = props;\n const navigate = useNavigate();\n const blockchains = useAppStore().blockchains();\n const {\n selectedQuote,\n setSelectedWallets: selectQuoteWallets,\n quoteWalletsConfirmed: quoteWalletsConfirmed,\n setQuoteWalletConfirmed: setQuoteWalletConfirmed,\n customDestination,\n setCustomDestination,\n } = useQuoteStore();\n const { connectedWallets, selectWallets } = useWalletsStore();\n const { config } = useAppStore();\n\n const [showMoreWalletFor, setShowMoreWalletFor] = useState('');\n const [balanceWarnings, setBalanceWarnings] = useState<string[]>([]);\n const [error, setError] = useState('');\n const [quoteWarning, setQuoteWarning] = useState<\n ConfirmSwapWarnings['quoteUpdate'] | null\n >(null);\n\n const [isCustomDestinationOpen, setCustomDestinationOpen] = useState(\n !!customDestination\n );\n\n const quoteWallets = useMemo(\n () =>\n getQuoteWallets({\n filter: 'all',\n quote: selectedQuote,\n }),\n [selectedQuote]\n );\n\n const requiredWallets = getQuoteWallets({\n filter: 'required',\n quote: selectedQuote,\n });\n\n const lastStepToBlockchain = blockchains.find(\n (blockchain) =>\n blockchain.name ===\n selectedQuote?.swaps[selectedQuote?.swaps.length - 1].to.blockchain\n );\n const isWalletRequiredFor = (blockchain: string) =>\n requiredWallets.includes(blockchain);\n\n const getInitialSelectableWallets = useCallback(\n () =>\n connectedWallets.filter((connectedWallet) => {\n return (\n connectedWallet.selected &&\n quoteWallets.includes(connectedWallet.chain)\n );\n }),\n [connectedWallets, quoteWallets]\n );\n\n const [selectableWallets, setSelectableWallets] = useState<ConnectedWallet[]>(\n getInitialSelectableWallets()\n );\n const [nextSelectedWallets, setNextSelectedWallets] = useState<\n {\n blockchain: string;\n walletType: string;\n }[]\n >([]);\n\n const addNextSelectedWallets = (blockchain: string, walletType: string) =>\n setNextSelectedWallets((prevState) =>\n prevState.concat({\n blockchain,\n walletType,\n })\n );\n\n const isInsufficientBalanceModalOpen = balanceWarnings.length > 0;\n\n const isSelected = (walletType: string, chain: string) =>\n !!selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.walletType === walletType &&\n selectableWallet.chain === chain &&\n selectableWallet.selected &&\n (isWalletRequiredFor(chain) ||\n (!isWalletRequiredFor(chain) && !customDestination))\n );\n\n const updateSelectableWallets = (\n wallets: ConnectedWallet[],\n chainName: string,\n shouldSelect: boolean\n ) => {\n let isAnyWalletSelected = false;\n return wallets.map((wallet) => {\n if (wallet.chain === chainName) {\n let selected = wallet.selected;\n if (!isAnyWalletSelected && shouldSelect) {\n isAnyWalletSelected = true;\n selected = true;\n } else if (!shouldSelect) {\n selected = false;\n }\n return {\n ...wallet,\n selected,\n };\n }\n return wallet;\n });\n };\n\n const handleCustomDestinationCollapsibleOpenChange = (open: boolean) => {\n setCustomDestinationOpen(open);\n if (!open) {\n setCustomDestination('');\n setSelectableWallets((selectableWallets) => {\n return updateSelectableWallets(\n selectableWallets,\n lastStepToBlockchain?.name || '',\n true\n );\n });\n } else {\n if (!isWalletRequiredFor(lastStepToBlockchain?.name ?? '')) {\n setSelectableWallets((selectableWallets) => {\n return updateSelectableWallets(\n selectableWallets,\n lastStepToBlockchain?.name || '',\n false\n );\n });\n }\n }\n };\n\n const onChange = (wallet: Wallet) => {\n if (showMoreWalletFor) {\n setShowMoreWalletFor('');\n }\n const selected = isSelected(wallet.walletType, wallet.chain);\n if (selected) {\n return;\n }\n const connectedWallet = connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === wallet.walletType &&\n connectedWallet.chain === wallet.chain\n );\n\n if (!connectedWallet) {\n return;\n }\n\n onCancel();\n if (\n wallet.chain === lastStepToBlockchain?.name &&\n isCustomDestinationOpen &&\n !isWalletRequiredFor(lastStepToBlockchain.name)\n ) {\n setCustomDestinationOpen(false);\n setCustomDestination(null);\n }\n setSelectableWallets((selectableWallets) =>\n selectableWallets\n .filter((selectableWallet) => selectableWallet.chain !== wallet.chain)\n .concat({ ...connectedWallet, selected: true })\n );\n };\n\n const onConfirmBalance = () => {\n const lastSelectedWallets = selectableWallets.filter(\n (wallet) => wallet.selected\n );\n selectWallets(lastSelectedWallets);\n selectQuoteWallets(lastSelectedWallets);\n setQuoteWalletConfirmed(true);\n onClose();\n };\n\n const onConfirmWallets = async () => {\n setBalanceWarnings([]);\n setError('');\n setQuoteWarning(null);\n\n const result = await onCheckBalance?.({\n selectedWallets: selectableWallets.filter((wallet) => wallet.selected),\n customDestination,\n });\n const warnings = result.warnings;\n if (warnings?.balance?.messages) {\n setBalanceWarnings(warnings.balance.messages);\n }\n if (warnings?.quoteUpdate) {\n setQuoteWarning(warnings.quoteUpdate);\n }\n if (result.error) {\n setError(getQuoteErrorMessage(result.error));\n }\n\n if (!result.error && (!warnings?.balance?.messages.length || 0 > 0)) {\n onConfirmBalance();\n } else {\n setBalanceWarnings(warnings?.balance?.messages ?? []);\n }\n };\n\n useEffect(() => {\n setSelectableWallets((selectableWallets) => {\n let nextState: typeof selectableWallets = [];\n\n //if wallet disconnected we should unselect the wallet from the list\n selectableWallets.forEach((selectableWallet) => {\n const walletDisconnected = !connectedWallets.some(\n (connectedWallet) =>\n connectedWallet.chain === selectableWallet.chain &&\n connectedWallet.walletType === selectableWallet.walletType &&\n connectedWallet.address === selectableWallet.address\n );\n if (!walletDisconnected) {\n nextState.push(selectableWallet);\n }\n });\n\n /**\n * We confirm if a newly connected wallet for a blockchain is marked as selected in the store,\n * but there are no selected wallets for that blockchain in our list.\n * If this condition is met, we include the wallet in our list as selected.\n */\n nextState = nextState.concat(\n connectedWallets.filter((connectedWallet) => {\n const anyWalletSelected = !!nextState.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain\n );\n\n return (\n !anyWalletSelected &&\n connectedWallet.selected &&\n quoteWallets.includes(connectedWallet.chain)\n );\n })\n );\n return nextState;\n });\n }, [connectedWallets, quoteWallets]);\n\n useEffect(() => {\n const nextState: typeof nextSelectedWallets = [];\n\n if (nextSelectedWallets.length > 0) {\n nextSelectedWallets.forEach((selectedWallet) => {\n const wallet = connectedWallets.find(\n (wallet) =>\n wallet.chain === selectedWallet.blockchain &&\n wallet.walletType === selectedWallet.walletType\n );\n if (wallet) {\n onChange(wallet);\n } else {\n nextState.push(selectedWallet);\n }\n });\n setNextSelectedWallets(nextState);\n }\n }, [connectedWallets, nextSelectedWallets]);\n\n const modalContainer = document.getElementById(\n WIDGET_UI_ID.SWAP_BOX_ID\n ) as HTMLDivElement;\n\n return (\n <WatermarkedModal\n open={open}\n onClose={() => {\n if (!quoteWalletsConfirmed) {\n const home = '../';\n navigate(home, { replace: true });\n }\n onClose();\n }}\n dismissible={!showMoreWalletFor}\n container={modalContainer}\n {...(!showMoreWalletFor && {\n styles: { container: { height: '100%' } },\n footer: (\n <ConfirmButton>\n <Button\n loading={loading}\n disabled={isConfirmSwapDisabled(\n loading,\n isCustomDestinationOpen,\n customDestination,\n selectedQuote,\n selectableWallets,\n lastStepToBlockchain\n )}\n onClick={onConfirmWallets}\n variant=\"contained\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n {i18n.t('Confirm')}\n </Button>\n </ConfirmButton>\n ),\n })}\n {...(showMoreWalletFor && {\n styles: { container: { height: '100%', padding: '$0' } },\n header: (\n <ShowMoreHeader>\n <NavigateBack\n variant=\"ghost\"\n onClick={setShowMoreWalletFor.bind(null, '')}>\n <ChevronLeftIcon size={16} />\n </NavigateBack>\n <Typography variant=\"headline\" size=\"small\">\n {i18n.t({\n id: 'Your {blockchainName} wallets',\n values: {\n blockchainName: getBlockchainShortNameFor(\n showMoreWalletFor,\n blockchains\n ),\n },\n })}\n </Typography>\n </ShowMoreHeader>\n ),\n })}\n anchor=\"center\">\n <WatermarkedModal\n open={isInsufficientBalanceModalOpen}\n onClose={setBalanceWarnings.bind(null, [])}\n container={modalContainer}>\n <MessageBox\n title={i18n.t('Insufficient account balance')}\n type=\"error\"\n description={<BalanceErrors messages={balanceWarnings ?? []} />}>\n <Button\n variant=\"outlined\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirmBalance}>\n {i18n.t('Proceed anyway')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n {showMoreWalletFor && (\n <WalletsContainer>\n <div className={walletsListStyles()}>\n <WalletList\n chain={showMoreWalletFor}\n isSelected={isSelected}\n selectWallet={onChange}\n onShowMore={() => setShowMoreWalletFor(showMoreWalletFor)}\n onConnect={(walletType) => {\n addNextSelectedWallets(showMoreWalletFor, walletType);\n }}\n />\n </div>\n </WalletsContainer>\n )}\n {!showMoreWalletFor && (\n <>\n {error && (\n <>\n <Alert variant=\"alarm\" type=\"error\" title={i18n.t(error)} />\n <Divider size={12} />\n </>\n )}\n {quoteWarning && (\n <>\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={getQuoteUpdateWarningMessage(quoteWarning)}\n />\n <Divider size={12} />\n </>\n )}\n <Wallets>\n {quoteWallets.map((requiredWallet, index) => {\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === requiredWallet\n );\n\n const key = `wallet-${index}`;\n const isLastWallet = index === quoteWallets.length - 1;\n const showCustomDestination =\n isLastWallet &&\n lastStepToBlockchain &&\n config?.customDestination !== false;\n return (\n <div key={key}>\n <Title>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t({\n id: 'Your {blockchainName} wallets',\n values: { blockchainName: blockchain?.shortName },\n })}\n </Typography>\n <Typography\n variant=\"label\"\n color=\"$neutral700\"\n size=\"medium\">\n {i18n.t({\n id: 'You need to connect a {blockchainName} wallet.',\n values: { blockchainName: blockchain?.shortName },\n })}\n </Typography>\n </Title>\n <Divider size={24} />\n <ListContainer>\n <WalletList\n chain={requiredWallet}\n isSelected={isSelected}\n selectWallet={onChange}\n limit={NUMBER_OF_WALLETS_TO_DISPLAY}\n onShowMore={() =>\n setShowMoreWalletFor(blockchain?.name ?? '')\n }\n onConnect={(walletType) => {\n addNextSelectedWallets(requiredWallet, walletType);\n }}\n />\n </ListContainer>\n {!isLastWallet && <Divider size={32} />}\n {showCustomDestination && (\n <CustomDestination\n blockchain={lastStepToBlockchain}\n open={isCustomDestinationOpen}\n handleOpenChange={\n handleCustomDestinationCollapsibleOpenChange\n }\n />\n )}\n </div>\n );\n })}\n </Wallets>\n </>\n )}\n </WatermarkedModal>\n );\n}\n", "import type { QuoteUpdateWarning } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { QuoteUpdateType } from '../types';\n\nexport function getQuoteUpdateWarningMessage(warning: QuoteUpdateWarning) {\n switch (warning.type) {\n case QuoteUpdateType.QUOTE_UPDATED:\n return i18n.t('Route has been updated.');\n case QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED:\n return i18n.t(\n 'Output amount changed to {newOutputAmount} ({percentageChange}% change).',\n {\n newOutputAmount: warning.newOutputAmount,\n percentageChange: warning.percentageChange,\n }\n );\n case QuoteUpdateType.QUOTE_SWAPPERS_UPDATED:\n return i18n.t('Route swappers has been updated.');\n case QuoteUpdateType.QUOTE_COINS_UPDATED:\n return i18n.t('Route internal coins has been updated.');\n default:\n return '';\n }\n}\n", "import type { PropTypes } from './CustomDestination.types';\nimport type { MouseEvent } from 'react';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n ChevronDownIcon,\n CloseIcon,\n Divider,\n IconButton,\n PasteIcon,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useRef } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport {\n getBlockchainDisplayNameFor,\n isValidTokenAddress,\n} from '../../utils/meta';\nimport { CustomCollapsible } from '../CustomCollapsible/CustomCollapsible';\nimport { ExpandedIcon } from '../CustomCollapsible/CustomCollapsible.styles';\n\nimport {\n Container,\n CustomDestinationButton,\n StyledTextField,\n} from './CustomDestination.styles';\n\nexport function CustomDestination(props: PropTypes) {\n const { blockchain, handleOpenChange, open } = props;\n\n const { customDestination, setCustomDestination } = useQuoteStore();\n const { config } = useAppStore();\n const blockchains = useAppStore().blockchains();\n const blockchainName = getBlockchainDisplayNameFor(\n blockchain.name,\n blockchains\n );\n const inputRef = useRef<HTMLInputElement | null>(null);\n const configDestination =\n config?.defaultCustomDestinations?.[blockchain.name];\n\n const isFirefox = navigator?.userAgent.includes('Firefox');\n const isAddressChecked = open && !!customDestination && blockchain;\n const isAddressInvalid =\n isAddressChecked && !isValidTokenAddress(blockchain, customDestination);\n const handleClear = () => {\n setCustomDestination('');\n };\n\n const handlePaste = async (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n if (navigator.clipboard !== undefined) {\n const pastedText = await navigator.clipboard.readText();\n setCustomDestination(pastedText);\n inputRef?.current?.focus();\n }\n };\n\n const renderSuffix = () => {\n if (customDestination) {\n return (\n <IconButton onClick={handleClear} variant=\"ghost\">\n <CloseIcon size={12} color=\"gray\" />\n </IconButton>\n );\n } else if (!isFirefox) {\n return (\n <IconButton onClick={handlePaste} variant=\"ghost\">\n <PasteIcon size={16} />\n </IconButton>\n );\n }\n\n return null;\n };\n\n useEffect(() => {\n const shouldUseConfigDestination =\n !!configDestination && customDestination === null;\n\n if (shouldUseConfigDestination) {\n setCustomDestination(configDestination);\n handleOpenChange(true);\n }\n }, [configDestination]);\n\n return (\n <Container>\n <CustomCollapsible\n onOpenChange={handleOpenChange}\n hasSelected\n open={open}\n triggerAnchor=\"top\"\n trigger={\n <CustomDestinationButton>\n <div className=\"button__content\">\n <WalletIcon size={18} color=\"info\" />\n <Divider size={4} direction=\"horizontal\" />\n <Typography\n variant=\"label\"\n size=\"medium\"\n color={open ? '$neutral600' : undefined}>\n {i18n.t('Send to a different address')}\n </Typography>\n </div>\n <ExpandedIcon orientation={open ? 'up' : 'down'}>\n <ChevronDownIcon size={10} color=\"secondary\" />\n </ExpandedIcon>\n </CustomDestinationButton>\n }\n onClickTrigger={() => handleOpenChange(!open)}>\n <StyledTextField\n ref={inputRef}\n style={{\n padding: 0,\n paddingRight: customDestination ? '8px' : '5px',\n }}\n autoFocus={!customDestination}\n placeholder={i18n.t('Enter {blockchainName} address', {\n blockchainName,\n })}\n value={customDestination || ''}\n suffix={renderSuffix()}\n onChange={(e) => {\n const customDestination = e.target.value;\n setCustomDestination(customDestination);\n }}\n />\n </CustomCollapsible>\n\n {isAddressInvalid && (\n <>\n <Divider size={4} />\n <Alert\n variant=\"alarm\"\n type=\"error\"\n title={i18n.t({\n values: { destination: customDestination },\n id: \"Address {destination} doesn't match the blockchain address pattern.\",\n })}\n />\n </>\n )}\n </Container>\n );\n}\n", "import type { PropTypes } from './CustomCollapsible.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useRef } from 'react';\n\nimport {\n CollapsibleContent,\n CollapsibleRoot,\n Trigger,\n} from './CustomCollapsible.styles';\n\nexport function CustomCollapsible(props: PropsWithChildren<PropTypes>) {\n const {\n open,\n hasSelected,\n onOpenChange,\n children,\n onClickTrigger,\n trigger,\n triggerAnchor,\n } = props;\n const ref = useRef<HTMLDivElement | null>(null);\n\n return (\n <CollapsibleRoot\n ref={ref}\n className=\"collapsible_root\"\n selected={hasSelected && open}\n open={open}\n onOpenChange={onOpenChange}>\n {triggerAnchor === 'top' && (\n <Trigger className=\"collapsible_trigger\" onClick={onClickTrigger}>\n {trigger}\n </Trigger>\n )}\n <CollapsibleContent className=\"collapsible_content\" open={open}>\n {children}\n </CollapsibleContent>\n {triggerAnchor === 'bottom' && (\n <Trigger className=\"collapsible_trigger\" onClick={onClickTrigger}>\n {trigger}\n </Trigger>\n )}\n </CollapsibleRoot>\n );\n}\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport { keyframes, styled } from '@rango-dev/ui';\n\nexport const EXPANDABLE_TRANSITION_DURATION = 300;\n\nconst slideDown = keyframes({\n from: {\n height: 0,\n },\n to: {\n height: 'var(--radix-collapsible-content-height)',\n },\n});\n\nconst slideUp = keyframes({\n from: {\n height: 'var(--radix-collapsible-content-height)',\n },\n to: {\n height: 0,\n },\n});\n\nexport const CollapsibleRoot = styled(Collapsible.Root, {\n borderRadius: '$sm',\n overflow: 'hidden',\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary500',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const Trigger = styled(Collapsible.Trigger, {\n padding: '$0',\n border: 'none',\n outline: 'none',\n width: '100%',\n backgroundColor: 'transparent',\n fontFamily: 'inherit',\n cursor: 'pointer',\n});\n\nexport const CollapsibleContent = styled(Collapsible.Content, {\n overflow: 'hidden',\n variants: {\n open: {\n true: {\n animation: `${slideDown} ${EXPANDABLE_TRANSITION_DURATION}ms ease-out`,\n },\n false: {\n animation: `${slideUp} ${EXPANDABLE_TRANSITION_DURATION}ms ease-out`,\n },\n },\n },\n});\n\nexport const ExpandedIcon = styled('div', {\n transition: `all ${EXPANDABLE_TRANSITION_DURATION}ms ease`,\n display: 'flex',\n alignItems: 'center',\n variants: {\n orientation: {\n down: {\n transform: 'rotate(0)',\n },\n up: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n", "import { darkTheme, styled, TextField } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n padding: '$10 $0',\n '& .button__content': {\n display: 'flex',\n alignItems: 'center',\n },\n '& .alarms': { paddingTop: '$5' },\n '& .collapsible_content': {\n backgroundColor: '$neutral100',\n },\n '& .collapsible_root': {\n backgroundColor: '$neutral100',\n },\n});\n\nexport const StyledTextField = styled(TextField, {\n backgroundColor: '$neutral100',\n padding: '$15',\n});\n\nexport const CustomDestinationButton = styled('div', {\n width: '100%',\n borderRadius: '$sm',\n display: 'flex',\n padding: '$15',\n justifyContent: 'space-between',\n alignItems: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n borderBottomRightRadius: '0',\n borderBottomLeftRadius: '0',\n '&:focus-visible': {\n $$background: '$colors$secondary100',\n [`.${darkTheme} &`]: {\n $$background: '$colors$info700',\n },\n backgroundColor: '$$background',\n outline: 0,\n },\n});\n", "import { css, darkTheme, IconButton, styled } from '@rango-dev/ui';\n\nexport const Title = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const ListContainer = styled('div', {\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\n});\n\nexport const WalletButton = styled('button', {\n borderRadius: '$xm',\n padding: '$10',\n border: '0',\n display: 'flex',\n justifyContent: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n alignItems: 'center',\n cursor: 'pointer',\n width: 110,\n position: 'relative',\n\n '&:hover': {\n $$color: '$colors$secondary100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral100',\n },\n backgroundColor: '$$color',\n },\n\n '&:focus-visible': {\n $$color: '$colors$secondary100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$info700',\n },\n backgroundColor: '$$color',\n outline: 0,\n },\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const ShowMoreWallets = styled(WalletButton, {\n alignSelf: 'stretch',\n minHeight: '93px',\n});\nexport const ShowMoreHeader = styled('div', {\n padding: '$20 $20 $15 $20',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '$neutral200',\n position: 'relative',\n width: '100%',\n});\n\nexport const NavigateBack = styled(IconButton, {\n position: 'absolute',\n left: '$20',\n});\n\nexport const WalletsContainer = styled('div', {\n paddingTop: '$20',\n});\n\nexport const walletsListStyles = css({\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\n});\n\nexport const ConfirmButton = styled('div', {\n display: 'flex',\n});\n\nexport const Wallets = styled('div', { overflow: 'visible', width: '100%' });\n", "import type { PropTypes } from './WalletList.type';\nimport type { Wallet, WalletInfoWithExtra } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport { warn } from '@rango-dev/logging-core';\nimport {\n Divider,\n SelectableWallet,\n Typography,\n WalletState,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { WIDGET_UI_ID } from '../../constants';\nimport {\n ResultStatus,\n useStatefulConnect,\n} from '../../hooks/useStatefulConnect';\nimport { useWalletList } from '../../hooks/useWalletList';\nimport { useAppStore } from '../../store/AppStore';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainDisplayNameFor } from '../../utils/meta';\nimport {\n getAddress,\n getConciseAddress,\n isExperimentalChain,\n} from '../../utils/wallets';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { StatefulConnectModal } from '../StatefulConnectModal';\nimport { ExperimentalChain } from '../WalletStatefulConnect';\nimport { ExperimentalChainStatus } from '../WalletStatefulConnect/ExperimentalChainStatus';\n\nimport { ShowMoreWallets } from './ConfirmWallets.styles';\n\nconst ACCOUNT_ADDRESS_MAX_CHARACTERS = 7;\nconst TIME_TO_CLOSE_MODAL = 3_000;\n\nexport function WalletList(props: PropTypes) {\n const { chain, isSelected, selectWallet, limit, onShowMore } = props;\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const { blockchains } = useAppStore();\n const [selectedWalletToConnect, setSelectedWalletToConnect] =\n useState<WalletInfoWithExtra>();\n const [experimentalChainWallet, setExperimentalChainWallet] =\n useState<Wallet | null>(null);\n const [showExperimentalChainModal, setShowExperimentalChainModal] =\n useState(false);\n const [addingExperimentalChainStatus, setAddingExperimentalChainStatus] =\n useState<'in-progress' | 'completed' | 'rejected' | null>(null);\n const { suggestAndConnect } = useWallets();\n const { handleDisconnect } = useStatefulConnect();\n const { list } = useWalletList({\n chain,\n });\n\n const [sortedList, setSortedList] = useState<WalletInfoWithExtra[]>(list);\n const numberOfSupportedWallets = list.length;\n const shouldShowMoreWallets = limit && numberOfSupportedWallets - limit > 0;\n\n const addExperimentalChain = async (wallet: Wallet) => {\n setShowExperimentalChainModal(false);\n setAddingExperimentalChainStatus('in-progress');\n try {\n await suggestAndConnect(wallet.walletType, wallet.chain);\n setAddingExperimentalChainStatus('completed');\n } catch (e) {\n setAddingExperimentalChainStatus('rejected');\n }\n };\n\n useEffect(() => {\n setSortedList((sortedList) => {\n const selectedWalletIndex = list.findIndex((wallet) =>\n isSelected(wallet.type, chain)\n );\n\n if (shouldShowMoreWallets && selectedWalletIndex > 1) {\n return [list[selectedWalletIndex]].concat(\n list.filter((_, index) => index !== selectedWalletIndex)\n );\n }\n return sortedList.map(\n (sortedItem) =>\n list.find((listItem) => listItem.type === sortedItem.type) ??\n sortedItem\n );\n });\n }, [JSON.stringify(list)]);\n\n const modalContainer = document.getElementById(\n WIDGET_UI_ID.SWAP_BOX_ID\n ) as HTMLDivElement;\n\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n if (\n addingExperimentalChainStatus === 'completed' ||\n addingExperimentalChainStatus === 'rejected'\n ) {\n timeout = setTimeout(\n () => setAddingExperimentalChainStatus(null),\n TIME_TO_CLOSE_MODAL\n );\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n };\n }, [addingExperimentalChainStatus]);\n\n return (\n <>\n {sortedList.slice(0, limit).map((wallet) => {\n const address = getAddress({\n connectedWallets,\n walletType: wallet.type,\n chain,\n });\n const conciseAddress = address\n ? getConciseAddress(address, ACCOUNT_ADDRESS_MAX_CHARACTERS)\n : '';\n\n const experimentalChain = isExperimentalChain(blockchains(), chain);\n\n const experimentalChainNotAdded = !connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === wallet.type &&\n connectedWallet.chain === chain\n );\n\n const couldAddExperimentalChain =\n experimentalChain &&\n experimentalChainNotAdded &&\n wallet.state === WalletState.CONNECTED;\n\n const connectedWalletDescription = couldAddExperimentalChain\n ? i18n.t({\n id: 'Add {chain} chain',\n values: { chain },\n })\n : conciseAddress;\n\n const onSelectableWalletClick = async () => {\n const isDisconnected = wallet.state === WalletState.DISCONNECTED;\n if (isDisconnected) {\n setSelectedWalletToConnect(wallet);\n } else if (!!wallet.namespaces && !conciseAddress) {\n // wallet is connected on a different namespace\n await handleDisconnect(wallet.type);\n\n setSelectedWalletToConnect(wallet);\n } else if (couldAddExperimentalChain) {\n setExperimentalChainWallet({\n walletType: wallet.type,\n chain,\n address: address ?? '',\n });\n setShowExperimentalChainModal(true);\n } else {\n selectWallet({\n walletType: wallet.type,\n chain,\n address: address ?? '',\n });\n }\n };\n\n const blockchainDisplayName: string | undefined =\n experimentalChainWallet?.chain\n ? getBlockchainDisplayNameFor(\n experimentalChainWallet.chain,\n blockchains()\n )\n : undefined;\n return (\n <React.Fragment key={`${wallet.title}_${blockchainDisplayName}`}>\n {!!experimentalChainWallet && (\n <WatermarkedModal\n open={!!experimentalChainWallet && showExperimentalChainModal}\n container={modalContainer}\n onClose={() => {\n setExperimentalChainWallet(null);\n }}>\n <ExperimentalChain\n displayName={blockchainDisplayName}\n onConfirm={() => {\n void addExperimentalChain(experimentalChainWallet);\n }}\n />\n </WatermarkedModal>\n )}\n {addingExperimentalChainStatus && (\n <WatermarkedModal\n open={!!addingExperimentalChainStatus}\n onClose={setAddingExperimentalChainStatus.bind(null, null)}\n container={modalContainer}>\n <ExperimentalChainStatus\n status={addingExperimentalChainStatus}\n displayName={blockchainDisplayName}\n image={wallet.image}\n />\n <Divider direction=\"vertical\" size={32} />\n </WatermarkedModal>\n )}\n <SelectableWallet\n key={wallet.type}\n description={connectedWalletDescription}\n onClick={onSelectableWalletClick}\n selected={isSelected(wallet.type, chain)}\n disabled={!isActiveTab}\n {...wallet}\n />\n </React.Fragment>\n );\n })}\n <StatefulConnectModal\n wallet={selectedWalletToConnect}\n onClose={() => {\n setSelectedWalletToConnect(undefined);\n }}\n onConnect={(result) => {\n if (props.onConnect && result.status === ResultStatus.Connected) {\n if (selectedWalletToConnect?.type) {\n props.onConnect(selectedWalletToConnect.type);\n } else {\n warn(\n new Error(\n \"The selected wallet hasn't been detected after the connection process finished. It usually shouldn't happen.\"\n )\n );\n }\n }\n }}\n />\n {shouldShowMoreWallets && (\n <ShowMoreWallets selected={false} onClick={onShowMore}>\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Show more wallets')}\n <Typography variant=\"label\" size=\"medium\" color=\"$primary\">\n &nbsp;+{numberOfSupportedWallets - (limit ?? 0)}\n </Typography>\n </Typography>\n </ShowMoreWallets>\n )}\n </>\n );\n}\n", "import type { PropTypes } from './ExperimentalChainStatus.types';\n\nimport { Image, MessageBox, Spinner } from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n LogoContainer,\n WalletImageContainer,\n} from '../ConfirmWalletsModal/WalletList.styles';\n\nimport { generateMessageByStatus } from './ExperimentalChainStatus.helpers';\n\nexport function ExperimentalChainStatus(props: PropTypes) {\n const { status, displayName, image } = props;\n const data = generateMessageByStatus(status, displayName);\n const hasImage = status == 'in-progress';\n\n return (\n <MessageBox\n type={data.type}\n title={data.title}\n description={data.description}\n icon={\n hasImage ? (\n <LogoContainer>\n <WalletImageContainer>\n <Image src={image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n ) : undefined\n }\n />\n );\n}\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const LogoContainer = styled('div', {\n position: 'relative',\n});\n\nconst SpinAnimation = keyframes({\n '0%': {\n transform: 'rotate(0deg)',\n },\n '100%': {\n transform: 'rotate(360deg)',\n },\n});\n\nexport const Spinner = styled('div', {\n position: 'absolute',\n border: '2px solid rgba(0, 0, 0, 0.1)',\n borderTop: '2px solid $info500',\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n animation: `${SpinAnimation} 1s linear infinite`,\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n});\n\nexport const WalletImageContainer = styled('div', {\n '& img': {\n borderRadius: '50%',\n },\n});\n", "import type { PropTypes } from './ExperimentalChainStatus.types';\nimport type { MessageType } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\n\nexport function generateMessageByStatus(\n status: PropTypes['status'],\n blockchainDisplayName: string | undefined\n): {\n type: MessageType;\n title: string;\n description: string;\n} {\n switch (status) {\n case 'in-progress':\n return {\n type: 'loading',\n title: i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName },\n }),\n description: i18n.t({\n id: 'You should connect a {blockchainDisplayName} supported wallet or choose a different {blockchainDisplayName} address',\n values: { blockchainDisplayName },\n }),\n };\n case 'completed':\n return {\n type: 'success',\n title: i18n.t({\n id: '{blockchainDisplayName} Chain Added',\n values: { blockchainDisplayName },\n }),\n description: i18n.t({\n id: 'You should connect a {blockchainDisplayName} supported wallet or choose a different {blockchainDisplayName} address',\n values: { blockchainDisplayName },\n }),\n };\n case 'rejected':\n return {\n type: 'error',\n title: i18n.t('Request Rejected'),\n description: i18n.t({\n id: \"You've rejected adding {blockchainDisplayName} chain to your wallet.\",\n values: { blockchainDisplayName },\n }),\n };\n default:\n throw new Error(\n `Showing information about an experimentation chain status needs to be defined first. status: ${status}`\n );\n }\n}\n", "import type { PropTypes } from './QuoteWarningsAndErrors.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button, InfoIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { NoResult } from '../NoResult';\n\nimport { HighValueLossWarningModal } from './HighValueLossWarningModal';\nimport { makeAlerts } from './QuoteWarningsAndErrors.helpers';\nimport { Action, Alerts } from './QuoteWarningsAndErrors.styles';\nimport { SlippageWarningModal } from './SlippageWariningModal';\nimport { UnknownPriceWarningModal } from './UnknownPriceWarningModal';\n\nexport function QuoteWarningsAndErrors(props: PropTypes) {\n const {\n warning,\n error,\n couldChangeSettings,\n showWarningModal,\n confirmationDisabled,\n refetchQuote,\n onOpenWarningModal,\n onCloseWarningModal,\n onConfirmWarningModal,\n onChangeSettings,\n } = props;\n\n const warningModalHandlers = {\n confirmationDisabled,\n open: showWarningModal,\n onClose: onCloseWarningModal,\n onConfirm: onConfirmWarningModal,\n };\n\n const showNoResultMessage =\n error?.type === QuoteErrorType.NO_RESULT ||\n error?.type === QuoteErrorType.REQUEST_FAILED;\n\n const alertInfo = makeAlerts(\n warning,\n error?.type === QuoteErrorType.BRIDGE_LIMIT ||\n error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE\n ? error\n : null\n );\n if (alertInfo && !couldChangeSettings) {\n alertInfo.action = null;\n }\n\n const showAlerts = !!alertInfo;\n\n return (\n <>\n {showNoResultMessage && <NoResult error={error} fetch={refetchQuote} />}\n\n {showAlerts && (\n <Alerts>\n <Alert\n title={alertInfo.title}\n type={alertInfo.alertType}\n variant=\"alarm\"\n {...(alertInfo.action === 'show-info' && {\n action: (\n <Action onClick={onOpenWarningModal}>\n <InfoIcon size={12} color=\"gray\" />\n </Action>\n ),\n })}\n {...(alertInfo.action === 'change-settings' && {\n action: (\n <Button\n size=\"xxsmall\"\n type={alertInfo.alertType}\n onClick={onChangeSettings}>\n {i18n.t('Change')}\n </Button>\n ),\n })}\n />\n </Alerts>\n )}\n\n {warning && (\n <>\n {warning.type === QuoteWarningType.HIGH_VALUE_LOSS && (\n <HighValueLossWarningModal\n {...warningModalHandlers}\n warning={warning}\n />\n )}\n\n {(warning.type === QuoteWarningType.HIGH_SLIPPAGE ||\n warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) && (\n <SlippageWarningModal {...warningModalHandlers} warning={warning} />\n )}\n\n {warning.type === QuoteWarningType.UNKNOWN_PRICE && (\n <UnknownPriceWarningModal\n {...warningModalHandlers}\n warning={warning}\n />\n )}\n </>\n )}\n </>\n );\n}\n", "import type { PropTypes } from './NoResult.types';\n\nimport {\n Alert,\n Button,\n Divider,\n NoRouteIcon,\n RefreshIcon,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { useAppStore } from '../../store/AppStore';\n\nimport {\n makeInfo,\n NoRouteIconSize,\n NoRouteTitleSize,\n} from './NoResult.helpers';\nimport {\n Container,\n ErrorDescription,\n Footer,\n PrefixIcon,\n} from './NoResult.styles';\n\nexport function NoResult(props: PropTypes) {\n const { fetch, error, size = 'small' } = props;\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const toggleAllLiquiditySources = useAppStore().toggleAllLiquiditySources;\n\n const swappers = useAppStore().swappers();\n const info = makeInfo(\n error,\n disabledLiquiditySources,\n () => toggleAllLiquiditySources(swappers, true),\n fetch\n );\n\n return (\n <Container>\n <NoRouteIcon size={NoRouteIconSize[size]} color=\"gray\" />\n <Divider size={4} />\n <Typography variant=\"title\" size={NoRouteTitleSize[size]}>\n {errorMessages().noResultError.title}\n </Typography>\n {size === 'large' && <Divider size={4} />}\n {!!info.description && (\n <ErrorDescription size={size}>\n <Typography\n variant=\"body\"\n size=\"small\"\n align=\"center\"\n color=\"neutral700\">\n {info.description}\n </Typography>\n </ErrorDescription>\n )}\n <Divider size={size === 'large' ? '24' : '4'} />\n {!!info.alert && (\n <Footer size={size}>\n <Alert\n type={info.alert.type}\n title={info.alert.text}\n titleAlign={'left'}\n action={\n info.alert.action && (\n <Button\n size=\"xsmall\"\n type={info.alert.type}\n prefix={\n <PrefixIcon>\n <RefreshIcon size={8} />\n </PrefixIcon>\n }\n onClick={info.alert.action.onClick}>\n {info.alert.action.title}\n </Button>\n )\n }\n variant=\"alarm\"\n />\n </Footer>\n )}\n </Container>\n );\n}\n", "import type { Info } from './NoResult.types';\n\nimport { i18n } from '@lingui/core';\n\nimport { errorMessages } from '../../constants/errors';\nimport {\n type NoResultError,\n QuoteErrorType,\n type QuoteRequestFailed,\n} from '../../types';\n\nconst SMALL_NO_ROUTE__ICON_SIZE = 24;\nconst LARGE_NO_ROUTE_ICON_SIZE = 60;\n\nexport function makeInfo(\n error: NoResultError | QuoteRequestFailed | null,\n disabledLiquiditySources: string[],\n toggleAllLiquiditySources: (shouldReset: boolean) => void,\n refetchQuote: () => void\n): Info {\n if (error?.type === QuoteErrorType.REQUEST_FAILED) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages().genericServerError,\n action: {\n onClick: refetchQuote,\n title: i18n.t('Retry'),\n },\n },\n description: '',\n };\n } else if (disabledLiquiditySources.length) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages().liquiditySourcesError.title,\n action: {\n onClick: () => toggleAllLiquiditySources(true),\n title: i18n.t('Reset'),\n },\n },\n description: errorMessages().liquiditySourcesError.description,\n };\n } else if (\n error?.type === QuoteErrorType.NO_RESULT &&\n error.diagnosisMessage\n ) {\n return {\n alert: {\n type: 'error',\n text: error.diagnosisMessage,\n action: null,\n },\n description: '',\n };\n }\n return {\n alert: null,\n description: errorMessages().noResultError.description,\n };\n}\n\nexport enum NoRouteIconSize {\n small = SMALL_NO_ROUTE__ICON_SIZE,\n large = LARGE_NO_ROUTE_ICON_SIZE,\n}\n\nexport enum NoRouteTitleSize {\n small = 'small',\n large = 'medium',\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n});\n\nexport const ErrorDescription = styled('div', {\n variants: {\n size: {\n small: {},\n large: {\n maxWidth: '316px',\n },\n },\n },\n});\n\nexport const Footer = styled('div', {\n variants: {\n size: {\n small: {\n width: '100%',\n },\n large: {},\n },\n },\n});\n\nexport const PrefixIcon = styled('div', {\n padding: '$6 $0',\n});\n", "import type { HighValueLossWarning } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n Typography,\n WarningIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { QuoteErrorsModalItem } from './QuoteErrorsModalItem';\nimport { Flex } from './QuoteWarningsAndErrors.styles';\n\ntype Props = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: HighValueLossWarning;\n};\n\nexport function HighValueLossWarningModal(props: Props) {\n const { open, onClose, onConfirm, warning, confirmationDisabled } = props;\n const type = warning.warningLevel === 'high' ? 'error' : 'warning';\n\n const highValueLossData = [\n {\n title: i18n.t('Swapping'),\n value: numberToString(\n warning.inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Gas cost'),\n value: numberToString(\n warning.totalFee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Receiving'),\n value: numberToString(\n warning.outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Price impact'),\n value: numberToString(\n warning.priceImpact,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n ),\n valueColor: `${type}500`,\n },\n ];\n\n return (\n <WatermarkedModal\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {errorMessages().highValueLossError.confirmMessage}\n </Button>\n }\n open={open}\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n type={type}\n title={errorMessages().highValueLossError.impactTitle}\n description={errorMessages().highValueLossError.description}\n />\n\n <Flex>\n <Divider size=\"4\" />\n <Typography size=\"small\" variant=\"title\">\n {i18n.t('Details')}\n </Typography>\n <Flex>\n {highValueLossData.map((item, index) => {\n const key = index;\n return <QuoteErrorsModalItem key={key} {...item} />;\n })}\n </Flex>\n </Flex>\n </WatermarkedModal>\n );\n}\n", "import type { ModalContentData } from './QuoteWarningsAndErrors.types';\n\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Item } from './QuoteWarningsAndErrors.styles';\n\nexport function QuoteErrorsModalItem(props: ModalContentData) {\n const { title, value, valueColor } = props;\n\n return (\n <Item>\n <Typography size=\"medium\" variant=\"label\" className=\"_title\">\n {title}\n </Typography>\n <Typography\n size=\"large\"\n variant=\"label\"\n color={valueColor || 'foreground'}>\n {`${valueColor ? '%' : '$'}${value}`}\n </Typography>\n </Item>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Alerts = styled('div', {\n width: '100%',\n});\n\nexport const Flex = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: '$5',\n width: '100%',\n});\n\nexport const Item = styled('div', {\n display: 'flex',\n padding: '$5 0',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '100%',\n '._title': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Action = styled('div', {\n padding: '$2',\n alignSelf: 'flex-start',\n cursor: 'pointer',\n});\n", "import type {\n BridgeLimitError,\n InsufficientSlippageError,\n QuoteWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { getPriceImpactLevel } from '../../utils/quote';\n\ntype AlertInfo = {\n alertType: 'error' | 'warning';\n title: string;\n action: 'show-info' | 'change-settings' | null;\n};\n\nexport function makeAlerts(\n warning: QuoteWarning | null,\n error: BridgeLimitError | InsufficientSlippageError | null\n): AlertInfo | null {\n const alertInfo: AlertInfo = {\n alertType: 'warning',\n title: '',\n action: null,\n };\n if (error) {\n alertInfo.alertType = 'error';\n if (error.type === QuoteErrorType.BRIDGE_LIMIT) {\n alertInfo.title = error.recommendation;\n }\n\n if (error.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE) {\n alertInfo.title = i18n.t({\n id: 'You need to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: error.minRequiredSlippage,\n },\n });\n alertInfo.action = 'change-settings';\n }\n\n return alertInfo;\n }\n if (warning) {\n if (warning.type === QuoteWarningType.HIGH_VALUE_LOSS) {\n const warningLevel = getPriceImpactLevel(warning.priceImpact);\n if (warningLevel === 'high') {\n alertInfo.alertType = 'error';\n }\n alertInfo.action = 'show-info';\n alertInfo.title = errorMessages().highValueLossError.title;\n }\n if (warning.type === QuoteWarningType.UNKNOWN_PRICE) {\n alertInfo.title = errorMessages().unknownPriceError.title;\n }\n if (warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) {\n alertInfo.title = i18n.t({\n id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: warning.minRequiredSlippage,\n },\n });\n alertInfo.action = 'change-settings';\n }\n if (warning.type === QuoteWarningType.HIGH_SLIPPAGE) {\n alertInfo.title = i18n.t('Caution, your slippage is high.');\n alertInfo.action = 'change-settings';\n }\n return alertInfo;\n }\n return null;\n}\n", "import type {\n HighSlippageWarning,\n InsufficientSlippageWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Typography } from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useAppStore } from '../../store/AppStore';\nimport { QuoteWarningType } from '../../types';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\ntype PropsTypes = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: InsufficientSlippageWarning | HighSlippageWarning;\n};\n\nexport function SlippageWarningModal(props: PropsTypes) {\n const { customSlippage, slippage } = useAppStore();\n const { open, onClose, onConfirm, warning, confirmationDisabled } = props;\n const navigate = useNavigate();\n const userSlippage = customSlippage ?? slippage;\n\n return (\n <WatermarkedModal\n anchor=\"bottom\"\n open={open}\n prefix={\n <Button\n size=\"small\"\n variant=\"ghost\"\n onClick={() => navigate('../' + navigationRoutes.settings)}>\n <Typography variant=\"label\" size=\"medium\" color=\"$neutral900\">\n {i18n.t('Change settings')}\n </Typography>\n </Button>\n }\n container={getContainer()}\n onClose={onClose}>\n <MessageBox\n type=\"warning\"\n title={\n warning.type === QuoteWarningType.HIGH_SLIPPAGE\n ? i18n.t('High slippage')\n : i18n.t('Low slippage')\n }\n description={\n warning.type === QuoteWarningType.HIGH_SLIPPAGE\n ? i18n.t({\n id: ' Caution, your slippage is high (={userSlippage}). Your trade may be front run.',\n values: { userSlippage },\n })\n : i18n.t({\n id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: warning.minRequiredSlippage,\n },\n })\n }>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n size=\"large\"\n type=\"primary\"\n variant=\"contained\"\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {i18n.t('Confirm anyway')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import type { UnknownPriceWarning } from '../../types';\n\nimport { Button, MessageBox, WarningIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\ntype Props = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: UnknownPriceWarning;\n};\n\nexport function UnknownPriceWarningModal(props: Props) {\n const { open, onClose, onConfirm, confirmationDisabled } = props;\n return (\n <WatermarkedModal\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {errorMessages().unknownPriceError.confirmMessage}\n </Button>\n }\n open={open}\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n type=\"warning\"\n title={errorMessages().unknownPriceError.impactTitle}\n description={errorMessages().unknownPriceError.description}\n />\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './QuoteInfo.types';\n\nimport BigNumber from 'bignumber.js';\nimport React from 'react';\n\nimport { Quote } from '../../components/Quote';\nimport { QuoteSkeleton } from '../../components/QuoteSkeleton';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType } from '../../types';\nimport { getQuoteToTokenUsdPrice } from '../../utils/quote';\nimport { calcOutputUsdValue } from '../../utils/swap';\n\nimport { QuoteContainer } from './QuoteInfo.styles';\n\nexport function QuoteInfo(props: PropTypes) {\n const {\n quote,\n type,\n loading,\n error,\n warning,\n expanded = false,\n tagHidden,\n onClick,\n showModalFee,\n selected,\n onClickAllRoutes,\n fullExpandedMode = false,\n container,\n } = props;\n const { inputAmount, inputUsdValue, toToken } = useQuoteStore();\n\n const outputAmount = !!quote?.outputAmount\n ? new BigNumber(quote?.outputAmount)\n : null;\n const outputUsdValue = !!quote?.outputAmount\n ? calcOutputUsdValue(\n quote?.outputAmount,\n getQuoteToTokenUsdPrice(quote) || toToken?.usdPrice\n )\n : null;\n\n const noResult =\n error &&\n (error.type === QuoteErrorType.NO_RESULT ||\n error.type === QuoteErrorType.REQUEST_FAILED);\n\n const showQuote = !noResult && quote && !loading;\n\n if (loading) {\n return (\n <QuoteContainer>\n <QuoteSkeleton tagHidden={tagHidden} type={type} expanded={expanded} />\n </QuoteContainer>\n );\n }\n\n return showQuote ? (\n <QuoteContainer onClick={() => onClick?.(quote)}>\n <Quote\n quote={quote}\n error={error}\n container={container}\n showModalFee={showModalFee}\n warning={warning}\n tagHidden={tagHidden}\n selected={selected}\n type={type}\n expanded={expanded}\n onClickAllRoutes={onClickAllRoutes}\n fullExpandedMode={fullExpandedMode}\n input={{\n value: inputAmount,\n usdValue: inputUsdValue?.toString() ?? '',\n }}\n output={{\n value: outputAmount?.toString() ?? '',\n usdValue: outputUsdValue?.toString() ?? '',\n }}\n />\n </QuoteContainer>\n ) : null;\n}\n", "import type { QuoteProps } from './Quote.types';\nimport type { Step } from '@rango-dev/ui';\nimport type { SwapResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n Divider,\n FullExpandedQuote,\n InfoIcon,\n NumericTooltip,\n QuoteTag,\n StepDetails,\n TokenAmount,\n Typography,\n} from '@rango-dev/ui';\nimport BigNumber from 'bignumber.js';\nimport React, { useRef, useState } from 'react';\n\nimport { GAS_FEE_MAX } from '../../constants/quote';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport {\n FooterAlert,\n FooterStepAlarm,\n} from '../../containers/QuoteInfo/QuoteInfo.styles';\nimport { useAppStore } from '../../store/AppStore';\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { getContainer, getExpanded } from '../../utils/common';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport {\n numberToString,\n roundedSecondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport {\n getPriceImpact,\n getPriceImpactLevel,\n sortTags,\n} from '../../utils/quote';\nimport { getTotalFeeInUsd, getUsdFeeOfStep } from '../../utils/swap';\n\nimport {\n AllRoutesButton,\n BasicInfoOutput,\n basicInfoStyles,\n ContainerInfoOutput,\n Content,\n FrameIcon,\n HorizontalSeparator,\n Line,\n QuoteContainer,\n stepsDetailsStyles,\n SummaryContainer,\n summaryHeaderStyles,\n summaryStyles,\n TagContainer,\n} from './Quote.styles';\nimport { QuoteCostDetails } from './QuoteCostDetails';\nimport { QuoteSummary } from './QuoteSummary';\nimport { QuoteTrigger } from './QuoteTrigger';\n\nexport function Quote(props: QuoteProps) {\n const {\n quote,\n input,\n output,\n error,\n warning,\n type,\n selected = false,\n tagHidden = true,\n showModalFee = true,\n onClickAllRoutes,\n fullExpandedMode = false,\n container: propContainer,\n } = props;\n const blockchains = useAppStore().blockchains();\n const { findToken } = useAppStore();\n const swappers = useAppStore().swappers();\n const { customSlippage, slippage } = useAppStore();\n const userSlippage = customSlippage || slippage;\n const [expanded, setExpanded] = useState(props.expanded);\n const quoteRef = useRef<HTMLButtonElement | null>(null);\n const roundedInput = numberToString(\n input.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n );\n const roundedOutput = numberToString(\n output.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n );\n const roundedOutputUsdValue = output.usdValue\n ? numberToString(\n output.usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )\n : '';\n const priceImpact = getPriceImpact(input.usdValue, output.usdValue ?? null);\n const percentageChange = numberToString(\n priceImpact,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n );\n const priceImpactWarningLevel = getPriceImpactLevel(priceImpact ?? 0);\n\n const getQuoteSteps = (\n swaps: SwapResult[],\n internalSwap?: boolean\n ): Step[] => {\n return swaps.map((swap, index) => {\n let stepState: 'error' | 'warning' | undefined = undefined;\n const hasBridgeLimitError =\n error?.type === QuoteErrorType.BRIDGE_LIMIT &&\n error.swap.swapperId === swap.swapperId;\n\n const hasSlippageError =\n error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE &&\n error.recommendedSlippages?.has(index);\n\n const hasSlippageWarning =\n warning?.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE &&\n warning.recommendedSlippages?.has(index);\n\n const stepHasError = hasBridgeLimitError || hasSlippageError;\n const stepHasWarning = hasSlippageWarning;\n\n if (stepHasError) {\n stepState = 'error';\n } else if (stepHasWarning) {\n stepState = 'warning';\n }\n\n let alertTitle = stepHasError\n ? i18n.t('Slippage Error')\n : i18n.t('Slippage Warning');\n\n if (hasBridgeLimitError) {\n alertTitle = i18n.t('Bridge Limit Error');\n }\n\n return {\n swapper: {\n displayName: getSwapperDisplayName(swap.swapperId, swappers) ?? '',\n image: swap.swapperLogo,\n },\n from: {\n token: { displayName: swap.from.symbol, image: swap.from.logo },\n chain: {\n displayName:\n getBlockchainShortNameFor(swap.from.blockchain, blockchains) ??\n '',\n image: swap.from.blockchainLogo,\n },\n price: {\n value:\n index === 0 && !internalSwap\n ? numberToString(\n input.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n : numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n (swap.from.usdPrice ?? 0) * parseFloat(swap.fromAmount),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: index === 0 ? input.value : swap.fromAmount,\n realUsdValue: new BigNumber(swap.from.usdPrice ?? 0)\n .multipliedBy(swap.fromAmount)\n .toString(),\n },\n },\n to: {\n token: { displayName: swap.to.symbol, image: swap.to.logo },\n chain: {\n displayName:\n getBlockchainShortNameFor(swap.to.blockchain, blockchains) || '',\n image: swap.to.blockchainLogo,\n },\n price: {\n value: numberToString(\n swap.toAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n (swap.to.usdPrice ?? 0) * parseFloat(swap.toAmount),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: swap.toAmount,\n realUsdValue: new BigNumber(swap.to.usdPrice ?? 0)\n .multipliedBy(swap.toAmount)\n .toString(),\n },\n },\n state: stepState,\n alerts:\n stepHasError || stepHasWarning ? (\n <FooterStepAlarm dense={fullExpandedMode}>\n <Alert\n variant=\"alarm\"\n type={stepHasError ? 'error' : 'warning'}\n title={alertTitle}\n footer={\n <FooterAlert>\n {hasBridgeLimitError && (\n <div>\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {error.fromAmountRangeError}\n </Typography>\n <Divider direction=\"vertical\" size={2} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Yours: {amount} {symbol}',\n values: {\n amount: numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap?.from.symbol,\n },\n })}\n </Typography>\n </div>\n )}\n {(hasSlippageError || hasSlippageWarning) &&\n !hasBridgeLimitError && (\n <div>\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Minimum required slippage: {minRequiredSlippage}',\n values: {\n ...(error?.type ===\n QuoteErrorType.INSUFFICIENT_SLIPPAGE && {\n minRequiredSlippage:\n error.recommendedSlippages?.get(index),\n }),\n ...(warning?.type ===\n QuoteWarningType.INSUFFICIENT_SLIPPAGE && {\n minRequiredSlippage:\n warning.recommendedSlippages?.get(index),\n }),\n },\n })}\n </Typography>\n <Divider direction=\"vertical\" size={2} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Yours: {userSlippage}',\n values: {\n userSlippage,\n },\n })}\n </Typography>\n </div>\n )}\n </FooterAlert>\n }\n />\n </FooterStepAlarm>\n ) : undefined,\n time: roundedSecondsToString(swap.estimatedTimeInSeconds),\n fee: numberToString(\n getUsdFeeOfStep(swap, findToken),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n internalSwaps: swap.internalSwaps\n ? getQuoteSteps(swap.internalSwaps)\n : undefined,\n };\n });\n };\n const steps = getQuoteSteps(quote?.swaps ?? []);\n\n const numberOfSteps = steps.length;\n const container = propContainer || getContainer();\n const sortedQuoteTags = sortTags(props.quote.tags || []);\n const showAllRoutesButton = !!onClickAllRoutes;\n const totalTime = roundedSecondsToString(totalArrivalTime(quote?.swaps));\n const totalFee = getTotalFeeInUsd(quote?.swaps ?? [], findToken);\n const fee = numberToString(\n totalFee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n );\n\n const feeWarning = totalFee.gte(new BigNumber(GAS_FEE_MAX));\n\n return fullExpandedMode ? (\n <FullExpandedQuote\n selected={selected}\n fee={fee}\n time={totalTime}\n tooltipContainer={getExpanded()}\n steps={steps}\n tags={sortedQuoteTags}\n feeWarning={feeWarning}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n outputPrice={{\n value: roundedOutput,\n usdValue: roundedOutputUsdValue,\n realValue: output.value,\n realUsdValue: output.usdValue,\n }}\n />\n ) : (\n <SummaryContainer\n selected={selected}\n listItem={type === 'list-item'}\n basic={type === 'basic'}>\n <div className={summaryStyles()}>\n {!tagHidden && sortedQuoteTags.length ? (\n <>\n <TagContainer>\n {sortedQuoteTags.map((tag, index) => {\n const key = `${tag.value}_${index}`;\n return (\n <React.Fragment key={key}>\n <QuoteTag label={tag.label} value={tag.value} />\n <Divider size={4} direction=\"horizontal\" />\n </React.Fragment>\n );\n })}\n </TagContainer>\n <Line />\n {!showAllRoutesButton && <Divider size={4} />}\n </>\n ) : null}\n <div id=\"portal-root\" className={summaryHeaderStyles()}>\n <QuoteCostDetails\n quote={quote}\n time={totalTime}\n fee={fee}\n feeWarning={feeWarning}\n showModalFee={showModalFee}\n steps={numberOfSteps}\n />\n\n {showAllRoutesButton && (\n <AllRoutesButton\n onClick={(e) => {\n e.stopPropagation();\n onClickAllRoutes();\n }}\n size=\"xxsmall\"\n type=\"secondary\"\n variant=\"default\"\n css={{\n paddingLeft: '$10',\n paddingRight: '$10',\n paddingTop: '$5',\n paddingBottom: '$5',\n }}>\n <Typography\n color=\"secondary\"\n variant=\"body\"\n size=\"xsmall\"\n className=\"allRoutesLabel\">\n {i18n.t('See All Routes')}\n </Typography>\n </AllRoutesButton>\n )}\n </div>\n {type === 'basic' && (\n <div className={basicInfoStyles()}>\n <FrameIcon>\n <InfoIcon size={12} color=\"gray\" />\n </FrameIcon>\n <ContainerInfoOutput>\n <BasicInfoOutput size=\"small\" variant=\"body\">\n {`${roundedInput} ${steps[0].from.token.displayName} = `}\n </BasicInfoOutput>\n <NumericTooltip\n content={output.value}\n container={container}\n open={!output.value ? false : undefined}>\n <BasicInfoOutput size=\"small\" variant=\"body\">\n &nbsp;\n {`${roundedOutput} ${\n steps[steps.length - 1].to.token.displayName\n }`}\n </BasicInfoOutput>\n </NumericTooltip>\n </ContainerInfoOutput>\n <NumericTooltip content={output.usdValue} container={container}>\n <Divider size={2} direction=\"horizontal\" />\n <Typography color=\"$neutral600\" size=\"xsmall\" variant=\"body\">\n {`($${roundedOutputUsdValue})`}\n </Typography>\n </NumericTooltip>\n </div>\n )}\n {type === 'list-item' && (\n <TokenAmount\n tooltipContainer={container}\n type=\"output\"\n direction=\"vertical\"\n price={{\n value: roundedOutput,\n usdValue: roundedOutputUsdValue,\n realValue: output.value,\n realUsdValue: output.usdValue,\n }}\n token={{\n displayName: steps[numberOfSteps - 1].to.token.displayName,\n image: steps[numberOfSteps - 1].to.token.image,\n }}\n chain={{ image: steps[numberOfSteps - 1].to.chain.image }}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n />\n )}\n {type === 'swap-preview' && (\n <>\n <QuoteSummary\n from={steps[0].from}\n to={steps[numberOfSteps - 1].to}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n />\n <Divider size={4} />\n </>\n )}\n </div>\n <QuoteContainer\n selected={selected}\n listItem={type === 'list-item'}\n open={expanded}\n className=\"quote_container\"\n onOpenChange={setExpanded}>\n <QuoteTrigger\n type={type}\n quoteRef={quoteRef}\n selected={selected}\n setExpanded={setExpanded}\n container={container}\n expanded={expanded}\n steps={steps}\n />\n <Content open={expanded}>\n <HorizontalSeparator />\n <div className={stepsDetailsStyles()}>\n {steps.map((step, index) => {\n const key = `item-${index}`;\n return (\n <StepDetails\n type=\"quote-details\"\n key={key}\n tooltipContainer={container}\n step={step}\n hasSeparator={index !== steps.length - 1}\n state={step.state}\n />\n );\n })}\n </div>\n </Content>\n </QuoteContainer>\n </SummaryContainer>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const QuoteContainer = styled('div', {\n width: '100%',\n '& .position-top__skeleton': {\n paddingTop: '$10',\n },\n});\nexport const FooterStepAlarm = styled('div', {\n paddingBottom: '$15',\n variants: {\n dense: {\n true: {\n paddingBottom: 0,\n },\n },\n },\n});\n\nexport const FooterAlert = styled('div', {\n width: '100%',\n display: 'flex',\n});\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport {\n Button,\n css,\n darkTheme,\n Image,\n styled,\n Typography,\n} from '@rango-dev/ui';\n\nimport { CollapsibleContent } from '../CustomCollapsible/CustomCollapsible.styles';\n\nexport const EXPANDABLE_QUOTE_TRANSITION_DURATION = 300;\n\nexport const QuoteContainer = styled(Collapsible.Root, {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n overflowX: 'auto',\n overflowY: 'hidden',\n width: '100%',\n borderRadius: '$xm',\n variants: {\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n listItem: {\n true: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$secondary200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n },\n ],\n});\n\nexport const stepsDetailsStyles = css({\n padding: '$10 $15',\n});\nexport const AllRoutesButton = styled(Button, {\n backgroundColor: 'transparent',\n border: '1px solid $secondary550',\n [`.${darkTheme} &`]: {\n border: '1px solid $secondary',\n },\n transition: 'background-color 0.3s ease',\n '&:hover': {\n backgroundColor: '$secondary550',\n [`.${darkTheme} &`]: {\n backgroundColor: '$secondary',\n },\n '.allRoutesLabel': {\n $$color: '$colors$background',\n [`.${darkTheme} &`]: {\n $$color: '$colors$foreground',\n },\n color: '$$color',\n transition: 'color 0.3s ease',\n },\n },\n});\nexport const SummaryContainer = styled('div', {\n borderRadius: '$xm',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n justifyContent: 'space-between',\n color: '$foreground',\n boxSizing: 'border-box',\n position: 'relative',\n variants: {\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n },\n },\n basic: { true: { borderTopRightRadius: '0', borderTopLeftRadius: '0' } },\n listItem: {\n true: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n '&:hover': {\n '& .quote_container': {\n '& button': {\n backgroundColor: '$neutral500',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral200',\n },\n },\n backgroundColor: '$neutral500',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral200',\n },\n },\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n },\n cursor: 'pointer',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: true,\n selected: true,\n css: {\n outline: '1px solid $secondary',\n },\n },\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$secondary100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary550',\n },\n backgroundColor: '$$color',\n '&:hover': {\n backgroundColor: '$$color',\n },\n },\n },\n {\n listItem: true,\n selected: false,\n css: {\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n },\n },\n },\n ],\n});\n\nexport const summaryStyles = css({\n width: '100%',\n padding: '$15 $15 $10 $15',\n});\n\nexport const summaryHeaderStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingBottom: '$10',\n position: 'relative',\n});\n\nexport const rowStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n '.blockchainImage': {\n marginLeft: '-$8',\n },\n});\nexport const basicInfoStyles = css({\n display: 'flex',\n alignItems: 'center',\n '.usd-value': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Trigger = styled(Collapsible.Trigger, {\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n height: '$36',\n padding: '$10 $15',\n boxSizing: 'border-box',\n cursor: 'pointer',\n border: 'none',\n outline: 'none',\n backgroundColor: 'transparent',\n variants: {\n error: {\n true: {\n [`& ${Image}`]: {\n border: '1px $warning500 solid',\n borderRadius: '100%',\n },\n },\n false: {\n [`& ${Image}`]: {\n border: '1px transparent solid',\n borderRadius: '100%',\n },\n },\n },\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n listItem: {\n true: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$secondary200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n },\n ],\n '.blockchains_section': {\n display: 'none',\n },\n '@xs': {\n '.blockchains_section': {\n display: 'block',\n },\n },\n});\n\nexport const ImageContainer = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n border: '1.5px transparent solid',\n img: {\n borderRadius: '100%',\n },\n variants: {\n state: {\n error: {\n borderColor: '$error500',\n },\n warning: { borderColor: '$warning500' },\n },\n },\n});\n\nexport const Content = styled(CollapsibleContent, {\n width: '100%',\n background: 'inherit',\n});\n\nexport const IconContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '$2',\n transition: `all ${EXPANDABLE_QUOTE_TRANSITION_DURATION}ms ease`,\n variants: {\n orientation: {\n down: {\n transform: 'rotate(0)',\n },\n up: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n\nexport const Separator = styled('div', {\n height: '$12',\n marginLeft: '$10',\n marginRight: '$10',\n borderLeft: '1px solid $foreground',\n});\n\nexport const HorizontalSeparator = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n margin: '0 $15',\n borderTop: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n});\n\nexport const FrameIcon = styled('div', {\n width: '$16',\n height: '$16',\n justifyContent: 'center',\n alignItems: 'center',\n display: 'flex',\n});\n\nexport const BasicInfoOutput = styled(Typography, {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n letterSpacing: 0.4,\n});\n\nexport const ContainerInfoOutput = styled('div', {\n display: 'flex',\n flexWrap: 'wrap',\n});\n\nexport const MoreStep = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n backgroundColor: '$background',\n cursor: 'default',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n border: '1.5px transparent solid',\n variants: {\n state: {\n error: {\n borderColor: '$error500',\n },\n warning: { borderColor: '$warning500' },\n },\n },\n});\n\nexport const TagContainer = styled('div', {\n display: 'flex',\n});\n\nexport const Line = styled('div', {\n width: '100%',\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderTopColor: '$neutral',\n margin: '$5 0',\n [`.${darkTheme} &`]: {\n borderTopColor: '$neutral800',\n },\n});\n", "import type { QuoteCostDetailsProps } from './Quote.types';\nimport type { NameOfFees } from '../../constants/quote';\nimport type BigNumber from 'bignumber.js';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n CloseIcon,\n Divider,\n IconButton,\n NumericTooltip,\n QuoteCost,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { getFeeLabel } from '../../constants/quote';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\nimport { getFeesGroup, getTotalFeesInUsd, getUsdFee } from '../../utils/swap';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomCollapsible } from '../CustomCollapsible/CustomCollapsible';\nimport { ExpandedIcon } from '../CustomCollapsible/CustomCollapsible.styles';\n\nimport {\n FeeSection,\n Line,\n ModalContainer,\n ModalHeader,\n trigger,\n} from './QuoteCostDetails.styles';\n\nconst NonPayableFee = (props: { fee: BigNumber; label: string }) => {\n return !props.fee.isZero() ? (\n <FeeSection>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral600\">\n {props.label}\n </Typography>\n <Typography variant=\"label\" size=\"medium\">\n $\n {numberToString(\n props.fee,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n </Typography>\n </FeeSection>\n ) : null;\n};\n\nexport function QuoteCostDetails(props: QuoteCostDetailsProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [openCollapse, setOpenCollapse] = useState<boolean>(false);\n const { steps, quote, fee, time, feeWarning, showModalFee } = props;\n const swaps = quote?.swaps ?? [];\n const container = getContainer();\n\n const feesGroup = getFeesGroup(swaps);\n\n return (\n <>\n <QuoteCost\n onClickFee={\n showModalFee\n ? (e) => {\n e.stopPropagation();\n setOpen(!open);\n }\n : undefined\n }\n fee={fee}\n feeWarning={feeWarning}\n time={time}\n steps={steps}\n tooltipGas={showModalFee ? i18n.t('View more info') : undefined}\n tooltipContainer={container}\n />\n\n <WatermarkedModal\n container={container}\n open={open}\n header={\n <ModalHeader>\n <Typography variant=\"title\" size=\"medium\">\n {i18n.t('Gas & Fee Explanation')}\n </Typography>\n\n <IconButton onClick={() => setOpen(false)} variant=\"ghost\">\n <CloseIcon color=\"gray\" size={14} />\n </IconButton>\n </ModalHeader>\n }\n onClose={() => {\n setOpen(false);\n }}>\n <ModalContainer>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Details')}\n </Typography>\n <Divider size={10} />\n {Object.entries(feesGroup.payable).flatMap(\n ([payableFeesKey, feeArray]) =>\n feeArray.map((fee, index) => {\n const key = `payable-fee-${index}`;\n const usdValue = getUsdFee(fee);\n return (\n <FeeSection key={key}>\n <Typography\n variant=\"label\"\n size=\"medium\"\n color=\"neutral600\">\n {getFeeLabel(payableFeesKey as NameOfFees, i18n.t)}\n </Typography>\n <NumericTooltip content={fee.amount} container={container}>\n <Typography variant=\"label\" size=\"medium\">\n {numberToString(\n fee.amount,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}{' '}\n {fee.asset.symbol} ($\n {numberToString(\n usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n )\n </Typography>\n </NumericTooltip>\n </FeeSection>\n );\n })\n )}\n\n <FeeSection className=\"total_payable_fee\">\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Total Payable Fee')}\n </Typography>\n <Typography variant=\"label\" size=\"medium\">\n $\n {numberToString(\n fee,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n </Typography>\n </FeeSection>\n <Line />\n {Object.keys(feesGroup.nonePayable).length && (\n <CustomCollapsible\n triggerAnchor=\"bottom\"\n onClickTrigger={() => setOpenCollapse((prev) => !prev)}\n trigger={\n <div className={trigger()}>\n <Typography size=\"small\" variant=\"body\" color=\"neutral700\">\n {openCollapse\n ? i18n.t('Hide non-payable fees')\n : i18n.t('Show non-payable fees')}\n </Typography>\n <Divider size={4} direction=\"horizontal\" />\n <ExpandedIcon orientation={openCollapse ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"gray\" />\n </ExpandedIcon>\n </div>\n }\n open={openCollapse}>\n <Typography size=\"small\" variant=\"title\">\n {i18n.t('Description')}\n </Typography>\n <Divider size={4} />\n <Typography size=\"small\" variant=\"body\" color=\"neutral700\">\n {i18n.t(`The following fees are considered in the transaction output and\n you won\u2019t need to pay extra gas for them.`)}\n </Typography>\n <Divider size={10} />\n {Object.entries(feesGroup.nonePayable).map(\n ([nonPayableFeesKey, fees], index) => {\n const totalFeeInUsd = getTotalFeesInUsd(fees);\n const label = getFeeLabel(\n nonPayableFeesKey as NameOfFees,\n i18n.t\n );\n const key = `non-payable-fee-${index}`;\n return (\n <NonPayableFee\n key={key}\n fee={totalFeeInUsd}\n label={label}\n />\n );\n }\n )}\n\n <Line />\n </CustomCollapsible>\n )}\n </ModalContainer>\n </WatermarkedModal>\n </>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const FeeSection = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$5 0',\n '&.total_payable_fee': {\n padding: '$12 0',\n },\n});\n\nexport const Line = styled('div', {\n width: '100%',\n borderTop: '1px solid $neutral300',\n margin: '$10 0',\n});\n\nexport const ModalContainer = styled('div', {\n padding: '$20 0',\n display: 'flex',\n flexDirection: 'column',\n '& .collapsible_trigger': {\n display: 'flex',\n alignItems: 'center',\n },\n});\n\nexport const ModalHeader = styled('div', {\n padding: '$20 $20 $10',\n textAlign: 'center',\n position: 'relative',\n '._icon-button': {\n position: 'absolute',\n zIndex: 10,\n top: '$16',\n right: '$16',\n },\n});\nexport const trigger = css({\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n padding: '$5',\n '&:hover': {\n '& ._typography, & svg': {\n color: '$secondary',\n },\n },\n});\n", "import type { PriceImpactWarningLevel, Step } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\nimport { TokenAmount } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport { Container, separatorStyles } from './QuoteSummary.styles';\n\ntype PropTypes = {\n from: Step['from'];\n to: Step['to'];\n percentageChange?: string | null;\n warningLevel: PriceImpactWarningLevel;\n};\n\nexport function QuoteSummary(props: PropTypes) {\n const { from, to, percentageChange, warningLevel } = props;\n\n return (\n <Container>\n <TokenAmount\n direction=\"horizontal\"\n label={i18n.t('Swap input')}\n type=\"input\"\n tooltipContainer={getContainer()}\n price={{\n value: from.price.value,\n usdValue: from.price.usdValue,\n realValue: from.price.realValue,\n realUsdValue: from.price.realUsdValue,\n }}\n token={{\n displayName: from.token.displayName,\n image: from.token.image,\n }}\n chain={{ image: from.chain.image }}\n />\n <div className={separatorStyles()} />\n <TokenAmount\n direction=\"horizontal\"\n tooltipContainer={getContainer()}\n label={i18n.t('Estimated output')}\n type=\"output\"\n price={{\n value: to.price.value,\n usdValue: to.price.usdValue,\n realValue: to.price.realValue,\n realUsdValue: to.price.realUsdValue,\n }}\n token={{\n displayName: to.token.displayName,\n image: to.token.image,\n }}\n chain={{ image: to.chain.image }}\n percentageChange={percentageChange}\n warningLevel={warningLevel}\n />\n </Container>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n});\n\nexport const separatorStyles = css({\n height: '14px',\n marginLeft: '14px',\n position: 'absolute',\n borderLeft: '1px solid $foreground',\n top: '42%',\n});\n", "import type { QuoteTriggerImagesProps, QuoteTriggerProps } from './Quote.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n Divider,\n Image,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport useScreenDetect from '../../hooks/useScreenDetect';\nimport { getContainer } from '../../utils/common';\nimport { getUniqueBlockchains } from '../../utils/quote';\n\nimport {\n IconContainer,\n ImageContainer,\n MoreStep,\n rowStyles,\n Trigger,\n} from './Quote.styles';\n\nconst MAX_STEPS = 4;\nconst MAX_BLOCKCHAINS = 6;\n\nconst ImageComponent = (props: QuoteTriggerImagesProps) => {\n const { content, src, className, open, state, container } = props;\n const tooltipContainer = container || getContainer();\n return (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n sideOffset={4}\n open={open}\n content={content}>\n <ImageContainer className={className} state={state}>\n <Image src={src} size={16} />\n </ImageContainer>\n </Tooltip>\n );\n};\n\nexport function QuoteTrigger(props: QuoteTriggerProps) {\n const { quoteRef, selected, setExpanded, steps, expanded, type, container } =\n props;\n const tooltipContainer = container || getContainer();\n const numberOfSteps = steps.length;\n const blockchains = getUniqueBlockchains(steps);\n const { isTablet, isMobile } = useScreenDetect();\n\n return (\n <Trigger\n listItem={type === 'list-item'}\n ref={(ref) => (quoteRef.current = ref)}\n selected={selected}\n onClick={(e) => {\n e.stopPropagation();\n setExpanded((prevState) => !prevState);\n }}>\n <div className={rowStyles()}>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('Via:')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n {steps.map((step, index) => {\n const key = `item-${index}`;\n const arrow = (\n <IconContainer>\n <ChevronRightIcon size={12} color=\"black\" />\n </IconContainer>\n );\n\n return isMobile || isTablet ? (\n <React.Fragment key={key}>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n container={container}\n />\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n ) : (\n <React.Fragment key={key}>\n {numberOfSteps <= MAX_STEPS ||\n (numberOfSteps > MAX_STEPS && index < MAX_STEPS - 1) ? (\n <>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n container={container}\n />\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </>\n ) : (\n index === MAX_STEPS - 1 && (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n align=\"end\"\n sideOffset={4}\n content={\n <div className={rowStyles()}>\n {arrow}\n {steps.map((step, i) => {\n const key = `image-${i}`;\n return (\n i >= index && (\n <React.Fragment key={key}>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n open={false}\n />\n {i !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n )\n );\n })}\n </div>\n }>\n <MoreStep\n state={\n steps.find(\n (step, i) =>\n i >= index &&\n (step.state === 'error' || step.state === 'warning')\n )?.state\n }>\n <Typography size=\"xsmall\" variant=\"body\">\n +{numberOfSteps - index}\n </Typography>\n </MoreStep>\n </Tooltip>\n )\n )}\n </React.Fragment>\n );\n })}\n </div>\n <div className={rowStyles()}>\n <div className=\"blockchains_section\">\n <div className={rowStyles()}>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('Chains:')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n {blockchains.map((blockchain, index) => (\n <React.Fragment key={blockchain.displayName}>\n {blockchains.length <= MAX_BLOCKCHAINS ||\n (blockchains.length > MAX_BLOCKCHAINS &&\n index < MAX_BLOCKCHAINS - 1) ? (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n content={blockchain.displayName}\n sideOffset={4}>\n <ImageComponent\n content={''}\n src={blockchain.image}\n open={false}\n className={index !== 0 ? 'blockchainImage' : ''}\n />\n </Tooltip>\n ) : (\n index === MAX_BLOCKCHAINS - 1 && (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n align=\"end\"\n sideOffset={4}\n content={\n <div className={rowStyles()}>\n {blockchains.map(\n (chain, i) =>\n i >= index && (\n <ImageComponent\n key={chain.displayName}\n content={''}\n src={chain.image}\n open={false}\n className={i > index ? 'blockchainImage' : ''}\n container={container}\n />\n )\n )}\n </div>\n }>\n <MoreStep className={'blockchainImage'}>\n <Typography size=\"xsmall\" variant=\"body\">\n +{blockchains.length - index}\n </Typography>\n </MoreStep>\n </Tooltip>\n )\n )}\n </React.Fragment>\n ))}\n\n <Divider direction=\"horizontal\" size={32} />\n </div>\n </div>\n\n <IconContainer orientation={expanded ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"black\" />\n </IconContainer>\n </div>\n </Trigger>\n );\n}\n", "import { useLayoutEffect, useState } from 'react';\n\n/*\n * mobile: screen <= 480\n * tablet: screen > 480 and screen <= 768\n * notebook: screen > 768 & screen <= 1024\n * large: screen > 1024 & screen <= 1200\n * extra large: screen > 1200\n */\n\nconst MIN_TABLET_WIDTH = 480;\nconst MIN_NOTEBOOK_WIDTH = 768;\nconst MIN_LARGE_SCREEN_WIDTH = 1024;\nconst MIN_EXTRA_LARGE_SCREEN_WIDTH = 1200;\n\nconst useScreenDetect = () => {\n const [isMobile, setIsMobile] = useState(false);\n const [isTablet, setIsTablet] = useState(false);\n const [isNotebook, setIsNotebook] = useState(false);\n const [isLargeScreen, setIsLargeScreen] = useState(false);\n const [isExtraLargeScreen, setIsExtraLargeScreen] = useState(false);\n\n const handleResize = () => {\n setIsMobile(window.innerWidth <= MIN_TABLET_WIDTH);\n setIsTablet(\n window.innerWidth > MIN_TABLET_WIDTH &&\n window.innerWidth <= MIN_NOTEBOOK_WIDTH\n );\n setIsNotebook(\n window.innerWidth > MIN_NOTEBOOK_WIDTH &&\n window.innerWidth <= MIN_LARGE_SCREEN_WIDTH\n );\n setIsLargeScreen(\n window.innerWidth > MIN_LARGE_SCREEN_WIDTH &&\n window.innerWidth <= MIN_EXTRA_LARGE_SCREEN_WIDTH\n );\n setIsExtraLargeScreen(window.innerWidth > MIN_EXTRA_LARGE_SCREEN_WIDTH);\n };\n\n useLayoutEffect(() => {\n handleResize(); // Initial check\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return { isMobile, isTablet, isNotebook, isLargeScreen, isExtraLargeScreen };\n};\n\nexport default useScreenDetect;\n", "import type { PropTypes } from './QuoteSkeleton.types';\n\nimport { Divider, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Chains, Container, Steps } from './QuoteSkeleton.styles';\nimport { QuoteSummarySkeleton } from './QuoteSummarySkeleton';\nimport { StepSkeleton } from './StepSkeleton';\n\nexport function QuoteSkeleton(props: PropTypes) {\n const { type, expanded, tagHidden = false } = props;\n\n return (\n <Container expanded={expanded} rounded={type !== 'basic'}>\n <QuoteSummarySkeleton type={type} tagHidden={tagHidden} />\n <Chains>\n <Skeleton height={15} variant=\"rounded\" />\n </Chains>\n\n {expanded && (\n <Steps>\n <Divider size={24} />\n <StepSkeleton />\n <StepSkeleton />\n <StepSkeleton separator={false} />\n </Steps>\n )}\n </Container>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n borderBottomLeftRadius: '$xm',\n borderBottomRightRadius: '$xm',\n padding: '$15',\n variants: {\n rounded: {\n true: {\n borderRadius: '$xm',\n },\n },\n expanded: {\n true: {\n paddingBottom: '3px',\n },\n false: {\n paddingBottom: '$12',\n },\n },\n },\n});\n\nexport const Chains = styled('div', {\n paddingTop: '$2',\n});\n\nexport const Steps = styled('div', {\n paddingLeft: '$8',\n});\n\nexport const StepSeparator = styled('div', {\n borderLeft: '1px dashed $foreground',\n minHeight: ' 0',\n margin: '0px 11.5px',\n alignSelf: 'stretch',\n variants: {\n hideSeparator: {\n true: {\n minHeight: 'unset',\n height: '0',\n },\n },\n },\n});\n", "import type { PropTypes } from './QuoteSummarySkeleton.types';\n\nimport { ChainToken, Divider, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Line } from '../Quote/Quote.styles';\n\nimport {\n BasicSummary,\n FlexContent,\n Output,\n OutputTokenInfo,\n QuoteSummary,\n QuoteSummarySeparator,\n RowStyle,\n SwapPreview,\n TokenAmount,\n TokenAmountLabel,\n} from './QuoteSummarySkeleton.styles';\n\nexport function QuoteSummarySkeleton(props: PropTypes) {\n const { type, tagHidden = true } = props;\n const quotePreview = (\n <QuoteSummary>\n <TokenAmount>\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider size={8} direction=\"horizontal\" />\n <TokenAmountLabel>\n <Skeleton height={10} width={60} variant=\"rounded\" />\n <Divider size={4} />\n <Skeleton height={15} variant=\"rounded\" />\n </TokenAmountLabel>\n </TokenAmount>\n <Skeleton height={12} width={64} variant=\"rounded\" />\n </QuoteSummary>\n );\n const showAllRoutesSkeleton = type === 'basic' && !tagHidden;\n\n return (\n <div>\n {!tagHidden && (\n <>\n <FlexContent>\n <Skeleton width={65} height={20} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={65} height={20} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={65} height={20} variant=\"rounded\" />\n </FlexContent>\n <Line />\n {!showAllRoutesSkeleton && <Divider size={4} />}\n </>\n )}\n <div className={RowStyle()}>\n <FlexContent>\n <Skeleton width={60} height={10} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={60} height={10} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </FlexContent>\n {showAllRoutesSkeleton && (\n <Skeleton width={85} height={24} variant=\"rounded\" />\n )}\n </div>\n\n {type === 'basic' && (\n <BasicSummary>\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </BasicSummary>\n )}\n {type === 'list-item' && (\n <Output>\n <OutputTokenInfo>\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton height={15} width={150} variant=\"rounded\" />\n </OutputTokenInfo>\n <Divider size={10} />\n <Skeleton height={10} width={184} variant=\"rounded\" />\n </Output>\n )}\n {type === 'swap-preview' && (\n <>\n <Divider size={4} />\n <SwapPreview>\n {quotePreview}\n <QuoteSummarySeparator />\n {quotePreview}\n </SwapPreview>\n <Divider size={12} />\n </>\n )}\n </div>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const FlexContent = styled('div', {\n display: 'flex',\n});\n\nexport const BasicSummary = styled('div', {\n padding: '$10 $0 $20',\n});\n\nexport const Output = styled('div', {\n padding: '14px $0 $20 $0',\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const OutputTokenInfo = styled('div', {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n});\n\nexport const QuoteSummary = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'end',\n});\n\nexport const QuoteSummarySeparator = styled('div', {\n height: '$24',\n marginLeft: '13px',\n borderLeft: '1px solid $neutral700',\n});\n\nexport const TokenAmount = styled('div', {\n width: '65%',\n display: 'flex',\n justifyContent: 'start',\n});\n\nexport const TokenAmountLabel = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n flexGrow: 1,\n maxWidth: '148px',\n});\n\nexport const SwapPreview = styled('div', { padding: '$15 $0 $15 $0' });\n\nexport const RowStyle = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n", "import type { PropTypes } from './StepSkeleton.types';\n\nimport { ChainToken, Divider, NextIcon, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { StepSeparator } from './QuoteSkeleton.styles';\nimport {\n StepContent,\n StepIconContainer,\n StepTitle,\n StepTokenInfo,\n StepTokens,\n} from './StepSkeleton.styles';\n\nexport function StepSkeleton(props: PropTypes) {\n const { separator = true } = props;\n return (\n <>\n <StepTitle>\n <Skeleton height={22} width={22} variant=\"circular\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </StepTitle>\n <StepContent>\n <StepSeparator hideSeparator={!separator} />\n <StepTokens extraSpace={separator}>\n <StepTokenInfo>\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} variant=\"rounded\" />\n </StepTokenInfo>\n <StepIconContainer>\n <NextIcon color=\"gray\" size={16} />\n </StepIconContainer>\n <StepTokenInfo>\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} variant=\"rounded\" />\n </StepTokenInfo>\n </StepTokens>\n </StepContent>\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const StepContent = styled('div', {\n display: 'flex',\n alignItems: 'start',\n});\n\nexport const StepTokens = styled('div', {\n flexGrow: 1,\n paddingTop: '$5',\n paddingBottom: '$10',\n display: 'flex',\n alignItems: 'center',\n variants: {\n extraSpace: {\n true: {\n paddingBottom: '$40',\n },\n },\n },\n});\n\nexport const StepTokenInfo = styled('div', {\n display: 'flex',\n alignItems: 'center',\n flexGrow: 1,\n});\n\nexport const StepIconContainer = styled('div', {\n margin: '$0 $2',\n padding: '$4',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const StepTitle = styled('div', {\n display: 'flex',\n alignItems: 'center',\n});\n", "import type { ConfirmSwap } from './useConfirmSwap.types';\nimport type { PendingSwapSettings, SelectedQuote } from '../../types';\nimport type { ConfirmRouteRequest } from 'rango-sdk';\n\nimport { calculatePendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { getWalletsForNewSwap } from '../../utils/swap';\nimport { useFetchConfirmQuote } from '../useFetchConfirmQuote';\n\nimport {\n generateWarnings,\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap.helpers';\n\nexport function useConfirmSwap(): ConfirmSwap {\n const {\n fromToken,\n toToken,\n inputAmount,\n setSelectedQuote,\n selectedQuote: initialQuote,\n customDestination: customDestinationFromStore,\n setQuoteWarningsConfirmed,\n resetAlerts,\n } = useQuoteStore();\n\n const { slippage, customSlippage } = useAppStore();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const { findToken } = useAppStore();\n\n const userSlippage = customSlippage || slippage;\n\n const { fetch: fetchQuote, cancelFetch, loading } = useFetchConfirmQuote();\n\n useEffect(() => cancelFetch, []);\n\n const fetch: ConfirmSwap['fetch'] = async (params) => {\n const selectedWallets = params.selectedWallets;\n const customDestination =\n params?.customDestination ?? customDestinationFromStore;\n\n if (!fromToken || !toToken || !inputAmount) {\n return {\n quote: null,\n swap: null,\n error: null,\n warnings: null,\n };\n }\n\n const wallets = selectedWallets.reduce(\n (acc: Record<string, string>, item) => {\n acc[item.chain] = item.address;\n return acc;\n },\n {}\n );\n const requestBody: ConfirmRouteRequest = {\n requestId: initialQuote?.requestId || '',\n selectedWallets: wallets,\n destination: customDestination || undefined,\n };\n\n try {\n return await fetchQuote(requestBody, true).then((response) => {\n const { result } = response;\n\n throwErrorIfResponseIsNotValid({\n diagnosisMessages: result.diagnosisMessages,\n requestId: result.requestId,\n swaps: result.result?.swaps,\n });\n\n const currentQuote: SelectedQuote = {\n outputAmount: result.result?.outputAmount,\n requestId: result.requestId,\n resultType: result.result?.resultType,\n swaps: result.result?.swaps || [],\n validationStatus: result.validationStatus,\n requestAmount: result.requestAmount,\n };\n setSelectedQuote(currentQuote);\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n\n const confirmSwapWarnings = generateWarnings(\n initialQuote ?? undefined,\n currentQuote,\n {\n fromToken,\n toToken,\n meta: { blockchains },\n findToken,\n selectedWallets,\n userSlippage,\n }\n );\n if (confirmSwapWarnings.quoteUpdate) {\n setQuoteWarningsConfirmed(false);\n }\n resetAlerts();\n\n const proceedAnyway = !!confirmSwapWarnings.balance;\n\n const swap = calculatePendingSwap(\n inputAmount.toString(),\n result,\n getWalletsForNewSwap(selectedWallets),\n swapSettings,\n proceedAnyway ? false : true,\n { blockchains, tokens }\n );\n\n return {\n quote: currentQuote,\n swap,\n error: null,\n warnings: confirmSwapWarnings,\n };\n });\n } catch (error: any) {\n const confirmSwapResult = handleQuoteErrors(error);\n return confirmSwapResult;\n }\n };\n\n return {\n loading,\n fetch,\n cancelFetch,\n };\n}\n", "import type { RequestOptions } from 'rango-sdk';\n\nimport { useRef, useState } from 'react';\n\ntype UseFetchOptions<TRequest, TResponse> = {\n request: (\n requestBody: TRequest,\n options?: RequestOptions\n ) => Promise<TResponse>;\n};\nexport type UseFetchResult<TRequest, TResponse> = {\n fetch: (requestBody: TRequest, retryOnFail?: boolean) => Promise<TResponse>;\n cancelFetch: () => void;\n loading: boolean;\n};\n\nconst RETRY_DELAY = 2_000;\n\nexport function useFetch<TRequest, TResponse>({\n request,\n}: UseFetchOptions<TRequest, TResponse>): UseFetchResult<TRequest, TResponse> {\n const [loading, setLoading] = useState(false);\n const abortController = useRef<AbortController | null>(null);\n\n const cancelFetch = () => abortController.current?.abort();\n\n const retryFetch = async (requestBody: TRequest) => {\n await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY));\n return await fetch(requestBody, false);\n };\n\n const fetch: UseFetchResult<TRequest, TResponse>['fetch'] = async (\n requestBody,\n retryOnFail = false\n ) => {\n cancelFetch();\n abortController.current = new AbortController();\n\n setLoading(true);\n try {\n const res = await request(requestBody, {\n signal: abortController.current.signal,\n });\n\n abortController.current = null;\n return res;\n // eslint-disable-next-line no-useless-catch\n } catch (error) {\n if (retryOnFail) {\n return await retryFetch(requestBody);\n }\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n return { fetch, loading, cancelFetch };\n}\n", "import type { UseFetchResult } from './useFetch';\nimport type { ConfirmRouteRequest, ConfirmRouteResponse } from 'rango-sdk';\n\nimport { httpService } from '../services/httpService';\n\nimport { useFetch } from './useFetch';\n\nexport function useFetchConfirmQuote(): UseFetchResult<\n ConfirmRouteRequest,\n ConfirmRouteResponse\n> {\n const { fetch, loading, cancelFetch } = useFetch<\n ConfirmRouteRequest,\n ConfirmRouteResponse\n >({\n request: async (requestBody, options) =>\n await httpService().confirmRouteRequest(requestBody, options),\n });\n\n return { fetch, loading, cancelFetch };\n}\n", "import type { ConfirmSwapFetchResult } from './useConfirmSwap.types';\nimport type { FindToken } from '../../store/slices/data';\nimport type {\n ConfirmSwapWarnings,\n QuoteErrorResponse,\n QuoteResponse,\n SelectedQuote,\n Wallet,\n} from '../../types';\nimport type { BlockchainMeta, SwapResult, Token } from 'rango-sdk';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType, QuoteUpdateType } from '../../types';\nimport { numberToString } from '../../utils/numbers';\nimport {\n generateQuoteWarnings,\n getPriceImpact,\n isNumberOfSwapsChanged,\n isQuoteChanged,\n isQuoteInternalCoinsUpdated,\n isQuoteSwappersUpdated,\n} from '../../utils/quote';\nimport {\n checkSlippageErrors,\n generateBalanceWarnings,\n getLimitErrorMessage,\n getMinRequiredSlippage,\n getQuoteOutputAmount,\n hasLimitError,\n isOutputAmountChangedALot,\n} from '../../utils/swap';\n\n/**\n * A request can be successful but in body of the response, it can be some case which is considered as failed.\n */\nexport function throwErrorIfResponseIsNotValid(response: QuoteResponse) {\n if (!response.swaps) {\n throw new Error(errorMessages().noResultError.title, {\n cause: {\n type: QuoteErrorType.NO_RESULT,\n diagnosisMessage: response.diagnosisMessages?.[0],\n },\n });\n }\n const quoteError = getQuoteError(response.swaps);\n if (quoteError) {\n throw new Error(quoteError.message, {\n cause: quoteError.options,\n });\n }\n}\n\nexport function getQuoteError(swaps: SwapResult[]): QuoteErrorResponse | null {\n const limitError = hasLimitError(swaps);\n if (limitError) {\n const { swap, recommendation, fromAmountRangeError } =\n getLimitErrorMessage(swaps);\n return {\n message: 'bridge limit error',\n options: {\n type: QuoteErrorType.BRIDGE_LIMIT,\n swap,\n recommendation,\n fromAmountRangeError,\n },\n };\n }\n\n const recommendedSlippages = checkSlippageErrors(swaps);\n\n if (recommendedSlippages) {\n const minRequiredSlippage = getMinRequiredSlippage(swaps);\n return {\n message: '',\n options: {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages,\n minRequiredSlippage,\n },\n };\n }\n return null;\n}\n\nexport function generateWarnings(\n previousQuote: SelectedQuote | undefined,\n currentQuote: SelectedQuote,\n params: {\n fromToken: Token;\n toToken: Token;\n meta: { blockchains: BlockchainMeta[] };\n selectedWallets: Wallet[];\n userSlippage: number;\n findToken: FindToken;\n }\n): ConfirmSwapWarnings {\n let quoteChanged = false;\n if (previousQuote) {\n quoteChanged = isQuoteChanged(previousQuote, currentQuote);\n }\n const output: ConfirmSwapWarnings = {\n quote: null,\n quoteUpdate: null,\n balance: null,\n };\n\n const quoteWarning = generateQuoteWarnings(currentQuote, {\n fromToken: params.fromToken,\n toToken: params.toToken,\n findToken: params.findToken,\n userSlippage: params.userSlippage,\n });\n\n if (quoteWarning) {\n output.quote = quoteWarning;\n }\n\n if (previousQuote && quoteChanged) {\n if (isOutputAmountChangedALot(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED,\n newOutputAmount: numberToString(getQuoteOutputAmount(currentQuote)),\n percentageChange: numberToString(\n getPriceImpact(\n getQuoteOutputAmount(previousQuote) ?? '',\n getQuoteOutputAmount(currentQuote) ?? ''\n ),\n null,\n 2\n ),\n };\n } else if (isNumberOfSwapsChanged(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_UPDATED,\n };\n } else if (isQuoteSwappersUpdated(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_SWAPPERS_UPDATED,\n };\n } else if (isQuoteInternalCoinsUpdated(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_COINS_UPDATED,\n };\n }\n }\n\n const balanceWarnings = generateBalanceWarnings(\n currentQuote,\n params.selectedWallets,\n params.meta.blockchains\n );\n\n const enoughBalance = balanceWarnings.length === 0;\n\n if (!enoughBalance) {\n output.balance = {\n messages: balanceWarnings,\n };\n }\n\n return output;\n}\n\nexport function handleQuoteErrors(error: any): ConfirmSwapFetchResult {\n if (error?.code === 'ERR_CANCELED') {\n return {\n swap: null,\n error: {\n type: QuoteErrorType.REQUEST_CANCELED,\n },\n warnings: null,\n };\n }\n\n if (error.cause) {\n return {\n swap: null,\n error: error.cause,\n warnings: null,\n };\n }\n\n return {\n swap: null,\n error: {\n type: QuoteErrorType.REQUEST_FAILED,\n },\n warnings: null,\n };\n}\n", "import type { Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n CustomTokensZeroStateDarkIcon,\n CustomTokensZeroStateIcon,\n DeleteIcon,\n Divider,\n IconButton,\n MessageBox,\n NotFound,\n styled,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WatermarkedModal } from '../components/common/WatermarkedModal';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { TokenList } from '../components/TokenList';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useTheme } from '../hooks/useTheme';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { containsText, getContainer } from '../utils/common';\nimport { createTokenHash } from '../utils/meta';\n\nconst Content = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n flexDirection: 'column',\n flex: 1,\n});\nconst NotFoundContent = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n flex: '0.75',\n});\nconst DeleteIconButton = styled(IconButton, {\n '&:hover': {\n '& svg': {\n color: '$secondary550',\n },\n },\n});\nexport function CustomTokensPage() {\n const [searchedFor, setSearchedFor] = useState<string>('');\n const { deleteCustomToken } = useAppStore();\n const customTokens = useAppStore().customTokens();\n const { fromToken, toToken, setFromToken, setToToken } = useQuoteStore();\n const { mode } = useTheme({});\n const navigate = useNavigate();\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState<boolean>(false);\n const [selectedToken, setSelectedToken] = useState<Token>();\n const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setSearchedFor(value);\n };\n const isDarkTheme = mode === 'dark';\n\n const customTokensResults = customTokens.filter(\n (token) =>\n containsText(token.symbol, searchedFor) ||\n containsText(token.address || '', searchedFor) ||\n containsText(token.name || '', searchedFor)\n );\n\n const handleDeleteCustomToken = () => {\n if (selectedToken) {\n const toTokenHash = toToken ? createTokenHash(toToken) : null;\n const fromTokenHash = fromToken ? createTokenHash(fromToken) : null;\n const selectedTokenHash = createTokenHash(selectedToken);\n\n if (toTokenHash === selectedTokenHash) {\n setToToken({ token: null });\n } else if (fromTokenHash === selectedTokenHash) {\n setFromToken({ token: null });\n }\n deleteCustomToken(selectedToken);\n }\n setIsDeleteModalOpen(false);\n };\n\n return (\n <Layout\n header={{\n title: i18n.t('Custom Tokens'),\n }}>\n <PageContainer>\n <Content>\n {!!customTokens.length ? (\n <>\n <SearchInput\n value={searchedFor}\n setValue={setSearchedFor}\n fullWidth\n color=\"light\"\n variant=\"contained\"\n placeholder={i18n.t('Search Token')}\n onChange={handleSearch}\n />\n <Divider size={16} />\n <TokenList\n list={customTokensResults}\n type=\"custom-token\"\n searchedFor={searchedFor}\n showTitle={false}\n action={(token) => (\n <DeleteIconButton\n variant=\"ghost\"\n onClick={() => {\n setIsDeleteModalOpen(true);\n setSelectedToken(token);\n }}>\n <DeleteIcon size={12} color=\"gray\" />\n </DeleteIconButton>\n )}\n />\n </>\n ) : (\n <NotFoundContent>\n <NotFound\n icon={\n isDarkTheme ? (\n <CustomTokensZeroStateDarkIcon size={200} />\n ) : (\n <CustomTokensZeroStateIcon size={200} />\n )\n }\n title={i18n.t('No custom tokens')}\n description={i18n.t(\n 'press the button to add your custom token'\n )}\n />\n </NotFoundContent>\n )}\n <Divider size={20} />\n\n <Button\n type=\"primary\"\n variant=\"contained\"\n size=\"large\"\n onClick={() => navigate(navigationRoutes.addCustomTokens)}>\n {i18n.t('Add Custom Token')}\n </Button>\n </Content>\n <WatermarkedModal\n open={isDeleteModalOpen}\n dismissible\n onClose={() => setIsDeleteModalOpen(false)}\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Delete Custom Token')}\n type=\"error\"\n description={i18n.t('Are you sure you want to Delete this Token?')}>\n <Divider size={40} />\n <Divider size={10} />\n\n <Button\n fullWidth\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={handleDeleteCustomToken}>\n {i18n.t('Yes, Delete it')}\n </Button>\n <Divider size={12} />\n <Button\n fullWidth\n variant=\"outlined\"\n type=\"primary\"\n size=\"large\"\n onClick={() => setIsDeleteModalOpen(false)}>\n {i18n.t('No, Continue')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './SearchInput.types';\n\nimport { CloseIcon, IconButton, SearchIcon, TextField } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { IconWrapper } from './SearchInput.styles';\n\nexport function SearchInput(props: PropTypes) {\n const {\n variant,\n fullWidth,\n color,\n size,\n onChange,\n value,\n style,\n setValue,\n ...inputAttributes\n } = props;\n\n return (\n <TextField\n prefix={\n <IconWrapper>\n <SearchIcon color=\"black\" />\n </IconWrapper>\n }\n suffix={\n !!value.length && (\n <IconButton\n variant=\"ghost\"\n onClick={() => setValue?.('')}\n size=\"small\">\n <CloseIcon color=\"gray\" size={10} />\n </IconButton>\n )\n }\n fullWidth={fullWidth}\n color={color}\n variant={variant}\n style={{\n padding: 10,\n borderRadius: 25,\n alignItems: 'center',\n ...style,\n }}\n size={size}\n value={value}\n onChange={onChange}\n {...inputAttributes}\n />\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const IconWrapper = styled('div', {\n width: '$24',\n height: '$24',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes, RenderDescProps } from './TokenList.types';\nimport type { BlockchainMeta, Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n darkTheme,\n Divider,\n ExternalLinkIcon,\n Image,\n ListItemButton,\n NotFound,\n PinIcon,\n Skeleton,\n Typography,\n VirtualizedList,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useObserveBalanceChanges } from '../../hooks/useObserveBalanceChanges';\nimport { useAppStore } from '../../store/AppStore';\nimport { useWalletsStore } from '../../store/wallets';\nimport { createTintsAndShades } from '../../utils/colors';\nimport { formatBalance } from '../../utils/wallets';\n\nimport { LoadingTokenList } from './LoadingTokenList';\nimport {\n BalanceContainer,\n Container,\n descriptionStyles,\n End,\n ImageSection,\n List,\n Pin,\n StyledLink,\n Tag,\n TagTitle,\n Title,\n tokenAddressStyles,\n TokenBalance,\n tokenNameStyles,\n tokenTitleStyles,\n tokenWithoutNameStyles,\n usdValueStyles,\n} from './TokenList.styles';\n\nconst PAGE_SIZE = 20;\n\nconst renderDesc = (props: RenderDescProps) => {\n const { address, name, url, token, customCssForTag, customCssForTagTitle } =\n props;\n const length = address.length;\n\n return (\n <div className={descriptionStyles()}>\n {name ? (\n <div className={tokenNameStyles()}>{name}</div>\n ) : (\n <Title className={tokenTitleStyles()}>\n <Typography variant=\"title\" size=\"xmedium\">\n {token.symbol}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tag css={customCssForTag}>\n <TagTitle variant=\"body\" size=\"xsmall\" css={customCssForTagTitle}>\n {token.blockchain}\n </TagTitle>\n </Tag>\n </Title>\n )}\n\n {!!address && (\n <div\n className={`${tokenAddressStyles()} ${\n !name && tokenWithoutNameStyles()\n }`}>\n {length > 10\n ? `${address.slice(0, 5)}...${address.slice(length - 6, length)}`\n : address}{' '}\n <Divider size={4} direction=\"horizontal\" />\n <StyledLink\n href={url}\n target=\"_blank\"\n rel=\"nofollow noreferrer\"\n onClick={(e) => e.stopPropagation()}>\n <ExternalLinkIcon size={12} />\n </StyledLink>\n </div>\n )}\n </div>\n );\n};\n\nexport function TokenList(props: PropTypes) {\n const {\n list,\n searchedFor = '',\n onChange,\n selectedBlockchain,\n showTitle = true,\n action,\n } = props;\n\n const [tokens, setTokens] = useState<Token[]>(list);\n const fetchStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const [hasNextPage, setHasNextPage] = useState<boolean>(true);\n const { getBalanceFor, loading: loadingWallet } = useWalletsStore();\n const { isTokenPinned } = useAppStore();\n /**\n * We can create the key by hashing the list of tokens,\n * but if the list is large, the memory usage and cost of comparisons may be high.\n */\n const { balanceKey } = useObserveBalanceChanges(selectedBlockchain);\n\n const loadNextPage = () => {\n setTokens(list.slice(0, tokens.length + PAGE_SIZE));\n };\n\n useEffect(() => {\n setHasNextPage(list.length > tokens.length);\n }, [tokens.length]);\n\n useEffect(() => {\n setTokens(list.slice(0, PAGE_SIZE));\n }, [list.length, selectedBlockchain, balanceKey]);\n\n const endRenderer = (token: Token) => {\n const tokenBalance = formatBalance(getBalanceFor(token));\n\n if (action) {\n return action(token);\n }\n if (loadingWallet) {\n return (\n <End>\n <Skeleton variant=\"text\" size=\"large\" width={70} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={50} />\n </End>\n );\n }\n\n return (\n tokenBalance && (\n <BalanceContainer>\n <TokenBalance variant=\"title\" size=\"small\">\n {tokenBalance.amount}\n </TokenBalance>\n <div />\n {tokenBalance.usdValue && (\n <Typography\n variant=\"body\"\n className={usdValueStyles()}\n size=\"xsmall\">\n {`$${tokenBalance.usdValue}`}\n </Typography>\n )}\n </BalanceContainer>\n )\n );\n };\n\n const renderList = () => {\n return (\n <VirtualizedList\n endReached={hasNextPage ? loadNextPage : undefined}\n itemContent={(index) => {\n const token = tokens[index];\n const address = token.address || '';\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === token.blockchain\n ) as BlockchainMeta;\n const colors = createTintsAndShades(blockchain.color, 'main');\n const customCssForTag = {\n $$color: colors.main150,\n [`.${darkTheme} &`]: {\n $$color: colors.main750,\n },\n backgroundColor: '$$color',\n };\n\n const customCssForTagTitle = {\n $$color: colors.main750,\n [`.${darkTheme} &`]: {\n $$color: colors.main150,\n },\n color: '$$color',\n };\n\n return (\n <div\n style={{\n paddingRight: 5,\n }}>\n <ListItemButton\n style={{\n width: '100%',\n overflow: 'hidden',\n height: '60px',\n }}\n tab-index={index}\n key={`${token.symbol}${token.address}`}\n id={`${token.symbol}${token.address}`}\n hasDivider\n onClick={() => onChange && onChange(tokens[index])}\n start={\n <ImageSection>\n <Image src={token.image} size={30} />\n {props.type !== 'custom-token' &&\n isTokenPinned(token, props.type) && (\n <Pin>\n <PinIcon size={12} color=\"gray\" />\n </Pin>\n )}\n </ImageSection>\n }\n title={\n blockchain?.type === 'COSMOS' ||\n !!token.name ||\n (!token.name && !address) ? (\n <Title>\n <Typography variant=\"title\" size=\"xmedium\">\n {token.symbol}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tag css={customCssForTag}>\n <TagTitle\n variant=\"body\"\n size=\"xsmall\"\n css={customCssForTagTitle}>\n {token.blockchain}\n </TagTitle>\n </Tag>\n </Title>\n ) : undefined\n }\n description={\n !!blockchain?.info &&\n !!address &&\n blockchain.type !== 'COSMOS'\n ? renderDesc({\n address,\n token: tokens[index],\n customCssForTag,\n customCssForTagTitle,\n name: token.name,\n url: blockchain.info.addressUrl\n .split('{wallet}')\n .join(address),\n })\n : token.name || undefined\n }\n end={endRenderer(token)}\n />\n </div>\n );\n }}\n totalCount={tokens.length}\n key={`${selectedBlockchain}-${searchedFor}-${balanceKey}`}\n />\n );\n };\n\n return (\n <>\n {showTitle && (\n <>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Token')}\n </Typography>\n <Divider size={4} />\n </>\n )}\n\n <Container>\n <Divider size={4} />\n {fetchStatus === 'loading' && <LoadingTokenList size={PAGE_SIZE} />}\n {fetchStatus === 'success' &&\n (tokens.length ? (\n <List as=\"ul\">{renderList()}</List>\n ) : (\n !!searchedFor && (\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n )\n ))}\n </Container>\n </>\n );\n}\n", "import type { WalletEventData } from '../../types';\n\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { useEffect, useRef, useState } from 'react';\n\nimport { widgetEventEmitter } from '../../services/eventEmitter';\nimport { useWalletsStore } from '../../store/wallets';\nimport { WalletEventTypes, WidgetEvents } from '../../types';\n\n// A hook to listen for and detect changes in balances on a specific blockchain.\nexport function useObserveBalanceChanges(selectedBlockchain?: string) {\n const { connectedWallets } = useWalletsStore();\n const { getWalletInfo } = useWallets();\n const prevFetchingBalanceWallets = useRef<string[]>([]);\n // The \"balanceKey\" will be updated and incremented after each change in the balance for a blockchain.\n const [balanceKey, setBalanceKey] = useState(0);\n\n useEffect(() => {\n const handleWalletEvent = (event: WalletEventData) => {\n if (event.type === WalletEventTypes.DISCONNECT) {\n const walletInfo = getWalletInfo(event.payload.walletType);\n const blockchainSupported = walletInfo.supportedChains.some(\n (chain) => chain.name === selectedBlockchain\n );\n\n if (blockchainSupported) {\n setBalanceKey((prev) => prev + 1);\n }\n }\n };\n\n widgetEventEmitter.on(WidgetEvents.WalletEvent, handleWalletEvent);\n\n if (!selectedBlockchain) {\n return setBalanceKey((prev) => prev + 1);\n }\n\n const supportedWallets = connectedWallets.filter(\n (wallet) => wallet.chain === selectedBlockchain\n );\n\n supportedWallets.forEach((wallet) => {\n const { walletType } = wallet;\n const walletIsAlreadyFetching =\n prevFetchingBalanceWallets.current.includes(walletType);\n\n /**\n * Watching for changes in \"wallet.balances.length\" is not accurate.\n * Additionally, checking the equality of previous and current balances for a specific blockchain is resource-intensive, so we avoid these methods.\n */\n if (wallet.loading && !walletIsAlreadyFetching) {\n prevFetchingBalanceWallets.current =\n prevFetchingBalanceWallets.current.concat(walletType);\n } else if (!wallet.loading && walletIsAlreadyFetching) {\n prevFetchingBalanceWallets.current =\n prevFetchingBalanceWallets.current.filter(\n (prevWallet) => prevWallet !== walletType\n );\n setBalanceKey((prev) => prev + 1);\n }\n });\n\n return () =>\n widgetEventEmitter.off(WidgetEvents.WalletEvent, handleWalletEvent);\n }, [connectedWallets, selectedBlockchain, getWalletInfo]);\n\n return { balanceKey };\n}\n", "import type { LoadingTokenListProps } from './TokenList.types';\n\nimport { Divider, ListItem, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { End, List } from './TokenList.styles';\n\nexport function LoadingTokenList(props: LoadingTokenListProps) {\n return (\n <List>\n {Array.from(Array(props.size), (e) => (\n <ListItem\n key={e}\n hasDivider\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n end={\n <End>\n <Skeleton variant=\"text\" size=\"large\" width={70} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={50} />\n </End>\n }\n title={\n <div>\n <Skeleton variant=\"text\" size=\"large\" width={90} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={90} />\n </div>\n }\n />\n ))}\n </List>\n );\n}\n", "import {\n css,\n darkTheme,\n ImageContainer,\n styled,\n Typography,\n} from '@rango-dev/ui';\n\nexport const tokenNameStyles = css({\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 100,\n overflow: 'hidden',\n});\nexport const descriptionStyles = css({\n position: 'relative',\n height: 12,\n width: '30%',\n maxWidth: '150px',\n});\nexport const tokenTitleStyles = css({\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n bottom: '-8px',\n});\nexport const tokenAddressStyles = css({\n transform: 'translateY(12px)',\n visibility: 'hidden',\n display: 'flex',\n '& a': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n fontSize: '$12',\n lineHeight: '$16',\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n textDecoration: 'none',\n },\n});\nexport const tokenWithoutNameStyles = css({});\nexport const usdValueStyles = css();\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n overflow: 'hidden',\n justifyContent: 'center',\n});\n\nexport const Title = styled('div', {\n display: 'flex',\n alignItems: 'center',\n '._typography': {\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 100,\n overflow: 'hidden',\n },\n});\nexport const List = styled('ul', {\n flexGrow: 1,\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n '& li': {\n alignItems: 'none',\n\n '&:hover': {\n [`& .${descriptionStyles}`]: {\n [`& .${tokenAddressStyles}`]: {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n visibility: 'visible',\n },\n\n [`& .${tokenWithoutNameStyles}`]: {\n bottom: '-15px',\n },\n [`& .${tokenNameStyles}`]: {\n position: 'absolute',\n transform: 'translateY(-12px)',\n visibility: 'hidden',\n },\n [`& .${tokenTitleStyles}`]: {\n position: 'absolute',\n transform: 'translateY(-12px)',\n bottom: '-10px',\n },\n },\n },\n },\n});\n\nexport const Tag = styled('div', {\n paddingLeft: '$5',\n paddingRight: '$5',\n borderRadius: '$md',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const TagTitle = styled(Typography, {});\n\nexport const BalanceContainer = styled('div', {\n textAlign: 'right',\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n [`& .${usdValueStyles}`]: {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const End = styled('div', {\n display: 'flex',\n alignItems: 'end',\n flexDirection: 'column',\n});\n\nexport const Description = styled('div', {\n display: 'flex',\n alignItems: 'center',\n});\nexport const ImageSection = styled('div', {\n position: 'relative',\n [`& ${ImageContainer}`]: {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n});\nexport const Pin = styled('div', {\n position: 'absolute',\n backgroundColor: '$neutral100',\n padding: '$4',\n borderRadius: '50%',\n bottom: -6,\n right: -6,\n});\n\nexport const TokenBalance = styled(Typography, {\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const StyledLink = styled('a', {\n '& svg:hover': {\n color: '$colors$info',\n },\n});\n", "import { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport {\n Button,\n darkTheme,\n Divider,\n MessageBox,\n NotFound,\n styled,\n Typography,\n} from '@rango-dev/ui';\nimport {\n type PendingSwap,\n type PendingSwapStep,\n TransactionStatus,\n} from 'rango-types';\nimport React, { useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WatermarkedModal } from '../components/common/WatermarkedModal';\nimport { FilterSelector } from '../components/FilterSelector';\nimport { SuffixContainer } from '../components/HeaderButtons/HeaderButtons.styles';\nimport { HistoryGroupedList } from '../components/HistoryGroupedList';\nimport { NotFoundContainer } from '../components/HistoryGroupedList/HistoryGroupedList.styles';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { getContainer } from '../utils/common';\nimport { groupSwapsByDate } from '../utils/date';\nimport { containsText } from '../utils/numbers';\nimport { getPendingSwaps } from '../utils/queue';\n\nconst HistoryGroupedListContainer = styled('div', {\n overflowY: 'visible',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: 15,\n height: '100%',\n});\n\nconst SearchAndFilterBar = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nconst Description = styled('div', {\n '._typography': {\n color: '$neutral700',\n [`.${darkTheme}&`]: {\n color: '$neutral900',\n },\n },\n});\n\nconst transactionStatusFilters = [\n {\n id: TransactionStatus.SUCCESS,\n title: i18n.t('Complete'),\n },\n {\n id: TransactionStatus.RUNNING,\n title: i18n.t('Running'),\n },\n { id: TransactionStatus.FAILED, title: i18n.t('Failed') },\n];\n\nconst isStepContainsText = (steps: PendingSwapStep[], value: string) => {\n if (!steps?.length) {\n return false;\n }\n return steps.filter(\n (step) =>\n containsText(step.fromBlockchain, value) ||\n containsText(step.toBlockchain, value) ||\n containsText(step.toSymbol, value) ||\n containsText(step.fromSymbol, value)\n ).length;\n};\n\nexport function HistoryPage() {\n const navigate = useNavigate();\n const { manager, state } = useManager();\n const list: PendingSwap[] = getPendingSwaps(manager).map(({ swap }) => swap);\n const [searchedFor, setSearchedFor] = useState<string>('');\n const [openFilterSelector, setOpenFilterSelector] = useState(false);\n const loading = !state.loadedFromPersistor;\n const [filterBy, setFilterBy] = useState('');\n const [openClearModal, setOpenClearModal] = useState(false);\n const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setSearchedFor(value);\n };\n\n const filteredList = useMemo(() => {\n if (!searchedFor && !filterBy) {\n return list;\n }\n\n return list.filter((swap) => {\n const { inputAmount, status, steps, requestId } = swap;\n\n const matchesSearch =\n !searchedFor ||\n containsText(inputAmount, searchedFor) ||\n containsText(status, searchedFor) ||\n isStepContainsText(steps, searchedFor) ||\n containsText(requestId, searchedFor);\n\n const matchesFilter = !filterBy || filterBy === status;\n\n return matchesSearch && matchesFilter;\n });\n }, [list, searchedFor, filterBy]);\n\n const isEmpty = !filteredList?.length && !loading;\n\n const onCloseModal = () => setOpenClearModal(false);\n const onClear = async () => {\n try {\n await manager?.clearQueue();\n\n setOpenClearModal(false);\n } catch (e) {\n console.log(e);\n }\n };\n const isClearButtonDisabled = useMemo(() => {\n return !list.some(\n (swap) =>\n swap.status === TransactionStatus.SUCCESS ||\n swap.status === TransactionStatus.FAILED\n );\n }, [list]);\n\n return (\n <Layout\n header={{\n title: i18n.t('History'),\n suffix: (\n <SuffixContainer>\n <Button\n disabled={isClearButtonDisabled}\n variant=\"ghost\"\n size=\"xsmall\"\n onClick={() => setOpenClearModal(true)}>\n <Typography size=\"medium\" variant=\"label\" color=\"error\">\n {i18n.t('Clear all Txs')}\n </Typography>\n </Button>\n </SuffixContainer>\n ),\n }}>\n <PageContainer>\n <SearchAndFilterBar>\n <SearchInput\n setValue={setSearchedFor}\n fullWidth\n variant=\"contained\"\n placeholder={i18n.t('Search Transaction')}\n autoFocus\n onChange={handleSearch}\n style={{ height: 36 }}\n value={searchedFor}\n />\n <Divider size={10} direction=\"horizontal\" />\n\n <FilterSelector\n filterBy={filterBy}\n open={openFilterSelector}\n onOpenChange={(open) => setOpenFilterSelector(open)}\n onClickItem={(id) => setFilterBy(id)}\n list={transactionStatusFilters}\n />\n </SearchAndFilterBar>\n\n <Divider size=\"16\" />\n <HistoryGroupedListContainer>\n {isEmpty && (\n <NotFoundContainer>\n <Divider size={32} />\n <NotFound\n title={\n searchedFor\n ? i18n.t('No results found')\n : i18n.t('No transactions')\n }\n titleColor={!searchedFor ? '$info' : undefined}\n hasIcon={!!searchedFor}\n description={\n searchedFor\n ? i18n.t('Try using different keywords')\n : i18n.t(\n 'Your transaction history is stored locally and will appear here after you start a swap'\n )\n }\n />\n </NotFoundContainer>\n )}\n {!isEmpty && (\n <HistoryGroupedList\n list={filteredList}\n onSwapClick={navigate}\n groupBy={groupSwapsByDate}\n isLoading={loading}\n />\n )}\n </HistoryGroupedListContainer>\n </PageContainer>\n <WatermarkedModal\n open={openClearModal}\n onClose={onCloseModal}\n container={getContainer()}>\n <Divider size={20} />\n <MessageBox\n type=\"warning\"\n title={i18n.t('Clear History')}\n description={\n <Description>\n <Typography variant=\"body\" size=\"medium\">\n {i18n.t(\n 'This would clear all succeeded/failed transactions from widget. Do you wish to proceed?'\n )}\n </Typography>\n <Divider size={'24'} />\n\n <Typography variant=\"body\" size=\"small\">\n {i18n.t(\n 'Hint: This does not clear your transaction history on blockchain. Only hides them in this page.'\n )}\n </Typography>\n </Description>\n }\n />\n <Divider size={40} />\n\n <Divider size={10} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onClear}>\n {i18n.t('Yes, Clear history')}\n </Button>\n <Divider size={10} />\n <Button\n variant=\"outlined\"\n type=\"primary\"\n size=\"large\"\n onClick={onCloseModal}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('No, Cancel')}\n </Typography>\n </Button>\n </WatermarkedModal>\n </Layout>\n );\n}\n", "import type { FilterSelectorPropTypes } from './FilterSelector.type';\n\nimport { FilterIcon, Popover } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport { Badge, FilterButton, IconContainer } from './FilterSelector.style';\nimport { FilterSelectorContent } from './FilterSelectorContent';\n\nexport function FilterSelector(props: FilterSelectorPropTypes) {\n const { onClickItem, onOpenChange, filterBy, list, open } = props;\n return (\n <div>\n <Popover\n open={open}\n align=\"end\"\n onOpenChange={onOpenChange}\n container={getContainer()}\n content={\n <FilterSelectorContent\n list={list}\n filterBy={filterBy}\n onClickItem={(id) => {\n onClickItem(id);\n onOpenChange(false);\n }}\n />\n }>\n <FilterButton\n variant=\"default\"\n isSelect={!!filterBy}\n onClick={() => onOpenChange(!props.open)}>\n <IconContainer isSelect={!!filterBy}>\n <FilterIcon size={16} color=\"black\" />\n {!!filterBy && <Badge />}\n </IconContainer>\n </FilterButton>\n </Popover>\n </div>\n );\n}\n", "import { css, darkTheme, IconButton, styled } from '@rango-dev/ui';\n\nexport const IconContainer = styled('div', {\n position: 'relative',\n '&::before': {\n position: 'absolute',\n right: '1px',\n top: '-1px',\n width: '$8',\n height: '$8',\n borderRadius: '100%',\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n padding: '$2',\n },\n variants: {\n isSelect: {\n true: {\n '&::before': {\n content: '',\n },\n },\n },\n },\n});\n\nexport const FilterButton = styled(IconButton, {\n width: '$36',\n height: '$36',\n position: 'relative',\n padding: '0',\n overflow: 'unset',\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n '&:hover': {\n backgroundColor: '$secondary100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral',\n },\n [`& ${IconContainer}::before`]: {\n backgroundColor: '$secondary100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral',\n },\n },\n },\n variants: {\n isSelect: {\n true: {\n border: '1px solid $secondary',\n },\n },\n },\n});\n\nexport const Badge = styled('div', {\n position: 'absolute',\n width: '$6',\n height: '$6',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: '3px',\n top: '$0',\n right: '1px',\n backgroundColor: '$secondary500',\n});\n\nexport const FilterContainer = styled('div', {\n padding: '$15',\n borderRadius: '$sm',\n width: '248px',\n backgroundColor: '$background',\n zIndex: 10,\n});\n\nexport const centeredFlexContainer = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const FilterList = styled('ul', {\n margin: 0,\n listStyle: 'none',\n height: '100%',\n padding: 0,\n '.item-start-container': {\n paddingRight: '0 !important',\n },\n});\n", "import type { PropTypes } from './FilterSelector.type';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n centeredFlexContainer,\n FilterContainer,\n FilterList,\n} from './FilterSelector.style';\n\nexport function FilterSelectorContent(props: PropTypes) {\n const { filterBy: value, onClickItem } = props;\n return (\n <FilterContainer>\n <div className={centeredFlexContainer()}>\n <Typography size=\"small\" variant=\"body\">\n {i18n.t('Status')}\n </Typography>\n <Button variant=\"ghost\" size=\"xxsmall\" onClick={() => onClickItem('')}>\n {i18n.t('Reset')}\n </Button>\n </div>\n <Divider size={10} />\n <RadioRoot value={value}>\n <FilterList>\n {props.list.map((item, index) => {\n return (\n <ListItemButton\n key={item.id}\n style={{ height: '40px', width: '100%' }}\n selected={false}\n hasDivider={props.list.length - 1 != index}\n id={item.id}\n title={\n <>\n <Divider direction=\"horizontal\" size={4} />\n <Typography size=\"medium\" variant=\"body\">\n {item.title}\n </Typography>\n </>\n }\n start={<Radio value={item.id} />}\n onClick={onClickItem}\n />\n );\n })}\n </FilterList>\n </RadioRoot>\n </FilterContainer>\n );\n}\n", "import type { PropTypes } from './HistoryGroupedList.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n GroupedVirtualizedList,\n Skeleton,\n SwapListItem,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\n\nimport { calculateGroupsSoFar } from './HistoryGroupedList.helpers';\nimport {\n Group,\n groupStyles,\n SwapItemContainer,\n SwapList,\n Time,\n} from './HistoryGroupedList.styles';\n\nconst ITEMS_PER_PAGE = 10;\n\nexport function HistoryGroupedList(props: PropTypes) {\n const { list, onSwapClick, groupBy, isLoading } = props;\n const [currentGroupCounts, setCurrentGroupCounts] = useState<number[]>([]);\n const loadedItems = useRef(0);\n const { swaps, groupCounts, groups } = groupBy(list);\n\n const calculateGroups = useCallback(calculateGroupsSoFar, []);\n\n const loadMore = useCallback(() => {\n const remainedItems = list.length - loadedItems.current;\n if (remainedItems) {\n loadedItems.current += Math.min(remainedItems, ITEMS_PER_PAGE);\n setCurrentGroupCounts(calculateGroups(groupCounts, loadedItems.current));\n }\n }, [list.length]);\n\n useEffect(() => {\n if (!isLoading) {\n loadMore();\n }\n }, [isLoading, loadMore]);\n\n if (isLoading) {\n // The number of items presented in each group.\n const swaps = [1, 2];\n const loadingGroups = [swaps, swaps];\n return (\n <>\n {loadingGroups.map((group, index) => {\n const key = index;\n return (\n <Group key={key}>\n <Time>\n <Skeleton variant=\"text\" width={60} size=\"small\" />\n <Divider size={16} />\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.map((_, index) => {\n const key = index;\n return <SwapListItem isLoading={true} key={key} />;\n })}\n </SwapList>\n </Group>\n );\n })}\n </>\n );\n }\n\n return (\n <GroupedVirtualizedList\n endReached={() => {\n if (loadedItems.current < list.length) {\n loadMore();\n }\n }}\n groupCounts={currentGroupCounts}\n groupContent={(index) => {\n return (\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n className={groupStyles()}>\n {groups[index]}\n </Typography>\n </Time>\n </Group>\n );\n }}\n itemContent={(index, groupIndex) => {\n const swap = swaps[index];\n if (!swap) {\n return null;\n }\n const firstStep = swap.steps[0];\n const lastStep = swap.steps[swap.steps.length - 1];\n return (\n <SwapItemContainer key={swap.requestId}>\n <SwapListItem\n requestId={swap.requestId}\n creationTime={swap.creationTime}\n status={swap.status}\n onClick={onSwapClick}\n tooltipContainer={getContainer()}\n onlyShowTime={groups[groupIndex] === i18n.t('Today')}\n swapTokenData={{\n from: {\n token: {\n image: firstStep.fromLogo,\n displayName: firstStep.fromSymbol,\n },\n blockchain: {\n image: firstStep.fromBlockchainLogo || '',\n },\n amount: numberToString(\n swap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realAmount: swap.inputAmount,\n },\n to: {\n token: {\n image: lastStep.toLogo,\n displayName: lastStep.toSymbol,\n },\n blockchain: {\n image: lastStep.toBlockchainLogo || '',\n },\n amount: numberToString(\n lastStep.outputAmount ||\n lastStep.expectedOutputAmountHumanReadable ||\n '',\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realAmount:\n lastStep.outputAmount ||\n lastStep.expectedOutputAmountHumanReadable ||\n '',\n },\n }}\n />\n </SwapItemContainer>\n );\n }}\n />\n );\n}\n", "/*\n * The calculateGroupsSoFar Slices the total groups into the groups which contain the items so far.\n * For example, if you have [10, 10, 10, 10] groups in total,\n * slicing them to 23 will result in [10, 10, 3] :\n * https://virtuoso.dev/grouped-with-load-on-demand/\n */\nexport function calculateGroupsSoFar(totalGroups: number[], count: number) {\n const groups: number[] = [];\n let index = 0;\n do {\n const group = totalGroups[index];\n groups.push(Math.min(group, count));\n count -= group;\n index++;\n } while (count > 0 && index <= totalGroups.length);\n return groups;\n}\n", "import { css, darkTheme, styled } from '@rango-dev/ui';\n\nexport const groupStyles = css();\n\nexport const SwapItemContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '$5',\n});\n\nexport const Group = styled('div', {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: '$background',\n padding: '$10 $5 0 $5',\n [`& .${groupStyles}`]: {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Time = styled('div', {\n display: 'flex',\n justifyContent: 'flex-start',\n padding: '$2',\n});\n\nexport const SwapList = styled('div', {\n gap: '$10',\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const NotFoundContainer = styled('div', {\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n", "import type { GroupBy } from '../components/HistoryGroupedList/HistoryGroupedList.types';\nimport type { PendingSwap } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport dayjs from 'dayjs';\n\nexport const groupSwapsByDate: GroupBy = (swaps) => {\n const output: Map<\n string,\n {\n title: string;\n swaps: PendingSwap[];\n }\n > = new Map([\n [\n 'today',\n {\n title: i18n.t('Today'),\n swaps: [],\n },\n ],\n [\n 'week',\n {\n title: i18n.t('This week'),\n swaps: [],\n },\n ],\n [\n 'month',\n {\n title: i18n.t('This month'),\n swaps: [],\n },\n ],\n [\n 'year',\n {\n title: i18n.t('This year'),\n swaps: [],\n },\n ],\n ]);\n\n function addYearsToOutput(key: string, swap: PendingSwap) {\n if (!output.has(key)) {\n output.set(key, {\n title: key,\n swaps: [],\n });\n }\n output.get(key)?.swaps.push(swap);\n }\n\n const now = dayjs();\n swaps.forEach((swap) => {\n const time = Number(swap.creationTime);\n const swapDate = dayjs(time);\n if (now.isSame(swapDate, 'day')) {\n output.get('today')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'week')) {\n output.get('week')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'month')) {\n output.get('month')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'year')) {\n output.get('year')?.swaps.push(swap);\n } else {\n const year = new Date(time).getFullYear().toString();\n addYearsToOutput(year, swap);\n }\n });\n\n const groupedSwaps = Array.from(output.values()).filter(\n (item) => item.swaps.length > 0\n );\n const items = groupedSwaps.flatMap((group) => group.swaps);\n const groupCounts = groupedSwaps.map((group) => group.swaps.length);\n const groups = groupedSwaps.map((group) => group.title);\n\n return { swaps: items, groupCounts, groups };\n};\n", "import type { SelectedQuote } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, styled, WarningIcon } from '@rango-dev/ui';\nimport BigNumber from 'bignumber.js';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HeaderButtons } from '../components/HeaderButtons';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { ExpandedQuotes } from '../containers/ExpandedQuotes';\nimport { Inputs } from '../containers/Inputs';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport useScreenDetect from '../hooks/useScreenDetect';\nimport { useSwapInput } from '../hooks/useSwapInput';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport { UiEventTypes } from '../types';\nimport { isVariantExpandable } from '../utils/configs';\nimport { emitPreventableEvent } from '../utils/events';\nimport { getSwapButtonState, isTokensIdentical } from '../utils/swap';\n\nconst MainContainer = styled('div', {\n display: 'flex',\n alignItems: 'flex-start',\n maxHeight: 700,\n '& .footer__alert': {\n paddingTop: '0 !important',\n },\n});\nexport const TIME_TO_NAVIGATE_ANOTHER_PAGE = 300;\n\nexport function Home() {\n const navigate = useNavigate();\n const {\n fromToken,\n toToken,\n inputAmount,\n selectedQuote,\n refetchQuote,\n error: quoteError,\n warning: quoteWarning,\n quotes,\n setSelectedQuote,\n resetQuoteWallets,\n setQuoteWarningsConfirmed,\n updateQuotePartialState,\n } = useQuoteStore();\n const [isVisibleExpanded, setIsVisibleExpanded] = useState<boolean>(false);\n const { isLargeScreen, isExtraLargeScreen } = useScreenDetect();\n\n const { fetch: fetchQuote, loading } = useSwapInput({ refetchQuote });\n const { config, fetchStatus: fetchMetaStatus } = useAppStore();\n\n const { connectedWallets } = useWalletsStore();\n const { isActiveTab } = useUiStore();\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n\n const needsToWarnEthOnPath = false;\n\n const swapButtonState = getSwapButtonState({\n fetchMetaStatus,\n fetchingQuote: loading,\n inputAmount,\n quote: selectedQuote,\n anyWalletConnected: connectedWallets.length > 0,\n error: quoteError,\n warning: quoteWarning,\n needsToWarnEthOnPath,\n });\n\n const isExpandable = isVariantExpandable(\n isLargeScreen,\n isExtraLargeScreen,\n config?.variant\n );\n\n const hasInputs =\n !!inputAmount &&\n !!fromToken &&\n !!toToken &&\n new BigNumber(inputAmount).gt(0) &&\n !isTokensIdentical(fromToken, toToken);\n\n const fetchingQuote = hasInputs && fetchMetaStatus === 'success' && loading;\n\n const hasValidQuotes =\n !isExpandable || (isExpandable && quotes?.results.length);\n const hasWarningOrError = quoteWarning || quoteError;\n const showMessages = hasValidQuotes && hasWarningOrError;\n\n useEffect(() => {\n resetQuoteWallets();\n updateQuotePartialState('refetchQuote', true);\n }, []);\n\n useEffect(() => {\n setIsVisibleExpanded(hasInputs);\n }, [hasInputs]);\n\n const onClickRefresh =\n (!!selectedQuote || quoteError) && !showQuoteWarningModal\n ? fetchQuote\n : undefined;\n\n const onHandleNavigation = (route: string) => {\n if (isExpandable && isVisibleExpanded) {\n setIsVisibleExpanded(false);\n setTimeout(() => {\n navigate(route);\n }, TIME_TO_NAVIGATE_ANOTHER_PAGE);\n } else {\n navigate(route);\n }\n };\n const onClickOnQuote = (quote: SelectedQuote) => {\n if (selectedQuote?.requestId !== quote.requestId) {\n setShowQuoteWarningModal(false);\n setSelectedQuote(quote);\n }\n };\n return (\n <MainContainer>\n <Layout\n height=\"auto\"\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n disabled={swapButtonState.disabled || !isActiveTab}\n prefix={\n swapButtonState.action === 'confirm-warning' && <WarningIcon />\n }\n fullWidth\n onClick={() => {\n if (swapButtonState.action === 'connect-wallet') {\n emitPreventableEvent(\n { type: UiEventTypes.CLICK_CONNECT_WALLET },\n () => onHandleNavigation(navigationRoutes.wallets)\n );\n } else if (swapButtonState.action === 'confirm-warning') {\n setShowQuoteWarningModal(true);\n } else {\n onHandleNavigation(navigationRoutes.confirmSwap);\n }\n }}>\n {swapButtonState.title}\n </Button>\n }\n header={{\n onWallet: () => {\n onHandleNavigation(navigationRoutes.wallets);\n },\n hasBackButton: false,\n title: config.title || i18n.t('Swap'),\n suffix: (\n <HeaderButtons\n hidden={isExpandable ? ['refresh'] : undefined}\n onClickRefresh={onClickRefresh}\n onClickHistory={() => onHandleNavigation(navigationRoutes.swaps)}\n onClickSettings={() => {\n onHandleNavigation(navigationRoutes.settings);\n }}\n />\n ),\n }}>\n <PageContainer>\n <Inputs\n fetchingQuote={fetchingQuote}\n fetchMetaStatus={fetchMetaStatus}\n isExpandable={isExpandable}\n onClickToken={(mode) => {\n onHandleNavigation(\n mode === 'from'\n ? navigationRoutes.fromSwap\n : navigationRoutes.toSwap\n );\n }}\n />\n <Divider size=\"2\" />\n {!isExpandable ? (\n <QuoteInfo\n quote={selectedQuote}\n loading={fetchingQuote}\n error={quoteError}\n tagHidden={false}\n warning={quoteWarning}\n type=\"basic\"\n onClickAllRoutes={\n !!quotes && quotes.results.length > 1\n ? () => {\n updateQuotePartialState('refetchQuote', false);\n onHandleNavigation(navigationRoutes.routes);\n }\n : undefined\n }\n />\n ) : null}\n\n {showMessages ? (\n <>\n <Divider size=\"10\" />\n <QuoteWarningsAndErrors\n warning={quoteWarning}\n error={quoteError}\n couldChangeSettings={true}\n refetchQuote={fetchQuote}\n showWarningModal={showQuoteWarningModal}\n confirmationDisabled={!isActiveTab}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={() => {\n setShowQuoteWarningModal(false);\n setQuoteWarningsConfirmed(true);\n onHandleNavigation(navigationRoutes.confirmSwap);\n }}\n onChangeSettings={() =>\n onHandleNavigation(navigationRoutes.settings)\n }\n />\n </>\n ) : null}\n </PageContainer>\n </Layout>\n {isExpandable ? (\n <ExpandedQuotes\n loading={fetchingQuote}\n onClickOnQuote={onClickOnQuote}\n fetch={fetchQuote}\n onClickRefresh={onClickRefresh}\n isVisible={isVisibleExpanded}\n />\n ) : null}\n </MainContainer>\n );\n}\n", "import type { PropTypes } from './ExpandedQuotes.types';\n\nimport { i18n } from '@lingui/core';\nimport { Header } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { HeaderButtons } from '../../components/HeaderButtons';\nimport { LayoutContainer } from '../../components/Layout/Layout.styles';\nimport { Quotes } from '../../components/Quotes';\nimport { SelectStrategy } from '../../components/Quotes/SelectStrategy';\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useAppStore } from '../../store/AppStore';\nimport { getExpanded } from '../../utils/common';\n\nimport { Container, Content } from './ExpandedQuotes.styles';\n\nexport const TIME_TO_CLOSE_OPEN_EXPANDED = 100;\n\nexport function ExpandedQuotes(props: PropTypes) {\n const { fetch, loading, onClickOnQuote, onClickRefresh, isVisible } = props;\n const [isDelayedVisible, setIsDelayedVisible] = useState(false);\n const containerClass = isDelayedVisible ? '' : 'is-hidden';\n const { config } = useAppStore();\n const fullExpandedMode = config?.variant === 'full-expanded';\n const container = getExpanded();\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n if (isVisible) {\n timeout = setTimeout(() => {\n setIsDelayedVisible(true);\n }, TIME_TO_CLOSE_OPEN_EXPANDED);\n } else {\n setIsDelayedVisible(false);\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n };\n }, [isVisible]);\n\n return (\n <Container\n expandMode={config?.variant === 'full-expanded' ? 'full' : 'default'}\n className={`${containerClass} ${LayoutContainer()}`}\n id={WIDGET_UI_ID.EXPANDED_BOX_ID}>\n <Header\n title={i18n.t('Routes')}\n suffix={\n <>\n <SelectStrategy container={container} />\n <HeaderButtons\n container={container}\n onClickRefresh={onClickRefresh}\n hidden={['history', 'notifications', 'settings']}\n />\n </>\n }\n />\n <Content>\n <Quotes\n showModalFee={false}\n fetch={fetch}\n hasSort={false}\n loading={loading}\n container={getExpanded()}\n onClickOnQuote={onClickOnQuote}\n fullExpandedMode={fullExpandedMode}\n />\n </Content>\n </Container>\n );\n}\n", "import type { PropTypes } from './Quotes.types';\nimport type { MultiRouteSimulationResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, FullExpandedQuote, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteInfo } from '../../containers/QuoteInfo';\nimport { getQuoteError } from '../../hooks/useConfirmSwap/useConfirmSwap.helpers';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType, type SelectedQuote } from '../../types';\nimport { getContainer } from '../../utils/common';\nimport { generateQuoteWarnings, sortQuotesBy } from '../../utils/quote';\nimport { NoResult } from '../NoResult';\nimport { QuoteSkeleton } from '../QuoteSkeleton';\n\nimport { ErrorsContainer, StrategyContent } from './Quotes.styles';\nimport { SelectStrategy } from './SelectStrategy';\n\nconst ITEM_SKELETON_COUNT = 3;\nexport function Quotes(props: PropTypes) {\n const {\n loading,\n onClickOnQuote,\n fetch,\n showModalFee,\n hasSort = true,\n fullExpandedMode = false,\n container: propContainer,\n } = props;\n const {\n selectedQuote,\n quotes,\n updateQuotePartialState,\n fromToken,\n toToken,\n sortStrategy,\n error,\n } = useQuoteStore();\n const { slippage, customSlippage } = useAppStore();\n const { findToken } = useAppStore();\n const container = propContainer || getContainer();\n const hasQuotes = !!quotes && quotes.results.length;\n const userSlippage = customSlippage ?? slippage;\n const getQuoteWarning = (quote: MultiRouteSimulationResult) => {\n if (!fromToken || !toToken || !quotes) {\n return null;\n }\n const mergedQuote: SelectedQuote = {\n requestAmount: quotes.requestAmount, // Assuming quotes is an array\n ...quote,\n };\n\n return generateQuoteWarnings(mergedQuote, {\n fromToken,\n toToken,\n userSlippage,\n findToken,\n });\n };\n const showNoResultMessage =\n error?.type === QuoteErrorType.NO_RESULT ||\n error?.type === QuoteErrorType.REQUEST_FAILED;\n\n const sortQuotes = quotes?.results\n ? sortQuotesBy(sortStrategy, quotes?.results)\n : [];\n\n return (\n <>\n {hasSort && (\n <>\n <StrategyContent>\n <Typography size=\"xmedium\" variant=\"title\">\n {i18n.t('Sort by')}\n </Typography>\n <SelectStrategy container={container} />\n </StrategyContent>\n <Divider size=\"10\" />\n </>\n )}\n\n {loading &&\n Array.from({ length: ITEM_SKELETON_COUNT }, (_, index) => (\n <React.Fragment key={index}>\n {fullExpandedMode ? (\n <FullExpandedQuote loading />\n ) : (\n <QuoteSkeleton\n tagHidden={false}\n type=\"list-item\"\n expanded={false}\n />\n )}\n {index !== ITEM_SKELETON_COUNT - 1 && <Divider size={16} />}\n </React.Fragment>\n ))}\n\n {!loading && (\n <>\n {hasQuotes\n ? sortQuotes.map((quote, index) => {\n const quoteWarning = getQuoteWarning(quote);\n const quoteError = getQuoteError(quote.swaps);\n const lastIndex = sortQuotes.length - 1 === index;\n\n return (\n <React.Fragment key={quote.requestId}>\n <QuoteInfo\n showModalFee={showModalFee}\n container={container}\n selected={selectedQuote?.requestId === quote.requestId}\n tagHidden={false}\n quote={{ ...quote, requestAmount: quotes.requestAmount }}\n loading={loading}\n error={quoteError?.options || null}\n warning={quoteWarning}\n fullExpandedMode={fullExpandedMode}\n onClick={(quote) => {\n if (!quoteError) {\n updateQuotePartialState('warning', quoteWarning);\n }\n updateQuotePartialState(\n 'error',\n quoteError?.options || null\n );\n onClickOnQuote(quote);\n }}\n type=\"list-item\"\n />\n {!lastIndex && <Divider size={16} />}\n </React.Fragment>\n );\n })\n : showNoResultMessage && (\n <ErrorsContainer>\n <NoResult\n size={fullExpandedMode ? 'large' : 'small'}\n error={error}\n fetch={fetch}\n />\n </ErrorsContainer>\n )}\n </>\n )}\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const ErrorsContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n height: '100%',\n});\n\nexport const StrategyContent = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const SelectContainer = styled('div', {\n width: '146px',\n});\n", "import type { PreferenceType } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Select } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../../store/quote';\n\nimport { SelectContainer } from './Quotes.styles';\n\nexport function SelectStrategy(props: { container: HTMLElement }) {\n const { updateQuotePartialState, sortStrategy } = useQuoteStore();\n\n const ROUTE_STRATEGY: { value: PreferenceType; label: string }[] = [\n {\n value: 'SMART',\n label: i18n.t('Smart Routing'),\n },\n {\n value: 'FEE',\n label: i18n.t('Lowest Fee'),\n },\n {\n value: 'SPEED',\n label: i18n.t('Fastest Transfer'),\n },\n {\n value: 'NET_OUTPUT',\n label: i18n.t('Maximum Return'),\n },\n {\n value: 'PRICE',\n label: i18n.t('Maximum Output'),\n },\n ];\n\n return (\n <SelectContainer>\n <Select\n container={props.container}\n options={ROUTE_STRATEGY}\n value={sortStrategy}\n handleItemClick={(item) => {\n updateQuotePartialState('sortStrategy', item.value);\n }}\n variant=\"filled\"\n />\n </SelectContainer>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n transition: 'width 0.2s, opacity 0.2s, margin-left 0.2s',\n height: '700px',\n width: '390px',\n opacity: 1,\n marginLeft: '$16',\n backgroundColor: '$neutral100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral300',\n },\n\n variants: {\n expandMode: {\n default: {\n width: '390px',\n },\n full: {\n width: '719px',\n },\n },\n },\n\n '&.is-hidden': {\n width: 0,\n height: 0,\n opacity: 0,\n marginLeft: 0,\n },\n});\n\nexport const Content = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n padding: '$20',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'auto',\n borderRadius: '$primary',\n backgroundColor: '$background',\n});\n", "import type { PropTypes } from './Inputs.types';\n\nimport { i18n } from '@lingui/core';\nimport { SwapInput } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SwitchFromAndToButton } from '../../components/SwitchFromAndTo';\nimport { errorMessages } from '../../constants/errors';\nimport {\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { useQuoteStore } from '../../store/quote';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport { canComputePriceImpact } from '../../utils/swap';\nimport { formatBalance, isFetchingBalance } from '../../utils/wallets';\n\nimport { Container, FromContainer } from './Inputs.styles';\n\nexport function Inputs(props: PropTypes) {\n const { fetchingQuote, fetchMetaStatus, onClickToken, isExpandable } = props;\n const {\n fromToken,\n fromBlockchain,\n toToken,\n toBlockchain,\n setInputAmount,\n inputAmount,\n inputUsdValue,\n outputAmount,\n outputUsdValue,\n selectedQuote,\n } = useQuoteStore();\n const { connectedWallets, getBalanceFor } = useWalletsStore();\n const fromTokenBalance = fromToken ? getBalanceFor(fromToken) : null;\n const fromTokenFormattedBalance =\n formatBalance(fromTokenBalance)?.amount ?? '0';\n\n const tokenBalanceReal =\n !!fromBlockchain && !!fromToken\n ? numberToString(fromTokenBalance?.amount, fromTokenBalance?.decimals)\n : '0';\n\n const fetchingBalance =\n !!fromBlockchain &&\n isFetchingBalance(connectedWallets, fromBlockchain.name);\n\n const priceImpactInputCanNotBeComputed = !canComputePriceImpact(\n selectedQuote,\n inputAmount,\n inputUsdValue\n );\n\n const priceImpactOutputCanNotBeComputed = !canComputePriceImpact(\n selectedQuote,\n inputAmount,\n outputUsdValue\n );\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPriceImpact(inputUsdValue.toString(), outputUsdValue.toString());\n\n return (\n <Container>\n <FromContainer>\n <SwapInput\n label={i18n.t('From')}\n mode=\"From\"\n onInputChange={setInputAmount}\n balance={fromTokenFormattedBalance}\n chain={{\n displayName: fromBlockchain?.displayName || '',\n image: fromBlockchain?.logo || '',\n }}\n token={{\n displayName: fromToken?.symbol || '',\n image: fromToken?.image || '',\n }}\n onClickToken={() => onClickToken('from')}\n price={{\n value: inputAmount,\n usdValue: priceImpactInputCanNotBeComputed\n ? undefined\n : numberToString(\n inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realUsdValue: priceImpactInputCanNotBeComputed\n ? undefined\n : inputUsdValue?.toString(),\n error: priceImpactInputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n loadingBalance={fetchingBalance}\n tooltipContainer={getContainer()}\n onSelectMaxBalance={() => {\n setInputAmount(tokenBalanceReal.split(',').join(''));\n }}\n anyWalletConnected={connectedWallets.length > 0}\n />\n <SwitchFromAndToButton />\n </FromContainer>\n <SwapInput\n sharpBottomStyle={!isExpandable && (!!selectedQuote || fetchingQuote)}\n label={i18n.t('To')}\n mode=\"To\"\n fetchingQuote={fetchingQuote}\n chain={{\n displayName: toBlockchain?.displayName || '',\n image: toBlockchain?.logo || '',\n }}\n token={{\n displayName: toToken?.symbol || '',\n image: toToken?.image || '',\n }}\n percentageChange={numberToString(\n getPriceImpact(inputUsdValue, outputUsdValue),\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n warningLevel={getPriceImpactLevel(percentageChange ?? 0)}\n price={{\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: priceImpactOutputCanNotBeComputed\n ? undefined\n : numberToString(\n outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: outputAmount?.toString(),\n realUsdValue: priceImpactOutputCanNotBeComputed\n ? undefined\n : outputUsdValue?.toString(),\n error: priceImpactOutputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n onClickToken={() => onClickToken('to')}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n tooltipContainer={getContainer()}\n />\n </Container>\n );\n}\n", "import { ReverseIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../../store/quote';\n\nimport {\n ROTATE_ANIMATION_DURATION,\n StyledButton,\n SwitchButtonContainer,\n} from './SwitchFromAndTo.styles';\n\nexport function SwitchFromAndToButton() {\n const switchFromAndTo = useQuoteStore.use.switchFromAndTo();\n\n return (\n <SwitchButtonContainer>\n <StyledButton\n onClick={(event) => {\n const button = event.currentTarget;\n\n button.classList.add('rotate');\n\n setTimeout(() => {\n button.classList.remove('rotate');\n }, ROTATE_ANIMATION_DURATION);\n switchFromAndTo();\n }}>\n <ReverseIcon size={12} />\n </StyledButton>\n </SwitchButtonContainer>\n );\n}\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const ROTATE_ANIMATION_DURATION = 450;\n\nconst rotateAnimation = keyframes({\n '0%': {\n transform: 'rotateX(0deg) rotateY(0deg) rotateZ(0deg)',\n },\n '33%': {\n transform: 'rotateX(0deg) rotateZ(78deg) rotateY(66deg)',\n },\n '66%': {\n transform: 'rotateX(0deg) rotateZ(163deg) rotateY(66deg)',\n },\n '100%': {\n transform: 'rotateX(0deg) rotateZ(180deg) rotateY(0deg)',\n },\n});\n\nexport const SwitchButtonContainer = styled('div', {\n position: 'absolute',\n bottom: '-12px',\n left: '50%',\n transform: 'translate(-50%, 10%)',\n cursor: 'pointer',\n});\n\nexport const StyledButton = styled('div', {\n borderRadius: '$md',\n border: '3px solid $background',\n background: '$neutral100',\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n color: '$foreground',\n '&.rotate': {\n '& svg': {\n animation: `${rotateAnimation} ${ROTATE_ANIMATION_DURATION}ms ease-in-out forwards`,\n },\n },\n '&:hover': {\n color: '$secondary500',\n transform: 'translateY(1px) scale(1.04)',\n boxShadow: '1px 1px 1px 1px rgba(0, 0, 0, 0.05)',\n },\n});\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$5',\n alignSelf: 'stretch',\n});\n\nexport const FromContainer = styled('div', {\n position: 'relative',\n});\n", "import type { Token } from 'rango-sdk';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useWalletsStore } from '../store/wallets';\nimport { QuoteErrorType } from '../types';\nimport { debounce } from '../utils/common';\nimport { isPositiveNumber } from '../utils/numbers';\nimport {\n generateQuoteWarnings,\n getDefaultQuote,\n getQuoteFromTokenUsdPrice,\n getQuoteToTokenUsdPrice,\n sortQuotesBy,\n} from '../utils/quote';\nimport { isFeatureEnabled } from '../utils/settings';\nimport { createQuoteRequestBody } from '../utils/swap';\nimport { areTokensEqual } from '../utils/wallets';\n\nimport {\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap/useConfirmSwap.helpers';\nimport { useFetchAllQuotes } from './useFetchAllQuotes';\n\nconst DEBOUNCE_DELAY = 600;\nconst FIRST_INDEX = 0;\n\ntype FetchQuoteParams = Omit<\n Parameters<typeof createQuoteRequestBody>[typeof FIRST_INDEX],\n 'fromToken' | 'toToken'\n> & { fromToken: Token | null; toToken: Token | null };\n\ntype UseSwapInput = {\n fetch: (shouldChangeSelectedQuote?: boolean) => void;\n loading: boolean;\n};\ntype UseSwapInputProps = {\n refetchQuote: boolean;\n};\n/**\n * a hook for fetching quote based on from and to input values\n * we use this hook in home page\n */\nexport function useSwapInput({\n refetchQuote,\n}: UseSwapInputProps): UseSwapInput {\n const { fetch: fetchQuote, cancelFetch } = useFetchAllQuotes();\n const {\n excludeLiquiditySources: configExcludeLiquiditySources,\n features,\n enableCentralizedSwappers,\n } = useAppStore().config;\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const {\n fromToken,\n toToken,\n inputAmount,\n inputUsdValue,\n selectedQuote,\n sortStrategy,\n resetQuote,\n error,\n warning,\n setSelectedQuote,\n updateQuotePartialState,\n } = useQuoteStore();\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n fetchStatus,\n } = useAppStore();\n const liquiditySources = useAppStore().getLiquiditySources();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const excludeLiquiditySources = useAppStore().excludeLiquiditySources();\n const { findToken } = useAppStore();\n\n const [loading, setLoading] = useState(true);\n const prevInputAmount = useRef(inputAmount);\n const userSlippage = customSlippage ?? slippage;\n const tokensValueInvalid = !fromToken || !toToken;\n const shouldSkipRequest =\n tokensValueInvalid ||\n areTokensEqual(fromToken, toToken) ||\n !isPositiveNumber(inputAmount);\n\n const resetState = (loading: boolean) => {\n setLoading(loading);\n };\n\n const fetch = (params: FetchQuoteParams) => {\n const {\n fromToken,\n toToken,\n inputAmount,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n } = params;\n\n if (!loading) {\n resetState(true);\n }\n if (!shouldSkipRequest && fromToken && toToken) {\n resetQuote();\n const requestBody = createQuoteRequestBody({\n fromToken,\n toToken,\n inputAmount,\n liquiditySources: liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n wallets: connectedWallets,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n enableCentralizedSwappers,\n });\n if (isFeatureEnabled('experimentalRoute', features)) {\n requestBody.experimental = true;\n }\n fetchQuote(requestBody)\n .then((res) => {\n const sortQuotes = sortQuotesBy(sortStrategy, res.results);\n const quote = getDefaultQuote(\n selectedQuote,\n sortQuotes,\n res.requestAmount\n );\n\n setLoading(false);\n updateQuotePartialState('quotes', res);\n setSelectedQuote(quote);\n\n throwErrorIfResponseIsNotValid({\n diagnosisMessages: res.diagnosisMessages,\n requestId: quote?.requestId || '',\n swaps: quote?.swaps,\n });\n const outputUsdValue =\n getQuoteToTokenUsdPrice(quote) || toToken?.usdPrice;\n const inputUsdValue =\n getQuoteFromTokenUsdPrice(quote) || fromToken?.usdPrice;\n const quoteWarning =\n quote &&\n generateQuoteWarnings(quote, {\n fromToken: { ...fromToken, usdPrice: inputUsdValue },\n toToken: { ...toToken, usdPrice: outputUsdValue },\n userSlippage,\n findToken,\n });\n updateQuotePartialState('warning', quoteWarning);\n })\n .catch((error) => {\n const { error: quoteError } = handleQuoteErrors(error);\n if (\n quoteError?.type === QuoteErrorType.NO_RESULT ||\n quoteError?.type === QuoteErrorType.REQUEST_FAILED\n ) {\n resetQuote();\n }\n if (quoteError?.type !== QuoteErrorType.REQUEST_CANCELED) {\n updateQuotePartialState('error', quoteError);\n setLoading(false);\n }\n });\n }\n };\n\n const debouncedFetch = useCallback(\n debounce((params: FetchQuoteParams) => {\n fetch(params);\n }, DEBOUNCE_DELAY),\n [shouldSkipRequest]\n );\n\n useEffect(() => {\n if (!refetchQuote) {\n setLoading(false);\n return;\n }\n if (fetchStatus !== 'success') {\n return;\n }\n if (shouldSkipRequest) {\n setLoading(false);\n if (selectedQuote || error || warning) {\n resetQuote();\n }\n return;\n }\n if (!isPositiveNumber(inputAmount) || inputUsdValue?.eq(0)) {\n resetState(false);\n cancelFetch();\n return;\n }\n\n resetQuote();\n resetState(true);\n\n let fetchQuotes = fetch;\n if (prevInputAmount.current && prevInputAmount.current != inputAmount) {\n fetchQuotes = debouncedFetch;\n }\n prevInputAmount.current = inputAmount;\n\n fetchQuotes({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n });\n return cancelFetch;\n }, [\n fetchStatus,\n inputAmount,\n fromToken?.symbol,\n fromToken?.address,\n fromToken?.blockchain,\n toToken?.symbol,\n toToken?.address,\n toToken?.blockchain,\n shouldSkipRequest,\n liquiditySources?.length,\n configExcludeLiquiditySources,\n disabledLiquiditySources.length,\n userSlippage,\n affiliateRef,\n affiliatePercent,\n JSON.stringify(affiliateWallets),\n ]);\n\n return {\n fetch: () =>\n fetch({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n }),\n loading,\n };\n}\n", "import type { UseFetchResult } from './useFetch';\nimport type { BestRouteRequest, MultiRouteResponse } from 'rango-sdk';\n\nimport { httpService } from '../services/httpService';\n\nimport { useFetch } from './useFetch';\n\nexport function useFetchAllQuotes(): UseFetchResult<\n BestRouteRequest,\n MultiRouteResponse\n> {\n const { fetch, loading, cancelFetch } = useFetch<\n BestRouteRequest,\n MultiRouteResponse\n >({\n request: async (requestBody, options) =>\n await httpService().getAllRoutes(requestBody, options),\n });\n\n return { fetch, loading, cancelFetch };\n}\n", "import { eventEmitter } from '../services/eventEmitter';\nimport { type UiEventData, WidgetEvents } from '../types';\n\ntype UiEvent = {\n type: UiEventData['type'];\n payload?: Omit<UiEventData['payload'], 'preventDefault'>;\n};\n\nexport function emitPreventableEvent(event: UiEvent, action: () => void): void {\n let defaultPrevented = false;\n\n const extendedPayload = {\n preventDefault() {\n defaultPrevented = true;\n },\n ...(event.payload === undefined && { payload: event.payload }),\n };\n\n eventEmitter.emit(WidgetEvents.UiEvent, {\n type: event.type,\n payload: extendedPayload,\n });\n\n if (!defaultPrevented) {\n action();\n }\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Alert,\n Divider,\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { useLanguage } from '../hooks/useLanguage';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\n\nexport function LanguagePage() {\n const { activeLanguage, changeLanguage, languages } = useLanguage();\n const navigateBack = useNavigateBack();\n\n const languageList = languages.map((languageItem) => {\n const { local, label, SVGFlag } = languageItem;\n return {\n id: local,\n value: local,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {label}\n </Typography>\n ),\n onClick: () => {\n changeLanguage(languageItem.local);\n navigateBack();\n },\n end: <Radio value={local} />,\n start: <SVGFlag />,\n };\n });\n\n return (\n <Layout\n header={{\n title: i18n.t('Language'),\n }}>\n <PageContainer>\n <Alert\n type=\"warning\"\n variant=\"alarm\"\n title=\"Important Notice: Machine translations are in use\"\n />\n <Divider size={'8'} />\n <RadioRoot value={activeLanguage}>\n <List\n type={\n <ListItemButton\n title={i18n.t('language')}\n id=\"_\"\n onClick={() => console.log()}\n />\n }\n items={languageList}\n />\n </RadioRoot>\n </PageContainer>\n </Layout>\n );\n}\n", "import type { LanguageItem } from '../constants/languages';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { DEFAULT_LANGUAGE, LANGUAGES } from '../constants/languages';\nimport { useAppStore } from '../store/AppStore';\n\ninterface UseLanguage {\n languages: LanguageItem[];\n defaultLanguage: Language;\n activeLanguage: Language;\n changeLanguage: (language?: Language | null) => void;\n resetLanguage: () => void;\n}\n\nexport function useLanguage(): UseLanguage {\n const { setLanguage, language, config } = useAppStore();\n const languages = LANGUAGES;\n const defaultLanguage = config?.language || DEFAULT_LANGUAGE;\n\n return {\n activeLanguage: language || defaultLanguage,\n languages,\n defaultLanguage,\n changeLanguage: (language) => setLanguage(language || DEFAULT_LANGUAGE),\n resetLanguage: () => setLanguage(null),\n };\n}\n", "import type { UniqueSwappersGroupType } from '../utils/settings';\nimport type { SwapperType } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Checkbox,\n Image,\n ListItemButton,\n NotFound,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { LoadingLiquiditySourceList } from '../components/LoadingLiquiditySourceList';\nimport { SearchInput } from '../components/SearchInput';\nimport {\n LiquiditySourceList,\n LiquiditySourceSuffix,\n NotFoundContainer,\n} from '../components/SettingsContainer';\nimport { useAppStore } from '../store/AppStore';\nimport { containsText } from '../utils/numbers';\nimport { getUniqueSwappersGroups } from '../utils/settings';\n\ninterface PropTypes {\n sourceType: 'Exchanges' | 'Bridges';\n}\n\nexport function LiquiditySourcePage({ sourceType }: PropTypes) {\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const toggleLiquiditySource = useAppStore().toggleLiquiditySource;\n const campaignMode = useAppStore().isInCampaignMode();\n const supportedUniqueSwappersGroups: Array<UniqueSwappersGroupType> =\n getUniqueSwappersGroups(swappers, disabledLiquiditySources);\n\n const types = { Exchanges: i18n.t('Exchanges'), Bridges: i18n.t('Bridges') };\n const validTypes: Array<SwapperType> = [];\n if (sourceType === 'Exchanges') {\n validTypes.push('DEX');\n }\n if (sourceType === 'Bridges') {\n validTypes.push('BRIDGE', 'AGGREGATOR', 'OFF_CHAIN');\n }\n\n const liquiditySources = supportedUniqueSwappersGroups.filter((uniqueItem) =>\n validTypes.includes(uniqueItem.type)\n );\n\n const hasSelectAll =\n liquiditySources.length ===\n liquiditySources.filter((sourceItem) => sourceItem.selected).length;\n\n const toggleAllSources = () => {\n liquiditySources.forEach((sourceItem) => {\n if (hasSelectAll) {\n toggleLiquiditySource(sourceItem.groupTitle);\n } else {\n if (!sourceItem.selected) {\n toggleLiquiditySource(sourceItem.groupTitle);\n }\n }\n });\n };\n\n const list = liquiditySources.map((sourceItem) => {\n const { selected, groupTitle, logo } = sourceItem;\n return {\n start: <Image src={logo} size={22} type=\"circular\" />,\n onClick: () => {\n if (!campaignMode) {\n toggleLiquiditySource(groupTitle);\n }\n },\n end: <Checkbox checked={selected} disabled={campaignMode} />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t(groupTitle)}\n </Typography>\n ),\n ...sourceItem,\n };\n });\n\n const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setSearchedFor(value);\n };\n\n let filteredList = list;\n if (searchedFor) {\n filteredList = list.filter((sourceItem) =>\n containsText(sourceItem.groupTitle, searchedFor)\n );\n }\n\n return (\n <Layout\n header={{\n title: i18n.t(sourceType),\n suffix: (\n <LiquiditySourceSuffix>\n <Button variant=\"ghost\" size=\"xsmall\" onClick={toggleAllSources}>\n {hasSelectAll ? i18n.t('Deselect all') : i18n.t('Select all')}\n </Button>\n </LiquiditySourceSuffix>\n ),\n }}>\n <PageContainer view>\n <SearchInput\n value={searchedFor}\n setValue={setSearchedFor}\n fullWidth\n color=\"light\"\n variant=\"contained\"\n placeholder={i18n.t('Search {sourceType}', {\n sourceType: types[sourceType],\n })}\n onChange={handleSearch}\n />\n {fetchStatus === 'loading' && <LoadingLiquiditySourceList />}\n\n {!filteredList.length && !!searchedFor ? (\n <NotFoundContainer>\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </NotFoundContainer>\n ) : (\n fetchStatus === 'success' && (\n <LiquiditySourceList disabled={campaignMode}>\n {filteredList.map((sourceItem) => {\n const { groupTitle, ...otherProps } = sourceItem;\n\n return (\n <React.Fragment key={sourceItem.id}>\n <ListItemButton\n style={{ height: '61px' }}\n {...otherProps}\n selected={false}\n hasDivider\n />\n </React.Fragment>\n );\n })}\n </LiquiditySourceList>\n )\n )}\n </PageContainer>\n </Layout>\n );\n}\n", "import { Checkbox, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { LiquiditySourceList } from '../SettingsContainer';\n\nimport { CustomListItem } from './LoadingLiquiditySourceList.styles';\n\nconst ITEM_SKELETON_COUNT = 30;\nexport function LoadingLiquiditySourceList() {\n return (\n <LiquiditySourceList>\n {Array.from(Array(ITEM_SKELETON_COUNT), (_, index) => (\n <CustomListItem\n hasDivider\n key={index}\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n title={<Skeleton variant=\"text\" size=\"large\" width={90} />}\n end={<Checkbox checked={false} />}\n />\n ))}\n </LiquiditySourceList>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const LiquiditySourceList = styled('ul', {\n padding: '$15 $5 0',\n margin: 0,\n listStyle: 'none',\n height: '100%',\n overflowY: 'auto',\n variants: {\n disabled: {\n true: {\n pointerEvents: 'none',\n },\n },\n },\n});\n\nexport const LiquiditySourceSuffix = styled('div', {\n width: 80,\n display: 'flex',\n justifyContent: 'flex-end',\n});\n\nexport const NotFoundContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n});\n", "import { ListItem, styled } from '@rango-dev/ui';\n\nexport const CustomListItem = styled(ListItem, {\n height: 61,\n});\n", "import type { SelectedQuote } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HeaderButtons } from '../components/HeaderButtons';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { Quotes } from '../components/Quotes';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useSwapInput } from '../hooks/useSwapInput';\nimport { useQuoteStore } from '../store/quote';\n\nexport function RoutesPage() {\n const navigate = useNavigate();\n const navigateBack = useNavigateBack();\n const {\n selectedQuote,\n refetchQuote,\n setSelectedQuote,\n updateQuotePartialState,\n error: quoteError,\n } = useQuoteStore();\n\n const { fetch: fetchQuote, loading: fetchingQuote } = useSwapInput({\n refetchQuote,\n });\n\n const onClickOnQuote = (quote: SelectedQuote) => {\n setSelectedQuote(quote);\n updateQuotePartialState('refetchQuote', false);\n navigateBack();\n };\n\n const settings_url = `../${navigationRoutes.settings}`;\n const wallets_url = `../${navigationRoutes.wallets}`;\n return (\n <Layout\n header={{\n onWallet: () => {\n navigate(wallets_url);\n updateQuotePartialState('refetchQuote', true);\n },\n onBack: () => {\n updateQuotePartialState('refetchQuote', false);\n },\n title: i18n.t('Routes'),\n suffix: (\n <HeaderButtons\n onClickRefresh={\n !!selectedQuote || quoteError ? fetchQuote : undefined\n }\n hidden={['notifications', 'history']}\n onClickSettings={() => {\n navigate(settings_url);\n updateQuotePartialState('refetchQuote', true);\n }}\n />\n ),\n }}>\n <PageContainer>\n <Quotes\n fetch={fetchQuote}\n loading={fetchingQuote}\n onClickOnQuote={onClickOnQuote}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Divider,\n getCategoriesCount,\n SelectableCategoryList,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { BlockchainList } from '../components/BlockchainList';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\n\ninterface PropTypes {\n type: 'source' | 'destination' | 'custom-token';\n hideCategory?: boolean;\n}\n\nexport function SelectBlockchainPage(props: PropTypes) {\n const { type } = props;\n const navigateBack = useNavigateBack();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const [blockchainCategory, setBlockchainCategory] = useState<string>('ALL');\n const setToBlockchain = useQuoteStore.use.setToBlockchain();\n const setFromBlockchain = useQuoteStore.use.setFromBlockchain();\n const { fetchStatus } = useAppStore();\n const navigate = useNavigate();\n\n const blockchains = useAppStore().blockchains({\n type,\n });\n const activeCategoriesCount = getCategoriesCount(blockchains);\n\n const showCategory = !props.hideCategory && activeCategoriesCount !== 1;\n\n return (\n <Layout\n header={{\n title: i18n.t(`Select Blockchain`),\n }}>\n <PageContainer view>\n {showCategory && (\n <>\n <SelectableCategoryList\n setCategory={setBlockchainCategory}\n category={blockchainCategory}\n blockchains={blockchains}\n isLoading={fetchStatus === 'loading'}\n />\n <Divider size={24} />\n </>\n )}\n\n <SearchInput\n value={searchedFor}\n autoFocus\n placeholder={i18n.t('Search Blockchain')}\n color=\"light\"\n variant=\"contained\"\n size=\"large\"\n setValue={() => setSearchedFor('')}\n onChange={(event) => setSearchedFor(event.target.value)}\n />\n <Divider size={16} />\n\n <BlockchainList\n list={blockchains}\n showTitle={type !== 'custom-token'}\n searchedFor={searchedFor}\n blockchainCategory={blockchainCategory}\n onChange={(blockchain) => {\n if (type === 'custom-token') {\n navigate(`..?blockchain=${blockchain.name}`, { replace: true });\n } else {\n if (type === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n navigateBack();\n }\n }}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './BlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n Image,\n ListItemButton,\n NotFound,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { filterBlockchains } from './BlockchainList.helpers';\nimport { BlockchainListContainer, List } from './BlockchainList.styles';\nimport { LoadingBlockchainList } from './LoadingBlockchainList';\n\nexport function BlockchainList(props: PropTypes) {\n const {\n list,\n searchedFor,\n onChange,\n blockchainCategory,\n showTitle = true,\n } = props;\n const [blockchains, setBlockchains] = useState<BlockchainMeta[]>(list);\n const { fetchStatus } = useAppStore();\n\n useEffect(() => {\n setBlockchains([\n ...filterBlockchains(list, searchedFor, blockchainCategory),\n ]);\n }, [list, searchedFor, blockchainCategory]);\n\n const renderList = () => {\n if (!blockchains.length && !!searchedFor) {\n return (\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n );\n }\n return (\n <List as=\"ul\" key={`${blockchainCategory}-${searchedFor}`}>\n {blockchains.map((item) => (\n <ListItemButton\n key={`${item.name}-${item.chainId}`}\n hasDivider\n onClick={() => onChange(item)}\n start={<Image src={item.logo} size={30} />}\n title={\n <Typography variant=\"title\" size=\"medium\">\n {item.displayName}\n </Typography>\n }\n id={item.chainId as string}\n />\n ))}\n </List>\n );\n };\n\n return (\n <>\n {showTitle && (\n <>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={4} />\n </>\n )}\n <BlockchainListContainer>\n {fetchStatus === 'loading' && <LoadingBlockchainList />}\n {fetchStatus === 'success' && renderList()}\n </BlockchainListContainer>\n </>\n );\n}\n", "import { type BlockchainMeta } from 'rango-sdk';\n\nimport { containsText, isBlockchainTypeInCategory } from '../../utils/common';\n\nexport const filterBlockchains = (\n list: BlockchainMeta[],\n searchedFor: string,\n blockchainCategory: string\n) =>\n list\n .filter((blockchain) =>\n isBlockchainTypeInCategory(blockchain.type, blockchainCategory)\n )\n .filter(\n (blockchain) =>\n containsText(blockchain.name, searchedFor) ||\n containsText(blockchain.displayName, searchedFor)\n );\n", "import { ImageContainer, styled } from '@rango-dev/ui';\n\nimport { ScrollableArea } from '../Layout';\n\nexport const BlockchainListContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n height: '100%',\n justifyContent: 'center',\n});\n\nexport const List = styled(ScrollableArea, {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n [`& ${ImageContainer}`]: {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n});\n", "import { ListItem, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { List } from './BlockchainList.styles';\n\nconst ITEM_SKELETON_COUNT = 20;\nexport function LoadingBlockchainList() {\n return (\n <List>\n {Array.from(Array(ITEM_SKELETON_COUNT), (e) => (\n <ListItem\n key={e}\n hasDivider\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n title={<Skeleton variant=\"text\" size=\"large\" width={90} />}\n />\n ))}\n </List>\n );\n}\n", "import type { BlockchainMeta, Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider } from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { BlockchainsSection } from '../components/BlockchainsSection';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { TokenList } from '../components/TokenList';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useWalletsStore } from '../store/wallets';\n\ninterface PropTypes {\n type: 'source' | 'destination';\n}\n\nexport function SelectSwapItemsPage(props: PropTypes) {\n const { type } = props;\n const navigate = useNavigate();\n const navigateBack = useNavigateBack();\n const {\n fromBlockchain,\n toBlockchain,\n setFromToken,\n setToToken,\n setFromBlockchain,\n setToBlockchain,\n } = useQuoteStore();\n const getBalanceFor = useWalletsStore.use.getBalanceFor();\n const [searchedFor, setSearchedFor] = useState<string>('');\n\n const selectedBlockchain = type === 'source' ? fromBlockchain : toBlockchain;\n const selectedBlockchainName = selectedBlockchain?.name ?? '';\n\n // Tokens & Blockchains list\n const blockchains = useAppStore().blockchains({\n type,\n });\n const tokens = useAppStore().tokens({\n type,\n blockchain: selectedBlockchainName,\n searchFor: searchedFor,\n getBalanceFor: getBalanceFor,\n });\n\n const updateBlockchain = (blockchain: BlockchainMeta) => {\n if (type === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n };\n\n const updateToken = (token: Token) => {\n if (type === 'source') {\n setFromToken({ token, meta: { blockchains, tokens } });\n } else {\n setToToken({ token, meta: { blockchains, tokens } });\n }\n };\n const types = {\n source: i18n.t('Source'),\n destination: i18n.t('Destination'),\n };\n\n return (\n <Layout\n header={{\n title: i18n.t('Swap {type}', { type: types[type] }),\n }}>\n <PageContainer>\n <BlockchainsSection\n blockchains={blockchains}\n type={type == 'source' ? 'from' : 'to'}\n blockchain={type === 'source' ? fromBlockchain : toBlockchain}\n onMoreClick={() => navigate(navigationRoutes.blockchains)}\n onChange={(blockchain) => {\n updateBlockchain(blockchain);\n }}\n />\n <Divider size={24} />\n <SearchInput\n value={searchedFor}\n autoFocus\n placeholder={i18n.t('Search Token')}\n color=\"light\"\n variant=\"contained\"\n size=\"large\"\n setValue={() => setSearchedFor('')}\n onChange={(event) => setSearchedFor(event.target.value)}\n />\n <Divider size={16} />\n <TokenList\n list={tokens}\n selectedBlockchain={selectedBlockchainName}\n searchedFor={searchedFor}\n type={type}\n onChange={(token) => {\n updateToken(token);\n\n const tokenBlockchain = blockchains.find(\n (chain) => token.blockchain === chain.name\n );\n if (tokenBlockchain) {\n updateBlockchain(tokenBlockchain);\n }\n\n navigateBack();\n }}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes } from './BlockchainsSection.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n BlockchainsChip,\n Divider,\n Image,\n Skeleton,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { BLOCKCHAIN_LIST_SIZE } from '../../constants/configs';\nimport { usePrepareBlockchainList } from '../../hooks/usePrepareBlockchainList';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { getContainer } from '../../utils/common';\n\nimport { Blockchains } from './BlockchainsSection.styles';\n\nconst NUMBER_OF_LOADING = 12;\n\nexport function BlockchainsSection(props: PropTypes) {\n const { blockchains, type, blockchain, onChange, onMoreClick } = props;\n const blockchainsList = usePrepareBlockchainList(blockchains, {\n limit: BLOCKCHAIN_LIST_SIZE,\n selected: blockchain?.name,\n });\n\n const { fetchStatus } = useAppStore();\n const resetToBlockchain = useQuoteStore.use.resetToBlockchain();\n const resetFromBlockchain = useQuoteStore.use.resetFromBlockchain();\n const hasMoreItemsInList = blockchainsList.more.length > 0;\n /**\n * When only one item is left on list, we will not show the `More` button and will show the item itself instead.\n */\n const onlyOneItemInList = blockchainsList.more.length === 1;\n const showMoreButton = !onlyOneItemInList && hasMoreItemsInList;\n\n return (\n <>\n <Divider size={12} />\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={12} />\n <Blockchains>\n {fetchStatus === 'loading' &&\n Array.from(Array(NUMBER_OF_LOADING), (e) => (\n <Skeleton key={e} variant=\"rounded\" height={50} />\n ))}\n {fetchStatus === 'success' && (\n <>\n <BlockchainsChip\n selected={!blockchain}\n onClick={() => {\n if (type === 'from') {\n resetFromBlockchain();\n } else {\n resetToBlockchain();\n }\n }}>\n <Typography variant=\"body\" size=\"xsmall\" color=\"secondary500\">\n {i18n.t('All')}\n </Typography>\n </BlockchainsChip>\n {blockchainsList.list.map((item) => (\n <Tooltip\n key={item.name}\n content={item.shortName}\n side=\"bottom\"\n sideOffset={2}\n container={getContainer()}>\n <BlockchainsChip\n key={item.name}\n selected={!!blockchain && blockchain.name === item.name}\n onClick={() => onChange(item)}>\n <Image src={item.logo} size={30} />\n </BlockchainsChip>\n </Tooltip>\n ))}\n\n {onlyOneItemInList ? (\n <BlockchainsChip\n key={blockchainsList.more[0].name}\n selected={\n !!blockchain &&\n blockchain.name === blockchainsList.more[0].name\n }\n onClick={() => onChange(blockchainsList.more[0])}>\n <Image src={blockchainsList.more[0].logo} size={30} />\n </BlockchainsChip>\n ) : null}\n\n {showMoreButton ? (\n <BlockchainsChip onClick={onMoreClick} key=\"more-blockchains\">\n <Typography variant=\"body\" size=\"xsmall\" color=\"secondary500\">\n {i18n._('More +{count}', {\n count: blockchainsList.more.length,\n })}\n </Typography>\n </BlockchainsChip>\n ) : null}\n </>\n )}\n </Blockchains>\n </>\n );\n}\n", "import type {\n PrepareListOptions,\n UsePrepareList,\n} from './usePrepareBlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { isInVisibleList, prepare } from './usePrepareBlockchainList.helpers';\n\n/**\n *\n * UI needs some specific logics like limiting the list and sorting,\n * this function is getting the raw blockchains list and return a list for showing in UI.\n *\n */\nexport function usePrepareBlockchainList(\n blockchains: BlockchainMeta[],\n options?: PrepareListOptions\n): UsePrepareList {\n const { preferredBlockchains, addPreferredBlockchain } = useAppStore();\n\n useEffect(() => {\n if (options?.selected) {\n const output = prepare(blockchains, preferredBlockchains, options);\n\n /**\n * We only add a new blockchain to preferred when it's not in the main list\n * In this way we can guarantee we will be able to regenerate the same list always.\n * And also it helps us to avoid jumping for the last item of the main list (e.g. tenth item of our list).\n */\n if (!isInVisibleList(options.selected, output)) {\n addPreferredBlockchain(options?.selected);\n }\n }\n }, [options?.selected]);\n\n const output = prepare(blockchains, preferredBlockchains, options);\n\n return {\n list: output.list,\n more: output.more,\n history: [],\n };\n}\n", "export const MOST_USED_BLOCKCHAINS = ['ETH', 'COSMOS', 'OSMOSIS'];\n", "import type {\n PrepareListOptions,\n PrepareOutput,\n} from './usePrepareBlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { MOST_USED_BLOCKCHAINS } from './usePrepareBlockchainList.constants';\n\nexport function prepare(\n blockchains: BlockchainMeta[],\n preferredBlockchains: string[],\n options?: PrepareListOptions\n): PrepareOutput {\n /*\n * TODO:\n * We copying the `blockchains` which can causes performance penalties but we should because we are mutating the original object.\n * A better way to solve the problem maybe is using new JS features like Use toSpliced() but\n * we can not use it right now because we need to upgrade our toolings first.\n */\n const list: BlockchainMeta[] = JSON.parse(JSON.stringify(blockchains));\n let more: BlockchainMeta[] = [];\n\n list.sort(sortByMostUsedBlockchains);\n\n // Checking `limit` has set and it should be more than of the list items.\n if (!!options?.limit && blockchains.length > options.limit) {\n const start = options.limit;\n let preferredBlockchainsWithoutMainList = preferredBlockchains;\n\n if (preferredBlockchains.length <= options.limit) {\n /**\n *\n * if we want to show 10 items (aka `options.limit`)\n * and have these items as our preferred list: [x,y,z]\n * and these as our main list: [A, B, C, D, E, F, G, H, I, J]\n * the final list will be like this: [...preferred, ...mainList].\n *\n * Since we have a limit (e.g. 10) on our list (preferred + mainList),\n * we only should check those items from main list that will be in final list.\n *\n * finalListWithoutLimit = [x,y,z, A, B, C, D, E, F, G, H, I, J]\n * finalListWithLimit = [x,y,z, A, B, C, D, E, F, G]\n *\n * As you can see, [H, I, J] will not be in our list.\n *\n * The following code only check preffred blockchain\n * shouldn't be in first 7 of 10 items in main list. (Since, the last 3 items will not be in the final list and we should check those.)\n */\n const howManyItemsShouldBeCheckedFromMainList =\n options.limit - preferredBlockchains.length;\n\n for (let i = 0; i <= howManyItemsShouldBeCheckedFromMainList; i++) {\n const blockchain = list[i];\n\n preferredBlockchainsWithoutMainList =\n preferredBlockchainsWithoutMainList.filter((preferredBlockchain) => {\n return blockchain.name !== preferredBlockchain;\n });\n }\n }\n\n list.sort(\n generateSortByPreferredBlockchainsFor(preferredBlockchainsWithoutMainList)\n );\n\n /*\n * Splice will modify the original list and returns the deleted items\n * We use the deleted items as `more`\n */\n more = list.splice(start);\n }\n return {\n list,\n more,\n };\n}\n\n/** There is a hardcoded list of blockchains that we want to show them first in the list. */\nexport function sortByMostUsedBlockchains(\n a: BlockchainMeta,\n b: BlockchainMeta\n) {\n const mostUsed = MOST_USED_BLOCKCHAINS;\n const aIndexInMostUsed = mostUsed.findIndex((token) => token === a.name);\n const bIndexInMostUsed = mostUsed.findIndex((token) => token === b.name);\n const aIsMostUsed = aIndexInMostUsed > -1;\n const bIsMostUsed = bIndexInMostUsed > -1;\n\n if (aIsMostUsed && bIsMostUsed) {\n return aIndexInMostUsed > bIndexInMostUsed ? 1 : -1;\n }\n\n if (aIsMostUsed) {\n return -1;\n }\n\n if (bIsMostUsed) {\n return 1;\n }\n\n return 0;\n}\n\nexport function generateSortByPreferredBlockchainsFor(\n preferredBlockchains: string[]\n) {\n return function sortByPreferred(a: BlockchainMeta, b: BlockchainMeta) {\n const aIndexInPreferred = preferredBlockchains.findIndex(\n (blockchain) => blockchain === a.name\n );\n const bIndexInPreferred = preferredBlockchains.findIndex(\n (blockchain) => blockchain === b.name\n );\n\n const aIsPreferred = aIndexInPreferred > -1;\n const bIsPreferred = bIndexInPreferred > -1;\n\n if (aIsPreferred && bIsPreferred) {\n return aIndexInPreferred > bIndexInPreferred ? 1 : -1;\n }\n\n if (preferredBlockchains.includes(a.name)) {\n return -1;\n }\n if (preferredBlockchains.includes(b.name)) {\n return 1;\n }\n\n return 0;\n };\n}\n\nexport function isInVisibleList(\n blockchain: string,\n prepareOutput: PrepareOutput\n): boolean {\n return !!prepareOutput.list.find((item) => item.name === blockchain);\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Blockchains = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: 'repeat(6, minmax(0, 1fr))',\n});\n", "import { i18n } from '@lingui/core';\nimport { Alert, Button, styled } from '@rango-dev/ui';\nimport React from 'react';\nimport { useInRouterContext, useSearchParams } from 'react-router-dom';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { Slippage } from '../components/Slippage';\nimport { SearchParams } from '../constants/searchParams';\nimport { SettingsLists } from '../containers/Settings/Lists';\nimport { useAppStore } from '../store/AppStore';\n\nconst ResetAction = styled('div', {\n paddingLeft: '$8',\n});\n\nexport function SettingsPage() {\n const { isInCampaignMode, updateCampaignMode } = useAppStore();\n const campaignMode = isInCampaignMode();\n\n const [, setSearchParams] = useSearchParams();\n const isRouterInContext = useInRouterContext();\n\n const onClick = () => {\n if (isRouterInContext && campaignMode) {\n setSearchParams(\n (prev) => {\n prev.delete(SearchParams.LIQUIDITY_SOURCES);\n return prev;\n },\n { replace: true }\n );\n updateCampaignMode('liquiditySources', undefined);\n }\n };\n return (\n <Layout\n header={{\n title: i18n.t('Settings'),\n }}>\n <PageContainer>\n {campaignMode && (\n <Alert\n type=\"info\"\n variant=\"alarm\"\n title={i18n.t(\n \"Currently, you're in campaign mode with restrictions on liquidity sources. Would you like to switch out of this mode and make use of all available liquidity sources?\"\n )}\n action={\n <ResetAction>\n <Button type=\"secondary\" size=\"small\" onClick={onClick}>\n {i18n.t('Reset')}\n </Button>\n </ResetAction>\n }\n />\n )}\n <Slippage />\n <SettingsLists />\n </PageContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Divider,\n InfoIcon,\n SlippageIcon,\n TextField,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n MAX_SLIPPAGE,\n MIN_SLIPPGAE,\n SLIPPAGES,\n} from '../../constants/swapSettings';\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\n\nimport {\n BaseContainer,\n Head,\n SlippageChip,\n SlippageChipsContainer,\n} from './Slippage.styles';\nimport { SlippageTooltipContent } from './SlippageTooltipContent';\n\nexport function Slippage() {\n const { slippage, setSlippage, customSlippage, setCustomSlippage } =\n useAppStore();\n\n return (\n <BaseContainer>\n <Head>\n <SlippageIcon size={16} color=\"gray\" />\n <Divider direction=\"horizontal\" size={4} />\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Slippage tolerance per swap')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tooltip\n container={getContainer()}\n side=\"top\"\n sideOffset={4}\n content={<SlippageTooltipContent />}>\n <InfoIcon color=\"gray\" />\n </Tooltip>\n </Head>\n <SlippageChipsContainer>\n {SLIPPAGES.map((slippageItem, index) => {\n const key = `slippage-${index}`;\n return (\n <SlippageChip\n key={key}\n onClick={() => {\n if (customSlippage) {\n setCustomSlippage(null);\n }\n setSlippage(slippageItem);\n }}\n selected={!customSlippage && slippageItem === slippage}\n label={`${slippageItem.toString()}%`}\n />\n );\n })}\n <TextField\n type=\"number\"\n min=\"0.01\"\n max=\"30\"\n step=\"0.01\"\n fullWidth\n variant=\"contained\"\n value={customSlippage === null ? '' : customSlippage}\n color=\"dark\"\n onChange={(event) => {\n const value = event.target.value;\n const parsedValue = parseFloat(value);\n if (parsedValue >= MIN_SLIPPGAE && parsedValue <= MAX_SLIPPAGE) {\n setCustomSlippage(parsedValue);\n } else {\n setCustomSlippage(null);\n }\n }}\n suffix={\n customSlippage && (\n <Typography variant=\"body\" size=\"small\">\n %\n </Typography>\n )\n }\n placeholder={i18n.t('Custom')}\n />\n </SlippageChipsContainer>\n </BaseContainer>\n );\n}\n", "import { Chip, styled, TextField } from '@rango-dev/ui';\n\nexport const BaseContainer = styled('div', {\n paddingTop: '$5',\n padding: '$10 $5',\n});\n\nexport const SlippageChipsContainer = styled('div', {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '$10',\n [`& ${TextField}`]: {\n flex: '1 1 0',\n maxWidth: '127px',\n minWidth: '85px',\n },\n});\n\nexport const Head = styled('div', {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n paddingBottom: '$10',\n});\n\nexport const SlippageTooltipContainer = styled('div', {\n maxWidth: '280px',\n padding: '$10',\n});\n\nexport const SlippageChip = styled(Chip, {\n width: '61px',\n flexShrink: 0,\n});\n", "import { i18n } from '@lingui/core';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SlippageTooltipContainer } from './Slippage.styles';\n\nexport function SlippageTooltipContent() {\n return (\n <SlippageTooltipContainer>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral700\">\n {i18n.t(\n 'Your transaction will be reverted if the price changes unfavorably by more than this percentage'\n )}\n <br />\n <br />\n <b>{i18n.t('Warning')}</b>:\n {i18n.t(\n 'This setting is applied per step (e.g. 1Inch, Thorchain, etc) which means only the step will be reverted, not the whole transaction.'\n )}\n </Typography>\n </SlippageTooltipContainer>\n );\n}\n", "import type { ThemeMode } from '../../store/slices/settings';\nimport type { ListPropTypes, SvgIconProps } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\nimport {\n AutoThemeIcon,\n BridgesIcon,\n ChevronRightIcon,\n DarkModeIcon,\n Divider,\n ExchangeIcon,\n InfinityIcon,\n InfoIcon,\n LanguageIcon,\n LightModeIcon,\n List,\n ListItem,\n ListItemButton,\n Skeleton,\n styled,\n Switch,\n Tabs,\n TargetIcon,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { SlippageTooltipContainer as TooltipContainer } from '../../components/Slippage/Slippage.styles';\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { ThemeModeEnum } from '../../constants/settings';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { getUniqueSwappersGroups, isFeatureHidden } from '../../utils/settings';\n\nconst ThemeSection = styled('div', {\n width: '202px',\n height: '$40',\n});\n\nconst themesList = [\n {\n id: ThemeModeEnum.LIGHT,\n icon: <LightModeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Light')}\n </Typography>\n ),\n },\n {\n id: ThemeModeEnum.DARK,\n icon: <DarkModeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Dark')}\n </Typography>\n ),\n },\n {\n id: ThemeModeEnum.AUTO,\n icon: <AutoThemeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Auto')}\n </Typography>\n ),\n },\n];\n\nconst getThemeIcon = (theme: ThemeMode) => {\n const iconProps: SvgIconProps = { color: 'gray', size: 16 };\n\n switch (theme) {\n case 'auto':\n return <AutoThemeIcon {...iconProps} />;\n case 'dark':\n return <DarkModeIcon {...iconProps} />;\n default:\n return <LightModeIcon {...iconProps} />;\n }\n};\n\nexport function SettingsLists() {\n const navigate = useNavigate();\n const { theme: themeConfig } = useAppStore().config;\n const { setTheme, theme } = useAppStore();\n const { activeLanguage, languages } = useLanguage();\n const currentLanguage = languages.find(\n (language) => language.local === activeLanguage\n )?.label;\n\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const {\n config: { features },\n } = useAppStore();\n const customTokens = useAppStore().customTokens();\n const isThemeHidden = isFeatureHidden('theme', features);\n const isLiquidityHidden = isFeatureHidden('liquiditySource', features);\n const isLanguageHidden = isFeatureHidden('language', features);\n const isCustomTokensHidden = isFeatureHidden('customTokens', features);\n\n const infiniteApprove = useAppStore().infiniteApprove;\n const toggleInfiniteApprove = useAppStore().toggleInfiniteApprove;\n\n const supportedUniqueSwappersGroups = getUniqueSwappersGroups(\n swappers,\n disabledLiquiditySources\n );\n\n const bridgeSources = supportedUniqueSwappersGroups.filter((uniqueItem) =>\n ['BRIDGE', 'AGGREGATOR', 'OFF_CHAIN'].includes(uniqueItem.type)\n );\n\n const totalBridgeSources = bridgeSources.length;\n const totalSelectedBridgeSources = bridgeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const exchangeSources = supportedUniqueSwappersGroups.filter(\n (uniqueItem) => uniqueItem.type === 'DEX'\n );\n\n const totalExchangeSources = exchangeSources.length;\n const totalSelectedExchangeSources = exchangeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const handleSwapperEndItem = (totalSelected: number, total: number) => {\n switch (fetchStatus) {\n case 'loading':\n return <Skeleton variant=\"text\" size=\"medium\" width={50} />;\n case 'failed':\n return (\n <Typography variant=\"body\" size=\"medium\" color=\"$error500\">\n {i18n.t('Loading failed')}\n </Typography>\n );\n default:\n return (\n <Typography variant=\"body\" size=\"medium\">\n {`${totalSelected} / ${total}`}\n </Typography>\n );\n }\n };\n\n const bridgeItem = {\n id: 'bridge-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Bridges')}\n </Typography>\n ),\n end: (\n <>\n {handleSwapperEndItem(totalSelectedBridgeSources, totalBridgeSources)}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.bridges),\n start: <BridgesIcon color=\"gray\" size={16} />,\n };\n\n const exchangeItem = {\n id: 'exchange-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Exchanges')}\n </Typography>\n ),\n end: (\n <>\n {handleSwapperEndItem(\n totalSelectedExchangeSources,\n totalExchangeSources\n )}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n start: <ExchangeIcon color=\"gray\" size={16} />,\n onClick: () => navigate(navigationRoutes.exchanges),\n };\n\n const customTokensItem = {\n id: 'custom-tokens-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Custom Tokens')}\n </Typography>\n ),\n end: (\n <>\n <Typography variant=\"body\" size=\"medium\">\n {`${customTokens.length}`}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n start: <TargetIcon color=\"gray\" size={16} />,\n onClick: () => navigate(navigationRoutes.customTokens),\n };\n const languageItem = {\n id: 'language-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Language')}\n </Typography>\n ),\n start: <LanguageIcon color=\"gray\" size={16} />,\n end: (\n <>\n <Typography variant=\"body\" size=\"medium\">\n {currentLanguage}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.languages),\n };\n\n const infiniteApprovalItem = {\n id: 'infinite-approval-item',\n title: (\n <>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Infinite approval')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tooltip\n side=\"top\"\n sideOffset={4}\n container={getContainer()}\n content={\n <TooltipContainer>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral700\">\n {i18n.t(\n \"Enabling the 'Infinite approval' mode grants unrestricted access to smart contracts of DEXes/Bridges, allowing them to utilize the approved token amount without limitations.\"\n )}\n </Typography>\n </TooltipContainer>\n }>\n <InfoIcon color=\"gray\" />\n </Tooltip>\n </>\n ),\n start: <InfinityIcon color=\"gray\" size={16} />,\n end: <Switch checked={infiniteApprove} />,\n onClick: toggleInfiniteApprove,\n };\n\n const themeItem = {\n id: 'theme-item',\n type: <ListItem />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Theme')}\n </Typography>\n ),\n end: (\n <ThemeSection>\n <Tabs\n container={getContainer()}\n items={themesList}\n value={theme}\n onChange={(item) => setTheme(item.id as ThemeMode)}\n type=\"primary\"\n borderRadius=\"small\"\n />\n </ThemeSection>\n ),\n start: getThemeIcon(theme),\n };\n\n const settingItems: ListPropTypes['items'] = isLiquidityHidden\n ? []\n : [bridgeItem, exchangeItem];\n if (!isCustomTokensHidden) {\n settingItems.push(customTokensItem);\n }\n if (!isLanguageHidden) {\n settingItems.push(languageItem);\n }\n settingItems.push(infiniteApprovalItem);\n\n if (!themeConfig?.singleTheme && !isThemeHidden) {\n settingItems.push(themeItem);\n }\n\n return (\n <List\n type={<ListItemButton hasDivider id=\"_\" onClick={() => console.log()} />}\n items={settingItems}\n />\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { cancelSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { Alert } from '@rango-dev/ui';\nimport React from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { SwapDetails } from '../components/SwapDetails';\nimport { SwapDetailsPlaceholder } from '../components/SwapDetails/SwapDetails.Placeholder';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { getPendingSwaps } from '../utils/queue';\n\nexport function SwapDetailsPage() {\n const { manager, state } = useManager();\n const loading = !state.loadedFromPersistor;\n const pendingSwaps = getPendingSwaps(manager);\n const { requestId } = useParams<{ requestId: string }>();\n const navigateBack = useNavigateBack();\n const { fetchStatus: fetchMetaStatus } = useAppStore();\n\n if (!requestId) {\n return (\n <Alert\n containerStyles={{ margin: '20px' }}\n type=\"error\"\n title={i18n.t(\n 'The request ID is necessary to display the swap details.'\n )}\n />\n );\n }\n\n const showSkeleton = loading || fetchMetaStatus === 'loading';\n\n const selectedSwap = requestId\n ? pendingSwaps.find(({ swap }) => swap.requestId === requestId)\n : undefined;\n\n const onCancel = () => {\n if (selectedSwap?.id) {\n const swap = manager?.get(selectedSwap.id);\n if (swap) {\n cancelSwap(swap);\n }\n }\n };\n\n const onDelete = async () => {\n if (selectedSwap?.id) {\n try {\n manager?.deleteQueue(selectedSwap.id);\n navigateBack();\n } catch (e) {\n console.log(e);\n }\n }\n };\n const swap = selectedSwap?.swap;\n\n if (!swap || showSkeleton) {\n return (\n <SwapDetailsPlaceholder\n requestId={requestId}\n showSkeleton={showSkeleton}\n />\n );\n }\n\n return (\n <SwapDetails\n swap={swap}\n requestId={requestId}\n onCancel={onCancel}\n onDelete={onDelete}\n />\n );\n}\n", "import type { SwapDetailsProps } from './SwapDetails.types';\nimport type { ModalState } from '../SwapDetailsModal';\n\nimport { i18n } from '@lingui/core';\nimport {\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n Button,\n CopyIcon,\n Divider,\n DoneIcon,\n IconButton,\n QuoteCost,\n RangoExplorerIcon,\n StepDetails,\n Tooltip,\n Typography,\n useCopyToClipboard,\n} from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport BigNumber from 'bignumber.js';\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { SCANNER_BASE_URL } from '../../constants';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useQuoteStore } from '../../store/quote';\nimport { useUiStore } from '../../store/ui';\nimport { getContainer } from '../../utils/common';\nimport {\n numberToString,\n roundedSecondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport {\n createRetryQuote,\n getPriceImpact,\n getPriceImpactLevel,\n} from '../../utils/quote';\nimport {\n getLastConvertedTokenInFailedSwap,\n getSwapMessages,\n shouldRetrySwap,\n} from '../../utils/swap';\nimport { getSwapDate } from '../../utils/time';\nimport { getConciseAddress } from '../../utils/wallets';\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout, PageContainer } from '../Layout';\nimport { QuoteSummary } from '../Quote';\nimport {\n SwapDetailsCompleteModal,\n SwapDetailsModal,\n} from '../SwapDetailsModal';\n\nimport { getSteps, getStepState, RESET_INTERVAL } from './SwapDetails.helpers';\nimport {\n ErrorMessages,\n HeaderDetails,\n MessageText,\n outputStyles,\n requestIdStyles,\n rowStyles,\n StepsList,\n StyledLink,\n titleStepsStyles,\n} from './SwapDetails.styles';\n\nexport function SwapDetails(props: SwapDetailsProps) {\n const { swap, requestId, onDelete, onCancel: onCancelProps } = props;\n const { canSwitchNetworkTo, connect, getWalletInfo } = useWallets();\n const blockchains = useAppStore().blockchains();\n const swappers = useAppStore().swappers();\n const { findToken } = useAppStore();\n const retry = useQuoteStore.use.retry();\n const isActiveTab = useUiStore.use.isActiveTab();\n const navigate = useNavigate();\n const [isCopied, handleCopy] = useCopyToClipboard(RESET_INTERVAL);\n const listRef = useRef<HTMLDivElement | null>(null);\n const [modalState, setModalState] = useState<ModalState>(null);\n const [showCompletedModal, setShowCompletedModal] = useState<\n 'success' | 'failed' | null\n >(null);\n\n const onCancel = () => {\n onCancelProps();\n setModalState(null);\n };\n\n const getNotifications = useNotificationStore.use.getNotifications();\n const removeNotification = useNotificationStore.use.removeNotification();\n const notifications = getNotifications();\n const currentStep = getCurrentStep(swap);\n const currentStepNetworkStatus = currentStep?.networkStatus;\n\n useEffect(() => {\n const existNotification = notifications.find(\n (n) => n.requestId === swap.requestId\n );\n if (existNotification) {\n if (swap.status === 'success' || swap.status === 'failed') {\n setShowCompletedModal(swap.status);\n removeNotification(swap.requestId);\n } else if (showCompletedModal) {\n setShowCompletedModal(null);\n }\n }\n }, [swap.status, swap.requestId]);\n\n useEffect(() => {\n if (showSwitchNetwork) {\n setModalState(PendingSwapNetworkStatus.WaitingForNetworkChange);\n } else if (\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n currentStepNetworkStatus === PendingSwapNetworkStatus.NetworkChanged\n ) {\n setModalState(currentStepNetworkStatus);\n } else {\n setModalState(null);\n }\n }, [currentStepNetworkStatus]);\n\n const lastConvertedTokenInFailedSwap =\n getLastConvertedTokenInFailedSwap(swap);\n\n const currentStepBlockchain = currentStep\n ? getCurrentBlockchainOfOrNull(swap, currentStep)\n : null;\n const currentStepWallet = currentStep\n ? getRelatedWalletOrNull(swap, currentStep)\n : null;\n\n const swapDate = getSwapDate(swap);\n const shouldRetry = shouldRetrySwap(swap);\n\n const isMobileWallet = (walletType: string): boolean =>\n !!getWalletInfo(walletType)?.mobileWallet;\n\n const showSwitchNetwork =\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.WaitingForNetworkChange &&\n !!currentStepBlockchain &&\n !!currentStepWallet?.walletType &&\n (isMobileWallet(currentStepWallet.walletType) ||\n canSwitchNetworkTo(currentStepWallet.walletType, currentStepBlockchain));\n\n const switchNetwork = showSwitchNetwork\n ? connect.bind(null, currentStepWallet.walletType, currentStepBlockchain)\n : undefined;\n\n const stepMessage = getSwapMessages(swap, currentStep);\n const steps = getSteps({\n swap,\n switchNetwork,\n showNetworkModal: currentStepNetworkStatus,\n setNetworkModal: setModalState,\n message: stepMessage,\n blockchains: blockchains,\n swappers,\n });\n const numberOfSteps = steps.length;\n const [firstStep, lastStep] = [swap.steps[0], swap.steps[numberOfSteps - 1]];\n const outputAmount =\n lastStep.outputAmount || lastStep.expectedOutputAmountHumanReadable;\n\n const totalFee = swap.steps.reduce(\n (totalFee, steps) => totalFee + parseFloat(steps.feeInUsd || ''),\n 0\n );\n\n const diagnosisUrl = swap.steps.find(\n (step) => step.diagnosisUrl\n )?.diagnosisUrl;\n\n const outputUsdValue = numberToString(\n parseFloat(outputAmount || '0') * (lastStep.toUsdPrice || 0),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const inputUsdValue = numberToString(\n parseFloat(swap.inputAmount) * (firstStep.fromUsdPrice || 0),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const realOutputUsdValue = outputAmount\n ? new BigNumber(outputAmount)\n .multipliedBy(lastStep.toUsdPrice || 0)\n .toString()\n : '';\n\n const realInputUsdValue = new BigNumber(swap.inputAmount)\n .multipliedBy(firstStep.fromUsdPrice || 0)\n .toString();\n\n const percentageChange = getPriceImpact(inputUsdValue, outputUsdValue);\n\n const stepDetailMessage =\n stepMessage.detailedMessage.content || stepMessage.shortMessage;\n\n const completeModalDesc =\n swap.status === 'success' ? (\n i18n.t({\n id: 'You have received {amount} {token} in {conciseAddress} wallet on {chain} chain.',\n values: {\n amount: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n token: steps[numberOfSteps - 1].to.token.displayName,\n conciseAddress: getConciseAddress(\n swap.wallets[steps[numberOfSteps - 1].to.chain.displayName]\n ?.address || ''\n ),\n chain: steps[numberOfSteps - 1].to.chain.displayName,\n },\n })\n ) : (\n <ErrorMessages>\n <Typography\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\"\n align=\"center\">\n {!stepDetailMessage ? i18n.t('Transaction was not sent.') : ''}\n {lastConvertedTokenInFailedSwap\n ? `${i18n.t({\n id: '{amount} {symbol} on {blockchain} remain in your wallet',\n values: {\n amount: lastConvertedTokenInFailedSwap.outputAmount,\n symbol: lastConvertedTokenInFailedSwap.symbol,\n blockchain: lastConvertedTokenInFailedSwap.blockchain,\n },\n })}`\n : ''}\n </Typography>\n {stepDetailMessage && (\n <MessageText\n align=\"center\"\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\">\n <b>Reason:</b> {stepDetailMessage}\n </MessageText>\n )}\n </ErrorMessages>\n );\n\n return (\n <Layout\n header={{\n title: i18n.t('Swap Details'),\n onCancel:\n swap.status === 'running' ? () => setModalState('cancel') : undefined,\n suffix: swap.status !== 'running' && (\n <SuffixContainer>\n <Button\n variant=\"ghost\"\n type=\"error\"\n size=\"xsmall\"\n onClick={() => setModalState('delete')}>\n <Typography size=\"medium\" variant=\"label\" color=\"error\">\n {i18n.t('Delete')}\n </Typography>\n </Button>\n </SuffixContainer>\n ),\n }}\n footer={\n shouldRetry &&\n !showCompletedModal && (\n <Button\n fullWidth\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => {\n const swapInput = createRetryQuote(swap, blockchains, findToken);\n retry(swapInput);\n setTimeout(() => {\n const home = '../../';\n navigate(home);\n }, 0);\n }}>\n {i18n.t('Try again')}\n </Button>\n )\n }>\n <PageContainer compact view>\n <HeaderDetails>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className={requestIdStyles()}>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {requestId}\n </Typography>\n <Tooltip\n container={getContainer()}\n content={\n isCopied\n ? i18n.t('Copied To Clipboard')\n : i18n.t('Copy Request ID')\n }\n open={isCopied || undefined}\n side=\"bottom\"\n alignOffset={-16}\n align=\"end\">\n <IconButton\n variant=\"ghost\"\n onClick={handleCopy.bind(null, requestId || '')}>\n {isCopied ? (\n <DoneIcon size={16} color=\"secondary\" />\n ) : (\n <CopyIcon size={16} color=\"gray\" />\n )}\n </IconButton>\n </Tooltip>\n\n <StyledLink\n target=\"_blank\"\n href={`${SCANNER_BASE_URL}/swap/${requestId}`}>\n <Tooltip\n container={getContainer()}\n content={i18n.t('View on Rango Explorer')}\n side=\"bottom\">\n <RangoExplorerIcon size={20} />\n </Tooltip>\n </StyledLink>\n </div>\n </div>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {swap.finishTime ? i18n.t('Finished at') : i18n.t('Created at')}\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {swapDate}\n </Typography>\n </div>\n </HeaderDetails>\n\n <div className={outputStyles()}>\n <QuoteCost\n fee={numberToString(\n String(totalFee),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n time={roundedSecondsToString(totalArrivalTime(swap.steps))}\n steps={numberOfSteps}\n />\n <QuoteSummary\n from={{\n price: {\n value: numberToString(\n swap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: inputUsdValue,\n realUsdValue: realInputUsdValue,\n realValue: swap.inputAmount,\n },\n token: {\n displayName: steps[0].from.token.displayName,\n image: steps[0].from.token.image,\n },\n chain: {\n image: steps[0].from.chain.image,\n displayName: steps[0].from.chain.displayName,\n },\n }}\n to={{\n price: {\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: outputUsdValue,\n realUsdValue: realOutputUsdValue,\n realValue: outputAmount || '',\n },\n token: {\n displayName: steps[numberOfSteps - 1].to.token.displayName,\n image: steps[numberOfSteps - 1].to.token.image,\n },\n chain: {\n image: steps[numberOfSteps - 1].to.chain.image,\n displayName: steps[numberOfSteps - 1].to.chain.displayName,\n },\n }}\n percentageChange={numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n warningLevel={getPriceImpactLevel(percentageChange ?? 0)}\n />\n </div>\n <div className={titleStepsStyles()}>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n <Divider size={8} />\n <StepsList ref={listRef}>\n {steps.map((step, index) => {\n const key = index;\n const state = getStepState(swap.steps[index]);\n const isFocused =\n state === 'error' ||\n state === 'in-progress' ||\n state === 'warning' ||\n (state === 'completed' && index === steps.length - 1);\n return (\n <StepDetails\n key={key}\n step={step}\n type=\"swap-progress\"\n ref={listRef}\n state={state}\n hasSeparator={index !== 0}\n tabIndex={key}\n isFocused={isFocused}\n tooltipContainer={getContainer()}\n />\n );\n })}\n </StepsList>\n </PageContainer>\n\n <SwapDetailsModal\n state={modalState}\n onClose={() => setModalState(null)}\n onCancel={onCancel}\n onDelete={onDelete}\n message={stepMessage.detailedMessage.content}\n currentStepWallet={currentStepWallet}\n walletButtonDisabled={!isActiveTab}\n />\n <SwapDetailsCompleteModal\n open={!!showCompletedModal}\n diagnosisUrl={diagnosisUrl}\n onClose={() => setShowCompletedModal(null)}\n status={swap.status === 'success' ? 'success' : 'failed'}\n priceValue={numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )}\n usdValue={outputUsdValue}\n realUsdValue={realOutputUsdValue}\n realValue={outputAmount || ''}\n percentageChange={numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n token={{\n displayName: steps[numberOfSteps - 1].to.token.displayName,\n image: steps[numberOfSteps - 1].to.token.image,\n }}\n chain={{ image: steps[numberOfSteps - 1].to.chain.image }}\n description={completeModalDesc}\n />\n </Layout>\n );\n}\n", "import type { PendingSwap } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\n\nconst daysOfWeek = [\n i18n.t('Sunday'),\n i18n.t('Monday'),\n i18n.t('Tuesday'),\n i18n.t('Wednesday'),\n i18n.t('Thursday'),\n i18n.t('Friday'),\n i18n.t('Saturday'),\n];\n\nexport function timeSince(millisecond: number) {\n const date = new Date(millisecond);\n const day = date.getDate();\n const month = date.toLocaleString('default', { month: 'long' });\n const year = date.getFullYear();\n const isToday = date.getDay() === new Date().getDay();\n const formattedDate = isToday\n ? i18n.t('Today')\n : `${daysOfWeek[date.getDay()]} ${day} ${month} ${year}`;\n\n return `${formattedDate}, ${new Date(millisecond).toLocaleTimeString()}`;\n}\n\nexport function getSwapDate(pendingSwap: PendingSwap) {\n const time = pendingSwap.finishTime\n ? timeSince(parseInt(pendingSwap.finishTime))\n : timeSince(parseInt(pendingSwap.creationTime));\n return time;\n}\n", "import type { ModalPropTypes } from './SwapDetailsModal.types';\n\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { CancelContent } from './SwapDetailsModal.Cancel';\nimport { DeleteContent } from './SwapDetailsModal.Delete';\nimport { modalNetworkValues } from './SwapDetailsModal.helpers';\nimport { WalletStateContent } from './SwapDetailsModal.WalletState';\n\nexport function SwapDetailsModal(props: ModalPropTypes) {\n const {\n state,\n onClose,\n onDelete,\n onCancel,\n currentStepWallet,\n message,\n walletButtonDisabled,\n } = props;\n\n const showWalletStateContent =\n state === PendingSwapNetworkStatus.WaitingForNetworkChange ||\n state === PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n state === PendingSwapNetworkStatus.NetworkChanged;\n\n return (\n <WatermarkedModal\n open={!!state}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n {showWalletStateContent && (\n <WalletStateContent\n type={modalNetworkValues[state].type}\n title={modalNetworkValues[state].title}\n currentStepWallet={currentStepWallet}\n message={message}\n walletButtonDisabled={walletButtonDisabled}\n showWalletButton={\n state !== PendingSwapNetworkStatus.WaitingForNetworkChange\n }\n />\n )}\n {state === 'delete' && (\n <DeleteContent onClose={onClose} onDelete={onDelete} />\n )}\n {state === 'cancel' && (\n <CancelContent onClose={onClose} onCancel={onCancel} />\n )}\n </WatermarkedModal>\n );\n}\n", "import type { CancelContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const CancelContent = ({ onCancel, onClose }: CancelContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Cancel Swap')}\n description={i18n.t('Are you sure you want to cancel this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onCancel}>\n {i18n.t('Yes, Cancel it')}\n </Button>\n <Divider size={12} />\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n {i18n.t('No, Continue')}\n </Button>\n </>\n );\n};\n", "import type { DeleteContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const DeleteContent = ({ onDelete, onClose }: DeleteContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Delete Transaction')}\n description={i18n.t('Are you sure you want to delete this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onDelete}>\n {i18n.t('Yes, Delete it')}\n </Button>\n <Divider size={12} />\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('No, Cancel')}\n </Typography>\n </Button>\n </>\n );\n};\n", "import type { ModalNetworkValueTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nexport const modalNetworkValues: Record<\n Exclude<PendingSwapNetworkStatus, PendingSwapNetworkStatus.WaitingForQueue>,\n ModalNetworkValueTypes\n> = {\n [PendingSwapNetworkStatus.WaitingForNetworkChange]: {\n type: 'loading',\n title: i18n.t('Change Network'),\n },\n [PendingSwapNetworkStatus.WaitingForConnectingWallet]: {\n type: 'warning',\n title: i18n.t('Connect Wallet'),\n },\n [PendingSwapNetworkStatus.NetworkChanged]: {\n type: 'success',\n title: i18n.t('Network Changed'),\n },\n};\n", "import type { WalletStateContentProps } from './SwapDetailsModal.types';\nimport type { WalletInfoWithExtra } from '../../types';\n\nimport { warn } from '@rango-dev/logging-core';\nimport { MessageBox, Wallet } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React, { useState } from 'react';\n\nimport { useWalletList } from '../../hooks/useWalletList';\nimport { getContainer } from '../../utils/common';\nimport { mapStatusToWalletState } from '../../utils/wallets';\nimport { StatefulConnectModal } from '../StatefulConnectModal';\n\nimport { WalletContainer } from './SwapDetailsModal.styles';\n\nexport const WalletStateContent = (props: WalletStateContentProps) => {\n const {\n type,\n title,\n currentStepWallet,\n message,\n showWalletButton,\n walletButtonDisabled,\n } = props;\n const [selectedWalletToConnect, setSelectedWalletToConnect] =\n useState<WalletInfoWithExtra>();\n const { getWalletInfo, state } = useWallets();\n const walletType = currentStepWallet?.walletType;\n const walletState = walletType\n ? mapStatusToWalletState(state(walletType))\n : null;\n const walletInfo = walletType ? getWalletInfo(walletType) : null;\n const shouldShowWallet =\n showWalletButton && !!walletType && !!walletState && !!walletInfo;\n const { list } = useWalletList();\n\n const handleWalletItemClick = () => {\n if (!!walletType) {\n const wallet = list.find((wallet) => wallet.type === walletType);\n\n if (wallet) {\n setSelectedWalletToConnect(wallet);\n } else {\n warn(\n new Error(\n `It seems requested wallet to be connected is not available in the list. requested wallet: ${wallet}`\n )\n );\n }\n }\n };\n\n return (\n <>\n <MessageBox type={type} title={title} description={message} />\n {shouldShowWallet && (\n <WalletContainer>\n <Wallet\n container={getContainer()}\n title={walletInfo.name}\n image={walletInfo.img}\n type={walletType}\n state={walletState}\n link={walletInfo.installLink}\n disabled={walletButtonDisabled}\n // TODO we need to show an error modal when user reject the connection\n onClick={handleWalletItemClick}\n />\n </WalletContainer>\n )}\n <StatefulConnectModal\n wallet={selectedWalletToConnect}\n onClose={() => {\n setSelectedWalletToConnect(undefined);\n }}\n />\n </>\n );\n};\n", "import { styled } from '@rango-dev/ui';\n\nexport const WalletContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n});\n\nexport const TooltipErrorContent = styled('div', {\n maxWidth: 280,\n '& ._typography': {\n wordWrap: 'break-word',\n display: 'block',\n },\n});\n", "import type { CompleteModalPropTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n TokenAmount,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nexport function SwapDetailsCompleteModal(props: CompleteModalPropTypes) {\n const {\n open,\n onClose,\n status,\n priceValue,\n usdValue,\n realUsdValue,\n realValue,\n token,\n chain,\n percentageChange,\n description,\n diagnosisUrl,\n } = props;\n const navigate = useNavigate();\n\n return (\n <WatermarkedModal\n open={open}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n {status === 'success' ? (\n <MessageBox type=\"success\" title={i18n.t('Swap Successful')}>\n <TokenAmount\n direction=\"vertical\"\n tooltipContainer={getContainer()}\n type=\"output\"\n centerAlign={true}\n price={{\n value: priceValue,\n usdValue,\n realUsdValue,\n realValue,\n }}\n token={token}\n chain={chain}\n percentageChange={percentageChange}\n />\n <Divider size={12} />\n <Typography\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\"\n align=\"center\">\n {description}\n </Typography>\n </MessageBox>\n ) : (\n <MessageBox\n type=\"error\"\n title={i18n.t('Transaction Failed')}\n description={description}\n />\n )}\n <Divider size={32} />\n {status === 'success' && (\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => {\n const home = '../../';\n navigate(home);\n }}>\n <Typography variant=\"title\" size=\"medium\" color=\"neutral100\">\n {i18n.t('Done')}\n </Typography>\n </Button>\n )}\n <Divider size={12} />\n {diagnosisUrl && (\n <>\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => window.open(diagnosisUrl, '_blank')}>\n {i18n.t('Diagnosis')}\n </Button>\n <Divider size={12} />\n </>\n )}\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('See Details')}\n </Typography>\n </Button>\n </WatermarkedModal>\n );\n}\n", "import type { GetStep } from '../SwapDetailsAlerts';\nimport type { Step, StepDetailsProps } from '@rango-dev/ui';\nimport type { PendingSwapStep, SwapperType } from 'rango-types';\n\nimport React from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport { numberToString } from '../../utils/numbers';\nimport { isNetworkStatusInWarningState } from '../../utils/swap';\nimport { SwapDetailsAlerts } from '../SwapDetailsAlerts';\n\nexport const RESET_INTERVAL = 2_000;\nexport const SECONDS = 60;\n\nexport const getSteps = ({\n swap,\n blockchains,\n swappers,\n ...args\n}: GetStep): Step[] => {\n const hasAlreadyProceededToSign = swap.hasAlreadyProceededToSign !== false;\n return swap.steps.map((step, index) => {\n const amountToConvert =\n index === 0\n ? swap.inputAmount\n : swap.steps[index - 1].outputAmount ||\n swap.steps[index - 1].expectedOutputAmountHumanReadable;\n return {\n from: {\n token: { displayName: step.fromSymbol, image: step.fromLogo ?? '' },\n chain: {\n displayName:\n getBlockchainShortNameFor(step.fromBlockchain, blockchains) ?? '',\n image: step.fromBlockchainLogo ?? '',\n },\n price: {\n value: numberToString(\n amountToConvert,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realValue: amountToConvert ?? '',\n },\n },\n to: {\n token: { displayName: step.toSymbol, image: step.toLogo },\n chain: {\n displayName:\n getBlockchainShortNameFor(step.toBlockchain, blockchains) ?? '',\n image: step.toBlockchainLogo ?? '',\n },\n price: {\n value: numberToString(\n step.outputAmount || step.expectedOutputAmountHumanReadable,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realValue:\n step.outputAmount || step.expectedOutputAmountHumanReadable || '',\n },\n },\n swapper: {\n displayName: getSwapperDisplayName(step.swapperId, swappers) ?? '',\n image: step.swapperLogo ?? '',\n type: step.swapperType as SwapperType,\n },\n internalSwaps: step.internalSwaps\n ? step.internalSwaps.map((internalSwap) => {\n return {\n from: {\n chain: {\n displayName:\n getBlockchainShortNameFor(\n internalSwap.fromBlockchain,\n blockchains\n ) ?? '',\n image: internalSwap.fromBlockchainLogo ?? '',\n },\n },\n to: {\n chain: {\n displayName:\n getBlockchainShortNameFor(\n internalSwap.toBlockchain,\n blockchains\n ) ?? '',\n image: internalSwap.toBlockchainLogo ?? '',\n },\n },\n swapper: {\n displayName:\n getSwapperDisplayName(internalSwap.swapperId, swappers) ?? '',\n image: internalSwap.swapperLogo ?? '',\n type: internalSwap.swapperType as SwapperType,\n },\n };\n })\n : [],\n alerts: (\n <SwapDetailsAlerts\n step={step}\n hasAlreadyProceededToSign={hasAlreadyProceededToSign}\n {...args}\n />\n ),\n };\n });\n};\n\nexport function getStepState(step: PendingSwapStep): StepDetailsProps['state'] {\n if (\n isNetworkStatusInWarningState(step) &&\n step.status !== 'failed' &&\n step.status !== 'success'\n ) {\n return 'warning';\n }\n\n switch (step.status) {\n case 'created':\n return 'default';\n case 'approved':\n case 'waitingForApproval':\n case 'running':\n return 'in-progress';\n case 'failed':\n return 'error';\n case 'success':\n return 'completed';\n }\n}\n", "import type { SwapAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, IconButton, LinkIcon } from '@rango-dev/ui';\nimport React, { Fragment } from 'react';\n\nimport { isNetworkStatusInWarningState } from '../../utils/swap';\n\nimport { FailedAlert } from './SwapDetailsAlerts.Failed';\nimport { Alerts } from './SwapDetailsAlerts.styles';\nimport { WarningAlert } from './SwapDetailsAlerts.Warning';\n\nexport function SwapDetailsAlerts(props: SwapAlertsProps) {\n const {\n switchNetwork,\n showNetworkModal,\n setNetworkModal,\n message,\n step,\n hasAlreadyProceededToSign,\n } = props;\n\n const hasWarning = isNetworkStatusInWarningState(step);\n const waitingForApproval =\n step.status === 'waitingForApproval' && !hasWarning;\n const inProgress = step.status === 'running' && !hasWarning;\n const waitingProgress =\n (inProgress && !hasAlreadyProceededToSign) ||\n (waitingForApproval && !step.explorerUrl?.length);\n\n return (\n <Alerts>\n {step.explorerUrl?.map((explorerUrl, index, urls) => {\n const key = index + explorerUrl.url;\n const lastUrl = index === urls.length - 1;\n const loading =\n ((lastUrl && inProgress) || waitingForApproval) && !waitingProgress;\n const error = lastUrl && step.status === 'failed';\n\n return (\n <Fragment key={key}>\n <Alert\n type={\n lastUrl\n ? (loading && 'loading') || (error && 'error') || 'success'\n : 'success'\n }\n title={\n !explorerUrl.description\n ? i18n.t('View transaction')\n : `${explorerUrl.description} Tx`\n }\n action={\n explorerUrl.url && (\n <IconButton\n variant=\"ghost\"\n size=\"xsmall\"\n onClick={() => window.open(explorerUrl.url, '_blank')}>\n <LinkIcon size={12} />\n </IconButton>\n )\n }\n />\n </Fragment>\n );\n })}\n {waitingProgress && <Alert type=\"loading\" title={message.shortMessage} />}\n {step.status !== 'failed' && hasWarning && (\n <WarningAlert\n switchNetwork={switchNetwork}\n showNetworkModal={showNetworkModal}\n setNetworkModal={setNetworkModal}\n message={message}\n />\n )}\n\n {step.status === 'failed' && <FailedAlert message={message} />}\n </Alerts>\n );\n}\n", "import type { FailedAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { Alert, ChevronDownIcon, IconButton } from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { MessageText } from '../SwapDetails/SwapDetails.styles';\n\nimport { ActionIcon, AlertFooter } from './SwapDetailsAlerts.styles';\n\nexport function FailedAlert(props: FailedAlertsProps) {\n const { message } = props;\n const [showContentError, setShowContentError] = useState(false);\n\n return (\n <Alert\n type=\"error\"\n title={message.shortMessage}\n containerStyles={{\n '& .footer': {\n paddingTop: '$0',\n },\n }}\n action={\n message.detailedMessage.content && (\n <IconButton\n onClick={() => setShowContentError((prev) => !prev)}\n variant=\"ghost\"\n size=\"xsmall\">\n <ActionIcon rotated={showContentError}>\n <ChevronDownIcon size={12} color=\"gray\" />\n </ActionIcon>\n </IconButton>\n )\n }\n footer={\n <AlertFooter open={showContentError}>\n <MessageText variant=\"body\" size=\"xsmall\" color=\"neutral700\">\n {message.detailedMessage.content}\n </MessageText>\n </AlertFooter>\n }\n />\n );\n}\n", "import { css, darkTheme, styled, Typography } from '@rango-dev/ui';\n\nimport { ScrollableArea } from '../Layout';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n overflow: 'hidden',\n});\n\nexport const HeaderDetails = styled('div', {\n width: '100%',\n '& ._icon-button': {\n '&:hover': {\n '& svg': {\n color: '$secondary550',\n [`.${darkTheme} &`]: {\n color: '$secondary500',\n },\n },\n },\n },\n});\n\nexport const StepsList = styled(ScrollableArea, {\n padding: '$0 $20 $20 $20',\n});\n\nexport const Alerts = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$10',\n});\n\nexport const PlaceholderContainer = styled('div', {\n height: '450px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const LoaderContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n width: '100%',\n paddingTop: '33%',\n flex: 1,\n});\n\nexport const rowStyles = css({\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$10 $20',\n borderBottom: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n color: '$neutral500',\n});\n\nexport const datePlaceholderStyles = css({\n padding: '$5 0',\n});\n\nexport const requestIdStyles = css({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '$24',\n});\n\nexport const outputStyles = css({\n display: 'flex',\n width: '100%',\n padding: '$15 $20 $20',\n flexDirection: 'column',\n alignItems: 'start',\n});\n\nexport const titleStepsStyles = css({\n width: '100%',\n padding: '0 $20 $10',\n});\n\nexport const StyledLink = styled('a', {\n fontSize: '$16',\n fontWeight: '$400',\n color: '$neutral700',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const ErrorMessages = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$5',\n});\nexport const MessageText = styled(Typography, {\n wordBreak: 'break-word',\n});\n", "import { styled } from '@rango-dev/ui';\n\nexport const Alerts = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$10',\n});\n\nexport const ActionIcon = styled('div', {\n transition: 'transform 0.3s ease-in-out',\n variants: {\n rotated: {\n true: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n\nexport const AlertFooter = styled('div', {\n transition: 'max-height 0.3s ease-in-out',\n maxHeight: '0px',\n overflow: 'hidden',\n variants: {\n open: {\n true: {\n maxHeight: '200px',\n },\n },\n },\n});\n", "import type { WaningAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button } from '@rango-dev/ui';\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React from 'react';\n\nexport function WarningAlert(props: WaningAlertsProps) {\n const { switchNetwork, setNetworkModal, message, showNetworkModal } = props;\n if (!!switchNetwork) {\n return (\n <Alert\n type=\"warning\"\n title={message.shortMessage}\n action={\n <Button\n size=\"xxsmall\"\n type=\"warning\"\n onClick={() => {\n setNetworkModal(PendingSwapNetworkStatus.WaitingForNetworkChange);\n switchNetwork().catch((e) => {\n console.log(e);\n });\n }}>\n {i18n.t('Change')}\n </Button>\n }\n />\n );\n }\n if (\n showNetworkModal === PendingSwapNetworkStatus.WaitingForConnectingWallet\n ) {\n return (\n <Alert\n type=\"warning\"\n title={message.shortMessage}\n action={\n <Button\n size=\"xxsmall\"\n type=\"warning\"\n onClick={() => {\n setNetworkModal(\n PendingSwapNetworkStatus.WaitingForConnectingWallet\n );\n }}>\n {i18n.t('Connect')}\n </Button>\n }\n />\n );\n }\n\n return <Alert type=\"warning\" title={message.shortMessage} />;\n}\n", "import type { SwapDetailsPlaceholderPropTypes } from './SwapDetails.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, NotFound, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../Layout';\nimport { LoadingSwapDetails } from '../LoadingSwapDetails';\n\nimport {\n Container,\n datePlaceholderStyles,\n HeaderDetails,\n PlaceholderContainer,\n requestIdStyles,\n rowStyles,\n} from './SwapDetails.styles';\n\nexport function SwapDetailsPlaceholder(props: SwapDetailsPlaceholderPropTypes) {\n const { requestId, showSkeleton } = props;\n return (\n <Layout\n header={{\n title: i18n.t('Swap Details'),\n suffix: <SuffixContainer />,\n }}>\n {showSkeleton && (\n <Container>\n <HeaderDetails>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className={requestIdStyles()}>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton width={16} height={16} variant=\"rectangular\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton width={16} height={16} variant=\"rectangular\" />\n </div>\n </div>\n <div className={rowStyles()}>\n <Typography\n className={datePlaceholderStyles()}\n variant=\"label\"\n size=\"large\"\n color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n </div>\n </HeaderDetails>\n <LoadingSwapDetails />\n </Container>\n )}\n {!showSkeleton && (\n <PlaceholderContainer>\n <NotFound\n title={i18n.t('Not found')}\n description={i18n.t({\n id: 'Swap with request ID = {requestId} not found.',\n values: { requestId },\n })}\n />\n </PlaceholderContainer>\n )}\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { Divider, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteSummarySkeleton, StepSkeleton } from '../QuoteSkeleton';\n\nimport {\n Container,\n extraInfoStyles,\n StepContainer,\n StepSeparator,\n} from './LoadingSwapDetails.styles';\n\nexport function LoadingSwapDetails() {\n return (\n <Container>\n <QuoteSummarySkeleton type=\"swap-preview\" />\n <div className=\"swaps-steps\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n\n <>\n <StepContainer>\n <StepSkeleton separator={false} />\n <div className={extraInfoStyles()}>\n <Divider direction=\"horizontal\" size={20} />\n <Skeleton height={22} variant=\"rectangular\" />\n </div>\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n </>\n </Container>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n width: '100%',\n height: '100%',\n padding: '$10 $20',\n});\n\nexport const StepContainer = styled('div', {\n backgroundColor: '$neutral100',\n borderRadius: '$xm',\n padding: '$10 $15',\n});\n\nexport const StepSeparator = styled('div', {\n width: '0px',\n height: '$20',\n borderLeft: '1px dashed $neutral700',\n marginLeft: '25px',\n});\n\nexport const quoteSummaryItemStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const tokenAmountStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const costStyles = css({\n paddingTop: '$15',\n display: 'flex',\n});\n\nexport const quoteSummaryStyles = css({\n padding: '$15 $0',\n});\n\nexport const quoteSummarySeparatorStyles = css({\n width: '0px',\n height: '$16',\n borderLeft: '1px solid $neutral400',\n marginLeft: '13px',\n});\n\nexport const swapsStepsStyles = css({\n paddingBottom: '$10',\n});\n\nexport const stepTitleStyles = css({\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n});\n\nexport const stepTokensStyles = css({\n paddingTop: '$5',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const stepInfoStyles = css({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const stepIconStyles = css({\n padding: '$4 $6',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const extraInfoStyles = css({\n display: 'flex',\n paddingTop: '$10',\n paddingBottom: '$5',\n});\n", "import type { WalletInfoWithExtra } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n getCategoriesCount,\n SelectableCategoryList,\n styled,\n Typography,\n Wallet,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { StatefulConnectModal } from '../components/StatefulConnectModal';\nimport { useWalletList } from '../hooks/useWalletList';\nimport { useAppStore } from '../store/AppStore';\nimport { useUiStore } from '../store/ui';\nimport { getContainer, isSingleWalletActive } from '../utils/common';\nimport {\n filterBlockchainsByWalletTypes,\n filterWalletsByCategory,\n} from '../utils/wallets';\n\nconst ListContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n});\n\nconst Container = styled(PageContainer, {\n textAlign: 'center',\n});\n\nexport function WalletsPage() {\n const { fetchStatus: fetchMetaStatus } = useAppStore();\n const [blockchainCategory, setBlockchainCategory] = useState<string>('ALL');\n const blockchains = useAppStore().blockchains();\n const { config } = useAppStore();\n\n const [selectedWalletToConnect, setSelectedWalletToConnect] =\n useState<WalletInfoWithExtra>();\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const { list } = useWalletList();\n\n const filteredBlockchains = filterBlockchainsByWalletTypes(list, blockchains);\n const activeCategoriesCount = getCategoriesCount(filteredBlockchains);\n const showCategory = activeCategoriesCount !== 1;\n\n const filteredWallets = filterWalletsByCategory(list, blockchainCategory);\n\n const handleWalletItemClick = (wallet: WalletInfoWithExtra) => {\n if (isSingleWalletActive(list, config.multiWallets)) {\n return;\n }\n\n setSelectedWalletToConnect(wallet);\n };\n\n return (\n <Layout\n header={{\n title: i18n.t('Connect Wallets'),\n }}>\n <Container>\n {showCategory && (\n <>\n <SelectableCategoryList\n setCategory={setBlockchainCategory}\n category={blockchainCategory}\n blockchains={filteredBlockchains}\n isLoading={fetchMetaStatus === 'loading'}\n />\n <Divider size={24} />\n </>\n )}\n <Typography variant=\"title\" size=\"xmedium\" align=\"center\">\n {i18n.t('Choose a wallet to connect.')}\n </Typography>\n <ListContainer>\n {filteredWallets.map((wallet, index) => {\n const key = `wallet-${index}-${wallet.type}`;\n return (\n <Wallet\n key={key}\n {...wallet}\n container={getContainer()}\n onClick={() => handleWalletItemClick(wallet)}\n isLoading={fetchMetaStatus === 'loading'}\n disabled={!isActiveTab}\n />\n );\n })}\n <StatefulConnectModal\n wallet={selectedWalletToConnect}\n onClose={() => {\n setSelectedWalletToConnect(undefined);\n }}\n />\n </ListContainer>\n </Container>\n </Layout>\n );\n}\n", "import type { WalletType } from '../..';\n\nimport { useQueueManager } from '@rango-dev/queue-manager-rango-preset';\nimport { splitWalletNetwork } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport { useContext, useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { WidgetContext } from '../../containers/Wallets';\nimport { globalFont } from '../../globalStyles';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { unsubscribeQuoteStore } from '../../store/quote';\nimport { tabManager } from '../../store/ui';\nimport { useFetchApiConfig } from '../useFetchApiConfig';\nimport { useForceAutoConnect } from '../useForceAutoConnect';\nimport { useSubscribeToWidgetEvents } from '../useSubscribeToWidgetEvents';\nimport { useSyncNotifications } from '../useSyncNotifications';\n\nexport function useBootstrap() {\n useForceAutoConnect();\n globalFont();\n useSubscribeToWidgetEvents();\n useSyncNotifications();\n const blockchains = useAppStore().blockchains();\n const { canSwitchNetworkTo } = useWallets();\n const [lastConnectedWalletWithNetwork, setLastConnectedWalletWithNetwork] =\n useState('');\n const [disconnectedWallet, setDisconnectedWallet] = useState<WalletType>();\n const widgetContext = useContext(WidgetContext);\n\n const evmChains = blockchains.filter(isEvmBlockchain);\n\n const { fetchApiConfig } = useFetchApiConfig();\n\n // Unsubscribe QuoteStore listeners\n useEffect(() => () => unsubscribeQuoteStore(), []);\n\n // At the moment, we only detect the disconnection of EVM wallets.\n useQueueManager({\n lastConnectedWallet: lastConnectedWalletWithNetwork,\n clearDisconnectedWallet: () => {\n setDisconnectedWallet(undefined);\n },\n disconnectedWallet: disconnectedWallet,\n evmChains,\n canSwitchNetworkTo,\n });\n\n useEffect(() => {\n tabManager.init();\n\n if (!useNotificationStore.persist.hasHydrated()) {\n void useNotificationStore.persist.rehydrate();\n }\n\n /**\n * Add handlers to the widget context for connecting and disconnecting wallets.\n * We pass these handlers to the wallet provider to keep track of the last connected and last disconnected wallets.\n * The 'queue-manager' uses these details to spot any changes in the connection status of the required wallet during the swap process.\n *\n * with this approch anyone who use the widget context can override these handlers and causes some bugs happens.\n * it the future we should add a safer soloution like considering array of handlers .\n * https://github.com/rango-exchange/rango-client/pull/630/files#r1518846728\n */\n widgetContext.onConnectWallet(setLastConnectedWalletWithNetwork);\n widgetContext.onDisconnectWallet((walletType) => {\n setDisconnectedWallet(walletType);\n if (\n walletType === splitWalletNetwork(lastConnectedWalletWithNetwork)?.[0]\n ) {\n setLastConnectedWalletWithNetwork('');\n }\n });\n\n void fetchApiConfig().catch(console.log);\n\n return tabManager.destroy;\n }, []);\n}\n", "import { globalCss } from '@rango-dev/ui';\n\nexport const globalFont = () =>\n globalCss({\n '@import':\n \"url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap')\",\n })();\n", "import { useUiStore } from '../store/ui';\nimport { getConfig } from '../utils/configs';\n\nexport type Watermark = 'NONE' | 'FULL';\n\ntype ConfigResponse = {\n config: {\n watermark: Watermark;\n };\n};\n\ninterface UseFetchApiConfig {\n fetchApiConfig: () => Promise<void>;\n}\n\nexport function useFetchApiConfig(): UseFetchApiConfig {\n const { setWatermark } = useUiStore();\n\n const fetchApiConfig: UseFetchApiConfig['fetchApiConfig'] = async () => {\n const response = await fetch(\n `${getConfig('BASE_URL')}/meta/dapp/config?apiKey=${getConfig('API_KEY')}`\n );\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status} `);\n }\n\n const data: ConfigResponse = await response.json();\n\n setWatermark(data.config.watermark);\n };\n return { fetchApiConfig };\n}\n", "import { useWallets } from '@rango-dev/wallets-react';\nimport { useEffect, useRef } from 'react';\n\nimport { SearchParams } from '../constants/searchParams';\nimport { useAppStore } from '../store/AppStore';\n\nexport function useForceAutoConnect(): void {\n const { connect, state } = useWallets();\n const initiated = useRef<{ [key: string]: boolean }>({});\n const { fetchStatus } = useAppStore();\n const walletType =\n new URLSearchParams(location.search).get(SearchParams.AUTO_CONNECT) || '';\n const walletState = state(walletType);\n\n useEffect(() => {\n const shouldTryConnect =\n fetchStatus === 'success' &&\n walletType &&\n walletState.installed &&\n !walletState.connecting &&\n !walletState.connected;\n if (shouldTryConnect && !initiated.current[walletType]) {\n initiated.current[walletType] = true;\n void connect(walletType);\n }\n }, [walletState, fetchStatus]);\n}\n", "import type { RouteEventData, StepEventData } from '../..';\n\nimport {\n isApprovalTX,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n WidgetEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { eventEmitter } from '../../services/eventEmitter';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useWalletsStore } from '../../store/wallets';\n\nexport function useSubscribeToWidgetEvents() {\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const getWalletsDetails = useWalletsStore.use.getWalletsDetails();\n const setNotification = useNotificationStore.use.setNotification();\n const { findToken } = useAppStore();\n\n useEffect(() => {\n const handleStepEvent = (widgetEvent: StepEventData) => {\n const { event, step, route } = widgetEvent;\n const shouldRefetchBalance =\n (event.type === StepEventType.TX_EXECUTION &&\n event.status === StepExecutionEventStatus.TX_SENT &&\n !isApprovalTX(step)) ||\n event.type === StepEventType.SUCCEEDED;\n\n if (shouldRefetchBalance) {\n const fromAccount = connectedWallets.find(\n (account) => account.chain === step?.fromBlockchain\n );\n const toAccount =\n step?.fromBlockchain !== step?.toBlockchain &&\n connectedWallets.find(\n (wallet) => wallet.chain === step?.toBlockchain\n );\n\n fromAccount && getWalletsDetails([fromAccount], findToken);\n toAccount && getWalletsDetails([toAccount], findToken);\n }\n\n setNotification(event, route);\n };\n eventEmitter.on(WidgetEvents.StepEvent, handleStepEvent);\n return () => eventEmitter.off(WidgetEvents.StepEvent, handleStepEvent);\n }, [eventEmitter, connectedWallets]);\n\n useEffect(() => {\n const handleRouteEvent = (widgetEvent: RouteEventData) => {\n const { event, route } = widgetEvent;\n\n if (\n event.type === RouteEventType.FAILED ||\n event.type === RouteEventType.SUCCEEDED\n ) {\n setNotification(event, route);\n }\n };\n eventEmitter.on(WidgetEvents.RouteEvent, handleRouteEvent);\n\n return () => eventEmitter.off(WidgetEvents.RouteEvent, handleRouteEvent);\n }, [eventEmitter]);\n}\n", "import { useManager } from '@rango-dev/queue-manager-react';\nimport { useEffect } from 'react';\n\nimport { useNotificationStore } from '../../store/notification';\nimport { getPendingSwaps } from '../../utils/queue';\n\nexport function useSyncNotifications() {\n const { isSynced, syncNotifications } = useNotificationStore();\n const { manager, state } = useManager();\n\n useEffect(() => {\n const shouldSyncNotifications =\n useNotificationStore.persist.hasHydrated() &&\n state.loadedFromPersistor &&\n !isSynced;\n\n if (shouldSyncNotifications) {\n syncNotifications(getPendingSwaps(manager));\n }\n }, [\n useNotificationStore.persist.hasHydrated(),\n state.loadedFromPersistor,\n isSynced,\n ]);\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const MainContainer = styled('div', {\n fontFamily: '$widget',\n boxSizing: 'border-box',\n textAlign: 'left',\n '& *, *::before, *::after': {\n boxSizing: 'inherit',\n },\n '& *:focus-visible': {\n outlineColor: '$info500',\n transition: 'none',\n },\n '& ul, ol, li': { listStyleType: 'none' },\n});\n", "import type { PropTypes } from './WidgetProvider.types';\nimport type { PropsWithChildren } from 'react';\n\nimport { setSolanaSignerConfig } from '@rango-dev/signer-solana';\nimport React, { useEffect, useMemo } from 'react';\n\nimport { DEFAULT_BASE_URL, RANGO_PUBLIC_API_KEY } from '../../constants';\nimport useFontLoader from '../../hooks/useFontLoader';\nimport QueueManager from '../../QueueManager';\nimport { initConfig } from '../../utils/configs';\nimport { WidgetWallets } from '../Wallets';\nimport { WidgetInfo } from '../WidgetInfo';\n\nexport function WidgetProvider(props: PropsWithChildren<PropTypes>) {\n const { onUpdateState, config } = props;\n\n const fontFamily = props.config?.theme?.fontFamily;\n\n const { handleLoadCustomFont } = useFontLoader();\n\n useEffect(() => {\n if (fontFamily) {\n handleLoadCustomFont(fontFamily);\n }\n }, [fontFamily]);\n\n useMemo(() => {\n initConfig({\n API_KEY: config?.apiKey || RANGO_PUBLIC_API_KEY,\n BASE_URL: config?.apiUrl || DEFAULT_BASE_URL,\n });\n }, [config.apiKey, config.apiUrl]);\n\n useEffect(() => {\n if (props.config?.signers?.customSolanaRPC) {\n setSolanaSignerConfig('customRPC', props.config.signers.customSolanaRPC);\n }\n }, [props.config?.signers?.customSolanaRPC]);\n\n return (\n <WidgetWallets config={config} onUpdateState={onUpdateState}>\n <QueueManager apiKey={config.apiKey}>\n <WidgetInfo>{props.children}</WidgetInfo>\n </QueueManager>\n </WidgetWallets>\n );\n}\n", "import { useState } from 'react';\n\nimport { getFontUrlByName } from '../utils/common';\n/*\n *TODO:\n * Loading fonts from JS has a downside and it is the bundle needs to be downloaded and executed first which means after sometime font will be added to <head /> and it causes a layoutshift each time.\n * We've added Roboto into <head /> since it's the default font. the downside here is it will load roboto anyway even dApp has set fontFamily other than Roboto which causes an unneccerary downloand (Roboto).\n * We decided to go with the second one and it can be solved in future by split these types of configs into a separate js file and let it to be loaded with a more priority than the main bundle. it should be also cached which imrpove user experience after first load.\n */\nconst useFontLoader = () => {\n const [fontLink, setFontLink] = useState<HTMLLinkElement | null>(null);\n\n const loadFont = (fontUrl: string) => {\n const link = document.createElement('link');\n link.href = fontUrl;\n link.rel = 'stylesheet';\n document.head.appendChild(link);\n return link;\n };\n\n const unloadFont = () => {\n if (fontLink) {\n document.head.removeChild(fontLink);\n setFontLink(null);\n }\n };\n\n const handleLoadCustomFont = (fontName: string) => {\n unloadFont(); // Remove previous font\n const fontUrl = getFontUrlByName(fontName);\n if (fontUrl) {\n const newFontLink = loadFont(fontUrl);\n setFontLink(newFontLink);\n }\n };\n\n return { handleLoadCustomFont };\n};\n\nexport default useFontLoader;\n", "import type { SwapQueueContext } from '@rango-dev/queue-manager-rango-preset';\nimport type { Network, WalletType } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport {\n checkWaitingForNetworkChange,\n makeQueueDefinition,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { Provider as ManagerProvider } from '@rango-dev/queue-manager-react';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { convertEvmBlockchainMetaToEvmChainInfo } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-types';\nimport React, { useMemo } from 'react';\n\nimport { eventEmitter } from './services/eventEmitter';\nimport { useAppStore } from './store/AppStore';\nimport { useUiStore } from './store/ui';\nimport { useWalletsStore } from './store/wallets';\nimport { getConfig } from './utils/configs';\nimport { walletAndSupportedChainsNames } from './utils/wallets';\n\nfunction QueueManager(props: PropsWithChildren<{ apiKey?: string }>) {\n const {\n providers,\n getSigners,\n state,\n connect,\n canSwitchNetworkTo,\n getWalletInfo,\n } = useWallets();\n\n const swapQueueDef = useMemo(() => {\n return makeQueueDefinition({\n API_KEY: props.apiKey || getConfig('API_KEY'),\n BASE_URL: getConfig('BASE_URL'),\n emitter: {\n emit: eventEmitter.emit,\n },\n });\n }, [props.apiKey]);\n\n const blockchains = useAppStore().blockchains();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const wallets = {\n blockchains: connectedWallets.map((wallet) => ({\n accounts: [wallet],\n name: wallet.chain,\n })),\n };\n\n const switchNetwork = async (wallet: WalletType, network: Network) => {\n if (!canSwitchNetworkTo(wallet, network)) {\n return undefined;\n }\n return connect(wallet, network);\n };\n\n const isMobileWallet = (walletType: WalletType): boolean =>\n !!getWalletInfo(walletType).mobileWallet;\n\n // TODO: this code copy & pasted from rango, should be refactored.\n const allBlockchains = blockchains\n .filter((blockchain) => blockchain.enabled)\n .reduce(\n (blockchainsObj: any, blockchain) => (\n (blockchainsObj[blockchain.name] = blockchain), blockchainsObj\n ),\n {}\n );\n const evmBasedChains = blockchains.filter(isEvmBlockchain);\n const getSupportedChainNames = (type: WalletType) => {\n const { supportedChains } = getWalletInfo(type);\n return walletAndSupportedChainsNames(supportedChains);\n };\n const allProviders = providers();\n\n const context: SwapQueueContext = {\n meta: {\n blockchains: allBlockchains,\n evmBasedChains: evmBasedChains,\n evmNetworkChainInfo:\n convertEvmBlockchainMetaToEvmChainInfo(evmBasedChains),\n getSupportedChainNames,\n },\n getSigners,\n wallets,\n providers: allProviders,\n switchNetwork,\n canSwitchNetworkTo,\n connect,\n state,\n isMobileWallet,\n };\n\n const isActiveTab = useUiStore.use.isActiveTab();\n\n return (\n <ManagerProvider\n queuesDefs={[swapQueueDef]}\n context={context}\n onPersistedDataLoaded={(manager) => {\n checkWaitingForNetworkChange(manager);\n }}\n isPaused={!isActiveTab}>\n {props.children}\n </ManagerProvider>\n );\n}\n\nexport default QueueManager;\n", "import type { WidgetInfoContextInterface } from './WidgetInfo.types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport React, { createContext, useContext } from 'react';\n\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useUpdateQuoteInputs } from '../../hooks/useUpdateQuoteInputs/useUpdateQuoteInputs';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useQuoteStore } from '../../store/quote';\nimport { tabManager, useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { calculateWalletUsdValue } from '../../utils/wallets';\n\nimport { WidgetHistory } from './WidgetInfo.helpers';\n\nexport const WidgetInfoContext = createContext<\n WidgetInfoContextInterface | undefined\n>(undefined);\n\nexport function WidgetInfo(props: React.PropsWithChildren) {\n const { manager } = useManager();\n const isActiveTab = useUiStore.use.isActiveTab();\n const retrySwap = useQuoteStore.use.retry();\n const { findToken } = useAppStore();\n\n const history = new WidgetHistory(manager, { retrySwap, findToken });\n const details = useWalletsStore.use.connectedWallets();\n const isLoading = useWalletsStore.use.loading();\n const totalBalance = calculateWalletUsdValue(details);\n const refetch = useWalletsStore.use.getWalletsDetails();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const swappers = useAppStore().swappers();\n const loadingStatus = useAppStore().fetchStatus;\n const resetLanguage = useLanguage().resetLanguage;\n const notifications = useNotificationStore().getNotifications();\n const clearNotifications = useNotificationStore().clearNotifications;\n const updateQuoteInputs = useUpdateQuoteInputs();\n const { fromBlockchain, toBlockchain, fromToken, toToken, inputAmount } =\n useQuoteStore();\n\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n const value: WidgetInfoContextInterface = {\n isActiveTab,\n setCurrentTabAsActive: tabManager.forceClaim,\n history,\n wallets: {\n isLoading,\n details,\n totalBalance,\n refetch: (accounts) => refetch(accounts, findToken),\n },\n meta: {\n blockchains,\n tokens,\n swappers,\n loadingStatus,\n findToken,\n },\n resetLanguage,\n notifications: {\n list: notifications,\n clearAll: clearNotifications,\n },\n quote: {\n quoteInputs: {\n fromBlockchain: fromBlockchain?.name ?? null,\n fromToken: fromToken\n ? {\n symbol: fromToken.symbol,\n blockchain: fromToken.blockchain,\n address: fromToken.address,\n }\n : null,\n toBlockchain: toBlockchain?.name ?? null,\n toToken: toToken\n ? {\n symbol: toToken.symbol,\n blockchain: toToken.blockchain,\n address: toToken.address,\n }\n : null,\n requestAmount: inputAmount,\n },\n updateQuoteInputs,\n },\n };\n\n return (\n <WidgetInfoContext.Provider value={value}>\n {props.children}\n </WidgetInfoContext.Provider>\n );\n}\n\nexport function useWidget(): WidgetInfoContextInterface {\n const context = useContext(WidgetInfoContext);\n if (!context) {\n throw new Error(\n 'useWidget can only be used within the WidgetProvider component'\n );\n }\n return context;\n}\n", "import type { UpdateQuoteInputs } from '../../types';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\n\n// This hook provides a function to update quote inputs using fewer and simpler parameters.\nexport function useUpdateQuoteInputs() {\n const { findToken } = useAppStore();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const {\n setFromBlockchain,\n setFromToken,\n setToBlockchain,\n setToToken,\n setInputAmount,\n } = useQuoteStore();\n\n const updateQuoteInputs: UpdateQuoteInputs = (params) => {\n const { fromBlockchain, fromToken, toBlockchain, toToken, requestAmount } =\n params;\n const meta = { blockchains, tokens };\n\n if (fromBlockchain !== undefined) {\n const blockchainMeta =\n blockchains.find((blockchain) => blockchain.name === fromBlockchain) ??\n null;\n setFromBlockchain(blockchainMeta);\n }\n if (fromToken !== undefined) {\n const token = fromToken ? findToken(fromToken) ?? null : null;\n setFromToken({ meta, token });\n }\n if (toBlockchain !== undefined) {\n const blockchainMeta =\n blockchains.find((blockchain) => blockchain.name === toBlockchain) ??\n null;\n setToBlockchain(blockchainMeta);\n }\n if (toToken !== undefined) {\n const token = toToken ? findToken(toToken) ?? null : null;\n setToToken({ meta, token });\n }\n if (requestAmount !== undefined) {\n setInputAmount(requestAmount);\n }\n };\n\n return updateQuoteInputs;\n}\n", "import type { Meta, RetryQuote } from '../../store/quote';\nimport type { FindToken } from '../../store/slices/data';\nimport type { Manager } from '@rango-dev/queue-manager-core';\nimport type { PendingSwap } from 'rango-types/lib';\n\nimport {\n cancelSwap,\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { getPendingSwaps } from '../../utils/queue';\nimport { createRetryQuote } from '../../utils/quote';\n\ninterface WidgetHistoryActions {\n retrySwap: (retryQuote: RetryQuote) => void;\n findToken: FindToken;\n}\n\nexport class WidgetHistory {\n private manager: Manager | undefined;\n private actions: WidgetHistoryActions;\n\n constructor(manager: Manager | undefined, actions: WidgetHistoryActions) {\n this.manager = manager;\n this.actions = actions;\n }\n\n public getAllSwaps() {\n return getPendingSwaps(this.manager);\n }\n\n public getCurrentStep(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).step;\n }\n\n public getCurrentStepWallet(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).wallet;\n }\n\n public getCurrentStepNetwork(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).network;\n }\n\n public retry(swap: PendingSwap, meta: Meta) {\n const retryQuote = createRetryQuote(\n swap,\n meta.blockchains,\n this.actions.findToken\n );\n\n return this.actions.retrySwap(retryQuote);\n }\n\n public cancel(id: string) {\n const queue = this.manager?.get(id);\n if (queue) {\n cancelSwap(queue);\n }\n }\n\n private getCurrentStepInfo(swap: PendingSwap) {\n const currentStep = getCurrentStep(swap);\n return {\n step: currentStep,\n wallet: currentStep ? getRelatedWalletOrNull(swap, currentStep) : null,\n network: currentStep\n ? getCurrentBlockchainOfOrNull(swap, currentStep)\n : null,\n };\n }\n}\n", "import type { WidgetEventEmitter } from '../../types';\n\nimport { eventEmitter } from '../../services/eventEmitter';\n\nexport function useWidgetEvents(): WidgetEventEmitter {\n // To be exported for Dapps\n const { on, off } = eventEmitter;\n return { on, off };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { WidgetProps } from './containers/Widget';\nimport type { ConnectedWallet } from './store/wallets';\nimport type {\n BlockchainAndTokenConfig,\n QuoteEventData,\n Tokens,\n UiEventData,\n WalletEventData,\n WalletInfoWithExtra,\n WidgetColors,\n WidgetColorsKeys,\n WidgetConfig,\n WidgetTheme,\n WidgetVariant,\n} from './types';\nimport type {\n PendingSwapWithQueueID,\n Route,\n RouteEvent,\n RouteEventData,\n RouteExecutionEvents,\n RouteFailedEvent,\n RouteStartedEvent,\n RouteSucceededEvent,\n Step,\n StepApprovalTxSucceededEvent,\n StepCheckStatusEvent,\n StepEvent,\n StepEventData,\n StepFailedEvent,\n StepOutputRevealedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepTxExecutionBlockedEvent,\n StepTxExecutionUpdatedEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport type {\n LegacyEventHandler as HandleWalletsUpdate,\n LegacyProviderInterface as ProviderInterface,\n} from '@rango-dev/wallets-core/legacy';\nimport type {\n WalletInfo,\n WalletState,\n WalletType,\n} from '@rango-dev/wallets-shared';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport {\n EventSeverity,\n RouteEventType,\n StepEventType,\n StepExecutionBlockedEventStatus,\n StepExecutionEventStatus,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { legacyReadAccountAddress as readAccountAddress } from '@rango-dev/wallets-core/legacy';\nimport { useWallets, Events as WalletEvents } from '@rango-dev/wallets-react';\nimport { Networks, WalletTypes } from '@rango-dev/wallets-shared';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nimport {\n isOnDerivationPath,\n isOnNamespace,\n} from './components/StatefulConnectModal';\nimport { DerivationPath, Namespaces } from './components/WalletStatefulConnect';\nimport { WIDGET_UI_ID as UI_ID } from './constants';\nimport { SUPPORTED_FONTS } from './constants/fonts';\nimport { WidgetWallets } from './containers/Wallets';\nimport { Widget } from './containers/Widget';\nimport { useWidget } from './containers/WidgetInfo';\nimport { WidgetProvider } from './containers/WidgetProvider';\nimport { useStatefulConnect } from './hooks/useStatefulConnect';\nimport { useWalletList } from './hooks/useWalletList';\nimport { useWidgetEvents } from './hooks/useWidgetEvents';\nimport { widgetEventEmitter } from './services/eventEmitter';\nimport {\n WidgetEvents as MainEvents,\n QuoteEventTypes,\n UiEventTypes,\n WalletEventTypes,\n WidgetEvents,\n} from './types';\nimport { customizedThemeTokens } from './utils/ui';\n\nexport const StatefulConnect = {\n DerivationPath,\n Namespaces,\n isOnDerivationPath,\n isOnNamespace,\n};\n\nexport type {\n WidgetConfig,\n WalletType,\n WidgetTheme,\n WidgetColors,\n WidgetColorsKeys,\n ProviderInterface,\n BlockchainAndTokenConfig,\n WidgetProps,\n RouteEvent,\n RouteEventData,\n StepEvent,\n StepEventData,\n Route,\n Step,\n RouteStartedEvent,\n RouteSucceededEvent,\n RouteFailedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepFailedEvent,\n StepTxExecutionUpdatedEvent,\n StepTxExecutionBlockedEvent,\n StepCheckStatusEvent,\n StepApprovalTxSucceededEvent,\n StepOutputRevealedEvent,\n HandleWalletsUpdate,\n ConnectedWallet,\n Tokens,\n WidgetVariant,\n WalletEventData,\n QuoteEventData,\n UiEventData,\n WalletInfoWithExtra,\n};\nexport {\n Widget,\n /**\n * @deprecated Use `WidgetProvider` instead. This component will be removed in future versions.\n */\n WidgetWallets,\n WidgetProvider,\n useWidget,\n useWallets,\n useStatefulConnect,\n /**\n * @deprecated Use `widgetEventEmitter` instead. This hook will be removed in future versions.\n */\n useWidgetEvents,\n useWalletList,\n customizedThemeTokens,\n widgetEventEmitter,\n WidgetEvents,\n /**\n * @deprecated Use `WidgetEvents` instead. This enum will be removed in future versions.\n */\n MainEvents,\n QuoteEventTypes,\n WalletEventTypes,\n UiEventTypes,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n UI_ID,\n SUPPORTED_FONTS,\n};\n\n// Internal type exports for Rango\nexport type {\n WalletState,\n WalletInfo,\n PendingSwap,\n PendingSwapWithQueueID,\n PendingSwapStep,\n RouteExecutionEvents,\n};\n\n// Internal function and enum exports for Rango\nexport {\n readAccountAddress,\n Networks,\n WalletEvents,\n WalletTypes,\n PendingSwapNetworkStatus,\n EventSeverity,\n};\n", "import type { Result } from '../../hooks/useStatefulConnect';\nimport type { WalletInfoWithExtra } from '../../types';\nimport type { Namespace } from '@rango-dev/wallets-shared';\n\nimport { Divider } from '@rango-dev/ui';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport {\n ResultStatus,\n useStatefulConnect,\n} from '../../hooks/useStatefulConnect';\nimport { useWalletList } from '../../hooks/useWalletList';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport {\n ConnectStatus,\n DerivationPath,\n Namespaces,\n} from '../WalletStatefulConnect';\n\nimport { isOnDerivationPath, isOnNamespace, isOnStatus } from './helpers';\n\nconst KEEP_SUCCESS_MODAL_FOR = 3_000;\nconst DELAY_SHOWING_MODAL_FOR = 300;\n\ninterface PropTypes {\n wallet: WalletInfoWithExtra | undefined;\n onClose: () => void;\n // When `handleConnect` runs **successfully**, this will be called afterwards.\n onConnect?: (result: Result) => void;\n}\n\nexport function StatefulConnectModal(props: PropTypes) {\n const successModalTimerId = useRef<ReturnType<typeof setTimeout>>();\n const [isConnecting, setIsConnecting] = useState(false);\n const [error, setError] = useState<string>();\n const catchErrorOnHandle = (error: Error) => {\n setError(error.message);\n };\n const { terminateConnectingWallets } = useWalletList();\n\n const {\n handleConnect,\n handleDerivationPath,\n handleNamespace,\n getState,\n resetState,\n } = useStatefulConnect();\n\n const handleConfirmNamespaces = (selectedNamespaces: Namespace[]) => {\n handleNamespace(props.wallet!, selectedNamespaces).catch(\n catchErrorOnHandle\n );\n };\n\n const handleDerivationPathConfirm = (derivationPath: string) => {\n if (!derivationPath) {\n throw new Error(\n \"Derivation path is empty. Please make sure you've filled the field correctly.\"\n );\n }\n\n handleDerivationPath(derivationPath).catch(catchErrorOnHandle);\n };\n\n const handleClosingModal = () => {\n setIsConnecting(false);\n };\n\n const resetModalState = () => {\n setError(undefined);\n resetState();\n setIsConnecting(false);\n\n if (successModalTimerId.current) {\n clearTimeout(successModalTimerId.current);\n }\n };\n\n useEffect(() => {\n if (props.wallet) {\n resetModalState();\n let isConnected = false;\n /*\n * If connecting to wallet is happening quickly, we shouldn't show a modal.\n * by default we are assuming we can connect quickly, but if it passes an certain amount of time\n * We set his flag as false which means we a modal has been opened (showing a connection status or Namespace/Derivation path modal)\n */\n let isImmediatelyConnected = true;\n\n const beforeConnecting = () => {\n setTimeout(() => {\n isImmediatelyConnected = false;\n if (!isConnected) {\n setIsConnecting(true);\n }\n }, DELAY_SHOWING_MODAL_FOR);\n };\n\n const afterConnected = (result: Result) => {\n const resultIsConnected = result.status === ResultStatus.Connected;\n const resultIsDisconnected = [\n ResultStatus.Disconnected,\n ResultStatus.DisconnectedUnhandled,\n ].includes(result.status);\n const resultIsNeedMoreStepsToConnect = [\n ResultStatus.Namespace,\n ResultStatus.DerivationPath,\n ].includes(result.status);\n\n if (!resultIsNeedMoreStepsToConnect) {\n isConnected = true;\n }\n\n if (resultIsConnected && !isImmediatelyConnected) {\n successModalTimerId.current = setTimeout(\n handleClosingModal,\n KEEP_SUCCESS_MODAL_FOR\n );\n } else if (resultIsDisconnected) {\n handleClosingModal();\n }\n\n if (props.onConnect) {\n props.onConnect(result);\n }\n };\n\n beforeConnecting();\n handleConnect(props.wallet, {\n disconnectIfConnected: true,\n })\n .then(afterConnected)\n .catch(catchErrorOnHandle);\n }\n }, [props.wallet]);\n\n return (\n <WatermarkedModal\n open={isConnecting}\n onClose={handleClosingModal}\n onExit={() => {\n resetModalState();\n terminateConnectingWallets();\n if (props.onClose) {\n props.onClose();\n }\n }}\n container={getContainer()}>\n {isOnStatus(getState, props.wallet) && (\n <>\n <ConnectStatus\n wallet={{\n type: props.wallet.type,\n image: props.wallet.image,\n }}\n error={error}\n />\n <Divider direction=\"vertical\" size={32} />\n </>\n )}\n {isOnNamespace(getState) && (\n <Namespaces\n onConfirm={handleConfirmNamespaces}\n value={getState().namespace}\n />\n )}\n {isOnDerivationPath(getState) && (\n <DerivationPath\n onConfirm={handleDerivationPathConfirm}\n value={getState().derivationPath}\n />\n )}\n </WatermarkedModal>\n );\n}\n", "import type { HandleConnectOptions, Result } from './useStatefulConnect.types';\nimport type { WalletInfoWithExtra } from '../../types';\nimport type {\n Namespace,\n NamespaceData,\n WalletType,\n} from '@rango-dev/wallets-shared';\n\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { useReducer } from 'react';\n\nimport {\n isStateOnDerivationPathStep,\n isStateOnNamespace,\n} from './useStatefulConnect.helpers';\nimport { initState, reducer, type State } from './useStatefulConnect.state';\nimport { ResultStatus } from './useStatefulConnect.types';\n\ninterface UseStatefulConnect {\n handleConnect: (\n wallet: WalletInfoWithExtra,\n options?: HandleConnectOptions\n ) => Promise<Result>;\n handleNamespace: (\n wallet: WalletInfoWithExtra,\n selectedNamespaces: Namespace[]\n ) => Promise<Result>;\n handleDerivationPath: (path: string) => Promise<Result>;\n handleDisconnect: (type: WalletType) => Promise<Result>;\n getState(): State;\n resetState(section?: 'derivation'): void;\n}\n\n/**\n *\n * This hook maintains state of wallet and checks if additional information\n * is required to call the `connect` method of `core` package properly.\n *\n * The final goal is running `runConnect` which calls `wallets/core`'s `connect` method.\n * But sometimes it needs to get more information like what namespace it should be connected to,\n * or what derivation path should be used for.\n *\n */\nexport function useStatefulConnect(): UseStatefulConnect {\n const { state, disconnect, connect } = useWallets();\n\n const [connectState, dispatch] = useReducer(reducer, initState);\n\n const runConnect = async (\n type: WalletType,\n namespaces?: NamespaceData[],\n _options?: HandleConnectOptions\n ): Promise<{ status: ResultStatus }> => {\n /*\n * When running this function, it means all optional steps (like namespace and derivation path) has passed, or wallet doesn't need them at all.\n * By resetting state, we will make sure when user tries to connect other wallets, it doesn't have unexpected states.\n */\n dispatch({\n type: 'reset',\n });\n\n try {\n await connect(type, undefined, namespaces);\n\n return { status: ResultStatus.Connected };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n const message = e?.message\n ? `Error: ${e.message}`\n : 'An unknown error happened during connecting wallet.';\n\n throw new Error(message, { cause: e });\n }\n };\n\n const handleConnect = async (\n wallet: WalletInfoWithExtra,\n options?: HandleConnectOptions\n ): Promise<{\n status: ResultStatus;\n }> => {\n const isDisconnected = wallet.state === WalletState.DISCONNECTED;\n\n if (isDisconnected) {\n if (!wallet.namespaces) {\n return await runConnect(wallet.type, undefined, options);\n }\n\n const needsNamespace = wallet.namespaces.length > 1;\n const needsDerivationPath = wallet.needsDerivationPath;\n\n if (needsNamespace) {\n dispatch({\n type: 'needsNamespace',\n payload: {\n providerType: wallet.type,\n providerImage: wallet.image,\n availableNamespaces: wallet.namespaces,\n singleNamespace: wallet.singleNamespace,\n },\n });\n return { status: ResultStatus.Namespace };\n } else if (needsDerivationPath) {\n dispatch({\n type: 'needsDerivationPath',\n payload: {\n providerType: wallet.type,\n providerImage: wallet.image,\n namespace: wallet.namespaces[0],\n },\n });\n return { status: ResultStatus.DerivationPath };\n }\n\n return await runConnect(\n wallet.type,\n wallet.namespaces.map((namespace) => ({ namespace })),\n options\n );\n }\n\n if (options?.disconnectIfConnected) {\n await handleDisconnect(wallet.type);\n return { status: ResultStatus.Disconnected };\n }\n\n return { status: ResultStatus.DisconnectedUnhandled };\n };\n\n const handleNamespace = async (\n wallet: WalletInfoWithExtra,\n selectedNamespaces: Namespace[]\n ): Promise<Result> => {\n const isSingleNamespace = wallet.singleNamespace;\n const needsDerivationPath = wallet.needsDerivationPath;\n const firstSelectedNamespace = selectedNamespaces[0];\n\n if (!firstSelectedNamespace) {\n throw new Error(\n 'To confirm a namespace, you should select at least one namespace.'\n );\n }\n\n /*\n * Currently we support derivation path only for single namespace wallets.\n *\n * Basically Single namespace is a list with radio buttons to let the user select one value within the list.\n */\n if (isSingleNamespace && needsDerivationPath) {\n dispatch({\n type: 'needsDerivationPath',\n payload: {\n providerType: wallet.type,\n providerImage: wallet.image,\n namespace: firstSelectedNamespace,\n },\n });\n\n return { status: ResultStatus.DerivationPath };\n }\n\n /**\n * If execution reaches here, means we don't have any more optional step (like namespace and derivation)\n * So we should start connecting wallet.\n */\n\n if (!isStateOnNamespace(connectState)) {\n // Unreachable code.\n throw new Error(\n 'Something went wrong on handling namespace. Please retry.'\n );\n }\n\n const type = connectState.namespace.providerType;\n const namespaces = selectedNamespaces.map((namespace) => ({\n namespace,\n }));\n\n return await runConnect(type, namespaces);\n };\n\n const handleDerivationPath = async (\n derivationPath: string\n ): Promise<Result> => {\n if (!derivationPath) {\n throw new Error(\n \"Derivation path is empty. Please make sure you've filled the field correctly.\"\n );\n }\n\n if (!isStateOnDerivationPathStep(connectState)) {\n throw new Error(\n 'It seems you are filling derivation path without setting namespace before doing that. Please retry to connect.'\n );\n }\n const type = connectState.derivationPath.providerType;\n const selectedNamespace = connectState.derivationPath.namespace;\n const namespaces = [{ namespace: selectedNamespace, derivationPath }];\n\n return await runConnect(type, namespaces);\n };\n\n const handleDisconnect = async (type: WalletType): Promise<Result> => {\n const wallet = state(type);\n if (wallet.connected || wallet.connecting) {\n await disconnect(type);\n return { status: ResultStatus.Disconnected };\n }\n\n return { status: ResultStatus.Noop };\n };\n\n return {\n handleConnect,\n handleDisconnect,\n handleNamespace,\n handleDerivationPath,\n getState: () => connectState,\n resetState: (section?: 'derivation') => {\n if (section === 'derivation') {\n dispatch({\n type: 'resetDerivation',\n });\n } else {\n dispatch({\n type: 'reset',\n });\n }\n },\n };\n}\n", "import type { State } from './useStatefulConnect.state';\n\nexport function isStateOnDerivationPathStep(\n state: State\n): state is State & { derivationPath: NonNullable<State['derivationPath']> } {\n return !!state.derivationPath;\n}\n\nexport function isStateOnNamespace(\n state: State\n): state is State & { namespace: NonNullable<State['namespace']> } {\n return !!state.namespace;\n}\n", "import type {\n Actions,\n NeedsDerivationPathState,\n NeedsNamespacesState,\n} from './useStatefulConnect.types';\n\nexport interface State {\n status: 'init' | 'namespace' | 'derivationPath';\n namespace: NeedsNamespacesState | null;\n derivationPath: NeedsDerivationPathState | null;\n}\n\nexport const initState: State = {\n status: 'init',\n namespace: null,\n derivationPath: null,\n};\n\nexport function reducer(state: State, action: Actions): State {\n switch (action.type) {\n case 'needsNamespace':\n return {\n ...state,\n status: 'namespace',\n namespace: action.payload,\n derivationPath: null,\n };\n case 'needsDerivationPath':\n return {\n ...state,\n status: 'derivationPath',\n derivationPath: action.payload,\n };\n case 'reset':\n return initState;\n case 'resetDerivation':\n if (state.namespace) {\n return {\n ...state,\n derivationPath: null,\n status: 'namespace',\n };\n }\n return initState;\n default:\n throw new Error(`Action hasn't been defined.`);\n }\n}\n", "import type { WalletInfoWithExtra } from '../types';\nimport type { WalletInfo } from '@rango-dev/ui';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n detectMobileScreens,\n KEPLR_COMPATIBLE_WALLETS,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { useCallback, useEffect } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useWalletsStore } from '../store/wallets';\nimport { configWalletsToWalletName } from '../utils/providers';\nimport {\n hashWalletsState,\n isExperimentalChain,\n mapWalletTypesToWalletInfo,\n sortWalletsBasedOnConnectionState,\n} from '../utils/wallets';\n\nimport { useStatefulConnect } from './useStatefulConnect/useStatefulConnect';\n\nconst ALL_SUPPORTED_WALLETS = Object.values(WalletTypes);\n\ninterface Params {\n chain?: string;\n}\n\ninterface API {\n list: WalletInfoWithExtra[];\n terminateConnectingWallets: () => void;\n}\n\n/**\n *\n * Returning list of wallets which has a applied sorting and filtering (some of wallet can be excluded).\n * It can have some functionality on list itself,\n * now it only has a method to disconnect the wallets that has `connecting` status. This is useful for exiting page and terminating wallet connection.\n *\n */\nexport function useWalletList(params?: Params): API {\n const { chain } = params || {};\n const { config } = useAppStore();\n const { state, getWalletInfo } = useWallets();\n const { connectedWallets } = useWalletsStore();\n const blockchains = useAppStore().blockchains();\n const { handleDisconnect } = useStatefulConnect();\n\n /** It can be what has been set by widget config or as a fallback we use all the supported wallets by our library */\n const listAvailableWalletTypes =\n configWalletsToWalletName(config?.wallets, {\n trezorManifest: config?.trezorManifest,\n walletConnectProjectId: config?.walletConnectProjectId,\n walletConnectListedDesktopWalletLink:\n config.__UNSTABLE_OR_INTERNAL__?.walletConnectListedDesktopWalletLink,\n }) || ALL_SUPPORTED_WALLETS;\n\n let wallets = mapWalletTypesToWalletInfo(\n state,\n getWalletInfo,\n listAvailableWalletTypes,\n chain\n );\n\n wallets = detectMobileScreens()\n ? wallets.filter(\n (wallet) =>\n wallet.showOnMobile !== false && state(wallet.type).installed\n )\n : wallets;\n\n const sortedWallets = sortWalletsBasedOnConnectionState(wallets);\n\n const isExperimentalChainNotAdded = (walletType: string) =>\n !connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.chain === chain\n );\n\n const terminateConnectingWallets = useCallback(() => {\n const connectingWallets =\n wallets?.filter((wallet) => wallet.state === WalletState.CONNECTING) ||\n [];\n for (const wallet of connectingWallets) {\n void handleDisconnect(wallet.type);\n }\n }, [hashWalletsState(wallets)]);\n\n useEffect(() => {\n return () => {\n terminateConnectingWallets();\n };\n }, []);\n\n /*\n * Atm, we only support default injected wallet for the EVM\n * so we show default wallet when there is no other evm wallet installed\n * but we have ethereum injected\n */\n const shouldShowDefaultInjectedWallet = (wallets: WalletInfo[]) => {\n // don't show default injected wallet when it's not installed\n const defaultWallet = wallets.find(\n (wallet) => wallet.type === WalletTypes.DEFAULT\n );\n if (!defaultWallet || defaultWallet.state === WalletState.NOT_INSTALLED) {\n return false;\n }\n\n /*\n * if we have another evm wallet installed (except wallet connect),\n * there is no need to show default injected wallet anymore\n */\n const isEvmWalletInstalledExceptDefault = wallets.filter(\n (wallet) =>\n wallet.state != WalletState.NOT_INSTALLED &&\n ![\n WalletTypes.DEFAULT,\n WalletTypes.WALLET_CONNECT_2,\n WalletTypes.LEDGER,\n ].includes(wallet.type as WalletTypes) &&\n getWalletInfo(wallet.type).supportedChains.filter(\n (blockchain) => blockchain.type == 'EVM'\n ).length > 0\n );\n return isEvmWalletInstalledExceptDefault.length == 0;\n };\n\n const shouldExcludeWallet = (\n walletType: string,\n chain: string,\n blockchains: BlockchainMeta[]\n ) => {\n return (\n (isExperimentalChain(blockchains, chain) &&\n isExperimentalChainNotAdded(walletType) &&\n !KEPLR_COMPATIBLE_WALLETS.includes(walletType)) ||\n (walletType == WalletTypes.DEFAULT &&\n !shouldShowDefaultInjectedWallet(wallets))\n );\n };\n\n return {\n list: sortedWallets.filter(\n (wallet) => !shouldExcludeWallet(wallet.type, chain ?? '', blockchains)\n ),\n terminateConnectingWallets,\n };\n}\n", "import type { WidgetConfig } from '../types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { createContext, useContext, useEffect, useRef } from 'react';\n\nimport { createAppStore } from './app';\n\ntype AppStore = ReturnType<typeof createAppStore>;\ntype AppStoreProviderProps = PropsWithChildren<{ config?: WidgetConfig }>;\n\nexport const AppStoreContext = createContext<AppStore | null>(null);\n\nexport function useAppStore() {\n const store = useContext(AppStoreContext);\n\n useEffect(() => {\n if (store && !store.persist.hasHydrated()) {\n void store.persist.rehydrate();\n }\n }, []);\n\n if (!store) {\n throw new Error('Missing AppStoreContext.Provider in the tree');\n }\n\n return store();\n}\n\nexport function AppStoreProvider(props: AppStoreProviderProps) {\n const appStoreRef = useRef<AppStore>();\n\n if (!appStoreRef.current) {\n appStoreRef.current = createAppStore(props.config);\n }\n\n return (\n <AppStoreContext.Provider value={appStoreRef.current}>\n {props.children}\n </AppStoreContext.Provider>\n );\n}\n", "import type { ConfigSlice } from './slices/config';\nimport type { DataSlice } from './slices/data';\nimport type { SettingsSlice } from './slices/settings';\nimport type { WidgetConfig } from '../types';\nimport type { StateCreator } from 'zustand';\n\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\nimport { createConfigSlice } from './slices/config';\nimport { createDataSlice } from './slices/data';\nimport { createSettingsSlice } from './slices/settings';\n\nexport type StateCreatorWithInitialData<\n T extends Partial<WidgetConfig>,\n R extends Partial<AppStoreState>,\n V extends Partial<AppStoreState>\n> = (\n initialData: T | undefined,\n ...rest: Parameters<StateCreator<R, [], [], V>>\n) => ReturnType<StateCreator<R, [], [], V>>;\n\nexport type AppStoreState = DataSlice & ConfigSlice & SettingsSlice;\n\nexport function createAppStore(initialData?: WidgetConfig) {\n return create<AppStoreState>()(\n persist(\n (...a) => ({\n ...createDataSlice(...a),\n ...createSettingsSlice(...a),\n ...createConfigSlice(initialData, ...a),\n }),\n {\n name: 'user-settings',\n skipHydration: true,\n partialize: (state) => {\n return {\n _customTokens: state._customTokens,\n theme: state.theme,\n language: state.language,\n affiliatePercent: state.affiliatePercent,\n affiliateRef: state.affiliateRef,\n affiliateWallets: state.affiliateWallets,\n slippage: state.slippage,\n customSlippage: state.customSlippage,\n infiniteApprove: state.infiniteApprove,\n preferredBlockchains: state.preferredBlockchains,\n disabledLiquiditySources: state.disabledLiquiditySources,\n };\n },\n }\n )\n );\n}\n", "import type { Token } from 'rango-sdk';\n\ninterface CacheServiceInterface<V> {\n get<K extends keyof V>(key: K): V[K] | undefined;\n set<K extends keyof V>(key: K, value: V[K]): void;\n remove<K extends keyof V>(key: K): void;\n clear(): void;\n}\n\nclass CacheService<T> implements CacheServiceInterface<T> {\n #cache: Map<string, T[keyof T]> = new Map();\n\n get<K extends keyof T>(key: K): T[K] | undefined {\n return this.#cache.get(key as string) as T[K];\n }\n\n set<K extends keyof T>(key: K, value: T[K]): void {\n this.#cache.set(key as string, value);\n }\n\n remove<K extends keyof T>(key: K): void {\n this.#cache.delete(key as string);\n }\n\n clear(): void {\n this.#cache.clear();\n }\n}\n\nexport type CachedEntries = {\n supportedSourceTokens: Token[];\n supportedDestinationTokens: Token[];\n};\n\nexport const cacheService = new CacheService<CachedEntries>();\n", "import type { TokenHash } from '../types';\nimport type { Asset, BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\n\nexport function getBlockchainDisplayNameFor(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.displayName;\n}\nexport function getBlockchainShortNameFor(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.shortName;\n}\n\nexport function getBlockchainImage(\n blockchainName: string,\n blockchains: BlockchainMeta[]\n): string | undefined {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.logo;\n}\n\nexport function getSwapperDisplayName(\n swapperId: string,\n swappers: SwapperMeta[]\n) {\n return swappers.find((swapper) => swapper.id === swapperId)?.title;\n}\n\nexport function findBlockchain(name: string, blockchains: BlockchainMeta[]) {\n return blockchains.find((blockchain) => blockchain.name === name) ?? null;\n}\n\nexport function isTokenNative(\n token: Token,\n blockchain: BlockchainMeta | undefined\n) {\n if (!blockchain || !token) {\n return false;\n }\n\n for (const feeAsset of blockchain.feeAssets) {\n if (\n token?.blockchain === feeAsset?.blockchain &&\n token?.symbol === feeAsset?.symbol &&\n token?.address === feeAsset?.address\n ) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function createTokenHash(asset: Asset): TokenHash {\n return `${asset.blockchain.toLowerCase()}-${asset.symbol.toLowerCase()}-${(\n asset.address ?? ''\n ).toLowerCase()}`;\n}\n\nexport function isValidTokenAddress(\n chain: BlockchainMeta,\n address: string\n): boolean {\n const regex = chain.addressPatterns;\n const valid = regex.filter((r) => new RegExp(r).test(address)).length > 0;\n return valid;\n}\n", "import type {\n BlockchainAndTokenConfig,\n TokenHash,\n WidgetConfig,\n} from '../../types';\nimport type { DataSlice } from '../slices/data';\nimport type { Asset, Token } from 'rango-sdk';\n\nimport { createTokenHash } from '../../utils/meta';\n\n/**\n * This function retrieves tokens and blockchains from the widget configuration and combines them with token data from the meta response to determine which tokens should be displayed in the widget.\n * To optimize performance, the function minimizes unnecessary iterations over the meta tokens.\n * The result of this function should be cached and recalculated whenever the widget configuration changes.\n */\nexport function matchTokensFromConfigWithMeta(params: {\n type: 'source' | 'destination';\n config: {\n blockchains: BlockchainAndTokenConfig['blockchains'];\n tokens: BlockchainAndTokenConfig['tokens'];\n };\n meta: {\n tokensMapByTokenHash: DataSlice['_tokensMapByTokenHash'];\n tokensMapByBlockchainName: DataSlice['_tokensMapByBlockchainName'];\n };\n}): Token[] {\n const { config, meta } = params;\n const result: Record<TokenHash, Token> = {};\n const configTokens = config.tokens;\n\n // Helper function to add tokens to result\n const addTokens = (tokens: (Asset | TokenHash)[]) => {\n tokens.forEach((item) => {\n if (typeof item !== 'string') {\n item = createTokenHash(item);\n }\n const tokenFromMeta = meta.tokensMapByTokenHash.get(item);\n if (tokenFromMeta) {\n result[item] = tokenFromMeta;\n }\n });\n };\n\n /**\n * We support two types of configurations for passing tokens in the widget config.\n * We check the type of configuration and calculate the result based on that.\n */\n if (Array.isArray(configTokens)) {\n /**\n * If \"config.tokens\" is an array,\n * we iterate through it and include any token that exists in the meta data in the result.\n */\n if (configTokens.length > 0) {\n addTokens(configTokens);\n return Object.values(result);\n }\n return Array.from(meta.tokensMapByTokenHash.values());\n }\n\n /**\n * From this point onward,\n * the function handles the other type of widget configuration.\n */\n if (!configTokens) {\n return Array.from(meta.tokensMapByTokenHash.values());\n }\n\n let configBlockchains: string[];\n\n if (config.blockchains?.length) {\n configBlockchains = config.blockchains;\n } else {\n /**\n * If config.blockchains does not exist,\n * we include all tokens from every blockchain in the meta data that are not specified in the tokens from the config.\n */\n configBlockchains = Object.keys(configTokens);\n const configBlockchainsSet = new Set(configBlockchains);\n\n Object.keys(meta.tokensMapByBlockchainName).forEach((blockchain) => {\n if (!configBlockchainsSet.has(blockchain)) {\n addTokens(meta.tokensMapByBlockchainName[blockchain]);\n }\n });\n }\n //We iterate over each blockchain and retrieve the related tokens for each one from the configuration.\n configBlockchains.forEach((blockchain) => {\n const targetTokensForBlockchain = configTokens[blockchain];\n /**\n * If no tokens exist for a blockchain,\n * we include all tokens for that blockchain from the meta response.\n */\n if (\n !targetTokensForBlockchain &&\n meta.tokensMapByBlockchainName?.[blockchain]\n ) {\n addTokens(meta.tokensMapByBlockchainName[blockchain]);\n return;\n }\n\n if (targetTokensForBlockchain) {\n if (targetTokensForBlockchain.isExcluded) {\n /**\n * If tokens are excluded,\n * we first include all tokens from the meta for that blockchain,\n * then remove the excluded tokens from the result.\n */\n addTokens(meta.tokensMapByBlockchainName[blockchain]);\n targetTokensForBlockchain.tokens.forEach((token) => {\n const tokenHash = createTokenHash(token);\n delete result[tokenHash];\n });\n } else {\n //We retrieve the corresponding token from the meta and include it in the result.\n addTokens(targetTokensForBlockchain.tokens);\n }\n }\n });\n\n return Object.values(result);\n}\n\nexport function getSupportedBlockchainsFromConfig(params: {\n config: WidgetConfig;\n}): string[] {\n const { config } = params;\n const configFromBlockchains = config.from?.blockchains || [];\n const configToBlockchains = config.to?.blockchains || [];\n\n /*\n * Empty array means all blockchains. So if any of to or from has an empty array,\n * it means all blockchains is available to use and there is no limitation from config.\n */\n if (!configFromBlockchains.length || !configToBlockchains.length) {\n return [];\n }\n const blockchains = [...configFromBlockchains, ...configToBlockchains];\n\n const supportedBlockchains = new Set(blockchains);\n\n return Array.from(supportedBlockchains);\n}\n", "import type { DataSlice } from './data';\nimport type { SettingsSlice } from './settings';\nimport type { WidgetConfig } from '../../types';\nimport type { StateCreatorWithInitialData } from '../app';\n\nimport { cacheService } from '../../services/cacheService';\nimport { matchTokensFromConfigWithMeta } from '../utils';\n\nexport const DEFAULT_CONFIG: WidgetConfig = {\n apiKey: '',\n title: undefined,\n multiWallets: true,\n excludeLiquiditySources: true,\n customDestination: true,\n variant: 'default',\n trezorManifest: {\n appUrl: 'https://widget.rango.exchange/',\n email: 'hi+trezorwidget@rango.exchange',\n },\n};\n\ninterface IframeConfigs {\n clientUrl?: string;\n}\n\ninterface CampaignMode {\n liquiditySources?: string[];\n}\n\nconst DEFAULT_IFRAME_CONFIGS: IframeConfigs = {\n clientUrl: undefined,\n};\n\nconst DEFAULT_CAMPAIGN_MODE: CampaignMode = {\n liquiditySources: undefined,\n};\n\nexport interface ConfigSlice {\n // What user can set directly.\n config: WidgetConfig;\n campaignMode: CampaignMode;\n isInCampaignMode: () => boolean;\n getLiquiditySources: () => string[];\n getDisabledLiquiditySources: () => string[];\n excludeLiquiditySources: () => boolean;\n updateConfig: (config: WidgetConfig) => void;\n updateCampaignMode: <K extends keyof CampaignMode>(\n name: K,\n value: CampaignMode[K]\n ) => void;\n // What we are setting based on environments.\n iframe: { clientUrl?: string };\n updateIframe: <K extends keyof IframeConfigs>(\n name: K,\n value: IframeConfigs[K]\n ) => void;\n}\n\nexport const createConfigSlice: StateCreatorWithInitialData<\n WidgetConfig,\n ConfigSlice & SettingsSlice & DataSlice,\n ConfigSlice\n> = (initialData, set, get) => {\n return {\n config: { ...DEFAULT_CONFIG, ...initialData },\n iframe: DEFAULT_IFRAME_CONFIGS,\n campaignMode: DEFAULT_CAMPAIGN_MODE,\n getLiquiditySources: () => {\n const { config, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? campaignMode.liquiditySources\n : config.liquiditySources ?? [];\n },\n getDisabledLiquiditySources: () => {\n const { disabledLiquiditySources, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? []\n : disabledLiquiditySources;\n },\n excludeLiquiditySources: () => {\n const { config, campaignMode } = get();\n return campaignMode.liquiditySources?.length\n ? false\n : !!config.excludeLiquiditySources;\n },\n isInCampaignMode: () => {\n const { campaignMode } = get();\n return !!campaignMode.liquiditySources?.length;\n },\n\n // Actions\n updateConfig: (nextConfig: WidgetConfig) => {\n const currentConfig = get().config;\n const {\n _tokensMapByTokenHash: tokensMapByTokenHash,\n _tokensMapByBlockchainName: tokensMapByBlockchainName,\n } = get();\n\n const supportedSourceTokens = matchTokensFromConfigWithMeta({\n type: 'source',\n config: {\n blockchains: nextConfig.from?.blockchains,\n tokens: nextConfig.from?.tokens,\n },\n meta: {\n tokensMapByBlockchainName,\n tokensMapByTokenHash,\n },\n });\n\n const supportedDestinationTokens = matchTokensFromConfigWithMeta({\n type: 'destination',\n config: {\n blockchains: nextConfig.to?.blockchains,\n tokens: nextConfig.to?.tokens,\n },\n meta: {\n tokensMapByBlockchainName,\n tokensMapByTokenHash,\n },\n });\n\n cacheService.set('supportedSourceTokens', supportedSourceTokens);\n cacheService.set(\n 'supportedDestinationTokens',\n supportedDestinationTokens\n );\n\n set({\n config: {\n ...currentConfig,\n ...nextConfig,\n },\n });\n },\n\n updateCampaignMode: (name, value) => {\n const currentCampaignMode = get().campaignMode;\n\n set({\n campaignMode: {\n ...currentCampaignMode,\n [name]: value,\n },\n });\n },\n\n updateIframe: (name, value) => {\n const currentIframeConfig = get().iframe;\n\n set({\n iframe: {\n ...currentIframeConfig,\n [name]: value,\n },\n });\n },\n };\n};\n", "import { TransactionType } from 'rango-types';\n\nexport const ACTIVE_BLOCKCHAINS_FOR_CUSTOM_TOKENS: string[] = [\n TransactionType.EVM,\n TransactionType.SOLANA,\n];\n", "import { RangoClient } from 'rango-sdk';\n\nimport { getConfig } from '../utils/configs';\n\nlet rango: RangoClient | undefined = undefined;\n\nexport const httpService = () => {\n if (rango) {\n return rango;\n }\n rango = new RangoClient(getConfig('API_KEY'), getConfig('BASE_URL'));\n return rango;\n};\n", "import { UI_ID } from '@rango-dev/ui';\n\nexport const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\nexport const DEFAULT_BASE_URL = 'https://api.rango.exchange';\nexport const SCANNER_BASE_URL = 'https://explorer.rango.exchange';\n\nexport const WIDGET_UI_ID = {\n SWAP_BOX_ID: 'rango-swap-box',\n EXPANDED_BOX_ID: 'rango-expanded-box',\n ...UI_ID,\n};\n", "import type { FindToken } from '../store/slices/data';\nimport type { ConnectedWallet, TokenBalance } from '../store/wallets';\nimport type {\n Balance,\n SelectedQuote,\n TokensBalance,\n Wallet,\n WalletInfoWithExtra,\n} from '../types';\nimport type { WalletInfo as ModalWalletInfo } from '@rango-dev/ui';\nimport type {\n Network,\n WalletInfo,\n WalletState,\n WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport type {\n BlockchainMeta,\n Token,\n TransactionType,\n WalletDetail,\n} from 'rango-sdk';\n\nimport {\n BlockchainCategories,\n WalletState as WalletStatus,\n} from '@rango-dev/ui';\nimport { legacyReadAccountAddress as readAccountAddress } from '@rango-dev/wallets-core/legacy';\nimport {\n detectInstallLink,\n getCosmosExperimentalChainInfo,\n isEvmAddress,\n KEPLR_COMPATIBLE_WALLETS,\n Networks,\n} from '@rango-dev/wallets-shared';\nimport BigNumber from 'bignumber.js';\nimport { isCosmosBlockchain } from 'rango-types';\n\nimport { ZERO } from '../constants/numbers';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../constants/routing';\nimport { EXCLUDED_WALLETS } from '../constants/wallets';\n\nimport { isBlockchainTypeInCategory, removeDuplicateFrom } from './common';\nimport { createTokenHash } from './meta';\nimport { numberToString } from './numbers';\n\nexport function mapStatusToWalletState(state: WalletState): WalletStatus {\n switch (true) {\n case state.connected:\n return WalletStatus.CONNECTED;\n case state.connecting:\n return WalletStatus.CONNECTING;\n case !state.installed:\n return WalletStatus.NOT_INSTALLED;\n default:\n return WalletStatus.DISCONNECTED;\n }\n}\n\nexport function mapWalletTypesToWalletInfo(\n getState: (type: WalletType) => WalletState,\n getWalletInfo: (type: WalletType) => WalletInfo,\n list: WalletType[],\n chain?: string\n): WalletInfoWithExtra[] {\n return list\n .filter((wallet) => !EXCLUDED_WALLETS.includes(wallet as WalletTypes))\n .filter((wallet) => {\n const { supportedChains, isContractWallet } = getWalletInfo(wallet);\n\n const { installed, network } = getState(wallet);\n const filterContractWallets =\n isContractWallet && (!installed || (!!chain && network !== chain));\n if (filterContractWallets) {\n return false;\n }\n if (chain) {\n return !!supportedChains.find(\n (supportedChain) => supportedChain.name === chain\n );\n }\n return true;\n })\n .map((type) => {\n const {\n name,\n img: image,\n installLink,\n showOnMobile,\n namespaces,\n singleNamespace,\n supportedChains,\n needsDerivationPath,\n } = getWalletInfo(type);\n const blockchainTypes = removeDuplicateFrom(\n supportedChains.map((item) => item.type)\n );\n\n const state = mapStatusToWalletState(getState(type));\n return {\n title: name,\n image,\n link: detectInstallLink(installLink),\n state,\n type,\n showOnMobile,\n namespaces,\n singleNamespace,\n blockchainTypes,\n needsDerivationPath,\n };\n });\n}\n\nexport function walletAndSupportedChainsNames(\n supportedBlockchains: BlockchainMeta[]\n): Network[] | null {\n if (!supportedBlockchains) {\n return null;\n }\n let walletAndSupportedChainsNames: Network[] = [];\n walletAndSupportedChainsNames = supportedBlockchains.map(\n (blockchainMeta) => blockchainMeta.name\n );\n\n return walletAndSupportedChainsNames;\n}\n\nexport function prepareAccountsForWalletStore(\n wallet: WalletType,\n accounts: string[],\n evmBasedChains: string[],\n supportedChainNames: Network[] | null,\n isContractWallet: boolean\n): Wallet[] {\n const result: Wallet[] = [];\n\n function addAccount(network: Network, address: string) {\n const accountForChainAlreadyExists = !!result.find(\n (account) => account.chain === network\n );\n if (!accountForChainAlreadyExists) {\n const newAccount: Wallet = {\n address,\n chain: network,\n walletType: wallet,\n };\n\n result.push(newAccount);\n }\n }\n\n const supportedBlockchains = supportedChainNames || [];\n\n accounts.forEach((account) => {\n const { address, network } = readAccountAddress(account);\n\n const hasLimitation = supportedBlockchains.length > 0;\n const isSupported = supportedBlockchains.includes(network);\n const isUnknown = network === Networks.Unknown;\n const notSupportedNetworkByWallet =\n hasLimitation && !isSupported && !isUnknown;\n\n /*\n * Here we check given `network` is not supported by wallet\n * And also the network is known.\n */\n if (notSupportedNetworkByWallet) {\n return;\n }\n\n /*\n * In some cases we can handle unknown network by checking its address\n * pattern and act on it.\n * Example: showing our evm compatible network when the unknown network is evm.\n * Otherwise, we stop executing this function.\n */\n const isUnknownAndEvmBased =\n network === Networks.Unknown && isEvmAddress(address);\n if (isUnknown && !isUnknownAndEvmBased) {\n return;\n }\n\n const isEvmBasedChain = evmBasedChains.includes(network);\n\n // If it's an evm network, we will add the address to all the evm chains.\n if (isEvmBasedChain || isUnknownAndEvmBased) {\n if (isContractWallet) {\n /*\n * for contract wallets like Safe wallet, we should add only account for the\n * current connected blockchain not all of the supported blockchains\n */\n addAccount(network, address.toLowerCase());\n } else {\n /*\n * all evm chains are not supported in wallets, so we are adding\n * only to those that are supported by wallet.\n */\n const evmChainsSupportedByWallet = supportedBlockchains.filter(\n (chain) => evmBasedChains.includes(chain)\n );\n\n evmChainsSupportedByWallet.forEach((network) => {\n /*\n * EVM addresses are not case sensitive.\n * Some wallets like Binance-chain return some letters in uppercase which produces bugs in our wallet state.\n */\n addAccount(network, address.toLowerCase());\n });\n }\n } else {\n addAccount(network, address);\n }\n });\n\n return result;\n}\n\nexport function getQuoteWallets(params: {\n filter: 'all' | 'required';\n quote: SelectedQuote | null;\n}): string[] {\n const { filter, quote } = params;\n const wallets = new Set<string>();\n\n quote?.swaps.forEach((swap, swapIndex) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n wallets.add(currentStepFromBlockchain);\n\n // Check if internalSwaps array exists\n if (swap.internalSwaps) {\n const { internalSwaps } = swap;\n internalSwaps.forEach((internalSwap, internalSwapIndex) => {\n const internalStepFromBlockchain = internalSwap.from.blockchain;\n const internalStepToBlockchain = internalSwap.to.blockchain;\n const isLastStep = swapIndex === quote.swaps.length - 1;\n const isLastInternalStep =\n internalSwapIndex === internalSwaps.length - 1;\n\n if (\n (!isLastStep && !isLastInternalStep) ||\n (isLastStep &&\n currentStepToBlockchain !== internalStepFromBlockchain) ||\n filter === 'all'\n ) {\n wallets.add(internalStepFromBlockchain);\n }\n if (filter === 'all') {\n wallets.add(internalStepToBlockchain);\n }\n });\n }\n\n if (filter === 'all') {\n wallets.add(currentStepToBlockchain);\n }\n });\n return Array.from(wallets);\n}\n\ntype Blockchain = { name: string; accounts: ConnectedWallet[] };\n\nexport function isAccountAndWalletMatched(\n account: Wallet,\n connectedWallet: ConnectedWallet\n) {\n return (\n account.address === connectedWallet.address &&\n account.chain === connectedWallet.chain &&\n account.walletType === connectedWallet.walletType\n );\n}\n\nexport function makeBalanceFor(\n retrievedBalance: WalletDetail,\n findToken: FindToken\n): TokenBalance[] {\n const { blockChain: chain, balances = [] } = retrievedBalance;\n return (\n balances?.map((tokenBalance) => ({\n chain,\n symbol: tokenBalance.asset.symbol,\n ticker: tokenBalance.asset.symbol,\n address: tokenBalance.asset.address || null,\n rawAmount: tokenBalance.amount.amount,\n decimal: tokenBalance.amount.decimals,\n amount: new BigNumber(tokenBalance.amount.amount)\n .shiftedBy(-tokenBalance.amount.decimals)\n .toFixed(),\n logo: '',\n usdPrice: findToken(tokenBalance.asset)?.usdPrice || null,\n })) || []\n );\n}\n\nexport function resetConnectedWalletState(\n connectedWallet: ConnectedWallet\n): ConnectedWallet {\n return { ...connectedWallet, loading: false, error: true };\n}\n\nexport const calculateWalletUsdValue = (connectedWallet: ConnectedWallet[]) => {\n const uniqueAccountAddresses = new Set<string | null>();\n const uniqueBalance: ConnectedWallet[] = connectedWallet?.reduce(\n (acc: ConnectedWallet[], current: ConnectedWallet) => {\n return acc.findIndex(\n (i) => i.address === current.address && i.chain === current.chain\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n ) === -1\n ? [...acc, current]\n : acc;\n },\n []\n );\n\n const modifiedWalletBlockchains = uniqueBalance?.map((chain) => {\n const modifiedWalletBlockchain: Blockchain = {\n name: chain.chain,\n accounts: [],\n };\n if (!uniqueAccountAddresses.has(chain.address)) {\n uniqueAccountAddresses.add(chain.address);\n }\n uniqueAccountAddresses.forEach((accountAddress) => {\n if (chain.address === accountAddress) {\n modifiedWalletBlockchain.accounts.push(chain);\n }\n });\n return modifiedWalletBlockchain;\n });\n const total = numberToString(\n modifiedWalletBlockchains\n ?.flatMap((b) => b.accounts)\n ?.flatMap((a) => a?.balances)\n ?.map((b) =>\n new BigNumber(b?.amount || ZERO).multipliedBy(b?.usdPrice || 0)\n )\n ?.reduce((a, b) => a.plus(b), ZERO) || ZERO\n ).toString();\n\n return numberWithThousandSeparator(total);\n};\n\nfunction numberWithThousandSeparator(number: string | number): string {\n const parts = number.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return parts.join('.');\n}\n\nexport const isExperimentalChain = (\n blockchains: BlockchainMeta[],\n wallet: string\n): boolean => {\n const cosmosExperimentalChainInfo = getCosmosExperimentalChainInfo(\n Object.entries(blockchains)\n .map(([, blockchainMeta]) => blockchainMeta)\n .filter(isCosmosBlockchain)\n );\n return (\n cosmosExperimentalChainInfo &&\n cosmosExperimentalChainInfo[wallet]?.experimental\n );\n};\n\nexport const getKeplrCompatibleConnectedWallets = (\n selectableWallets: Wallet[]\n): WalletType[] => {\n const connectedWalletTypes = new Set(\n selectableWallets.map((wallet) => {\n return wallet.walletType;\n })\n );\n\n return KEPLR_COMPATIBLE_WALLETS.filter((compatibleWallet) =>\n connectedWalletTypes.has(compatibleWallet)\n );\n};\n\nexport function formatBalance(balance: Balance | null): Balance | null {\n const formattedBalance: Balance | null = balance\n ? {\n ...balance,\n amount: numberToString(\n balance.amount,\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n ),\n usdValue: numberToString(\n balance.usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n }\n : null;\n\n return formattedBalance;\n}\n\nexport function compareTokenBalance(\n token1Balance: Balance | null,\n token2Balance: Balance | null\n): number {\n if (token1Balance?.usdValue || token2Balance?.usdValue) {\n return (\n parseFloat(token2Balance?.usdValue || '0') -\n parseFloat(token1Balance?.usdValue || '0')\n );\n }\n\n if (token1Balance?.amount || token2Balance?.amount) {\n return (\n parseFloat(token2Balance?.amount || '0') -\n parseFloat(token1Balance?.amount || '0')\n );\n }\n\n return 0;\n}\n\nexport function areTokensEqual(\n tokenA: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null,\n tokenB: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null\n) {\n return (\n tokenA?.blockchain === tokenB?.blockchain &&\n tokenA?.symbol.toLowerCase() === tokenB?.symbol.toLowerCase() &&\n tokenA?.address?.toLowerCase() === tokenB?.address?.toLowerCase()\n );\n}\n\nexport function sortWalletsBasedOnConnectionState(\n wallets: WalletInfoWithExtra[]\n): WalletInfoWithExtra[] {\n return wallets.sort(\n (a, b) =>\n Number(b.state === WalletStatus.CONNECTED) -\n Number(a.state === WalletStatus.CONNECTED) ||\n Number(\n b.state === WalletStatus.DISCONNECTED ||\n b.state === WalletStatus.CONNECTING\n ) -\n Number(\n a.state === WalletStatus.DISCONNECTED ||\n a.state === WalletStatus.CONNECTING\n )\n );\n}\n\nexport function getConciseAddress(\n address: string,\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n maxChars = 8,\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n ellipsisLength = 3\n): string {\n if (address.length < 2 * maxChars + ellipsisLength) {\n return address;\n }\n const start = address.slice(0, maxChars);\n const end = address.slice(-maxChars);\n return `${start}${'.'.repeat(ellipsisLength)}${end}`;\n}\n\nexport function getAddress({\n chain,\n connectedWallets,\n walletType,\n}: {\n connectedWallets: ConnectedWallet[];\n walletType: string;\n chain: string;\n}): string | undefined {\n return connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.chain === chain\n )?.address;\n}\n\nexport function makeTokensBalance(connectedWallets: ConnectedWallet[]) {\n return connectedWallets\n .flatMap((wallet) => wallet.balances)\n .reduce((balances: TokensBalance, balance) => {\n const currentBalance = {\n amount: balance?.amount ?? '',\n decimals: balance?.decimal ?? 0,\n usdValue: balance?.usdPrice\n ? new BigNumber(balance?.usdPrice ?? ZERO)\n .multipliedBy(balance?.amount)\n .toString()\n : '',\n };\n\n const tokenHash = balance\n ? createTokenHash({\n symbol: balance.symbol,\n blockchain: balance.chain,\n address: balance.address,\n })\n : null;\n\n const prevBalance = tokenHash ? balances[tokenHash] : null;\n\n const shouldUpdateBalance =\n tokenHash &&\n (!prevBalance ||\n (prevBalance && prevBalance.amount < currentBalance.amount));\n\n if (shouldUpdateBalance) {\n balances[tokenHash] = currentBalance;\n }\n\n return balances;\n }, {});\n}\n\nexport const isFetchingBalance = (\n connectedWallets: ConnectedWallet[],\n blockchain: string\n) =>\n !!connectedWallets.find(\n (wallet) => wallet.chain === blockchain && wallet.loading\n );\n\nexport function hashWalletsState(walletsInfo: ModalWalletInfo[]) {\n return walletsInfo.map((w) => w.state).join('-');\n}\n\nexport function filterBlockchainsByWalletTypes(\n wallets: ModalWalletInfo[],\n blockchains: BlockchainMeta[]\n) {\n const uniqueBlockchainTypes = new Set<TransactionType>();\n wallets.forEach((wallet) => {\n wallet.blockchainTypes.forEach((type) => {\n uniqueBlockchainTypes.add(type);\n });\n });\n const filteredBlockchains = blockchains.filter((blockchain) =>\n uniqueBlockchainTypes.has(blockchain.type)\n );\n\n return filteredBlockchains;\n}\n\nexport function filterWalletsByCategory(\n wallets: WalletInfoWithExtra[],\n category: string\n) {\n if (category === BlockchainCategories.ALL) {\n return wallets;\n }\n\n return wallets.filter((wallet) => {\n for (const type of wallet.blockchainTypes) {\n if (isBlockchainTypeInCategory(type, category)) {\n return true;\n }\n }\n return false;\n });\n}\n", "import BigNumber from 'bignumber.js';\n\nexport const ZERO = new BigNumber(0);\n", "import { WalletTypes } from '@rango-dev/wallets-shared';\n\nexport const EXCLUDED_WALLETS = [WalletTypes.LEAP];\n", "import type { WalletInfoWithExtra } from '../types';\nimport type { Token } from 'rango-sdk';\n\nimport { BlockchainCategories, WalletState } from '@rango-dev/ui';\nimport { TransactionType } from 'rango-sdk';\n\nimport { WIDGET_UI_ID } from '../constants';\nimport { SUPPORTED_FONTS } from '../constants/fonts';\nimport {\n MIN_LENGTH_SYMBOL_CONTAINS,\n MIN_LENGTH_SYMBOL_START_WITH,\n MIN_LENGTH_TOKEN_ADDRESS_CONTAINS,\n MIN_LENGTH_TOKEN_NAME_CONTAINS,\n MIN_LENGTH_TOKEN_NAME_EXACT_MATCH,\n} from '../constants/searchFor';\n\nexport function removeDuplicateFrom<T>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function areEqual(\n array1: (number | string)[],\n array2: (number | string)[]\n) {\n return (\n array1.length === array2.length && array1.every((v, i) => v === array2[i])\n );\n}\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function debounce(fn: Function, time: number) {\n let timeoutId: ReturnType<typeof setTimeout> | null;\n return wrapper;\n function wrapper(...args: any) {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n timeoutId = null;\n fn(...args);\n }, time);\n }\n}\n\nexport function containsText(text: string, searchText: string): boolean {\n // eslint-disable-next-line @typescript-eslint/no-magic-numbers\n return text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n}\n\nexport function exactText(text: string, searchText: string): boolean {\n return text.toLowerCase() === searchText.toLowerCase();\n}\n\nexport function startWithText(text: string, searchText: string): boolean {\n return text.toLowerCase().startsWith(searchText.toLowerCase());\n}\n\nexport const getContainer = () =>\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) as HTMLElement;\n\nexport const getExpanded = () =>\n document.getElementById(WIDGET_UI_ID.EXPANDED_BOX_ID) as HTMLElement;\n\nfunction compareExactMatchText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const exactMatchA = !!textA && exactText(textA, searchFor);\n const exactMatchB = !!textB && exactText(textB, searchFor);\n if (exactMatchA !== exactMatchB) {\n return exactMatchA ? -1 : 1;\n }\n\n return 0;\n}\n\nfunction compareContainsText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const textContainsA = !!textA && containsText(textA, searchFor);\n const textContainsB = !!textB && containsText(textB, searchFor);\n if (textContainsA !== textContainsB) {\n return textContainsA ? -1 : 1;\n }\n\n // If both texts contains the searched term, The shorter one has priority\n if (textContainsA && textContainsB && textA?.length !== textB?.length) {\n return textA?.length - textB?.length;\n }\n\n return 0;\n}\n\nfunction compareStartWithText(\n searchFor: string,\n textA: string | null,\n textB: string | null\n) {\n const textStartWithA = !!textA && startWithText(textA, searchFor);\n const textStartWithB = !!textB && startWithText(textB, searchFor);\n if (textStartWithA !== textStartWithB) {\n return textStartWithA ? -1 : 1;\n }\n\n // If both texts start with the searched term, The shorter one has priority\n if (textStartWithA && textStartWithB && textA?.length !== textB?.length) {\n return textA?.length - textB?.length;\n }\n\n return 0;\n}\n\nexport function compareWithSearchFor(\n tokenA: Token,\n tokenB: Token,\n searchFor?: string\n): number {\n if (!searchFor) {\n return 0;\n }\n\n // 1: Check the order to exact match the symbol\n const symbolExactMatchCompare = compareExactMatchText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n if (symbolExactMatchCompare) {\n return symbolExactMatchCompare;\n }\n\n // 2: Check the order to exact match the token name\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_EXACT_MATCH) {\n const tokenNameExactMatchCompare = compareExactMatchText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n if (tokenNameExactMatchCompare) {\n return tokenNameExactMatchCompare;\n }\n }\n\n // 3: Check symbol start with searchFor\n if (searchFor.length >= MIN_LENGTH_SYMBOL_START_WITH) {\n const symbolStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n\n if (symbolStartWithCompare) {\n return symbolStartWithCompare;\n }\n }\n\n // 4: Check symbol Contains searchFor\n if (searchFor.length >= MIN_LENGTH_SYMBOL_CONTAINS) {\n const symbolContainsCompare = compareContainsText(\n searchFor,\n tokenA.symbol,\n tokenB.symbol\n );\n\n if (symbolContainsCompare) {\n return symbolContainsCompare;\n }\n }\n\n // 5: Check token name start with searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_CONTAINS) {\n const tokenNameStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n\n if (tokenNameStartWithCompare) {\n return tokenNameStartWithCompare;\n }\n }\n\n // 6: Check token name Contains searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_CONTAINS) {\n const tokenNameContainsCompare = compareContainsText(\n searchFor,\n tokenA.name,\n tokenB.name\n );\n\n if (tokenNameContainsCompare !== 0) {\n return tokenNameContainsCompare;\n }\n }\n\n // 7: Check address start with searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_ADDRESS_CONTAINS) {\n const addressStartWithCompare = compareStartWithText(\n searchFor,\n tokenA.address,\n tokenB.address\n );\n\n if (addressStartWithCompare) {\n return addressStartWithCompare;\n }\n }\n\n // 8: Check address Contains searchFor\n if (searchFor.length >= MIN_LENGTH_TOKEN_ADDRESS_CONTAINS) {\n const addressContainCompare = compareContainsText(\n searchFor,\n tokenA.address,\n tokenB.address\n );\n\n if (addressContainCompare !== 0) {\n return addressContainCompare;\n }\n }\n\n return 0;\n}\n\nexport const isBlockchainTypeInCategory = (\n blockchainType: TransactionType,\n category: string\n): boolean => {\n switch (category) {\n case BlockchainCategories.ALL:\n return true;\n case BlockchainCategories.UTXO:\n return blockchainType === TransactionType.TRANSFER;\n case BlockchainCategories.OTHER:\n return (\n blockchainType !== TransactionType.TRANSFER &&\n blockchainType !== TransactionType.COSMOS &&\n blockchainType !== TransactionType.EVM\n );\n default:\n return blockchainType === category;\n }\n};\n\nexport const getFontUrlByName = (fontName: string) => {\n const font = SUPPORTED_FONTS.find((font) => font.value === fontName);\n return font?.url;\n};\n\nexport function isSingleWalletActive(\n wallets: WalletInfoWithExtra[],\n multiWallets?: boolean\n) {\n const atLeastOneWalletIsConnected = !!wallets.find(\n (w) => w.state === WalletState.CONNECTED\n );\n return multiWallets === false && atLeastOneWalletIsConnected;\n}\n", "export const DEFAULT_FONT_FAMILY = 'Roboto';\n\nexport const SUPPORTED_FONTS = [\n {\n name: 'Roboto',\n value: 'Roboto',\n url: '',\n },\n {\n name: 'Times New Roman',\n value: 'Times New Roman',\n url: 'https://fonts.cdnfonts.com/css/times-new-roman',\n },\n {\n name: 'Arial',\n value: 'Arial',\n url: '',\n },\n {\n name: 'Open Sans',\n value: 'Open Sans',\n url: 'https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&display=swap',\n },\n {\n name: 'Noto Sans',\n value: 'Noto Sans',\n url: 'https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap',\n },\n {\n name: 'Montserrat',\n value: 'Montserrat',\n url: 'https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap',\n },\n {\n name: 'Poppins',\n value: 'Poppins',\n url: 'https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap',\n },\n {\n name: 'Roboto Condensed',\n value: 'Roboto Condensed',\n url: 'https://fonts.googleapis.com/css2?family=Roboto+Condensed:ital,wght@0,100..900;1,100..900&display=swap',\n },\n\n {\n name: 'Roboto Mono',\n value: 'Roboto Mono',\n url: 'https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap',\n },\n {\n name: 'Oswald',\n value: 'Oswald',\n url: 'https://fonts.googleapis.com/css2?family=Oswald:wght@200..700&display=swap',\n },\n {\n name: 'Raleway',\n value: 'Raleway',\n url: 'https://fonts.googleapis.com/css2?family=Raleway:ital,wght@0,100..900;1,100..900&display=swap',\n },\n {\n name: 'Sedan',\n value: 'Sedan',\n url: 'https://fonts.googleapis.com/css2?family=Sedan:ital@0;1&display=swap',\n },\n {\n name: 'Inter',\n value: 'Inter',\n url: 'https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap',\n },\n {\n name: 'Rubik',\n value: 'Rubik',\n url: 'https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,300..900;1,300..900&display=swap',\n },\n {\n name: 'Lora',\n value: 'Lora',\n url: 'https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,400..700;1,400..700&display=swap',\n },\n {\n name: 'Barlow Condensed',\n value: 'Barlow Condensed',\n url: 'https://fonts.googleapis.com/css2?family=Barlow+Condensed:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap',\n },\n];\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n\nimport type { BestRouteResponse } from 'rango-sdk';\n\nimport { BigNumber } from 'bignumber.js';\n\n/*\n * if time > 1h -> rounded with 5 minutes precision\n * if time < 1h -> rounded with 15 seconds precision\n */\nexport const roundedSecondsToString = (s: number): string => {\n const seconds = Math.floor((s % 60) / 15) * 15;\n const minutes = parseInt((s / 60).toString());\n if (minutes >= 60) {\n return `${Math.floor(minutes / 5) * 5}:00`;\n }\n return `${minutes.toString().padStart(2, '0')}:${seconds\n .toString()\n .padStart(2, '0')}`;\n};\n\nexport const numberToString = (\n number: BigNumber | string | number | null | undefined,\n minDecimals: number | null = null,\n maxDecimals: number | null = null\n): string => {\n if (number === null || number === undefined) {\n return '';\n }\n if (number === '') {\n return '';\n }\n const n = new BigNumber(number);\n const roundingMode = 1;\n let maxI = 1000;\n for (let i = 0; i < 60; i++) {\n if (new BigNumber(n.toFixed(i, roundingMode)).eq(n)) {\n maxI = i;\n break;\n }\n }\n\n if (n.gte(10000)) {\n return n.toFormat(0, roundingMode);\n }\n if (n.gte(1000)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n }\n if (n.gte(100)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 1))\n ),\n roundingMode\n );\n }\n if (n.gte(1)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 2))\n ),\n roundingMode\n );\n }\n if (n.gte(0.01)) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 4))\n ),\n roundingMode\n );\n }\n for (let i = minDecimals || 4; i < 17; i++) {\n if (n.gte(Math.pow(10, -i))) {\n return n.toFormat(\n Math.min(\n maxI,\n Math.min(maxDecimals || 100, Math.max(minDecimals || 0, i))\n ),\n roundingMode\n );\n }\n }\n if (n.isEqualTo(0)) {\n return '0';\n }\n\n return n.toFormat(\n Math.min(maxI, Math.min(maxDecimals || 100, Math.max(minDecimals || 0, 8))),\n roundingMode\n );\n};\n\nexport const uint8ArrayToHex = (buffer: Uint8Array): string => {\n // buffer is an ArrayBuffer\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return [...buffer].map((x) => x.toString(16).padStart(2, '0')).join('');\n};\n\nexport const totalArrivalTime = (\n data: { estimatedTimeInSeconds: number | null }[] | undefined\n) => data?.reduce((a, b) => a + (b.estimatedTimeInSeconds ?? 0), 0) || 0;\n\nexport const rawFees = (data: BestRouteResponse): string =>\n (\n data?.result?.swaps?.flatMap((s) =>\n s.fee.map((f) => ({ swapperId: s.swapperId, fee: f }))\n ) || []\n )\n .reduce((partialSum, a) => partialSum + parseFloat(a.fee.amount), 0)\n .toFixed(3);\n\nexport const containsText = (text: string, searchText: string) =>\n text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;\n\nexport const isPositiveNumber = (text?: string) =>\n !!text && parseFloat(text) > 0;\n", "import type { Tokens, WidgetVariant } from '../types';\nimport type { Asset, BlockchainMeta, Token } from 'rango-sdk';\n\nimport { RANGO_PUBLIC_API_KEY } from '../constants';\n\nimport { areTokensEqual } from './wallets';\n\nexport interface Configs {\n API_KEY: string;\n BASE_URL?: string;\n}\n\ntype TokensConfig =\n | Asset[]\n | {\n [blockchain: string]: Tokens;\n };\n\nlet configs: Configs = {\n API_KEY: RANGO_PUBLIC_API_KEY,\n};\n\nexport function getConfig(name: keyof Configs) {\n return configs[name] || '';\n}\n\nexport function setConfig(name: keyof Configs, value: any) {\n configs[name] = value;\n\n return value;\n}\n\n/**\n * Getting new configs from params and reset the value of global `configs` with provided param.\n */\nexport function initConfig(nextConfigs: Configs) {\n let clonedConfigs;\n if (typeof structuredClone === 'function') {\n clonedConfigs = structuredClone(nextConfigs);\n } else {\n clonedConfigs = JSON.parse(JSON.stringify(nextConfigs));\n }\n configs = clonedConfigs;\n return configs;\n}\n\nexport const DEFAULT_PRIMARY_RADIUS = 20;\nexport const DEFAULT_SECONDARY_RADIUS = 25;\n\nexport const THEME_CLASS_NAME_PREFIX = `theme-widget`;\n\nexport const isTokenExcludedInConfig = (\n token: Token | null,\n tokensConfig?: TokensConfig\n) => {\n let result = false;\n if (tokensConfig && token) {\n if (Array.isArray(tokensConfig)) {\n result = !tokensConfig.some((asset) => areTokensEqual(asset, token));\n } else if (!Array.isArray(tokensConfig) && tokensConfig[token.blockchain]) {\n result = tokensConfig[token.blockchain].tokens.some((asset) =>\n areTokensEqual(asset, token)\n );\n const isExcluded = tokensConfig[token.blockchain].isExcluded;\n return (!isExcluded && !result) || (isExcluded && result);\n }\n }\n return result;\n};\n\nexport const isBlockchainExcludedInConfig = (\n blockchain: BlockchainMeta | null,\n blockchainsConfig?: string[]\n) => {\n return (\n blockchain &&\n blockchainsConfig &&\n !blockchainsConfig.includes(blockchain.name)\n );\n};\n\nexport const isVariantExpandable = (\n isLargeScreen: boolean,\n isExtraLargeScreen: boolean,\n variant?: WidgetVariant\n) => {\n return (\n (variant === 'expanded' && (isLargeScreen || isExtraLargeScreen)) ||\n (variant === 'full-expanded' && isExtraLargeScreen)\n );\n};\n", "import type { Features } from '../types';\nimport type { SwapperMeta, SwapperType, Token } from 'rango-sdk';\n\nimport { removeDuplicateFrom } from './common';\n\nexport type UniqueSwappersGroupType = {\n id: string;\n groupTitle: string;\n logo: string;\n type: SwapperType;\n selected: boolean;\n};\n\nexport function getUniqueSwappersGroups(\n swappers: SwapperMeta[],\n disabledLiquiditySources: string[]\n): UniqueSwappersGroupType[] {\n const supportedSwappers = swappers.map((swapper) => swapper.swapperGroup);\n\n const uniqueSupportedSwappersGroups: Array<UniqueSwappersGroupType> = [];\n\n const uniqueGroup = removeDuplicateFrom(swappers.map((s) => s.swapperGroup));\n\n uniqueGroup.map((uniqueGroupItem) => {\n const swapperItem = swappers.find(\n (swapper) => swapper.swapperGroup === uniqueGroupItem\n );\n\n if (swapperItem) {\n let isSupportedSwapper = true;\n if (supportedSwappers) {\n isSupportedSwapper = supportedSwappers.some(\n (supportedItem) => supportedItem === swapperItem.swapperGroup\n );\n }\n\n if (isSupportedSwapper) {\n swapperItem.types.map((swapperTypeItem) => {\n uniqueSupportedSwappersGroups.push({\n id: swapperItem.swapperGroup,\n groupTitle: swapperItem.swapperGroup,\n logo: swapperItem.logo,\n type: swapperTypeItem,\n selected: !disabledLiquiditySources.includes(\n swapperItem.swapperGroup\n ),\n });\n });\n }\n }\n });\n\n return uniqueSupportedSwappersGroups;\n}\n\nexport function sortLiquiditySourcesByGroupTitle(\n a: SwapperMeta,\n b: SwapperMeta\n) {\n if (a.swapperGroup < b.swapperGroup) {\n return -1;\n }\n\n if (a.swapperGroup > b.swapperGroup) {\n return 1;\n }\n\n return 0;\n}\n\nexport function isFeatureHidden(feature: keyof Features, features?: Features) {\n return features?.[feature] === 'hidden';\n}\n\nexport function isFeatureEnabled(feature: keyof Features, features?: Features) {\n return features?.[feature] === 'enabled';\n}\n\nexport const addCustomTokensToSupportedTokens = (\n supportedTokens: Token[],\n customTokens: Token[],\n features?: Features\n) => {\n const isCustomTokensHidden = isFeatureHidden('customTokens', features);\n\n return isCustomTokensHidden\n ? supportedTokens\n : supportedTokens.concat(customTokens);\n};\n", "// We keep all the received data from server in this slice\n\nimport type { ConfigSlice } from './config';\nimport type { SettingsSlice } from './settings';\nimport type { CachedEntries } from '../../services/cacheService';\nimport type { Balance, Blockchain, TokenHash } from '../../types';\nimport type { StateCreator } from 'zustand';\n\nimport {\n type Asset,\n type BlockchainMeta,\n type SwapperMeta,\n type Token,\n} from 'rango-sdk';\n\nimport { ACTIVE_BLOCKCHAINS_FOR_CUSTOM_TOKENS } from '../../constants/customTokens';\nimport { cacheService } from '../../services/cacheService';\nimport { httpService as sdk } from '../../services/httpService';\nimport { compareWithSearchFor, containsText } from '../../utils/common';\nimport { createTokenHash, isTokenNative } from '../../utils/meta';\nimport {\n addCustomTokensToSupportedTokens,\n sortLiquiditySourcesByGroupTitle,\n} from '../../utils/settings';\nimport { areTokensEqual, compareTokenBalance } from '../../utils/wallets';\nimport {\n getSupportedBlockchainsFromConfig,\n matchTokensFromConfigWithMeta,\n} from '../utils';\n\ntype BlockchainOptions = {\n type?: 'source' | 'destination' | 'custom-token';\n};\n\ntype TokenOptions = {\n type: 'source' | 'destination';\n // filter by an specific blockchain\n blockchain?: string;\n searchFor?: string;\n getBalanceFor?: (token: Token) => Balance | null;\n};\n\nexport type FindToken = (asset: Asset) => Token | undefined;\n\nexport type FetchStatus = 'loading' | 'success' | 'failed';\nexport interface DataSlice {\n _blockchainsMapByName: Map<string, BlockchainMeta>;\n _tokensMapByTokenHash: Map<TokenHash, Token>;\n _tokensMapByBlockchainName: Record<Blockchain, TokenHash[]>;\n _popularTokens: Token[];\n _swappers: SwapperMeta[];\n fetchStatus: FetchStatus;\n blockchains: (options?: BlockchainOptions) => BlockchainMeta[];\n tokens: (options?: TokenOptions) => Token[];\n swappers: () => SwapperMeta[];\n isTokenPinned: (token: Token, type: 'source' | 'destination') => boolean;\n findToken: FindToken;\n fetch: () => Promise<void>;\n}\n\nexport const createDataSlice: StateCreator<\n DataSlice & ConfigSlice & SettingsSlice,\n [],\n [],\n DataSlice\n> = (set, get) => ({\n // State\n _blockchainsMapByName: new Map(),\n _tokensMapByTokenHash: new Map(),\n _tokensMapByBlockchainName: {},\n _popularTokens: [],\n _swappers: [],\n fetchStatus: 'loading',\n // Selectors\n blockchains: (options) => {\n const blockchainsMapByName = get()._blockchainsMapByName;\n const blockchainsFromState = Array.from(\n blockchainsMapByName?.values() || []\n );\n\n if (!options || !options?.type) {\n return blockchainsFromState;\n }\n const config = get().config;\n\n if (options.type === 'custom-token') {\n const supportedBlockchainsFromConfig = getSupportedBlockchainsFromConfig({\n config,\n });\n\n let supportedBlockchains: BlockchainMeta[] = blockchainsFromState;\n\n /*\n * Supported blockchains can be configured and be limited.\n * In this case, we only keep those active blockchains which exist in config.\n */\n if (supportedBlockchainsFromConfig.length > 0) {\n supportedBlockchains = supportedBlockchains.filter((blockchain) =>\n supportedBlockchainsFromConfig.includes(blockchain.name)\n );\n }\n\n return supportedBlockchains.filter((blockchain) =>\n ACTIVE_BLOCKCHAINS_FOR_CUSTOM_TOKENS.includes(blockchain.type)\n );\n }\n\n const supportedBlockchainsFromConfig =\n (options.type === 'source'\n ? config.from?.blockchains\n : config.to?.blockchains) ?? [];\n\n const list = blockchainsFromState.filter((blockchain) => {\n if (\n supportedBlockchainsFromConfig.length > 0 &&\n !supportedBlockchainsFromConfig.includes(blockchain.name)\n ) {\n return false;\n }\n\n return true;\n });\n\n return list;\n },\n tokens: (options) => {\n const {\n _tokensMapByTokenHash,\n _tokensMapByBlockchainName,\n config,\n _customTokens,\n } = get();\n const tokensFromState = Array.from(_tokensMapByTokenHash.values());\n const blockchainsMapByName = get()._blockchainsMapByName;\n if (!options || !options.type) {\n return tokensFromState;\n }\n\n const configType = options.type === 'source' ? 'from' : 'to';\n const cacheKey: keyof CachedEntries =\n options.type === 'source'\n ? 'supportedSourceTokens'\n : 'supportedDestinationTokens';\n\n let supportedTokens = cacheService.get(cacheKey);\n if (!supportedTokens?.length) {\n supportedTokens = matchTokensFromConfigWithMeta({\n type: options.type,\n config: {\n blockchains: config[configType]?.blockchains,\n tokens: config[configType]?.tokens,\n },\n meta: {\n tokensMapByTokenHash: _tokensMapByTokenHash,\n tokensMapByBlockchainName: _tokensMapByBlockchainName,\n },\n });\n cacheService.set(cacheKey, supportedTokens);\n }\n\n supportedTokens = addCustomTokensToSupportedTokens(\n supportedTokens,\n _customTokens,\n config.features\n );\n\n const blockchains = get().blockchains({\n type: options.type,\n });\n\n const list = supportedTokens\n .filter((token) => {\n // If a specific blockchain has passed, we only keep that blockchain's tokens.\n if (!!options.blockchain && token.blockchain !== options.blockchain) {\n return false;\n }\n\n // Check only available blockchains\n if (\n !blockchains.some((blockchain) => {\n return blockchain.name === token.blockchain;\n })\n ) {\n return false;\n }\n\n // Search functionality\n if (options.searchFor) {\n if (\n containsText(token.symbol, options.searchFor) ||\n containsText(token.address || '', options.searchFor) ||\n containsText(token.name || '', options.searchFor)\n ) {\n return true;\n }\n\n return false;\n }\n\n return true;\n })\n .sort((tokenA, tokenB) => {\n //1. sort by pinned tokens\n const isToken1Pinned = get().isTokenPinned(tokenA, options.type);\n const isToken2Pinned = get().isTokenPinned(tokenB, options.type);\n if (isToken1Pinned !== isToken2Pinned) {\n return isToken1Pinned ? -1 : 1;\n }\n\n //2. sort by balance\n if (options.getBalanceFor) {\n const token1Balance = options.getBalanceFor(tokenA);\n const token2Balance = options.getBalanceFor(tokenB);\n const balanceCompare = compareTokenBalance(\n token1Balance,\n token2Balance\n );\n if (balanceCompare !== 0) {\n return balanceCompare;\n }\n }\n\n const blockChainA = blockchainsMapByName.get(tokenA.blockchain);\n const blockChainB = blockchainsMapByName.get(tokenB.blockchain);\n\n //3. sort by native token\n const isNativeTokenA = isTokenNative(tokenA, blockChainA);\n const isNativeTokenB = isTokenNative(tokenB, blockChainB);\n if (isNativeTokenA !== isNativeTokenB) {\n return isNativeTokenA ? -1 : 1;\n }\n\n //4. sort by token popularity\n if (tokenA.isPopular !== tokenB.isPopular) {\n return tokenA.isPopular ? -1 : 1;\n }\n\n //5. sort by search phrase\n if (options.searchFor) {\n const symbolSearchForCompare = compareWithSearchFor(\n tokenA,\n tokenB,\n options.searchFor\n );\n if (symbolSearchForCompare) {\n return symbolSearchForCompare;\n }\n }\n\n //6. sort by token isSecondary\n if (tokenA.isSecondaryCoin !== tokenB.isSecondaryCoin) {\n return tokenA.isSecondaryCoin ? 1 : -1;\n }\n\n //7. sort by blockchain order\n if (!!blockChainA && !!blockChainB) {\n return blockChainA.sort - blockChainB.sort;\n }\n\n return 0;\n });\n\n return list;\n },\n findToken: (asset) => {\n const tokensMapByHashToken = get()._tokensMapByTokenHash;\n const customTokens = get().customTokens();\n const tokenHash = createTokenHash(asset);\n let token = tokensMapByHashToken.get(tokenHash);\n if (!token) {\n token = customTokens.find(\n (customToken) => createTokenHash(customToken) === tokenHash\n );\n }\n return token;\n },\n isTokenPinned: (token, type) => {\n const pinnedTokens =\n type === 'source'\n ? get().config.from?.pinnedTokens\n : get().config.to?.pinnedTokens;\n const pinned = !!pinnedTokens?.some((pinnedToken) =>\n areTokensEqual(pinnedToken, token)\n );\n return pinned;\n },\n swappers: () => {\n const { config, campaignMode } = get();\n\n const campaignModeLiquiditySource = campaignMode.liquiditySources?.length\n ? campaignMode.liquiditySources\n : null;\n\n const liquiditySources =\n campaignModeLiquiditySource ?? config.liquiditySources;\n\n const excludeLiquiditySources = campaignModeLiquiditySource\n ? false\n : config.excludeLiquiditySources;\n\n /*\n * If the excludeLiquiditySources flag is set to true, we return all swappers that are not included in the config.\n * Otherwise, we return all swappers that are included in the config.\n */\n const swappers = get()._swappers.filter((swapper) => {\n const swapperGroupIncludedInLiquiditySources = liquiditySources?.includes(\n swapper.swapperGroup\n );\n\n const shouldExcludeLiquiditySources =\n excludeLiquiditySources ||\n !liquiditySources ||\n liquiditySources.length === 0;\n\n return shouldExcludeLiquiditySources\n ? !swapperGroupIncludedInLiquiditySources\n : swapperGroupIncludedInLiquiditySources;\n });\n\n const sortedSwappers = swappers.sort(sortLiquiditySourcesByGroupTitle);\n\n return sortedSwappers;\n },\n // Actions\n fetch: async () => {\n try {\n const { enableCentralizedSwappers } = get().config;\n const response = await sdk().getAllMetadata({\n enableCentralizedSwappers,\n });\n set({ fetchStatus: 'success' });\n const blockchainsMapByName: Map<string, BlockchainMeta> = new Map<\n string,\n BlockchainMeta\n >();\n\n const tokensMapByTokenHash: Map<TokenHash, Token> = new Map<\n TokenHash,\n Token\n >();\n const tokensMapByBlockchainName: DataSlice['_tokensMapByBlockchainName'] =\n {};\n const tokens: Token[] = [];\n const popularTokens: Token[] = response.popularTokens;\n const swappers: SwapperMeta[] = response.swappers;\n\n const blockchainsWithAtLeastOneToken = new Set();\n\n response.tokens.forEach((token) => {\n blockchainsWithAtLeastOneToken.add(token.blockchain);\n\n tokens.push(token);\n });\n\n const sortedBlockchain = response.blockchains.sort(\n (a, b) => a.sort - b.sort\n );\n\n sortedBlockchain.forEach((blockchain) => {\n if (\n blockchain.enabled &&\n blockchainsWithAtLeastOneToken.has(blockchain.name)\n ) {\n blockchainsMapByName.set(blockchain.name, blockchain);\n }\n });\n\n tokens.forEach((token) => {\n const tokenHash = createTokenHash(token);\n if (!tokensMapByBlockchainName[token.blockchain]) {\n tokensMapByBlockchainName[token.blockchain] = [];\n }\n tokensMapByTokenHash.set(tokenHash, token);\n tokensMapByBlockchainName[token.blockchain].push(tokenHash);\n });\n\n set({\n _blockchainsMapByName: blockchainsMapByName,\n _tokensMapByTokenHash: tokensMapByTokenHash,\n _tokensMapByBlockchainName: tokensMapByBlockchainName,\n _popularTokens: popularTokens,\n _swappers: swappers,\n });\n } catch (error) {\n set({ fetchStatus: 'failed' });\n throw error;\n }\n },\n});\n", "import type { FlagPropTypes, Language } from '@rango-dev/ui';\n\nimport {\n Chinese,\n English,\n Finland,\n French,\n German,\n Greece,\n Italian,\n Japanese,\n Netherlands,\n Poland,\n Portuguese,\n Russian,\n Spanish,\n Swedish,\n Ukrainian,\n} from '@rango-dev/ui';\n\nexport type LanguageItem = {\n title: string;\n label: string;\n local: Language;\n SVGFlag: React.ComponentType<FlagPropTypes>;\n};\n\nexport const LANGUAGES: LanguageItem[] = [\n { title: 'English', label: 'English', local: 'en', SVGFlag: English },\n { title: 'Spanish', label: 'Espa\u00F1ol', local: 'es', SVGFlag: Spanish },\n { title: 'French', label: 'Fran\u00E7ais', local: 'fr', SVGFlag: French },\n { title: 'Japanese', label: '\u65E5\u672C\u8A9E', local: 'ja', SVGFlag: Japanese },\n { title: 'Portuguese', label: 'Portugu\u00EAs', local: 'pt', SVGFlag: Portuguese },\n { title: 'Chinese', label: '\u4E2D\u56FD\u4EBA', local: 'zh', SVGFlag: Chinese },\n { title: 'Russian', label: '\u0420\u0443\u0441\u0441\u043A\u0438\u0439', local: 'ru', SVGFlag: Russian },\n { title: 'German', label: 'Deutsch', local: 'de', SVGFlag: German },\n { title: 'Ukrainian', label: '\u0423\u043A\u0440\u0430\u0457\u043D\u0456', local: 'uk', SVGFlag: Ukrainian },\n { title: 'Swedish', label: 'svenska', local: 'sv', SVGFlag: Swedish },\n { title: 'Finnish', label: 'Suomalainen', local: 'fi', SVGFlag: Finland },\n { title: 'Dutch', label: 'Nederlands', local: 'nl', SVGFlag: Netherlands },\n { title: 'Greek', label: 'Grieks', local: 'el', SVGFlag: Greece },\n { title: 'Italian', label: 'Italiana', local: 'it', SVGFlag: Italian },\n { title: 'Polish', label: 'Polski', local: 'pl', SVGFlag: Poland },\n];\n\nexport const DEFAULT_LANGUAGE = 'en';\n", "const LOW = 0.5;\nconst MEDIUM = 1;\nconst HIGH = 3;\n\nexport const SLIPPAGES = [LOW, MEDIUM, HIGH];\n\nexport const DEFAULT_SLIPPAGE = 1;\n\nexport const HIGH_SLIPPAGE = 5;\n\nexport const MAX_SLIPPAGE = 100;\n\nexport const MIN_SLIPPGAE = 0;\n", "import type { ConfigSlice } from './config';\nimport type { DataSlice } from './data';\nimport type { WidgetConfig } from '../../types';\nimport type { SwapperMeta, Token } from 'rango-sdk';\nimport type { StateCreator } from 'zustand';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { BLOCKCHAIN_LIST_SIZE } from '../../constants/configs';\nimport { DEFAULT_LANGUAGE } from '../../constants/languages';\nimport { DEFAULT_SLIPPAGE } from '../../constants/swapSettings';\nimport { removeDuplicateFrom } from '../../utils/common';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { getSupportedBlockchainsFromConfig } from '../utils';\n\nexport type ThemeMode = 'auto' | 'dark' | 'light';\n\nexport interface SettingsSlice {\n theme: ThemeMode;\n language: Language | null;\n disabledLiquiditySources: string[];\n /** Keeping a history of blockchains that user has selected (in Swap process) */\n preferredBlockchains: string[];\n slippage: number;\n customSlippage: number | null;\n infiniteApprove: boolean;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n _customTokens: Token[];\n\n setSlippage: (slippage: number) => void;\n setCustomSlippage: (customSlippage: number | null) => void;\n toggleInfiniteApprove: () => void;\n toggleLiquiditySource: (name: string) => void;\n setTheme: (theme: ThemeMode) => void;\n setLanguage: (language: Language | null) => void;\n toggleAllLiquiditySources: (\n swappers: SwapperMeta[],\n shouldReset?: boolean\n ) => void;\n setAffiliateRef: (affiliateRef: string | null) => void;\n setAffiliatePercent: (affiliatePercent: number | null) => void;\n setAffiliateWallets: (\n affiliateWallets: { [key: string]: string } | null\n ) => void;\n addPreferredBlockchain: (blockchain: string) => void;\n updateSettings: (config: WidgetConfig) => void;\n setCustomToken: (token: Token) => void;\n deleteCustomToken: (token: Token) => void;\n customTokens: () => Token[];\n}\n\nexport const createSettingsSlice: StateCreator<\n SettingsSlice & DataSlice & ConfigSlice,\n [],\n [],\n SettingsSlice\n> = (set, get) => ({\n disabledLiquiditySources: [],\n theme: 'auto',\n language: null,\n preferredBlockchains: [],\n slippage: DEFAULT_SLIPPAGE,\n customSlippage: null,\n infiniteApprove: false,\n affiliateRef: null,\n affiliatePercent: null,\n affiliateWallets: null,\n _customTokens: [],\n\n addPreferredBlockchain: (blockchain) => {\n const currentPreferredBlockchains = get().preferredBlockchains;\n\n const noNeedToDoAnything = currentPreferredBlockchains.find(\n (preferredBlockchain, index) => {\n const isSameBlockchain = preferredBlockchain === blockchain;\n const isInVisibleList = index <= BLOCKCHAIN_LIST_SIZE - 1;\n\n return isSameBlockchain && isInVisibleList;\n }\n );\n\n if (noNeedToDoAnything) {\n return;\n }\n\n const nextPreferredBlockchains: string[] =\n currentPreferredBlockchains.filter((preferredBlockchain) => {\n const isSameBlockchain = preferredBlockchain === blockchain;\n\n return !isSameBlockchain;\n });\n\n set(() => ({\n preferredBlockchains: [blockchain, ...nextPreferredBlockchains],\n }));\n },\n setSlippage: (slippage) =>\n set(() => ({\n slippage: slippage,\n })),\n\n setCustomSlippage: (customSlippage) =>\n set(() => ({\n customSlippage: customSlippage,\n })),\n setAffiliateRef: (affiliateRef) =>\n set(() => ({\n affiliateRef,\n })),\n setAffiliatePercent: (affiliatePercent) =>\n set(() => ({\n affiliatePercent,\n })),\n\n setAffiliateWallets: (affiliateWallets) =>\n set(() => ({\n affiliateWallets,\n })),\n toggleAllLiquiditySources: (swappers, shouldReset) =>\n set((state) => {\n if (shouldReset) {\n return { disabledLiquiditySources: [] };\n }\n const swappersGroup = removeDuplicateFrom(\n swappers.map((swapper) => swapper.swapperGroup)\n );\n\n if (swappersGroup.length === state.disabledLiquiditySources.length) {\n return { disabledLiquiditySources: [] };\n }\n\n return {\n disabledLiquiditySources: swappersGroup,\n };\n }),\n toggleInfiniteApprove: () =>\n set((state) => ({\n infiniteApprove: !state.infiniteApprove,\n })),\n\n toggleLiquiditySource: (name) =>\n set((state) => {\n if (state.disabledLiquiditySources.includes(name)) {\n return {\n disabledLiquiditySources: state.disabledLiquiditySources.filter(\n (liquiditySource) => liquiditySource != name\n ),\n };\n }\n return {\n disabledLiquiditySources: state.disabledLiquiditySources.concat(name),\n };\n }),\n setTheme: (theme) =>\n set(() => ({\n theme,\n })),\n setLanguage: (language) =>\n set(() => ({\n language,\n })),\n updateSettings: (nextConfig: WidgetConfig) => {\n const { features, theme } = nextConfig;\n\n const isThemeHidden = isFeatureHidden('theme', features);\n const isLanguageHidden = isFeatureHidden('language', features);\n const isLiquidityHidden = isFeatureHidden('liquiditySource', features);\n const singleTheme = theme?.singleTheme;\n const autoUpdateSettings =\n nextConfig?.__UNSTABLE_OR_INTERNAL__?.autoUpdateSettings;\n\n set({\n ...(isThemeHidden && { theme: nextConfig.theme?.mode || 'auto' }),\n ...(singleTheme && { theme: nextConfig.theme?.mode || 'light' }),\n ...(isLanguageHidden && {\n language: nextConfig.language || DEFAULT_LANGUAGE,\n }),\n ...(isLiquidityHidden && {\n disabledLiquiditySources: nextConfig.liquiditySources || [],\n }),\n ...(autoUpdateSettings && {\n // For the time being, we have added the language; if more are needed later, we can add other parameters.\n language: nextConfig.language || DEFAULT_LANGUAGE,\n }),\n });\n },\n setCustomToken: (token) =>\n set((state) => ({\n _customTokens: [token, ...state._customTokens],\n })),\n deleteCustomToken: (token) =>\n set((state) => ({\n _customTokens: state._customTokens.filter(\n (customToken) => customToken.address !== token.address\n ),\n })),\n customTokens: () => {\n const config = get().config;\n\n const customTokens = get()._customTokens;\n const supportedBlockchainsFromConfig = getSupportedBlockchainsFromConfig({\n config,\n });\n\n return !supportedBlockchainsFromConfig.length\n ? customTokens\n : customTokens.filter((token) =>\n supportedBlockchainsFromConfig.includes(token.blockchain)\n );\n },\n});\n", "import type { FindToken } from './slices/data';\nimport type { Balance, TokensBalance, Wallet } from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type { Token } from 'rango-sdk';\n\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport { eventEmitter } from '../services/eventEmitter';\nimport { httpService } from '../services/httpService';\nimport { WalletEventTypes, WidgetEvents } from '../types';\nimport { createTokenHash } from '../utils/meta';\nimport {\n isAccountAndWalletMatched,\n makeBalanceFor,\n makeTokensBalance,\n resetConnectedWalletState,\n} from '../utils/wallets';\n\nimport createSelectors from './selectors';\n\nexport type TokenBalance = {\n chain: string;\n symbol: string;\n ticker: string;\n address: string | null;\n rawAmount: string;\n decimal: number | null;\n amount: string;\n logo: string | null;\n usdPrice: number | null;\n};\n\nexport interface ConnectedWallet extends Wallet {\n balances: TokenBalance[] | null;\n explorerUrl: string | null;\n selected: boolean;\n loading: boolean;\n error: boolean;\n}\ninterface WalletsStore {\n connectedWallets: ConnectedWallet[];\n balances: TokensBalance;\n loading: boolean;\n connectWallet: (accounts: Wallet[], findToken: FindToken) => void;\n disconnectWallet: (walletType: WalletType) => void;\n selectWallets: (wallets: { walletType: string; chain: string }[]) => void;\n clearConnectedWallet: () => void;\n getWalletsDetails: (\n accounts: Wallet[],\n findToken: FindToken,\n shouldRetry?: boolean\n ) => void;\n getBalanceFor: (token: Token) => Balance | null;\n}\n\nexport const useWalletsStore = createSelectors(\n create<WalletsStore>()(\n subscribeWithSelector((set, get) => {\n return {\n connectedWallets: [],\n balances: {},\n loading: false,\n connectWallet: (accounts, findToken) => {\n eventEmitter.emit(WidgetEvents.WalletEvent, {\n type: WalletEventTypes.CONNECT,\n payload: { walletType: accounts[0].walletType, accounts },\n });\n\n const getWalletsDetails = get().getWalletsDetails;\n set((state) => ({\n loading: true,\n connectedWallets: state.connectedWallets\n .filter((wallet) => wallet.walletType !== accounts[0].walletType)\n .concat(\n accounts.map((account) => {\n const shouldMarkWalletAsSelected =\n !state.connectedWallets.some(\n (connectedWallet) =>\n connectedWallet.chain === account.chain &&\n connectedWallet.selected &&\n /**\n * Sometimes, the connect function can be called multiple times for a particular wallet type when using the auto-connect feature.\n * This check is there to make sure the chosen wallet doesn't end up unselected.\n */\n connectedWallet.walletType !== account.walletType\n );\n return {\n balances: [],\n address: account.address,\n chain: account.chain,\n explorerUrl: null,\n walletType: account.walletType,\n selected: shouldMarkWalletAsSelected,\n loading: true,\n error: false,\n };\n })\n ),\n }));\n getWalletsDetails(accounts, findToken);\n },\n disconnectWallet: (walletType) => {\n set((state) => {\n if (\n state.connectedWallets.find(\n (wallet) => wallet.walletType === walletType\n )\n ) {\n eventEmitter.emit(WidgetEvents.WalletEvent, {\n type: WalletEventTypes.DISCONNECT,\n payload: { walletType },\n });\n }\n\n const selectedWallets = state.connectedWallets\n .filter(\n (connectedWallet) =>\n connectedWallet.selected &&\n connectedWallet.walletType !== walletType\n )\n .map((selectedWallet) => selectedWallet.chain);\n\n const connectedWallets = state.connectedWallets\n .filter(\n (connectedWallet) => connectedWallet.walletType !== walletType\n )\n .map((connectedWallet) => {\n const anyWalletSelectedForBlockchain = selectedWallets.includes(\n connectedWallet.chain\n );\n if (anyWalletSelectedForBlockchain) {\n return connectedWallet;\n }\n selectedWallets.push(connectedWallet.chain);\n return { ...connectedWallet, selected: true };\n });\n\n const balances = makeTokensBalance(connectedWallets);\n\n return {\n balances,\n connectedWallets,\n };\n });\n },\n selectWallets: (wallets) =>\n set((state) => ({\n connectedWallets: state.connectedWallets.map((connectedWallet) => {\n const walletSelected = !!wallets.find(\n (wallet) =>\n wallet.chain === connectedWallet.chain &&\n wallet.walletType !== connectedWallet.walletType &&\n connectedWallet.selected\n );\n const walletNotSelected = !!wallets.find(\n (wallet) =>\n wallet.chain === connectedWallet.chain &&\n wallet.walletType === connectedWallet.walletType &&\n !connectedWallet.selected\n );\n if (walletSelected) {\n return { ...connectedWallet, selected: false };\n } else if (walletNotSelected) {\n return { ...connectedWallet, selected: true };\n }\n\n return connectedWallet;\n }),\n })),\n clearConnectedWallet: () =>\n set(() => ({\n connectedWallets: [],\n selectedWallets: [],\n })),\n getWalletsDetails: async (accounts, findToken, shouldRetry = true) => {\n const getWalletsDetails = get().getWalletsDetails;\n set((state) => ({\n loading: true,\n connectedWallets: state.connectedWallets.map((wallet) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, wallet)\n )\n ? { ...wallet, loading: true }\n : wallet;\n }),\n }));\n try {\n const data = accounts.map(({ address, chain }) => ({\n address,\n blockchain: chain,\n }));\n const response = await httpService().getWalletsDetails(data);\n const retrievedBalance = response.wallets;\n if (retrievedBalance) {\n set((state) => {\n const connectedWallets = state.connectedWallets.map(\n (connectedWallet) => {\n const matchedAccount = accounts.find((account) =>\n isAccountAndWalletMatched(account, connectedWallet)\n );\n const retrievedBalanceAccount = retrievedBalance.find(\n (balance) =>\n balance.address === connectedWallet.address &&\n balance.blockChain === connectedWallet.chain\n );\n if (\n retrievedBalanceAccount?.failed &&\n matchedAccount &&\n shouldRetry\n ) {\n getWalletsDetails([matchedAccount], findToken, false);\n }\n return matchedAccount && retrievedBalanceAccount\n ? {\n ...connectedWallet,\n explorerUrl: retrievedBalanceAccount.explorerUrl,\n balances: makeBalanceFor(\n retrievedBalanceAccount,\n findToken\n ),\n loading: false,\n error: false,\n }\n : connectedWallet;\n }\n );\n\n const balances = makeTokensBalance(connectedWallets);\n return {\n loading: false,\n balances,\n connectedWallets,\n };\n });\n } else {\n throw new Error('Wallet not found');\n }\n } catch (error) {\n set((state) => {\n const connectedWallets = state.connectedWallets.map((balance) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, balance)\n )\n ? resetConnectedWalletState(balance)\n : balance;\n });\n\n const balances = makeTokensBalance(connectedWallets);\n\n return {\n loading: false,\n balances,\n connectedWallets,\n };\n });\n }\n },\n getBalanceFor: (token) => {\n const { balances } = get();\n const tokenHash = createTokenHash(token);\n const balance = balances[tokenHash];\n return balance ?? null;\n },\n };\n })\n )\n);\n", "import type { Events, WidgetEventEmitter } from '../types';\n\nimport mitt from 'mitt';\n\nexport const eventEmitter = mitt<Events>();\n\n// To be exported for Dapps\nexport const widgetEventEmitter: WidgetEventEmitter = {\n on: eventEmitter.on,\n off: eventEmitter.off,\n};\n", "import type { SelectedQuote } from './quote';\nimport type { Wallet } from './wallets';\nimport type {\n RouteEventData,\n StepEventData,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { WidgetEvents as QueueManagerEvents } from '@rango-dev/queue-manager-rango-preset';\n\ntype EventData<\n T extends QuoteEventTypes | WalletEventTypes | UiEventTypes,\n U extends Record<string, unknown> | null\n> = { type: T; payload: U };\n\nexport type PreventableEventPayload<\n T extends Record<string, unknown> = Record<string, unknown>\n> = {\n preventDefault: () => void;\n} & T;\n\ntype Account = Wallet;\n\nexport enum QuoteEventTypes {\n QUOTE_INPUT_UPDATE = 'quoteInputUpdate',\n QUOTE_OUTPUT_UPDATE = 'quoteOutputUpdate',\n}\n\nexport enum WalletEventTypes {\n CONNECT = 'connect',\n DISCONNECT = 'disconnect',\n}\n\n/**\n * We use a prefix for interaction type and a name for defining the event name: INTERACTION_EVENT_NAME\n * e.g. CLICK_X_BUTTON or NAVIGATE_WALLET_PAGE\n */\nexport enum UiEventTypes {\n CLICK_CONNECT_WALLET = 'clickConnectWallet',\n}\n\nexport type QuoteInputUpdateEventPayload = {\n fromBlockchain?: string;\n toBlockchain?: string;\n fromToken?: { symbol: string; name: string | null; address: string | null };\n toToken?: { symbol: string; name: string | null; address: string | null };\n requestAmount?: string;\n};\n\nexport type QuoteUpdateEventPayload = Pick<\n SelectedQuote,\n 'requestAmount' | 'swaps' | 'outputAmount' | 'resultType' | 'tags'\n> | null;\n\nexport type ConnectWalletEventPayload = {\n walletType: string;\n accounts: Account[];\n};\n\nexport type DisconnectWalletEventPayload = {\n walletType: string;\n};\n\nexport type ClickConnectWalletPayload = PreventableEventPayload;\n\nexport type QuoteEventData =\n | EventData<QuoteEventTypes.QUOTE_INPUT_UPDATE, QuoteInputUpdateEventPayload>\n | EventData<QuoteEventTypes.QUOTE_OUTPUT_UPDATE, QuoteUpdateEventPayload>;\n\nexport type WalletEventData =\n | EventData<WalletEventTypes.CONNECT, ConnectWalletEventPayload>\n | EventData<WalletEventTypes.DISCONNECT, DisconnectWalletEventPayload>;\n\nexport type UiEventData = EventData<\n UiEventTypes.CLICK_CONNECT_WALLET,\n ClickConnectWalletPayload\n>;\n\nexport enum WidgetEvents {\n RouteEvent = QueueManagerEvents.RouteEvent,\n StepEvent = QueueManagerEvents.StepEvent,\n QuoteEvent = 'quoteEvent',\n WalletEvent = 'walletEvent',\n UiEvent = 'uiEvent',\n}\n\nexport type Events = {\n [WidgetEvents.RouteEvent]: RouteEventData;\n [WidgetEvents.StepEvent]: StepEventData;\n [WidgetEvents.QuoteEvent]: QuoteEventData;\n [WidgetEvents.WalletEvent]: WalletEventData;\n [WidgetEvents.UiEvent]: UiEventData;\n};\n\ndeclare type EventHandler<T = unknown> = (event: T) => void;\n\nexport type WidgetEventEmitter = {\n on<Key extends WidgetEvents>(\n type: Key,\n handler: EventHandler<Events[Key]>\n ): void;\n off<Key extends WidgetEvents>(\n type: Key,\n handler?: EventHandler<Events[Key]>\n ): void;\n};\n", "import type { StoreApi, UseBoundStore } from 'zustand';\n\ntype State = object;\n\ntype WithSelectors<S> = S extends { getState: () => infer T }\n ? S & { use: { [K in keyof T]: () => T[K] } }\n : never;\n\nconst createSelectors = <S extends UseBoundStore<StoreApi<State>>>(\n _store: S\n) => {\n const store = _store as WithSelectors<typeof _store>;\n store.use = {};\n for (const k of Object.keys(store.getState())) {\n (store.use as any)[k] = () => store((s) => s[k as keyof typeof s]);\n }\n\n return store;\n};\n\nexport default createSelectors;\n", "import type { WidgetConfig } from '../types';\nimport type { ProviderInterface } from '@rango-dev/wallets-react';\n\nimport { allProviders } from '@rango-dev/provider-all';\n\nexport interface ProvidersOptions {\n walletConnectProjectId?: WidgetConfig['walletConnectProjectId'];\n walletConnectListedDesktopWalletLink?: NonNullable<\n WidgetConfig['__UNSTABLE_OR_INTERNAL__']\n >['walletConnectListedDesktopWalletLink'];\n trezorManifest: WidgetConfig['trezorManifest'];\n}\n\n/**\n *\n * Generate a list of providers by passing a provider name (e.g. metamask) or a custom provider which implemented ProviderInterface.\n * @returns ProviderInterface[] a list of ProviderInterface\n *\n */\nexport function matchAndGenerateProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): ProviderInterface[] {\n const all = allProviders({\n walletconnect2: {\n WC_PROJECT_ID: options?.walletConnectProjectId || '',\n DISABLE_MODAL_AND_OPEN_LINK:\n options?.walletConnectListedDesktopWalletLink,\n },\n selectedProviders: providers,\n trezor: options?.trezorManifest\n ? { manifest: options.trezorManifest }\n : undefined,\n });\n\n if (providers) {\n const selectedProviders: ProviderInterface[] = [];\n\n providers.forEach((requestedProvider) => {\n /*\n * There are two types of provider we get, the first one is only passing the wallet name\n * then we will match the wallet name with our providers (@rango-dev/provider-*).\n * The second way is passing a custom provider which implemented ProviderInterface.\n */\n if (typeof requestedProvider === 'string') {\n const result: ProviderInterface | undefined = all.find((provider) => {\n return provider.config.type === requestedProvider;\n });\n if (result) {\n selectedProviders.push(result);\n } else {\n console.warn(\n `Couldn't find ${requestedProvider} provider. Please make sure you are passing the correct name.`\n );\n }\n } else {\n // It's a custom provider so we directly push it to the list.\n selectedProviders.push(requestedProvider);\n }\n });\n return selectedProviders;\n }\n\n return all;\n}\n\nexport function configWalletsToWalletName(\n config: WidgetConfig['wallets'],\n options?: ProvidersOptions\n): string[] {\n const providers = matchAndGenerateProviders(config, options);\n const names = providers.map((provider) => {\n return provider.config.type;\n });\n return names;\n}\n", "import type { ModalPropTypes } from '@rango-dev/ui';\nimport type { PropsWithChildren } from 'react';\n\nimport { Modal } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useUiStore } from '../../../store/ui';\n\nexport function WatermarkedModal(props: PropsWithChildren<ModalPropTypes>) {\n const { watermark } = useUiStore();\n\n const hasWatermark = watermark === 'FULL';\n return (\n <Modal hasWatermark={hasWatermark} {...props}>\n {props.children}\n </Modal>\n );\n}\n", "import type { Watermark } from '../hooks/useFetchApiConfig';\nimport type { TabManagerInterface } from '../libs/tabManager';\n\nimport { create } from 'zustand';\n\nimport { TabManager } from '../libs/tabManager';\n\nimport createSelectors from './selectors';\n\ninterface UiState {\n isActiveTab: boolean;\n tabManagerInitiated: boolean;\n showActivateTabModal: boolean;\n watermark: Watermark;\n activateCurrentTab: (\n setCurrentTabAsActive: () => void,\n hasRunningSwaps: boolean\n ) => void;\n setShowActivateTabModal: (flag: boolean) => void;\n setWatermark: (watermark: Watermark) => void;\n}\n\nexport const useUiStore = createSelectors(\n create<UiState>()((set, get) => ({\n isActiveTab: false,\n tabManagerInitiated: false,\n showActivateTabModal: false,\n watermark: 'NONE',\n fetchingApiConfig: false,\n activateCurrentTab: (setCurrentTabAsActive, hasRunningSwaps) => {\n const { showActivateTabModal } = get();\n\n if (!showActivateTabModal && hasRunningSwaps) {\n set({ showActivateTabModal: true });\n } else if (showActivateTabModal || !hasRunningSwaps) {\n setCurrentTabAsActive();\n }\n },\n setShowActivateTabModal: (flag) => {\n set({ showActivateTabModal: flag });\n },\n setWatermark: (watermark) => {\n set({ watermark });\n },\n }))\n);\n\nexport const tabManager: TabManagerInterface = new TabManager({\n onInit: () => useUiStore.setState({ tabManagerInitiated: true }),\n onClaim: () =>\n useUiStore.setState({ isActiveTab: true, showActivateTabModal: false }),\n onRelease: () => useUiStore.setState({ isActiveTab: false }),\n});\n", "export const TIMEOUT = 300;\nexport const MAXIMUM_TAB_ID = 100_000;\nexport const CHANNEL_NAME = 'rango-widget';\n", "import type {\n Events,\n ID,\n Message,\n TabManagerInterface,\n} from './tabManager.types';\n\nimport { CHANNEL_NAME, MAXIMUM_TAB_ID, TIMEOUT } from './tabManager.constants';\n\nexport class TabManager implements TabManagerInterface {\n private tabId: ID;\n private state: 'not-initiated' | 'not-claimed' | 'claimed' = 'not-initiated';\n private lastTryClaim: number | undefined;\n private events: Events = {};\n private channel: BroadcastChannel;\n\n constructor(events: Events) {\n this.channel = new BroadcastChannel(CHANNEL_NAME);\n this.tabId = Math.trunc(Math.random() * MAXIMUM_TAB_ID);\n this.events = events;\n }\n\n init = () => {\n this.initEvents();\n void this.tryClaim();\n };\n\n /**\n * This is applicable when a user in an inactive tab seeks to activate that tab.\n */\n forceClaim = () => {\n if (!this.isClaimed()) {\n const message: Message = { name: 'force-claim', candidateId: this.tabId };\n this.channel.postMessage(message);\n setTimeout(() => {\n if (!this.isClaimed()) {\n this.claim();\n }\n }, TIMEOUT);\n }\n };\n\n isClaimed = () => {\n return this.state === 'claimed';\n };\n\n /**\n * remove event listeners\n */\n destroy = () => {\n this.channel.removeEventListener('message', this.handleMessageEvent);\n document.removeEventListener(\n 'visibilitychange',\n this.handleVisibilityChange\n );\n document.removeEventListener('resume', this.handleResume);\n };\n\n /**\n * Reacting to messages and window events to claim.\n */\n private initEvents() {\n this.channel.addEventListener('message', this.handleMessageEvent);\n\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n\n /**\n * The \"resume\" event is currently supported only in certain browsers.\n * It is triggered when a previously frozen tab is unfrozen and resumes execution.\n * To avoid having multiple active tabs,\n * if the current tab is active after the \"resume\" event,\n * we send a signal to other tabs to verify if any of them currently claim to be active.\n * If this is the case, we deactivate the current tab.\n * https://developer.chrome.com/docs/web-platform/page-lifecycle-api\n */\n document.addEventListener('resume', this.handleResume);\n }\n\n /**\n * Runs after a `ping` message and checks if current tab is claimed the tabs,\n * if yes, it responds with `pong`, If not, it doesn't do anything.\n *\n * Note 1: If we receive a `ping` message,\n * it means a tab is trying to claim tabs directly, usually it's the active tab.\n *\n * Note 2: If multiple tabs are opening at once, all of them are broadcasting `ping`\n * and eventually all of them will `claim` the queue after the TIMEOUT.\n * For avoiding this, we will accepts the oldest broadcasted ping. (`isPingSentBefore`)\n */\n private claimedByCurrentTab(pingAt: number) {\n const isPingSentBefore = this.lastTryClaim && this.lastTryClaim < pingAt;\n\n if (this.isClaimed() || isPingSentBefore) {\n const message: Message = {\n name: 'pong',\n };\n this.channel.postMessage(message);\n return;\n }\n }\n\n private handleMessageEvent = (event: MessageEvent<Message>) => {\n const name = event.data.name;\n\n switch (name) {\n case 'ping':\n this.claimedByCurrentTab(event.data.pingAt);\n break;\n\n case 'pong':\n this.alreadyClaimedByAnotherTab();\n break;\n\n case 'force-claim':\n this.forceRelease(event.data.candidateId);\n break;\n\n case 'force-release':\n if (this.tabId === event.data.candidateId) {\n this.claim();\n }\n break;\n\n default:\n throw new Error(`${name} is not supported.`);\n }\n };\n\n private handleVisibilityChange = async () => {\n if (document.visibilityState === 'visible') {\n await this.tryClaim();\n }\n };\n\n private handleResume = async () => {\n if (this.isClaimed()) {\n await this.tryClaim();\n if (!this.isClaimed()) {\n this.events.onRelease?.();\n }\n }\n };\n /**\n * Runs after receiving `pong` message, which means one of tabs already claimed the tabs.\n */\n private alreadyClaimedByAnotherTab() {\n this.resetLastCheck();\n }\n\n /**\n * Try to send a `ping` message to know if the tabs `claimed` or not.\n * On constructing instance, or whenever page is active we will try.\n */\n private async tryClaim() {\n /**\n * Try to ask from possible other running tabs.\n */\n this.setLastCheck();\n return new Promise<void>((resolve) => {\n setTimeout(() => {\n this.check();\n resolve();\n }, TIMEOUT);\n });\n }\n\n /**\n * If `lastCheck` is exist, it means there is no other tabs which `claimed` the tabs.\n * And we mark the current tab as `claimed`\n */\n private check() {\n if (this.state === 'not-initiated') {\n this.events.onInit?.();\n }\n /**\n *it means we didn't get any response from other tabs, this tab can claim.\n */\n if (this.lastTryClaim) {\n this.claim();\n this.resetLastCheck();\n } else {\n this.state = 'not-claimed';\n }\n }\n\n private claim() {\n this.state = 'claimed';\n this.events.onClaim?.();\n }\n\n /**\n * Setting current time as `lastCheck` and broadcast a `ping` message event.\n */\n private setLastCheck() {\n this.lastTryClaim = Date.now();\n const message: Message = {\n name: 'ping',\n pingAt: this.lastTryClaim,\n };\n this.channel.postMessage(message);\n }\n\n private resetLastCheck() {\n this.lastTryClaim = undefined;\n }\n\n /**\n * Upon receipt of a \"force-claim\" message,\n * the presently active tab is expected to deactivate itself and initiate any attached callback associated with this event.\n */\n private forceRelease(nextActiveTab: ID) {\n if (this.isClaimed()) {\n this.state = 'not-claimed';\n\n this.events.onRelease?.();\n\n const message: Message = {\n name: 'force-release',\n candidateId: nextActiveTab,\n };\n\n this.channel.postMessage(message);\n }\n }\n}\n", "import type { PropTypes } from './Namespaces.types';\nimport type { Namespace } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Checkbox,\n Divider,\n Image,\n ListItemButton,\n MessageBox,\n Radio,\n RadioRoot,\n} from '@rango-dev/ui';\nimport { namespaces } from '@rango-dev/wallets-shared';\nimport React, { useMemo, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { WalletImageContainer } from '../HeaderButtons/HeaderButtons.styles';\n\nimport { LogoContainer, Spinner } from './ConnectStatus.styles';\nimport { getBlockchainLogo } from './Namespaces.helpers';\nimport { NamespaceList } from './Namespaces.styles';\n\nexport function Namespaces(props: PropTypes) {\n const { singleNamespace, availableNamespaces, providerImage } = props.value;\n\n const [selectedNamespaces, setSelectedNamespaces] = useState<Namespace[]>([]);\n\n const blockchains = useAppStore().blockchains();\n\n const namespacesInfo = useMemo(\n () =>\n availableNamespaces?.map((namespace) => ({\n name: namespace,\n logo: getBlockchainLogo(\n blockchains,\n namespaces[namespace].mainBlockchain\n ),\n title: namespaces[namespace].title,\n })),\n [availableNamespaces]\n );\n\n const onSelect = (namespace: Namespace) => {\n if (singleNamespace) {\n setSelectedNamespaces([namespace]);\n } else {\n setSelectedNamespaces((selectedNamespaces) =>\n selectedNamespaces.includes(namespace)\n ? selectedNamespaces.filter((item) => item !== namespace)\n : selectedNamespaces.concat(namespace)\n );\n }\n };\n\n const wrapRadioRoot = (children: React.ReactNode) => {\n if (singleNamespace) {\n return <RadioRoot value={selectedNamespaces?.[0]}>{children}</RadioRoot>;\n }\n\n return <>{children}</>;\n };\n\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"info\"\n title={i18n.t('Select chain types')}\n description={i18n.t(\n `This wallet supports multiple chains. Select which chain you'd like to connect to.`\n )}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={providerImage} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n <NamespaceList>\n {wrapRadioRoot(\n <>\n {namespacesInfo?.map((namespaceInfoItem) => (\n <ListItemButton\n key={namespaceInfoItem.name}\n id={namespaceInfoItem.name}\n title={namespaceInfoItem.title}\n hasDivider\n style={{ height: 60 }}\n onClick={() => onSelect(namespaceInfoItem.name)}\n start={<Image src={namespaceInfoItem.logo} size={22} />}\n end={\n singleNamespace ? (\n <Radio value={namespaceInfoItem.name} />\n ) : (\n <Checkbox\n checked={selectedNamespaces.includes(\n namespaceInfoItem.name\n )}\n />\n )\n }\n />\n ))}\n </>\n )}\n </NamespaceList>\n <Button\n type=\"primary\"\n disabled={!selectedNamespaces.length}\n onClick={() => props.onConfirm(selectedNamespaces)}>\n {i18n.t('Confirm')}\n </Button>\n </>\n );\n}\n", "import { css, darkTheme, IconButton, styled } from '@rango-dev/ui';\n\nexport const HeaderButton = styled(IconButton, {\n width: '$24',\n position: 'relative',\n padding: '0',\n overflow: 'unset',\n '&:hover': {\n backgroundColor: '$secondary100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral',\n },\n },\n});\n\nexport const ConnectedIcon = styled('div', {\n position: 'absolute',\n background: '$secondary500',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary250',\n },\n width: '$6',\n height: '$6',\n borderRadius: '$lg',\n right: '$4',\n border: '1px solid $surface100',\n});\n\nexport const SuffixContainer = styled('div', {\n display: 'flex',\n justifyContent: 'flex-end',\n minWidth: '$40',\n button: {\n padding: 0,\n },\n});\n\nexport const NotificationsBadgeContainer = styled('div', {\n position: 'absolute',\n width: '14px',\n height: '14px',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: '7px',\n top: '$0',\n right: '$0',\n variants: {\n isSever: {\n true: {\n backgroundColor: '$error500',\n },\n false: {\n backgroundColor: '$secondary500',\n },\n },\n },\n});\n\nexport const ProgressIcon = styled('div', {\n padding: '$2',\n variants: {\n isRefetched: {\n true: {\n transform: `rotate(360deg)`,\n transition: 'transform 1s ease-in-out',\n },\n },\n },\n});\n\nexport const InProgressTransactionBadgeContainer = styled('div', {\n position: 'absolute',\n right: '$4',\n top: '$4',\n backgroundColor: '$background',\n borderRadius: '100%',\n});\n\nexport const rowStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const WalletImageContainer = styled('div', {\n borderRadius: '100%',\n border: '1.5px transparent solid',\n '&:not(:first-child)': {\n marginLeft: '-$6',\n },\n img: {\n borderRadius: '100%',\n },\n});\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const IconContainer = styled('div', {\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n backgroundColor: '$success300',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const LogoContainer = styled('div', {\n position: 'relative',\n});\n\nconst spin = keyframes({\n '0%': {\n transform: 'rotate(0deg)',\n },\n '100%': {\n transform: 'rotate(360deg)',\n },\n});\n\nexport const Spinner = styled('div', {\n position: 'absolute',\n border: '2px solid rgba(0, 0, 0, 0.1)',\n borderTop: '2px solid $info500',\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n animation: `${spin} 1s linear infinite`,\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n});\n\nexport const WalletImageContainer = styled('div', {\n '& img': {\n borderRadius: '50%',\n },\n});\n", "import type { BlockchainMeta } from 'rango-types';\n\nexport function getBlockchainLogo(\n blockchains: BlockchainMeta[],\n blockchainName: string\n) {\n return blockchains.find((blockchain) => blockchain.name === blockchainName)\n ?.logo;\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const NamespaceList = styled('ul', {\n padding: 0,\n paddingTop: '$4',\n paddingBottom: '$4',\n});\n", "import type { PropTypes } from './DerivationPath.types';\nimport type { DerivationPath } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n Image,\n MessageBox,\n Select,\n TextField,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './ConnectStatus.styles';\nimport {\n CUSTOM_DERIVATION_PATH,\n getDerivationPaths,\n} from './DerivationPath.helpers';\nimport {\n derivationPathInputStyles,\n InputLabel,\n InputsContainer,\n} from './DerivationPath.styles';\n\nconst DEFAULT_DERIVATION_PATH_INDEX = '0';\n\nexport function DerivationPath(props: PropTypes) {\n const { onConfirm } = props;\n const {\n namespace: selectedNamespace,\n providerImage: image,\n providerType: type,\n } = props.value;\n\n const [selectedDerivationPathId, setSelectedDerivationPathId] = useState<\n string | null\n >(null);\n const [derivationPathIndex, setDerivationPathIndex] = useState(\n DEFAULT_DERIVATION_PATH_INDEX\n );\n\n const isCustomOptionSelected =\n selectedDerivationPathId === CUSTOM_DERIVATION_PATH.id;\n\n const derivationPaths = getDerivationPaths(selectedNamespace);\n\n const handleDerivationPathItemClick = ({ value }: { value: string }) => {\n const selectedDerivationPath = derivationPaths?.find(\n (derivationPath) => derivationPath.id === value\n );\n\n if (selectedDerivationPath) {\n /*\n * Custom mode accepts string, but other modes only accepts number,\n * Here we are checking if user is on custom mode and trying to switch to another mode\n * if it's an string we will keep it, if not we will reset the value to default\n */\n if (\n selectedDerivationPathId === CUSTOM_DERIVATION_PATH.id &&\n Number.isNaN(Number(derivationPathIndex))\n ) {\n setDerivationPathIndex(DEFAULT_DERIVATION_PATH_INDEX);\n }\n\n setSelectedDerivationPathId(selectedDerivationPath.id);\n }\n };\n\n const handleConfirm = () => {\n const selectedDerivationPath = derivationPaths.find(\n (derivationPath) => derivationPath.id === selectedDerivationPathId\n );\n if (selectedDerivationPath) {\n onConfirm(\n selectedDerivationPath.generateDerivationPath(derivationPathIndex)\n );\n } else {\n // Unreachable code\n throw new Error('selectedDerivationPath can not be undefined');\n }\n };\n\n useEffect(() => {\n setSelectedDerivationPathId(\n getDerivationPaths(selectedNamespace)[0]?.id || null\n );\n }, [selectedNamespace]);\n\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"info\"\n title={i18n.t('Select Derivation Path')}\n description={i18n.t({\n id: 'In order to connect to {type}, you must first select a Derivation Path',\n values: {\n type,\n },\n })}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n\n <InputsContainer>\n <InputLabel variant=\"body\" size=\"xsmall\" color=\"$neutral600\">\n {i18n.t('Choose Derivation Path Template')}\n </InputLabel>\n <Select\n value={selectedDerivationPathId || ''}\n options={derivationPaths.map((derivationPath) => ({\n value: derivationPath.id,\n label: derivationPath.label,\n }))}\n variant=\"filled\"\n handleItemClick={handleDerivationPathItemClick}\n styles={{ trigger: derivationPathInputStyles }}\n />\n <Divider size={20} />\n <InputLabel variant=\"body\" size=\"xsmall\" color=\"$neutral600\">\n {isCustomOptionSelected\n ? i18n.t('Enter Path')\n : i18n.t('Enter Index')}\n </InputLabel>\n <TextField\n type={isCustomOptionSelected ? 'text' : 'number'}\n variant=\"contained\"\n value={derivationPathIndex}\n onChange={(event) => setDerivationPathIndex(event.target.value)}\n style={derivationPathInputStyles}\n />\n </InputsContainer>\n\n <Button\n type=\"primary\"\n onClick={handleConfirm}\n disabled={\n !derivationPaths || !selectedDerivationPathId || !derivationPathIndex\n }>\n {i18n.t('Confirm')}\n </Button>\n </>\n );\n}\n", "import type { DerivationPath, Namespace } from '@rango-dev/wallets-shared';\n\nimport { namespaces } from '@rango-dev/wallets-shared';\n\nexport const CUSTOM_DERIVATION_PATH: DerivationPath = {\n id: 'custom',\n label: 'Custom',\n generateDerivationPath: (index: string) => index,\n};\n\nexport function getDerivationPaths(\n selectedNamespace?: Namespace\n): DerivationPath[] {\n const selectedNamespaceDerivationPaths = selectedNamespace\n ? namespaces[selectedNamespace].derivationPaths\n : null;\n\n const derivationPaths: DerivationPath[] = !!selectedNamespaceDerivationPaths\n ? [...selectedNamespaceDerivationPaths, CUSTOM_DERIVATION_PATH]\n : [];\n\n return derivationPaths;\n}\n", "import { styled, Typography } from '@rango-dev/ui';\n\nexport const InputsContainer = styled('div', {\n paddingTop: '$30',\n paddingBottom: '$30',\n zIndex: 10, // This property is added to solve inconsistency between Select child of this component and subsequent button\n});\n\nexport const InputLabel = styled(Typography, {\n paddingLeft: '$10',\n});\n\nexport const derivationPathInputStyles = {\n height: '$40',\n backgroundColor: '$neutral200',\n borderRadius: '$sm',\n};\n", "import type { ConnectStatusProps } from './ConnectStatus.types';\n\nimport { i18n } from '@lingui/core';\nimport { Image, MessageBox, WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React from 'react';\n\nimport { mapStatusToWalletState } from '../../utils/wallets';\n\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './ConnectStatus.styles';\n\nexport function ConnectStatus(props: ConnectStatusProps) {\n // See `wallet` notes on its type definition\n const { wallet, error } = props;\n const { type, image } = wallet;\n const { state } = useWallets();\n const walletState = mapStatusToWalletState(state(type));\n\n if (walletState === WalletState.CONNECTED) {\n return (\n <MessageBox\n type=\"success\"\n title={i18n.t('Wallet Connected')}\n description={i18n.t(\n 'Your wallet is connected, you can use it to swap.'\n )}\n />\n );\n }\n\n if (error) {\n return (\n <MessageBox\n type=\"error\"\n title={i18n.t('Failed to Connect')}\n description={\n error || i18n.t('Your wallet is not connected. Please try again.')\n }\n />\n );\n }\n\n return (\n <MessageBox\n type=\"loading\"\n title={i18n.t('Connecting to your wallet')}\n description={i18n.t('Click connect in your wallet popup.')}\n icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\ninterface PropTypes {\n displayName?: string;\n onConfirm: () => void;\n}\n\nexport function ExperimentalChain(props: PropTypes) {\n const { displayName, onConfirm } = props;\n\n return (\n <MessageBox\n title={i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName: displayName },\n })}\n type=\"warning\"\n description={i18n.t({\n id: 'You should connect a {blockchainDisplayName} supported wallet or choose a different {blockchainDisplayName} address',\n values: { blockchainDisplayName: displayName },\n })}>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n onClick={onConfirm}\n variant=\"outlined\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n );\n}\n", "import type { State } from '../../hooks/useStatefulConnect';\nimport type { WalletInfoWithExtra } from '../../types';\n\nexport function isOnStatus(\n getState: () => State,\n wallet?: WalletInfoWithExtra\n): wallet is WalletInfoWithExtra {\n return getState().status === 'init' && !!wallet;\n}\n\nexport function isOnNamespace(\n getState: () => State\n): getState is () => State & { namespace: NonNullable<State['namespace']> } {\n return getState().status === 'namespace';\n}\n\nexport function isOnDerivationPath(\n getState: () => State\n): getState is () => State & {\n derivationPath: NonNullable<State['derivationPath']>;\n} {\n return getState().status === 'derivationPath';\n}\n", "import type {\n OnWalletConnectionChange,\n PropTypes,\n WidgetContextInterface,\n} from './Wallets.types';\nimport type { ProvidersOptions } from '../../utils/providers';\nimport type { LegacyEventHandler as EventHandler } from '@rango-dev/wallets-core/legacy';\nimport type { PropsWithChildren } from 'react';\n\nimport { Events, Provider } from '@rango-dev/wallets-react';\nimport { type Network } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport React, { createContext, useEffect, useMemo, useRef } from 'react';\n\nimport { useWalletProviders } from '../../hooks/useWalletProviders';\nimport { AppStoreProvider, useAppStore } from '../../store/AppStore';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport {\n prepareAccountsForWalletStore,\n walletAndSupportedChainsNames,\n} from '../../utils/wallets';\n\nexport const WidgetContext = createContext<WidgetContextInterface>({\n onConnectWallet: () => {\n return;\n },\n onDisconnectWallet: () => {\n return;\n },\n});\n\nfunction Main(props: PropsWithChildren<PropTypes>) {\n const {\n updateConfig,\n updateSettings,\n fetch: fetchMeta,\n fetchStatus,\n } = useAppStore();\n const blockchains = useAppStore().blockchains();\n const { findToken } = useAppStore();\n const config = useAppStore().config;\n\n const walletOptions: ProvidersOptions = {\n walletConnectProjectId: config?.walletConnectProjectId,\n trezorManifest: config?.trezorManifest,\n walletConnectListedDesktopWalletLink:\n props.config.__UNSTABLE_OR_INTERNAL__\n ?.walletConnectListedDesktopWalletLink,\n };\n const { providers } = useWalletProviders(config.wallets, walletOptions);\n const { connectWallet, disconnectWallet } = useWalletsStore();\n const onConnectWalletHandler = useRef<OnWalletConnectionChange>();\n const onDisconnectWalletHandler = useRef<OnWalletConnectionChange>();\n\n useEffect(() => {\n void fetchMeta().catch(console.log);\n }, []);\n\n useEffect(() => {\n if (props.config) {\n updateConfig(props.config);\n updateSettings(props.config);\n window['__rango'] = {\n config,\n dappConfig: props.config,\n };\n }\n }, [props.config, fetchStatus]);\n\n const evmBasedChainNames = blockchains\n .filter(isEvmBlockchain)\n .map((chain) => chain.name);\n\n const onUpdateState: EventHandler = (type, event, value, state, meta) => {\n if (event === Events.ACCOUNTS) {\n if (value) {\n const supportedChainNames: Network[] | null =\n walletAndSupportedChainsNames(meta.supportedBlockchains);\n const data = prepareAccountsForWalletStore(\n type,\n value,\n evmBasedChainNames,\n supportedChainNames,\n meta.isContractWallet\n );\n if (data.length) {\n connectWallet(data, findToken);\n }\n } else {\n disconnectWallet(type);\n if (!!onDisconnectWalletHandler.current) {\n onDisconnectWalletHandler.current(type);\n } else {\n console.warn(\n `onDisconnectWallet handler hasn't been set. Are you sure?`\n );\n }\n }\n }\n if (event === Events.ACCOUNTS && state.connected) {\n const key = `${type}-${state.network}-${value}`;\n\n if (state.connected) {\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(key);\n } else {\n console.warn(\n `onConnectWallet handler hasn't been set. Are you sure?`\n );\n }\n }\n }\n\n if (event === Events.NETWORK && state.network) {\n const key = `${type}-${state.network}`;\n if (!!onConnectWalletHandler.current) {\n onConnectWalletHandler.current(key);\n } else {\n console.warn(`onConnectWallet handler hasn't been set. Are you sure?`);\n }\n }\n\n // propagate updates for Dapps using external wallets\n if (props.onUpdateState) {\n props.onUpdateState(type, event, value, state, meta);\n }\n };\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const handlers = useMemo(\n () => ({\n onConnectWallet: (handler: OnWalletConnectionChange) => {\n onConnectWalletHandler.current = handler;\n },\n onDisconnectWallet: (handler: OnWalletConnectionChange) => {\n onDisconnectWalletHandler.current = handler;\n },\n }),\n []\n );\n\n return (\n <WidgetContext.Provider value={handlers}>\n <Provider\n allBlockChains={blockchains}\n providers={providers}\n onUpdateState={onUpdateState}\n autoConnect={!!isActiveTab}>\n {props.children}\n </Provider>\n </WidgetContext.Provider>\n );\n}\n\nexport function WidgetWallets(props: PropsWithChildren<PropTypes>) {\n const { config, ...otherProps } = props;\n return (\n <AppStoreProvider config={config}>\n <Main {...otherProps} config={config} />\n </AppStoreProvider>\n );\n}\n", "import type { WidgetConfig } from '../../types';\nimport type { ProvidersOptions } from '../../utils/providers';\nimport type { ProviderInterface } from '@rango-dev/wallets-react';\n\nimport { useEffect } from 'react';\n\nimport { useWalletsStore } from '../../store/wallets';\nimport { matchAndGenerateProviders } from '../../utils/providers';\n\nimport { hashProviders } from './useWalletProviders.helpers';\n\nexport function useWalletProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n) {\n const clearConnectedWallet = useWalletsStore.use.clearConnectedWallet();\n let generateProviders: ProviderInterface[] = matchAndGenerateProviders(\n providers,\n options\n );\n\n useEffect(() => {\n clearConnectedWallet();\n generateProviders = matchAndGenerateProviders(providers, options);\n }, [\n hashProviders(providers ?? []),\n options?.walletConnectProjectId,\n options?.walletConnectListedDesktopWalletLink,\n ]);\n\n return {\n providers: generateProviders,\n };\n}\n", "import type { ProviderInterface } from '@rango-dev/wallets-react';\n\nexport function hashProviders(\n providers: (string | ProviderInterface)[]\n): string {\n return providers\n .map((provider) => {\n if (typeof provider === 'string') {\n return provider;\n }\n return provider.config.type;\n })\n .join('-');\n}\n", "import type { WidgetProps } from './Widget.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React from 'react';\n\nimport { AppRouter } from '../../components/AppRouter';\nimport { DEFAULT_CONFIG } from '../../store/slices/config';\nimport { Main } from '../App';\nimport { WidgetProvider } from '../WidgetProvider';\n\nexport function Widget(props: PropsWithChildren<WidgetProps>) {\n const isExternalWalletsEnabled = props.config?.externalWallets;\n\n return (\n <AppRouter>\n {isExternalWalletsEnabled ? (\n <Main />\n ) : (\n <WidgetProvider config={props.config ?? DEFAULT_CONFIG}>\n <Main />\n </WidgetProvider>\n )}\n </AppRouter>\n );\n}\n", "import type { PropsWithChildren } from 'react';\n\nimport React, { Fragment } from 'react';\nimport { MemoryRouter, useInRouterContext } from 'react-router';\n\nexport function AppRouter({ children }: PropsWithChildren) {\n const isRouterInContext = useInRouterContext();\n const Router = isRouterInContext ? Fragment : MemoryRouter;\n\n return <Router>{children}</Router>;\n}\n", "import { I18nManager } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { AppRoutes } from '../../components/AppRoutes';\nimport { useBootstrap } from '../../hooks/useBootstrap';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\n\nimport { MainContainer } from './App.styles';\n\nexport function Main() {\n useBootstrap();\n const { config } = useAppStore();\n const { activeTheme } = useTheme(config?.theme || {});\n const { activeLanguage } = useLanguage();\n\n return (\n <I18nManager language={activeLanguage}>\n <MainContainer id=\"swap-container\" className={activeTheme()}>\n <AppRoutes />\n </MainContainer>\n </I18nManager>\n );\n}\n", "import React from 'react';\nimport { useRoutes } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useSyncStoresWithConfig } from '../hooks/useSyncStoresWithConfig';\nimport { useSyncUrlAndStore } from '../hooks/useSyncUrlAndStore';\nimport { AddCustomTokenPage } from '../pages/AddCustomTokenPage';\nimport { ConfirmSwapPage } from '../pages/ConfirmSwapPage';\nimport { CustomTokensPage } from '../pages/CustomTokensPage';\nimport { HistoryPage } from '../pages/HistoryPage';\nimport { Home } from '../pages/Home';\nimport { LanguagePage } from '../pages/LanguagePage';\nimport { LiquiditySourcePage } from '../pages/LiquiditySourcePage';\nimport { RoutesPage } from '../pages/Routes';\nimport { SelectBlockchainPage } from '../pages/SelectBlockchainPage';\nimport { SelectSwapItemsPage } from '../pages/SelectSwapItemsPage';\nimport { SettingsPage } from '../pages/SettingsPage';\nimport { SwapDetailsPage } from '../pages/SwapDetailsPage';\nimport { WalletsPage } from '../pages/WalletsPage';\n\nexport function AppRoutes() {\n /**\n * The configuration of the widget should initially be applied to the widget state.\n * If search parameters exist in the URL,\n * they should be applied later and take precedence over the widget configuration.\n * To achieve this, it is crucial to execute these hooks in the correct sequence.\n */\n useSyncStoresWithConfig();\n useSyncUrlAndStore();\n\n return useRoutes([\n {\n path: navigationRoutes.home,\n element: <Home />,\n },\n {\n path: navigationRoutes.routes,\n element: <RoutesPage />,\n },\n {\n path: navigationRoutes.fromSwap,\n children: [\n {\n index: true,\n element: <SelectSwapItemsPage type=\"source\" />,\n },\n {\n path: navigationRoutes.blockchains,\n element: <SelectBlockchainPage type=\"source\" />,\n },\n ],\n },\n {\n path: navigationRoutes.toSwap,\n children: [\n {\n index: true,\n element: <SelectSwapItemsPage type=\"destination\" />,\n },\n {\n path: navigationRoutes.blockchains,\n element: <SelectBlockchainPage type=\"destination\" />,\n },\n ],\n },\n {\n path: navigationRoutes.settings,\n children: [\n {\n index: true,\n element: <SettingsPage />,\n },\n {\n path: navigationRoutes.languages,\n element: <LanguagePage />,\n },\n {\n path: navigationRoutes.exchanges,\n element: <LiquiditySourcePage sourceType=\"Exchanges\" />,\n },\n {\n path: navigationRoutes.bridges,\n element: <LiquiditySourcePage sourceType=\"Bridges\" />,\n },\n {\n path: navigationRoutes.customTokens,\n children: [\n {\n index: true,\n element: <CustomTokensPage />,\n },\n {\n path: navigationRoutes.addCustomTokens,\n children: [\n {\n index: true,\n element: <AddCustomTokenPage />,\n },\n {\n path: navigationRoutes.blockchains,\n element: (\n <SelectBlockchainPage\n hideCategory={true}\n type=\"custom-token\"\n />\n ),\n },\n ],\n },\n ],\n },\n ],\n },\n\n {\n path: navigationRoutes.swaps,\n children: [\n {\n index: true,\n element: <HistoryPage />,\n },\n {\n path: navigationRoutes.swapDetails,\n element: <SwapDetailsPage />,\n },\n ],\n },\n {\n path: navigationRoutes.wallets,\n element: <WalletsPage />,\n },\n {\n path: navigationRoutes.confirmSwap,\n element: <ConfirmSwapPage />,\n },\n ]);\n}\n", "export const navigationRoutes = {\n home: '/',\n fromSwap: 'from-swap',\n toSwap: 'to-swap',\n blockchains: 'blockchains',\n settings: 'settings',\n customTokens: 'custom-tokens',\n addCustomTokens: 'add-custom-tokens',\n liquiditySources: 'liquidity-sources',\n bridges: 'bridges',\n exchanges: 'exchanges',\n languages: 'languages',\n swaps: 'swaps',\n wallets: 'wallets',\n confirmSwap: 'confirm-swap',\n swapDetails: ':requestId',\n routes: 'routes',\n};\n", "import type { Asset } from 'rango-sdk';\n\nimport { useEffect, useRef } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport {\n isBlockchainExcludedInConfig,\n isTokenExcludedInConfig,\n} from '../utils/configs';\n\nexport function useSyncStoresWithConfig() {\n const {\n setInputAmount,\n setToToken,\n setToBlockchain,\n setFromBlockchain,\n resetQuote,\n setFromToken,\n fromToken,\n toToken,\n fromBlockchain,\n toBlockchain,\n } = useQuoteStore();\n\n const config = useAppStore().config;\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const { findToken } = useAppStore();\n\n const { setAffiliateRef, setAffiliatePercent, setAffiliateWallets } =\n useAppStore();\n\n const fromTokensConfig = config?.from?.tokens;\n const fromBlockchainsConfig = config?.from?.blockchains;\n const toTokensConfig = config?.to?.tokens;\n const toBlockchainsConfig = config?.to?.blockchains;\n const prevConfigFromToken = useRef<Asset | undefined>(undefined);\n const prevConfigToToken = useRef<Asset | undefined>(undefined);\n const prevConfigFromBlockchain = useRef<string | undefined>(undefined);\n const prevConfigToBlockchain = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n if (typeof config.amount !== 'undefined') {\n setInputAmount(config.amount.toString());\n }\n }, [config?.amount]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n resetQuote();\n const chain = blockchains.find(\n (chain) => chain.name === config?.from?.blockchain\n );\n const fromToken = config?.from?.token;\n const token = fromToken && findToken(fromToken);\n\n if (chain || (!chain && prevConfigFromBlockchain.current)) {\n setFromBlockchain(chain ?? null);\n }\n\n if (token) {\n setFromToken({ token, meta: { blockchains, tokens } });\n } else if (!token && prevConfigFromToken.current) {\n setFromToken({ token: null });\n }\n\n prevConfigFromBlockchain.current = config?.from?.blockchain;\n prevConfigFromToken.current = config?.from?.token;\n }\n }, [\n config?.from?.token?.symbol,\n config?.from?.token?.address,\n config?.from?.token?.blockchain,\n config?.from?.blockchain,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n if (isTokenExcludedInConfig(fromToken, fromTokensConfig)) {\n setFromToken({ token: null });\n }\n\n if (isBlockchainExcludedInConfig(fromBlockchain, fromBlockchainsConfig)) {\n setFromBlockchain(null);\n }\n }, [fromTokensConfig, fromBlockchainsConfig]);\n\n useEffect(() => {\n if (isTokenExcludedInConfig(toToken, toTokensConfig)) {\n setFromToken({ token: null });\n }\n if (isBlockchainExcludedInConfig(toBlockchain, toBlockchainsConfig)) {\n setToBlockchain(null);\n }\n }, [toTokensConfig, toBlockchainsConfig]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n resetQuote();\n const chain = blockchains.find(\n (chain) => chain.name === config?.to?.blockchain\n );\n\n const toToken = config?.to?.token;\n const token = toToken && findToken(toToken);\n\n if (chain || (!chain && prevConfigToBlockchain.current)) {\n setToBlockchain(chain ?? null);\n }\n\n if (token) {\n setToToken({ token, meta: { blockchains, tokens } });\n } else if (!token && prevConfigToToken.current) {\n setToToken({ token: null });\n }\n\n prevConfigToBlockchain.current = config?.to?.blockchain;\n prevConfigToToken.current = config?.to?.token;\n }\n }, [\n config?.to?.token?.symbol,\n config?.to?.token?.address,\n config?.to?.token?.blockchain,\n config?.to?.blockchain,\n fetchMetaStatus,\n ]);\n\n useEffect(() => {\n setAffiliateRef(config?.affiliate?.ref ?? null);\n setAffiliatePercent(config?.affiliate?.percent ?? null);\n setAffiliateWallets(config?.affiliate?.wallets ?? null);\n }, [\n config?.affiliate?.ref,\n config?.affiliate?.percent,\n config?.affiliate?.wallets,\n ]);\n}\n", "import type {\n BlockchainMeta,\n MetaResponse,\n MultiRouteResponse,\n PreferenceType,\n Token,\n} from 'rango-sdk';\n\nimport BigNumber from 'bignumber.js';\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\n\nimport { ZERO } from '../constants/numbers';\nimport { eventEmitter } from '../services/eventEmitter';\nimport {\n type QuoteError,\n QuoteEventTypes,\n type QuoteWarning,\n type SelectedQuote,\n type Wallet,\n WidgetEvents,\n} from '../types';\nimport { isPositiveNumber } from '../utils/numbers';\nimport {\n getQuoteFromTokenUsdPrice,\n getQuoteToTokenUsdPrice,\n} from '../utils/quote';\nimport { calcOutputUsdValue } from '../utils/swap';\n\nimport createSelectors from './selectors';\n\nexport const getUsdValue = (\n token: Token | null,\n amount: string\n): BigNumber | null =>\n token?.usdPrice\n ? new BigNumber(amount || ZERO).multipliedBy(token?.usdPrice || 0)\n : null;\n\nexport type Meta = Pick<MetaResponse, 'blockchains' | 'tokens'>;\n\nexport type SetTokenParams = { token: Token; meta: Meta } | { token: null };\n\ntype SomeQuoteState = {\n quotes: MultiRouteResponse | null;\n sortStrategy: PreferenceType;\n refetchQuote: boolean;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n};\nexport type RetryQuote = {\n fromBlockchain: BlockchainMeta | null;\n fromToken?: Token;\n toBlockchain: BlockchainMeta | null;\n toToken?: Token;\n inputAmount: string;\n};\nexport interface QuoteState {\n fromBlockchain: BlockchainMeta | null;\n toBlockchain: BlockchainMeta | null;\n inputAmount: string;\n inputUsdValue: BigNumber | null;\n outputAmount: BigNumber | null;\n outputUsdValue: BigNumber | null;\n fromToken: Token | null;\n sortStrategy: PreferenceType;\n toToken: Token | null;\n quoteWalletsConfirmed: boolean;\n selectedWallets: Wallet[];\n quoteWarningsConfirmed: boolean;\n refetchQuote: boolean;\n selectedQuote: SelectedQuote | null;\n quotes: MultiRouteResponse | null;\n customDestination: string | null;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n resetQuote: () => void;\n resetAlerts: () => void;\n\n resetToBlockchain: () => void;\n resetFromBlockchain: () => void;\n setFromBlockchain: (chain: BlockchainMeta | null) => void;\n setToBlockchain: (chian: BlockchainMeta | null) => void;\n setFromToken: (params: SetTokenParams) => void;\n setToToken: (params: SetTokenParams) => void;\n updateQuotePartialState: <K extends keyof SomeQuoteState>(\n key: K,\n value: SomeQuoteState[K]\n ) => void;\n setInputAmount: (amount: string) => void;\n setSelectedQuote: (quote: SelectedQuote | null) => void;\n retry: (retryQuote: RetryQuote) => void;\n switchFromAndTo: () => void;\n setQuoteWalletConfirmed: (flag: boolean) => void;\n setSelectedWallets: (wallets: Wallet[]) => void;\n setCustomDestination: (address: string | null) => void;\n resetQuoteWallets: () => void;\n setQuoteWarningsConfirmed: (flag: boolean) => void;\n}\n\nexport const useQuoteStore = createSelectors(\n create<QuoteState>()(\n subscribeWithSelector((set) => ({\n fromBlockchain: null,\n fromToken: null,\n inputAmount: '',\n outputAmount: null,\n inputUsdValue: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n toBlockchain: null,\n toToken: null,\n refetchQuote: true,\n sortStrategy: 'SMART',\n selectedQuote: null,\n quotes: null,\n error: null,\n warning: null,\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: null,\n quoteWarningsConfirmed: false,\n updateQuotePartialState: (key, value) =>\n set((state) => ({\n ...state,\n [key]: value,\n })),\n setSelectedQuote: (quote) =>\n set((state) => {\n let outputAmount: BigNumber | null = null;\n let outputUsdValue: BigNumber = ZERO;\n\n let inputUsdValue = state.inputUsdValue;\n if (!isPositiveNumber(state.inputAmount)) {\n return {};\n }\n if (!!quote) {\n outputAmount = !!quote?.outputAmount\n ? new BigNumber(quote?.outputAmount)\n : null;\n inputUsdValue = calcOutputUsdValue(\n state.inputAmount,\n getQuoteFromTokenUsdPrice(quote) || state.fromToken?.usdPrice\n );\n outputUsdValue = calcOutputUsdValue(\n quote.outputAmount,\n getQuoteToTokenUsdPrice(quote) || state.toToken?.usdPrice\n );\n }\n return {\n selectedQuote: quote,\n ...(!!quote && {\n outputAmount,\n outputUsdValue,\n inputUsdValue,\n }),\n };\n }),\n resetAlerts: () =>\n set(() => ({\n error: null,\n warning: null,\n })),\n resetQuote: () =>\n set(() => ({\n selectedQuote: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n quotes: null,\n refetchQuote: true,\n error: null,\n warning: null,\n })),\n setFromBlockchain: (chain) => {\n set((state) => {\n if (state.fromBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n fromBlockchain: chain,\n inputUsdValue: new BigNumber(0),\n ...(state.fromToken && {\n selectedQuote: null,\n fromToken: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n }),\n };\n });\n },\n setFromToken: (params) => {\n return set((state) => ({\n fromToken: params.token,\n ...(params.token && {\n fromBlockchain:\n params.meta.blockchains.find(\n (blockchain) => blockchain.name === params.token.blockchain\n ) ?? null,\n }),\n ...(!!state.inputAmount && {\n inputUsdValue: getUsdValue(params.token, state.inputAmount),\n }),\n }));\n },\n setToBlockchain: (chain) => {\n set((state) => {\n if (state.toBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n toBlockchain: chain,\n ...(state.toToken && {\n selectedQuote: null,\n toToken: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n }),\n };\n });\n },\n setToToken: (params) => {\n return set(() => ({\n toToken: params.token,\n ...(params.token && {\n toBlockchain:\n params.meta.blockchains.find(\n (blockchain) => blockchain.name === params.token.blockchain\n ) ?? null,\n }),\n }));\n },\n setInputAmount: (amount) => {\n set((state) => ({\n inputAmount: amount,\n ...(!amount && {\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n selectedQuote: null,\n }),\n ...(!!state.fromToken && {\n inputUsdValue: getUsdValue(state.fromToken, amount),\n }),\n }));\n },\n retry: (retryQuote) => {\n const {\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n inputAmount,\n } = retryQuote;\n\n set({\n fromBlockchain,\n fromToken,\n inputAmount,\n outputAmount: null,\n inputUsdValue: getUsdValue(fromToken ?? null, inputAmount),\n outputUsdValue: new BigNumber(0),\n toBlockchain,\n toToken,\n selectedQuote: null,\n });\n },\n switchFromAndTo: () =>\n set((state) => ({\n fromBlockchain: state.toBlockchain,\n fromToken: state.toToken,\n toBlockchain: state.fromBlockchain,\n toToken: state.fromToken,\n inputAmount: state.outputAmount?.toString() || '',\n inputUsdValue: state.toToken\n ? getUsdValue(state.toToken, state.outputAmount?.toString() || '')\n : new BigNumber(0),\n })),\n resetFromBlockchain: () =>\n set(() => ({\n fromToken: null,\n fromBlockchain: null,\n outputUsdValue: new BigNumber(0),\n inputUsdValue: new BigNumber(0),\n inputAmount: '',\n outputAmount: null,\n selectedQuote: null,\n })),\n resetToBlockchain: () =>\n set(() => ({\n toToken: null,\n toBlockchain: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n selectedQuote: null,\n })),\n setQuoteWalletConfirmed: (flag) =>\n set({\n quoteWalletsConfirmed: flag,\n }),\n setSelectedWallets: (wallets) => set({ selectedWallets: wallets }),\n setCustomDestination: (address) => set({ customDestination: address }),\n resetQuoteWallets: () =>\n set({\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: null,\n }),\n setQuoteWarningsConfirmed: (flag) =>\n set({ quoteWarningsConfirmed: flag }),\n }))\n )\n);\n\nexport const unsubscribeQuoteStore = useQuoteStore.subscribe(\n (selectedState, previousSelectedState) => {\n if (\n selectedState.fromBlockchain !== previousSelectedState.fromBlockchain ||\n selectedState.fromToken !== previousSelectedState.fromToken ||\n selectedState.toBlockchain !== previousSelectedState.toBlockchain ||\n selectedState.toToken !== previousSelectedState.toToken ||\n selectedState.inputAmount !== previousSelectedState.inputAmount\n ) {\n // useEffect hook can not be used in Zustand subscribe\n eventEmitter.emit(WidgetEvents.QuoteEvent, {\n type: QuoteEventTypes.QUOTE_INPUT_UPDATE,\n payload: {\n fromBlockchain: selectedState.fromBlockchain?.name,\n toBlockchain: selectedState.toBlockchain?.name,\n fromToken: selectedState.fromToken\n ? {\n symbol: selectedState.fromToken.symbol,\n name: selectedState.fromToken.name,\n address: selectedState.fromToken.address,\n }\n : undefined,\n toToken: selectedState.toToken\n ? {\n symbol: selectedState.toToken.symbol,\n name: selectedState.toToken.name,\n address: selectedState.toToken.address,\n }\n : undefined,\n requestAmount: selectedState.inputAmount,\n },\n });\n }\n\n if (\n selectedState.selectedQuote?.requestId !==\n previousSelectedState.selectedQuote?.requestId\n ) {\n eventEmitter.emit(WidgetEvents.QuoteEvent, {\n type: QuoteEventTypes.QUOTE_OUTPUT_UPDATE,\n payload: selectedState.selectedQuote\n ? {\n requestAmount: selectedState.selectedQuote.requestAmount,\n swaps: selectedState.selectedQuote.swaps,\n outputAmount: selectedState.selectedQuote.outputAmount,\n resultType: selectedState.selectedQuote.resultType,\n tags: selectedState.selectedQuote.tags,\n }\n : null,\n });\n }\n }\n);\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { RetryQuote } from '../store/quote';\nimport type { FindToken } from '../store/slices/data';\nimport type { QuoteWarning, SelectedQuote, Wallet } from '../types';\nimport type {\n PriceImpactWarningLevel,\n SimulationAssetAndAmount,\n SimulationValidationStatus,\n Step,\n} from '@rango-dev/ui';\nimport type {\n Asset,\n BlockchainMeta,\n MultiRouteResponse,\n MultiRouteSimulationResult,\n PreferenceType,\n RouteTag,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap } from 'rango-types';\n\nimport { getLastSuccessfulStep } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\n\nimport { HIGH_PRIORITY_TAGS } from '../constants/quote';\nimport { HIGHT_PRICE_IMPACT, LOW_PRICE_IMPACT } from '../constants/routing';\nimport { HIGH_SLIPPAGE } from '../constants/swapSettings';\nimport { QuoteWarningType } from '../types';\n\nimport { areEqual } from './common';\nimport { createTokenHash, findBlockchain } from './meta';\nimport {\n calcOutputUsdValue,\n checkSlippageWarnings,\n getMinRequiredSlippage,\n getPercentageChange,\n getTotalFeeInUsd,\n hasHighValueLoss,\n hasProperSlippage,\n} from './swap';\n\nexport function getQuoteToTokenUsdPrice(\n quote: SelectedQuote | null\n): number | null | undefined {\n const swaps = quote?.swaps || [];\n return swaps[swaps.length - 1].to.usdPrice;\n}\n\nexport function getQuoteFromTokenUsdPrice(\n quote: SelectedQuote | null\n): number | null | undefined {\n const swaps = quote?.swaps || [];\n return swaps[0].from.usdPrice;\n}\n\nexport function isNumberOfSwapsChanged(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteASwaps = quoteA?.swaps || [];\n const quoteBSwaps = quoteB?.swaps || [];\n return quoteASwaps.length !== quoteBSwaps.length;\n}\n\nexport function isQuoteSwappersUpdated(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteASwappers = quoteA?.swaps.map((swap) => swap.swapperId) || [];\n const quoteBSwappers = quoteB?.swaps.map((swap) => swap.swapperId) || [];\n return !areEqual(quoteASwappers, quoteBSwappers);\n}\n\nexport function isQuoteInternalCoinsUpdated(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n) {\n const quoteAInternalCoins = quoteA?.swaps.map((swap) => swap.to.symbol) || [];\n const quoteBInternalCoins = quoteB?.swaps.map((swap) => swap.to.symbol) || [];\n return !areEqual(quoteAInternalCoins, quoteBInternalCoins);\n}\n\nexport function isQuoteChanged(\n quoteA: SelectedQuote,\n quoteB: SelectedQuote\n): boolean {\n return (\n isNumberOfSwapsChanged(quoteA, quoteB) ||\n isQuoteSwappersUpdated(quoteA, quoteB) ||\n isQuoteInternalCoinsUpdated(quoteA, quoteB)\n );\n}\n\nexport function outToRatioHasWarning(\n fromUsdValue: BigNumber | null,\n outToInRatio: BigNumber | 0\n) {\n return (\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -10 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(200)))) ||\n (parseInt(outToInRatio?.toFixed(2) || '0') <= -5 &&\n (fromUsdValue === null || fromUsdValue.gte(new BigNumber(1000))))\n );\n}\n\nexport function getRequiredBalanceOfWallet(\n selectedWallet: Wallet,\n fee: SimulationValidationStatus[] | null\n): SimulationAssetAndAmount[] | null {\n if (fee === null) {\n return null;\n }\n const relatedFeeStatus = fee\n ?.find((item) => item.blockchain === selectedWallet.chain)\n ?.wallets.find(\n (wallet) =>\n wallet.address?.toLowerCase() === selectedWallet.address.toLowerCase()\n );\n if (!relatedFeeStatus) {\n return null;\n }\n return relatedFeeStatus.requiredAssets;\n}\n\nexport function getPriceImpactLevel(\n priceImpact: number\n): PriceImpactWarningLevel {\n let warningLevel: PriceImpactWarningLevel = undefined;\n if (priceImpact <= LOW_PRICE_IMPACT && priceImpact > HIGHT_PRICE_IMPACT) {\n warningLevel = 'low';\n } else if (priceImpact <= HIGHT_PRICE_IMPACT) {\n warningLevel = 'high';\n }\n\n return warningLevel;\n}\n\nexport function findCommonTokens<T extends Asset[], R extends Asset[]>(\n listA: T,\n listB: R\n) {\n const set = new Set();\n\n listA.forEach((token) => set.add(createTokenHash(token)));\n\n return listB.filter((token) => set.has(createTokenHash(token))) as R;\n}\n\nexport function createRetryQuote(\n pendingSwap: PendingSwap,\n blockchains: BlockchainMeta[],\n findToken: FindToken\n): RetryQuote {\n const firstStep = pendingSwap.steps[0];\n const lastStep = pendingSwap.steps[pendingSwap.steps.length - 1];\n const lastSuccessfulStep = getLastSuccessfulStep(pendingSwap.steps);\n\n const toToken = {\n blockchain: lastStep.toBlockchain,\n symbol: lastStep.toSymbol,\n address: lastStep.toSymbolAddress,\n };\n\n const fromBlockchainMeta = findBlockchain(\n lastSuccessfulStep\n ? lastSuccessfulStep.toBlockchain\n : firstStep.fromBlockchain,\n blockchains\n );\n const toBlockchainMeta = findBlockchain(lastStep.toBlockchain, blockchains);\n const fromTokenMeta = findToken(\n lastSuccessfulStep\n ? {\n blockchain: fromBlockchainMeta?.name ?? '',\n symbol: lastSuccessfulStep.toSymbol,\n address: lastSuccessfulStep.toSymbolAddress,\n }\n : {\n blockchain: fromBlockchainMeta?.name ?? '',\n symbol: firstStep.fromSymbol,\n address: firstStep.fromSymbolAddress,\n }\n );\n const toTokenMeta = findToken(toToken);\n const inputAmount = lastSuccessfulStep\n ? lastSuccessfulStep.outputAmount ?? ''\n : pendingSwap.inputAmount;\n\n return {\n fromBlockchain: fromBlockchainMeta,\n fromToken: fromTokenMeta,\n toBlockchain: toBlockchainMeta,\n toToken: toTokenMeta,\n inputAmount,\n };\n}\n\nexport function generateQuoteWarnings(\n quote: SelectedQuote,\n params: {\n fromToken: Token;\n toToken: Token;\n findToken: FindToken;\n userSlippage: number;\n }\n): QuoteWarning | null {\n const { fromToken, toToken, findToken, userSlippage } = params;\n const inputUsdValue = calcOutputUsdValue(\n quote.requestAmount,\n getQuoteFromTokenUsdPrice(quote) || fromToken?.usdPrice\n );\n const outputUsdValue = calcOutputUsdValue(\n quote.outputAmount,\n getQuoteToTokenUsdPrice(quote) || toToken?.usdPrice\n );\n\n if (!!quote && inputUsdValue && outputUsdValue) {\n const priceImpact = getPriceImpact(\n inputUsdValue.toString(),\n outputUsdValue.toString()\n );\n const highValueLoss =\n !!priceImpact && hasHighValueLoss(inputUsdValue, priceImpact);\n\n if (highValueLoss) {\n const totalFee = getTotalFeeInUsd(quote?.swaps, findToken);\n const warningLevel = getPriceImpactLevel(priceImpact);\n return {\n type: QuoteWarningType.HIGH_VALUE_LOSS,\n inputUsdValue,\n outputUsdValue,\n priceImpact,\n totalFee,\n warningLevel,\n };\n }\n } else if (quote && (!inputUsdValue || !outputUsdValue)) {\n return { type: QuoteWarningType.UNKNOWN_PRICE };\n }\n\n const minRequiredSlippage = getMinRequiredSlippage(quote.swaps);\n const highSlippage = userSlippage > HIGH_SLIPPAGE;\n\n if (!hasProperSlippage(params.userSlippage.toString(), minRequiredSlippage)) {\n return {\n type: QuoteWarningType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages: checkSlippageWarnings(quote, userSlippage),\n minRequiredSlippage: minRequiredSlippage,\n };\n } else if (\n highSlippage &&\n parseFloat(minRequiredSlippage ?? '0') < userSlippage\n ) {\n return {\n type: QuoteWarningType.HIGH_SLIPPAGE,\n slippage: userSlippage.toString(),\n };\n }\n\n return null;\n}\n\nexport function getPriceImpact(\n inputUsdValue: BigNumber | string | null,\n outputUsdValue: BigNumber | string | null\n): number | null {\n const outputUsdValueIsInvalid =\n typeof outputUsdValue === 'string'\n ? parseFloat(outputUsdValue) <= 0\n : !outputUsdValue?.gt(0);\n const percentageChange =\n !inputUsdValue || !outputUsdValue || outputUsdValueIsInvalid\n ? null\n : getPercentageChange(\n inputUsdValue.toString(),\n outputUsdValue.toString()\n );\n\n return percentageChange && percentageChange < 0 ? percentageChange : null;\n}\n\nexport const getUniqueBlockchains = (steps: Step[]) => {\n const set = new Set();\n const result: { displayName: string; image: string }[] = [];\n steps.forEach((step) => {\n if (!set.has(step.from.chain.displayName)) {\n set.add(step.from.chain.displayName);\n result.push(step.from.chain);\n }\n if (!set.has(step.to.chain.displayName)) {\n set.add(step.to.chain.displayName);\n result.push(step.to.chain);\n }\n });\n\n return result;\n};\n\nexport const sortQuotesBy = (\n strategy: PreferenceType,\n quotes: MultiRouteResponse['results']\n): MultiRouteResponse['results'] => {\n return quotes.sort((quote1, quote2) => {\n const getScore = (route: MultiRouteSimulationResult) =>\n route.scores?.find((score) => score.preferenceType === strategy)?.score ??\n 0;\n\n const quote1Score = getScore(quote1);\n const quote2Score = getScore(quote2);\n\n if (quote1Score !== quote2Score) {\n return quote2Score - quote1Score;\n }\n\n const lowerQuoteId1 = quote1.requestId.toLowerCase();\n const lowerQuoteId2 = quote2.requestId.toLowerCase();\n\n return lowerQuoteId1.localeCompare(lowerQuoteId2);\n });\n};\n\nexport const getDefaultQuote = (\n currentQuote: SelectedQuote | null,\n quotes: MultiRouteSimulationResult[],\n requestAmount: string\n): SelectedQuote | null => {\n if (!quotes.length) {\n return null;\n }\n if (!currentQuote) {\n // Handle the case where currentQuote is null\n return {\n requestAmount: requestAmount,\n ...quotes[0], // Return the first quote from the quotes array\n };\n }\n // Create a set of swapperIds from the currentQuote swaps\n const currentQuoteSwapperIds = new Set(\n currentQuote.swaps.map((swap) => swap.swapperId)\n );\n\n // Find a quote that matches the currentQuote's swapperIds\n const matchedQuote = quotes.find((quote) => {\n // Create a set of swapperIds from the quote swaps\n const quoteSwapperIds = new Set(quote.swaps.map((swap) => swap.swapperId));\n\n // Check if all swapperIds from the currentQuote are present in the quoteSwapperIds\n return Array.from(currentQuoteSwapperIds).every((swapperId) =>\n quoteSwapperIds.has(swapperId)\n );\n });\n\n // Return the matchedQuote if found, otherwise return the first quote from the quotes array\n return {\n requestAmount: requestAmount,\n ...(matchedQuote || quotes[0]),\n };\n};\n\nexport const sortTags = (tags: RouteTag[]): RouteTag[] => {\n const customSort = (a: RouteTag, b: RouteTag) => {\n const indexA = HIGH_PRIORITY_TAGS.indexOf(a.value);\n const indexB = HIGH_PRIORITY_TAGS.indexOf(b.value);\n\n if (indexA !== -1 && indexB !== -1) {\n return indexA - indexB;\n }\n\n if (indexA !== -1) {\n return -1;\n } else if (indexB !== -1) {\n return 1;\n }\n\n return 0;\n };\n\n return tags.sort(customSort);\n};\n", "import type { I18n } from '@lingui/core';\nimport type { SwapFee, TagValue } from 'rango-sdk';\n\nexport type NameOfFees =\n | 'Swapper Fee'\n | 'Affiliate Fee'\n | 'Outbound network fee'\n | 'Rango Fee'\n | 'Network Fee';\n\nexport function getFeeLabel(fee: NameOfFees, t: I18n['t']): string {\n const data: Record<NameOfFees, string> = {\n 'Network Fee': t('Network Fee'),\n 'Swapper Fee': t('Protocol Fee'),\n 'Affiliate Fee': t('Affiliate Fee'),\n 'Outbound network fee': t('Outbound Fee'),\n 'Rango Fee': t('Rango Fee'),\n };\n return data[fee];\n}\n\nexport type FeesGroup = {\n payable: { [key in NameOfFees]?: SwapFee[] };\n nonePayable: { [key in NameOfFees]?: SwapFee[] };\n};\n\nexport const HIGH_PRIORITY_TAGS: TagValue[] = [\n 'RECOMMENDED',\n 'CENTRALIZED',\n 'LOWEST_FEE',\n 'FASTEST',\n 'HIGH_IMPACT',\n];\n\nexport const GAS_FEE_MAX = 30;\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { FeesGroup, NameOfFees } from '../constants/quote';\nimport type { FetchStatus, FindToken } from '../store/slices/data';\nimport type { ConnectedWallet } from '../store/wallets';\nimport type {\n ConvertedToken,\n QuoteError,\n QuoteWarning,\n RecommendedSlippages,\n SelectedQuote,\n SwapButtonState,\n Wallet,\n} from '../types';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type {\n BestRouteRequest,\n BlockchainMeta,\n RecommendedSlippage,\n SwapFee,\n SwapResult,\n Token,\n} from 'rango-sdk';\nimport type { PendingSwap, PendingSwapStep } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport {\n type RouteEvent,\n RouteEventType,\n type StepEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nimport { errorMessages } from '../constants/errors';\nimport { swapButtonTitles } from '../constants/messages';\nimport { ZERO } from '../constants/numbers';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../constants/routing';\n\nimport { getBlockchainShortNameFor, isValidTokenAddress } from './meta';\nimport { numberToString } from './numbers';\nimport { getPriceImpact, getRequiredBalanceOfWallet } from './quote';\nimport { getQuoteWallets } from './wallets';\n\nexport function getOutputRatio(\n inputUsdValue: BigNumber | null,\n outputUsdValue: BigNumber | null\n) {\n if (\n !inputUsdValue ||\n !outputUsdValue ||\n inputUsdValue.lte(ZERO) ||\n outputUsdValue.lte(ZERO)\n ) {\n return 0;\n }\n return outputUsdValue\n .div(inputUsdValue)\n .minus(1)\n .multipliedBy(100)\n .toNumber();\n}\n\nexport function hasHighValueLoss(\n inputUsdValue: BigNumber | null,\n priceImpact: number\n): boolean {\n return (\n ((parseInt(priceImpact.toFixed(2) || '0') <= -10 &&\n inputUsdValue?.gte(new BigNumber(400))) ||\n (parseInt(priceImpact.toFixed(2) || '0') <= -5 &&\n inputUsdValue?.gte(new BigNumber(1000)))) ??\n false\n );\n}\n\nexport function hasLimitError(swaps: SwapResult[]): boolean {\n return (\n (swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n }\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n }).length > 0\n );\n}\n\nexport function getLimitErrorMessage(swaps: SwapResult[]): {\n swap: SwapResult;\n fromAmountRangeError: string;\n recommendation: string;\n} {\n const swap = (swaps || []).filter((swap) => {\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n if (isExclusive) {\n return minimum?.gte(swap.fromAmount) || maximum?.lte(swap.fromAmount);\n }\n return minimum?.gt(swap.fromAmount) || maximum?.lt(swap.fromAmount);\n })[0];\n\n const minimum = !!swap.fromAmountMinValue\n ? new BigNumber(swap.fromAmountMinValue)\n : null;\n const maximum = !!swap.fromAmountMaxValue\n ? new BigNumber(swap.fromAmountMaxValue)\n : null;\n const isExclusive = swap.fromAmountRestrictionType === 'EXCLUSIVE';\n\n let fromAmountRangeError = '';\n let recommendation = '';\n if (!isExclusive && !!minimum && minimum.gt(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: >= {min} {symbol}',\n values: {\n min: numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.increaseAmount;\n } else if (isExclusive && !!minimum && minimum.gte(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: > {min} {symbol}',\n values: {\n min: numberToString(\n minimum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.increaseAmount;\n }\n\n if (!isExclusive && !!maximum && maximum.lt(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: <= {max} {symbol}',\n values: {\n max: numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.decreaseAmount;\n } else if (isExclusive && !!maximum && maximum.lte(swap.fromAmount)) {\n fromAmountRangeError = i18n.t({\n id: 'Required: < {max} {symbol}',\n values: {\n max: numberToString(\n maximum,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap.from.symbol,\n },\n });\n recommendation = errorMessages().bridgeLimitErrors.decreaseAmount;\n }\n\n return { swap, fromAmountRangeError, recommendation };\n}\n\nexport function getSwapButtonState(params: {\n fetchMetaStatus: FetchStatus;\n anyWalletConnected: boolean;\n fetchingQuote: boolean;\n inputAmount: string;\n quote: SelectedQuote | null;\n warning: QuoteWarning | null;\n error: QuoteError | null;\n needsToWarnEthOnPath: boolean;\n}): SwapButtonState {\n const {\n fetchMetaStatus,\n anyWalletConnected,\n fetchingQuote,\n inputAmount,\n quote,\n warning,\n error,\n needsToWarnEthOnPath,\n } = params;\n if (fetchMetaStatus !== 'success') {\n return {\n title: swapButtonTitles().connectWallet,\n action: 'connect-wallet',\n disabled: true,\n };\n }\n if (!anyWalletConnected) {\n return {\n title: swapButtonTitles().connectWallet,\n action: 'connect-wallet',\n disabled: false,\n };\n }\n if (fetchingQuote || !quote || error || !inputAmount || inputAmount === '0') {\n return {\n title: swapButtonTitles().swap,\n action: 'confirm-swap',\n disabled: true,\n };\n } else if (warning) {\n return {\n title: swapButtonTitles().swapAnyway,\n action: 'confirm-warning',\n disabled: false,\n };\n } else if (needsToWarnEthOnPath) {\n return {\n title: swapButtonTitles().ethWarning,\n action: 'confirm-warning',\n disabled: false,\n };\n }\n return {\n title: swapButtonTitles().swap,\n action: 'confirm-swap',\n disabled: false,\n };\n}\n\nexport function canComputePriceImpact(\n quote: SelectedQuote | null,\n inputAmount: string,\n usdValue: BigNumber | null\n) {\n const inputAmountNumber = parseFloat(inputAmount || '0');\n\n return !(\n quote &&\n (!usdValue || usdValue.lte(ZERO)) &&\n inputAmount &&\n inputAmount !== '0' &&\n inputAmountNumber !== 0\n );\n}\n\nexport function getUsdFeeOfStep(\n step: SwapResult,\n findToken: FindToken\n): BigNumber {\n let totalFeeInUsd = ZERO;\n for (let i = 0; i < step.fee.length; i++) {\n const fee = step.fee[i];\n if (fee.expenseType === 'DECREASE_FROM_OUTPUT') {\n continue;\n }\n\n const unitPrice = findToken(fee.asset)?.usdPrice || null;\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(unitPrice || 0)\n );\n }\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeeInUsd(\n swaps: SwapResult[],\n findToken: FindToken\n): BigNumber {\n return swaps.reduce(\n (totalFee: BigNumber, step) =>\n totalFee.plus(getUsdFeeOfStep(step, findToken)),\n ZERO\n );\n}\n\nexport function getUsdFee(fee: SwapFee): BigNumber {\n let totalFeeInUsd = ZERO;\n totalFeeInUsd = totalFeeInUsd.plus(\n new BigNumber(fee.amount).multipliedBy(fee.price || 0)\n );\n\n return totalFeeInUsd;\n}\n\nexport function getTotalFeesInUsd(fees: SwapFee[]): BigNumber {\n return fees.reduce(\n (totalFee: BigNumber, fee) => totalFee.plus(getUsdFee(fee)),\n ZERO\n );\n}\nexport function getFeesGroup(swaps: SwapResult[]): FeesGroup {\n return swaps.reduce(\n (result, swap) => {\n for (const fee of swap.fee) {\n const name = fee.name as NameOfFees;\n const feeGroup =\n fee.expenseType !== 'DECREASE_FROM_OUTPUT'\n ? result.payable\n : result.nonePayable;\n\n feeGroup[name] = [...(feeGroup[name] || []), fee];\n }\n return result;\n },\n { payable: {}, nonePayable: {} } as FeesGroup\n );\n}\n\nexport function hasHighFee(totalFeeInUsd: BigNumber | null) {\n if (!totalFeeInUsd) {\n return false;\n }\n return !totalFeeInUsd.lt(new BigNumber(30));\n}\n\nexport function hasSlippageError(\n slippages: (RecommendedSlippage | null)[] | undefined\n) {\n return (slippages?.filter((s) => !!s?.error)?.length || 0) > 0;\n}\n\nexport function checkSlippageErrors(\n swaps: SwapResult[]\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n swaps.forEach((swap, index) => {\n if (swap.recommendedSlippage?.error) {\n recommendedSlippages.set(index, swap.recommendedSlippage.slippage);\n }\n });\n if (recommendedSlippages.size > 0) {\n return recommendedSlippages;\n }\n return null;\n}\n\nexport function checkSlippageWarnings(\n quote: SelectedQuote,\n userSlippage: number\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n quote?.swaps.forEach((swap, index) => {\n if (\n swap.recommendedSlippage?.slippage &&\n parseFloat(swap.recommendedSlippage.slippage) > userSlippage\n ) {\n recommendedSlippages.set(index, swap.recommendedSlippage.slippage);\n }\n });\n if (recommendedSlippages.size > 0) {\n return recommendedSlippages;\n }\n return null;\n}\n\nexport function getMinRequiredSlippage(swaps: SwapResult[]): string | null {\n const slippages = swaps.map((slippage) => slippage.recommendedSlippage);\n return (\n slippages\n ?.map((s) => s?.slippage || '0')\n ?.filter((s) => parseFloat(s) > 0)\n ?.sort((a, b) => parseFloat(b) - parseFloat(a))\n ?.find(() => true) || null\n );\n}\n\nexport function hasProperSlippage(\n userSlippage: string,\n minRequiredSlippage: string | null\n) {\n if (!minRequiredSlippage) {\n return true;\n }\n return parseFloat(userSlippage) >= parseFloat(minRequiredSlippage);\n}\n\nexport function hasEnoughBalance(\n quote: SelectedQuote,\n selectedWallets: Wallet[]\n) {\n const fee = quote.validationStatus;\n\n if (fee === null || fee.length === 0) {\n return true;\n }\n\n for (const wallet of selectedWallets) {\n const requiredAssets = getRequiredBalanceOfWallet(wallet, fee);\n if (!requiredAssets) {\n continue;\n }\n\n const enoughBalanceInWallet = requiredAssets\n .map((asset) => asset.ok)\n .reduce((previous, current) => previous && current);\n if (!enoughBalanceInWallet) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function hasEnoughBalanceAndProperSlippage(\n quote: SelectedQuote,\n selectedWallets: Wallet[],\n userSlippage: string,\n minRequiredSlippage: string | null\n): boolean {\n return (\n hasEnoughBalance(quote, selectedWallets) &&\n hasProperSlippage(userSlippage, minRequiredSlippage)\n );\n}\n\nexport function createQuoteRequestBody(params: {\n fromToken: Token;\n toToken: Token;\n inputAmount: string;\n wallets?: ConnectedWallet[];\n selectedWallets?: Wallet[];\n liquiditySources?: string[];\n excludeLiquiditySources?: boolean;\n disabledLiquiditySources: string[];\n slippage: number;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\n destination?: string;\n enableCentralizedSwappers?: boolean;\n}): BestRouteRequest {\n const {\n fromToken,\n toToken,\n inputAmount,\n wallets,\n selectedWallets,\n disabledLiquiditySources,\n liquiditySources,\n excludeLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n destination,\n enableCentralizedSwappers,\n } = params;\n const selectedWalletsMap = selectedWallets?.reduce(\n (\n selectedWalletsMap: BestRouteRequest['selectedWallets'],\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = selectedWallet.address),\n selectedWalletsMap\n ),\n {}\n );\n\n const connectedWallets: BestRouteRequest['connectedWallets'] = [];\n\n wallets?.forEach((wallet) => {\n connectedWallets.push({\n blockchain: wallet.chain,\n addresses: [wallet.address],\n });\n });\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const requestBody: BestRouteRequest = {\n amount: inputAmount.toString(),\n affiliateRef: affiliateRef ?? undefined,\n affiliatePercent: affiliatePercent ?? undefined,\n affiliateWallets: affiliateWallets ?? undefined,\n from: {\n address: fromToken.address,\n blockchain: fromToken.blockchain,\n symbol: fromToken.symbol,\n },\n to: {\n address: toToken.address,\n blockchain: toToken.blockchain,\n symbol: toToken.symbol,\n },\n connectedWallets,\n selectedWallets: selectedWalletsMap ?? {},\n slippage: slippage.toString(),\n ...(destination && { destination: destination }),\n ...(excludeLiquiditySources && {\n swapperGroups: disabledLiquiditySources.concat(liquiditySources ?? []),\n swappersGroupsExclude: true,\n }),\n ...(!excludeLiquiditySources && {\n swapperGroups: liquiditySources?.filter(\n (liquiditySource) => !disabledLiquiditySources.includes(liquiditySource)\n ),\n swappersGroupsExclude: false,\n }),\n enableCentralizedSwappers,\n };\n return requestBody;\n}\n\nexport function getWalletsForNewSwap(selectedWallets: Wallet[]) {\n const wallets = selectedWallets.reduce(\n (\n selectedWalletsMap: {\n [p: string]: { address: string; walletType: WalletType };\n },\n selectedWallet\n ) => (\n (selectedWalletsMap[selectedWallet.chain] = {\n address: selectedWallet.address,\n walletType: selectedWallet.walletType,\n }),\n selectedWalletsMap\n ),\n {}\n );\n\n return wallets;\n}\n\nexport function getQuoteOutputAmount(quote: SelectedQuote) {\n return quote?.outputAmount || null;\n}\n\nexport function getPercentageChange(input: string, output: string) {\n return new BigNumber(output)\n .div(new BigNumber(input))\n .minus(1)\n .multipliedBy(100)\n .toNumber();\n}\n\nexport function isOutputAmountChangedALot(\n oldQuote: SelectedQuote,\n newQuote: SelectedQuote\n) {\n const oldOutputAmount = getQuoteOutputAmount(oldQuote);\n const newOutputAmount = getQuoteOutputAmount(newQuote);\n if (!oldOutputAmount || !newOutputAmount) {\n return false;\n }\n const percentageChange = getPriceImpact(oldOutputAmount, newOutputAmount);\n if (!percentageChange) {\n return true;\n }\n\n return percentageChange <= -1;\n}\n\nexport function generateBalanceWarnings(\n quote: SelectedQuote,\n selectedWallets: Wallet[],\n blockchains: BlockchainMeta[]\n) {\n const fee = quote.validationStatus;\n const requiredWallets = getQuoteWallets({ filter: 'required', quote });\n const walletsSortedByRequiredWallets = selectedWallets.sort(\n (selectedWallet1, selectedWallet2) =>\n requiredWallets.indexOf(selectedWallet1.chain) -\n requiredWallets.indexOf(selectedWallet2.chain)\n );\n\n return walletsSortedByRequiredWallets\n .flatMap((wallet) => getRequiredBalanceOfWallet(wallet, fee) || [])\n .filter((asset) => !asset.ok)\n .map((asset) => {\n const symbol = asset.asset.symbol;\n const currentAmount = numberToString(\n new BigNumber(asset.currentAmount.amount).shiftedBy(\n -asset.currentAmount.decimals\n ),\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n const requiredAmount = numberToString(\n new BigNumber(asset.requiredAmount.amount).shiftedBy(\n -asset.requiredAmount.decimals\n ),\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n );\n let reason = '';\n if (asset.reason === 'FEE') {\n reason = i18n.t(' for network fee');\n }\n if (asset.reason === 'INPUT_ASSET') {\n reason = i18n.t(' for swap');\n }\n if (asset.reason === 'FEE_AND_INPUT_ASSET') {\n reason = i18n.t(' for input and network fee');\n }\n const warningMessage = i18n.t({\n id: `Needs \u2248 {requiredAmount} {symbol}{reason}, but you have {currentAmount} {symbol} in your {blockchain} wallet.`,\n values: {\n requiredAmount,\n symbol,\n reason,\n currentAmount,\n blockchain: getBlockchainShortNameFor(\n asset.asset.blockchain,\n blockchains\n ),\n },\n });\n return warningMessage;\n });\n}\n\nexport function calcOutputUsdValue(\n outputAmount?: string,\n tokenPrice?: number | null\n) {\n const amount = !!outputAmount ? new BigNumber(outputAmount) : ZERO;\n\n return amount.multipliedBy(tokenPrice || 0);\n}\n\nexport function isNetworkStatusInWarningState(\n pendingSwapStep: PendingSwapStep | null\n): boolean {\n return (\n !!pendingSwapStep &&\n pendingSwapStep.networkStatus !== null &&\n pendingSwapStep.networkStatus !== PendingSwapNetworkStatus.NetworkChanged\n );\n}\n\nexport function getSwapMessages(\n pendingSwap: PendingSwap,\n currentStep: PendingSwapStep | null\n): {\n shortMessage: string;\n detailedMessage: { content: string; long: boolean };\n} {\n const textForRemove = 'bellow button or';\n let message = pendingSwap.extraMessage;\n let detailedMessage = pendingSwap.extraMessageDetail;\n\n if (pendingSwap.networkStatusExtraMessageDetail?.includes(textForRemove)) {\n pendingSwap.networkStatusExtraMessageDetail =\n pendingSwap.networkStatusExtraMessageDetail.replace(textForRemove, '');\n }\n\n const networkWarningState = isNetworkStatusInWarningState(currentStep);\n\n if (networkWarningState) {\n message = pendingSwap.networkStatusExtraMessage || '';\n detailedMessage = pendingSwap.networkStatusExtraMessageDetail || '';\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n switch (currentStep?.networkStatus) {\n case PendingSwapNetworkStatus.WaitingForConnectingWallet:\n message = message || i18n.t('Waiting for connecting wallet');\n break;\n case PendingSwapNetworkStatus.WaitingForQueue:\n message =\n message || i18n.t('Waiting for other running tasks to be finished');\n break;\n case PendingSwapNetworkStatus.WaitingForNetworkChange:\n message = message || i18n.t('Waiting for changing wallet network');\n break;\n default:\n message = message || '';\n break;\n }\n }\n detailedMessage = detailedMessage || '';\n message = message || '';\n const isRpc =\n message?.indexOf('code') !== -1 && message?.indexOf('reason') !== -1;\n\n return {\n shortMessage: message,\n detailedMessage: { content: detailedMessage, long: isRpc },\n };\n}\n\nexport function getLastConvertedTokenInFailedSwap(\n pendingSwap: PendingSwap\n): ConvertedToken {\n let resultToken: ConvertedToken = null;\n if (pendingSwap.status === 'failed') {\n const lastSuccessStep = pendingSwap.steps\n .slice()\n .reverse()\n .filter((step) => step.status === 'success')[0];\n\n if (lastSuccessStep) {\n resultToken = {\n blockchain: lastSuccessStep.toBlockchain,\n symbol: lastSuccessStep.toSymbol,\n outputAmount: lastSuccessStep.outputAmount,\n address: lastSuccessStep.toSymbolAddress,\n };\n }\n }\n return resultToken;\n}\n\nexport function shouldRetrySwap(pendingSwap: PendingSwap) {\n return pendingSwap.status === 'failed';\n}\n\nexport function isConfirmSwapDisabled(\n fetching: boolean,\n isCustomDestinationOpen: boolean,\n customDestination: string | null,\n quote: SelectedQuote | null,\n selectedWallets: { walletType: string; chain: string }[],\n lastStepToBlockchain: BlockchainMeta | undefined\n): boolean {\n if (!quote || fetching) {\n return true;\n }\n\n const allWallets = getQuoteWallets({ filter: 'all', quote });\n\n const requiredWallets = getQuoteWallets({ filter: 'required', quote });\n\n const everyWalletSelected = allWallets.every((blockchain) =>\n selectedWallets.some(\n (selectedWallet) => selectedWallet.chain === blockchain\n )\n );\n\n const everyRequiredWalletSelected = requiredWallets.every((wallet) =>\n selectedWallets.some((selectedWallet) => selectedWallet.chain === wallet)\n );\n\n const customDestinationIsValid =\n customDestination && lastStepToBlockchain\n ? isValidTokenAddress(lastStepToBlockchain, customDestination)\n : false;\n\n return (\n (!isCustomDestinationOpen && !everyWalletSelected) ||\n (isCustomDestinationOpen && !customDestination) ||\n (isCustomDestinationOpen &&\n !!customDestination &&\n (!customDestinationIsValid || !everyRequiredWalletSelected))\n );\n}\n\nexport function isTokensIdentical(tokenA: Token, tokenB: Token) {\n return (\n tokenA.blockchain === tokenB.blockchain &&\n tokenA.symbol === tokenB.symbol &&\n tokenA.address === tokenB.address\n );\n}\n\nexport function isSwapFinished(event: RouteEvent | StepEvent) {\n return (\n event.type === RouteEventType.FAILED ||\n event.type === RouteEventType.SUCCEEDED\n );\n}\n", "import type { QuoteError } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { QuoteErrorType } from '../types';\n\nexport const errorMessages = () => {\n return {\n genericServerError: i18n.t('Failed Network, Please retry your swap.'),\n liquiditySourcesError: {\n title: i18n.t('Please reset your liquidity sources.'),\n description: i18n.t(\n 'You have limited the liquidity sources and this might result in Rango finding no routes. Please consider resetting your liquidity sources.'\n ),\n },\n noResultError: {\n title: i18n.t('No Routes Found.'),\n description: i18n.t(\n \"Reasons why Rango couldn't find a route: low liquidity on token, very low input amount or no routes available for the selected input/output token combination.\"\n ),\n },\n bridgeLimitErrors: {\n increaseAmount: i18n.t(\n 'Bridge Limit Error: Please increase your amount.'\n ),\n decreaseAmount: i18n.t(\n 'Bridge Limit Error: Please decrease your amount.'\n ),\n },\n highValueLossError: {\n impactTitle: i18n.t('High Price Impact'),\n title: i18n.t('Price impact is too high!'),\n description: i18n.t(\n 'The price impact is significantly higher than the allowed amount.'\n ),\n confirmMessage: i18n.t('Confirm high price impact'),\n },\n quoteUpdatedWithHighValueLoss: {\n title: i18n.t(\n 'Route updated and price impact is too high, try again later!'\n ),\n },\n unknownPriceError: {\n impactTitle: i18n.t('USD Price Unknown'),\n title: i18n.t('USD Price Unknown, Cannot calculate Price Impact.'),\n description: i18n.t(\n 'USD Price Unknown, Cannot calculate Price Impact. The price impact may be higher than usual. Are you sure to continue the Swap?'\n ),\n confirmMessage: i18n.t('Confirm USD Price Unknown'),\n },\n };\n};\n\nexport function getQuoteErrorMessage(error: QuoteError) {\n switch (error.type) {\n case QuoteErrorType.NO_RESULT:\n return error.diagnosisMessage ?? errorMessages().noResultError.title;\n case QuoteErrorType.REQUEST_FAILED:\n return errorMessages().genericServerError;\n default:\n return '';\n }\n}\n", "import { i18n } from '@lingui/core';\n\nexport const swapButtonTitles = () => {\n return {\n connectWallet: i18n.t('Connect Wallet'),\n swap: i18n.t('Swap'),\n swapAnyway: i18n.t('Swap anyway'),\n ethWarning: i18n.t('The route goes through Ethereum. Continue?'),\n };\n};\n", "import { useEffect, useRef } from 'react';\nimport {\n useInRouterContext,\n useLocation,\n useSearchParams,\n} from 'react-router-dom';\n\nimport { SearchParams } from '../../constants/searchParams';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\n\nimport {\n convertTokenSearchParamToAsset,\n tokenToSearchParam,\n} from './useSyncUrlAndStore.helpers';\n\nexport function useSyncUrlAndStore() {\n const location = useLocation();\n const [searchParams, setSearchParams] = useSearchParams();\n const {\n fromBlockchain,\n toBlockchain,\n fromToken,\n toToken,\n inputAmount,\n setFromBlockchain,\n setToBlockchain,\n setFromToken,\n setToToken,\n setInputAmount,\n } = useQuoteStore();\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const isInRouterContext = useInRouterContext();\n const { updateIframe, updateCampaignMode } = useAppStore();\n const campaignMode = useAppStore().isInCampaignMode();\n const liquiditySourcesParamsRef = useRef<string>();\n const { findToken } = useAppStore();\n const getUrlSearchParams = () => {\n const utmQueryParams: Record<string, string> = {};\n\n for (const [key, value] of searchParams.entries()) {\n if (key.startsWith('utm_')) {\n utmQueryParams[key] = value;\n }\n }\n const fromAmount = searchParams.get(SearchParams.FROM_AMOUNT);\n const fromBlockchain = searchParams.get(SearchParams.FROM_BLOCKCHAIN);\n const fromToken = searchParams.get(SearchParams.FROM_TOKEN);\n const toBlockchain = searchParams.get(SearchParams.TO_BLOCKCHAIN);\n const toToken = searchParams.get(SearchParams.TO_TOKEN);\n const autoConnect = searchParams.get(SearchParams.AUTO_CONNECT);\n const clientUrl = searchParams.get(SearchParams.CLIENT_URL);\n const liquiditySources = searchParams.get(SearchParams.LIQUIDITY_SOURCES);\n\n const blockchain = searchParams.get(SearchParams.BLOCKCHAIN);\n\n return {\n fromAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n autoConnect,\n clientUrl,\n liquiditySources,\n utmQueryParams,\n blockchain,\n };\n };\n\n const updateUrlSearchParams = (\n searchParams: Record<string, string | undefined>\n ) => {\n for (const property in searchParams) {\n if (!searchParams[property]) {\n delete searchParams[property];\n }\n }\n setSearchParams(searchParams as Record<string, string>, { replace: true });\n };\n\n useEffect(() => {\n const { autoConnect, clientUrl, utmQueryParams, blockchain } =\n getUrlSearchParams();\n if (isInRouterContext && fetchMetaStatus === 'success') {\n updateUrlSearchParams({\n [SearchParams.FROM_BLOCKCHAIN]: fromBlockchain?.name,\n [SearchParams.FROM_TOKEN]: tokenToSearchParam(fromToken),\n [SearchParams.TO_BLOCKCHAIN]: toBlockchain?.name,\n [SearchParams.TO_TOKEN]: tokenToSearchParam(toToken),\n [SearchParams.FROM_AMOUNT]: inputAmount,\n [SearchParams.AUTO_CONNECT]: autoConnect ?? undefined,\n [SearchParams.CLIENT_URL]: clientUrl ?? undefined,\n [SearchParams.BLOCKCHAIN]: blockchain ?? undefined,\n [SearchParams.LIQUIDITY_SOURCES]: campaignMode\n ? liquiditySourcesParamsRef.current\n : undefined,\n ...utmQueryParams,\n });\n }\n }, [\n location.pathname,\n inputAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n campaignMode,\n ]);\n\n useEffect(() => {\n if (!isInRouterContext) {\n return;\n }\n\n const searchParams = getUrlSearchParams();\n\n if (!liquiditySourcesParamsRef.current && searchParams.liquiditySources) {\n liquiditySourcesParamsRef.current = searchParams.liquiditySources;\n }\n\n if (searchParams.fromAmount) {\n setInputAmount(searchParams.fromAmount);\n }\n\n if (fetchMetaStatus === 'success') {\n const fromBlockchain = blockchains.find(\n (blockchain) => blockchain.name === searchParams.fromBlockchain\n );\n\n const fromToken =\n searchParams.fromToken && fromBlockchain\n ? findToken(\n convertTokenSearchParamToAsset(\n searchParams.fromToken,\n fromBlockchain\n )\n )\n : undefined;\n const toBlockchain = blockchains.find(\n (blockchain) => blockchain.name === searchParams.toBlockchain\n );\n\n const toToken =\n searchParams.toToken && toBlockchain\n ? findToken(\n convertTokenSearchParamToAsset(searchParams.toToken, toBlockchain)\n )\n : undefined;\n\n if (!!fromBlockchain) {\n setFromBlockchain(fromBlockchain);\n if (!!fromToken) {\n setFromToken({\n token: fromToken,\n meta: {\n blockchains: blockchains,\n tokens: tokens,\n },\n });\n }\n }\n\n if (!!toBlockchain) {\n setToBlockchain(toBlockchain);\n if (!!toToken) {\n setToToken({\n token: toToken,\n meta: { blockchains: blockchains, tokens: tokens },\n });\n }\n }\n }\n }, [fetchMetaStatus]);\n\n useEffect(() => {\n const { clientUrl, liquiditySources } = getUrlSearchParams();\n // We run this only once, because if the app is embedded into an iframe, the data in url for iframe will not change.\n updateIframe('clientUrl', clientUrl || undefined);\n\n updateCampaignMode(\n 'liquiditySources',\n liquiditySources?.split(',') ?? undefined\n );\n }, []);\n}\n", "import type { Asset, BlockchainMeta, Token } from 'rango-sdk';\n\nexport function convertTokenSearchParamToAsset(\n searchParam: string,\n chain: BlockchainMeta\n): Asset {\n const symbolAndAddress = searchParam.split('--');\n\n return {\n blockchain: chain.name,\n address: symbolAndAddress?.[1] || null,\n symbol: symbolAndAddress[0],\n };\n}\n\nexport function tokenToSearchParam(token: Token | null): string | undefined {\n if (token) {\n return `${token.symbol}${token.address ? `--${token.address}` : ''}`;\n }\n return undefined;\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Alert,\n Button,\n darkTheme,\n Divider,\n DoneIcon,\n MessageBox,\n styled,\n TextField,\n Typography,\n} from '@rango-dev/ui';\nimport { type Token } from 'rango-sdk';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\n\nimport { BlockchainSelectorButton } from '../components/BlockchainSelectorButton';\nimport { WatermarkedModal } from '../components/common/WatermarkedModal';\nimport { CustomTokenModal } from '../components/CustomTokenModal';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { SearchParams } from '../constants/searchParams';\nimport { useFetchCustomToken } from '../hooks/useFetchCustomToken';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { getContainer } from '../utils/common';\nimport { findBlockchain, isValidTokenAddress } from '../utils/meta';\n\nconst Content = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n flexDirection: 'column',\n flex: 1,\n '& ._text-field': {\n padding: '$4 $10',\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n borderRadius: '$sm',\n height: '$40',\n },\n});\nconst CUSTOM_TOKEN_REFRESH_DELAY = 1000;\n\nexport function AddCustomTokenPage() {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const navigateBack = useNavigateBack();\n const { setCustomToken } = useAppStore();\n const blockchains = useAppStore().blockchains();\n\n const blockchainName = searchParams.get(SearchParams.BLOCKCHAIN) || '';\n const blockchain = findBlockchain(blockchainName, blockchains);\n const [address, setAddress] = useState('');\n const [isOpenErrorModal, setIsOpenErrorModal] = useState<boolean>(false);\n const [token, setToken] = useState<Token>();\n const { fetchCustomToken, loading, error } = useFetchCustomToken();\n const [networkError, setNetworkError] = useState('');\n const isValidAddress =\n !!blockchain && isValidTokenAddress(blockchain, address);\n const isImportDisabled = !blockchain || !address || !isValidAddress;\n\n const getCustomToken = async () => {\n if (blockchain) {\n try {\n const res = await fetchCustomToken({\n blockchain: blockchainName,\n tokenAddress: address,\n });\n setNetworkError('');\n if (!!res) {\n setToken(res);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n if (error.message === 'Failed to fetch') {\n setNetworkError(i18n.t('Network Error'));\n setIsOpenErrorModal(true);\n }\n }\n }\n };\n\n const closeErrorModal = () => {\n if (!!error) {\n setAddress('');\n }\n setIsOpenErrorModal(false);\n };\n\n const handleErrorModalButtonClick = async () => {\n if (!!networkError) {\n setTimeout(async () => {\n await getCustomToken();\n }, CUSTOM_TOKEN_REFRESH_DELAY);\n }\n closeErrorModal();\n };\n\n useEffect(() => {\n if (!!error) {\n setIsOpenErrorModal(true);\n }\n }, [error]);\n return (\n <Layout\n header={{\n title: i18n.t('Add Custom Token'),\n }}>\n <PageContainer>\n <Content>\n <div>\n <BlockchainSelectorButton\n onClick={() =>\n navigate(navigationRoutes.blockchains, { replace: true })\n }\n hasLogo={!!blockchain?.logo}\n value={\n !!blockchain\n ? {\n name: blockchain.displayName,\n logo: blockchain.logo,\n }\n : undefined\n }\n title={i18n.t('Select chain')}\n placeholder={i18n.t('Select chain')}\n />\n <Divider size={'24'} />\n <Typography size=\"large\" variant=\"label\">\n {i18n.t('Enter Address')}\n </Typography>\n <Divider size={10} />\n <TextField\n fullWidth\n disabled={!blockchain}\n variant=\"contained\"\n placeholder={i18n.t('Enter token address')}\n size=\"large\"\n value={address}\n suffix={\n !!address &&\n isValidAddress && <DoneIcon color=\"success\" size={12} />\n }\n onChange={(e) => setAddress(e.target.value)}\n />\n {!isValidAddress && !!address && (\n <>\n <Divider size={4} />\n <Alert type=\"error\" variant=\"alarm\" title=\"Invalid Address\" />\n </>\n )}\n </div>\n\n <Button\n disabled={isImportDisabled}\n type=\"primary\"\n variant=\"contained\"\n loading={loading}\n size=\"large\"\n onClick={getCustomToken}>\n {i18n.t('Import')}\n </Button>\n </Content>\n <WatermarkedModal\n open={isOpenErrorModal}\n dismissible\n onClose={closeErrorModal}\n container={getContainer()}>\n <MessageBox\n title={error?.title || networkError}\n type=\"error\"\n description={\n error?.message || i18n.t('Failed Network, Please retry.')\n }>\n <Divider size={40} />\n <Divider size={10} />\n\n <Button\n variant=\"contained\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={handleErrorModalButtonClick}>\n {networkError\n ? i18n.t('Retry')\n : i18n.t('Add another custom token')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n {blockchain && token && (\n <CustomTokenModal\n blockchain={blockchain}\n token={token}\n onSubmitClick={() => {\n if (token) {\n setCustomToken(token);\n setToken(undefined);\n navigateBack();\n }\n }}\n onClose={() => setToken(undefined)}\n open={!!blockchain && !!token}\n />\n )}\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './BlockchainSelectorButton.types';\n\nimport { ChevronRightIcon, Divider, Image, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n Container,\n FlexContainer,\n InputContainer,\n} from './BlockchainSelectorButton.styles';\n\nexport function BlockchainSelectorButton(props: PropTypes) {\n const { onClick, value, title, hasLogo, placeholder, disabled } = props;\n\n return (\n <Container>\n <Typography size=\"large\" variant=\"label\">\n {title}\n </Typography>\n <Divider size={10} />\n <InputContainer\n onClick={disabled ? undefined : onClick}\n disabled={disabled}>\n <FlexContainer>\n {hasLogo && (\n <>\n <Image\n src={value?.logo}\n size={16}\n useAsPlaceholder={!value?.logo}\n type=\"circular\"\n />\n <Divider size={4} direction=\"horizontal\" />\n </>\n )}\n <Typography\n className=\"title_typography\"\n size=\"medium\"\n variant=\"label\">\n {value?.name || placeholder}\n </Typography>\n </FlexContainer>\n <ChevronRightIcon size={12} color=\"black\" />\n </InputContainer>\n </Container>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const InputContainer = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n height: '$40',\n padding: '$4 $10',\n borderRadius: '$sm',\n cursor: 'pointer',\n alignItems: 'center',\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n\n '&:hover': {\n backgroundColor: '$secondary100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral500',\n },\n },\n variants: {\n disabled: {\n true: {\n cursor: 'default',\n '&:hover': {\n borderColor: '$neutral300',\n '& svg': {\n color: '$neutral700',\n },\n },\n },\n },\n },\n});\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n '.title_typography': {\n textTransform: 'capitalize',\n },\n});\n\nexport const FlexContainer = styled('div', {\n display: 'flex',\n});\n", "import type { PropTypes } from './CustomTokenModal.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n ExternalLinkIcon,\n Image,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { generateExplorerLink } from './CustomTokenModal.helpers';\nimport { Container, StyledLink } from './CustomTokenModal.styles';\n\nexport function CustomTokenModal(props: PropTypes) {\n const { open, onClose, token, onSubmitClick, blockchain } = props;\n\n const explorerLink = generateExplorerLink(token.address, blockchain);\n\n return (\n <WatermarkedModal\n open={open}\n dismissible\n onClose={onClose}\n container={getContainer()}>\n <Container>\n <Image src={token.image} size={45} type=\"circular\" />\n <Typography variant=\"title\" size=\"medium\">\n {token.name}\n </Typography>\n <Typography variant=\"body\" size=\"small\" className=\"_blockchain-name\">\n {blockchain.displayName}\n </Typography>\n <Divider size={4} />\n\n <Typography variant=\"body\" size=\"medium\">\n {!!explorerLink ? (\n <StyledLink\n hasHover\n href={explorerLink}\n target=\"_blank\"\n rel=\"nofollow noreferrer\">\n {token.address}\n <ExternalLinkIcon size={12} color=\"gray\" />\n </StyledLink>\n ) : (\n <StyledLink>{token.address}</StyledLink>\n )}\n </Typography>\n\n <Divider size={4} />\n\n {token.coinSource && (\n <Typography className=\"_coin-source\" variant=\"body\" size=\"xsmall\">\n {i18n.t('via')}{' '}\n <Typography\n className=\"_coin-source-name\"\n variant=\"body\"\n size=\"xsmall\">\n {token.coinSource}\n </Typography>\n </Typography>\n )}\n <Divider size={'32'} />\n\n <Typography\n size=\"medium\"\n variant=\"body\"\n className=\"_custom-token-description\">\n {i18n.t(\n `This token doesn't appear on the active token list(s). Make sure this is the token that you want to trade.`\n )}\n </Typography>\n </Container>\n <Divider size={40} />\n <Divider size={10} />\n\n <Button\n variant=\"contained\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onSubmitClick}>\n {i18n.t('Import')}\n </Button>\n </WatermarkedModal>\n );\n}\n", "import type { BlockchainMeta } from 'rango-types';\n\nexport function generateExplorerLink(\n address: string | null,\n blockchain: BlockchainMeta\n): string {\n // We don't have Cosmos explorer url in API.\n if (blockchain.type === 'COSMOS') {\n return '';\n }\n\n const explorerLinkPattern = blockchain.info?.addressUrl;\n\n if (!explorerLinkPattern || !address) {\n return '';\n }\n\n return explorerLinkPattern.replace('{wallet}', address);\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const StyledLink = styled('a', {\n textDecoration: 'none',\n color: '$colors$neutral700',\n [`.${darkTheme} &`]: {\n color: '$colors$neutral900',\n },\n\n '& svg': {\n marginLeft: '$4',\n color: '$colors$neutral700',\n [`.${darkTheme} &`]: {\n color: '$colors$neutral900',\n },\n },\n\n variants: {\n hasHover: {\n true: {\n '&:hover': {\n color: '$colors$secondary550',\n [`.${darkTheme} &`]: {\n color: '$colors$secondary500',\n },\n '& svg': {\n color: '$colors$secondary550',\n [`.${darkTheme} &`]: {\n color: '$colors$secondary500',\n },\n },\n },\n },\n false: {},\n },\n },\n});\n\nexport const Container = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n alignItems: 'center',\n textAlign: 'center',\n '& ._blockchain-name, & ._coin-source': {\n color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n color: '$colors$neutral800',\n },\n },\n '& ._coin-source-name, & ._custom-token-description': {\n color: '$colors$neutral700',\n [`.${darkTheme} &`]: {\n color: '$colors$neutral900',\n },\n },\n});\n", "import type { PropTypes } from './Layout.types';\nimport type { PendingSwap } from 'rango-types';\nimport type { PropsWithChildren } from 'react';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { BottomLogo, Divider, Header } from '@rango-dev/ui';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useIframe } from '../../hooks/useIframe';\nimport { isAppLoadedIntoIframe } from '../../hooks/useIframe/useIframe.helpers';\nimport { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\nimport { tabManager, useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { getPendingSwaps } from '../../utils/queue';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { ActivateTabAlert } from '../common/ActivateTabAlert';\nimport { ActivateTabModal } from '../common/ActivateTabModal';\nimport { BackButton, CancelButton, WalletButton } from '../HeaderButtons';\nimport { RefreshModal } from '../RefreshModal';\n\nimport { onScrollContentAttachStatusToContainer } from './Layout.helpers';\nimport { Container, Content, Footer, LayoutContainer } from './Layout.styles';\n\nfunction Layout(props: PropsWithChildren<PropTypes>) {\n const { connectHeightObserver, disconnectHeightObserver } = useIframe();\n const { children, header, footer, height = 'fixed' } = props;\n const { fetchStatus } = useAppStore();\n const [openRefreshModal, setOpenRefreshModal] = useState(false);\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const {\n config: { features, theme },\n } = useAppStore();\n const { watermark } = useUiStore();\n\n const hasWatermark = watermark === 'FULL';\n const { activeTheme } = useTheme(theme || {});\n\n const isConnectWalletHidden = isFeatureHidden(\n 'connectWalletButton',\n features\n );\n\n const {\n isActiveTab,\n tabManagerInitiated,\n showActivateTabModal,\n setShowActivateTabModal,\n activateCurrentTab,\n } = useUiStore();\n const navigateBack = useNavigateBack();\n const { manager } = useManager();\n const pendingSwaps: PendingSwap[] = getPendingSwaps(manager).map(\n ({ swap }) => swap\n );\n const hasRunningSwap = pendingSwaps.some((swap) => swap.status === 'running');\n\n const onActivateTab = () =>\n activateCurrentTab(tabManager.forceClaim, hasRunningSwap);\n\n const onConnectWallet = () => {\n header.onWallet?.();\n };\n\n const showBackButton =\n typeof header.hasBackButton === 'undefined' || header.hasBackButton;\n\n const scrollViewRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const isIframe = isAppLoadedIntoIframe();\n\n // This feature only will be available in an iframe context.\n if (isIframe && containerRef.current) {\n connectHeightObserver(containerRef.current);\n }\n\n return () => {\n disconnectHeightObserver();\n };\n }, []);\n\n useEffect(() => {\n scrollViewRef.current?.addEventListener(\n 'scroll',\n onScrollContentAttachStatusToContainer\n );\n return () => {\n scrollViewRef.current?.removeEventListener(\n 'scroll',\n onScrollContentAttachStatusToContainer\n );\n };\n }, []);\n\n useEffect(() => {\n setOpenRefreshModal(fetchStatus === 'failed');\n }, [fetchStatus]);\n\n return (\n <Container\n height={height}\n id={WIDGET_UI_ID.SWAP_BOX_ID}\n className={`${activeTheme()} ${LayoutContainer()}`}\n ref={containerRef}>\n <Header\n prefix={\n showBackButton ? (\n <BackButton\n onClick={() => {\n navigateBack();\n // As an example, used in routes page to add a custom logic when navigating back to the home page.\n header.onBack && header.onBack();\n }}\n />\n ) : null\n }\n title={header.title}\n suffix={\n <>\n {header.suffix}\n {header.onWallet && !isConnectWalletHidden && (\n <WalletButton\n container={getContainer()}\n onClick={onConnectWallet}\n isConnected={!!connectedWallets?.length}\n />\n )}\n {header.onCancel && <CancelButton onClick={header.onCancel} />}\n </>\n }\n />\n <Content ref={scrollViewRef}>{children}</Content>\n <ActivateTabModal\n open={showActivateTabModal}\n onClose={() => setShowActivateTabModal(false)}\n onConfirm={onActivateTab}\n />\n\n <Footer>\n <div className=\"footer__content\">\n {tabManagerInitiated && !isActiveTab && (\n <div className=\"footer__alert\">\n <ActivateTabAlert onActivateTab={onActivateTab} />\n <Divider size={10} />\n </div>\n )}\n {footer}\n </div>\n\n <Divider size={12} />\n\n <div\n className={`footer__logo ${\n hasWatermark ? 'logo__show' : 'logo__hidden'\n }`}>\n <BottomLogo />\n </div>\n </Footer>\n <RefreshModal\n open={openRefreshModal}\n onClose={() => setOpenRefreshModal(false)}\n />\n </Container>\n );\n}\nexport { Layout };\n", "import type { Messages } from './useIframe.types';\n\nimport { useRef } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { isAppLoadedIntoIframe } from './useIframe.helpers';\n\ninterface UseIframe {\n send: (message: Messages) => void;\n connectHeightObserver: (element: HTMLElement) => void;\n disconnectHeightObserver: () => void;\n}\n\nfunction useIframe(): UseIframe {\n const heightObserver = useRef<ResizeObserver | null>(null);\n const { iframe } = useAppStore();\n const isMessagePassingAvailable = isAppLoadedIntoIframe() && iframe.clientUrl;\n\n const send = (message: Messages) => {\n if (isMessagePassingAvailable) {\n window.top?.postMessage(message, iframe.clientUrl!);\n }\n };\n\n const connectHeightObserver = (element: HTMLElement) => {\n heightObserver.current = new ResizeObserver((entries) => {\n for (const entry of entries) {\n send({\n type: 'widget_height',\n data: {\n height: entry.contentRect.height,\n },\n });\n }\n });\n\n heightObserver.current.observe(element);\n };\n\n const disconnectHeightObserver = () => {\n if (heightObserver.current) {\n heightObserver.current.disconnect();\n heightObserver.current = null;\n }\n };\n\n return {\n send,\n connectHeightObserver,\n disconnectHeightObserver,\n };\n}\n\nexport { useIframe };\n", "export function isAppLoadedIntoIframe() {\n return window.self !== window.top;\n}\n", "import { useNavigate } from 'react-router-dom';\n\nexport function useNavigateBack(): () => void {\n const navigate = useNavigate();\n return () => navigate(-1);\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport {\n createTheme,\n darkTheme as defaultDarkTheme,\n lightTheme as defaultLightTheme,\n} from '@rango-dev/ui';\nimport { useEffect, useState } from 'react';\n\nimport { DEFAULT_FONT_FAMILY } from '../constants/fonts';\nimport { useAppStore } from '../store/AppStore';\nimport { type WidgetTheme } from '../types';\nimport {\n DEFAULT_PRIMARY_RADIUS,\n DEFAULT_SECONDARY_RADIUS,\n} from '../utils/configs';\nimport { customizedThemeTokens } from '../utils/ui';\n\nfunction doesWindowPreferDarkColorScheme() {\n return (\n window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches\n );\n}\n\nexport function useTheme(props: WidgetTheme) {\n const {\n colors,\n fontFamily = DEFAULT_FONT_FAMILY,\n borderRadius = DEFAULT_PRIMARY_RADIUS,\n secondaryBorderRadius = DEFAULT_SECONDARY_RADIUS,\n } = props;\n\n const [OSTheme, setOSTheme] = useState(\n doesWindowPreferDarkColorScheme() ? 'dark' : 'light'\n );\n\n const { theme } = useAppStore();\n\n const { dark, light } = customizedThemeTokens(colors);\n\n const baseTheme = createTheme({\n shadows: props.shadows || {},\n radii: {\n primary: `${borderRadius}px`,\n secondary: `${secondaryBorderRadius}px`,\n },\n fonts: {\n widget: fontFamily,\n },\n });\n const lightThemeClasses = [baseTheme.className, defaultLightTheme.className];\n const darkThemeClasses = [baseTheme.className, defaultDarkTheme.className];\n\n /*\n * If theme has been customized, we will push the customized theme to override the default themes.\n * To be overridden, it should be last thing that has been pushed.\n */\n if (light) {\n const customizedLightTheme = createTheme(light.id, light.tokens);\n lightThemeClasses.push(customizedLightTheme.className);\n }\n if (dark) {\n const customizedDarkTheme = createTheme(dark.id, dark.tokens);\n darkThemeClasses.push(customizedDarkTheme.className);\n }\n\n useEffect(() => {\n const switchThemeListener = (event: MediaQueryListEvent) => {\n if (event.matches) {\n setOSTheme('dark');\n } else {\n setOSTheme('light');\n }\n };\n\n if (doesWindowPreferDarkColorScheme()) {\n setOSTheme('dark');\n }\n\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .addEventListener('change', switchThemeListener);\n return () => {\n window\n .matchMedia('(prefers-color-scheme: dark)')\n .removeEventListener('change', switchThemeListener);\n };\n }, []);\n\n const getActiveTheme = () => {\n const lightClassNames = lightThemeClasses.join(' ');\n const darkClassNames = darkThemeClasses.join(' ');\n if (theme === 'auto') {\n return OSTheme === 'dark' ? darkClassNames : lightClassNames;\n }\n\n return theme === 'dark' ? darkClassNames : lightClassNames;\n };\n\n return {\n activeTheme: getActiveTheme,\n mode: theme === 'auto' ? OSTheme : theme,\n };\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { WidgetTheme } from '../types';\nimport type { createTheme } from '@rango-dev/ui';\n\nimport {\n theme as baseThemeTokens,\n darkColors as defaultDarkColors,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { expandToGenerateThemeColors } from '../utils/colors';\nimport { toHash } from '../utils/hash';\n\nimport { THEME_CLASS_NAME_PREFIX } from './configs';\n\ntype Tokens = Parameters<typeof createTheme>[0];\ninterface CustomizedThemeValues {\n id: string;\n tokens: Tokens;\n}\n\ninterface CustomizedTheme {\n light: undefined | CustomizedThemeValues;\n dark: undefined | CustomizedThemeValues;\n}\n\nexport function customizedThemeTokens(\n colors: WidgetTheme['colors']\n): CustomizedTheme {\n const baseColors = baseThemeTokens.colors;\n const baseDarkColors = {\n ...baseColors,\n ...defaultDarkColors,\n };\n let lightTheme: CustomizedTheme['light'] = undefined;\n let darkTheme: CustomizedTheme['dark'] = undefined;\n\n if (colors?.light) {\n const lightColors = expandToGenerateThemeColors(baseColors, colors.light);\n const tokens = { colors: lightColors };\n const id = `${THEME_CLASS_NAME_PREFIX}-light-${toHash(tokens)}`;\n lightTheme = {\n id,\n tokens: tokens as Tokens,\n };\n }\n\n if (colors?.dark) {\n const darkColors = expandToGenerateThemeColors(\n baseDarkColors,\n colors.dark,\n {\n reverseNeutralRange: true,\n }\n );\n const tokens = { colors: darkColors };\n const id = `${THEME_CLASS_NAME_PREFIX}-dark-${toHash(tokens)}`;\n darkTheme = {\n id,\n tokens: tokens as Tokens,\n };\n }\n\n return {\n light: lightTheme,\n dark: darkTheme,\n };\n}\n\nexport function joinList(\n list: { element: React.JSX.Element; key: string }[],\n divider: React.JSX.Element\n) {\n if (list.length <= 1) {\n return list.map(({ element, key }) => React.cloneElement(element, { key }));\n }\n\n const output: React.JSX.Element[] = [];\n list.forEach((item, index) => {\n const { element, key } = item;\n output.push(React.cloneElement(element, { key }));\n if (index < list.length - 1) {\n const key = `divider-${index}`;\n output.push(React.cloneElement(divider, { key }));\n }\n });\n\n return output;\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n// Types\nimport type { ThemeColors, WidgetColors, WidgetColorsKeys } from '../types';\n\ntype RGB = {\n red: number;\n green: number;\n blue: number;\n};\n\ntype ShadeOrTintFunction = (rgb: RGB, step: number) => RGB;\n\nconst HEX_BASE = 16;\nconst MAX_COLOR_VALUE = 255;\nconst PERCENT = 0.11;\n\n// Utility Functions\n\nfunction expandShortHexColor(hexColor: string) {\n // Remove '#' if it exists\n if (hexColor.startsWith('#')) {\n hexColor = hexColor.slice(1);\n }\n\n // Check if the hexColor has a length of 3\n if (hexColor.length === 3) {\n // Convert the string to an array of characters\n const characters = hexColor.split('');\n\n // Duplicate each character and combine them into a single string\n const expandedHex = characters.reduce(function (acc, char) {\n return acc + char + char;\n }, '');\n\n // Return the resulting 6-character hex color\n return `#${expandedHex}`;\n }\n\n // Return the original hexColor if it's not 3 characters\n return `#${hexColor}`;\n}\n\n/*\n * We letting users to override some specific colors (e.g. `primary550`, `secondary100`).\n * So we are generating a range of colors if `primary` (or other keys) has passed but if user is passing a specific color,\n * we will override the user color to generated range.\n */\nfunction isOverridingColor(colorKey: string): boolean {\n return /[0-9]+$/.test(colorKey);\n}\n\n// pad a hexadecimal string with zeros if it needs it\nfunction pad(number: string, length: number) {\n return number.padStart(length, '0');\n}\n\n// Convert an integer to a 2-character hex string\nfunction intToHex(value: number) {\n const clampedValue = Math.min(\n Math.max(Math.round(value), 0),\n MAX_COLOR_VALUE\n );\n return pad(clampedValue.toString(HEX_BASE), 2);\n}\n\n// convert one of our rgb color objects to a full hex color string\nfunction rgbToHex(rgb: RGB) {\n return `#${intToHex(rgb.red)}${intToHex(rgb.green)}${intToHex(rgb.blue)}`;\n}\n\n// Convert a hex color string to an RGB object\nfunction hexToRGB(hex: string): RGB {\n const red = parseInt(hex.slice(1, 3), HEX_BASE);\n const green = parseInt(hex.slice(3, 5), HEX_BASE);\n const blue = parseInt(hex.slice(5, 7), HEX_BASE);\n\n return { red, green, blue };\n}\n\n// Generate a shade of a given RGB color\nfunction generateShade(rgb: RGB, step: number): RGB {\n const factor = 1 - PERCENT * step;\n return {\n red: rgb.red * factor,\n green: rgb.green * factor,\n blue: rgb.blue * factor,\n };\n}\n\n// Generate a tint of a given RGB color\nfunction generateTint(rgb: RGB, step: number): RGB {\n const factor = PERCENT * step;\n return {\n red: rgb.red + (MAX_COLOR_VALUE - rgb.red) * factor,\n green: rgb.green + (MAX_COLOR_VALUE - rgb.green) * factor,\n blue: rgb.blue + (MAX_COLOR_VALUE - rgb.blue) * factor,\n };\n}\n\n// Main Functions\n\n// Calculate an array of shades from a hex color string\nexport function calculateShades(hex: string): string[] {\n return calculateColors(hex, generateShade);\n}\n\n// Calculate an array of tints from a hex color string\nexport function calculateTints(hex: string): string[] {\n return calculateColors(hex, generateTint);\n}\n\n// General function to calculate shades or tints\nfunction calculateColors(\n hex: string,\n generateColor: ShadeOrTintFunction\n): string[] {\n const rgb = hexToRGB(hex);\n const colors: string[] = [];\n for (let i = 1; i < 9; i++) {\n colors.push(rgbToHex(generateColor(rgb, i)));\n }\n return colors;\n}\n\n// Create tints and shades for a given color\nexport function createTintsAndShades(\n hex: string,\n colorKey: string,\n isReversed?: boolean\n): { [key: string]: string } {\n const BASE_INDEX = 100;\n const STEP = 50;\n\n const tints = calculateTints(hex).reverse().concat(hex);\n const shades = calculateShades(hex);\n const combinedColors = tints.concat(shades);\n\n const colorMap: { [key: string]: string } = {};\n const length = combinedColors.length;\n\n for (let i = 0; i < length; i++) {\n const index = BASE_INDEX + (isReversed ? length - 1 - i : i) * STEP;\n colorMap[`${colorKey}${index}`] = combinedColors[i];\n }\n\n return colorMap;\n}\n\n// Generate a color palette based on base colors and \"Expand Colors\"\nexport function expandToGenerateThemeColors(\n baseColors: ThemeColors,\n expandColors: WidgetColors,\n options?: { reverseNeutralRange?: boolean }\n): ThemeColors {\n const output = { ...baseColors };\n\n for (const colorKey in expandColors) {\n const expandColor = expandColors[colorKey as WidgetColorsKeys] as string;\n const isNeutralReversed =\n colorKey === 'neutral' && !!options?.reverseNeutralRange;\n /*\n *Most of the colors are range but there are some colors that should be a single value e.g.\n *{\n * // single value\n * background: \"#fff\",\n * // range\n * primary: '#1C3CF1',\n * primary500: '#1C3CF1',\n * primary550: '#0B27C4',\n *}\n */\n const isSingleColor = ['background', 'foreground'].includes(colorKey);\n\n if (!isSingleColor && !isOverridingColor(colorKey)) {\n const expandedHexColor = expandShortHexColor(expandColor);\n Object.assign(\n output,\n createTintsAndShades(expandedHexColor, colorKey, isNeutralReversed)\n );\n }\n }\n\n return { ...output, ...expandColors };\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n// Original Code: https://github.com/stitchesjs/stitches/blob/canary/packages/core/src/convert/toHash.js\n\nconst toAlphabeticChar = (code: number) =>\n String.fromCharCode(code + (code > 25 ? 39 : 97));\n\nconst toAlphabeticName = (code: number) => {\n let name = '';\n let x;\n\n for (x = Math.abs(code); x > 52; x = (x / 52) | 0) {\n name = toAlphabeticChar(x % 52) + name;\n }\n\n return toAlphabeticChar(x % 52) + name;\n};\n\nconst toPhash = (h: number, x: string) => {\n let i = x.length;\n while (i) {\n h = (h * 33) ^ x.charCodeAt(--i);\n }\n return h;\n};\n\nexport const toHash = (value: object) =>\n toAlphabeticName(toPhash(5381, JSON.stringify(value)) >>> 0);\n", "import type { Manager } from '@rango-dev/queue-manager-core';\nimport type {\n PendingSwapWithQueueID,\n SwapStorage,\n} from '@rango-dev/queue-manager-rango-preset';\n\nexport const getPendingSwaps = (manager: Manager | undefined) => {\n const result: PendingSwapWithQueueID[] = [];\n\n manager?.getAll().forEach((q, id) => {\n const storage = q.list.getStorage() as SwapStorage;\n\n if (storage?.swapDetails) {\n result.push({\n id,\n swap: storage?.swapDetails,\n });\n }\n });\n\n return result.sort(\n (a, b) => Number(b.swap.creationTime) - Number(a.swap.creationTime)\n );\n};\n", "import type { PropTypes } from './ActivateTabAlert.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button } from '@rango-dev/ui';\nimport React from 'react';\n\nexport function ActivateTabAlert(props: PropTypes) {\n return (\n <Alert\n action={\n <Button\n onClick={props.onActivateTab}\n variant=\"contained\"\n size=\"xxsmall\"\n type=\"warning\">\n {i18n.t('Activate this tab')}\n </Button>\n }\n type=\"warning\"\n variant=\"alarm\"\n title={i18n.t('Another tab is open and handles transactions.')}\n />\n );\n}\n", "import type { PropTypes } from './ActivateTabModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../../utils/common';\nimport { WatermarkedModal } from '../WatermarkedModal';\n\nexport function ActivateTabModal(props: PropTypes) {\n const { open, onClose, onConfirm } = props;\n\n return (\n <WatermarkedModal\n open={open}\n dismissible\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Activate current tab')}\n type=\"warning\"\n description={i18n.t(\n 'Currently, some transactions are running and being handled by other browser tab. If you activate this tab, all transactions that are already in the transaction sign step will expire.'\n )}>\n <Divider size={20} />\n <Button\n variant=\"contained\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirm}>\n {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { ChevronLeftIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { HeaderButton } from './HeaderButtons.styles';\n\nfunction BackButton(props: PropTypes) {\n return (\n <HeaderButton variant=\"ghost\" size=\"small\" onClick={props.onClick}>\n <ChevronLeftIcon color=\"black\" size={16} />\n </HeaderButton>\n );\n}\n\nexport { BackButton };\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SuffixContainer } from './HeaderButtons.styles';\n\nfunction CancelButton(props: PropTypes) {\n return (\n <SuffixContainer>\n <Button variant=\"ghost\" onClick={props.onClick} size=\"xsmall\">\n <Typography variant=\"label\" size=\"medium\" color=\"error500\">\n {i18n.t('Cancel')}\n </Typography>\n </Button>\n </SuffixContainer>\n );\n}\n\nexport { CancelButton };\n", "import type { PropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport { Image, Tooltip, WalletIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useWalletList } from '../../hooks/useWalletList';\n\nimport {\n ConnectedIcon,\n HeaderButton,\n rowStyles,\n WalletImageContainer,\n} from './HeaderButtons.styles';\n\nfunction WalletButton(props: PropTypes) {\n const { list } = useWalletList();\n const connectedWallets = list.filter(\n (wallet) => wallet.state === 'connected'\n );\n const content = !connectedWallets.length ? (\n i18n.t('Connect Wallet')\n ) : (\n <div className={rowStyles()}>\n {connectedWallets.map((wallet) => (\n <WalletImageContainer key={wallet.title}>\n <Image src={wallet.image} size={14} />\n </WalletImageContainer>\n ))}\n </div>\n );\n\n return (\n <Tooltip container={props.container} side=\"bottom\" content={content}>\n <HeaderButton variant=\"ghost\" size=\"small\" onClick={props.onClick}>\n {props.isConnected && <ConnectedIcon />}\n <WalletIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n );\n}\n\nexport { WalletButton };\n", "import type { HeaderButtonsPropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n NotificationsIcon,\n Popover,\n SettingsIcon,\n Tooltip,\n TransactionIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { isFeatureHidden } from '../../utils/settings';\nimport { NotificationContent } from '../NotificationContent';\n\nimport { HeaderButton } from './HeaderButtons.styles';\nimport InProgressTransactionBadge from './InProgressTransactionBadge';\nimport { NotificationsBadge } from './NotificationsBadge';\nimport { RefreshButton } from './RefreshButton';\n\nexport function HeaderButtons(props: HeaderButtonsPropTypes) {\n const {\n onClickRefresh,\n onClickHistory,\n onClickSettings,\n hidden = [],\n container,\n } = props;\n\n const {\n config: { features },\n } = useAppStore();\n\n const isNotificationsHidden =\n isFeatureHidden('notification', features) ||\n hidden.includes('notifications');\n\n return (\n <>\n {!hidden.includes('refresh') && (\n <Tooltip\n container={container || getContainer()}\n side=\"top\"\n content={i18n.t('Refresh')}>\n <RefreshButton onClick={onClickRefresh} />\n </Tooltip>\n )}\n\n {!isNotificationsHidden && (\n <Popover\n align=\"end\"\n alignOffset={-88}\n sideOffset={15}\n collisionPadding={{ right: 20, left: 20 }}\n container={getContainer()}\n content={<NotificationContent />}>\n <div>\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Notifications')}>\n <HeaderButton size=\"small\" variant=\"ghost\">\n <NotificationsIcon size={18} color=\"black\" />\n <NotificationsBadge />\n </HeaderButton>\n </Tooltip>\n </div>\n </Popover>\n )}\n {!hidden.includes('settings') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Settings')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickSettings}>\n <SettingsIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n )}\n {!hidden.includes('history') && (\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Transactions History')}>\n <HeaderButton size=\"small\" variant=\"ghost\" onClick={onClickHistory}>\n <TransactionIcon size={18} color=\"black\" />\n <InProgressTransactionBadge />\n </HeaderButton>\n </Tooltip>\n )}\n </>\n );\n}\n", "import type { Notification } from '../../types/notification';\n\nimport { Notifications } from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { getBlockchainImage } from '../../utils/meta';\n\nexport function NotificationContent() {\n const navigate = useNavigate();\n\n const { getNotifications, clearNotifications } = useNotificationStore();\n\n const notifications: Notification[] = getNotifications();\n const blockchains = useAppStore().blockchains();\n const { findToken } = useAppStore();\n\n const onClickItem = (requestId: Notification['requestId']) => {\n navigate(`${navigationRoutes.swaps}/${requestId}`);\n };\n\n return (\n <Notifications\n list={notifications}\n getBlockchainImage={(blockchain) =>\n getBlockchainImage(blockchain, blockchains) ?? ''\n }\n getTokenImage={(token) => findToken(token)?.image ?? ''}\n onClickItem={onClickItem}\n onClearAll={clearNotifications}\n />\n );\n}\n", "import type { Notification } from '../types/notification';\n\nimport {\n type PendingSwapWithQueueID,\n type Route,\n type RouteEvent,\n type StepEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\n\nimport createSelectors from './selectors';\n\nexport interface NotificationState {\n isSynced: boolean;\n notifications: Notification[];\n setNotification: (event: RouteEvent | StepEvent, route: Route) => void;\n removeNotification: (requestId: Notification['requestId']) => void;\n getNotifications: () => Notification[];\n syncNotifications: (swaps: PendingSwapWithQueueID[]) => void;\n clearNotifications: () => void;\n}\n\nexport const useNotificationStore = createSelectors(\n create<NotificationState>()(\n persist(\n subscribeWithSelector((set, get) => ({\n isSynced: false,\n notifications: [],\n setNotification: (event, route) => {\n const fromStep = route.steps[0];\n const toStep = route.steps[route.steps.length - 1];\n\n const notification: Notification = {\n event,\n creationTime: Date.now(),\n requestId: route.requestId,\n route: {\n creationTime: parseInt(route.creationTime),\n from: {\n blockchain: fromStep.fromBlockchain,\n address: fromStep.fromSymbolAddress,\n symbol: fromStep.fromSymbol,\n },\n to: {\n blockchain: toStep.toBlockchain,\n address: toStep.toSymbolAddress,\n symbol: toStep.toSymbol,\n },\n },\n };\n\n const excludedList = get().notifications.filter(\n (notificationItem) => notificationItem.requestId !== route.requestId\n );\n\n set(() => ({\n notifications: [...excludedList, notification],\n }));\n },\n removeNotification: (requestId) => {\n set((state) => ({\n notifications: state.notifications.filter(\n (notification) => notification.requestId !== requestId\n ),\n }));\n },\n getNotifications: () => {\n const { isSynced, notifications } = get();\n return isSynced\n ? notifications.sort((a, b) => {\n if (a.route.creationTime && !b.route.creationTime) {\n return -1;\n }\n if (!a.route.creationTime && b.route.creationTime) {\n return 1;\n }\n if (!a.route.creationTime && !b.route.creationTime) {\n return b.creationTime - a.creationTime;\n }\n return b.route.creationTime - a.route.creationTime;\n })\n : [];\n },\n syncNotifications: (swaps) => {\n const { isSynced, notifications } = get();\n\n if (!isSynced) {\n const nextNotifications: Notification[] = [];\n notifications.forEach((notification) => {\n const swapExist = swaps.some(\n (swap) => swap.swap.requestId === notification.requestId\n );\n if (swapExist) {\n nextNotifications.push(notification);\n }\n });\n\n set({ isSynced: true, notifications: nextNotifications });\n }\n },\n clearNotifications: () => set({ notifications: [] }),\n })),\n\n {\n name: 'notification',\n skipHydration: true,\n partialize: ({ isSynced, ...otherProps }) => otherProps,\n version: 1,\n migrate: (persistedState, version) => {\n if (version === 0) {\n /**\n * Eliminate the persistence of read notifications,\n * and remove the \"read\" flag from other notifications to align with the current modifications in the notification store structure.\n */\n const oldNotifications = (\n persistedState as {\n notifications: (Notification & { read: boolean })[];\n }\n ).notifications;\n\n (persistedState as NotificationState).notifications =\n oldNotifications\n .filter(\n (notification: Notification & { read: boolean }) =>\n !notification.read\n )\n .map(({ read, ...otherProps }) => otherProps);\n }\n\n return persistedState as NotificationState;\n },\n }\n )\n )\n);\n", "import type { PendingSwap } from 'rango-types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { InProgressIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getPendingSwaps } from '../../utils/queue';\n\nimport { InProgressTransactionBadgeContainer } from './HeaderButtons.styles';\n\nconst InProgressTransactionBadge = () => {\n const { manager } = useManager();\n const list: PendingSwap[] = getPendingSwaps(manager).map(({ swap }) => swap);\n\n if (!list.find((swap) => swap.status === 'running')) {\n return null;\n }\n\n return (\n <InProgressTransactionBadgeContainer>\n <InProgressIcon color=\"info\" size={6} />\n </InProgressTransactionBadgeContainer>\n );\n};\n\nexport default InProgressTransactionBadge;\n", "import { EventSeverity } from '@rango-dev/queue-manager-rango-preset';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useNotificationStore } from '../../store/notification';\n\nimport { NotificationsBadgeContainer } from './HeaderButtons.styles';\n\nexport function NotificationsBadge() {\n const { getNotifications } = useNotificationStore();\n\n const notificationsList = getNotifications();\n\n const notificationsCount = notificationsList.length;\n\n const hasSeverNotification = !!notificationsList.find(\n (notificationItem) =>\n notificationItem.event.messageSeverity === EventSeverity.WARNING\n );\n\n return notificationsCount ? (\n <NotificationsBadgeContainer isSever={hasSeverNotification}>\n <Typography variant=\"body\" size=\"xsmall\" color=\"$background\">\n {notificationsCount}\n </Typography>\n </NotificationsBadgeContainer>\n ) : null;\n}\n", "import { RefreshProgressButton } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { HeaderButton, ProgressIcon } from './HeaderButtons.styles';\n\nconst REFRESH_INTERVAL = 1000;\nconst MAX_ELAPSED_TIME = 60;\nconst MAX_PERCENTAGE = 100;\n\nfunction RefreshButton({ onClick }: { onClick: (() => void) | undefined }) {\n const [elapsedTime, setElapsedTime] = useState(0);\n const [isRefetched, setIsRefetched] = useState(false);\n\n const handleVisibilityChange = (interval?: number) => {\n if (document.hidden && interval) {\n // Tab is inactive, clear the interval\n clearTimeout(interval);\n }\n };\n\n useEffect(() => {\n let interval: number | undefined;\n if (onClick) {\n interval = window.setInterval(() => {\n setElapsedTime((prevTime) => prevTime + 1);\n\n if (elapsedTime === MAX_ELAPSED_TIME) {\n handleRefreshClick();\n }\n }, REFRESH_INTERVAL);\n } else {\n clearTimeout(interval);\n }\n\n document.addEventListener('visibilitychange', () =>\n handleVisibilityChange(interval)\n );\n\n return () => {\n document.removeEventListener('visibilitychange', () =>\n handleVisibilityChange(interval)\n );\n if (interval) {\n clearInterval(interval);\n }\n };\n }, [elapsedTime, onClick]);\n\n const clearTimeout = (interval?: number) => {\n if (interval) {\n clearInterval(interval);\n }\n setElapsedTime(0);\n };\n\n const handleRefreshClick = () => {\n onClick?.();\n setElapsedTime(0);\n setIsRefetched(true);\n };\n\n return (\n <HeaderButton\n variant=\"ghost\"\n size=\"small\"\n style={{ paddingTop: 0, paddingBottom: 0 }}\n onClick={handleRefreshClick}\n disabled={!onClick}>\n <ProgressIcon\n onTransitionEnd={() => setIsRefetched(false)}\n isRefetched={isRefetched}>\n <RefreshProgressButton\n size={22}\n color={!onClick ? 'gray' : 'black'}\n progress={(elapsedTime / MAX_ELAPSED_TIME) * MAX_PERCENTAGE}\n />\n </ProgressIcon>\n </HeaderButton>\n );\n}\n\nexport { RefreshButton };\n", "import type { PropTypes } from './RefreshModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, MessageBox, RefreshIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { RefreshButton } from './RefreshModal.styles';\n\nexport function RefreshModal(props: PropTypes) {\n const { open, onClose } = props;\n\n return (\n <WatermarkedModal\n open={open}\n dismissible\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Something went wrong')}\n type=\"error\"\n description={i18n.t('Something went wrong. Please refresh the app.')}>\n <Divider size={30} />\n <RefreshButton\n variant=\"outlined\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={() => location.reload()}>\n <RefreshIcon size={20} color=\"primary\" />\n <Divider size={4} direction=\"horizontal\" />\n {i18n.t('Refresh')}\n </RefreshButton>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import { Button, styled } from '@rango-dev/ui';\n\nexport const RefreshButton = styled(Button, {\n '& span': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n});\n", "import { getContainer } from '../../utils/common';\n\nexport function onScrollContentAttachStatusToContainer(e: Event) {\n const contentElement = e.target as HTMLElement | null;\n\n if (contentElement) {\n const fromTop = contentElement.scrollTop;\n const container = getContainer();\n\n if (fromTop > 1) {\n container.classList.add('rng-scrolled');\n } else {\n container.classList.remove('rng-scrolled');\n }\n }\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nconst WIDGET_HEIGHT = '700px';\n\nexport const LayoutContainer = css({\n borderRadius: '$primary',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n boxShadow: '$mainContainer',\n});\n\nexport const Container = styled('div', {\n position: 'relative',\n width: '100vw',\n minWidth: '300px',\n maxWidth: '390px',\n backgroundColor: '$background',\n variants: {\n height: {\n auto: {\n height: 'auto',\n maxHeight: WIDGET_HEIGHT,\n },\n fixed: {\n height: WIDGET_HEIGHT,\n },\n },\n },\n});\n\nexport const Content = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n padding: 0,\n overflowY: 'auto',\n});\n\nexport const Footer = styled('div', {\n padding: '0 $20 $10',\n '& .footer__alert': {\n paddingTop: '$10',\n },\n '& .footer__logo': {\n opacity: 0,\n transition: 'opacity 1s ease-in-out',\n '&.logo__show': {\n opacity: 1,\n },\n '&.logo__hidden': {\n visibility: 'hidden',\n },\n },\n});\n", "import { styled } from '@rango-dev/ui';\n\nconst CONTENT_PADDING = '$20 $20 $10 $20';\n\nconst ScrollableArea = styled('div', {\n padding: CONTENT_PADDING,\n overflowY: 'auto',\n flexGrow: 1,\n});\n\nexport { ScrollableArea, CONTENT_PADDING };\n", "import { styled } from '@rango-dev/ui';\n\nconst PageContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n padding: '20px 20px 10px',\n flexGrow: 1,\n\n variants: {\n view: {\n true: {\n flexGrow: 1,\n overflow: 'hidden',\n },\n },\n compact: {\n true: {\n padding: 0,\n },\n },\n },\n});\n\nexport { PageContainer };\n", "import type { Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { getConfig } from '../utils/configs';\n\ntype ErrorType = {\n title: string;\n message: string;\n};\n\ninterface UseFetchCustomToken {\n fetchCustomToken: ({\n blockchain,\n tokenAddress,\n }: {\n blockchain: string;\n tokenAddress: string;\n }) => Promise<Token>;\n loading: boolean;\n error?: ErrorType;\n}\n\nexport function useFetchCustomToken(): UseFetchCustomToken {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<undefined | ErrorType>(undefined);\n const { findToken } = useAppStore();\n const customTokens = useAppStore().customTokens();\n\n function produceErrorMessage(\n type: 'duplicated' | 'not-found' | 'token-exist',\n blockchain?: string\n ) {\n switch (type) {\n case 'duplicated':\n return {\n title: i18n.t('Duplicate Token'),\n message: i18n.t(\n 'The address you entered is duplicate, please enter a new address.'\n ),\n };\n case 'token-exist':\n return {\n title: i18n.t('Token Already Exists'),\n message: i18n.t(\n `There's no need to add this token again because it already exists and is supported by us.`\n ),\n };\n case 'not-found':\n return {\n title: i18n.t('Token Not Found'),\n message: i18n.t({\n id: 'Sorry, no token was found on {blockchain} blockchain with the provided address. please make sure you have entered the right token address.',\n values: {\n blockchain,\n },\n }),\n };\n }\n }\n\n const fetchCustomToken: UseFetchCustomToken['fetchCustomToken'] = async ({\n blockchain,\n tokenAddress,\n }) => {\n setLoading(true);\n try {\n // Check for duplicate token in customTokens\n const isDuplicate = customTokens.some(\n (token) => token.address?.toLowerCase() === tokenAddress.toLowerCase()\n );\n if (isDuplicate) {\n const errorMessage = produceErrorMessage('duplicated');\n setError(errorMessage);\n return undefined;\n }\n\n const res = await fetch(\n `${getConfig('BASE_URL')}/meta/token?apiKey=${getConfig(\n 'API_KEY'\n )}&blockchain=${blockchain}&address=${tokenAddress}`\n );\n const contentType = res.headers.get('content-type');\n const response =\n contentType &&\n contentType.includes('application/json') &&\n (await res.json());\n if (!response || response.error) {\n const errorMessage = produceErrorMessage('not-found', blockchain);\n setError(errorMessage);\n return undefined;\n }\n\n // Check if token is already in the system\n const isTokenFound = findToken({\n blockchain: response.blockchain,\n address: response.address,\n symbol: response.symbol,\n });\n if (isTokenFound) {\n const errorMessage = produceErrorMessage('token-exist');\n setError(errorMessage);\n return undefined;\n }\n\n return response;\n } catch (error: any) {\n setError(undefined);\n throw new Error(error.message);\n } finally {\n setLoading(false);\n }\n };\n return { fetchCustomToken, loading, error };\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type {\n ConfirmSwap,\n ConfirmSwapFetchResult,\n} from '../hooks/useConfirmSwap/useConfirmSwap.types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport {\n Alert,\n Button,\n css,\n Divider,\n IconButton,\n styled,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { ConfirmWalletsModal } from '../components/ConfirmWalletsModal/ConfirmWalletsModal';\nimport { RefreshButton } from '../components/HeaderButtons/RefreshButton';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { getQuoteUpdateWarningMessage } from '../constants/warnings';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport { useConfirmSwap } from '../hooks/useConfirmSwap';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { joinList } from '../utils/ui';\n\nconst Buttons = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'space-between',\n [`& ${IconButton}`]: {\n width: '$48',\n height: '$48',\n },\n});\n\nconst confirmBtnStyles = css({\n flexGrow: 1,\n paddingRight: '$10',\n});\n\nconst iconStyles = css({\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nconst descriptionStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport function ConfirmSwapPage() {\n //TODO: move component's logics to a custom hook\n const {\n selectedQuote,\n setInputAmount,\n selectedWallets,\n quoteWalletsConfirmed,\n customDestination,\n quoteWarningsConfirmed,\n } = useQuoteStore();\n const navigate = useNavigate();\n const [dbErrorMessage, setDbErrorMessage] = useState<string>('');\n\n const showWalletsOnInit = !quoteWalletsConfirmed;\n const [showWallets, setShowWallets] = useState(false);\n const [isConfirming, setIsConfirming] = useState(false);\n const { isActiveTab } = useUiStore();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const prevDisabledLiquiditySources = useRef(disabledLiquiditySources);\n const { manager } = useManager();\n const {\n fetch: confirmSwap,\n loading: fetchingConfirmationQuote,\n cancelFetch,\n } = useConfirmSwap();\n const [confirmSwapResult, setConfirmSwapResult] =\n useState<ConfirmSwapFetchResult>({\n swap: null,\n error: null,\n warnings: null,\n });\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n\n const onConfirmSwap: ConfirmSwap['fetch'] = async ({\n selectedWallets,\n customDestination,\n }) => {\n const result = await confirmSwap?.({ selectedWallets, customDestination });\n\n setConfirmSwapResult(result);\n return result;\n };\n\n const addNewSwap = async () => {\n if (confirmSwapResult.swap && quoteWalletsConfirmed) {\n try {\n await manager?.create(\n 'swap',\n { swapDetails: confirmSwapResult.swap },\n { id: confirmSwapResult.swap.requestId }\n );\n\n const swap_url = `../${navigationRoutes.swaps}/${confirmSwapResult.swap.requestId}`;\n navigate(swap_url, {\n replace: true,\n });\n setTimeout(() => {\n setInputAmount('');\n }, 0);\n } catch (e) {\n setDbErrorMessage('Error: ' + (e as any)?.message);\n }\n }\n };\n\n const onConfirm = async () => {\n setIsConfirming(true);\n await addNewSwap();\n setIsConfirming(false);\n };\n\n const onStartConfirmSwap = async () => {\n if (confirmSwapResult?.warnings?.quote && !quoteWarningsConfirmed) {\n setShowQuoteWarningModal(true);\n } else {\n await onConfirm();\n }\n };\n\n const onRefresh = async () => {\n setConfirmSwapResult({\n error: null,\n swap: null,\n warnings: null,\n });\n confirmSwap({ selectedWallets, customDestination })\n .then((res) => {\n setConfirmSwapResult(res);\n })\n .catch((error) => console.error(error));\n };\n\n useEffect(() => {\n const disabledLiquiditySourceReset =\n !!prevDisabledLiquiditySources.current.length &&\n !disabledLiquiditySources.length;\n if (disabledLiquiditySourceReset) {\n void onRefresh();\n }\n prevDisabledLiquiditySources.current = disabledLiquiditySources;\n }, [disabledLiquiditySources.length]);\n\n useEffect(() => {\n if (showWalletsOnInit) {\n cancelFetch();\n }\n }, [showWalletsOnInit]);\n\n useEffect(() => {\n if (showWalletsOnInit) {\n setShowWallets(showWalletsOnInit);\n }\n }, [showWalletsOnInit]);\n\n useEffect(() => {\n if (!showWalletsOnInit) {\n confirmSwap({ selectedWallets, customDestination })\n .then((result) => setConfirmSwapResult(result))\n .catch((error) => console.error(error));\n }\n }, []);\n\n useLayoutEffect(() => {\n if (!selectedQuote?.requestId) {\n navigate(`../${location.search}`);\n }\n }, [selectedQuote?.requestId]);\n\n const quoteWarning = confirmSwapResult.warnings?.quote ?? null;\n const quoteError = confirmSwapResult.error;\n const alerts = [];\n if (dbErrorMessage) {\n alerts.push(<Alert type=\"error\" variant=\"alarm\" title={dbErrorMessage} />);\n }\n\n if (confirmSwapResult.warnings?.quoteUpdate) {\n alerts.push(\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={\n confirmSwapResult.warnings.quoteUpdate &&\n getQuoteUpdateWarningMessage(confirmSwapResult.warnings.quoteUpdate)\n }\n />\n );\n }\n\n if (quoteWarning || quoteError) {\n const settings_url = `../${navigationRoutes.settings}`;\n alerts.push(\n <QuoteWarningsAndErrors\n warning={quoteWarning}\n error={quoteError}\n couldChangeSettings={false}\n refetchQuote={onRefresh}\n showWarningModal={showQuoteWarningModal}\n confirmationDisabled={!isActiveTab}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={async () => {\n setShowQuoteWarningModal(false);\n await addNewSwap();\n }}\n onChangeSettings={() => navigate(settings_url)}\n />\n );\n }\n\n return (\n <Layout\n header={{\n title: i18n.t('Confirm Swap'),\n onWallet: () => {\n const wallets_url = `../${navigationRoutes.wallets}`;\n navigate(wallets_url);\n },\n }}\n footer={\n <Buttons>\n <div className={confirmBtnStyles()}>\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n fullWidth\n loading={fetchingConfirmationQuote || isConfirming}\n disabled={!!confirmSwapResult.error || !isActiveTab}\n onClick={onStartConfirmSwap}>\n {i18n.t('Start Swap')}\n </Button>\n </div>\n <IconButton\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n loading={fetchingConfirmationQuote || isConfirming}\n disabled={!isActiveTab}\n onClick={setShowWallets.bind(null, true)}>\n <WalletIcon size={24} />\n </IconButton>\n </Buttons>\n }>\n {showWallets && (\n <ConfirmWalletsModal\n open={showWallets}\n onClose={() => setShowWallets(false)}\n onCancel={cancelFetch}\n loading={fetchingConfirmationQuote}\n onCheckBalance={onConfirmSwap}\n />\n )}\n\n <PageContainer>\n <div className={descriptionStyles()}>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('You get')}\n </Typography>\n <div className={iconStyles()}>\n <RefreshButton\n onClick={\n !fetchingConfirmationQuote &&\n !showWallets &&\n !showQuoteWarningModal\n ? onRefresh\n : undefined\n }\n />\n </div>\n </div>\n <Divider size=\"12\" />\n\n {joinList(\n alerts.map((alert, index) => ({\n element: alert,\n key: `alert-${index}`,\n })),\n <Divider size={10} />\n )}\n {alerts.length > 0 ? <Divider size={10} /> : null}\n\n <QuoteInfo\n quote={selectedQuote}\n type=\"swap-preview\"\n expanded\n tagHidden\n error={confirmSwapResult.error}\n loading={fetchingConfirmationQuote}\n warning={confirmSwapResult.warnings?.quote ?? null}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './ConfirmWalletsModal.types';\nimport type { ConnectedWallet } from '../../store/wallets';\nimport type { ConfirmSwapWarnings, Wallet } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n BalanceErrors,\n Button,\n ChevronLeftIcon,\n Divider,\n MessageBox,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { getQuoteErrorMessage } from '../../constants/errors';\nimport { getQuoteUpdateWarningMessage } from '../../constants/warnings';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainShortNameFor } from '../../utils/meta';\nimport { isConfirmSwapDisabled } from '../../utils/swap';\nimport { getQuoteWallets } from '../../utils/wallets';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomDestination } from '../CustomDestination/CustomDestination';\n\nimport {\n ConfirmButton,\n ListContainer,\n NavigateBack,\n ShowMoreHeader,\n Title,\n Wallets,\n WalletsContainer,\n walletsListStyles,\n} from './ConfirmWallets.styles';\nimport { WalletList } from './WalletList';\n\nconst NUMBER_OF_WALLETS_TO_DISPLAY = 2;\n\nexport function ConfirmWalletsModal(props: PropTypes) {\n //TODO: move component's logics to a custom hook\n const { open, onClose, onCancel, onCheckBalance, loading } = props;\n const navigate = useNavigate();\n const blockchains = useAppStore().blockchains();\n const {\n selectedQuote,\n setSelectedWallets: selectQuoteWallets,\n quoteWalletsConfirmed: quoteWalletsConfirmed,\n setQuoteWalletConfirmed: setQuoteWalletConfirmed,\n customDestination,\n setCustomDestination,\n } = useQuoteStore();\n const { connectedWallets, selectWallets } = useWalletsStore();\n const { config } = useAppStore();\n\n const [showMoreWalletFor, setShowMoreWalletFor] = useState('');\n const [balanceWarnings, setBalanceWarnings] = useState<string[]>([]);\n const [error, setError] = useState('');\n const [quoteWarning, setQuoteWarning] = useState<\n ConfirmSwapWarnings['quoteUpdate'] | null\n >(null);\n\n const [isCustomDestinationOpen, setCustomDestinationOpen] = useState(\n !!customDestination\n );\n\n const quoteWallets = useMemo(\n () =>\n getQuoteWallets({\n filter: 'all',\n quote: selectedQuote,\n }),\n [selectedQuote]\n );\n\n const requiredWallets = getQuoteWallets({\n filter: 'required',\n quote: selectedQuote,\n });\n\n const lastStepToBlockchain = blockchains.find(\n (blockchain) =>\n blockchain.name ===\n selectedQuote?.swaps[selectedQuote?.swaps.length - 1].to.blockchain\n );\n const isWalletRequiredFor = (blockchain: string) =>\n requiredWallets.includes(blockchain);\n\n const getInitialSelectableWallets = useCallback(\n () =>\n connectedWallets.filter((connectedWallet) => {\n return (\n connectedWallet.selected &&\n quoteWallets.includes(connectedWallet.chain)\n );\n }),\n [connectedWallets, quoteWallets]\n );\n\n const [selectableWallets, setSelectableWallets] = useState<ConnectedWallet[]>(\n getInitialSelectableWallets()\n );\n const [nextSelectedWallets, setNextSelectedWallets] = useState<\n {\n blockchain: string;\n walletType: string;\n }[]\n >([]);\n\n const addNextSelectedWallets = (blockchain: string, walletType: string) =>\n setNextSelectedWallets((prevState) =>\n prevState.concat({\n blockchain,\n walletType,\n })\n );\n\n const isInsufficientBalanceModalOpen = balanceWarnings.length > 0;\n\n const isSelected = (walletType: string, chain: string) =>\n !!selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.walletType === walletType &&\n selectableWallet.chain === chain &&\n selectableWallet.selected &&\n (isWalletRequiredFor(chain) ||\n (!isWalletRequiredFor(chain) && !customDestination))\n );\n\n const updateSelectableWallets = (\n wallets: ConnectedWallet[],\n chainName: string,\n shouldSelect: boolean\n ) => {\n let isAnyWalletSelected = false;\n return wallets.map((wallet) => {\n if (wallet.chain === chainName) {\n let selected = wallet.selected;\n if (!isAnyWalletSelected && shouldSelect) {\n isAnyWalletSelected = true;\n selected = true;\n } else if (!shouldSelect) {\n selected = false;\n }\n return {\n ...wallet,\n selected,\n };\n }\n return wallet;\n });\n };\n\n const handleCustomDestinationCollapsibleOpenChange = (open: boolean) => {\n setCustomDestinationOpen(open);\n if (!open) {\n setCustomDestination('');\n setSelectableWallets((selectableWallets) => {\n return updateSelectableWallets(\n selectableWallets,\n lastStepToBlockchain?.name || '',\n true\n );\n });\n } else {\n if (!isWalletRequiredFor(lastStepToBlockchain?.name ?? '')) {\n setSelectableWallets((selectableWallets) => {\n return updateSelectableWallets(\n selectableWallets,\n lastStepToBlockchain?.name || '',\n false\n );\n });\n }\n }\n };\n\n const onChange = (wallet: Wallet) => {\n if (showMoreWalletFor) {\n setShowMoreWalletFor('');\n }\n const selected = isSelected(wallet.walletType, wallet.chain);\n if (selected) {\n return;\n }\n const connectedWallet = connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === wallet.walletType &&\n connectedWallet.chain === wallet.chain\n );\n\n if (!connectedWallet) {\n return;\n }\n\n onCancel();\n if (\n wallet.chain === lastStepToBlockchain?.name &&\n isCustomDestinationOpen &&\n !isWalletRequiredFor(lastStepToBlockchain.name)\n ) {\n setCustomDestinationOpen(false);\n setCustomDestination(null);\n }\n setSelectableWallets((selectableWallets) =>\n selectableWallets\n .filter((selectableWallet) => selectableWallet.chain !== wallet.chain)\n .concat({ ...connectedWallet, selected: true })\n );\n };\n\n const onConfirmBalance = () => {\n const lastSelectedWallets = selectableWallets.filter(\n (wallet) => wallet.selected\n );\n selectWallets(lastSelectedWallets);\n selectQuoteWallets(lastSelectedWallets);\n setQuoteWalletConfirmed(true);\n onClose();\n };\n\n const onConfirmWallets = async () => {\n setBalanceWarnings([]);\n setError('');\n setQuoteWarning(null);\n\n const result = await onCheckBalance?.({\n selectedWallets: selectableWallets.filter((wallet) => wallet.selected),\n customDestination,\n });\n const warnings = result.warnings;\n if (warnings?.balance?.messages) {\n setBalanceWarnings(warnings.balance.messages);\n }\n if (warnings?.quoteUpdate) {\n setQuoteWarning(warnings.quoteUpdate);\n }\n if (result.error) {\n setError(getQuoteErrorMessage(result.error));\n }\n\n if (!result.error && (!warnings?.balance?.messages.length || 0 > 0)) {\n onConfirmBalance();\n } else {\n setBalanceWarnings(warnings?.balance?.messages ?? []);\n }\n };\n\n useEffect(() => {\n setSelectableWallets((selectableWallets) => {\n let nextState: typeof selectableWallets = [];\n\n //if wallet disconnected we should unselect the wallet from the list\n selectableWallets.forEach((selectableWallet) => {\n const walletDisconnected = !connectedWallets.some(\n (connectedWallet) =>\n connectedWallet.chain === selectableWallet.chain &&\n connectedWallet.walletType === selectableWallet.walletType &&\n connectedWallet.address === selectableWallet.address\n );\n if (!walletDisconnected) {\n nextState.push(selectableWallet);\n }\n });\n\n /**\n * We confirm if a newly connected wallet for a blockchain is marked as selected in the store,\n * but there are no selected wallets for that blockchain in our list.\n * If this condition is met, we include the wallet in our list as selected.\n */\n nextState = nextState.concat(\n connectedWallets.filter((connectedWallet) => {\n const anyWalletSelected = !!nextState.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain\n );\n\n return (\n !anyWalletSelected &&\n connectedWallet.selected &&\n quoteWallets.includes(connectedWallet.chain)\n );\n })\n );\n return nextState;\n });\n }, [connectedWallets, quoteWallets]);\n\n useEffect(() => {\n const nextState: typeof nextSelectedWallets = [];\n\n if (nextSelectedWallets.length > 0) {\n nextSelectedWallets.forEach((selectedWallet) => {\n const wallet = connectedWallets.find(\n (wallet) =>\n wallet.chain === selectedWallet.blockchain &&\n wallet.walletType === selectedWallet.walletType\n );\n if (wallet) {\n onChange(wallet);\n } else {\n nextState.push(selectedWallet);\n }\n });\n setNextSelectedWallets(nextState);\n }\n }, [connectedWallets, nextSelectedWallets]);\n\n const modalContainer = document.getElementById(\n WIDGET_UI_ID.SWAP_BOX_ID\n ) as HTMLDivElement;\n\n return (\n <WatermarkedModal\n open={open}\n onClose={() => {\n if (!quoteWalletsConfirmed) {\n const home = '../';\n navigate(home, { replace: true });\n }\n onClose();\n }}\n dismissible={!showMoreWalletFor}\n container={modalContainer}\n {...(!showMoreWalletFor && {\n styles: { container: { height: '100%' } },\n footer: (\n <ConfirmButton>\n <Button\n loading={loading}\n disabled={isConfirmSwapDisabled(\n loading,\n isCustomDestinationOpen,\n customDestination,\n selectedQuote,\n selectableWallets,\n lastStepToBlockchain\n )}\n onClick={onConfirmWallets}\n variant=\"contained\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n {i18n.t('Confirm')}\n </Button>\n </ConfirmButton>\n ),\n })}\n {...(showMoreWalletFor && {\n styles: { container: { height: '100%', padding: '$0' } },\n header: (\n <ShowMoreHeader>\n <NavigateBack\n variant=\"ghost\"\n onClick={setShowMoreWalletFor.bind(null, '')}>\n <ChevronLeftIcon size={16} />\n </NavigateBack>\n <Typography variant=\"headline\" size=\"small\">\n {i18n.t({\n id: 'Your {blockchainName} wallets',\n values: {\n blockchainName: getBlockchainShortNameFor(\n showMoreWalletFor,\n blockchains\n ),\n },\n })}\n </Typography>\n </ShowMoreHeader>\n ),\n })}\n anchor=\"center\">\n <WatermarkedModal\n open={isInsufficientBalanceModalOpen}\n onClose={setBalanceWarnings.bind(null, [])}\n container={modalContainer}>\n <MessageBox\n title={i18n.t('Insufficient account balance')}\n type=\"error\"\n description={<BalanceErrors messages={balanceWarnings ?? []} />}>\n <Button\n variant=\"outlined\"\n size=\"large\"\n type=\"primary\"\n fullWidth\n onClick={onConfirmBalance}>\n {i18n.t('Proceed anyway')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n {showMoreWalletFor && (\n <WalletsContainer>\n <div className={walletsListStyles()}>\n <WalletList\n chain={showMoreWalletFor}\n isSelected={isSelected}\n selectWallet={onChange}\n onShowMore={() => setShowMoreWalletFor(showMoreWalletFor)}\n onConnect={(walletType) => {\n addNextSelectedWallets(showMoreWalletFor, walletType);\n }}\n />\n </div>\n </WalletsContainer>\n )}\n {!showMoreWalletFor && (\n <>\n {error && (\n <>\n <Alert variant=\"alarm\" type=\"error\" title={i18n.t(error)} />\n <Divider size={12} />\n </>\n )}\n {quoteWarning && (\n <>\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={getQuoteUpdateWarningMessage(quoteWarning)}\n />\n <Divider size={12} />\n </>\n )}\n <Wallets>\n {quoteWallets.map((requiredWallet, index) => {\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === requiredWallet\n );\n\n const key = `wallet-${index}`;\n const isLastWallet = index === quoteWallets.length - 1;\n const showCustomDestination =\n isLastWallet &&\n lastStepToBlockchain &&\n config?.customDestination !== false;\n return (\n <div key={key}>\n <Title>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t({\n id: 'Your {blockchainName} wallets',\n values: { blockchainName: blockchain?.shortName },\n })}\n </Typography>\n <Typography\n variant=\"label\"\n color=\"$neutral700\"\n size=\"medium\">\n {i18n.t({\n id: 'You need to connect a {blockchainName} wallet.',\n values: { blockchainName: blockchain?.shortName },\n })}\n </Typography>\n </Title>\n <Divider size={24} />\n <ListContainer>\n <WalletList\n chain={requiredWallet}\n isSelected={isSelected}\n selectWallet={onChange}\n limit={NUMBER_OF_WALLETS_TO_DISPLAY}\n onShowMore={() =>\n setShowMoreWalletFor(blockchain?.name ?? '')\n }\n onConnect={(walletType) => {\n addNextSelectedWallets(requiredWallet, walletType);\n }}\n />\n </ListContainer>\n {!isLastWallet && <Divider size={32} />}\n {showCustomDestination && (\n <CustomDestination\n blockchain={lastStepToBlockchain}\n open={isCustomDestinationOpen}\n handleOpenChange={\n handleCustomDestinationCollapsibleOpenChange\n }\n />\n )}\n </div>\n );\n })}\n </Wallets>\n </>\n )}\n </WatermarkedModal>\n );\n}\n", "import type { QuoteUpdateWarning } from '../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { QuoteUpdateType } from '../types';\n\nexport function getQuoteUpdateWarningMessage(warning: QuoteUpdateWarning) {\n switch (warning.type) {\n case QuoteUpdateType.QUOTE_UPDATED:\n return i18n.t('Route has been updated.');\n case QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED:\n return i18n.t(\n 'Output amount changed to {newOutputAmount} ({percentageChange}% change).',\n {\n newOutputAmount: warning.newOutputAmount,\n percentageChange: warning.percentageChange,\n }\n );\n case QuoteUpdateType.QUOTE_SWAPPERS_UPDATED:\n return i18n.t('Route swappers has been updated.');\n case QuoteUpdateType.QUOTE_COINS_UPDATED:\n return i18n.t('Route internal coins has been updated.');\n default:\n return '';\n }\n}\n", "import type { PropTypes } from './CustomDestination.types';\nimport type { MouseEvent } from 'react';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n ChevronDownIcon,\n CloseIcon,\n Divider,\n IconButton,\n PasteIcon,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useRef } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport {\n getBlockchainDisplayNameFor,\n isValidTokenAddress,\n} from '../../utils/meta';\nimport { CustomCollapsible } from '../CustomCollapsible/CustomCollapsible';\nimport { ExpandedIcon } from '../CustomCollapsible/CustomCollapsible.styles';\n\nimport {\n Container,\n CustomDestinationButton,\n StyledTextField,\n} from './CustomDestination.styles';\n\nexport function CustomDestination(props: PropTypes) {\n const { blockchain, handleOpenChange, open } = props;\n\n const { customDestination, setCustomDestination } = useQuoteStore();\n const { config } = useAppStore();\n const blockchains = useAppStore().blockchains();\n const blockchainName = getBlockchainDisplayNameFor(\n blockchain.name,\n blockchains\n );\n const inputRef = useRef<HTMLInputElement | null>(null);\n const configDestination =\n config?.defaultCustomDestinations?.[blockchain.name];\n\n const isFirefox = navigator?.userAgent.includes('Firefox');\n const isAddressChecked = open && !!customDestination && blockchain;\n const isAddressInvalid =\n isAddressChecked && !isValidTokenAddress(blockchain, customDestination);\n const handleClear = () => {\n setCustomDestination('');\n };\n\n const handlePaste = async (event: MouseEvent<HTMLButtonElement>) => {\n event.preventDefault();\n if (navigator.clipboard !== undefined) {\n const pastedText = await navigator.clipboard.readText();\n setCustomDestination(pastedText);\n inputRef?.current?.focus();\n }\n };\n\n const renderSuffix = () => {\n if (customDestination) {\n return (\n <IconButton onClick={handleClear} variant=\"ghost\">\n <CloseIcon size={12} color=\"gray\" />\n </IconButton>\n );\n } else if (!isFirefox) {\n return (\n <IconButton onClick={handlePaste} variant=\"ghost\">\n <PasteIcon size={16} />\n </IconButton>\n );\n }\n\n return null;\n };\n\n useEffect(() => {\n const shouldUseConfigDestination =\n !!configDestination && customDestination === null;\n\n if (shouldUseConfigDestination) {\n setCustomDestination(configDestination);\n handleOpenChange(true);\n }\n }, [configDestination]);\n\n return (\n <Container>\n <CustomCollapsible\n onOpenChange={handleOpenChange}\n hasSelected\n open={open}\n triggerAnchor=\"top\"\n trigger={\n <CustomDestinationButton>\n <div className=\"button__content\">\n <WalletIcon size={18} color=\"info\" />\n <Divider size={4} direction=\"horizontal\" />\n <Typography\n variant=\"label\"\n size=\"medium\"\n color={open ? '$neutral600' : undefined}>\n {i18n.t('Send to a different address')}\n </Typography>\n </div>\n <ExpandedIcon orientation={open ? 'up' : 'down'}>\n <ChevronDownIcon size={10} color=\"secondary\" />\n </ExpandedIcon>\n </CustomDestinationButton>\n }\n onClickTrigger={() => handleOpenChange(!open)}>\n <StyledTextField\n ref={inputRef}\n style={{\n padding: 0,\n paddingRight: customDestination ? '8px' : '5px',\n }}\n autoFocus={!customDestination}\n placeholder={i18n.t('Enter {blockchainName} address', {\n blockchainName,\n })}\n value={customDestination || ''}\n suffix={renderSuffix()}\n onChange={(e) => {\n const customDestination = e.target.value;\n setCustomDestination(customDestination);\n }}\n />\n </CustomCollapsible>\n\n {isAddressInvalid && (\n <>\n <Divider size={4} />\n <Alert\n variant=\"alarm\"\n type=\"error\"\n title={i18n.t({\n values: { destination: customDestination },\n id: \"Address {destination} doesn't match the blockchain address pattern.\",\n })}\n />\n </>\n )}\n </Container>\n );\n}\n", "import type { PropTypes } from './CustomCollapsible.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useRef } from 'react';\n\nimport {\n CollapsibleContent,\n CollapsibleRoot,\n Trigger,\n} from './CustomCollapsible.styles';\n\nexport function CustomCollapsible(props: PropsWithChildren<PropTypes>) {\n const {\n open,\n hasSelected,\n onOpenChange,\n children,\n onClickTrigger,\n trigger,\n triggerAnchor,\n } = props;\n const ref = useRef<HTMLDivElement | null>(null);\n\n return (\n <CollapsibleRoot\n ref={ref}\n className=\"collapsible_root\"\n selected={hasSelected && open}\n open={open}\n onOpenChange={onOpenChange}>\n {triggerAnchor === 'top' && (\n <Trigger className=\"collapsible_trigger\" onClick={onClickTrigger}>\n {trigger}\n </Trigger>\n )}\n <CollapsibleContent className=\"collapsible_content\" open={open}>\n {children}\n </CollapsibleContent>\n {triggerAnchor === 'bottom' && (\n <Trigger className=\"collapsible_trigger\" onClick={onClickTrigger}>\n {trigger}\n </Trigger>\n )}\n </CollapsibleRoot>\n );\n}\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport { keyframes, styled } from '@rango-dev/ui';\n\nexport const EXPANDABLE_TRANSITION_DURATION = 300;\n\nconst slideDown = keyframes({\n from: {\n height: 0,\n },\n to: {\n height: 'var(--radix-collapsible-content-height)',\n },\n});\n\nconst slideUp = keyframes({\n from: {\n height: 'var(--radix-collapsible-content-height)',\n },\n to: {\n height: 0,\n },\n});\n\nexport const CollapsibleRoot = styled(Collapsible.Root, {\n borderRadius: '$sm',\n overflow: 'hidden',\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary500',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const Trigger = styled(Collapsible.Trigger, {\n padding: '$0',\n border: 'none',\n outline: 'none',\n width: '100%',\n backgroundColor: 'transparent',\n fontFamily: 'inherit',\n cursor: 'pointer',\n});\n\nexport const CollapsibleContent = styled(Collapsible.Content, {\n overflow: 'hidden',\n variants: {\n open: {\n true: {\n animation: `${slideDown} ${EXPANDABLE_TRANSITION_DURATION}ms ease-out`,\n },\n false: {\n animation: `${slideUp} ${EXPANDABLE_TRANSITION_DURATION}ms ease-out`,\n },\n },\n },\n});\n\nexport const ExpandedIcon = styled('div', {\n transition: `all ${EXPANDABLE_TRANSITION_DURATION}ms ease`,\n display: 'flex',\n alignItems: 'center',\n variants: {\n orientation: {\n down: {\n transform: 'rotate(0)',\n },\n up: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n", "import { darkTheme, styled, TextField } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n padding: '$10 $0',\n '& .button__content': {\n display: 'flex',\n alignItems: 'center',\n },\n '& .alarms': { paddingTop: '$5' },\n '& .collapsible_content': {\n backgroundColor: '$neutral100',\n },\n '& .collapsible_root': {\n backgroundColor: '$neutral100',\n },\n});\n\nexport const StyledTextField = styled(TextField, {\n backgroundColor: '$neutral100',\n padding: '$15',\n});\n\nexport const CustomDestinationButton = styled('div', {\n width: '100%',\n borderRadius: '$sm',\n display: 'flex',\n padding: '$15',\n justifyContent: 'space-between',\n alignItems: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n borderBottomRightRadius: '0',\n borderBottomLeftRadius: '0',\n '&:focus-visible': {\n $$background: '$colors$secondary100',\n [`.${darkTheme} &`]: {\n $$background: '$colors$info700',\n },\n backgroundColor: '$$background',\n outline: 0,\n },\n});\n", "import { css, darkTheme, IconButton, styled } from '@rango-dev/ui';\n\nexport const Title = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const ListContainer = styled('div', {\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\n});\n\nexport const WalletButton = styled('button', {\n borderRadius: '$xm',\n padding: '$10',\n border: '0',\n display: 'flex',\n justifyContent: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n alignItems: 'center',\n cursor: 'pointer',\n width: 110,\n position: 'relative',\n\n '&:hover': {\n $$color: '$colors$secondary100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral100',\n },\n backgroundColor: '$$color',\n },\n\n '&:focus-visible': {\n $$color: '$colors$secondary100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$info700',\n },\n backgroundColor: '$$color',\n outline: 0,\n },\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const ShowMoreWallets = styled(WalletButton, {\n alignSelf: 'stretch',\n minHeight: '93px',\n});\nexport const ShowMoreHeader = styled('div', {\n padding: '$20 $20 $15 $20',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: '$neutral200',\n position: 'relative',\n width: '100%',\n});\n\nexport const NavigateBack = styled(IconButton, {\n position: 'absolute',\n left: '$20',\n});\n\nexport const WalletsContainer = styled('div', {\n paddingTop: '$20',\n});\n\nexport const walletsListStyles = css({\n display: 'flex',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n height: '100%',\n});\n\nexport const ConfirmButton = styled('div', {\n display: 'flex',\n});\n\nexport const Wallets = styled('div', { overflow: 'visible', width: '100%' });\n", "import type { PropTypes } from './WalletList.type';\nimport type { Wallet, WalletInfoWithExtra } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport { warn } from '@rango-dev/logging-core';\nimport {\n Divider,\n SelectableWallet,\n Typography,\n WalletState,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { WIDGET_UI_ID } from '../../constants';\nimport {\n ResultStatus,\n useStatefulConnect,\n} from '../../hooks/useStatefulConnect';\nimport { useWalletList } from '../../hooks/useWalletList';\nimport { useAppStore } from '../../store/AppStore';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainDisplayNameFor } from '../../utils/meta';\nimport {\n getAddress,\n getConciseAddress,\n isExperimentalChain,\n} from '../../utils/wallets';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { StatefulConnectModal } from '../StatefulConnectModal';\nimport { ExperimentalChain } from '../WalletStatefulConnect';\nimport { ExperimentalChainStatus } from '../WalletStatefulConnect/ExperimentalChainStatus';\n\nimport { ShowMoreWallets } from './ConfirmWallets.styles';\n\nconst ACCOUNT_ADDRESS_MAX_CHARACTERS = 7;\nconst TIME_TO_CLOSE_MODAL = 3_000;\n\nexport function WalletList(props: PropTypes) {\n const { chain, isSelected, selectWallet, limit, onShowMore } = props;\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const { blockchains } = useAppStore();\n const [selectedWalletToConnect, setSelectedWalletToConnect] =\n useState<WalletInfoWithExtra>();\n const [experimentalChainWallet, setExperimentalChainWallet] =\n useState<Wallet | null>(null);\n const [showExperimentalChainModal, setShowExperimentalChainModal] =\n useState(false);\n const [addingExperimentalChainStatus, setAddingExperimentalChainStatus] =\n useState<'in-progress' | 'completed' | 'rejected' | null>(null);\n const { suggestAndConnect } = useWallets();\n const { handleDisconnect } = useStatefulConnect();\n const { list } = useWalletList({\n chain,\n });\n\n const [sortedList, setSortedList] = useState<WalletInfoWithExtra[]>(list);\n const numberOfSupportedWallets = list.length;\n const shouldShowMoreWallets = limit && numberOfSupportedWallets - limit > 0;\n\n const addExperimentalChain = async (wallet: Wallet) => {\n setShowExperimentalChainModal(false);\n setAddingExperimentalChainStatus('in-progress');\n try {\n await suggestAndConnect(wallet.walletType, wallet.chain);\n setAddingExperimentalChainStatus('completed');\n } catch (e) {\n setAddingExperimentalChainStatus('rejected');\n }\n };\n\n useEffect(() => {\n setSortedList((sortedList) => {\n const selectedWalletIndex = list.findIndex((wallet) =>\n isSelected(wallet.type, chain)\n );\n\n if (shouldShowMoreWallets && selectedWalletIndex > 1) {\n return [list[selectedWalletIndex]].concat(\n list.filter((_, index) => index !== selectedWalletIndex)\n );\n }\n return sortedList.map(\n (sortedItem) =>\n list.find((listItem) => listItem.type === sortedItem.type) ??\n sortedItem\n );\n });\n }, [JSON.stringify(list)]);\n\n const modalContainer = document.getElementById(\n WIDGET_UI_ID.SWAP_BOX_ID\n ) as HTMLDivElement;\n\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n if (\n addingExperimentalChainStatus === 'completed' ||\n addingExperimentalChainStatus === 'rejected'\n ) {\n timeout = setTimeout(\n () => setAddingExperimentalChainStatus(null),\n TIME_TO_CLOSE_MODAL\n );\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n };\n }, [addingExperimentalChainStatus]);\n\n return (\n <>\n {sortedList.slice(0, limit).map((wallet) => {\n const address = getAddress({\n connectedWallets,\n walletType: wallet.type,\n chain,\n });\n const conciseAddress = address\n ? getConciseAddress(address, ACCOUNT_ADDRESS_MAX_CHARACTERS)\n : '';\n\n const experimentalChain = isExperimentalChain(blockchains(), chain);\n\n const experimentalChainNotAdded = !connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === wallet.type &&\n connectedWallet.chain === chain\n );\n\n const couldAddExperimentalChain =\n experimentalChain &&\n experimentalChainNotAdded &&\n wallet.state === WalletState.CONNECTED;\n\n const connectedWalletDescription = couldAddExperimentalChain\n ? i18n.t({\n id: 'Add {chain} chain',\n values: { chain },\n })\n : conciseAddress;\n\n const onSelectableWalletClick = async () => {\n const isDisconnected = wallet.state === WalletState.DISCONNECTED;\n if (isDisconnected) {\n setSelectedWalletToConnect(wallet);\n } else if (!!wallet.namespaces && !conciseAddress) {\n // wallet is connected on a different namespace\n await handleDisconnect(wallet.type);\n\n setSelectedWalletToConnect(wallet);\n } else if (couldAddExperimentalChain) {\n setExperimentalChainWallet({\n walletType: wallet.type,\n chain,\n address: address ?? '',\n });\n setShowExperimentalChainModal(true);\n } else {\n selectWallet({\n walletType: wallet.type,\n chain,\n address: address ?? '',\n });\n }\n };\n\n const blockchainDisplayName: string | undefined =\n experimentalChainWallet?.chain\n ? getBlockchainDisplayNameFor(\n experimentalChainWallet.chain,\n blockchains()\n )\n : undefined;\n return (\n <React.Fragment key={`${wallet.title}_${blockchainDisplayName}`}>\n {!!experimentalChainWallet && (\n <WatermarkedModal\n open={!!experimentalChainWallet && showExperimentalChainModal}\n container={modalContainer}\n onClose={() => {\n setExperimentalChainWallet(null);\n }}>\n <ExperimentalChain\n displayName={blockchainDisplayName}\n onConfirm={() => {\n void addExperimentalChain(experimentalChainWallet);\n }}\n />\n </WatermarkedModal>\n )}\n {addingExperimentalChainStatus && (\n <WatermarkedModal\n open={!!addingExperimentalChainStatus}\n onClose={setAddingExperimentalChainStatus.bind(null, null)}\n container={modalContainer}>\n <ExperimentalChainStatus\n status={addingExperimentalChainStatus}\n displayName={blockchainDisplayName}\n image={wallet.image}\n />\n <Divider direction=\"vertical\" size={32} />\n </WatermarkedModal>\n )}\n <SelectableWallet\n key={wallet.type}\n description={connectedWalletDescription}\n onClick={onSelectableWalletClick}\n selected={isSelected(wallet.type, chain)}\n disabled={!isActiveTab}\n {...wallet}\n />\n </React.Fragment>\n );\n })}\n <StatefulConnectModal\n wallet={selectedWalletToConnect}\n onClose={() => {\n setSelectedWalletToConnect(undefined);\n }}\n onConnect={(result) => {\n if (props.onConnect && result.status === ResultStatus.Connected) {\n if (selectedWalletToConnect?.type) {\n props.onConnect(selectedWalletToConnect.type);\n } else {\n warn(\n new Error(\n \"The selected wallet hasn't been detected after the connection process finished. It usually shouldn't happen.\"\n )\n );\n }\n }\n }}\n />\n {shouldShowMoreWallets && (\n <ShowMoreWallets selected={false} onClick={onShowMore}>\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Show more wallets')}\n <Typography variant=\"label\" size=\"medium\" color=\"$primary\">\n &nbsp;+{numberOfSupportedWallets - (limit ?? 0)}\n </Typography>\n </Typography>\n </ShowMoreWallets>\n )}\n </>\n );\n}\n", "import type { PropTypes } from './ExperimentalChainStatus.types';\n\nimport { Image, MessageBox, Spinner } from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n LogoContainer,\n WalletImageContainer,\n} from '../ConfirmWalletsModal/WalletList.styles';\n\nimport { generateMessageByStatus } from './ExperimentalChainStatus.helpers';\n\nexport function ExperimentalChainStatus(props: PropTypes) {\n const { status, displayName, image } = props;\n const data = generateMessageByStatus(status, displayName);\n const hasImage = status == 'in-progress';\n\n return (\n <MessageBox\n type={data.type}\n title={data.title}\n description={data.description}\n icon={\n hasImage ? (\n <LogoContainer>\n <WalletImageContainer>\n <Image src={image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n ) : undefined\n }\n />\n );\n}\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const LogoContainer = styled('div', {\n position: 'relative',\n});\n\nconst SpinAnimation = keyframes({\n '0%': {\n transform: 'rotate(0deg)',\n },\n '100%': {\n transform: 'rotate(360deg)',\n },\n});\n\nexport const Spinner = styled('div', {\n position: 'absolute',\n border: '2px solid rgba(0, 0, 0, 0.1)',\n borderTop: '2px solid $info500',\n borderRadius: '$lg',\n width: '$45',\n height: '$45',\n animation: `${SpinAnimation} 1s linear infinite`,\n top: 0,\n bottom: 0,\n right: 0,\n left: 0,\n});\n\nexport const WalletImageContainer = styled('div', {\n '& img': {\n borderRadius: '50%',\n },\n});\n", "import type { PropTypes } from './ExperimentalChainStatus.types';\nimport type { MessageType } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\n\nexport function generateMessageByStatus(\n status: PropTypes['status'],\n blockchainDisplayName: string | undefined\n): {\n type: MessageType;\n title: string;\n description: string;\n} {\n switch (status) {\n case 'in-progress':\n return {\n type: 'loading',\n title: i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName },\n }),\n description: i18n.t({\n id: 'You should connect a {blockchainDisplayName} supported wallet or choose a different {blockchainDisplayName} address',\n values: { blockchainDisplayName },\n }),\n };\n case 'completed':\n return {\n type: 'success',\n title: i18n.t({\n id: '{blockchainDisplayName} Chain Added',\n values: { blockchainDisplayName },\n }),\n description: i18n.t({\n id: 'You should connect a {blockchainDisplayName} supported wallet or choose a different {blockchainDisplayName} address',\n values: { blockchainDisplayName },\n }),\n };\n case 'rejected':\n return {\n type: 'error',\n title: i18n.t('Request Rejected'),\n description: i18n.t({\n id: \"You've rejected adding {blockchainDisplayName} chain to your wallet.\",\n values: { blockchainDisplayName },\n }),\n };\n default:\n throw new Error(\n `Showing information about an experimentation chain status needs to be defined first. status: ${status}`\n );\n }\n}\n", "import type { PropTypes } from './QuoteWarningsAndErrors.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button, InfoIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { NoResult } from '../NoResult';\n\nimport { HighValueLossWarningModal } from './HighValueLossWarningModal';\nimport { makeAlerts } from './QuoteWarningsAndErrors.helpers';\nimport { Action, Alerts } from './QuoteWarningsAndErrors.styles';\nimport { SlippageWarningModal } from './SlippageWariningModal';\nimport { UnknownPriceWarningModal } from './UnknownPriceWarningModal';\n\nexport function QuoteWarningsAndErrors(props: PropTypes) {\n const {\n warning,\n error,\n couldChangeSettings,\n showWarningModal,\n confirmationDisabled,\n refetchQuote,\n onOpenWarningModal,\n onCloseWarningModal,\n onConfirmWarningModal,\n onChangeSettings,\n } = props;\n\n const warningModalHandlers = {\n confirmationDisabled,\n open: showWarningModal,\n onClose: onCloseWarningModal,\n onConfirm: onConfirmWarningModal,\n };\n\n const showNoResultMessage =\n error?.type === QuoteErrorType.NO_RESULT ||\n error?.type === QuoteErrorType.REQUEST_FAILED;\n\n const alertInfo = makeAlerts(\n warning,\n error?.type === QuoteErrorType.BRIDGE_LIMIT ||\n error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE\n ? error\n : null\n );\n if (alertInfo && !couldChangeSettings) {\n alertInfo.action = null;\n }\n\n const showAlerts = !!alertInfo;\n\n return (\n <>\n {showNoResultMessage && <NoResult error={error} fetch={refetchQuote} />}\n\n {showAlerts && (\n <Alerts>\n <Alert\n title={alertInfo.title}\n type={alertInfo.alertType}\n variant=\"alarm\"\n {...(alertInfo.action === 'show-info' && {\n action: (\n <Action onClick={onOpenWarningModal}>\n <InfoIcon size={12} color=\"gray\" />\n </Action>\n ),\n })}\n {...(alertInfo.action === 'change-settings' && {\n action: (\n <Button\n size=\"xxsmall\"\n type={alertInfo.alertType}\n onClick={onChangeSettings}>\n {i18n.t('Change')}\n </Button>\n ),\n })}\n />\n </Alerts>\n )}\n\n {warning && (\n <>\n {warning.type === QuoteWarningType.HIGH_VALUE_LOSS && (\n <HighValueLossWarningModal\n {...warningModalHandlers}\n warning={warning}\n />\n )}\n\n {(warning.type === QuoteWarningType.HIGH_SLIPPAGE ||\n warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) && (\n <SlippageWarningModal {...warningModalHandlers} warning={warning} />\n )}\n\n {warning.type === QuoteWarningType.UNKNOWN_PRICE && (\n <UnknownPriceWarningModal\n {...warningModalHandlers}\n warning={warning}\n />\n )}\n </>\n )}\n </>\n );\n}\n", "import type { PropTypes } from './NoResult.types';\n\nimport {\n Alert,\n Button,\n Divider,\n NoRouteIcon,\n RefreshIcon,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { useAppStore } from '../../store/AppStore';\n\nimport {\n makeInfo,\n NoRouteIconSize,\n NoRouteTitleSize,\n} from './NoResult.helpers';\nimport {\n Container,\n ErrorDescription,\n Footer,\n PrefixIcon,\n} from './NoResult.styles';\n\nexport function NoResult(props: PropTypes) {\n const { fetch, error, size = 'small' } = props;\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const toggleAllLiquiditySources = useAppStore().toggleAllLiquiditySources;\n\n const swappers = useAppStore().swappers();\n const info = makeInfo(\n error,\n disabledLiquiditySources,\n () => toggleAllLiquiditySources(swappers, true),\n fetch\n );\n\n return (\n <Container>\n <NoRouteIcon size={NoRouteIconSize[size]} color=\"gray\" />\n <Divider size={4} />\n <Typography variant=\"title\" size={NoRouteTitleSize[size]}>\n {errorMessages().noResultError.title}\n </Typography>\n {size === 'large' && <Divider size={4} />}\n {!!info.description && (\n <ErrorDescription size={size}>\n <Typography\n variant=\"body\"\n size=\"small\"\n align=\"center\"\n color=\"neutral700\">\n {info.description}\n </Typography>\n </ErrorDescription>\n )}\n <Divider size={size === 'large' ? '24' : '4'} />\n {!!info.alert && (\n <Footer size={size}>\n <Alert\n type={info.alert.type}\n title={info.alert.text}\n titleAlign={'left'}\n action={\n info.alert.action && (\n <Button\n size=\"xsmall\"\n type={info.alert.type}\n prefix={\n <PrefixIcon>\n <RefreshIcon size={8} />\n </PrefixIcon>\n }\n onClick={info.alert.action.onClick}>\n {info.alert.action.title}\n </Button>\n )\n }\n variant=\"alarm\"\n />\n </Footer>\n )}\n </Container>\n );\n}\n", "import type { Info } from './NoResult.types';\n\nimport { i18n } from '@lingui/core';\n\nimport { errorMessages } from '../../constants/errors';\nimport {\n type NoResultError,\n QuoteErrorType,\n type QuoteRequestFailed,\n} from '../../types';\n\nconst SMALL_NO_ROUTE__ICON_SIZE = 24;\nconst LARGE_NO_ROUTE_ICON_SIZE = 60;\n\nexport function makeInfo(\n error: NoResultError | QuoteRequestFailed | null,\n disabledLiquiditySources: string[],\n toggleAllLiquiditySources: (shouldReset: boolean) => void,\n refetchQuote: () => void\n): Info {\n if (error?.type === QuoteErrorType.REQUEST_FAILED) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages().genericServerError,\n action: {\n onClick: refetchQuote,\n title: i18n.t('Retry'),\n },\n },\n description: '',\n };\n } else if (disabledLiquiditySources.length) {\n return {\n alert: {\n type: 'warning',\n text: errorMessages().liquiditySourcesError.title,\n action: {\n onClick: () => toggleAllLiquiditySources(true),\n title: i18n.t('Reset'),\n },\n },\n description: errorMessages().liquiditySourcesError.description,\n };\n } else if (\n error?.type === QuoteErrorType.NO_RESULT &&\n error.diagnosisMessage\n ) {\n return {\n alert: {\n type: 'error',\n text: error.diagnosisMessage,\n action: null,\n },\n description: '',\n };\n }\n return {\n alert: null,\n description: errorMessages().noResultError.description,\n };\n}\n\nexport enum NoRouteIconSize {\n small = SMALL_NO_ROUTE__ICON_SIZE,\n large = LARGE_NO_ROUTE_ICON_SIZE,\n}\n\nexport enum NoRouteTitleSize {\n small = 'small',\n large = 'medium',\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n});\n\nexport const ErrorDescription = styled('div', {\n variants: {\n size: {\n small: {},\n large: {\n maxWidth: '316px',\n },\n },\n },\n});\n\nexport const Footer = styled('div', {\n variants: {\n size: {\n small: {\n width: '100%',\n },\n large: {},\n },\n },\n});\n\nexport const PrefixIcon = styled('div', {\n padding: '$6 $0',\n});\n", "import type { HighValueLossWarning } from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n Typography,\n WarningIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { QuoteErrorsModalItem } from './QuoteErrorsModalItem';\nimport { Flex } from './QuoteWarningsAndErrors.styles';\n\ntype Props = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: HighValueLossWarning;\n};\n\nexport function HighValueLossWarningModal(props: Props) {\n const { open, onClose, onConfirm, warning, confirmationDisabled } = props;\n const type = warning.warningLevel === 'high' ? 'error' : 'warning';\n\n const highValueLossData = [\n {\n title: i18n.t('Swapping'),\n value: numberToString(\n warning.inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Gas cost'),\n value: numberToString(\n warning.totalFee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Receiving'),\n value: numberToString(\n warning.outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n },\n {\n title: i18n.t('Price impact'),\n value: numberToString(\n warning.priceImpact,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n ),\n valueColor: `${type}500`,\n },\n ];\n\n return (\n <WatermarkedModal\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {errorMessages().highValueLossError.confirmMessage}\n </Button>\n }\n open={open}\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n type={type}\n title={errorMessages().highValueLossError.impactTitle}\n description={errorMessages().highValueLossError.description}\n />\n\n <Flex>\n <Divider size=\"4\" />\n <Typography size=\"small\" variant=\"title\">\n {i18n.t('Details')}\n </Typography>\n <Flex>\n {highValueLossData.map((item, index) => {\n const key = index;\n return <QuoteErrorsModalItem key={key} {...item} />;\n })}\n </Flex>\n </Flex>\n </WatermarkedModal>\n );\n}\n", "import type { ModalContentData } from './QuoteWarningsAndErrors.types';\n\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Item } from './QuoteWarningsAndErrors.styles';\n\nexport function QuoteErrorsModalItem(props: ModalContentData) {\n const { title, value, valueColor } = props;\n\n return (\n <Item>\n <Typography size=\"medium\" variant=\"label\" className=\"_title\">\n {title}\n </Typography>\n <Typography\n size=\"large\"\n variant=\"label\"\n color={valueColor || 'foreground'}>\n {`${valueColor ? '%' : '$'}${value}`}\n </Typography>\n </Item>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Alerts = styled('div', {\n width: '100%',\n});\n\nexport const Flex = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: '$5',\n width: '100%',\n});\n\nexport const Item = styled('div', {\n display: 'flex',\n padding: '$5 0',\n justifyContent: 'space-between',\n alignItems: 'center',\n width: '100%',\n '._title': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Action = styled('div', {\n padding: '$2',\n alignSelf: 'flex-start',\n cursor: 'pointer',\n});\n", "import type {\n BridgeLimitError,\n InsufficientSlippageError,\n QuoteWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { getPriceImpactLevel } from '../../utils/quote';\n\ntype AlertInfo = {\n alertType: 'error' | 'warning';\n title: string;\n action: 'show-info' | 'change-settings' | null;\n};\n\nexport function makeAlerts(\n warning: QuoteWarning | null,\n error: BridgeLimitError | InsufficientSlippageError | null\n): AlertInfo | null {\n const alertInfo: AlertInfo = {\n alertType: 'warning',\n title: '',\n action: null,\n };\n if (error) {\n alertInfo.alertType = 'error';\n if (error.type === QuoteErrorType.BRIDGE_LIMIT) {\n alertInfo.title = error.recommendation;\n }\n\n if (error.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE) {\n alertInfo.title = i18n.t({\n id: 'You need to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: error.minRequiredSlippage,\n },\n });\n alertInfo.action = 'change-settings';\n }\n\n return alertInfo;\n }\n if (warning) {\n if (warning.type === QuoteWarningType.HIGH_VALUE_LOSS) {\n const warningLevel = getPriceImpactLevel(warning.priceImpact);\n if (warningLevel === 'high') {\n alertInfo.alertType = 'error';\n }\n alertInfo.action = 'show-info';\n alertInfo.title = errorMessages().highValueLossError.title;\n }\n if (warning.type === QuoteWarningType.UNKNOWN_PRICE) {\n alertInfo.title = errorMessages().unknownPriceError.title;\n }\n if (warning.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE) {\n alertInfo.title = i18n.t({\n id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: warning.minRequiredSlippage,\n },\n });\n alertInfo.action = 'change-settings';\n }\n if (warning.type === QuoteWarningType.HIGH_SLIPPAGE) {\n alertInfo.title = i18n.t('Caution, your slippage is high.');\n alertInfo.action = 'change-settings';\n }\n return alertInfo;\n }\n return null;\n}\n", "import type {\n HighSlippageWarning,\n InsufficientSlippageWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Typography } from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useAppStore } from '../../store/AppStore';\nimport { QuoteWarningType } from '../../types';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\ntype PropsTypes = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: InsufficientSlippageWarning | HighSlippageWarning;\n};\n\nexport function SlippageWarningModal(props: PropsTypes) {\n const { customSlippage, slippage } = useAppStore();\n const { open, onClose, onConfirm, warning, confirmationDisabled } = props;\n const navigate = useNavigate();\n const userSlippage = customSlippage ?? slippage;\n\n return (\n <WatermarkedModal\n anchor=\"bottom\"\n open={open}\n prefix={\n <Button\n size=\"small\"\n variant=\"ghost\"\n onClick={() => navigate('../' + navigationRoutes.settings)}>\n <Typography variant=\"label\" size=\"medium\" color=\"$neutral900\">\n {i18n.t('Change settings')}\n </Typography>\n </Button>\n }\n container={getContainer()}\n onClose={onClose}>\n <MessageBox\n type=\"warning\"\n title={\n warning.type === QuoteWarningType.HIGH_SLIPPAGE\n ? i18n.t('High slippage')\n : i18n.t('Low slippage')\n }\n description={\n warning.type === QuoteWarningType.HIGH_SLIPPAGE\n ? i18n.t({\n id: ' Caution, your slippage is high (={userSlippage}). Your trade may be front run.',\n values: { userSlippage },\n })\n : i18n.t({\n id: 'We recommend you to increase slippage to at least {minRequiredSlippage} for this route.',\n values: {\n minRequiredSlippage: warning.minRequiredSlippage,\n },\n })\n }>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n size=\"large\"\n type=\"primary\"\n variant=\"contained\"\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {i18n.t('Confirm anyway')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n );\n}\n", "import type { UnknownPriceWarning } from '../../types';\n\nimport { Button, MessageBox, WarningIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\ntype Props = {\n open: boolean;\n confirmationDisabled: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: UnknownPriceWarning;\n};\n\nexport function UnknownPriceWarningModal(props: Props) {\n const { open, onClose, onConfirm, confirmationDisabled } = props;\n return (\n <WatermarkedModal\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n disabled={confirmationDisabled}\n onClick={onConfirm}>\n {errorMessages().unknownPriceError.confirmMessage}\n </Button>\n }\n open={open}\n onClose={onClose}\n container={getContainer()}>\n <MessageBox\n type=\"warning\"\n title={errorMessages().unknownPriceError.impactTitle}\n description={errorMessages().unknownPriceError.description}\n />\n </WatermarkedModal>\n );\n}\n", "import type { PropTypes } from './QuoteInfo.types';\n\nimport BigNumber from 'bignumber.js';\nimport React from 'react';\n\nimport { Quote } from '../../components/Quote';\nimport { QuoteSkeleton } from '../../components/QuoteSkeleton';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType } from '../../types';\nimport { getQuoteToTokenUsdPrice } from '../../utils/quote';\nimport { calcOutputUsdValue } from '../../utils/swap';\n\nimport { QuoteContainer } from './QuoteInfo.styles';\n\nexport function QuoteInfo(props: PropTypes) {\n const {\n quote,\n type,\n loading,\n error,\n warning,\n expanded = false,\n tagHidden,\n onClick,\n showModalFee,\n selected,\n onClickAllRoutes,\n fullExpandedMode = false,\n container,\n } = props;\n const { inputAmount, inputUsdValue, toToken } = useQuoteStore();\n\n const outputAmount = !!quote?.outputAmount\n ? new BigNumber(quote?.outputAmount)\n : null;\n const outputUsdValue = !!quote?.outputAmount\n ? calcOutputUsdValue(\n quote?.outputAmount,\n getQuoteToTokenUsdPrice(quote) || toToken?.usdPrice\n )\n : null;\n\n const noResult =\n error &&\n (error.type === QuoteErrorType.NO_RESULT ||\n error.type === QuoteErrorType.REQUEST_FAILED);\n\n const showQuote = !noResult && quote && !loading;\n\n if (loading) {\n return (\n <QuoteContainer>\n <QuoteSkeleton tagHidden={tagHidden} type={type} expanded={expanded} />\n </QuoteContainer>\n );\n }\n\n return showQuote ? (\n <QuoteContainer onClick={() => onClick?.(quote)}>\n <Quote\n quote={quote}\n error={error}\n container={container}\n showModalFee={showModalFee}\n warning={warning}\n tagHidden={tagHidden}\n selected={selected}\n type={type}\n expanded={expanded}\n onClickAllRoutes={onClickAllRoutes}\n fullExpandedMode={fullExpandedMode}\n input={{\n value: inputAmount,\n usdValue: inputUsdValue?.toString() ?? '',\n }}\n output={{\n value: outputAmount?.toString() ?? '',\n usdValue: outputUsdValue?.toString() ?? '',\n }}\n />\n </QuoteContainer>\n ) : null;\n}\n", "import type { QuoteProps } from './Quote.types';\nimport type { Step } from '@rango-dev/ui';\nimport type { SwapResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Alert,\n Divider,\n FullExpandedQuote,\n InfoIcon,\n NumericTooltip,\n QuoteTag,\n StepDetails,\n TokenAmount,\n Typography,\n} from '@rango-dev/ui';\nimport BigNumber from 'bignumber.js';\nimport React, { useRef, useState } from 'react';\n\nimport { GAS_FEE_MAX } from '../../constants/quote';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport {\n FooterAlert,\n FooterStepAlarm,\n} from '../../containers/QuoteInfo/QuoteInfo.styles';\nimport { useAppStore } from '../../store/AppStore';\nimport { QuoteErrorType, QuoteWarningType } from '../../types';\nimport { getContainer, getExpanded } from '../../utils/common';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport {\n numberToString,\n roundedSecondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport {\n getPriceImpact,\n getPriceImpactLevel,\n sortTags,\n} from '../../utils/quote';\nimport { getTotalFeeInUsd, getUsdFeeOfStep } from '../../utils/swap';\n\nimport {\n AllRoutesButton,\n BasicInfoOutput,\n basicInfoStyles,\n ContainerInfoOutput,\n Content,\n FrameIcon,\n HorizontalSeparator,\n Line,\n QuoteContainer,\n stepsDetailsStyles,\n SummaryContainer,\n summaryHeaderStyles,\n summaryStyles,\n TagContainer,\n} from './Quote.styles';\nimport { QuoteCostDetails } from './QuoteCostDetails';\nimport { QuoteSummary } from './QuoteSummary';\nimport { QuoteTrigger } from './QuoteTrigger';\n\nexport function Quote(props: QuoteProps) {\n const {\n quote,\n input,\n output,\n error,\n warning,\n type,\n selected = false,\n tagHidden = true,\n showModalFee = true,\n onClickAllRoutes,\n fullExpandedMode = false,\n container: propContainer,\n } = props;\n const blockchains = useAppStore().blockchains();\n const { findToken } = useAppStore();\n const swappers = useAppStore().swappers();\n const { customSlippage, slippage } = useAppStore();\n const userSlippage = customSlippage || slippage;\n const [expanded, setExpanded] = useState(props.expanded);\n const quoteRef = useRef<HTMLButtonElement | null>(null);\n const roundedInput = numberToString(\n input.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n );\n const roundedOutput = numberToString(\n output.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n );\n const roundedOutputUsdValue = output.usdValue\n ? numberToString(\n output.usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )\n : '';\n const priceImpact = getPriceImpact(input.usdValue, output.usdValue ?? null);\n const percentageChange = numberToString(\n priceImpact,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n );\n const priceImpactWarningLevel = getPriceImpactLevel(priceImpact ?? 0);\n\n const getQuoteSteps = (\n swaps: SwapResult[],\n internalSwap?: boolean\n ): Step[] => {\n return swaps.map((swap, index) => {\n let stepState: 'error' | 'warning' | undefined = undefined;\n const hasBridgeLimitError =\n error?.type === QuoteErrorType.BRIDGE_LIMIT &&\n error.swap.swapperId === swap.swapperId;\n\n const hasSlippageError =\n error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE &&\n error.recommendedSlippages?.has(index);\n\n const hasSlippageWarning =\n warning?.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE &&\n warning.recommendedSlippages?.has(index);\n\n const stepHasError = hasBridgeLimitError || hasSlippageError;\n const stepHasWarning = hasSlippageWarning;\n\n if (stepHasError) {\n stepState = 'error';\n } else if (stepHasWarning) {\n stepState = 'warning';\n }\n\n let alertTitle = stepHasError\n ? i18n.t('Slippage Error')\n : i18n.t('Slippage Warning');\n\n if (hasBridgeLimitError) {\n alertTitle = i18n.t('Bridge Limit Error');\n }\n\n return {\n swapper: {\n displayName: getSwapperDisplayName(swap.swapperId, swappers) ?? '',\n image: swap.swapperLogo,\n },\n from: {\n token: { displayName: swap.from.symbol, image: swap.from.logo },\n chain: {\n displayName:\n getBlockchainShortNameFor(swap.from.blockchain, blockchains) ??\n '',\n image: swap.from.blockchainLogo,\n },\n price: {\n value:\n index === 0 && !internalSwap\n ? numberToString(\n input.value,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n : numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n (swap.from.usdPrice ?? 0) * parseFloat(swap.fromAmount),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: index === 0 ? input.value : swap.fromAmount,\n realUsdValue: new BigNumber(swap.from.usdPrice ?? 0)\n .multipliedBy(swap.fromAmount)\n .toString(),\n },\n },\n to: {\n token: { displayName: swap.to.symbol, image: swap.to.logo },\n chain: {\n displayName:\n getBlockchainShortNameFor(swap.to.blockchain, blockchains) || '',\n image: swap.to.blockchainLogo,\n },\n price: {\n value: numberToString(\n swap.toAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: numberToString(\n (swap.to.usdPrice ?? 0) * parseFloat(swap.toAmount),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: swap.toAmount,\n realUsdValue: new BigNumber(swap.to.usdPrice ?? 0)\n .multipliedBy(swap.toAmount)\n .toString(),\n },\n },\n state: stepState,\n alerts:\n stepHasError || stepHasWarning ? (\n <FooterStepAlarm dense={fullExpandedMode}>\n <Alert\n variant=\"alarm\"\n type={stepHasError ? 'error' : 'warning'}\n title={alertTitle}\n footer={\n <FooterAlert>\n {hasBridgeLimitError && (\n <div>\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {error.fromAmountRangeError}\n </Typography>\n <Divider direction=\"vertical\" size={2} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Yours: {amount} {symbol}',\n values: {\n amount: numberToString(\n swap.fromAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n symbol: swap?.from.symbol,\n },\n })}\n </Typography>\n </div>\n )}\n {(hasSlippageError || hasSlippageWarning) &&\n !hasBridgeLimitError && (\n <div>\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Minimum required slippage: {minRequiredSlippage}',\n values: {\n ...(error?.type ===\n QuoteErrorType.INSUFFICIENT_SLIPPAGE && {\n minRequiredSlippage:\n error.recommendedSlippages?.get(index),\n }),\n ...(warning?.type ===\n QuoteWarningType.INSUFFICIENT_SLIPPAGE && {\n minRequiredSlippage:\n warning.recommendedSlippages?.get(index),\n }),\n },\n })}\n </Typography>\n <Divider direction=\"vertical\" size={2} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Yours: {userSlippage}',\n values: {\n userSlippage,\n },\n })}\n </Typography>\n </div>\n )}\n </FooterAlert>\n }\n />\n </FooterStepAlarm>\n ) : undefined,\n time: roundedSecondsToString(swap.estimatedTimeInSeconds),\n fee: numberToString(\n getUsdFeeOfStep(swap, findToken),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n ),\n internalSwaps: swap.internalSwaps\n ? getQuoteSteps(swap.internalSwaps)\n : undefined,\n };\n });\n };\n const steps = getQuoteSteps(quote?.swaps ?? []);\n\n const numberOfSteps = steps.length;\n const container = propContainer || getContainer();\n const sortedQuoteTags = sortTags(props.quote.tags || []);\n const showAllRoutesButton = !!onClickAllRoutes;\n const totalTime = roundedSecondsToString(totalArrivalTime(quote?.swaps));\n const totalFee = getTotalFeeInUsd(quote?.swaps ?? [], findToken);\n const fee = numberToString(\n totalFee,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n );\n\n const feeWarning = totalFee.gte(new BigNumber(GAS_FEE_MAX));\n\n return fullExpandedMode ? (\n <FullExpandedQuote\n selected={selected}\n fee={fee}\n time={totalTime}\n tooltipContainer={getExpanded()}\n steps={steps}\n tags={sortedQuoteTags}\n feeWarning={feeWarning}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n outputPrice={{\n value: roundedOutput,\n usdValue: roundedOutputUsdValue,\n realValue: output.value,\n realUsdValue: output.usdValue,\n }}\n />\n ) : (\n <SummaryContainer\n selected={selected}\n listItem={type === 'list-item'}\n basic={type === 'basic'}>\n <div className={summaryStyles()}>\n {!tagHidden && sortedQuoteTags.length ? (\n <>\n <TagContainer>\n {sortedQuoteTags.map((tag, index) => {\n const key = `${tag.value}_${index}`;\n return (\n <React.Fragment key={key}>\n <QuoteTag label={tag.label} value={tag.value} />\n <Divider size={4} direction=\"horizontal\" />\n </React.Fragment>\n );\n })}\n </TagContainer>\n <Line />\n {!showAllRoutesButton && <Divider size={4} />}\n </>\n ) : null}\n <div id=\"portal-root\" className={summaryHeaderStyles()}>\n <QuoteCostDetails\n quote={quote}\n time={totalTime}\n fee={fee}\n feeWarning={feeWarning}\n showModalFee={showModalFee}\n steps={numberOfSteps}\n />\n\n {showAllRoutesButton && (\n <AllRoutesButton\n onClick={(e) => {\n e.stopPropagation();\n onClickAllRoutes();\n }}\n size=\"xxsmall\"\n type=\"secondary\"\n variant=\"default\"\n css={{\n paddingLeft: '$10',\n paddingRight: '$10',\n paddingTop: '$5',\n paddingBottom: '$5',\n }}>\n <Typography\n color=\"secondary\"\n variant=\"body\"\n size=\"xsmall\"\n className=\"allRoutesLabel\">\n {i18n.t('See All Routes')}\n </Typography>\n </AllRoutesButton>\n )}\n </div>\n {type === 'basic' && (\n <div className={basicInfoStyles()}>\n <FrameIcon>\n <InfoIcon size={12} color=\"gray\" />\n </FrameIcon>\n <ContainerInfoOutput>\n <BasicInfoOutput size=\"small\" variant=\"body\">\n {`${roundedInput} ${steps[0].from.token.displayName} = `}\n </BasicInfoOutput>\n <NumericTooltip\n content={output.value}\n container={container}\n open={!output.value ? false : undefined}>\n <BasicInfoOutput size=\"small\" variant=\"body\">\n &nbsp;\n {`${roundedOutput} ${\n steps[steps.length - 1].to.token.displayName\n }`}\n </BasicInfoOutput>\n </NumericTooltip>\n </ContainerInfoOutput>\n <NumericTooltip content={output.usdValue} container={container}>\n <Divider size={2} direction=\"horizontal\" />\n <Typography color=\"$neutral600\" size=\"xsmall\" variant=\"body\">\n {`($${roundedOutputUsdValue})`}\n </Typography>\n </NumericTooltip>\n </div>\n )}\n {type === 'list-item' && (\n <TokenAmount\n tooltipContainer={container}\n type=\"output\"\n direction=\"vertical\"\n price={{\n value: roundedOutput,\n usdValue: roundedOutputUsdValue,\n realValue: output.value,\n realUsdValue: output.usdValue,\n }}\n token={{\n displayName: steps[numberOfSteps - 1].to.token.displayName,\n image: steps[numberOfSteps - 1].to.token.image,\n }}\n chain={{ image: steps[numberOfSteps - 1].to.chain.image }}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n />\n )}\n {type === 'swap-preview' && (\n <>\n <QuoteSummary\n from={steps[0].from}\n to={steps[numberOfSteps - 1].to}\n percentageChange={percentageChange}\n warningLevel={priceImpactWarningLevel}\n />\n <Divider size={4} />\n </>\n )}\n </div>\n <QuoteContainer\n selected={selected}\n listItem={type === 'list-item'}\n open={expanded}\n className=\"quote_container\"\n onOpenChange={setExpanded}>\n <QuoteTrigger\n type={type}\n quoteRef={quoteRef}\n selected={selected}\n setExpanded={setExpanded}\n container={container}\n expanded={expanded}\n steps={steps}\n />\n <Content open={expanded}>\n <HorizontalSeparator />\n <div className={stepsDetailsStyles()}>\n {steps.map((step, index) => {\n const key = `item-${index}`;\n return (\n <StepDetails\n type=\"quote-details\"\n key={key}\n tooltipContainer={container}\n step={step}\n hasSeparator={index !== steps.length - 1}\n state={step.state}\n />\n );\n })}\n </div>\n </Content>\n </QuoteContainer>\n </SummaryContainer>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const QuoteContainer = styled('div', {\n width: '100%',\n '& .position-top__skeleton': {\n paddingTop: '$10',\n },\n});\nexport const FooterStepAlarm = styled('div', {\n paddingBottom: '$15',\n variants: {\n dense: {\n true: {\n paddingBottom: 0,\n },\n },\n },\n});\n\nexport const FooterAlert = styled('div', {\n width: '100%',\n display: 'flex',\n});\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport {\n Button,\n css,\n darkTheme,\n Image,\n styled,\n Typography,\n} from '@rango-dev/ui';\n\nimport { CollapsibleContent } from '../CustomCollapsible/CustomCollapsible.styles';\n\nexport const EXPANDABLE_QUOTE_TRANSITION_DURATION = 300;\n\nexport const QuoteContainer = styled(Collapsible.Root, {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n overflowX: 'auto',\n overflowY: 'hidden',\n width: '100%',\n borderRadius: '$xm',\n variants: {\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n listItem: {\n true: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$secondary200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n },\n ],\n});\n\nexport const stepsDetailsStyles = css({\n padding: '$10 $15',\n});\nexport const AllRoutesButton = styled(Button, {\n backgroundColor: 'transparent',\n border: '1px solid $secondary550',\n [`.${darkTheme} &`]: {\n border: '1px solid $secondary',\n },\n transition: 'background-color 0.3s ease',\n '&:hover': {\n backgroundColor: '$secondary550',\n [`.${darkTheme} &`]: {\n backgroundColor: '$secondary',\n },\n '.allRoutesLabel': {\n $$color: '$colors$background',\n [`.${darkTheme} &`]: {\n $$color: '$colors$foreground',\n },\n color: '$$color',\n transition: 'color 0.3s ease',\n },\n },\n});\nexport const SummaryContainer = styled('div', {\n borderRadius: '$xm',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n justifyContent: 'space-between',\n color: '$foreground',\n boxSizing: 'border-box',\n position: 'relative',\n variants: {\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n },\n },\n basic: { true: { borderTopRightRadius: '0', borderTopLeftRadius: '0' } },\n listItem: {\n true: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n '&:hover': {\n '& .quote_container': {\n '& button': {\n backgroundColor: '$neutral500',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral200',\n },\n },\n backgroundColor: '$neutral500',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral200',\n },\n },\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n },\n cursor: 'pointer',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: true,\n selected: true,\n css: {\n outline: '1px solid $secondary',\n },\n },\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$secondary100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary550',\n },\n backgroundColor: '$$color',\n '&:hover': {\n backgroundColor: '$$color',\n },\n },\n },\n {\n listItem: true,\n selected: false,\n css: {\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n },\n },\n },\n ],\n});\n\nexport const summaryStyles = css({\n width: '100%',\n padding: '$15 $15 $10 $15',\n});\n\nexport const summaryHeaderStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n paddingBottom: '$10',\n position: 'relative',\n});\n\nexport const rowStyles = css({\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n '.blockchainImage': {\n marginLeft: '-$8',\n },\n});\nexport const basicInfoStyles = css({\n display: 'flex',\n alignItems: 'center',\n '.usd-value': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Trigger = styled(Collapsible.Trigger, {\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n height: '$36',\n padding: '$10 $15',\n boxSizing: 'border-box',\n cursor: 'pointer',\n border: 'none',\n outline: 'none',\n backgroundColor: 'transparent',\n variants: {\n error: {\n true: {\n [`& ${Image}`]: {\n border: '1px $warning500 solid',\n borderRadius: '100%',\n },\n },\n false: {\n [`& ${Image}`]: {\n border: '1px transparent solid',\n borderRadius: '100%',\n },\n },\n },\n selected: {\n true: {},\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n listItem: {\n true: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: false,\n selected: true,\n css: {\n $$color: '$colors$secondary200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n },\n ],\n '.blockchains_section': {\n display: 'none',\n },\n '@xs': {\n '.blockchains_section': {\n display: 'block',\n },\n },\n});\n\nexport const ImageContainer = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n border: '1.5px transparent solid',\n img: {\n borderRadius: '100%',\n },\n variants: {\n state: {\n error: {\n borderColor: '$error500',\n },\n warning: { borderColor: '$warning500' },\n },\n },\n});\n\nexport const Content = styled(CollapsibleContent, {\n width: '100%',\n background: 'inherit',\n});\n\nexport const IconContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '$2',\n transition: `all ${EXPANDABLE_QUOTE_TRANSITION_DURATION}ms ease`,\n variants: {\n orientation: {\n down: {\n transform: 'rotate(0)',\n },\n up: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n\nexport const Separator = styled('div', {\n height: '$12',\n marginLeft: '$10',\n marginRight: '$10',\n borderLeft: '1px solid $foreground',\n});\n\nexport const HorizontalSeparator = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n margin: '0 $15',\n borderTop: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n});\n\nexport const FrameIcon = styled('div', {\n width: '$16',\n height: '$16',\n justifyContent: 'center',\n alignItems: 'center',\n display: 'flex',\n});\n\nexport const BasicInfoOutput = styled(Typography, {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n letterSpacing: 0.4,\n});\n\nexport const ContainerInfoOutput = styled('div', {\n display: 'flex',\n flexWrap: 'wrap',\n});\n\nexport const MoreStep = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n backgroundColor: '$background',\n cursor: 'default',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n border: '1.5px transparent solid',\n variants: {\n state: {\n error: {\n borderColor: '$error500',\n },\n warning: { borderColor: '$warning500' },\n },\n },\n});\n\nexport const TagContainer = styled('div', {\n display: 'flex',\n});\n\nexport const Line = styled('div', {\n width: '100%',\n borderTopWidth: '1px',\n borderTopStyle: 'solid',\n borderTopColor: '$neutral',\n margin: '$5 0',\n [`.${darkTheme} &`]: {\n borderTopColor: '$neutral800',\n },\n});\n", "import type { QuoteCostDetailsProps } from './Quote.types';\nimport type { NameOfFees } from '../../constants/quote';\nimport type BigNumber from 'bignumber.js';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n CloseIcon,\n Divider,\n IconButton,\n NumericTooltip,\n QuoteCost,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { getFeeLabel } from '../../constants/quote';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\nimport { getFeesGroup, getTotalFeesInUsd, getUsdFee } from '../../utils/swap';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\nimport { CustomCollapsible } from '../CustomCollapsible/CustomCollapsible';\nimport { ExpandedIcon } from '../CustomCollapsible/CustomCollapsible.styles';\n\nimport {\n FeeSection,\n Line,\n ModalContainer,\n ModalHeader,\n trigger,\n} from './QuoteCostDetails.styles';\n\nconst NonPayableFee = (props: { fee: BigNumber; label: string }) => {\n return !props.fee.isZero() ? (\n <FeeSection>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral600\">\n {props.label}\n </Typography>\n <Typography variant=\"label\" size=\"medium\">\n $\n {numberToString(\n props.fee,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n </Typography>\n </FeeSection>\n ) : null;\n};\n\nexport function QuoteCostDetails(props: QuoteCostDetailsProps) {\n const [open, setOpen] = useState<boolean>(false);\n const [openCollapse, setOpenCollapse] = useState<boolean>(false);\n const { steps, quote, fee, time, feeWarning, showModalFee } = props;\n const swaps = quote?.swaps ?? [];\n const container = getContainer();\n\n const feesGroup = getFeesGroup(swaps);\n\n return (\n <>\n <QuoteCost\n onClickFee={\n showModalFee\n ? (e) => {\n e.stopPropagation();\n setOpen(!open);\n }\n : undefined\n }\n fee={fee}\n feeWarning={feeWarning}\n time={time}\n steps={steps}\n tooltipGas={showModalFee ? i18n.t('View more info') : undefined}\n tooltipContainer={container}\n />\n\n <WatermarkedModal\n container={container}\n open={open}\n header={\n <ModalHeader>\n <Typography variant=\"title\" size=\"medium\">\n {i18n.t('Gas & Fee Explanation')}\n </Typography>\n\n <IconButton onClick={() => setOpen(false)} variant=\"ghost\">\n <CloseIcon color=\"gray\" size={14} />\n </IconButton>\n </ModalHeader>\n }\n onClose={() => {\n setOpen(false);\n }}>\n <ModalContainer>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Details')}\n </Typography>\n <Divider size={10} />\n {Object.entries(feesGroup.payable).flatMap(\n ([payableFeesKey, feeArray]) =>\n feeArray.map((fee, index) => {\n const key = `payable-fee-${index}`;\n const usdValue = getUsdFee(fee);\n return (\n <FeeSection key={key}>\n <Typography\n variant=\"label\"\n size=\"medium\"\n color=\"neutral600\">\n {getFeeLabel(payableFeesKey as NameOfFees, i18n.t)}\n </Typography>\n <NumericTooltip content={fee.amount} container={container}>\n <Typography variant=\"label\" size=\"medium\">\n {numberToString(\n fee.amount,\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}{' '}\n {fee.asset.symbol} ($\n {numberToString(\n usdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n )\n </Typography>\n </NumericTooltip>\n </FeeSection>\n );\n })\n )}\n\n <FeeSection className=\"total_payable_fee\">\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Total Payable Fee')}\n </Typography>\n <Typography variant=\"label\" size=\"medium\">\n $\n {numberToString(\n fee,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n )}\n </Typography>\n </FeeSection>\n <Line />\n {Object.keys(feesGroup.nonePayable).length && (\n <CustomCollapsible\n triggerAnchor=\"bottom\"\n onClickTrigger={() => setOpenCollapse((prev) => !prev)}\n trigger={\n <div className={trigger()}>\n <Typography size=\"small\" variant=\"body\" color=\"neutral700\">\n {openCollapse\n ? i18n.t('Hide non-payable fees')\n : i18n.t('Show non-payable fees')}\n </Typography>\n <Divider size={4} direction=\"horizontal\" />\n <ExpandedIcon orientation={openCollapse ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"gray\" />\n </ExpandedIcon>\n </div>\n }\n open={openCollapse}>\n <Typography size=\"small\" variant=\"title\">\n {i18n.t('Description')}\n </Typography>\n <Divider size={4} />\n <Typography size=\"small\" variant=\"body\" color=\"neutral700\">\n {i18n.t(`The following fees are considered in the transaction output and\n you won\u2019t need to pay extra gas for them.`)}\n </Typography>\n <Divider size={10} />\n {Object.entries(feesGroup.nonePayable).map(\n ([nonPayableFeesKey, fees], index) => {\n const totalFeeInUsd = getTotalFeesInUsd(fees);\n const label = getFeeLabel(\n nonPayableFeesKey as NameOfFees,\n i18n.t\n );\n const key = `non-payable-fee-${index}`;\n return (\n <NonPayableFee\n key={key}\n fee={totalFeeInUsd}\n label={label}\n />\n );\n }\n )}\n\n <Line />\n </CustomCollapsible>\n )}\n </ModalContainer>\n </WatermarkedModal>\n </>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const FeeSection = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$5 0',\n '&.total_payable_fee': {\n padding: '$12 0',\n },\n});\n\nexport const Line = styled('div', {\n width: '100%',\n borderTop: '1px solid $neutral300',\n margin: '$10 0',\n});\n\nexport const ModalContainer = styled('div', {\n padding: '$20 0',\n display: 'flex',\n flexDirection: 'column',\n '& .collapsible_trigger': {\n display: 'flex',\n alignItems: 'center',\n },\n});\n\nexport const ModalHeader = styled('div', {\n padding: '$20 $20 $10',\n textAlign: 'center',\n position: 'relative',\n '._icon-button': {\n position: 'absolute',\n zIndex: 10,\n top: '$16',\n right: '$16',\n },\n});\nexport const trigger = css({\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n padding: '$5',\n '&:hover': {\n '& ._typography, & svg': {\n color: '$secondary',\n },\n },\n});\n", "import type { PriceImpactWarningLevel, Step } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\nimport { TokenAmount } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport { Container, separatorStyles } from './QuoteSummary.styles';\n\ntype PropTypes = {\n from: Step['from'];\n to: Step['to'];\n percentageChange?: string | null;\n warningLevel: PriceImpactWarningLevel;\n};\n\nexport function QuoteSummary(props: PropTypes) {\n const { from, to, percentageChange, warningLevel } = props;\n\n return (\n <Container>\n <TokenAmount\n direction=\"horizontal\"\n label={i18n.t('Swap input')}\n type=\"input\"\n tooltipContainer={getContainer()}\n price={{\n value: from.price.value,\n usdValue: from.price.usdValue,\n realValue: from.price.realValue,\n realUsdValue: from.price.realUsdValue,\n }}\n token={{\n displayName: from.token.displayName,\n image: from.token.image,\n }}\n chain={{ image: from.chain.image }}\n />\n <div className={separatorStyles()} />\n <TokenAmount\n direction=\"horizontal\"\n tooltipContainer={getContainer()}\n label={i18n.t('Estimated output')}\n type=\"output\"\n price={{\n value: to.price.value,\n usdValue: to.price.usdValue,\n realValue: to.price.realValue,\n realUsdValue: to.price.realUsdValue,\n }}\n token={{\n displayName: to.token.displayName,\n image: to.token.image,\n }}\n chain={{ image: to.chain.image }}\n percentageChange={percentageChange}\n warningLevel={warningLevel}\n />\n </Container>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n});\n\nexport const separatorStyles = css({\n height: '14px',\n marginLeft: '14px',\n position: 'absolute',\n borderLeft: '1px solid $foreground',\n top: '42%',\n});\n", "import type { QuoteTriggerImagesProps, QuoteTriggerProps } from './Quote.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n Divider,\n Image,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport useScreenDetect from '../../hooks/useScreenDetect';\nimport { getContainer } from '../../utils/common';\nimport { getUniqueBlockchains } from '../../utils/quote';\n\nimport {\n IconContainer,\n ImageContainer,\n MoreStep,\n rowStyles,\n Trigger,\n} from './Quote.styles';\n\nconst MAX_STEPS = 4;\nconst MAX_BLOCKCHAINS = 6;\n\nconst ImageComponent = (props: QuoteTriggerImagesProps) => {\n const { content, src, className, open, state, container } = props;\n const tooltipContainer = container || getContainer();\n return (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n sideOffset={4}\n open={open}\n content={content}>\n <ImageContainer className={className} state={state}>\n <Image src={src} size={16} />\n </ImageContainer>\n </Tooltip>\n );\n};\n\nexport function QuoteTrigger(props: QuoteTriggerProps) {\n const { quoteRef, selected, setExpanded, steps, expanded, type, container } =\n props;\n const tooltipContainer = container || getContainer();\n const numberOfSteps = steps.length;\n const blockchains = getUniqueBlockchains(steps);\n const { isTablet, isMobile } = useScreenDetect();\n\n return (\n <Trigger\n listItem={type === 'list-item'}\n ref={(ref) => (quoteRef.current = ref)}\n selected={selected}\n onClick={(e) => {\n e.stopPropagation();\n setExpanded((prevState) => !prevState);\n }}>\n <div className={rowStyles()}>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('Via:')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n {steps.map((step, index) => {\n const key = `item-${index}`;\n const arrow = (\n <IconContainer>\n <ChevronRightIcon size={12} color=\"black\" />\n </IconContainer>\n );\n\n return isMobile || isTablet ? (\n <React.Fragment key={key}>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n container={container}\n />\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n ) : (\n <React.Fragment key={key}>\n {numberOfSteps <= MAX_STEPS ||\n (numberOfSteps > MAX_STEPS && index < MAX_STEPS - 1) ? (\n <>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n container={container}\n />\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </>\n ) : (\n index === MAX_STEPS - 1 && (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n align=\"end\"\n sideOffset={4}\n content={\n <div className={rowStyles()}>\n {arrow}\n {steps.map((step, i) => {\n const key = `image-${i}`;\n return (\n i >= index && (\n <React.Fragment key={key}>\n <ImageComponent\n content={step.swapper.displayName}\n src={step.swapper.image}\n state={step.state}\n open={false}\n />\n {i !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n )\n );\n })}\n </div>\n }>\n <MoreStep\n state={\n steps.find(\n (step, i) =>\n i >= index &&\n (step.state === 'error' || step.state === 'warning')\n )?.state\n }>\n <Typography size=\"xsmall\" variant=\"body\">\n +{numberOfSteps - index}\n </Typography>\n </MoreStep>\n </Tooltip>\n )\n )}\n </React.Fragment>\n );\n })}\n </div>\n <div className={rowStyles()}>\n <div className=\"blockchains_section\">\n <div className={rowStyles()}>\n <Typography variant=\"body\" size=\"xsmall\">\n {i18n.t('Chains:')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n {blockchains.map((blockchain, index) => (\n <React.Fragment key={blockchain.displayName}>\n {blockchains.length <= MAX_BLOCKCHAINS ||\n (blockchains.length > MAX_BLOCKCHAINS &&\n index < MAX_BLOCKCHAINS - 1) ? (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n content={blockchain.displayName}\n sideOffset={4}>\n <ImageComponent\n content={''}\n src={blockchain.image}\n open={false}\n className={index !== 0 ? 'blockchainImage' : ''}\n />\n </Tooltip>\n ) : (\n index === MAX_BLOCKCHAINS - 1 && (\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n align=\"end\"\n sideOffset={4}\n content={\n <div className={rowStyles()}>\n {blockchains.map(\n (chain, i) =>\n i >= index && (\n <ImageComponent\n key={chain.displayName}\n content={''}\n src={chain.image}\n open={false}\n className={i > index ? 'blockchainImage' : ''}\n container={container}\n />\n )\n )}\n </div>\n }>\n <MoreStep className={'blockchainImage'}>\n <Typography size=\"xsmall\" variant=\"body\">\n +{blockchains.length - index}\n </Typography>\n </MoreStep>\n </Tooltip>\n )\n )}\n </React.Fragment>\n ))}\n\n <Divider direction=\"horizontal\" size={32} />\n </div>\n </div>\n\n <IconContainer orientation={expanded ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"black\" />\n </IconContainer>\n </div>\n </Trigger>\n );\n}\n", "import { useLayoutEffect, useState } from 'react';\n\n/*\n * mobile: screen <= 480\n * tablet: screen > 480 and screen <= 768\n * notebook: screen > 768 & screen <= 1024\n * large: screen > 1024 & screen <= 1200\n * extra large: screen > 1200\n */\n\nconst MIN_TABLET_WIDTH = 480;\nconst MIN_NOTEBOOK_WIDTH = 768;\nconst MIN_LARGE_SCREEN_WIDTH = 1024;\nconst MIN_EXTRA_LARGE_SCREEN_WIDTH = 1200;\n\nconst useScreenDetect = () => {\n const [isMobile, setIsMobile] = useState(false);\n const [isTablet, setIsTablet] = useState(false);\n const [isNotebook, setIsNotebook] = useState(false);\n const [isLargeScreen, setIsLargeScreen] = useState(false);\n const [isExtraLargeScreen, setIsExtraLargeScreen] = useState(false);\n\n const handleResize = () => {\n setIsMobile(window.innerWidth <= MIN_TABLET_WIDTH);\n setIsTablet(\n window.innerWidth > MIN_TABLET_WIDTH &&\n window.innerWidth <= MIN_NOTEBOOK_WIDTH\n );\n setIsNotebook(\n window.innerWidth > MIN_NOTEBOOK_WIDTH &&\n window.innerWidth <= MIN_LARGE_SCREEN_WIDTH\n );\n setIsLargeScreen(\n window.innerWidth > MIN_LARGE_SCREEN_WIDTH &&\n window.innerWidth <= MIN_EXTRA_LARGE_SCREEN_WIDTH\n );\n setIsExtraLargeScreen(window.innerWidth > MIN_EXTRA_LARGE_SCREEN_WIDTH);\n };\n\n useLayoutEffect(() => {\n handleResize(); // Initial check\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return { isMobile, isTablet, isNotebook, isLargeScreen, isExtraLargeScreen };\n};\n\nexport default useScreenDetect;\n", "import type { PropTypes } from './QuoteSkeleton.types';\n\nimport { Divider, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Chains, Container, Steps } from './QuoteSkeleton.styles';\nimport { QuoteSummarySkeleton } from './QuoteSummarySkeleton';\nimport { StepSkeleton } from './StepSkeleton';\n\nexport function QuoteSkeleton(props: PropTypes) {\n const { type, expanded, tagHidden = false } = props;\n\n return (\n <Container expanded={expanded} rounded={type !== 'basic'}>\n <QuoteSummarySkeleton type={type} tagHidden={tagHidden} />\n <Chains>\n <Skeleton height={15} variant=\"rounded\" />\n </Chains>\n\n {expanded && (\n <Steps>\n <Divider size={24} />\n <StepSkeleton />\n <StepSkeleton />\n <StepSkeleton separator={false} />\n </Steps>\n )}\n </Container>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n borderBottomLeftRadius: '$xm',\n borderBottomRightRadius: '$xm',\n padding: '$15',\n variants: {\n rounded: {\n true: {\n borderRadius: '$xm',\n },\n },\n expanded: {\n true: {\n paddingBottom: '3px',\n },\n false: {\n paddingBottom: '$12',\n },\n },\n },\n});\n\nexport const Chains = styled('div', {\n paddingTop: '$2',\n});\n\nexport const Steps = styled('div', {\n paddingLeft: '$8',\n});\n\nexport const StepSeparator = styled('div', {\n borderLeft: '1px dashed $foreground',\n minHeight: ' 0',\n margin: '0px 11.5px',\n alignSelf: 'stretch',\n variants: {\n hideSeparator: {\n true: {\n minHeight: 'unset',\n height: '0',\n },\n },\n },\n});\n", "import type { PropTypes } from './QuoteSummarySkeleton.types';\n\nimport { ChainToken, Divider, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Line } from '../Quote/Quote.styles';\n\nimport {\n BasicSummary,\n FlexContent,\n Output,\n OutputTokenInfo,\n QuoteSummary,\n QuoteSummarySeparator,\n RowStyle,\n SwapPreview,\n TokenAmount,\n TokenAmountLabel,\n} from './QuoteSummarySkeleton.styles';\n\nexport function QuoteSummarySkeleton(props: PropTypes) {\n const { type, tagHidden = true } = props;\n const quotePreview = (\n <QuoteSummary>\n <TokenAmount>\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider size={8} direction=\"horizontal\" />\n <TokenAmountLabel>\n <Skeleton height={10} width={60} variant=\"rounded\" />\n <Divider size={4} />\n <Skeleton height={15} variant=\"rounded\" />\n </TokenAmountLabel>\n </TokenAmount>\n <Skeleton height={12} width={64} variant=\"rounded\" />\n </QuoteSummary>\n );\n const showAllRoutesSkeleton = type === 'basic' && !tagHidden;\n\n return (\n <div>\n {!tagHidden && (\n <>\n <FlexContent>\n <Skeleton width={65} height={20} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={65} height={20} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={65} height={20} variant=\"rounded\" />\n </FlexContent>\n <Line />\n {!showAllRoutesSkeleton && <Divider size={4} />}\n </>\n )}\n <div className={RowStyle()}>\n <FlexContent>\n <Skeleton width={60} height={10} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={60} height={10} variant=\"rounded\" />\n <Divider size={4} direction=\"horizontal\" />\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </FlexContent>\n {showAllRoutesSkeleton && (\n <Skeleton width={85} height={24} variant=\"rounded\" />\n )}\n </div>\n\n {type === 'basic' && (\n <BasicSummary>\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </BasicSummary>\n )}\n {type === 'list-item' && (\n <Output>\n <OutputTokenInfo>\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton height={15} width={150} variant=\"rounded\" />\n </OutputTokenInfo>\n <Divider size={10} />\n <Skeleton height={10} width={184} variant=\"rounded\" />\n </Output>\n )}\n {type === 'swap-preview' && (\n <>\n <Divider size={4} />\n <SwapPreview>\n {quotePreview}\n <QuoteSummarySeparator />\n {quotePreview}\n </SwapPreview>\n <Divider size={12} />\n </>\n )}\n </div>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const FlexContent = styled('div', {\n display: 'flex',\n});\n\nexport const BasicSummary = styled('div', {\n padding: '$10 $0 $20',\n});\n\nexport const Output = styled('div', {\n padding: '14px $0 $20 $0',\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const OutputTokenInfo = styled('div', {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n});\n\nexport const QuoteSummary = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'end',\n});\n\nexport const QuoteSummarySeparator = styled('div', {\n height: '$24',\n marginLeft: '13px',\n borderLeft: '1px solid $neutral700',\n});\n\nexport const TokenAmount = styled('div', {\n width: '65%',\n display: 'flex',\n justifyContent: 'start',\n});\n\nexport const TokenAmountLabel = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n flexGrow: 1,\n maxWidth: '148px',\n});\n\nexport const SwapPreview = styled('div', { padding: '$15 $0 $15 $0' });\n\nexport const RowStyle = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n", "import type { PropTypes } from './StepSkeleton.types';\n\nimport { ChainToken, Divider, NextIcon, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { StepSeparator } from './QuoteSkeleton.styles';\nimport {\n StepContent,\n StepIconContainer,\n StepTitle,\n StepTokenInfo,\n StepTokens,\n} from './StepSkeleton.styles';\n\nexport function StepSkeleton(props: PropTypes) {\n const { separator = true } = props;\n return (\n <>\n <StepTitle>\n <Skeleton height={22} width={22} variant=\"circular\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </StepTitle>\n <StepContent>\n <StepSeparator hideSeparator={!separator} />\n <StepTokens extraSpace={separator}>\n <StepTokenInfo>\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} variant=\"rounded\" />\n </StepTokenInfo>\n <StepIconContainer>\n <NextIcon color=\"gray\" size={16} />\n </StepIconContainer>\n <StepTokenInfo>\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} variant=\"rounded\" />\n </StepTokenInfo>\n </StepTokens>\n </StepContent>\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const StepContent = styled('div', {\n display: 'flex',\n alignItems: 'start',\n});\n\nexport const StepTokens = styled('div', {\n flexGrow: 1,\n paddingTop: '$5',\n paddingBottom: '$10',\n display: 'flex',\n alignItems: 'center',\n variants: {\n extraSpace: {\n true: {\n paddingBottom: '$40',\n },\n },\n },\n});\n\nexport const StepTokenInfo = styled('div', {\n display: 'flex',\n alignItems: 'center',\n flexGrow: 1,\n});\n\nexport const StepIconContainer = styled('div', {\n margin: '$0 $2',\n padding: '$4',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const StepTitle = styled('div', {\n display: 'flex',\n alignItems: 'center',\n});\n", "import type { ConfirmSwap } from './useConfirmSwap.types';\nimport type { PendingSwapSettings, SelectedQuote } from '../../types';\nimport type { ConfirmRouteRequest } from 'rango-sdk';\n\nimport { calculatePendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { getWalletsForNewSwap } from '../../utils/swap';\nimport { useFetchConfirmQuote } from '../useFetchConfirmQuote';\n\nimport {\n generateWarnings,\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap.helpers';\n\nexport function useConfirmSwap(): ConfirmSwap {\n const {\n fromToken,\n toToken,\n inputAmount,\n setSelectedQuote,\n selectedQuote: initialQuote,\n customDestination: customDestinationFromStore,\n setQuoteWarningsConfirmed,\n resetAlerts,\n } = useQuoteStore();\n\n const { slippage, customSlippage } = useAppStore();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const { findToken } = useAppStore();\n\n const userSlippage = customSlippage || slippage;\n\n const { fetch: fetchQuote, cancelFetch, loading } = useFetchConfirmQuote();\n\n useEffect(() => cancelFetch, []);\n\n const fetch: ConfirmSwap['fetch'] = async (params) => {\n const selectedWallets = params.selectedWallets;\n const customDestination =\n params?.customDestination ?? customDestinationFromStore;\n\n if (!fromToken || !toToken || !inputAmount) {\n return {\n quote: null,\n swap: null,\n error: null,\n warnings: null,\n };\n }\n\n const wallets = selectedWallets.reduce(\n (acc: Record<string, string>, item) => {\n acc[item.chain] = item.address;\n return acc;\n },\n {}\n );\n const requestBody: ConfirmRouteRequest = {\n requestId: initialQuote?.requestId || '',\n selectedWallets: wallets,\n destination: customDestination || undefined,\n };\n\n try {\n return await fetchQuote(requestBody, true).then((response) => {\n const { result } = response;\n\n throwErrorIfResponseIsNotValid({\n diagnosisMessages: result.diagnosisMessages,\n requestId: result.requestId,\n swaps: result.result?.swaps,\n });\n\n const currentQuote: SelectedQuote = {\n outputAmount: result.result?.outputAmount,\n requestId: result.requestId,\n resultType: result.result?.resultType,\n swaps: result.result?.swaps || [],\n validationStatus: result.validationStatus,\n requestAmount: result.requestAmount,\n };\n setSelectedQuote(currentQuote);\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n\n const confirmSwapWarnings = generateWarnings(\n initialQuote ?? undefined,\n currentQuote,\n {\n fromToken,\n toToken,\n meta: { blockchains },\n findToken,\n selectedWallets,\n userSlippage,\n }\n );\n if (confirmSwapWarnings.quoteUpdate) {\n setQuoteWarningsConfirmed(false);\n }\n resetAlerts();\n\n const proceedAnyway = !!confirmSwapWarnings.balance;\n\n const swap = calculatePendingSwap(\n inputAmount.toString(),\n result,\n getWalletsForNewSwap(selectedWallets),\n swapSettings,\n proceedAnyway ? false : true,\n { blockchains, tokens }\n );\n\n return {\n quote: currentQuote,\n swap,\n error: null,\n warnings: confirmSwapWarnings,\n };\n });\n } catch (error: any) {\n const confirmSwapResult = handleQuoteErrors(error);\n return confirmSwapResult;\n }\n };\n\n return {\n loading,\n fetch,\n cancelFetch,\n };\n}\n", "import type { RequestOptions } from 'rango-sdk';\n\nimport { useRef, useState } from 'react';\n\ntype UseFetchOptions<TRequest, TResponse> = {\n request: (\n requestBody: TRequest,\n options?: RequestOptions\n ) => Promise<TResponse>;\n};\nexport type UseFetchResult<TRequest, TResponse> = {\n fetch: (requestBody: TRequest, retryOnFail?: boolean) => Promise<TResponse>;\n cancelFetch: () => void;\n loading: boolean;\n};\n\nconst RETRY_DELAY = 2_000;\n\nexport function useFetch<TRequest, TResponse>({\n request,\n}: UseFetchOptions<TRequest, TResponse>): UseFetchResult<TRequest, TResponse> {\n const [loading, setLoading] = useState(false);\n const abortController = useRef<AbortController | null>(null);\n\n const cancelFetch = () => abortController.current?.abort();\n\n const retryFetch = async (requestBody: TRequest) => {\n await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY));\n return await fetch(requestBody, false);\n };\n\n const fetch: UseFetchResult<TRequest, TResponse>['fetch'] = async (\n requestBody,\n retryOnFail = false\n ) => {\n cancelFetch();\n abortController.current = new AbortController();\n\n setLoading(true);\n try {\n const res = await request(requestBody, {\n signal: abortController.current.signal,\n });\n\n abortController.current = null;\n return res;\n // eslint-disable-next-line no-useless-catch\n } catch (error) {\n if (retryOnFail) {\n return await retryFetch(requestBody);\n }\n throw error;\n } finally {\n setLoading(false);\n }\n };\n\n return { fetch, loading, cancelFetch };\n}\n", "import type { UseFetchResult } from './useFetch';\nimport type { ConfirmRouteRequest, ConfirmRouteResponse } from 'rango-sdk';\n\nimport { httpService } from '../services/httpService';\n\nimport { useFetch } from './useFetch';\n\nexport function useFetchConfirmQuote(): UseFetchResult<\n ConfirmRouteRequest,\n ConfirmRouteResponse\n> {\n const { fetch, loading, cancelFetch } = useFetch<\n ConfirmRouteRequest,\n ConfirmRouteResponse\n >({\n request: async (requestBody, options) =>\n await httpService().confirmRouteRequest(requestBody, options),\n });\n\n return { fetch, loading, cancelFetch };\n}\n", "import type { ConfirmSwapFetchResult } from './useConfirmSwap.types';\nimport type { FindToken } from '../../store/slices/data';\nimport type {\n ConfirmSwapWarnings,\n QuoteErrorResponse,\n QuoteResponse,\n SelectedQuote,\n Wallet,\n} from '../../types';\nimport type { BlockchainMeta, SwapResult, Token } from 'rango-sdk';\n\nimport { errorMessages } from '../../constants/errors';\nimport { QuoteErrorType, QuoteUpdateType } from '../../types';\nimport { numberToString } from '../../utils/numbers';\nimport {\n generateQuoteWarnings,\n getPriceImpact,\n isNumberOfSwapsChanged,\n isQuoteChanged,\n isQuoteInternalCoinsUpdated,\n isQuoteSwappersUpdated,\n} from '../../utils/quote';\nimport {\n checkSlippageErrors,\n generateBalanceWarnings,\n getLimitErrorMessage,\n getMinRequiredSlippage,\n getQuoteOutputAmount,\n hasLimitError,\n isOutputAmountChangedALot,\n} from '../../utils/swap';\n\n/**\n * A request can be successful but in body of the response, it can be some case which is considered as failed.\n */\nexport function throwErrorIfResponseIsNotValid(response: QuoteResponse) {\n if (!response.swaps) {\n throw new Error(errorMessages().noResultError.title, {\n cause: {\n type: QuoteErrorType.NO_RESULT,\n diagnosisMessage: response.diagnosisMessages?.[0],\n },\n });\n }\n const quoteError = getQuoteError(response.swaps);\n if (quoteError) {\n throw new Error(quoteError.message, {\n cause: quoteError.options,\n });\n }\n}\n\nexport function getQuoteError(swaps: SwapResult[]): QuoteErrorResponse | null {\n const limitError = hasLimitError(swaps);\n if (limitError) {\n const { swap, recommendation, fromAmountRangeError } =\n getLimitErrorMessage(swaps);\n return {\n message: 'bridge limit error',\n options: {\n type: QuoteErrorType.BRIDGE_LIMIT,\n swap,\n recommendation,\n fromAmountRangeError,\n },\n };\n }\n\n const recommendedSlippages = checkSlippageErrors(swaps);\n\n if (recommendedSlippages) {\n const minRequiredSlippage = getMinRequiredSlippage(swaps);\n return {\n message: '',\n options: {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages,\n minRequiredSlippage,\n },\n };\n }\n return null;\n}\n\nexport function generateWarnings(\n previousQuote: SelectedQuote | undefined,\n currentQuote: SelectedQuote,\n params: {\n fromToken: Token;\n toToken: Token;\n meta: { blockchains: BlockchainMeta[] };\n selectedWallets: Wallet[];\n userSlippage: number;\n findToken: FindToken;\n }\n): ConfirmSwapWarnings {\n let quoteChanged = false;\n if (previousQuote) {\n quoteChanged = isQuoteChanged(previousQuote, currentQuote);\n }\n const output: ConfirmSwapWarnings = {\n quote: null,\n quoteUpdate: null,\n balance: null,\n };\n\n const quoteWarning = generateQuoteWarnings(currentQuote, {\n fromToken: params.fromToken,\n toToken: params.toToken,\n findToken: params.findToken,\n userSlippage: params.userSlippage,\n });\n\n if (quoteWarning) {\n output.quote = quoteWarning;\n }\n\n if (previousQuote && quoteChanged) {\n if (isOutputAmountChangedALot(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED,\n newOutputAmount: numberToString(getQuoteOutputAmount(currentQuote)),\n percentageChange: numberToString(\n getPriceImpact(\n getQuoteOutputAmount(previousQuote) ?? '',\n getQuoteOutputAmount(currentQuote) ?? ''\n ),\n null,\n 2\n ),\n };\n } else if (isNumberOfSwapsChanged(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_UPDATED,\n };\n } else if (isQuoteSwappersUpdated(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_SWAPPERS_UPDATED,\n };\n } else if (isQuoteInternalCoinsUpdated(previousQuote, currentQuote)) {\n output.quoteUpdate = {\n type: QuoteUpdateType.QUOTE_COINS_UPDATED,\n };\n }\n }\n\n const balanceWarnings = generateBalanceWarnings(\n currentQuote,\n params.selectedWallets,\n params.meta.blockchains\n );\n\n const enoughBalance = balanceWarnings.length === 0;\n\n if (!enoughBalance) {\n output.balance = {\n messages: balanceWarnings,\n };\n }\n\n return output;\n}\n\nexport function handleQuoteErrors(error: any): ConfirmSwapFetchResult {\n if (error?.code === 'ERR_CANCELED') {\n return {\n swap: null,\n error: {\n type: QuoteErrorType.REQUEST_CANCELED,\n },\n warnings: null,\n };\n }\n\n if (error.cause) {\n return {\n swap: null,\n error: error.cause,\n warnings: null,\n };\n }\n\n return {\n swap: null,\n error: {\n type: QuoteErrorType.REQUEST_FAILED,\n },\n warnings: null,\n };\n}\n", "import type { Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n CustomTokensZeroStateDarkIcon,\n CustomTokensZeroStateIcon,\n DeleteIcon,\n Divider,\n IconButton,\n MessageBox,\n NotFound,\n styled,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WatermarkedModal } from '../components/common/WatermarkedModal';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { TokenList } from '../components/TokenList';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useTheme } from '../hooks/useTheme';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { containsText, getContainer } from '../utils/common';\nimport { createTokenHash } from '../utils/meta';\n\nconst Content = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n flexDirection: 'column',\n flex: 1,\n});\nconst NotFoundContent = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n flex: '0.75',\n});\nconst DeleteIconButton = styled(IconButton, {\n '&:hover': {\n '& svg': {\n color: '$secondary550',\n },\n },\n});\nexport function CustomTokensPage() {\n const [searchedFor, setSearchedFor] = useState<string>('');\n const { deleteCustomToken } = useAppStore();\n const customTokens = useAppStore().customTokens();\n const { fromToken, toToken, setFromToken, setToToken } = useQuoteStore();\n const { mode } = useTheme({});\n const navigate = useNavigate();\n const [isDeleteModalOpen, setIsDeleteModalOpen] = useState<boolean>(false);\n const [selectedToken, setSelectedToken] = useState<Token>();\n const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setSearchedFor(value);\n };\n const isDarkTheme = mode === 'dark';\n\n const customTokensResults = customTokens.filter(\n (token) =>\n containsText(token.symbol, searchedFor) ||\n containsText(token.address || '', searchedFor) ||\n containsText(token.name || '', searchedFor)\n );\n\n const handleDeleteCustomToken = () => {\n if (selectedToken) {\n const toTokenHash = toToken ? createTokenHash(toToken) : null;\n const fromTokenHash = fromToken ? createTokenHash(fromToken) : null;\n const selectedTokenHash = createTokenHash(selectedToken);\n\n if (toTokenHash === selectedTokenHash) {\n setToToken({ token: null });\n } else if (fromTokenHash === selectedTokenHash) {\n setFromToken({ token: null });\n }\n deleteCustomToken(selectedToken);\n }\n setIsDeleteModalOpen(false);\n };\n\n return (\n <Layout\n header={{\n title: i18n.t('Custom Tokens'),\n }}>\n <PageContainer>\n <Content>\n {!!customTokens.length ? (\n <>\n <SearchInput\n value={searchedFor}\n setValue={setSearchedFor}\n fullWidth\n color=\"light\"\n variant=\"contained\"\n placeholder={i18n.t('Search Token')}\n onChange={handleSearch}\n />\n <Divider size={16} />\n <TokenList\n list={customTokensResults}\n type=\"custom-token\"\n searchedFor={searchedFor}\n showTitle={false}\n action={(token) => (\n <DeleteIconButton\n variant=\"ghost\"\n onClick={() => {\n setIsDeleteModalOpen(true);\n setSelectedToken(token);\n }}>\n <DeleteIcon size={12} color=\"gray\" />\n </DeleteIconButton>\n )}\n />\n </>\n ) : (\n <NotFoundContent>\n <NotFound\n icon={\n isDarkTheme ? (\n <CustomTokensZeroStateDarkIcon size={200} />\n ) : (\n <CustomTokensZeroStateIcon size={200} />\n )\n }\n title={i18n.t('No custom tokens')}\n description={i18n.t(\n 'press the button to add your custom token'\n )}\n />\n </NotFoundContent>\n )}\n <Divider size={20} />\n\n <Button\n type=\"primary\"\n variant=\"contained\"\n size=\"large\"\n onClick={() => navigate(navigationRoutes.addCustomTokens)}>\n {i18n.t('Add Custom Token')}\n </Button>\n </Content>\n <WatermarkedModal\n open={isDeleteModalOpen}\n dismissible\n onClose={() => setIsDeleteModalOpen(false)}\n container={getContainer()}>\n <MessageBox\n title={i18n.t('Delete Custom Token')}\n type=\"error\"\n description={i18n.t('Are you sure you want to Delete this Token?')}>\n <Divider size={40} />\n <Divider size={10} />\n\n <Button\n fullWidth\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={handleDeleteCustomToken}>\n {i18n.t('Yes, Delete it')}\n </Button>\n <Divider size={12} />\n <Button\n fullWidth\n variant=\"outlined\"\n type=\"primary\"\n size=\"large\"\n onClick={() => setIsDeleteModalOpen(false)}>\n {i18n.t('No, Continue')}\n </Button>\n </MessageBox>\n </WatermarkedModal>\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './SearchInput.types';\n\nimport { CloseIcon, IconButton, SearchIcon, TextField } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { IconWrapper } from './SearchInput.styles';\n\nexport function SearchInput(props: PropTypes) {\n const {\n variant,\n fullWidth,\n color,\n size,\n onChange,\n value,\n style,\n setValue,\n ...inputAttributes\n } = props;\n\n return (\n <TextField\n prefix={\n <IconWrapper>\n <SearchIcon color=\"black\" />\n </IconWrapper>\n }\n suffix={\n !!value.length && (\n <IconButton\n variant=\"ghost\"\n onClick={() => setValue?.('')}\n size=\"small\">\n <CloseIcon color=\"gray\" size={10} />\n </IconButton>\n )\n }\n fullWidth={fullWidth}\n color={color}\n variant={variant}\n style={{\n padding: 10,\n borderRadius: 25,\n alignItems: 'center',\n ...style,\n }}\n size={size}\n value={value}\n onChange={onChange}\n {...inputAttributes}\n />\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const IconWrapper = styled('div', {\n width: '$24',\n height: '$24',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes, RenderDescProps } from './TokenList.types';\nimport type { BlockchainMeta, Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n darkTheme,\n Divider,\n ExternalLinkIcon,\n Image,\n ListItemButton,\n NotFound,\n PinIcon,\n Skeleton,\n Typography,\n VirtualizedList,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useObserveBalanceChanges } from '../../hooks/useObserveBalanceChanges';\nimport { useAppStore } from '../../store/AppStore';\nimport { useWalletsStore } from '../../store/wallets';\nimport { createTintsAndShades } from '../../utils/colors';\nimport { formatBalance } from '../../utils/wallets';\n\nimport { LoadingTokenList } from './LoadingTokenList';\nimport {\n BalanceContainer,\n Container,\n descriptionStyles,\n End,\n ImageSection,\n List,\n Pin,\n StyledLink,\n Tag,\n TagTitle,\n Title,\n tokenAddressStyles,\n TokenBalance,\n tokenNameStyles,\n tokenTitleStyles,\n tokenWithoutNameStyles,\n usdValueStyles,\n} from './TokenList.styles';\n\nconst PAGE_SIZE = 20;\n\nconst renderDesc = (props: RenderDescProps) => {\n const { address, name, url, token, customCssForTag, customCssForTagTitle } =\n props;\n const length = address.length;\n\n return (\n <div className={descriptionStyles()}>\n {name ? (\n <div className={tokenNameStyles()}>{name}</div>\n ) : (\n <Title className={tokenTitleStyles()}>\n <Typography variant=\"title\" size=\"xmedium\">\n {token.symbol}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tag css={customCssForTag}>\n <TagTitle variant=\"body\" size=\"xsmall\" css={customCssForTagTitle}>\n {token.blockchain}\n </TagTitle>\n </Tag>\n </Title>\n )}\n\n {!!address && (\n <div\n className={`${tokenAddressStyles()} ${\n !name && tokenWithoutNameStyles()\n }`}>\n {length > 10\n ? `${address.slice(0, 5)}...${address.slice(length - 6, length)}`\n : address}{' '}\n <Divider size={4} direction=\"horizontal\" />\n <StyledLink\n href={url}\n target=\"_blank\"\n rel=\"nofollow noreferrer\"\n onClick={(e) => e.stopPropagation()}>\n <ExternalLinkIcon size={12} />\n </StyledLink>\n </div>\n )}\n </div>\n );\n};\n\nexport function TokenList(props: PropTypes) {\n const {\n list,\n searchedFor = '',\n onChange,\n selectedBlockchain,\n showTitle = true,\n action,\n } = props;\n\n const [tokens, setTokens] = useState<Token[]>(list);\n const fetchStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const [hasNextPage, setHasNextPage] = useState<boolean>(true);\n const { getBalanceFor, loading: loadingWallet } = useWalletsStore();\n const { isTokenPinned } = useAppStore();\n /**\n * We can create the key by hashing the list of tokens,\n * but if the list is large, the memory usage and cost of comparisons may be high.\n */\n const { balanceKey } = useObserveBalanceChanges(selectedBlockchain);\n\n const loadNextPage = () => {\n setTokens(list.slice(0, tokens.length + PAGE_SIZE));\n };\n\n useEffect(() => {\n setHasNextPage(list.length > tokens.length);\n }, [tokens.length]);\n\n useEffect(() => {\n setTokens(list.slice(0, PAGE_SIZE));\n }, [list.length, selectedBlockchain, balanceKey]);\n\n const endRenderer = (token: Token) => {\n const tokenBalance = formatBalance(getBalanceFor(token));\n\n if (action) {\n return action(token);\n }\n if (loadingWallet) {\n return (\n <End>\n <Skeleton variant=\"text\" size=\"large\" width={70} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={50} />\n </End>\n );\n }\n\n return (\n tokenBalance && (\n <BalanceContainer>\n <TokenBalance variant=\"title\" size=\"small\">\n {tokenBalance.amount}\n </TokenBalance>\n <div />\n {tokenBalance.usdValue && (\n <Typography\n variant=\"body\"\n className={usdValueStyles()}\n size=\"xsmall\">\n {`$${tokenBalance.usdValue}`}\n </Typography>\n )}\n </BalanceContainer>\n )\n );\n };\n\n const renderList = () => {\n return (\n <VirtualizedList\n endReached={hasNextPage ? loadNextPage : undefined}\n itemContent={(index) => {\n const token = tokens[index];\n const address = token.address || '';\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === token.blockchain\n ) as BlockchainMeta;\n const colors = createTintsAndShades(blockchain.color, 'main');\n const customCssForTag = {\n $$color: colors.main150,\n [`.${darkTheme} &`]: {\n $$color: colors.main750,\n },\n backgroundColor: '$$color',\n };\n\n const customCssForTagTitle = {\n $$color: colors.main750,\n [`.${darkTheme} &`]: {\n $$color: colors.main150,\n },\n color: '$$color',\n };\n\n return (\n <div\n style={{\n paddingRight: 5,\n }}>\n <ListItemButton\n style={{\n width: '100%',\n overflow: 'hidden',\n height: '60px',\n }}\n tab-index={index}\n key={`${token.symbol}${token.address}`}\n id={`${token.symbol}${token.address}`}\n hasDivider\n onClick={() => onChange && onChange(tokens[index])}\n start={\n <ImageSection>\n <Image src={token.image} size={30} />\n {props.type !== 'custom-token' &&\n isTokenPinned(token, props.type) && (\n <Pin>\n <PinIcon size={12} color=\"gray\" />\n </Pin>\n )}\n </ImageSection>\n }\n title={\n blockchain?.type === 'COSMOS' ||\n !!token.name ||\n (!token.name && !address) ? (\n <Title>\n <Typography variant=\"title\" size=\"xmedium\">\n {token.symbol}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tag css={customCssForTag}>\n <TagTitle\n variant=\"body\"\n size=\"xsmall\"\n css={customCssForTagTitle}>\n {token.blockchain}\n </TagTitle>\n </Tag>\n </Title>\n ) : undefined\n }\n description={\n !!blockchain?.info &&\n !!address &&\n blockchain.type !== 'COSMOS'\n ? renderDesc({\n address,\n token: tokens[index],\n customCssForTag,\n customCssForTagTitle,\n name: token.name,\n url: blockchain.info.addressUrl\n .split('{wallet}')\n .join(address),\n })\n : token.name || undefined\n }\n end={endRenderer(token)}\n />\n </div>\n );\n }}\n totalCount={tokens.length}\n key={`${selectedBlockchain}-${searchedFor}-${balanceKey}`}\n />\n );\n };\n\n return (\n <>\n {showTitle && (\n <>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Token')}\n </Typography>\n <Divider size={4} />\n </>\n )}\n\n <Container>\n <Divider size={4} />\n {fetchStatus === 'loading' && <LoadingTokenList size={PAGE_SIZE} />}\n {fetchStatus === 'success' &&\n (tokens.length ? (\n <List as=\"ul\">{renderList()}</List>\n ) : (\n !!searchedFor && (\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n )\n ))}\n </Container>\n </>\n );\n}\n", "import type { WalletEventData } from '../../types';\n\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { useEffect, useRef, useState } from 'react';\n\nimport { widgetEventEmitter } from '../../services/eventEmitter';\nimport { useWalletsStore } from '../../store/wallets';\nimport { WalletEventTypes, WidgetEvents } from '../../types';\n\n// A hook to listen for and detect changes in balances on a specific blockchain.\nexport function useObserveBalanceChanges(selectedBlockchain?: string) {\n const { connectedWallets } = useWalletsStore();\n const { getWalletInfo } = useWallets();\n const prevFetchingBalanceWallets = useRef<string[]>([]);\n // The \"balanceKey\" will be updated and incremented after each change in the balance for a blockchain.\n const [balanceKey, setBalanceKey] = useState(0);\n\n useEffect(() => {\n const handleWalletEvent = (event: WalletEventData) => {\n if (event.type === WalletEventTypes.DISCONNECT) {\n const walletInfo = getWalletInfo(event.payload.walletType);\n const blockchainSupported = walletInfo.supportedChains.some(\n (chain) => chain.name === selectedBlockchain\n );\n\n if (blockchainSupported) {\n setBalanceKey((prev) => prev + 1);\n }\n }\n };\n\n widgetEventEmitter.on(WidgetEvents.WalletEvent, handleWalletEvent);\n\n if (!selectedBlockchain) {\n return setBalanceKey((prev) => prev + 1);\n }\n\n const supportedWallets = connectedWallets.filter(\n (wallet) => wallet.chain === selectedBlockchain\n );\n\n supportedWallets.forEach((wallet) => {\n const { walletType } = wallet;\n const walletIsAlreadyFetching =\n prevFetchingBalanceWallets.current.includes(walletType);\n\n /**\n * Watching for changes in \"wallet.balances.length\" is not accurate.\n * Additionally, checking the equality of previous and current balances for a specific blockchain is resource-intensive, so we avoid these methods.\n */\n if (wallet.loading && !walletIsAlreadyFetching) {\n prevFetchingBalanceWallets.current =\n prevFetchingBalanceWallets.current.concat(walletType);\n } else if (!wallet.loading && walletIsAlreadyFetching) {\n prevFetchingBalanceWallets.current =\n prevFetchingBalanceWallets.current.filter(\n (prevWallet) => prevWallet !== walletType\n );\n setBalanceKey((prev) => prev + 1);\n }\n });\n\n return () =>\n widgetEventEmitter.off(WidgetEvents.WalletEvent, handleWalletEvent);\n }, [connectedWallets, selectedBlockchain, getWalletInfo]);\n\n return { balanceKey };\n}\n", "import type { LoadingTokenListProps } from './TokenList.types';\n\nimport { Divider, ListItem, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { End, List } from './TokenList.styles';\n\nexport function LoadingTokenList(props: LoadingTokenListProps) {\n return (\n <List>\n {Array.from(Array(props.size), (e) => (\n <ListItem\n key={e}\n hasDivider\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n end={\n <End>\n <Skeleton variant=\"text\" size=\"large\" width={70} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={50} />\n </End>\n }\n title={\n <div>\n <Skeleton variant=\"text\" size=\"large\" width={90} />\n <Divider size={4} />\n <Skeleton variant=\"text\" size=\"medium\" width={90} />\n </div>\n }\n />\n ))}\n </List>\n );\n}\n", "import {\n css,\n darkTheme,\n ImageContainer,\n styled,\n Typography,\n} from '@rango-dev/ui';\n\nexport const tokenNameStyles = css({\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 100,\n overflow: 'hidden',\n});\nexport const descriptionStyles = css({\n position: 'relative',\n height: 12,\n width: '30%',\n maxWidth: '150px',\n});\nexport const tokenTitleStyles = css({\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n bottom: '-8px',\n});\nexport const tokenAddressStyles = css({\n transform: 'translateY(12px)',\n visibility: 'hidden',\n display: 'flex',\n '& a': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n fontSize: '$12',\n lineHeight: '$16',\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n textDecoration: 'none',\n },\n});\nexport const tokenWithoutNameStyles = css({});\nexport const usdValueStyles = css();\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n overflow: 'hidden',\n justifyContent: 'center',\n});\n\nexport const Title = styled('div', {\n display: 'flex',\n alignItems: 'center',\n '._typography': {\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 100,\n overflow: 'hidden',\n },\n});\nexport const List = styled('ul', {\n flexGrow: 1,\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n '& li': {\n alignItems: 'none',\n\n '&:hover': {\n [`& .${descriptionStyles}`]: {\n [`& .${tokenAddressStyles}`]: {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n visibility: 'visible',\n },\n\n [`& .${tokenWithoutNameStyles}`]: {\n bottom: '-15px',\n },\n [`& .${tokenNameStyles}`]: {\n position: 'absolute',\n transform: 'translateY(-12px)',\n visibility: 'hidden',\n },\n [`& .${tokenTitleStyles}`]: {\n position: 'absolute',\n transform: 'translateY(-12px)',\n bottom: '-10px',\n },\n },\n },\n },\n});\n\nexport const Tag = styled('div', {\n paddingLeft: '$5',\n paddingRight: '$5',\n borderRadius: '$md',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const TagTitle = styled(Typography, {});\n\nexport const BalanceContainer = styled('div', {\n textAlign: 'right',\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n [`& .${usdValueStyles}`]: {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const End = styled('div', {\n display: 'flex',\n alignItems: 'end',\n flexDirection: 'column',\n});\n\nexport const Description = styled('div', {\n display: 'flex',\n alignItems: 'center',\n});\nexport const ImageSection = styled('div', {\n position: 'relative',\n [`& ${ImageContainer}`]: {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n});\nexport const Pin = styled('div', {\n position: 'absolute',\n backgroundColor: '$neutral100',\n padding: '$4',\n borderRadius: '50%',\n bottom: -6,\n right: -6,\n});\n\nexport const TokenBalance = styled(Typography, {\n width: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const StyledLink = styled('a', {\n '& svg:hover': {\n color: '$colors$info',\n },\n});\n", "import { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport {\n Button,\n darkTheme,\n Divider,\n MessageBox,\n NotFound,\n styled,\n Typography,\n} from '@rango-dev/ui';\nimport {\n type PendingSwap,\n type PendingSwapStep,\n TransactionStatus,\n} from 'rango-types';\nimport React, { useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WatermarkedModal } from '../components/common/WatermarkedModal';\nimport { FilterSelector } from '../components/FilterSelector';\nimport { SuffixContainer } from '../components/HeaderButtons/HeaderButtons.styles';\nimport { HistoryGroupedList } from '../components/HistoryGroupedList';\nimport { NotFoundContainer } from '../components/HistoryGroupedList/HistoryGroupedList.styles';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { getContainer } from '../utils/common';\nimport { groupSwapsByDate } from '../utils/date';\nimport { containsText } from '../utils/numbers';\nimport { getPendingSwaps } from '../utils/queue';\n\nconst HistoryGroupedListContainer = styled('div', {\n overflowY: 'visible',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: 15,\n height: '100%',\n});\n\nconst SearchAndFilterBar = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nconst Description = styled('div', {\n '._typography': {\n color: '$neutral700',\n [`.${darkTheme}&`]: {\n color: '$neutral900',\n },\n },\n});\n\nconst transactionStatusFilters = [\n {\n id: TransactionStatus.SUCCESS,\n title: i18n.t('Complete'),\n },\n {\n id: TransactionStatus.RUNNING,\n title: i18n.t('Running'),\n },\n { id: TransactionStatus.FAILED, title: i18n.t('Failed') },\n];\n\nconst isStepContainsText = (steps: PendingSwapStep[], value: string) => {\n if (!steps?.length) {\n return false;\n }\n return steps.filter(\n (step) =>\n containsText(step.fromBlockchain, value) ||\n containsText(step.toBlockchain, value) ||\n containsText(step.toSymbol, value) ||\n containsText(step.fromSymbol, value)\n ).length;\n};\n\nexport function HistoryPage() {\n const navigate = useNavigate();\n const { manager, state } = useManager();\n const list: PendingSwap[] = getPendingSwaps(manager).map(({ swap }) => swap);\n const [searchedFor, setSearchedFor] = useState<string>('');\n const [openFilterSelector, setOpenFilterSelector] = useState(false);\n const loading = !state.loadedFromPersistor;\n const [filterBy, setFilterBy] = useState('');\n const [openClearModal, setOpenClearModal] = useState(false);\n const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setSearchedFor(value);\n };\n\n const filteredList = useMemo(() => {\n if (!searchedFor && !filterBy) {\n return list;\n }\n\n return list.filter((swap) => {\n const { inputAmount, status, steps, requestId } = swap;\n\n const matchesSearch =\n !searchedFor ||\n containsText(inputAmount, searchedFor) ||\n containsText(status, searchedFor) ||\n isStepContainsText(steps, searchedFor) ||\n containsText(requestId, searchedFor);\n\n const matchesFilter = !filterBy || filterBy === status;\n\n return matchesSearch && matchesFilter;\n });\n }, [list, searchedFor, filterBy]);\n\n const isEmpty = !filteredList?.length && !loading;\n\n const onCloseModal = () => setOpenClearModal(false);\n const onClear = async () => {\n try {\n await manager?.clearQueue();\n\n setOpenClearModal(false);\n } catch (e) {\n console.log(e);\n }\n };\n const isClearButtonDisabled = useMemo(() => {\n return !list.some(\n (swap) =>\n swap.status === TransactionStatus.SUCCESS ||\n swap.status === TransactionStatus.FAILED\n );\n }, [list]);\n\n return (\n <Layout\n header={{\n title: i18n.t('History'),\n suffix: (\n <SuffixContainer>\n <Button\n disabled={isClearButtonDisabled}\n variant=\"ghost\"\n size=\"xsmall\"\n onClick={() => setOpenClearModal(true)}>\n <Typography size=\"medium\" variant=\"label\" color=\"error\">\n {i18n.t('Clear all Txs')}\n </Typography>\n </Button>\n </SuffixContainer>\n ),\n }}>\n <PageContainer>\n <SearchAndFilterBar>\n <SearchInput\n setValue={setSearchedFor}\n fullWidth\n variant=\"contained\"\n placeholder={i18n.t('Search Transaction')}\n autoFocus\n onChange={handleSearch}\n style={{ height: 36 }}\n value={searchedFor}\n />\n <Divider size={10} direction=\"horizontal\" />\n\n <FilterSelector\n filterBy={filterBy}\n open={openFilterSelector}\n onOpenChange={(open) => setOpenFilterSelector(open)}\n onClickItem={(id) => setFilterBy(id)}\n list={transactionStatusFilters}\n />\n </SearchAndFilterBar>\n\n <Divider size=\"16\" />\n <HistoryGroupedListContainer>\n {isEmpty && (\n <NotFoundContainer>\n <Divider size={32} />\n <NotFound\n title={\n searchedFor\n ? i18n.t('No results found')\n : i18n.t('No transactions')\n }\n titleColor={!searchedFor ? '$info' : undefined}\n hasIcon={!!searchedFor}\n description={\n searchedFor\n ? i18n.t('Try using different keywords')\n : i18n.t(\n 'Your transaction history is stored locally and will appear here after you start a swap'\n )\n }\n />\n </NotFoundContainer>\n )}\n {!isEmpty && (\n <HistoryGroupedList\n list={filteredList}\n onSwapClick={navigate}\n groupBy={groupSwapsByDate}\n isLoading={loading}\n />\n )}\n </HistoryGroupedListContainer>\n </PageContainer>\n <WatermarkedModal\n open={openClearModal}\n onClose={onCloseModal}\n container={getContainer()}>\n <Divider size={20} />\n <MessageBox\n type=\"warning\"\n title={i18n.t('Clear History')}\n description={\n <Description>\n <Typography variant=\"body\" size=\"medium\">\n {i18n.t(\n 'This would clear all succeeded/failed transactions from widget. Do you wish to proceed?'\n )}\n </Typography>\n <Divider size={'24'} />\n\n <Typography variant=\"body\" size=\"small\">\n {i18n.t(\n 'Hint: This does not clear your transaction history on blockchain. Only hides them in this page.'\n )}\n </Typography>\n </Description>\n }\n />\n <Divider size={40} />\n\n <Divider size={10} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onClear}>\n {i18n.t('Yes, Clear history')}\n </Button>\n <Divider size={10} />\n <Button\n variant=\"outlined\"\n type=\"primary\"\n size=\"large\"\n onClick={onCloseModal}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('No, Cancel')}\n </Typography>\n </Button>\n </WatermarkedModal>\n </Layout>\n );\n}\n", "import type { FilterSelectorPropTypes } from './FilterSelector.type';\n\nimport { FilterIcon, Popover } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport { Badge, FilterButton, IconContainer } from './FilterSelector.style';\nimport { FilterSelectorContent } from './FilterSelectorContent';\n\nexport function FilterSelector(props: FilterSelectorPropTypes) {\n const { onClickItem, onOpenChange, filterBy, list, open } = props;\n return (\n <div>\n <Popover\n open={open}\n align=\"end\"\n onOpenChange={onOpenChange}\n container={getContainer()}\n content={\n <FilterSelectorContent\n list={list}\n filterBy={filterBy}\n onClickItem={(id) => {\n onClickItem(id);\n onOpenChange(false);\n }}\n />\n }>\n <FilterButton\n variant=\"default\"\n isSelect={!!filterBy}\n onClick={() => onOpenChange(!props.open)}>\n <IconContainer isSelect={!!filterBy}>\n <FilterIcon size={16} color=\"black\" />\n {!!filterBy && <Badge />}\n </IconContainer>\n </FilterButton>\n </Popover>\n </div>\n );\n}\n", "import { css, darkTheme, IconButton, styled } from '@rango-dev/ui';\n\nexport const IconContainer = styled('div', {\n position: 'relative',\n '&::before': {\n position: 'absolute',\n right: '1px',\n top: '-1px',\n width: '$8',\n height: '$8',\n borderRadius: '100%',\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n padding: '$2',\n },\n variants: {\n isSelect: {\n true: {\n '&::before': {\n content: '',\n },\n },\n },\n },\n});\n\nexport const FilterButton = styled(IconButton, {\n width: '$36',\n height: '$36',\n position: 'relative',\n padding: '0',\n overflow: 'unset',\n backgroundColor: '$neutral300',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral400',\n },\n '&:hover': {\n backgroundColor: '$secondary100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral',\n },\n [`& ${IconContainer}::before`]: {\n backgroundColor: '$secondary100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral',\n },\n },\n },\n variants: {\n isSelect: {\n true: {\n border: '1px solid $secondary',\n },\n },\n },\n});\n\nexport const Badge = styled('div', {\n position: 'absolute',\n width: '$6',\n height: '$6',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: '3px',\n top: '$0',\n right: '1px',\n backgroundColor: '$secondary500',\n});\n\nexport const FilterContainer = styled('div', {\n padding: '$15',\n borderRadius: '$sm',\n width: '248px',\n backgroundColor: '$background',\n zIndex: 10,\n});\n\nexport const centeredFlexContainer = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const FilterList = styled('ul', {\n margin: 0,\n listStyle: 'none',\n height: '100%',\n padding: 0,\n '.item-start-container': {\n paddingRight: '0 !important',\n },\n});\n", "import type { PropTypes } from './FilterSelector.type';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n centeredFlexContainer,\n FilterContainer,\n FilterList,\n} from './FilterSelector.style';\n\nexport function FilterSelectorContent(props: PropTypes) {\n const { filterBy: value, onClickItem } = props;\n return (\n <FilterContainer>\n <div className={centeredFlexContainer()}>\n <Typography size=\"small\" variant=\"body\">\n {i18n.t('Status')}\n </Typography>\n <Button variant=\"ghost\" size=\"xxsmall\" onClick={() => onClickItem('')}>\n {i18n.t('Reset')}\n </Button>\n </div>\n <Divider size={10} />\n <RadioRoot value={value}>\n <FilterList>\n {props.list.map((item, index) => {\n return (\n <ListItemButton\n key={item.id}\n style={{ height: '40px', width: '100%' }}\n selected={false}\n hasDivider={props.list.length - 1 != index}\n id={item.id}\n title={\n <>\n <Divider direction=\"horizontal\" size={4} />\n <Typography size=\"medium\" variant=\"body\">\n {item.title}\n </Typography>\n </>\n }\n start={<Radio value={item.id} />}\n onClick={onClickItem}\n />\n );\n })}\n </FilterList>\n </RadioRoot>\n </FilterContainer>\n );\n}\n", "import type { PropTypes } from './HistoryGroupedList.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n GroupedVirtualizedList,\n Skeleton,\n SwapListItem,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\n\nimport { calculateGroupsSoFar } from './HistoryGroupedList.helpers';\nimport {\n Group,\n groupStyles,\n SwapItemContainer,\n SwapList,\n Time,\n} from './HistoryGroupedList.styles';\n\nconst ITEMS_PER_PAGE = 10;\n\nexport function HistoryGroupedList(props: PropTypes) {\n const { list, onSwapClick, groupBy, isLoading } = props;\n const [currentGroupCounts, setCurrentGroupCounts] = useState<number[]>([]);\n const loadedItems = useRef(0);\n const { swaps, groupCounts, groups } = groupBy(list);\n\n const calculateGroups = useCallback(calculateGroupsSoFar, []);\n\n const loadMore = useCallback(() => {\n const remainedItems = list.length - loadedItems.current;\n if (remainedItems) {\n loadedItems.current += Math.min(remainedItems, ITEMS_PER_PAGE);\n setCurrentGroupCounts(calculateGroups(groupCounts, loadedItems.current));\n }\n }, [list.length]);\n\n useEffect(() => {\n if (!isLoading) {\n loadMore();\n }\n }, [isLoading, loadMore]);\n\n if (isLoading) {\n // The number of items presented in each group.\n const swaps = [1, 2];\n const loadingGroups = [swaps, swaps];\n return (\n <>\n {loadingGroups.map((group, index) => {\n const key = index;\n return (\n <Group key={key}>\n <Time>\n <Skeleton variant=\"text\" width={60} size=\"small\" />\n <Divider size={16} />\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.map((_, index) => {\n const key = index;\n return <SwapListItem isLoading={true} key={key} />;\n })}\n </SwapList>\n </Group>\n );\n })}\n </>\n );\n }\n\n return (\n <GroupedVirtualizedList\n endReached={() => {\n if (loadedItems.current < list.length) {\n loadMore();\n }\n }}\n groupCounts={currentGroupCounts}\n groupContent={(index) => {\n return (\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n className={groupStyles()}>\n {groups[index]}\n </Typography>\n </Time>\n </Group>\n );\n }}\n itemContent={(index, groupIndex) => {\n const swap = swaps[index];\n if (!swap) {\n return null;\n }\n const firstStep = swap.steps[0];\n const lastStep = swap.steps[swap.steps.length - 1];\n return (\n <SwapItemContainer key={swap.requestId}>\n <SwapListItem\n requestId={swap.requestId}\n creationTime={swap.creationTime}\n status={swap.status}\n onClick={onSwapClick}\n tooltipContainer={getContainer()}\n onlyShowTime={groups[groupIndex] === i18n.t('Today')}\n swapTokenData={{\n from: {\n token: {\n image: firstStep.fromLogo,\n displayName: firstStep.fromSymbol,\n },\n blockchain: {\n image: firstStep.fromBlockchainLogo || '',\n },\n amount: numberToString(\n swap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realAmount: swap.inputAmount,\n },\n to: {\n token: {\n image: lastStep.toLogo,\n displayName: lastStep.toSymbol,\n },\n blockchain: {\n image: lastStep.toBlockchainLogo || '',\n },\n amount: numberToString(\n lastStep.outputAmount ||\n lastStep.expectedOutputAmountHumanReadable ||\n '',\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realAmount:\n lastStep.outputAmount ||\n lastStep.expectedOutputAmountHumanReadable ||\n '',\n },\n }}\n />\n </SwapItemContainer>\n );\n }}\n />\n );\n}\n", "/*\n * The calculateGroupsSoFar Slices the total groups into the groups which contain the items so far.\n * For example, if you have [10, 10, 10, 10] groups in total,\n * slicing them to 23 will result in [10, 10, 3] :\n * https://virtuoso.dev/grouped-with-load-on-demand/\n */\nexport function calculateGroupsSoFar(totalGroups: number[], count: number) {\n const groups: number[] = [];\n let index = 0;\n do {\n const group = totalGroups[index];\n groups.push(Math.min(group, count));\n count -= group;\n index++;\n } while (count > 0 && index <= totalGroups.length);\n return groups;\n}\n", "import { css, darkTheme, styled } from '@rango-dev/ui';\n\nexport const groupStyles = css();\n\nexport const SwapItemContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '$5',\n});\n\nexport const Group = styled('div', {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: '$background',\n padding: '$10 $5 0 $5',\n [`& .${groupStyles}`]: {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const Time = styled('div', {\n display: 'flex',\n justifyContent: 'flex-start',\n padding: '$2',\n});\n\nexport const SwapList = styled('div', {\n gap: '$10',\n display: 'flex',\n flexDirection: 'column',\n});\n\nexport const NotFoundContainer = styled('div', {\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n", "import type { GroupBy } from '../components/HistoryGroupedList/HistoryGroupedList.types';\nimport type { PendingSwap } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport dayjs from 'dayjs';\n\nexport const groupSwapsByDate: GroupBy = (swaps) => {\n const output: Map<\n string,\n {\n title: string;\n swaps: PendingSwap[];\n }\n > = new Map([\n [\n 'today',\n {\n title: i18n.t('Today'),\n swaps: [],\n },\n ],\n [\n 'week',\n {\n title: i18n.t('This week'),\n swaps: [],\n },\n ],\n [\n 'month',\n {\n title: i18n.t('This month'),\n swaps: [],\n },\n ],\n [\n 'year',\n {\n title: i18n.t('This year'),\n swaps: [],\n },\n ],\n ]);\n\n function addYearsToOutput(key: string, swap: PendingSwap) {\n if (!output.has(key)) {\n output.set(key, {\n title: key,\n swaps: [],\n });\n }\n output.get(key)?.swaps.push(swap);\n }\n\n const now = dayjs();\n swaps.forEach((swap) => {\n const time = Number(swap.creationTime);\n const swapDate = dayjs(time);\n if (now.isSame(swapDate, 'day')) {\n output.get('today')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'week')) {\n output.get('week')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'month')) {\n output.get('month')?.swaps.push(swap);\n } else if (now.isSame(swapDate, 'year')) {\n output.get('year')?.swaps.push(swap);\n } else {\n const year = new Date(time).getFullYear().toString();\n addYearsToOutput(year, swap);\n }\n });\n\n const groupedSwaps = Array.from(output.values()).filter(\n (item) => item.swaps.length > 0\n );\n const items = groupedSwaps.flatMap((group) => group.swaps);\n const groupCounts = groupedSwaps.map((group) => group.swaps.length);\n const groups = groupedSwaps.map((group) => group.title);\n\n return { swaps: items, groupCounts, groups };\n};\n", "import type { SelectedQuote } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, styled, WarningIcon } from '@rango-dev/ui';\nimport BigNumber from 'bignumber.js';\nimport React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HeaderButtons } from '../components/HeaderButtons';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { QuoteWarningsAndErrors } from '../components/QuoteWarningsAndErrors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { ExpandedQuotes } from '../containers/ExpandedQuotes';\nimport { Inputs } from '../containers/Inputs';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport useScreenDetect from '../hooks/useScreenDetect';\nimport { useSwapInput } from '../hooks/useSwapInput';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport { UiEventTypes } from '../types';\nimport { isVariantExpandable } from '../utils/configs';\nimport { emitPreventableEvent } from '../utils/events';\nimport { getSwapButtonState, isTokensIdentical } from '../utils/swap';\n\nconst MainContainer = styled('div', {\n display: 'flex',\n alignItems: 'flex-start',\n maxHeight: 700,\n '& .footer__alert': {\n paddingTop: '0 !important',\n },\n});\nexport const TIME_TO_NAVIGATE_ANOTHER_PAGE = 300;\n\nexport function Home() {\n const navigate = useNavigate();\n const {\n fromToken,\n toToken,\n inputAmount,\n selectedQuote,\n refetchQuote,\n error: quoteError,\n warning: quoteWarning,\n quotes,\n setSelectedQuote,\n resetQuoteWallets,\n setQuoteWarningsConfirmed,\n updateQuotePartialState,\n } = useQuoteStore();\n const [isVisibleExpanded, setIsVisibleExpanded] = useState<boolean>(false);\n const { isLargeScreen, isExtraLargeScreen } = useScreenDetect();\n\n const { fetch: fetchQuote, loading } = useSwapInput({ refetchQuote });\n const { config, fetchStatus: fetchMetaStatus } = useAppStore();\n\n const { connectedWallets } = useWalletsStore();\n const { isActiveTab } = useUiStore();\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n\n const needsToWarnEthOnPath = false;\n\n const swapButtonState = getSwapButtonState({\n fetchMetaStatus,\n fetchingQuote: loading,\n inputAmount,\n quote: selectedQuote,\n anyWalletConnected: connectedWallets.length > 0,\n error: quoteError,\n warning: quoteWarning,\n needsToWarnEthOnPath,\n });\n\n const isExpandable = isVariantExpandable(\n isLargeScreen,\n isExtraLargeScreen,\n config?.variant\n );\n\n const hasInputs =\n !!inputAmount &&\n !!fromToken &&\n !!toToken &&\n new BigNumber(inputAmount).gt(0) &&\n !isTokensIdentical(fromToken, toToken);\n\n const fetchingQuote = hasInputs && fetchMetaStatus === 'success' && loading;\n\n const hasValidQuotes =\n !isExpandable || (isExpandable && quotes?.results.length);\n const hasWarningOrError = quoteWarning || quoteError;\n const showMessages = hasValidQuotes && hasWarningOrError;\n\n useEffect(() => {\n resetQuoteWallets();\n updateQuotePartialState('refetchQuote', true);\n }, []);\n\n useEffect(() => {\n setIsVisibleExpanded(hasInputs);\n }, [hasInputs]);\n\n const onClickRefresh =\n (!!selectedQuote || quoteError) && !showQuoteWarningModal\n ? fetchQuote\n : undefined;\n\n const onHandleNavigation = (route: string) => {\n if (isExpandable && isVisibleExpanded) {\n setIsVisibleExpanded(false);\n setTimeout(() => {\n navigate(route);\n }, TIME_TO_NAVIGATE_ANOTHER_PAGE);\n } else {\n navigate(route);\n }\n };\n const onClickOnQuote = (quote: SelectedQuote) => {\n if (selectedQuote?.requestId !== quote.requestId) {\n setShowQuoteWarningModal(false);\n setSelectedQuote(quote);\n }\n };\n return (\n <MainContainer>\n <Layout\n height=\"auto\"\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n disabled={swapButtonState.disabled || !isActiveTab}\n prefix={\n swapButtonState.action === 'confirm-warning' && <WarningIcon />\n }\n fullWidth\n onClick={() => {\n if (swapButtonState.action === 'connect-wallet') {\n emitPreventableEvent(\n { type: UiEventTypes.CLICK_CONNECT_WALLET },\n () => onHandleNavigation(navigationRoutes.wallets)\n );\n } else if (swapButtonState.action === 'confirm-warning') {\n setShowQuoteWarningModal(true);\n } else {\n onHandleNavigation(navigationRoutes.confirmSwap);\n }\n }}>\n {swapButtonState.title}\n </Button>\n }\n header={{\n onWallet: () => {\n onHandleNavigation(navigationRoutes.wallets);\n },\n hasBackButton: false,\n title: config.title || i18n.t('Swap'),\n suffix: (\n <HeaderButtons\n hidden={isExpandable ? ['refresh'] : undefined}\n onClickRefresh={onClickRefresh}\n onClickHistory={() => onHandleNavigation(navigationRoutes.swaps)}\n onClickSettings={() => {\n onHandleNavigation(navigationRoutes.settings);\n }}\n />\n ),\n }}>\n <PageContainer>\n <Inputs\n fetchingQuote={fetchingQuote}\n fetchMetaStatus={fetchMetaStatus}\n isExpandable={isExpandable}\n onClickToken={(mode) => {\n onHandleNavigation(\n mode === 'from'\n ? navigationRoutes.fromSwap\n : navigationRoutes.toSwap\n );\n }}\n />\n <Divider size=\"2\" />\n {!isExpandable ? (\n <QuoteInfo\n quote={selectedQuote}\n loading={fetchingQuote}\n error={quoteError}\n tagHidden={false}\n warning={quoteWarning}\n type=\"basic\"\n onClickAllRoutes={\n !!quotes && quotes.results.length > 1\n ? () => {\n updateQuotePartialState('refetchQuote', false);\n onHandleNavigation(navigationRoutes.routes);\n }\n : undefined\n }\n />\n ) : null}\n\n {showMessages ? (\n <>\n <Divider size=\"10\" />\n <QuoteWarningsAndErrors\n warning={quoteWarning}\n error={quoteError}\n couldChangeSettings={true}\n refetchQuote={fetchQuote}\n showWarningModal={showQuoteWarningModal}\n confirmationDisabled={!isActiveTab}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={() => {\n setShowQuoteWarningModal(false);\n setQuoteWarningsConfirmed(true);\n onHandleNavigation(navigationRoutes.confirmSwap);\n }}\n onChangeSettings={() =>\n onHandleNavigation(navigationRoutes.settings)\n }\n />\n </>\n ) : null}\n </PageContainer>\n </Layout>\n {isExpandable ? (\n <ExpandedQuotes\n loading={fetchingQuote}\n onClickOnQuote={onClickOnQuote}\n fetch={fetchQuote}\n onClickRefresh={onClickRefresh}\n isVisible={isVisibleExpanded}\n />\n ) : null}\n </MainContainer>\n );\n}\n", "import type { PropTypes } from './ExpandedQuotes.types';\n\nimport { i18n } from '@lingui/core';\nimport { Header } from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { HeaderButtons } from '../../components/HeaderButtons';\nimport { LayoutContainer } from '../../components/Layout/Layout.styles';\nimport { Quotes } from '../../components/Quotes';\nimport { SelectStrategy } from '../../components/Quotes/SelectStrategy';\nimport { WIDGET_UI_ID } from '../../constants';\nimport { useAppStore } from '../../store/AppStore';\nimport { getExpanded } from '../../utils/common';\n\nimport { Container, Content } from './ExpandedQuotes.styles';\n\nexport const TIME_TO_CLOSE_OPEN_EXPANDED = 100;\n\nexport function ExpandedQuotes(props: PropTypes) {\n const { fetch, loading, onClickOnQuote, onClickRefresh, isVisible } = props;\n const [isDelayedVisible, setIsDelayedVisible] = useState(false);\n const containerClass = isDelayedVisible ? '' : 'is-hidden';\n const { config } = useAppStore();\n const fullExpandedMode = config?.variant === 'full-expanded';\n const container = getExpanded();\n useEffect(() => {\n let timeout: ReturnType<typeof setTimeout> | null = null;\n\n if (isVisible) {\n timeout = setTimeout(() => {\n setIsDelayedVisible(true);\n }, TIME_TO_CLOSE_OPEN_EXPANDED);\n } else {\n setIsDelayedVisible(false);\n if (timeout) {\n clearTimeout(timeout);\n }\n }\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n }\n };\n }, [isVisible]);\n\n return (\n <Container\n expandMode={config?.variant === 'full-expanded' ? 'full' : 'default'}\n className={`${containerClass} ${LayoutContainer()}`}\n id={WIDGET_UI_ID.EXPANDED_BOX_ID}>\n <Header\n title={i18n.t('Routes')}\n suffix={\n <>\n <SelectStrategy container={container} />\n <HeaderButtons\n container={container}\n onClickRefresh={onClickRefresh}\n hidden={['history', 'notifications', 'settings']}\n />\n </>\n }\n />\n <Content>\n <Quotes\n showModalFee={false}\n fetch={fetch}\n hasSort={false}\n loading={loading}\n container={getExpanded()}\n onClickOnQuote={onClickOnQuote}\n fullExpandedMode={fullExpandedMode}\n />\n </Content>\n </Container>\n );\n}\n", "import type { PropTypes } from './Quotes.types';\nimport type { MultiRouteSimulationResult } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, FullExpandedQuote, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteInfo } from '../../containers/QuoteInfo';\nimport { getQuoteError } from '../../hooks/useConfirmSwap/useConfirmSwap.helpers';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType, type SelectedQuote } from '../../types';\nimport { getContainer } from '../../utils/common';\nimport { generateQuoteWarnings, sortQuotesBy } from '../../utils/quote';\nimport { NoResult } from '../NoResult';\nimport { QuoteSkeleton } from '../QuoteSkeleton';\n\nimport { ErrorsContainer, StrategyContent } from './Quotes.styles';\nimport { SelectStrategy } from './SelectStrategy';\n\nconst ITEM_SKELETON_COUNT = 3;\nexport function Quotes(props: PropTypes) {\n const {\n loading,\n onClickOnQuote,\n fetch,\n showModalFee,\n hasSort = true,\n fullExpandedMode = false,\n container: propContainer,\n } = props;\n const {\n selectedQuote,\n quotes,\n updateQuotePartialState,\n fromToken,\n toToken,\n sortStrategy,\n error,\n } = useQuoteStore();\n const { slippage, customSlippage } = useAppStore();\n const { findToken } = useAppStore();\n const container = propContainer || getContainer();\n const hasQuotes = !!quotes && quotes.results.length;\n const userSlippage = customSlippage ?? slippage;\n const getQuoteWarning = (quote: MultiRouteSimulationResult) => {\n if (!fromToken || !toToken || !quotes) {\n return null;\n }\n const mergedQuote: SelectedQuote = {\n requestAmount: quotes.requestAmount, // Assuming quotes is an array\n ...quote,\n };\n\n return generateQuoteWarnings(mergedQuote, {\n fromToken,\n toToken,\n userSlippage,\n findToken,\n });\n };\n const showNoResultMessage =\n error?.type === QuoteErrorType.NO_RESULT ||\n error?.type === QuoteErrorType.REQUEST_FAILED;\n\n const sortQuotes = quotes?.results\n ? sortQuotesBy(sortStrategy, quotes?.results)\n : [];\n\n return (\n <>\n {hasSort && (\n <>\n <StrategyContent>\n <Typography size=\"xmedium\" variant=\"title\">\n {i18n.t('Sort by')}\n </Typography>\n <SelectStrategy container={container} />\n </StrategyContent>\n <Divider size=\"10\" />\n </>\n )}\n\n {loading &&\n Array.from({ length: ITEM_SKELETON_COUNT }, (_, index) => (\n <React.Fragment key={index}>\n {fullExpandedMode ? (\n <FullExpandedQuote loading />\n ) : (\n <QuoteSkeleton\n tagHidden={false}\n type=\"list-item\"\n expanded={false}\n />\n )}\n {index !== ITEM_SKELETON_COUNT - 1 && <Divider size={16} />}\n </React.Fragment>\n ))}\n\n {!loading && (\n <>\n {hasQuotes\n ? sortQuotes.map((quote, index) => {\n const quoteWarning = getQuoteWarning(quote);\n const quoteError = getQuoteError(quote.swaps);\n const lastIndex = sortQuotes.length - 1 === index;\n\n return (\n <React.Fragment key={quote.requestId}>\n <QuoteInfo\n showModalFee={showModalFee}\n container={container}\n selected={selectedQuote?.requestId === quote.requestId}\n tagHidden={false}\n quote={{ ...quote, requestAmount: quotes.requestAmount }}\n loading={loading}\n error={quoteError?.options || null}\n warning={quoteWarning}\n fullExpandedMode={fullExpandedMode}\n onClick={(quote) => {\n if (!quoteError) {\n updateQuotePartialState('warning', quoteWarning);\n }\n updateQuotePartialState(\n 'error',\n quoteError?.options || null\n );\n onClickOnQuote(quote);\n }}\n type=\"list-item\"\n />\n {!lastIndex && <Divider size={16} />}\n </React.Fragment>\n );\n })\n : showNoResultMessage && (\n <ErrorsContainer>\n <NoResult\n size={fullExpandedMode ? 'large' : 'small'}\n error={error}\n fetch={fetch}\n />\n </ErrorsContainer>\n )}\n </>\n )}\n </>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const ErrorsContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n flexDirection: 'column',\n height: '100%',\n});\n\nexport const StrategyContent = styled('div', {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const SelectContainer = styled('div', {\n width: '146px',\n});\n", "import type { PreferenceType } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Select } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../../store/quote';\n\nimport { SelectContainer } from './Quotes.styles';\n\nexport function SelectStrategy(props: { container: HTMLElement }) {\n const { updateQuotePartialState, sortStrategy } = useQuoteStore();\n\n const ROUTE_STRATEGY: { value: PreferenceType; label: string }[] = [\n {\n value: 'SMART',\n label: i18n.t('Smart Routing'),\n },\n {\n value: 'FEE',\n label: i18n.t('Lowest Fee'),\n },\n {\n value: 'SPEED',\n label: i18n.t('Fastest Transfer'),\n },\n {\n value: 'NET_OUTPUT',\n label: i18n.t('Maximum Return'),\n },\n {\n value: 'PRICE',\n label: i18n.t('Maximum Output'),\n },\n ];\n\n return (\n <SelectContainer>\n <Select\n container={props.container}\n options={ROUTE_STRATEGY}\n value={sortStrategy}\n handleItemClick={(item) => {\n updateQuotePartialState('sortStrategy', item.value);\n }}\n variant=\"filled\"\n />\n </SelectContainer>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n transition: 'width 0.2s, opacity 0.2s, margin-left 0.2s',\n height: '700px',\n width: '390px',\n opacity: 1,\n marginLeft: '$16',\n backgroundColor: '$neutral100',\n [`.${darkTheme} &`]: {\n backgroundColor: '$neutral300',\n },\n\n variants: {\n expandMode: {\n default: {\n width: '390px',\n },\n full: {\n width: '719px',\n },\n },\n },\n\n '&.is-hidden': {\n width: 0,\n height: 0,\n opacity: 0,\n marginLeft: 0,\n },\n});\n\nexport const Content = styled('div', {\n position: 'relative',\n overflow: 'hidden',\n padding: '$20',\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'auto',\n borderRadius: '$primary',\n backgroundColor: '$background',\n});\n", "import type { PropTypes } from './Inputs.types';\n\nimport { i18n } from '@lingui/core';\nimport { SwapInput } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SwitchFromAndToButton } from '../../components/SwitchFromAndTo';\nimport { errorMessages } from '../../constants/errors';\nimport {\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { useQuoteStore } from '../../store/quote';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { numberToString } from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport { canComputePriceImpact } from '../../utils/swap';\nimport { formatBalance, isFetchingBalance } from '../../utils/wallets';\n\nimport { Container, FromContainer } from './Inputs.styles';\n\nexport function Inputs(props: PropTypes) {\n const { fetchingQuote, fetchMetaStatus, onClickToken, isExpandable } = props;\n const {\n fromToken,\n fromBlockchain,\n toToken,\n toBlockchain,\n setInputAmount,\n inputAmount,\n inputUsdValue,\n outputAmount,\n outputUsdValue,\n selectedQuote,\n } = useQuoteStore();\n const { connectedWallets, getBalanceFor } = useWalletsStore();\n const fromTokenBalance = fromToken ? getBalanceFor(fromToken) : null;\n const fromTokenFormattedBalance =\n formatBalance(fromTokenBalance)?.amount ?? '0';\n\n const tokenBalanceReal =\n !!fromBlockchain && !!fromToken\n ? numberToString(fromTokenBalance?.amount, fromTokenBalance?.decimals)\n : '0';\n\n const fetchingBalance =\n !!fromBlockchain &&\n isFetchingBalance(connectedWallets, fromBlockchain.name);\n\n const priceImpactInputCanNotBeComputed = !canComputePriceImpact(\n selectedQuote,\n inputAmount,\n inputUsdValue\n );\n\n const priceImpactOutputCanNotBeComputed = !canComputePriceImpact(\n selectedQuote,\n inputAmount,\n outputUsdValue\n );\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPriceImpact(inputUsdValue.toString(), outputUsdValue.toString());\n\n return (\n <Container>\n <FromContainer>\n <SwapInput\n label={i18n.t('From')}\n mode=\"From\"\n onInputChange={setInputAmount}\n balance={fromTokenFormattedBalance}\n chain={{\n displayName: fromBlockchain?.displayName || '',\n image: fromBlockchain?.logo || '',\n }}\n token={{\n displayName: fromToken?.symbol || '',\n image: fromToken?.image || '',\n }}\n onClickToken={() => onClickToken('from')}\n price={{\n value: inputAmount,\n usdValue: priceImpactInputCanNotBeComputed\n ? undefined\n : numberToString(\n inputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realUsdValue: priceImpactInputCanNotBeComputed\n ? undefined\n : inputUsdValue?.toString(),\n error: priceImpactInputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n loadingBalance={fetchingBalance}\n tooltipContainer={getContainer()}\n onSelectMaxBalance={() => {\n setInputAmount(tokenBalanceReal.split(',').join(''));\n }}\n anyWalletConnected={connectedWallets.length > 0}\n />\n <SwitchFromAndToButton />\n </FromContainer>\n <SwapInput\n sharpBottomStyle={!isExpandable && (!!selectedQuote || fetchingQuote)}\n label={i18n.t('To')}\n mode=\"To\"\n fetchingQuote={fetchingQuote}\n chain={{\n displayName: toBlockchain?.displayName || '',\n image: toBlockchain?.logo || '',\n }}\n token={{\n displayName: toToken?.symbol || '',\n image: toToken?.image || '',\n }}\n percentageChange={numberToString(\n getPriceImpact(inputUsdValue, outputUsdValue),\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n warningLevel={getPriceImpactLevel(percentageChange ?? 0)}\n price={{\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: priceImpactOutputCanNotBeComputed\n ? undefined\n : numberToString(\n outputUsdValue,\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n ),\n realValue: outputAmount?.toString(),\n realUsdValue: priceImpactOutputCanNotBeComputed\n ? undefined\n : outputUsdValue?.toString(),\n error: priceImpactOutputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n onClickToken={() => onClickToken('to')}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n tooltipContainer={getContainer()}\n />\n </Container>\n );\n}\n", "import { ReverseIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../../store/quote';\n\nimport {\n ROTATE_ANIMATION_DURATION,\n StyledButton,\n SwitchButtonContainer,\n} from './SwitchFromAndTo.styles';\n\nexport function SwitchFromAndToButton() {\n const switchFromAndTo = useQuoteStore.use.switchFromAndTo();\n\n return (\n <SwitchButtonContainer>\n <StyledButton\n onClick={(event) => {\n const button = event.currentTarget;\n\n button.classList.add('rotate');\n\n setTimeout(() => {\n button.classList.remove('rotate');\n }, ROTATE_ANIMATION_DURATION);\n switchFromAndTo();\n }}>\n <ReverseIcon size={12} />\n </StyledButton>\n </SwitchButtonContainer>\n );\n}\n", "import { keyframes, styled } from '@rango-dev/ui';\n\nexport const ROTATE_ANIMATION_DURATION = 450;\n\nconst rotateAnimation = keyframes({\n '0%': {\n transform: 'rotateX(0deg) rotateY(0deg) rotateZ(0deg)',\n },\n '33%': {\n transform: 'rotateX(0deg) rotateZ(78deg) rotateY(66deg)',\n },\n '66%': {\n transform: 'rotateX(0deg) rotateZ(163deg) rotateY(66deg)',\n },\n '100%': {\n transform: 'rotateX(0deg) rotateZ(180deg) rotateY(0deg)',\n },\n});\n\nexport const SwitchButtonContainer = styled('div', {\n position: 'absolute',\n bottom: '-12px',\n left: '50%',\n transform: 'translate(-50%, 10%)',\n cursor: 'pointer',\n});\n\nexport const StyledButton = styled('div', {\n borderRadius: '$md',\n border: '3px solid $background',\n background: '$neutral100',\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n color: '$foreground',\n '&.rotate': {\n '& svg': {\n animation: `${rotateAnimation} ${ROTATE_ANIMATION_DURATION}ms ease-in-out forwards`,\n },\n },\n '&:hover': {\n color: '$secondary500',\n transform: 'translateY(1px) scale(1.04)',\n boxShadow: '1px 1px 1px 1px rgba(0, 0, 0, 0.05)',\n },\n});\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$5',\n alignSelf: 'stretch',\n});\n\nexport const FromContainer = styled('div', {\n position: 'relative',\n});\n", "import type { Token } from 'rango-sdk';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useWalletsStore } from '../store/wallets';\nimport { QuoteErrorType } from '../types';\nimport { debounce } from '../utils/common';\nimport { isPositiveNumber } from '../utils/numbers';\nimport {\n generateQuoteWarnings,\n getDefaultQuote,\n getQuoteFromTokenUsdPrice,\n getQuoteToTokenUsdPrice,\n sortQuotesBy,\n} from '../utils/quote';\nimport { isFeatureEnabled } from '../utils/settings';\nimport { createQuoteRequestBody } from '../utils/swap';\nimport { areTokensEqual } from '../utils/wallets';\n\nimport {\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap/useConfirmSwap.helpers';\nimport { useFetchAllQuotes } from './useFetchAllQuotes';\n\nconst DEBOUNCE_DELAY = 600;\nconst FIRST_INDEX = 0;\n\ntype FetchQuoteParams = Omit<\n Parameters<typeof createQuoteRequestBody>[typeof FIRST_INDEX],\n 'fromToken' | 'toToken'\n> & { fromToken: Token | null; toToken: Token | null };\n\ntype UseSwapInput = {\n fetch: (shouldChangeSelectedQuote?: boolean) => void;\n loading: boolean;\n};\ntype UseSwapInputProps = {\n refetchQuote: boolean;\n};\n/**\n * a hook for fetching quote based on from and to input values\n * we use this hook in home page\n */\nexport function useSwapInput({\n refetchQuote,\n}: UseSwapInputProps): UseSwapInput {\n const { fetch: fetchQuote, cancelFetch } = useFetchAllQuotes();\n const {\n excludeLiquiditySources: configExcludeLiquiditySources,\n features,\n enableCentralizedSwappers,\n } = useAppStore().config;\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const {\n fromToken,\n toToken,\n inputAmount,\n inputUsdValue,\n selectedQuote,\n sortStrategy,\n resetQuote,\n error,\n warning,\n setSelectedQuote,\n updateQuotePartialState,\n } = useQuoteStore();\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n fetchStatus,\n } = useAppStore();\n const liquiditySources = useAppStore().getLiquiditySources();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const excludeLiquiditySources = useAppStore().excludeLiquiditySources();\n const { findToken } = useAppStore();\n\n const [loading, setLoading] = useState(true);\n const prevInputAmount = useRef(inputAmount);\n const userSlippage = customSlippage ?? slippage;\n const tokensValueInvalid = !fromToken || !toToken;\n const shouldSkipRequest =\n tokensValueInvalid ||\n areTokensEqual(fromToken, toToken) ||\n !isPositiveNumber(inputAmount);\n\n const resetState = (loading: boolean) => {\n setLoading(loading);\n };\n\n const fetch = (params: FetchQuoteParams) => {\n const {\n fromToken,\n toToken,\n inputAmount,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n } = params;\n\n if (!loading) {\n resetState(true);\n }\n if (!shouldSkipRequest && fromToken && toToken) {\n resetQuote();\n const requestBody = createQuoteRequestBody({\n fromToken,\n toToken,\n inputAmount,\n liquiditySources: liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n wallets: connectedWallets,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n enableCentralizedSwappers,\n });\n if (isFeatureEnabled('experimentalRoute', features)) {\n requestBody.experimental = true;\n }\n fetchQuote(requestBody)\n .then((res) => {\n const sortQuotes = sortQuotesBy(sortStrategy, res.results);\n const quote = getDefaultQuote(\n selectedQuote,\n sortQuotes,\n res.requestAmount\n );\n\n setLoading(false);\n updateQuotePartialState('quotes', res);\n setSelectedQuote(quote);\n\n throwErrorIfResponseIsNotValid({\n diagnosisMessages: res.diagnosisMessages,\n requestId: quote?.requestId || '',\n swaps: quote?.swaps,\n });\n const outputUsdValue =\n getQuoteToTokenUsdPrice(quote) || toToken?.usdPrice;\n const inputUsdValue =\n getQuoteFromTokenUsdPrice(quote) || fromToken?.usdPrice;\n const quoteWarning =\n quote &&\n generateQuoteWarnings(quote, {\n fromToken: { ...fromToken, usdPrice: inputUsdValue },\n toToken: { ...toToken, usdPrice: outputUsdValue },\n userSlippage,\n findToken,\n });\n updateQuotePartialState('warning', quoteWarning);\n })\n .catch((error) => {\n const { error: quoteError } = handleQuoteErrors(error);\n if (\n quoteError?.type === QuoteErrorType.NO_RESULT ||\n quoteError?.type === QuoteErrorType.REQUEST_FAILED\n ) {\n resetQuote();\n }\n if (quoteError?.type !== QuoteErrorType.REQUEST_CANCELED) {\n updateQuotePartialState('error', quoteError);\n setLoading(false);\n }\n });\n }\n };\n\n const debouncedFetch = useCallback(\n debounce((params: FetchQuoteParams) => {\n fetch(params);\n }, DEBOUNCE_DELAY),\n [shouldSkipRequest]\n );\n\n useEffect(() => {\n if (!refetchQuote) {\n setLoading(false);\n return;\n }\n if (fetchStatus !== 'success') {\n return;\n }\n if (shouldSkipRequest) {\n setLoading(false);\n if (selectedQuote || error || warning) {\n resetQuote();\n }\n return;\n }\n if (!isPositiveNumber(inputAmount) || inputUsdValue?.eq(0)) {\n resetState(false);\n cancelFetch();\n return;\n }\n\n resetQuote();\n resetState(true);\n\n let fetchQuotes = fetch;\n if (prevInputAmount.current && prevInputAmount.current != inputAmount) {\n fetchQuotes = debouncedFetch;\n }\n prevInputAmount.current = inputAmount;\n\n fetchQuotes({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n });\n return cancelFetch;\n }, [\n fetchStatus,\n inputAmount,\n fromToken?.symbol,\n fromToken?.address,\n fromToken?.blockchain,\n toToken?.symbol,\n toToken?.address,\n toToken?.blockchain,\n shouldSkipRequest,\n liquiditySources?.length,\n configExcludeLiquiditySources,\n disabledLiquiditySources.length,\n userSlippage,\n affiliateRef,\n affiliatePercent,\n JSON.stringify(affiliateWallets),\n ]);\n\n return {\n fetch: () =>\n fetch({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n }),\n loading,\n };\n}\n", "import type { UseFetchResult } from './useFetch';\nimport type { BestRouteRequest, MultiRouteResponse } from 'rango-sdk';\n\nimport { httpService } from '../services/httpService';\n\nimport { useFetch } from './useFetch';\n\nexport function useFetchAllQuotes(): UseFetchResult<\n BestRouteRequest,\n MultiRouteResponse\n> {\n const { fetch, loading, cancelFetch } = useFetch<\n BestRouteRequest,\n MultiRouteResponse\n >({\n request: async (requestBody, options) =>\n await httpService().getAllRoutes(requestBody, options),\n });\n\n return { fetch, loading, cancelFetch };\n}\n", "import { eventEmitter } from '../services/eventEmitter';\nimport { type UiEventData, WidgetEvents } from '../types';\n\ntype UiEvent = {\n type: UiEventData['type'];\n payload?: Omit<UiEventData['payload'], 'preventDefault'>;\n};\n\nexport function emitPreventableEvent(event: UiEvent, action: () => void): void {\n let defaultPrevented = false;\n\n const extendedPayload = {\n preventDefault() {\n defaultPrevented = true;\n },\n ...(event.payload === undefined && { payload: event.payload }),\n };\n\n eventEmitter.emit(WidgetEvents.UiEvent, {\n type: event.type,\n payload: extendedPayload,\n });\n\n if (!defaultPrevented) {\n action();\n }\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Alert,\n Divider,\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { useLanguage } from '../hooks/useLanguage';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\n\nexport function LanguagePage() {\n const { activeLanguage, changeLanguage, languages } = useLanguage();\n const navigateBack = useNavigateBack();\n\n const languageList = languages.map((languageItem) => {\n const { local, label, SVGFlag } = languageItem;\n return {\n id: local,\n value: local,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {label}\n </Typography>\n ),\n onClick: () => {\n changeLanguage(languageItem.local);\n navigateBack();\n },\n end: <Radio value={local} />,\n start: <SVGFlag />,\n };\n });\n\n return (\n <Layout\n header={{\n title: i18n.t('Language'),\n }}>\n <PageContainer>\n <Alert\n type=\"warning\"\n variant=\"alarm\"\n title=\"Important Notice: Machine translations are in use\"\n />\n <Divider size={'8'} />\n <RadioRoot value={activeLanguage}>\n <List\n type={\n <ListItemButton\n title={i18n.t('language')}\n id=\"_\"\n onClick={() => console.log()}\n />\n }\n items={languageList}\n />\n </RadioRoot>\n </PageContainer>\n </Layout>\n );\n}\n", "import type { LanguageItem } from '../constants/languages';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { DEFAULT_LANGUAGE, LANGUAGES } from '../constants/languages';\nimport { useAppStore } from '../store/AppStore';\n\ninterface UseLanguage {\n languages: LanguageItem[];\n defaultLanguage: Language;\n activeLanguage: Language;\n changeLanguage: (language?: Language | null) => void;\n resetLanguage: () => void;\n}\n\nexport function useLanguage(): UseLanguage {\n const { setLanguage, language, config } = useAppStore();\n const languages = LANGUAGES;\n const defaultLanguage = config?.language || DEFAULT_LANGUAGE;\n\n return {\n activeLanguage: language || defaultLanguage,\n languages,\n defaultLanguage,\n changeLanguage: (language) => setLanguage(language || DEFAULT_LANGUAGE),\n resetLanguage: () => setLanguage(null),\n };\n}\n", "import type { UniqueSwappersGroupType } from '../utils/settings';\nimport type { SwapperType } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Checkbox,\n Image,\n ListItemButton,\n NotFound,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { LoadingLiquiditySourceList } from '../components/LoadingLiquiditySourceList';\nimport { SearchInput } from '../components/SearchInput';\nimport {\n LiquiditySourceList,\n LiquiditySourceSuffix,\n NotFoundContainer,\n} from '../components/SettingsContainer';\nimport { useAppStore } from '../store/AppStore';\nimport { containsText } from '../utils/numbers';\nimport { getUniqueSwappersGroups } from '../utils/settings';\n\ninterface PropTypes {\n sourceType: 'Exchanges' | 'Bridges';\n}\n\nexport function LiquiditySourcePage({ sourceType }: PropTypes) {\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const toggleLiquiditySource = useAppStore().toggleLiquiditySource;\n const campaignMode = useAppStore().isInCampaignMode();\n const supportedUniqueSwappersGroups: Array<UniqueSwappersGroupType> =\n getUniqueSwappersGroups(swappers, disabledLiquiditySources);\n\n const types = { Exchanges: i18n.t('Exchanges'), Bridges: i18n.t('Bridges') };\n const validTypes: Array<SwapperType> = [];\n if (sourceType === 'Exchanges') {\n validTypes.push('DEX');\n }\n if (sourceType === 'Bridges') {\n validTypes.push('BRIDGE', 'AGGREGATOR', 'OFF_CHAIN');\n }\n\n const liquiditySources = supportedUniqueSwappersGroups.filter((uniqueItem) =>\n validTypes.includes(uniqueItem.type)\n );\n\n const hasSelectAll =\n liquiditySources.length ===\n liquiditySources.filter((sourceItem) => sourceItem.selected).length;\n\n const toggleAllSources = () => {\n liquiditySources.forEach((sourceItem) => {\n if (hasSelectAll) {\n toggleLiquiditySource(sourceItem.groupTitle);\n } else {\n if (!sourceItem.selected) {\n toggleLiquiditySource(sourceItem.groupTitle);\n }\n }\n });\n };\n\n const list = liquiditySources.map((sourceItem) => {\n const { selected, groupTitle, logo } = sourceItem;\n return {\n start: <Image src={logo} size={22} type=\"circular\" />,\n onClick: () => {\n if (!campaignMode) {\n toggleLiquiditySource(groupTitle);\n }\n },\n end: <Checkbox checked={selected} disabled={campaignMode} />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t(groupTitle)}\n </Typography>\n ),\n ...sourceItem,\n };\n });\n\n const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setSearchedFor(value);\n };\n\n let filteredList = list;\n if (searchedFor) {\n filteredList = list.filter((sourceItem) =>\n containsText(sourceItem.groupTitle, searchedFor)\n );\n }\n\n return (\n <Layout\n header={{\n title: i18n.t(sourceType),\n suffix: (\n <LiquiditySourceSuffix>\n <Button variant=\"ghost\" size=\"xsmall\" onClick={toggleAllSources}>\n {hasSelectAll ? i18n.t('Deselect all') : i18n.t('Select all')}\n </Button>\n </LiquiditySourceSuffix>\n ),\n }}>\n <PageContainer view>\n <SearchInput\n value={searchedFor}\n setValue={setSearchedFor}\n fullWidth\n color=\"light\"\n variant=\"contained\"\n placeholder={i18n.t('Search {sourceType}', {\n sourceType: types[sourceType],\n })}\n onChange={handleSearch}\n />\n {fetchStatus === 'loading' && <LoadingLiquiditySourceList />}\n\n {!filteredList.length && !!searchedFor ? (\n <NotFoundContainer>\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </NotFoundContainer>\n ) : (\n fetchStatus === 'success' && (\n <LiquiditySourceList disabled={campaignMode}>\n {filteredList.map((sourceItem) => {\n const { groupTitle, ...otherProps } = sourceItem;\n\n return (\n <React.Fragment key={sourceItem.id}>\n <ListItemButton\n style={{ height: '61px' }}\n {...otherProps}\n selected={false}\n hasDivider\n />\n </React.Fragment>\n );\n })}\n </LiquiditySourceList>\n )\n )}\n </PageContainer>\n </Layout>\n );\n}\n", "import { Checkbox, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { LiquiditySourceList } from '../SettingsContainer';\n\nimport { CustomListItem } from './LoadingLiquiditySourceList.styles';\n\nconst ITEM_SKELETON_COUNT = 30;\nexport function LoadingLiquiditySourceList() {\n return (\n <LiquiditySourceList>\n {Array.from(Array(ITEM_SKELETON_COUNT), (_, index) => (\n <CustomListItem\n hasDivider\n key={index}\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n title={<Skeleton variant=\"text\" size=\"large\" width={90} />}\n end={<Checkbox checked={false} />}\n />\n ))}\n </LiquiditySourceList>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const LiquiditySourceList = styled('ul', {\n padding: '$15 $5 0',\n margin: 0,\n listStyle: 'none',\n height: '100%',\n overflowY: 'auto',\n variants: {\n disabled: {\n true: {\n pointerEvents: 'none',\n },\n },\n },\n});\n\nexport const LiquiditySourceSuffix = styled('div', {\n width: 80,\n display: 'flex',\n justifyContent: 'flex-end',\n});\n\nexport const NotFoundContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n});\n", "import { ListItem, styled } from '@rango-dev/ui';\n\nexport const CustomListItem = styled(ListItem, {\n height: 61,\n});\n", "import type { SelectedQuote } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HeaderButtons } from '../components/HeaderButtons';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { Quotes } from '../components/Quotes';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useSwapInput } from '../hooks/useSwapInput';\nimport { useQuoteStore } from '../store/quote';\n\nexport function RoutesPage() {\n const navigate = useNavigate();\n const navigateBack = useNavigateBack();\n const {\n selectedQuote,\n refetchQuote,\n setSelectedQuote,\n updateQuotePartialState,\n error: quoteError,\n } = useQuoteStore();\n\n const { fetch: fetchQuote, loading: fetchingQuote } = useSwapInput({\n refetchQuote,\n });\n\n const onClickOnQuote = (quote: SelectedQuote) => {\n setSelectedQuote(quote);\n updateQuotePartialState('refetchQuote', false);\n navigateBack();\n };\n\n const settings_url = `../${navigationRoutes.settings}`;\n const wallets_url = `../${navigationRoutes.wallets}`;\n return (\n <Layout\n header={{\n onWallet: () => {\n navigate(wallets_url);\n updateQuotePartialState('refetchQuote', true);\n },\n onBack: () => {\n updateQuotePartialState('refetchQuote', false);\n },\n title: i18n.t('Routes'),\n suffix: (\n <HeaderButtons\n onClickRefresh={\n !!selectedQuote || quoteError ? fetchQuote : undefined\n }\n hidden={['notifications', 'history']}\n onClickSettings={() => {\n navigate(settings_url);\n updateQuotePartialState('refetchQuote', true);\n }}\n />\n ),\n }}>\n <PageContainer>\n <Quotes\n fetch={fetchQuote}\n loading={fetchingQuote}\n onClickOnQuote={onClickOnQuote}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Divider,\n getCategoriesCount,\n SelectableCategoryList,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { BlockchainList } from '../components/BlockchainList';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\n\ninterface PropTypes {\n type: 'source' | 'destination' | 'custom-token';\n hideCategory?: boolean;\n}\n\nexport function SelectBlockchainPage(props: PropTypes) {\n const { type } = props;\n const navigateBack = useNavigateBack();\n const [searchedFor, setSearchedFor] = useState<string>('');\n const [blockchainCategory, setBlockchainCategory] = useState<string>('ALL');\n const setToBlockchain = useQuoteStore.use.setToBlockchain();\n const setFromBlockchain = useQuoteStore.use.setFromBlockchain();\n const { fetchStatus } = useAppStore();\n const navigate = useNavigate();\n\n const blockchains = useAppStore().blockchains({\n type,\n });\n const activeCategoriesCount = getCategoriesCount(blockchains);\n\n const showCategory = !props.hideCategory && activeCategoriesCount !== 1;\n\n return (\n <Layout\n header={{\n title: i18n.t(`Select Blockchain`),\n }}>\n <PageContainer view>\n {showCategory && (\n <>\n <SelectableCategoryList\n setCategory={setBlockchainCategory}\n category={blockchainCategory}\n blockchains={blockchains}\n isLoading={fetchStatus === 'loading'}\n />\n <Divider size={24} />\n </>\n )}\n\n <SearchInput\n value={searchedFor}\n autoFocus\n placeholder={i18n.t('Search Blockchain')}\n color=\"light\"\n variant=\"contained\"\n size=\"large\"\n setValue={() => setSearchedFor('')}\n onChange={(event) => setSearchedFor(event.target.value)}\n />\n <Divider size={16} />\n\n <BlockchainList\n list={blockchains}\n showTitle={type !== 'custom-token'}\n searchedFor={searchedFor}\n blockchainCategory={blockchainCategory}\n onChange={(blockchain) => {\n if (type === 'custom-token') {\n navigate(`..?blockchain=${blockchain.name}`, { replace: true });\n } else {\n if (type === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n navigateBack();\n }\n }}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "import type { PropTypes } from './BlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n Image,\n ListItemButton,\n NotFound,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { filterBlockchains } from './BlockchainList.helpers';\nimport { BlockchainListContainer, List } from './BlockchainList.styles';\nimport { LoadingBlockchainList } from './LoadingBlockchainList';\n\nexport function BlockchainList(props: PropTypes) {\n const {\n list,\n searchedFor,\n onChange,\n blockchainCategory,\n showTitle = true,\n } = props;\n const [blockchains, setBlockchains] = useState<BlockchainMeta[]>(list);\n const { fetchStatus } = useAppStore();\n\n useEffect(() => {\n setBlockchains([\n ...filterBlockchains(list, searchedFor, blockchainCategory),\n ]);\n }, [list, searchedFor, blockchainCategory]);\n\n const renderList = () => {\n if (!blockchains.length && !!searchedFor) {\n return (\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n );\n }\n return (\n <List as=\"ul\" key={`${blockchainCategory}-${searchedFor}`}>\n {blockchains.map((item) => (\n <ListItemButton\n key={`${item.name}-${item.chainId}`}\n hasDivider\n onClick={() => onChange(item)}\n start={<Image src={item.logo} size={30} />}\n title={\n <Typography variant=\"title\" size=\"medium\">\n {item.displayName}\n </Typography>\n }\n id={item.chainId as string}\n />\n ))}\n </List>\n );\n };\n\n return (\n <>\n {showTitle && (\n <>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={4} />\n </>\n )}\n <BlockchainListContainer>\n {fetchStatus === 'loading' && <LoadingBlockchainList />}\n {fetchStatus === 'success' && renderList()}\n </BlockchainListContainer>\n </>\n );\n}\n", "import { type BlockchainMeta } from 'rango-sdk';\n\nimport { containsText, isBlockchainTypeInCategory } from '../../utils/common';\n\nexport const filterBlockchains = (\n list: BlockchainMeta[],\n searchedFor: string,\n blockchainCategory: string\n) =>\n list\n .filter((blockchain) =>\n isBlockchainTypeInCategory(blockchain.type, blockchainCategory)\n )\n .filter(\n (blockchain) =>\n containsText(blockchain.name, searchedFor) ||\n containsText(blockchain.displayName, searchedFor)\n );\n", "import { ImageContainer, styled } from '@rango-dev/ui';\n\nimport { ScrollableArea } from '../Layout';\n\nexport const BlockchainListContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n height: '100%',\n justifyContent: 'center',\n});\n\nexport const List = styled(ScrollableArea, {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n [`& ${ImageContainer}`]: {\n borderRadius: '$xm',\n overflow: 'hidden',\n },\n});\n", "import { ListItem, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { List } from './BlockchainList.styles';\n\nconst ITEM_SKELETON_COUNT = 20;\nexport function LoadingBlockchainList() {\n return (\n <List>\n {Array.from(Array(ITEM_SKELETON_COUNT), (e) => (\n <ListItem\n key={e}\n hasDivider\n start={<Skeleton variant=\"circular\" width={35} height={35} />}\n title={<Skeleton variant=\"text\" size=\"large\" width={90} />}\n />\n ))}\n </List>\n );\n}\n", "import type { BlockchainMeta, Token } from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { Divider } from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { BlockchainsSection } from '../components/BlockchainsSection';\nimport { Layout, PageContainer } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { TokenList } from '../components/TokenList';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useWalletsStore } from '../store/wallets';\n\ninterface PropTypes {\n type: 'source' | 'destination';\n}\n\nexport function SelectSwapItemsPage(props: PropTypes) {\n const { type } = props;\n const navigate = useNavigate();\n const navigateBack = useNavigateBack();\n const {\n fromBlockchain,\n toBlockchain,\n setFromToken,\n setToToken,\n setFromBlockchain,\n setToBlockchain,\n } = useQuoteStore();\n const getBalanceFor = useWalletsStore.use.getBalanceFor();\n const [searchedFor, setSearchedFor] = useState<string>('');\n\n const selectedBlockchain = type === 'source' ? fromBlockchain : toBlockchain;\n const selectedBlockchainName = selectedBlockchain?.name ?? '';\n\n // Tokens & Blockchains list\n const blockchains = useAppStore().blockchains({\n type,\n });\n const tokens = useAppStore().tokens({\n type,\n blockchain: selectedBlockchainName,\n searchFor: searchedFor,\n getBalanceFor: getBalanceFor,\n });\n\n const updateBlockchain = (blockchain: BlockchainMeta) => {\n if (type === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n };\n\n const updateToken = (token: Token) => {\n if (type === 'source') {\n setFromToken({ token, meta: { blockchains, tokens } });\n } else {\n setToToken({ token, meta: { blockchains, tokens } });\n }\n };\n const types = {\n source: i18n.t('Source'),\n destination: i18n.t('Destination'),\n };\n\n return (\n <Layout\n header={{\n title: i18n.t('Swap {type}', { type: types[type] }),\n }}>\n <PageContainer>\n <BlockchainsSection\n blockchains={blockchains}\n type={type == 'source' ? 'from' : 'to'}\n blockchain={type === 'source' ? fromBlockchain : toBlockchain}\n onMoreClick={() => navigate(navigationRoutes.blockchains)}\n onChange={(blockchain) => {\n updateBlockchain(blockchain);\n }}\n />\n <Divider size={24} />\n <SearchInput\n value={searchedFor}\n autoFocus\n placeholder={i18n.t('Search Token')}\n color=\"light\"\n variant=\"contained\"\n size=\"large\"\n setValue={() => setSearchedFor('')}\n onChange={(event) => setSearchedFor(event.target.value)}\n />\n <Divider size={16} />\n <TokenList\n list={tokens}\n selectedBlockchain={selectedBlockchainName}\n searchedFor={searchedFor}\n type={type}\n onChange={(token) => {\n updateToken(token);\n\n const tokenBlockchain = blockchains.find(\n (chain) => token.blockchain === chain.name\n );\n if (tokenBlockchain) {\n updateBlockchain(tokenBlockchain);\n }\n\n navigateBack();\n }}\n />\n </PageContainer>\n </Layout>\n );\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes } from './BlockchainsSection.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n BlockchainsChip,\n Divider,\n Image,\n Skeleton,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { BLOCKCHAIN_LIST_SIZE } from '../../constants/configs';\nimport { usePrepareBlockchainList } from '../../hooks/usePrepareBlockchainList';\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\nimport { getContainer } from '../../utils/common';\n\nimport { Blockchains } from './BlockchainsSection.styles';\n\nconst NUMBER_OF_LOADING = 12;\n\nexport function BlockchainsSection(props: PropTypes) {\n const { blockchains, type, blockchain, onChange, onMoreClick } = props;\n const blockchainsList = usePrepareBlockchainList(blockchains, {\n limit: BLOCKCHAIN_LIST_SIZE,\n selected: blockchain?.name,\n });\n\n const { fetchStatus } = useAppStore();\n const resetToBlockchain = useQuoteStore.use.resetToBlockchain();\n const resetFromBlockchain = useQuoteStore.use.resetFromBlockchain();\n const hasMoreItemsInList = blockchainsList.more.length > 0;\n /**\n * When only one item is left on list, we will not show the `More` button and will show the item itself instead.\n */\n const onlyOneItemInList = blockchainsList.more.length === 1;\n const showMoreButton = !onlyOneItemInList && hasMoreItemsInList;\n\n return (\n <>\n <Divider size={12} />\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={12} />\n <Blockchains>\n {fetchStatus === 'loading' &&\n Array.from(Array(NUMBER_OF_LOADING), (e) => (\n <Skeleton key={e} variant=\"rounded\" height={50} />\n ))}\n {fetchStatus === 'success' && (\n <>\n <BlockchainsChip\n selected={!blockchain}\n onClick={() => {\n if (type === 'from') {\n resetFromBlockchain();\n } else {\n resetToBlockchain();\n }\n }}>\n <Typography variant=\"body\" size=\"xsmall\" color=\"secondary500\">\n {i18n.t('All')}\n </Typography>\n </BlockchainsChip>\n {blockchainsList.list.map((item) => (\n <Tooltip\n key={item.name}\n content={item.shortName}\n side=\"bottom\"\n sideOffset={2}\n container={getContainer()}>\n <BlockchainsChip\n key={item.name}\n selected={!!blockchain && blockchain.name === item.name}\n onClick={() => onChange(item)}>\n <Image src={item.logo} size={30} />\n </BlockchainsChip>\n </Tooltip>\n ))}\n\n {onlyOneItemInList ? (\n <BlockchainsChip\n key={blockchainsList.more[0].name}\n selected={\n !!blockchain &&\n blockchain.name === blockchainsList.more[0].name\n }\n onClick={() => onChange(blockchainsList.more[0])}>\n <Image src={blockchainsList.more[0].logo} size={30} />\n </BlockchainsChip>\n ) : null}\n\n {showMoreButton ? (\n <BlockchainsChip onClick={onMoreClick} key=\"more-blockchains\">\n <Typography variant=\"body\" size=\"xsmall\" color=\"secondary500\">\n {i18n._('More +{count}', {\n count: blockchainsList.more.length,\n })}\n </Typography>\n </BlockchainsChip>\n ) : null}\n </>\n )}\n </Blockchains>\n </>\n );\n}\n", "import type {\n PrepareListOptions,\n UsePrepareList,\n} from './usePrepareBlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\n\nimport { isInVisibleList, prepare } from './usePrepareBlockchainList.helpers';\n\n/**\n *\n * UI needs some specific logics like limiting the list and sorting,\n * this function is getting the raw blockchains list and return a list for showing in UI.\n *\n */\nexport function usePrepareBlockchainList(\n blockchains: BlockchainMeta[],\n options?: PrepareListOptions\n): UsePrepareList {\n const { preferredBlockchains, addPreferredBlockchain } = useAppStore();\n\n useEffect(() => {\n if (options?.selected) {\n const output = prepare(blockchains, preferredBlockchains, options);\n\n /**\n * We only add a new blockchain to preferred when it's not in the main list\n * In this way we can guarantee we will be able to regenerate the same list always.\n * And also it helps us to avoid jumping for the last item of the main list (e.g. tenth item of our list).\n */\n if (!isInVisibleList(options.selected, output)) {\n addPreferredBlockchain(options?.selected);\n }\n }\n }, [options?.selected]);\n\n const output = prepare(blockchains, preferredBlockchains, options);\n\n return {\n list: output.list,\n more: output.more,\n history: [],\n };\n}\n", "export const MOST_USED_BLOCKCHAINS = ['ETH', 'COSMOS', 'OSMOSIS'];\n", "import type {\n PrepareListOptions,\n PrepareOutput,\n} from './usePrepareBlockchainList.types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { MOST_USED_BLOCKCHAINS } from './usePrepareBlockchainList.constants';\n\nexport function prepare(\n blockchains: BlockchainMeta[],\n preferredBlockchains: string[],\n options?: PrepareListOptions\n): PrepareOutput {\n /*\n * TODO:\n * We copying the `blockchains` which can causes performance penalties but we should because we are mutating the original object.\n * A better way to solve the problem maybe is using new JS features like Use toSpliced() but\n * we can not use it right now because we need to upgrade our toolings first.\n */\n const list: BlockchainMeta[] = JSON.parse(JSON.stringify(blockchains));\n let more: BlockchainMeta[] = [];\n\n list.sort(sortByMostUsedBlockchains);\n\n // Checking `limit` has set and it should be more than of the list items.\n if (!!options?.limit && blockchains.length > options.limit) {\n const start = options.limit;\n let preferredBlockchainsWithoutMainList = preferredBlockchains;\n\n if (preferredBlockchains.length <= options.limit) {\n /**\n *\n * if we want to show 10 items (aka `options.limit`)\n * and have these items as our preferred list: [x,y,z]\n * and these as our main list: [A, B, C, D, E, F, G, H, I, J]\n * the final list will be like this: [...preferred, ...mainList].\n *\n * Since we have a limit (e.g. 10) on our list (preferred + mainList),\n * we only should check those items from main list that will be in final list.\n *\n * finalListWithoutLimit = [x,y,z, A, B, C, D, E, F, G, H, I, J]\n * finalListWithLimit = [x,y,z, A, B, C, D, E, F, G]\n *\n * As you can see, [H, I, J] will not be in our list.\n *\n * The following code only check preffred blockchain\n * shouldn't be in first 7 of 10 items in main list. (Since, the last 3 items will not be in the final list and we should check those.)\n */\n const howManyItemsShouldBeCheckedFromMainList =\n options.limit - preferredBlockchains.length;\n\n for (let i = 0; i <= howManyItemsShouldBeCheckedFromMainList; i++) {\n const blockchain = list[i];\n\n preferredBlockchainsWithoutMainList =\n preferredBlockchainsWithoutMainList.filter((preferredBlockchain) => {\n return blockchain.name !== preferredBlockchain;\n });\n }\n }\n\n list.sort(\n generateSortByPreferredBlockchainsFor(preferredBlockchainsWithoutMainList)\n );\n\n /*\n * Splice will modify the original list and returns the deleted items\n * We use the deleted items as `more`\n */\n more = list.splice(start);\n }\n return {\n list,\n more,\n };\n}\n\n/** There is a hardcoded list of blockchains that we want to show them first in the list. */\nexport function sortByMostUsedBlockchains(\n a: BlockchainMeta,\n b: BlockchainMeta\n) {\n const mostUsed = MOST_USED_BLOCKCHAINS;\n const aIndexInMostUsed = mostUsed.findIndex((token) => token === a.name);\n const bIndexInMostUsed = mostUsed.findIndex((token) => token === b.name);\n const aIsMostUsed = aIndexInMostUsed > -1;\n const bIsMostUsed = bIndexInMostUsed > -1;\n\n if (aIsMostUsed && bIsMostUsed) {\n return aIndexInMostUsed > bIndexInMostUsed ? 1 : -1;\n }\n\n if (aIsMostUsed) {\n return -1;\n }\n\n if (bIsMostUsed) {\n return 1;\n }\n\n return 0;\n}\n\nexport function generateSortByPreferredBlockchainsFor(\n preferredBlockchains: string[]\n) {\n return function sortByPreferred(a: BlockchainMeta, b: BlockchainMeta) {\n const aIndexInPreferred = preferredBlockchains.findIndex(\n (blockchain) => blockchain === a.name\n );\n const bIndexInPreferred = preferredBlockchains.findIndex(\n (blockchain) => blockchain === b.name\n );\n\n const aIsPreferred = aIndexInPreferred > -1;\n const bIsPreferred = bIndexInPreferred > -1;\n\n if (aIsPreferred && bIsPreferred) {\n return aIndexInPreferred > bIndexInPreferred ? 1 : -1;\n }\n\n if (preferredBlockchains.includes(a.name)) {\n return -1;\n }\n if (preferredBlockchains.includes(b.name)) {\n return 1;\n }\n\n return 0;\n };\n}\n\nexport function isInVisibleList(\n blockchain: string,\n prepareOutput: PrepareOutput\n): boolean {\n return !!prepareOutput.list.find((item) => item.name === blockchain);\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Blockchains = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: 'repeat(6, minmax(0, 1fr))',\n});\n", "import { i18n } from '@lingui/core';\nimport { Alert, Button, styled } from '@rango-dev/ui';\nimport React from 'react';\nimport { useInRouterContext, useSearchParams } from 'react-router-dom';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { Slippage } from '../components/Slippage';\nimport { SearchParams } from '../constants/searchParams';\nimport { SettingsLists } from '../containers/Settings/Lists';\nimport { useAppStore } from '../store/AppStore';\n\nconst ResetAction = styled('div', {\n paddingLeft: '$8',\n});\n\nexport function SettingsPage() {\n const { isInCampaignMode, updateCampaignMode } = useAppStore();\n const campaignMode = isInCampaignMode();\n\n const [, setSearchParams] = useSearchParams();\n const isRouterInContext = useInRouterContext();\n\n const onClick = () => {\n if (isRouterInContext && campaignMode) {\n setSearchParams(\n (prev) => {\n prev.delete(SearchParams.LIQUIDITY_SOURCES);\n return prev;\n },\n { replace: true }\n );\n updateCampaignMode('liquiditySources', undefined);\n }\n };\n return (\n <Layout\n header={{\n title: i18n.t('Settings'),\n }}>\n <PageContainer>\n {campaignMode && (\n <Alert\n type=\"info\"\n variant=\"alarm\"\n title={i18n.t(\n \"Currently, you're in campaign mode with restrictions on liquidity sources. Would you like to switch out of this mode and make use of all available liquidity sources?\"\n )}\n action={\n <ResetAction>\n <Button type=\"secondary\" size=\"small\" onClick={onClick}>\n {i18n.t('Reset')}\n </Button>\n </ResetAction>\n }\n />\n )}\n <Slippage />\n <SettingsLists />\n </PageContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Divider,\n InfoIcon,\n SlippageIcon,\n TextField,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n MAX_SLIPPAGE,\n MIN_SLIPPGAE,\n SLIPPAGES,\n} from '../../constants/swapSettings';\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\n\nimport {\n BaseContainer,\n Head,\n SlippageChip,\n SlippageChipsContainer,\n} from './Slippage.styles';\nimport { SlippageTooltipContent } from './SlippageTooltipContent';\n\nexport function Slippage() {\n const { slippage, setSlippage, customSlippage, setCustomSlippage } =\n useAppStore();\n\n return (\n <BaseContainer>\n <Head>\n <SlippageIcon size={16} color=\"gray\" />\n <Divider direction=\"horizontal\" size={4} />\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Slippage tolerance per swap')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tooltip\n container={getContainer()}\n side=\"top\"\n sideOffset={4}\n content={<SlippageTooltipContent />}>\n <InfoIcon color=\"gray\" />\n </Tooltip>\n </Head>\n <SlippageChipsContainer>\n {SLIPPAGES.map((slippageItem, index) => {\n const key = `slippage-${index}`;\n return (\n <SlippageChip\n key={key}\n onClick={() => {\n if (customSlippage) {\n setCustomSlippage(null);\n }\n setSlippage(slippageItem);\n }}\n selected={!customSlippage && slippageItem === slippage}\n label={`${slippageItem.toString()}%`}\n />\n );\n })}\n <TextField\n type=\"number\"\n min=\"0.01\"\n max=\"30\"\n step=\"0.01\"\n fullWidth\n variant=\"contained\"\n value={customSlippage === null ? '' : customSlippage}\n color=\"dark\"\n onChange={(event) => {\n const value = event.target.value;\n const parsedValue = parseFloat(value);\n if (parsedValue >= MIN_SLIPPGAE && parsedValue <= MAX_SLIPPAGE) {\n setCustomSlippage(parsedValue);\n } else {\n setCustomSlippage(null);\n }\n }}\n suffix={\n customSlippage && (\n <Typography variant=\"body\" size=\"small\">\n %\n </Typography>\n )\n }\n placeholder={i18n.t('Custom')}\n />\n </SlippageChipsContainer>\n </BaseContainer>\n );\n}\n", "import { Chip, styled, TextField } from '@rango-dev/ui';\n\nexport const BaseContainer = styled('div', {\n paddingTop: '$5',\n padding: '$10 $5',\n});\n\nexport const SlippageChipsContainer = styled('div', {\n display: 'flex',\n flexWrap: 'wrap',\n gap: '$10',\n [`& ${TextField}`]: {\n flex: '1 1 0',\n maxWidth: '127px',\n minWidth: '85px',\n },\n});\n\nexport const Head = styled('div', {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n paddingBottom: '$10',\n});\n\nexport const SlippageTooltipContainer = styled('div', {\n maxWidth: '280px',\n padding: '$10',\n});\n\nexport const SlippageChip = styled(Chip, {\n width: '61px',\n flexShrink: 0,\n});\n", "import { i18n } from '@lingui/core';\nimport { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SlippageTooltipContainer } from './Slippage.styles';\n\nexport function SlippageTooltipContent() {\n return (\n <SlippageTooltipContainer>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral700\">\n {i18n.t(\n 'Your transaction will be reverted if the price changes unfavorably by more than this percentage'\n )}\n <br />\n <br />\n <b>{i18n.t('Warning')}</b>:\n {i18n.t(\n 'This setting is applied per step (e.g. 1Inch, Thorchain, etc) which means only the step will be reverted, not the whole transaction.'\n )}\n </Typography>\n </SlippageTooltipContainer>\n );\n}\n", "import type { ThemeMode } from '../../store/slices/settings';\nimport type { ListPropTypes, SvgIconProps } from '@rango-dev/ui';\n\nimport { i18n } from '@lingui/core';\nimport {\n AutoThemeIcon,\n BridgesIcon,\n ChevronRightIcon,\n DarkModeIcon,\n Divider,\n ExchangeIcon,\n InfinityIcon,\n InfoIcon,\n LanguageIcon,\n LightModeIcon,\n List,\n ListItem,\n ListItemButton,\n Skeleton,\n styled,\n Switch,\n Tabs,\n TargetIcon,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { SlippageTooltipContainer as TooltipContainer } from '../../components/Slippage/Slippage.styles';\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { ThemeModeEnum } from '../../constants/settings';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useAppStore } from '../../store/AppStore';\nimport { getContainer } from '../../utils/common';\nimport { getUniqueSwappersGroups, isFeatureHidden } from '../../utils/settings';\n\nconst ThemeSection = styled('div', {\n width: '202px',\n height: '$40',\n});\n\nconst themesList = [\n {\n id: ThemeModeEnum.LIGHT,\n icon: <LightModeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Light')}\n </Typography>\n ),\n },\n {\n id: ThemeModeEnum.DARK,\n icon: <DarkModeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Dark')}\n </Typography>\n ),\n },\n {\n id: ThemeModeEnum.AUTO,\n icon: <AutoThemeIcon color=\"black\" size={24} />,\n tooltip: (\n <Typography size=\"xsmall\" variant=\"body\">\n {i18n.t('Auto')}\n </Typography>\n ),\n },\n];\n\nconst getThemeIcon = (theme: ThemeMode) => {\n const iconProps: SvgIconProps = { color: 'gray', size: 16 };\n\n switch (theme) {\n case 'auto':\n return <AutoThemeIcon {...iconProps} />;\n case 'dark':\n return <DarkModeIcon {...iconProps} />;\n default:\n return <LightModeIcon {...iconProps} />;\n }\n};\n\nexport function SettingsLists() {\n const navigate = useNavigate();\n const { theme: themeConfig } = useAppStore().config;\n const { setTheme, theme } = useAppStore();\n const { activeLanguage, languages } = useLanguage();\n const currentLanguage = languages.find(\n (language) => language.local === activeLanguage\n )?.label;\n\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n const disabledLiquiditySources = useAppStore().getDisabledLiquiditySources();\n const {\n config: { features },\n } = useAppStore();\n const customTokens = useAppStore().customTokens();\n const isThemeHidden = isFeatureHidden('theme', features);\n const isLiquidityHidden = isFeatureHidden('liquiditySource', features);\n const isLanguageHidden = isFeatureHidden('language', features);\n const isCustomTokensHidden = isFeatureHidden('customTokens', features);\n\n const infiniteApprove = useAppStore().infiniteApprove;\n const toggleInfiniteApprove = useAppStore().toggleInfiniteApprove;\n\n const supportedUniqueSwappersGroups = getUniqueSwappersGroups(\n swappers,\n disabledLiquiditySources\n );\n\n const bridgeSources = supportedUniqueSwappersGroups.filter((uniqueItem) =>\n ['BRIDGE', 'AGGREGATOR', 'OFF_CHAIN'].includes(uniqueItem.type)\n );\n\n const totalBridgeSources = bridgeSources.length;\n const totalSelectedBridgeSources = bridgeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const exchangeSources = supportedUniqueSwappersGroups.filter(\n (uniqueItem) => uniqueItem.type === 'DEX'\n );\n\n const totalExchangeSources = exchangeSources.length;\n const totalSelectedExchangeSources = exchangeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const handleSwapperEndItem = (totalSelected: number, total: number) => {\n switch (fetchStatus) {\n case 'loading':\n return <Skeleton variant=\"text\" size=\"medium\" width={50} />;\n case 'failed':\n return (\n <Typography variant=\"body\" size=\"medium\" color=\"$error500\">\n {i18n.t('Loading failed')}\n </Typography>\n );\n default:\n return (\n <Typography variant=\"body\" size=\"medium\">\n {`${totalSelected} / ${total}`}\n </Typography>\n );\n }\n };\n\n const bridgeItem = {\n id: 'bridge-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Bridges')}\n </Typography>\n ),\n end: (\n <>\n {handleSwapperEndItem(totalSelectedBridgeSources, totalBridgeSources)}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.bridges),\n start: <BridgesIcon color=\"gray\" size={16} />,\n };\n\n const exchangeItem = {\n id: 'exchange-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Exchanges')}\n </Typography>\n ),\n end: (\n <>\n {handleSwapperEndItem(\n totalSelectedExchangeSources,\n totalExchangeSources\n )}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n start: <ExchangeIcon color=\"gray\" size={16} />,\n onClick: () => navigate(navigationRoutes.exchanges),\n };\n\n const customTokensItem = {\n id: 'custom-tokens-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Custom Tokens')}\n </Typography>\n ),\n end: (\n <>\n <Typography variant=\"body\" size=\"medium\">\n {`${customTokens.length}`}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n start: <TargetIcon color=\"gray\" size={16} />,\n onClick: () => navigate(navigationRoutes.customTokens),\n };\n const languageItem = {\n id: 'language-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Language')}\n </Typography>\n ),\n start: <LanguageIcon color=\"gray\" size={16} />,\n end: (\n <>\n <Typography variant=\"body\" size=\"medium\">\n {currentLanguage}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.languages),\n };\n\n const infiniteApprovalItem = {\n id: 'infinite-approval-item',\n title: (\n <>\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Infinite approval')}\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Tooltip\n side=\"top\"\n sideOffset={4}\n container={getContainer()}\n content={\n <TooltipContainer>\n <Typography variant=\"label\" size=\"medium\" color=\"neutral700\">\n {i18n.t(\n \"Enabling the 'Infinite approval' mode grants unrestricted access to smart contracts of DEXes/Bridges, allowing them to utilize the approved token amount without limitations.\"\n )}\n </Typography>\n </TooltipContainer>\n }>\n <InfoIcon color=\"gray\" />\n </Tooltip>\n </>\n ),\n start: <InfinityIcon color=\"gray\" size={16} />,\n end: <Switch checked={infiniteApprove} />,\n onClick: toggleInfiniteApprove,\n };\n\n const themeItem = {\n id: 'theme-item',\n type: <ListItem />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Theme')}\n </Typography>\n ),\n end: (\n <ThemeSection>\n <Tabs\n container={getContainer()}\n items={themesList}\n value={theme}\n onChange={(item) => setTheme(item.id as ThemeMode)}\n type=\"primary\"\n borderRadius=\"small\"\n />\n </ThemeSection>\n ),\n start: getThemeIcon(theme),\n };\n\n const settingItems: ListPropTypes['items'] = isLiquidityHidden\n ? []\n : [bridgeItem, exchangeItem];\n if (!isCustomTokensHidden) {\n settingItems.push(customTokensItem);\n }\n if (!isLanguageHidden) {\n settingItems.push(languageItem);\n }\n settingItems.push(infiniteApprovalItem);\n\n if (!themeConfig?.singleTheme && !isThemeHidden) {\n settingItems.push(themeItem);\n }\n\n return (\n <List\n type={<ListItemButton hasDivider id=\"_\" onClick={() => console.log()} />}\n items={settingItems}\n />\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { cancelSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { Alert } from '@rango-dev/ui';\nimport React from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport { SwapDetails } from '../components/SwapDetails';\nimport { SwapDetailsPlaceholder } from '../components/SwapDetails/SwapDetails.Placeholder';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { getPendingSwaps } from '../utils/queue';\n\nexport function SwapDetailsPage() {\n const { manager, state } = useManager();\n const loading = !state.loadedFromPersistor;\n const pendingSwaps = getPendingSwaps(manager);\n const { requestId } = useParams<{ requestId: string }>();\n const navigateBack = useNavigateBack();\n const { fetchStatus: fetchMetaStatus } = useAppStore();\n\n if (!requestId) {\n return (\n <Alert\n containerStyles={{ margin: '20px' }}\n type=\"error\"\n title={i18n.t(\n 'The request ID is necessary to display the swap details.'\n )}\n />\n );\n }\n\n const showSkeleton = loading || fetchMetaStatus === 'loading';\n\n const selectedSwap = requestId\n ? pendingSwaps.find(({ swap }) => swap.requestId === requestId)\n : undefined;\n\n const onCancel = () => {\n if (selectedSwap?.id) {\n const swap = manager?.get(selectedSwap.id);\n if (swap) {\n cancelSwap(swap);\n }\n }\n };\n\n const onDelete = async () => {\n if (selectedSwap?.id) {\n try {\n manager?.deleteQueue(selectedSwap.id);\n navigateBack();\n } catch (e) {\n console.log(e);\n }\n }\n };\n const swap = selectedSwap?.swap;\n\n if (!swap || showSkeleton) {\n return (\n <SwapDetailsPlaceholder\n requestId={requestId}\n showSkeleton={showSkeleton}\n />\n );\n }\n\n return (\n <SwapDetails\n swap={swap}\n requestId={requestId}\n onCancel={onCancel}\n onDelete={onDelete}\n />\n );\n}\n", "import type { SwapDetailsProps } from './SwapDetails.types';\nimport type { ModalState } from '../SwapDetailsModal';\n\nimport { i18n } from '@lingui/core';\nimport {\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n Button,\n CopyIcon,\n Divider,\n DoneIcon,\n IconButton,\n QuoteCost,\n RangoExplorerIcon,\n StepDetails,\n Tooltip,\n Typography,\n useCopyToClipboard,\n} from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport BigNumber from 'bignumber.js';\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { SCANNER_BASE_URL } from '../../constants';\nimport {\n GAS_FEE_MAX_DECIMALS,\n GAS_FEE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS,\n USD_VALUE_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useQuoteStore } from '../../store/quote';\nimport { useUiStore } from '../../store/ui';\nimport { getContainer } from '../../utils/common';\nimport {\n numberToString,\n roundedSecondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport {\n createRetryQuote,\n getPriceImpact,\n getPriceImpactLevel,\n} from '../../utils/quote';\nimport {\n getLastConvertedTokenInFailedSwap,\n getSwapMessages,\n shouldRetrySwap,\n} from '../../utils/swap';\nimport { getSwapDate } from '../../utils/time';\nimport { getConciseAddress } from '../../utils/wallets';\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout, PageContainer } from '../Layout';\nimport { QuoteSummary } from '../Quote';\nimport {\n SwapDetailsCompleteModal,\n SwapDetailsModal,\n} from '../SwapDetailsModal';\n\nimport { getSteps, getStepState, RESET_INTERVAL } from './SwapDetails.helpers';\nimport {\n ErrorMessages,\n HeaderDetails,\n MessageText,\n outputStyles,\n requestIdStyles,\n rowStyles,\n StepsList,\n StyledLink,\n titleStepsStyles,\n} from './SwapDetails.styles';\n\nexport function SwapDetails(props: SwapDetailsProps) {\n const { swap, requestId, onDelete, onCancel: onCancelProps } = props;\n const { canSwitchNetworkTo, connect, getWalletInfo } = useWallets();\n const blockchains = useAppStore().blockchains();\n const swappers = useAppStore().swappers();\n const { findToken } = useAppStore();\n const retry = useQuoteStore.use.retry();\n const isActiveTab = useUiStore.use.isActiveTab();\n const navigate = useNavigate();\n const [isCopied, handleCopy] = useCopyToClipboard(RESET_INTERVAL);\n const listRef = useRef<HTMLDivElement | null>(null);\n const [modalState, setModalState] = useState<ModalState>(null);\n const [showCompletedModal, setShowCompletedModal] = useState<\n 'success' | 'failed' | null\n >(null);\n\n const onCancel = () => {\n onCancelProps();\n setModalState(null);\n };\n\n const getNotifications = useNotificationStore.use.getNotifications();\n const removeNotification = useNotificationStore.use.removeNotification();\n const notifications = getNotifications();\n const currentStep = getCurrentStep(swap);\n const currentStepNetworkStatus = currentStep?.networkStatus;\n\n useEffect(() => {\n const existNotification = notifications.find(\n (n) => n.requestId === swap.requestId\n );\n if (existNotification) {\n if (swap.status === 'success' || swap.status === 'failed') {\n setShowCompletedModal(swap.status);\n removeNotification(swap.requestId);\n } else if (showCompletedModal) {\n setShowCompletedModal(null);\n }\n }\n }, [swap.status, swap.requestId]);\n\n useEffect(() => {\n if (showSwitchNetwork) {\n setModalState(PendingSwapNetworkStatus.WaitingForNetworkChange);\n } else if (\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n currentStepNetworkStatus === PendingSwapNetworkStatus.NetworkChanged\n ) {\n setModalState(currentStepNetworkStatus);\n } else {\n setModalState(null);\n }\n }, [currentStepNetworkStatus]);\n\n const lastConvertedTokenInFailedSwap =\n getLastConvertedTokenInFailedSwap(swap);\n\n const currentStepBlockchain = currentStep\n ? getCurrentBlockchainOfOrNull(swap, currentStep)\n : null;\n const currentStepWallet = currentStep\n ? getRelatedWalletOrNull(swap, currentStep)\n : null;\n\n const swapDate = getSwapDate(swap);\n const shouldRetry = shouldRetrySwap(swap);\n\n const isMobileWallet = (walletType: string): boolean =>\n !!getWalletInfo(walletType)?.mobileWallet;\n\n const showSwitchNetwork =\n currentStepNetworkStatus ===\n PendingSwapNetworkStatus.WaitingForNetworkChange &&\n !!currentStepBlockchain &&\n !!currentStepWallet?.walletType &&\n (isMobileWallet(currentStepWallet.walletType) ||\n canSwitchNetworkTo(currentStepWallet.walletType, currentStepBlockchain));\n\n const switchNetwork = showSwitchNetwork\n ? connect.bind(null, currentStepWallet.walletType, currentStepBlockchain)\n : undefined;\n\n const stepMessage = getSwapMessages(swap, currentStep);\n const steps = getSteps({\n swap,\n switchNetwork,\n showNetworkModal: currentStepNetworkStatus,\n setNetworkModal: setModalState,\n message: stepMessage,\n blockchains: blockchains,\n swappers,\n });\n const numberOfSteps = steps.length;\n const [firstStep, lastStep] = [swap.steps[0], swap.steps[numberOfSteps - 1]];\n const outputAmount =\n lastStep.outputAmount || lastStep.expectedOutputAmountHumanReadable;\n\n const totalFee = swap.steps.reduce(\n (totalFee, steps) => totalFee + parseFloat(steps.feeInUsd || ''),\n 0\n );\n\n const diagnosisUrl = swap.steps.find(\n (step) => step.diagnosisUrl\n )?.diagnosisUrl;\n\n const outputUsdValue = numberToString(\n parseFloat(outputAmount || '0') * (lastStep.toUsdPrice || 0),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const inputUsdValue = numberToString(\n parseFloat(swap.inputAmount) * (firstStep.fromUsdPrice || 0),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const realOutputUsdValue = outputAmount\n ? new BigNumber(outputAmount)\n .multipliedBy(lastStep.toUsdPrice || 0)\n .toString()\n : '';\n\n const realInputUsdValue = new BigNumber(swap.inputAmount)\n .multipliedBy(firstStep.fromUsdPrice || 0)\n .toString();\n\n const percentageChange = getPriceImpact(inputUsdValue, outputUsdValue);\n\n const stepDetailMessage =\n stepMessage.detailedMessage.content || stepMessage.shortMessage;\n\n const completeModalDesc =\n swap.status === 'success' ? (\n i18n.t({\n id: 'You have received {amount} {token} in {conciseAddress} wallet on {chain} chain.',\n values: {\n amount: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n token: steps[numberOfSteps - 1].to.token.displayName,\n conciseAddress: getConciseAddress(\n swap.wallets[steps[numberOfSteps - 1].to.chain.displayName]\n ?.address || ''\n ),\n chain: steps[numberOfSteps - 1].to.chain.displayName,\n },\n })\n ) : (\n <ErrorMessages>\n <Typography\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\"\n align=\"center\">\n {!stepDetailMessage ? i18n.t('Transaction was not sent.') : ''}\n {lastConvertedTokenInFailedSwap\n ? `${i18n.t({\n id: '{amount} {symbol} on {blockchain} remain in your wallet',\n values: {\n amount: lastConvertedTokenInFailedSwap.outputAmount,\n symbol: lastConvertedTokenInFailedSwap.symbol,\n blockchain: lastConvertedTokenInFailedSwap.blockchain,\n },\n })}`\n : ''}\n </Typography>\n {stepDetailMessage && (\n <MessageText\n align=\"center\"\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\">\n <b>Reason:</b> {stepDetailMessage}\n </MessageText>\n )}\n </ErrorMessages>\n );\n\n return (\n <Layout\n header={{\n title: i18n.t('Swap Details'),\n onCancel:\n swap.status === 'running' ? () => setModalState('cancel') : undefined,\n suffix: swap.status !== 'running' && (\n <SuffixContainer>\n <Button\n variant=\"ghost\"\n type=\"error\"\n size=\"xsmall\"\n onClick={() => setModalState('delete')}>\n <Typography size=\"medium\" variant=\"label\" color=\"error\">\n {i18n.t('Delete')}\n </Typography>\n </Button>\n </SuffixContainer>\n ),\n }}\n footer={\n shouldRetry &&\n !showCompletedModal && (\n <Button\n fullWidth\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => {\n const swapInput = createRetryQuote(swap, blockchains, findToken);\n retry(swapInput);\n setTimeout(() => {\n const home = '../../';\n navigate(home);\n }, 0);\n }}>\n {i18n.t('Try again')}\n </Button>\n )\n }>\n <PageContainer compact view>\n <HeaderDetails>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className={requestIdStyles()}>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {requestId}\n </Typography>\n <Tooltip\n container={getContainer()}\n content={\n isCopied\n ? i18n.t('Copied To Clipboard')\n : i18n.t('Copy Request ID')\n }\n open={isCopied || undefined}\n side=\"bottom\"\n alignOffset={-16}\n align=\"end\">\n <IconButton\n variant=\"ghost\"\n onClick={handleCopy.bind(null, requestId || '')}>\n {isCopied ? (\n <DoneIcon size={16} color=\"secondary\" />\n ) : (\n <CopyIcon size={16} color=\"gray\" />\n )}\n </IconButton>\n </Tooltip>\n\n <StyledLink\n target=\"_blank\"\n href={`${SCANNER_BASE_URL}/swap/${requestId}`}>\n <Tooltip\n container={getContainer()}\n content={i18n.t('View on Rango Explorer')}\n side=\"bottom\">\n <RangoExplorerIcon size={20} />\n </Tooltip>\n </StyledLink>\n </div>\n </div>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {swap.finishTime ? i18n.t('Finished at') : i18n.t('Created at')}\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {swapDate}\n </Typography>\n </div>\n </HeaderDetails>\n\n <div className={outputStyles()}>\n <QuoteCost\n fee={numberToString(\n String(totalFee),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n time={roundedSecondsToString(totalArrivalTime(swap.steps))}\n steps={numberOfSteps}\n />\n <QuoteSummary\n from={{\n price: {\n value: numberToString(\n swap.inputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: inputUsdValue,\n realUsdValue: realInputUsdValue,\n realValue: swap.inputAmount,\n },\n token: {\n displayName: steps[0].from.token.displayName,\n image: steps[0].from.token.image,\n },\n chain: {\n image: steps[0].from.chain.image,\n displayName: steps[0].from.chain.displayName,\n },\n }}\n to={{\n price: {\n value: numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n usdValue: outputUsdValue,\n realUsdValue: realOutputUsdValue,\n realValue: outputAmount || '',\n },\n token: {\n displayName: steps[numberOfSteps - 1].to.token.displayName,\n image: steps[numberOfSteps - 1].to.token.image,\n },\n chain: {\n image: steps[numberOfSteps - 1].to.chain.image,\n displayName: steps[numberOfSteps - 1].to.chain.displayName,\n },\n }}\n percentageChange={numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n warningLevel={getPriceImpactLevel(percentageChange ?? 0)}\n />\n </div>\n <div className={titleStepsStyles()}>\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n <Divider size={8} />\n <StepsList ref={listRef}>\n {steps.map((step, index) => {\n const key = index;\n const state = getStepState(swap.steps[index]);\n const isFocused =\n state === 'error' ||\n state === 'in-progress' ||\n state === 'warning' ||\n (state === 'completed' && index === steps.length - 1);\n return (\n <StepDetails\n key={key}\n step={step}\n type=\"swap-progress\"\n ref={listRef}\n state={state}\n hasSeparator={index !== 0}\n tabIndex={key}\n isFocused={isFocused}\n tooltipContainer={getContainer()}\n />\n );\n })}\n </StepsList>\n </PageContainer>\n\n <SwapDetailsModal\n state={modalState}\n onClose={() => setModalState(null)}\n onCancel={onCancel}\n onDelete={onDelete}\n message={stepMessage.detailedMessage.content}\n currentStepWallet={currentStepWallet}\n walletButtonDisabled={!isActiveTab}\n />\n <SwapDetailsCompleteModal\n open={!!showCompletedModal}\n diagnosisUrl={diagnosisUrl}\n onClose={() => setShowCompletedModal(null)}\n status={swap.status === 'success' ? 'success' : 'failed'}\n priceValue={numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )}\n usdValue={outputUsdValue}\n realUsdValue={realOutputUsdValue}\n realValue={outputAmount || ''}\n percentageChange={numberToString(\n percentageChange,\n PERCENTAGE_CHANGE_MIN_DECIMALS,\n PERCENTAGE_CHANGE_MAX_DECIMALS\n )}\n token={{\n displayName: steps[numberOfSteps - 1].to.token.displayName,\n image: steps[numberOfSteps - 1].to.token.image,\n }}\n chain={{ image: steps[numberOfSteps - 1].to.chain.image }}\n description={completeModalDesc}\n />\n </Layout>\n );\n}\n", "import type { PendingSwap } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\n\nconst daysOfWeek = [\n i18n.t('Sunday'),\n i18n.t('Monday'),\n i18n.t('Tuesday'),\n i18n.t('Wednesday'),\n i18n.t('Thursday'),\n i18n.t('Friday'),\n i18n.t('Saturday'),\n];\n\nexport function timeSince(millisecond: number) {\n const date = new Date(millisecond);\n const day = date.getDate();\n const month = date.toLocaleString('default', { month: 'long' });\n const year = date.getFullYear();\n const isToday = date.getDay() === new Date().getDay();\n const formattedDate = isToday\n ? i18n.t('Today')\n : `${daysOfWeek[date.getDay()]} ${day} ${month} ${year}`;\n\n return `${formattedDate}, ${new Date(millisecond).toLocaleTimeString()}`;\n}\n\nexport function getSwapDate(pendingSwap: PendingSwap) {\n const time = pendingSwap.finishTime\n ? timeSince(parseInt(pendingSwap.finishTime))\n : timeSince(parseInt(pendingSwap.creationTime));\n return time;\n}\n", "import type { ModalPropTypes } from './SwapDetailsModal.types';\n\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React from 'react';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nimport { CancelContent } from './SwapDetailsModal.Cancel';\nimport { DeleteContent } from './SwapDetailsModal.Delete';\nimport { modalNetworkValues } from './SwapDetailsModal.helpers';\nimport { WalletStateContent } from './SwapDetailsModal.WalletState';\n\nexport function SwapDetailsModal(props: ModalPropTypes) {\n const {\n state,\n onClose,\n onDelete,\n onCancel,\n currentStepWallet,\n message,\n walletButtonDisabled,\n } = props;\n\n const showWalletStateContent =\n state === PendingSwapNetworkStatus.WaitingForNetworkChange ||\n state === PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n state === PendingSwapNetworkStatus.NetworkChanged;\n\n return (\n <WatermarkedModal\n open={!!state}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n {showWalletStateContent && (\n <WalletStateContent\n type={modalNetworkValues[state].type}\n title={modalNetworkValues[state].title}\n currentStepWallet={currentStepWallet}\n message={message}\n walletButtonDisabled={walletButtonDisabled}\n showWalletButton={\n state !== PendingSwapNetworkStatus.WaitingForNetworkChange\n }\n />\n )}\n {state === 'delete' && (\n <DeleteContent onClose={onClose} onDelete={onDelete} />\n )}\n {state === 'cancel' && (\n <CancelContent onClose={onClose} onCancel={onCancel} />\n )}\n </WatermarkedModal>\n );\n}\n", "import type { CancelContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const CancelContent = ({ onCancel, onClose }: CancelContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Cancel Swap')}\n description={i18n.t('Are you sure you want to cancel this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onCancel}>\n {i18n.t('Yes, Cancel it')}\n </Button>\n <Divider size={12} />\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n {i18n.t('No, Continue')}\n </Button>\n </>\n );\n};\n", "import type { DeleteContentProps } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nexport const DeleteContent = ({ onDelete, onClose }: DeleteContentProps) => {\n return (\n <>\n <Divider size={20} />\n <MessageBox\n type=\"error\"\n title={i18n.t('Delete Transaction')}\n description={i18n.t('Are you sure you want to delete this swap?')}\n />\n <Divider size={32} />\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={onDelete}>\n {i18n.t('Yes, Delete it')}\n </Button>\n <Divider size={12} />\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('No, Cancel')}\n </Typography>\n </Button>\n </>\n );\n};\n", "import type { ModalNetworkValueTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { PendingSwapNetworkStatus } from 'rango-types';\n\nexport const modalNetworkValues: Record<\n Exclude<PendingSwapNetworkStatus, PendingSwapNetworkStatus.WaitingForQueue>,\n ModalNetworkValueTypes\n> = {\n [PendingSwapNetworkStatus.WaitingForNetworkChange]: {\n type: 'loading',\n title: i18n.t('Change Network'),\n },\n [PendingSwapNetworkStatus.WaitingForConnectingWallet]: {\n type: 'warning',\n title: i18n.t('Connect Wallet'),\n },\n [PendingSwapNetworkStatus.NetworkChanged]: {\n type: 'success',\n title: i18n.t('Network Changed'),\n },\n};\n", "import type { WalletStateContentProps } from './SwapDetailsModal.types';\nimport type { WalletInfoWithExtra } from '../../types';\n\nimport { warn } from '@rango-dev/logging-core';\nimport { MessageBox, Wallet } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React, { useState } from 'react';\n\nimport { useWalletList } from '../../hooks/useWalletList';\nimport { getContainer } from '../../utils/common';\nimport { mapStatusToWalletState } from '../../utils/wallets';\nimport { StatefulConnectModal } from '../StatefulConnectModal';\n\nimport { WalletContainer } from './SwapDetailsModal.styles';\n\nexport const WalletStateContent = (props: WalletStateContentProps) => {\n const {\n type,\n title,\n currentStepWallet,\n message,\n showWalletButton,\n walletButtonDisabled,\n } = props;\n const [selectedWalletToConnect, setSelectedWalletToConnect] =\n useState<WalletInfoWithExtra>();\n const { getWalletInfo, state } = useWallets();\n const walletType = currentStepWallet?.walletType;\n const walletState = walletType\n ? mapStatusToWalletState(state(walletType))\n : null;\n const walletInfo = walletType ? getWalletInfo(walletType) : null;\n const shouldShowWallet =\n showWalletButton && !!walletType && !!walletState && !!walletInfo;\n const { list } = useWalletList();\n\n const handleWalletItemClick = () => {\n if (!!walletType) {\n const wallet = list.find((wallet) => wallet.type === walletType);\n\n if (wallet) {\n setSelectedWalletToConnect(wallet);\n } else {\n warn(\n new Error(\n `It seems requested wallet to be connected is not available in the list. requested wallet: ${wallet}`\n )\n );\n }\n }\n };\n\n return (\n <>\n <MessageBox type={type} title={title} description={message} />\n {shouldShowWallet && (\n <WalletContainer>\n <Wallet\n container={getContainer()}\n title={walletInfo.name}\n image={walletInfo.img}\n type={walletType}\n state={walletState}\n link={walletInfo.installLink}\n disabled={walletButtonDisabled}\n // TODO we need to show an error modal when user reject the connection\n onClick={handleWalletItemClick}\n />\n </WalletContainer>\n )}\n <StatefulConnectModal\n wallet={selectedWalletToConnect}\n onClose={() => {\n setSelectedWalletToConnect(undefined);\n }}\n />\n </>\n );\n};\n", "import { styled } from '@rango-dev/ui';\n\nexport const WalletContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n});\n\nexport const TooltipErrorContent = styled('div', {\n maxWidth: 280,\n '& ._typography': {\n wordWrap: 'break-word',\n display: 'block',\n },\n});\n", "import type { CompleteModalPropTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n TokenAmount,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { WIDGET_UI_ID } from '../../constants';\nimport { getContainer } from '../../utils/common';\nimport { WatermarkedModal } from '../common/WatermarkedModal';\n\nexport function SwapDetailsCompleteModal(props: CompleteModalPropTypes) {\n const {\n open,\n onClose,\n status,\n priceValue,\n usdValue,\n realUsdValue,\n realValue,\n token,\n chain,\n percentageChange,\n description,\n diagnosisUrl,\n } = props;\n const navigate = useNavigate();\n\n return (\n <WatermarkedModal\n open={open}\n onClose={onClose}\n container={\n document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) || document.body\n }>\n {status === 'success' ? (\n <MessageBox type=\"success\" title={i18n.t('Swap Successful')}>\n <TokenAmount\n direction=\"vertical\"\n tooltipContainer={getContainer()}\n type=\"output\"\n centerAlign={true}\n price={{\n value: priceValue,\n usdValue,\n realUsdValue,\n realValue,\n }}\n token={token}\n chain={chain}\n percentageChange={percentageChange}\n />\n <Divider size={12} />\n <Typography\n variant=\"body\"\n size=\"medium\"\n color=\"neutral700\"\n align=\"center\">\n {description}\n </Typography>\n </MessageBox>\n ) : (\n <MessageBox\n type=\"error\"\n title={i18n.t('Transaction Failed')}\n description={description}\n />\n )}\n <Divider size={32} />\n {status === 'success' && (\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => {\n const home = '../../';\n navigate(home);\n }}>\n <Typography variant=\"title\" size=\"medium\" color=\"neutral100\">\n {i18n.t('Done')}\n </Typography>\n </Button>\n )}\n <Divider size={12} />\n {diagnosisUrl && (\n <>\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n onClick={() => window.open(diagnosisUrl, '_blank')}>\n {i18n.t('Diagnosis')}\n </Button>\n <Divider size={12} />\n </>\n )}\n <Button variant=\"outlined\" type=\"primary\" size=\"large\" onClick={onClose}>\n <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('See Details')}\n </Typography>\n </Button>\n </WatermarkedModal>\n );\n}\n", "import type { GetStep } from '../SwapDetailsAlerts';\nimport type { Step, StepDetailsProps } from '@rango-dev/ui';\nimport type { PendingSwapStep, SwapperType } from 'rango-types';\n\nimport React from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport { numberToString } from '../../utils/numbers';\nimport { isNetworkStatusInWarningState } from '../../utils/swap';\nimport { SwapDetailsAlerts } from '../SwapDetailsAlerts';\n\nexport const RESET_INTERVAL = 2_000;\nexport const SECONDS = 60;\n\nexport const getSteps = ({\n swap,\n blockchains,\n swappers,\n ...args\n}: GetStep): Step[] => {\n const hasAlreadyProceededToSign = swap.hasAlreadyProceededToSign !== false;\n return swap.steps.map((step, index) => {\n const amountToConvert =\n index === 0\n ? swap.inputAmount\n : swap.steps[index - 1].outputAmount ||\n swap.steps[index - 1].expectedOutputAmountHumanReadable;\n return {\n from: {\n token: { displayName: step.fromSymbol, image: step.fromLogo ?? '' },\n chain: {\n displayName:\n getBlockchainShortNameFor(step.fromBlockchain, blockchains) ?? '',\n image: step.fromBlockchainLogo ?? '',\n },\n price: {\n value: numberToString(\n amountToConvert,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realValue: amountToConvert ?? '',\n },\n },\n to: {\n token: { displayName: step.toSymbol, image: step.toLogo },\n chain: {\n displayName:\n getBlockchainShortNameFor(step.toBlockchain, blockchains) ?? '',\n image: step.toBlockchainLogo ?? '',\n },\n price: {\n value: numberToString(\n step.outputAmount || step.expectedOutputAmountHumanReadable,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n ),\n realValue:\n step.outputAmount || step.expectedOutputAmountHumanReadable || '',\n },\n },\n swapper: {\n displayName: getSwapperDisplayName(step.swapperId, swappers) ?? '',\n image: step.swapperLogo ?? '',\n type: step.swapperType as SwapperType,\n },\n internalSwaps: step.internalSwaps\n ? step.internalSwaps.map((internalSwap) => {\n return {\n from: {\n chain: {\n displayName:\n getBlockchainShortNameFor(\n internalSwap.fromBlockchain,\n blockchains\n ) ?? '',\n image: internalSwap.fromBlockchainLogo ?? '',\n },\n },\n to: {\n chain: {\n displayName:\n getBlockchainShortNameFor(\n internalSwap.toBlockchain,\n blockchains\n ) ?? '',\n image: internalSwap.toBlockchainLogo ?? '',\n },\n },\n swapper: {\n displayName:\n getSwapperDisplayName(internalSwap.swapperId, swappers) ?? '',\n image: internalSwap.swapperLogo ?? '',\n type: internalSwap.swapperType as SwapperType,\n },\n };\n })\n : [],\n alerts: (\n <SwapDetailsAlerts\n step={step}\n hasAlreadyProceededToSign={hasAlreadyProceededToSign}\n {...args}\n />\n ),\n };\n });\n};\n\nexport function getStepState(step: PendingSwapStep): StepDetailsProps['state'] {\n if (\n isNetworkStatusInWarningState(step) &&\n step.status !== 'failed' &&\n step.status !== 'success'\n ) {\n return 'warning';\n }\n\n switch (step.status) {\n case 'created':\n return 'default';\n case 'approved':\n case 'waitingForApproval':\n case 'running':\n return 'in-progress';\n case 'failed':\n return 'error';\n case 'success':\n return 'completed';\n }\n}\n", "import type { SwapAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, IconButton, LinkIcon } from '@rango-dev/ui';\nimport React, { Fragment } from 'react';\n\nimport { isNetworkStatusInWarningState } from '../../utils/swap';\n\nimport { FailedAlert } from './SwapDetailsAlerts.Failed';\nimport { Alerts } from './SwapDetailsAlerts.styles';\nimport { WarningAlert } from './SwapDetailsAlerts.Warning';\n\nexport function SwapDetailsAlerts(props: SwapAlertsProps) {\n const {\n switchNetwork,\n showNetworkModal,\n setNetworkModal,\n message,\n step,\n hasAlreadyProceededToSign,\n } = props;\n\n const hasWarning = isNetworkStatusInWarningState(step);\n const waitingForApproval =\n step.status === 'waitingForApproval' && !hasWarning;\n const inProgress = step.status === 'running' && !hasWarning;\n const waitingProgress =\n (inProgress && !hasAlreadyProceededToSign) ||\n (waitingForApproval && !step.explorerUrl?.length);\n\n return (\n <Alerts>\n {step.explorerUrl?.map((explorerUrl, index, urls) => {\n const key = index + explorerUrl.url;\n const lastUrl = index === urls.length - 1;\n const loading =\n ((lastUrl && inProgress) || waitingForApproval) && !waitingProgress;\n const error = lastUrl && step.status === 'failed';\n\n return (\n <Fragment key={key}>\n <Alert\n type={\n lastUrl\n ? (loading && 'loading') || (error && 'error') || 'success'\n : 'success'\n }\n title={\n !explorerUrl.description\n ? i18n.t('View transaction')\n : `${explorerUrl.description} Tx`\n }\n action={\n explorerUrl.url && (\n <IconButton\n variant=\"ghost\"\n size=\"xsmall\"\n onClick={() => window.open(explorerUrl.url, '_blank')}>\n <LinkIcon size={12} />\n </IconButton>\n )\n }\n />\n </Fragment>\n );\n })}\n {waitingProgress && <Alert type=\"loading\" title={message.shortMessage} />}\n {step.status !== 'failed' && hasWarning && (\n <WarningAlert\n switchNetwork={switchNetwork}\n showNetworkModal={showNetworkModal}\n setNetworkModal={setNetworkModal}\n message={message}\n />\n )}\n\n {step.status === 'failed' && <FailedAlert message={message} />}\n </Alerts>\n );\n}\n", "import type { FailedAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { Alert, ChevronDownIcon, IconButton } from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { MessageText } from '../SwapDetails/SwapDetails.styles';\n\nimport { ActionIcon, AlertFooter } from './SwapDetailsAlerts.styles';\n\nexport function FailedAlert(props: FailedAlertsProps) {\n const { message } = props;\n const [showContentError, setShowContentError] = useState(false);\n\n return (\n <Alert\n type=\"error\"\n title={message.shortMessage}\n containerStyles={{\n '& .footer': {\n paddingTop: '$0',\n },\n }}\n action={\n message.detailedMessage.content && (\n <IconButton\n onClick={() => setShowContentError((prev) => !prev)}\n variant=\"ghost\"\n size=\"xsmall\">\n <ActionIcon rotated={showContentError}>\n <ChevronDownIcon size={12} color=\"gray\" />\n </ActionIcon>\n </IconButton>\n )\n }\n footer={\n <AlertFooter open={showContentError}>\n <MessageText variant=\"body\" size=\"xsmall\" color=\"neutral700\">\n {message.detailedMessage.content}\n </MessageText>\n </AlertFooter>\n }\n />\n );\n}\n", "import { css, darkTheme, styled, Typography } from '@rango-dev/ui';\n\nimport { ScrollableArea } from '../Layout';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n overflow: 'hidden',\n});\n\nexport const HeaderDetails = styled('div', {\n width: '100%',\n '& ._icon-button': {\n '&:hover': {\n '& svg': {\n color: '$secondary550',\n [`.${darkTheme} &`]: {\n color: '$secondary500',\n },\n },\n },\n },\n});\n\nexport const StepsList = styled(ScrollableArea, {\n padding: '$0 $20 $20 $20',\n});\n\nexport const Alerts = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$10',\n});\n\nexport const PlaceholderContainer = styled('div', {\n height: '450px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const LoaderContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n width: '100%',\n paddingTop: '33%',\n flex: 1,\n});\n\nexport const rowStyles = css({\n display: 'flex',\n width: '100%',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '$10 $20',\n borderBottom: '1px solid',\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n borderColor: '$$color',\n color: '$neutral500',\n});\n\nexport const datePlaceholderStyles = css({\n padding: '$5 0',\n});\n\nexport const requestIdStyles = css({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '$24',\n});\n\nexport const outputStyles = css({\n display: 'flex',\n width: '100%',\n padding: '$15 $20 $20',\n flexDirection: 'column',\n alignItems: 'start',\n});\n\nexport const titleStepsStyles = css({\n width: '100%',\n padding: '0 $20 $10',\n});\n\nexport const StyledLink = styled('a', {\n fontSize: '$16',\n fontWeight: '$400',\n color: '$neutral700',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const ErrorMessages = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$5',\n});\nexport const MessageText = styled(Typography, {\n wordBreak: 'break-word',\n});\n", "import { styled } from '@rango-dev/ui';\n\nexport const Alerts = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: '$10',\n});\n\nexport const ActionIcon = styled('div', {\n transition: 'transform 0.3s ease-in-out',\n variants: {\n rotated: {\n true: {\n transform: 'rotate(180deg)',\n },\n },\n },\n});\n\nexport const AlertFooter = styled('div', {\n transition: 'max-height 0.3s ease-in-out',\n maxHeight: '0px',\n overflow: 'hidden',\n variants: {\n open: {\n true: {\n maxHeight: '200px',\n },\n },\n },\n});\n", "import type { WaningAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { Alert, Button } from '@rango-dev/ui';\nimport { PendingSwapNetworkStatus } from 'rango-types';\nimport React from 'react';\n\nexport function WarningAlert(props: WaningAlertsProps) {\n const { switchNetwork, setNetworkModal, message, showNetworkModal } = props;\n if (!!switchNetwork) {\n return (\n <Alert\n type=\"warning\"\n title={message.shortMessage}\n action={\n <Button\n size=\"xxsmall\"\n type=\"warning\"\n onClick={() => {\n setNetworkModal(PendingSwapNetworkStatus.WaitingForNetworkChange);\n switchNetwork().catch((e) => {\n console.log(e);\n });\n }}>\n {i18n.t('Change')}\n </Button>\n }\n />\n );\n }\n if (\n showNetworkModal === PendingSwapNetworkStatus.WaitingForConnectingWallet\n ) {\n return (\n <Alert\n type=\"warning\"\n title={message.shortMessage}\n action={\n <Button\n size=\"xxsmall\"\n type=\"warning\"\n onClick={() => {\n setNetworkModal(\n PendingSwapNetworkStatus.WaitingForConnectingWallet\n );\n }}>\n {i18n.t('Connect')}\n </Button>\n }\n />\n );\n }\n\n return <Alert type=\"warning\" title={message.shortMessage} />;\n}\n", "import type { SwapDetailsPlaceholderPropTypes } from './SwapDetails.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, NotFound, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../Layout';\nimport { LoadingSwapDetails } from '../LoadingSwapDetails';\n\nimport {\n Container,\n datePlaceholderStyles,\n HeaderDetails,\n PlaceholderContainer,\n requestIdStyles,\n rowStyles,\n} from './SwapDetails.styles';\n\nexport function SwapDetailsPlaceholder(props: SwapDetailsPlaceholderPropTypes) {\n const { requestId, showSkeleton } = props;\n return (\n <Layout\n header={{\n title: i18n.t('Swap Details'),\n suffix: <SuffixContainer />,\n }}>\n {showSkeleton && (\n <Container>\n <HeaderDetails>\n <div className={rowStyles()}>\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className={requestIdStyles()}>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton width={16} height={16} variant=\"rectangular\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton width={16} height={16} variant=\"rectangular\" />\n </div>\n </div>\n <div className={rowStyles()}>\n <Typography\n className={datePlaceholderStyles()}\n variant=\"label\"\n size=\"large\"\n color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n </div>\n </HeaderDetails>\n <LoadingSwapDetails />\n </Container>\n )}\n {!showSkeleton && (\n <PlaceholderContainer>\n <NotFound\n title={i18n.t('Not found')}\n description={i18n.t({\n id: 'Swap with request ID = {requestId} not found.',\n values: { requestId },\n })}\n />\n </PlaceholderContainer>\n )}\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport { Divider, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { QuoteSummarySkeleton, StepSkeleton } from '../QuoteSkeleton';\n\nimport {\n Container,\n extraInfoStyles,\n StepContainer,\n StepSeparator,\n} from './LoadingSwapDetails.styles';\n\nexport function LoadingSwapDetails() {\n return (\n <Container>\n <QuoteSummarySkeleton type=\"swap-preview\" />\n <div className=\"swaps-steps\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n\n <>\n <StepContainer>\n <StepSkeleton separator={false} />\n <div className={extraInfoStyles()}>\n <Divider direction=\"horizontal\" size={20} />\n <Skeleton height={22} variant=\"rectangular\" />\n </div>\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n <StepSeparator />\n <StepContainer>\n <StepSkeleton separator={false} />\n </StepContainer>\n </>\n </Container>\n );\n}\n", "import { css, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n width: '100%',\n height: '100%',\n padding: '$10 $20',\n});\n\nexport const StepContainer = styled('div', {\n backgroundColor: '$neutral100',\n borderRadius: '$xm',\n padding: '$10 $15',\n});\n\nexport const StepSeparator = styled('div', {\n width: '0px',\n height: '$20',\n borderLeft: '1px dashed $neutral700',\n marginLeft: '25px',\n});\n\nexport const quoteSummaryItemStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const tokenAmountStyles = css({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n});\n\nexport const costStyles = css({\n paddingTop: '$15',\n display: 'flex',\n});\n\nexport const quoteSummaryStyles = css({\n padding: '$15 $0',\n});\n\nexport const quoteSummarySeparatorStyles = css({\n width: '0px',\n height: '$16',\n borderLeft: '1px solid $neutral400',\n marginLeft: '13px',\n});\n\nexport const swapsStepsStyles = css({\n paddingBottom: '$10',\n});\n\nexport const stepTitleStyles = css({\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n});\n\nexport const stepTokensStyles = css({\n paddingTop: '$5',\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const stepInfoStyles = css({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const stepIconStyles = css({\n padding: '$4 $6',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const extraInfoStyles = css({\n display: 'flex',\n paddingTop: '$10',\n paddingBottom: '$5',\n});\n", "import type { WalletInfoWithExtra } from '../types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Divider,\n getCategoriesCount,\n SelectableCategoryList,\n styled,\n Typography,\n Wallet,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { Layout, PageContainer } from '../components/Layout';\nimport { StatefulConnectModal } from '../components/StatefulConnectModal';\nimport { useWalletList } from '../hooks/useWalletList';\nimport { useAppStore } from '../store/AppStore';\nimport { useUiStore } from '../store/ui';\nimport { getContainer, isSingleWalletActive } from '../utils/common';\nimport {\n filterBlockchainsByWalletTypes,\n filterWalletsByCategory,\n} from '../utils/wallets';\n\nconst ListContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n gap: '$10',\n flexWrap: 'wrap',\n paddingTop: '$5',\n});\n\nconst Container = styled(PageContainer, {\n textAlign: 'center',\n});\n\nexport function WalletsPage() {\n const { fetchStatus: fetchMetaStatus } = useAppStore();\n const [blockchainCategory, setBlockchainCategory] = useState<string>('ALL');\n const blockchains = useAppStore().blockchains();\n const { config } = useAppStore();\n\n const [selectedWalletToConnect, setSelectedWalletToConnect] =\n useState<WalletInfoWithExtra>();\n const isActiveTab = useUiStore.use.isActiveTab();\n\n const { list } = useWalletList();\n\n const filteredBlockchains = filterBlockchainsByWalletTypes(list, blockchains);\n const activeCategoriesCount = getCategoriesCount(filteredBlockchains);\n const showCategory = activeCategoriesCount !== 1;\n\n const filteredWallets = filterWalletsByCategory(list, blockchainCategory);\n\n const handleWalletItemClick = (wallet: WalletInfoWithExtra) => {\n if (isSingleWalletActive(list, config.multiWallets)) {\n return;\n }\n\n setSelectedWalletToConnect(wallet);\n };\n\n return (\n <Layout\n header={{\n title: i18n.t('Connect Wallets'),\n }}>\n <Container>\n {showCategory && (\n <>\n <SelectableCategoryList\n setCategory={setBlockchainCategory}\n category={blockchainCategory}\n blockchains={filteredBlockchains}\n isLoading={fetchMetaStatus === 'loading'}\n />\n <Divider size={24} />\n </>\n )}\n <Typography variant=\"title\" size=\"xmedium\" align=\"center\">\n {i18n.t('Choose a wallet to connect.')}\n </Typography>\n <ListContainer>\n {filteredWallets.map((wallet, index) => {\n const key = `wallet-${index}-${wallet.type}`;\n return (\n <Wallet\n key={key}\n {...wallet}\n container={getContainer()}\n onClick={() => handleWalletItemClick(wallet)}\n isLoading={fetchMetaStatus === 'loading'}\n disabled={!isActiveTab}\n />\n );\n })}\n <StatefulConnectModal\n wallet={selectedWalletToConnect}\n onClose={() => {\n setSelectedWalletToConnect(undefined);\n }}\n />\n </ListContainer>\n </Container>\n </Layout>\n );\n}\n", "import type { WalletType } from '../..';\n\nimport { useQueueManager } from '@rango-dev/queue-manager-rango-preset';\nimport { splitWalletNetwork } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport { useContext, useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { WidgetContext } from '../../containers/Wallets';\nimport { globalFont } from '../../globalStyles';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { unsubscribeQuoteStore } from '../../store/quote';\nimport { tabManager } from '../../store/ui';\nimport { useFetchApiConfig } from '../useFetchApiConfig';\nimport { useForceAutoConnect } from '../useForceAutoConnect';\nimport { useSubscribeToWidgetEvents } from '../useSubscribeToWidgetEvents';\nimport { useSyncNotifications } from '../useSyncNotifications';\n\nexport function useBootstrap() {\n useForceAutoConnect();\n globalFont();\n useSubscribeToWidgetEvents();\n useSyncNotifications();\n const blockchains = useAppStore().blockchains();\n const { canSwitchNetworkTo } = useWallets();\n const [lastConnectedWalletWithNetwork, setLastConnectedWalletWithNetwork] =\n useState('');\n const [disconnectedWallet, setDisconnectedWallet] = useState<WalletType>();\n const widgetContext = useContext(WidgetContext);\n\n const evmChains = blockchains.filter(isEvmBlockchain);\n\n const { fetchApiConfig } = useFetchApiConfig();\n\n // Unsubscribe QuoteStore listeners\n useEffect(() => () => unsubscribeQuoteStore(), []);\n\n // At the moment, we only detect the disconnection of EVM wallets.\n useQueueManager({\n lastConnectedWallet: lastConnectedWalletWithNetwork,\n clearDisconnectedWallet: () => {\n setDisconnectedWallet(undefined);\n },\n disconnectedWallet: disconnectedWallet,\n evmChains,\n canSwitchNetworkTo,\n });\n\n useEffect(() => {\n tabManager.init();\n\n if (!useNotificationStore.persist.hasHydrated()) {\n void useNotificationStore.persist.rehydrate();\n }\n\n /**\n * Add handlers to the widget context for connecting and disconnecting wallets.\n * We pass these handlers to the wallet provider to keep track of the last connected and last disconnected wallets.\n * The 'queue-manager' uses these details to spot any changes in the connection status of the required wallet during the swap process.\n *\n * with this approch anyone who use the widget context can override these handlers and causes some bugs happens.\n * it the future we should add a safer soloution like considering array of handlers .\n * https://github.com/rango-exchange/rango-client/pull/630/files#r1518846728\n */\n widgetContext.onConnectWallet(setLastConnectedWalletWithNetwork);\n widgetContext.onDisconnectWallet((walletType) => {\n setDisconnectedWallet(walletType);\n if (\n walletType === splitWalletNetwork(lastConnectedWalletWithNetwork)?.[0]\n ) {\n setLastConnectedWalletWithNetwork('');\n }\n });\n\n void fetchApiConfig().catch(console.log);\n\n return tabManager.destroy;\n }, []);\n}\n", "import { globalCss } from '@rango-dev/ui';\n\nexport const globalFont = () =>\n globalCss({\n '@import':\n \"url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap')\",\n })();\n", "import { useUiStore } from '../store/ui';\nimport { getConfig } from '../utils/configs';\n\nexport type Watermark = 'NONE' | 'FULL';\n\ntype ConfigResponse = {\n config: {\n watermark: Watermark;\n };\n};\n\ninterface UseFetchApiConfig {\n fetchApiConfig: () => Promise<void>;\n}\n\nexport function useFetchApiConfig(): UseFetchApiConfig {\n const { setWatermark } = useUiStore();\n\n const fetchApiConfig: UseFetchApiConfig['fetchApiConfig'] = async () => {\n const response = await fetch(\n `${getConfig('BASE_URL')}/meta/dapp/config?apiKey=${getConfig('API_KEY')}`\n );\n\n if (!response.ok) {\n throw new Error(`Request failed with status: ${response.status} `);\n }\n\n const data: ConfigResponse = await response.json();\n\n setWatermark(data.config.watermark);\n };\n return { fetchApiConfig };\n}\n", "import { useWallets } from '@rango-dev/wallets-react';\nimport { useEffect, useRef } from 'react';\n\nimport { SearchParams } from '../constants/searchParams';\nimport { useAppStore } from '../store/AppStore';\n\nexport function useForceAutoConnect(): void {\n const { connect, state } = useWallets();\n const initiated = useRef<{ [key: string]: boolean }>({});\n const { fetchStatus } = useAppStore();\n const walletType =\n new URLSearchParams(location.search).get(SearchParams.AUTO_CONNECT) || '';\n const walletState = state(walletType);\n\n useEffect(() => {\n const shouldTryConnect =\n fetchStatus === 'success' &&\n walletType &&\n walletState.installed &&\n !walletState.connecting &&\n !walletState.connected;\n if (shouldTryConnect && !initiated.current[walletType]) {\n initiated.current[walletType] = true;\n void connect(walletType);\n }\n }, [walletState, fetchStatus]);\n}\n", "import type { RouteEventData, StepEventData } from '../..';\n\nimport {\n isApprovalTX,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n WidgetEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { eventEmitter } from '../../services/eventEmitter';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useWalletsStore } from '../../store/wallets';\n\nexport function useSubscribeToWidgetEvents() {\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const getWalletsDetails = useWalletsStore.use.getWalletsDetails();\n const setNotification = useNotificationStore.use.setNotification();\n const { findToken } = useAppStore();\n\n useEffect(() => {\n const handleStepEvent = (widgetEvent: StepEventData) => {\n const { event, step, route } = widgetEvent;\n const shouldRefetchBalance =\n (event.type === StepEventType.TX_EXECUTION &&\n event.status === StepExecutionEventStatus.TX_SENT &&\n !isApprovalTX(step)) ||\n event.type === StepEventType.SUCCEEDED;\n\n if (shouldRefetchBalance) {\n const fromAccount = connectedWallets.find(\n (account) => account.chain === step?.fromBlockchain\n );\n const toAccount =\n step?.fromBlockchain !== step?.toBlockchain &&\n connectedWallets.find(\n (wallet) => wallet.chain === step?.toBlockchain\n );\n\n fromAccount && getWalletsDetails([fromAccount], findToken);\n toAccount && getWalletsDetails([toAccount], findToken);\n }\n\n setNotification(event, route);\n };\n eventEmitter.on(WidgetEvents.StepEvent, handleStepEvent);\n return () => eventEmitter.off(WidgetEvents.StepEvent, handleStepEvent);\n }, [eventEmitter, connectedWallets]);\n\n useEffect(() => {\n const handleRouteEvent = (widgetEvent: RouteEventData) => {\n const { event, route } = widgetEvent;\n\n if (\n event.type === RouteEventType.FAILED ||\n event.type === RouteEventType.SUCCEEDED\n ) {\n setNotification(event, route);\n }\n };\n eventEmitter.on(WidgetEvents.RouteEvent, handleRouteEvent);\n\n return () => eventEmitter.off(WidgetEvents.RouteEvent, handleRouteEvent);\n }, [eventEmitter]);\n}\n", "import { useManager } from '@rango-dev/queue-manager-react';\nimport { useEffect } from 'react';\n\nimport { useNotificationStore } from '../../store/notification';\nimport { getPendingSwaps } from '../../utils/queue';\n\nexport function useSyncNotifications() {\n const { isSynced, syncNotifications } = useNotificationStore();\n const { manager, state } = useManager();\n\n useEffect(() => {\n const shouldSyncNotifications =\n useNotificationStore.persist.hasHydrated() &&\n state.loadedFromPersistor &&\n !isSynced;\n\n if (shouldSyncNotifications) {\n syncNotifications(getPendingSwaps(manager));\n }\n }, [\n useNotificationStore.persist.hasHydrated(),\n state.loadedFromPersistor,\n isSynced,\n ]);\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const MainContainer = styled('div', {\n fontFamily: '$widget',\n boxSizing: 'border-box',\n textAlign: 'left',\n '& *, *::before, *::after': {\n boxSizing: 'inherit',\n },\n '& *:focus-visible': {\n outlineColor: '$info500',\n transition: 'none',\n },\n '& ul, ol, li': { listStyleType: 'none' },\n});\n", "import type { PropTypes } from './WidgetProvider.types';\nimport type { PropsWithChildren } from 'react';\n\nimport { setSolanaSignerConfig } from '@rango-dev/signer-solana';\nimport React, { useEffect, useMemo } from 'react';\n\nimport { DEFAULT_BASE_URL, RANGO_PUBLIC_API_KEY } from '../../constants';\nimport useFontLoader from '../../hooks/useFontLoader';\nimport QueueManager from '../../QueueManager';\nimport { initConfig } from '../../utils/configs';\nimport { WidgetWallets } from '../Wallets';\nimport { WidgetInfo } from '../WidgetInfo';\n\nexport function WidgetProvider(props: PropsWithChildren<PropTypes>) {\n const { onUpdateState, config } = props;\n\n const fontFamily = props.config?.theme?.fontFamily;\n\n const { handleLoadCustomFont } = useFontLoader();\n\n useEffect(() => {\n if (fontFamily) {\n handleLoadCustomFont(fontFamily);\n }\n }, [fontFamily]);\n\n useMemo(() => {\n initConfig({\n API_KEY: config?.apiKey || RANGO_PUBLIC_API_KEY,\n BASE_URL: config?.apiUrl || DEFAULT_BASE_URL,\n });\n }, [config.apiKey, config.apiUrl]);\n\n useEffect(() => {\n if (props.config?.signers?.customSolanaRPC) {\n setSolanaSignerConfig('customRPC', props.config.signers.customSolanaRPC);\n }\n }, [props.config?.signers?.customSolanaRPC]);\n\n return (\n <WidgetWallets config={config} onUpdateState={onUpdateState}>\n <QueueManager apiKey={config.apiKey}>\n <WidgetInfo>{props.children}</WidgetInfo>\n </QueueManager>\n </WidgetWallets>\n );\n}\n", "import { useState } from 'react';\n\nimport { getFontUrlByName } from '../utils/common';\n/*\n *TODO:\n * Loading fonts from JS has a downside and it is the bundle needs to be downloaded and executed first which means after sometime font will be added to <head /> and it causes a layoutshift each time.\n * We've added Roboto into <head /> since it's the default font. the downside here is it will load roboto anyway even dApp has set fontFamily other than Roboto which causes an unneccerary downloand (Roboto).\n * We decided to go with the second one and it can be solved in future by split these types of configs into a separate js file and let it to be loaded with a more priority than the main bundle. it should be also cached which imrpove user experience after first load.\n */\nconst useFontLoader = () => {\n const [fontLink, setFontLink] = useState<HTMLLinkElement | null>(null);\n\n const loadFont = (fontUrl: string) => {\n const link = document.createElement('link');\n link.href = fontUrl;\n link.rel = 'stylesheet';\n document.head.appendChild(link);\n return link;\n };\n\n const unloadFont = () => {\n if (fontLink) {\n document.head.removeChild(fontLink);\n setFontLink(null);\n }\n };\n\n const handleLoadCustomFont = (fontName: string) => {\n unloadFont(); // Remove previous font\n const fontUrl = getFontUrlByName(fontName);\n if (fontUrl) {\n const newFontLink = loadFont(fontUrl);\n setFontLink(newFontLink);\n }\n };\n\n return { handleLoadCustomFont };\n};\n\nexport default useFontLoader;\n", "import type { SwapQueueContext } from '@rango-dev/queue-manager-rango-preset';\nimport type { Network, WalletType } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport {\n checkWaitingForNetworkChange,\n makeQueueDefinition,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { Provider as ManagerProvider } from '@rango-dev/queue-manager-react';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { convertEvmBlockchainMetaToEvmChainInfo } from '@rango-dev/wallets-shared';\nimport { isEvmBlockchain } from 'rango-types';\nimport React, { useMemo } from 'react';\n\nimport { eventEmitter } from './services/eventEmitter';\nimport { useAppStore } from './store/AppStore';\nimport { useUiStore } from './store/ui';\nimport { useWalletsStore } from './store/wallets';\nimport { getConfig } from './utils/configs';\nimport { walletAndSupportedChainsNames } from './utils/wallets';\n\nfunction QueueManager(props: PropsWithChildren<{ apiKey?: string }>) {\n const {\n providers,\n getSigners,\n state,\n connect,\n canSwitchNetworkTo,\n getWalletInfo,\n } = useWallets();\n\n const swapQueueDef = useMemo(() => {\n return makeQueueDefinition({\n API_KEY: props.apiKey || getConfig('API_KEY'),\n BASE_URL: getConfig('BASE_URL'),\n emitter: {\n emit: eventEmitter.emit,\n },\n });\n }, [props.apiKey]);\n\n const blockchains = useAppStore().blockchains();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const wallets = {\n blockchains: connectedWallets.map((wallet) => ({\n accounts: [wallet],\n name: wallet.chain,\n })),\n };\n\n const switchNetwork = async (wallet: WalletType, network: Network) => {\n if (!canSwitchNetworkTo(wallet, network)) {\n return undefined;\n }\n return connect(wallet, network);\n };\n\n const isMobileWallet = (walletType: WalletType): boolean =>\n !!getWalletInfo(walletType).mobileWallet;\n\n // TODO: this code copy & pasted from rango, should be refactored.\n const allBlockchains = blockchains\n .filter((blockchain) => blockchain.enabled)\n .reduce(\n (blockchainsObj: any, blockchain) => (\n (blockchainsObj[blockchain.name] = blockchain), blockchainsObj\n ),\n {}\n );\n const evmBasedChains = blockchains.filter(isEvmBlockchain);\n const getSupportedChainNames = (type: WalletType) => {\n const { supportedChains } = getWalletInfo(type);\n return walletAndSupportedChainsNames(supportedChains);\n };\n const allProviders = providers();\n\n const context: SwapQueueContext = {\n meta: {\n blockchains: allBlockchains,\n evmBasedChains: evmBasedChains,\n evmNetworkChainInfo:\n convertEvmBlockchainMetaToEvmChainInfo(evmBasedChains),\n getSupportedChainNames,\n },\n getSigners,\n wallets,\n providers: allProviders,\n switchNetwork,\n canSwitchNetworkTo,\n connect,\n state,\n isMobileWallet,\n };\n\n const isActiveTab = useUiStore.use.isActiveTab();\n\n return (\n <ManagerProvider\n queuesDefs={[swapQueueDef]}\n context={context}\n onPersistedDataLoaded={(manager) => {\n checkWaitingForNetworkChange(manager);\n }}\n isPaused={!isActiveTab}>\n {props.children}\n </ManagerProvider>\n );\n}\n\nexport default QueueManager;\n", "import type { WidgetInfoContextInterface } from './WidgetInfo.types';\n\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport React, { createContext, useContext } from 'react';\n\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useUpdateQuoteInputs } from '../../hooks/useUpdateQuoteInputs/useUpdateQuoteInputs';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useQuoteStore } from '../../store/quote';\nimport { tabManager, useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { calculateWalletUsdValue } from '../../utils/wallets';\n\nimport { WidgetHistory } from './WidgetInfo.helpers';\n\nexport const WidgetInfoContext = createContext<\n WidgetInfoContextInterface | undefined\n>(undefined);\n\nexport function WidgetInfo(props: React.PropsWithChildren) {\n const { manager } = useManager();\n const isActiveTab = useUiStore.use.isActiveTab();\n const retrySwap = useQuoteStore.use.retry();\n const { findToken } = useAppStore();\n\n const history = new WidgetHistory(manager, { retrySwap, findToken });\n const details = useWalletsStore.use.connectedWallets();\n const isLoading = useWalletsStore.use.loading();\n const totalBalance = calculateWalletUsdValue(details);\n const refetch = useWalletsStore.use.getWalletsDetails();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const swappers = useAppStore().swappers();\n const loadingStatus = useAppStore().fetchStatus;\n const resetLanguage = useLanguage().resetLanguage;\n const notifications = useNotificationStore().getNotifications();\n const clearNotifications = useNotificationStore().clearNotifications;\n const updateQuoteInputs = useUpdateQuoteInputs();\n const { fromBlockchain, toBlockchain, fromToken, toToken, inputAmount } =\n useQuoteStore();\n\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n const value: WidgetInfoContextInterface = {\n isActiveTab,\n setCurrentTabAsActive: tabManager.forceClaim,\n history,\n wallets: {\n isLoading,\n details,\n totalBalance,\n refetch: (accounts) => refetch(accounts, findToken),\n },\n meta: {\n blockchains,\n tokens,\n swappers,\n loadingStatus,\n findToken,\n },\n resetLanguage,\n notifications: {\n list: notifications,\n clearAll: clearNotifications,\n },\n quote: {\n quoteInputs: {\n fromBlockchain: fromBlockchain?.name ?? null,\n fromToken: fromToken\n ? {\n symbol: fromToken.symbol,\n blockchain: fromToken.blockchain,\n address: fromToken.address,\n }\n : null,\n toBlockchain: toBlockchain?.name ?? null,\n toToken: toToken\n ? {\n symbol: toToken.symbol,\n blockchain: toToken.blockchain,\n address: toToken.address,\n }\n : null,\n requestAmount: inputAmount,\n },\n updateQuoteInputs,\n },\n };\n\n return (\n <WidgetInfoContext.Provider value={value}>\n {props.children}\n </WidgetInfoContext.Provider>\n );\n}\n\nexport function useWidget(): WidgetInfoContextInterface {\n const context = useContext(WidgetInfoContext);\n if (!context) {\n throw new Error(\n 'useWidget can only be used within the WidgetProvider component'\n );\n }\n return context;\n}\n", "import type { UpdateQuoteInputs } from '../../types';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useQuoteStore } from '../../store/quote';\n\n// This hook provides a function to update quote inputs using fewer and simpler parameters.\nexport function useUpdateQuoteInputs() {\n const { findToken } = useAppStore();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const {\n setFromBlockchain,\n setFromToken,\n setToBlockchain,\n setToToken,\n setInputAmount,\n } = useQuoteStore();\n\n const updateQuoteInputs: UpdateQuoteInputs = (params) => {\n const { fromBlockchain, fromToken, toBlockchain, toToken, requestAmount } =\n params;\n const meta = { blockchains, tokens };\n\n if (fromBlockchain !== undefined) {\n const blockchainMeta =\n blockchains.find((blockchain) => blockchain.name === fromBlockchain) ??\n null;\n setFromBlockchain(blockchainMeta);\n }\n if (fromToken !== undefined) {\n const token = fromToken ? findToken(fromToken) ?? null : null;\n setFromToken({ meta, token });\n }\n if (toBlockchain !== undefined) {\n const blockchainMeta =\n blockchains.find((blockchain) => blockchain.name === toBlockchain) ??\n null;\n setToBlockchain(blockchainMeta);\n }\n if (toToken !== undefined) {\n const token = toToken ? findToken(toToken) ?? null : null;\n setToToken({ meta, token });\n }\n if (requestAmount !== undefined) {\n setInputAmount(requestAmount);\n }\n };\n\n return updateQuoteInputs;\n}\n", "import type { Meta, RetryQuote } from '../../store/quote';\nimport type { FindToken } from '../../store/slices/data';\nimport type { Manager } from '@rango-dev/queue-manager-core';\nimport type { PendingSwap } from 'rango-types/lib';\n\nimport {\n cancelSwap,\n getCurrentBlockchainOfOrNull,\n getCurrentStep,\n getRelatedWalletOrNull,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { getPendingSwaps } from '../../utils/queue';\nimport { createRetryQuote } from '../../utils/quote';\n\ninterface WidgetHistoryActions {\n retrySwap: (retryQuote: RetryQuote) => void;\n findToken: FindToken;\n}\n\nexport class WidgetHistory {\n private manager: Manager | undefined;\n private actions: WidgetHistoryActions;\n\n constructor(manager: Manager | undefined, actions: WidgetHistoryActions) {\n this.manager = manager;\n this.actions = actions;\n }\n\n public getAllSwaps() {\n return getPendingSwaps(this.manager);\n }\n\n public getCurrentStep(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).step;\n }\n\n public getCurrentStepWallet(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).wallet;\n }\n\n public getCurrentStepNetwork(swap: PendingSwap) {\n return this.getCurrentStepInfo(swap).network;\n }\n\n public retry(swap: PendingSwap, meta: Meta) {\n const retryQuote = createRetryQuote(\n swap,\n meta.blockchains,\n this.actions.findToken\n );\n\n return this.actions.retrySwap(retryQuote);\n }\n\n public cancel(id: string) {\n const queue = this.manager?.get(id);\n if (queue) {\n cancelSwap(queue);\n }\n }\n\n private getCurrentStepInfo(swap: PendingSwap) {\n const currentStep = getCurrentStep(swap);\n return {\n step: currentStep,\n wallet: currentStep ? getRelatedWalletOrNull(swap, currentStep) : null,\n network: currentStep\n ? getCurrentBlockchainOfOrNull(swap, currentStep)\n : null,\n };\n }\n}\n", "import type { WidgetEventEmitter } from '../../types';\n\nimport { eventEmitter } from '../../services/eventEmitter';\n\nexport function useWidgetEvents(): WidgetEventEmitter {\n // To be exported for Dapps\n const { on, off } = eventEmitter;\n return { on, off };\n}\n"],
5
+ "mappings": "iFA+CA,OACE,iBAAAA,GACA,kBAAAC,GACA,iBAAAC,GACA,mCAAAC,GACA,4BAAAC,OACK,wCACP,OAAS,4BAA4BC,OAA0B,iCAC/D,OAAS,cAAAC,GAAY,UAAUC,OAAoB,2BACnD,OAAS,YAAAC,GAAU,eAAAC,OAAmB,4BACtC,OAAS,4BAAAC,OAAgC,cCrDzC,OAAS,WAAAC,OAAe,gBACxB,OAAOC,IAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QCGnD,OAAS,eAAAC,OAAmB,gBAC5B,OAAS,cAAAC,OAAkB,2BAC3B,OAAS,cAAAC,OAAkB,QCRpB,SAASC,GACdC,EAC2E,CAC3E,MAAO,CAAC,CAACA,EAAM,cACjB,CAJgBC,EAAAF,GAAA,+BAMT,SAASG,GACdF,EACiE,CACjE,MAAO,CAAC,CAACA,EAAM,SACjB,CAJgBC,EAAAC,GAAA,sBCIT,IAAMC,GAAmB,CAC9B,OAAQ,OACR,UAAW,KACX,eAAgB,IAClB,EAEO,SAASC,GAAQC,EAAcC,EAAwB,CAC5D,OAAQA,EAAO,KAAM,CACnB,IAAK,iBACH,MAAO,CACL,GAAGD,EACH,OAAQ,YACR,UAAWC,EAAO,QAClB,eAAgB,IAClB,EACF,IAAK,sBACH,MAAO,CACL,GAAGD,EACH,OAAQ,iBACR,eAAgBC,EAAO,OACzB,EACF,IAAK,QACH,OAAOH,GACT,IAAK,kBACH,OAAIE,EAAM,UACD,CACL,GAAGA,EACH,eAAgB,KAChB,OAAQ,WACV,EAEKF,GACT,QACE,MAAM,IAAI,MAAM,6BAA6B,CACjD,CACF,CA7BgBI,EAAAH,GAAA,WF0BT,SAASI,IAAyC,CACvD,GAAM,CAAE,MAAAC,EAAO,WAAAC,EAAY,QAAAC,CAAQ,EAAIC,GAAW,EAE5C,CAACC,EAAcC,CAAQ,EAAIC,GAAWC,GAASC,EAAS,EAExDC,EAAaC,EAAA,MACjBC,EACAC,EACAC,IACsC,CAKtCR,EAAS,CACP,KAAM,OACR,CAAC,EAED,GAAI,CACF,aAAMH,EAAQS,EAAM,OAAWC,CAAU,EAElC,CAAE,kBAA+B,CAE1C,OAASE,EAAQ,CACf,IAAMC,EAAUD,GAAG,QACf,UAAUA,EAAE,OAAO,GACnB,sDAEJ,MAAM,IAAI,MAAMC,EAAS,CAAE,MAAOD,CAAE,CAAC,CACvC,CACF,EAzBmB,cA2BbE,EAAgBN,EAAA,MACpBO,EACAC,IAGI,CAGJ,GAFuBD,EAAO,QAAUE,GAAY,aAEhC,CAClB,GAAI,CAACF,EAAO,WACV,OAAO,MAAMR,EAAWQ,EAAO,KAAM,OAAWC,CAAO,EAGzD,IAAME,EAAiBH,EAAO,WAAW,OAAS,EAC5CI,EAAsBJ,EAAO,oBAEnC,OAAIG,GACFf,EAAS,CACP,KAAM,iBACN,QAAS,CACP,aAAcY,EAAO,KACrB,cAAeA,EAAO,MACtB,oBAAqBA,EAAO,WAC5B,gBAAiBA,EAAO,eAC1B,CACF,CAAC,EACM,CAAE,kBAA+B,GAC/BI,GACThB,EAAS,CACP,KAAM,sBACN,QAAS,CACP,aAAcY,EAAO,KACrB,cAAeA,EAAO,MACtB,UAAWA,EAAO,WAAW,CAAC,CAChC,CACF,CAAC,EACM,CAAE,wBAAoC,GAGxC,MAAMR,EACXQ,EAAO,KACPA,EAAO,WAAW,IAAKK,IAAe,CAAE,UAAAA,CAAU,EAAE,EACpDJ,CACF,CACF,CAEA,OAAIA,GAAS,uBACX,MAAMK,EAAiBN,EAAO,IAAI,EAC3B,CAAE,qBAAkC,GAGtC,CAAE,+BAA2C,CACtD,EApDsB,iBAsDhBO,EAAkBd,EAAA,MACtBO,EACAQ,IACoB,CACpB,IAAMC,EAAoBT,EAAO,gBAC3BI,EAAsBJ,EAAO,oBAC7BU,EAAyBF,EAAmB,CAAC,EAEnD,GAAI,CAACE,EACH,MAAM,IAAI,MACR,mEACF,EAQF,GAAID,GAAqBL,EACvB,OAAAhB,EAAS,CACP,KAAM,sBACN,QAAS,CACP,aAAcY,EAAO,KACrB,cAAeA,EAAO,MACtB,UAAWU,CACb,CACF,CAAC,EAEM,CAAE,wBAAoC,EAQ/C,GAAI,CAACC,GAAmBxB,CAAY,EAElC,MAAM,IAAI,MACR,2DACF,EAGF,IAAMO,EAAOP,EAAa,UAAU,aAC9BQ,EAAaa,EAAmB,IAAKH,IAAe,CACxD,UAAAA,CACF,EAAE,EAEF,OAAO,MAAMb,EAAWE,EAAMC,CAAU,CAC1C,EAlDwB,mBAoDlBiB,EAAuBnB,EAAA,MAC3BoB,GACoB,CACpB,GAAI,CAACA,EACH,MAAM,IAAI,MACR,+EACF,EAGF,GAAI,CAACC,GAA4B3B,CAAY,EAC3C,MAAM,IAAI,MACR,gHACF,EAEF,IAAMO,EAAOP,EAAa,eAAe,aAEnCQ,EAAa,CAAC,CAAE,UADIR,EAAa,eAAe,UACF,eAAA0B,CAAe,CAAC,EAEpE,OAAO,MAAMrB,EAAWE,EAAMC,CAAU,CAC1C,EAnB6B,wBAqBvBW,EAAmBb,EAAA,MAAOC,GAAsC,CACpE,IAAMM,EAASjB,EAAMW,CAAI,EACzB,OAAIM,EAAO,WAAaA,EAAO,YAC7B,MAAMhB,EAAWU,CAAI,EACd,CAAE,qBAAkC,GAGtC,CAAE,aAA0B,CACrC,EARyB,oBAUzB,MAAO,CACL,cAAAK,EACA,iBAAAO,EACA,gBAAAC,EACA,qBAAAK,EACA,SAAU,IAAMzB,EAChB,WAAa4B,GAA2B,CAEpC3B,EADE2B,IAAY,aACL,CACP,KAAM,iBACR,EAES,CACP,KAAM,OACR,CAJC,CAML,CACF,CACF,CA3LgBtB,EAAAX,GAAA,sBGxChB,OAAS,eAAAkC,OAAmB,gBAC5B,OAAS,cAAAC,OAAkB,2BAC3B,OACE,uBAAAC,GACA,4BAAAC,GACA,eAAAC,OACK,4BACP,OAAS,eAAAC,GAAa,aAAAC,OAAiB,QCRvC,OAAOC,IAAS,iBAAAC,GAAe,cAAAC,GAAY,aAAAC,GAAW,UAAAC,OAAc,QCGpE,OAAS,UAAAC,OAAc,UACvB,OAAS,WAAAC,OAAe,qBCExB,IAAMC,GAAN,KAA0D,CAT1D,MAS0D,CAAAC,EAAA,qBACxDC,GAAkC,IAAI,IAEtC,IAAuBC,EAA0B,CAC/C,OAAO,KAAKD,GAAO,IAAIC,CAAa,CACtC,CAEA,IAAuBA,EAAQC,EAAmB,CAChD,KAAKF,GAAO,IAAIC,EAAeC,CAAK,CACtC,CAEA,OAA0BD,EAAc,CACtC,KAAKD,GAAO,OAAOC,CAAa,CAClC,CAEA,OAAc,CACZ,KAAKD,GAAO,MAAM,CACpB,CACF,EAOaG,GAAe,IAAIL,GC/BzB,SAASM,GACdC,EACAC,EACoB,CACpB,OAAOA,EAAY,KAAMC,GAAeA,EAAW,OAASF,CAAc,GACtE,WACN,CANgBG,EAAAJ,GAAA,+BAOT,SAASK,GACdJ,EACAC,EACoB,CACpB,OAAOA,EAAY,KAAMC,GAAeA,EAAW,OAASF,CAAc,GACtE,SACN,CANgBG,EAAAC,GAAA,6BAQT,SAASC,GACdL,EACAC,EACoB,CACpB,OAAOA,EAAY,KAAMC,GAAeA,EAAW,OAASF,CAAc,GACtE,IACN,CANgBG,EAAAE,GAAA,sBAQT,SAASC,GACdC,EACAC,EACA,CACA,OAAOA,EAAS,KAAMC,GAAYA,EAAQ,KAAOF,CAAS,GAAG,KAC/D,CALgBJ,EAAAG,GAAA,yBAOT,SAASI,GAAeC,EAAcV,EAA+B,CAC1E,OAAOA,EAAY,KAAMC,GAAeA,EAAW,OAASS,CAAI,GAAK,IACvE,CAFgBR,EAAAO,GAAA,kBAIT,SAASE,GACdC,EACAX,EACA,CACA,GAAI,CAACA,GAAc,CAACW,EAClB,MAAO,GAGT,QAAWC,KAAYZ,EAAW,UAChC,GACEW,GAAO,aAAeC,GAAU,YAChCD,GAAO,SAAWC,GAAU,QAC5BD,GAAO,UAAYC,GAAU,QAE7B,MAAO,GAIX,MAAO,EACT,CAnBgBX,EAAAS,GAAA,iBAqBT,SAASG,GAAgBC,EAAyB,CACvD,MAAO,GAAGA,EAAM,WAAW,YAAY,CAAC,IAAIA,EAAM,OAAO,YAAY,CAAC,KACpEA,EAAM,SAAW,IACjB,YAAY,CAAC,EACjB,CAJgBb,EAAAY,GAAA,mBAMT,SAASE,GACdC,EACAC,EACS,CAGT,OAFcD,EAAM,gBACA,OAAQ,GAAM,IAAI,OAAO,CAAC,EAAE,KAAKC,CAAO,CAAC,EAAE,OAAS,CAE1E,CAPgBhB,EAAAc,GAAA,uBCjDT,SAASG,GAA8BC,EAUlC,CACV,GAAM,CAAE,OAAAC,EAAQ,KAAAC,CAAK,EAAIF,EACnBG,EAAmC,CAAC,EACpCC,EAAeH,EAAO,OAGtBI,EAAYC,EAACC,GAAkC,CACnDA,EAAO,QAASC,GAAS,CACnB,OAAOA,GAAS,WAClBA,EAAOC,GAAgBD,CAAI,GAE7B,IAAME,EAAgBR,EAAK,qBAAqB,IAAIM,CAAI,EACpDE,IACFP,EAAOK,CAAI,EAAIE,EAEnB,CAAC,CACH,EAVkB,aAgBlB,GAAI,MAAM,QAAQN,CAAY,EAK5B,OAAIA,EAAa,OAAS,GACxBC,EAAUD,CAAY,EACf,OAAO,OAAOD,CAAM,GAEtB,MAAM,KAAKD,EAAK,qBAAqB,OAAO,CAAC,EAOtD,GAAI,CAACE,EACH,OAAO,MAAM,KAAKF,EAAK,qBAAqB,OAAO,CAAC,EAGtD,IAAIS,EAEJ,GAAIV,EAAO,aAAa,OACtBU,EAAoBV,EAAO,gBACtB,CAKLU,EAAoB,OAAO,KAAKP,CAAY,EAC5C,IAAMQ,EAAuB,IAAI,IAAID,CAAiB,EAEtD,OAAO,KAAKT,EAAK,yBAAyB,EAAE,QAASW,GAAe,CAC7DD,EAAqB,IAAIC,CAAU,GACtCR,EAAUH,EAAK,0BAA0BW,CAAU,CAAC,CAExD,CAAC,CACH,CAEA,OAAAF,EAAkB,QAASE,GAAe,CACxC,IAAMC,EAA4BV,EAAaS,CAAU,EAKzD,GACE,CAACC,GACDZ,EAAK,4BAA4BW,CAAU,EAC3C,CACAR,EAAUH,EAAK,0BAA0BW,CAAU,CAAC,EACpD,MACF,CAEIC,IACEA,EAA0B,YAM5BT,EAAUH,EAAK,0BAA0BW,CAAU,CAAC,EACpDC,EAA0B,OAAO,QAASC,GAAU,CAClD,IAAMC,EAAYP,GAAgBM,CAAK,EACvC,OAAOZ,EAAOa,CAAS,CACzB,CAAC,GAGDX,EAAUS,EAA0B,MAAM,EAGhD,CAAC,EAEM,OAAO,OAAOX,CAAM,CAC7B,CAzGgBG,EAAAP,GAAA,iCA2GT,SAASkB,GAAkCjB,EAErC,CACX,GAAM,CAAE,OAAAC,CAAO,EAAID,EACbkB,EAAwBjB,EAAO,MAAM,aAAe,CAAC,EACrDkB,EAAsBlB,EAAO,IAAI,aAAe,CAAC,EAMvD,GAAI,CAACiB,EAAsB,QAAU,CAACC,EAAoB,OACxD,MAAO,CAAC,EAEV,IAAMC,EAAc,CAAC,GAAGF,EAAuB,GAAGC,CAAmB,EAE/DE,EAAuB,IAAI,IAAID,CAAW,EAEhD,OAAO,MAAM,KAAKC,CAAoB,CACxC,CAnBgBf,EAAAW,GAAA,qCClHT,IAAMK,GAA+B,CAC1C,OAAQ,GACR,MAAO,OACP,aAAc,GACd,wBAAyB,GACzB,kBAAmB,GACnB,QAAS,UACT,eAAgB,CACd,OAAQ,iCACR,MAAO,gCACT,CACF,EAUMC,GAAwC,CAC5C,UAAW,MACb,EAEMC,GAAsC,CAC1C,iBAAkB,MACpB,EAuBaC,GAITC,EAAA,CAACC,EAAaC,EAAKC,KACd,CACL,OAAQ,CAAE,GAAGP,GAAgB,GAAGK,CAAY,EAC5C,OAAQJ,GACR,aAAcC,GACd,oBAAqB,IAAM,CACzB,GAAM,CAAE,OAAAM,EAAQ,aAAAC,CAAa,EAAIF,EAAI,EACrC,OAAOE,EAAa,kBAAkB,OAClCA,EAAa,iBACbD,EAAO,kBAAoB,CAAC,CAClC,EACA,4BAA6B,IAAM,CACjC,GAAM,CAAE,yBAAAE,EAA0B,aAAAD,CAAa,EAAIF,EAAI,EACvD,OAAOE,EAAa,kBAAkB,OAClC,CAAC,EACDC,CACN,EACA,wBAAyB,IAAM,CAC7B,GAAM,CAAE,OAAAF,EAAQ,aAAAC,CAAa,EAAIF,EAAI,EACrC,OAAOE,EAAa,kBAAkB,OAClC,GACA,CAAC,CAACD,EAAO,uBACf,EACA,iBAAkB,IAAM,CACtB,GAAM,CAAE,aAAAC,CAAa,EAAIF,EAAI,EAC7B,MAAO,CAAC,CAACE,EAAa,kBAAkB,MAC1C,EAGA,aAAeE,GAA6B,CAC1C,IAAMC,EAAgBL,EAAI,EAAE,OACtB,CACJ,sBAAuBM,EACvB,2BAA4BC,CAC9B,EAAIP,EAAI,EAEFQ,EAAwBC,GAA8B,CAC1D,KAAM,SACN,OAAQ,CACN,YAAaL,EAAW,MAAM,YAC9B,OAAQA,EAAW,MAAM,MAC3B,EACA,KAAM,CACJ,0BAAAG,EACA,qBAAAD,CACF,CACF,CAAC,EAEKI,EAA6BD,GAA8B,CAC/D,KAAM,cACN,OAAQ,CACN,YAAaL,EAAW,IAAI,YAC5B,OAAQA,EAAW,IAAI,MACzB,EACA,KAAM,CACJ,0BAAAG,EACA,qBAAAD,CACF,CACF,CAAC,EAEDK,GAAa,IAAI,wBAAyBH,CAAqB,EAC/DG,GAAa,IACX,6BACAD,CACF,EAEAX,EAAI,CACF,OAAQ,CACN,GAAGM,EACH,GAAGD,CACL,CACF,CAAC,CACH,EAEA,mBAAoB,CAACQ,EAAMC,IAAU,CACnC,IAAMC,EAAsBd,EAAI,EAAE,aAElCD,EAAI,CACF,aAAc,CACZ,GAAGe,EACH,CAACF,CAAI,EAAGC,CACV,CACF,CAAC,CACH,EAEA,aAAc,CAACD,EAAMC,IAAU,CAC7B,IAAME,EAAsBf,EAAI,EAAE,OAElCD,EAAI,CACF,OAAQ,CACN,GAAGgB,EACH,CAACH,CAAI,EAAGC,CACV,CACF,CAAC,CACH,CACF,GA/FE,qBC9DJ,OAAS,mBAAAG,OAAuB,cAEzB,IAAMC,GAAiD,CAC5DD,GAAgB,IAChBA,GAAgB,MAClB,ECLA,OAAS,eAAAE,OAAmB,YCA5B,OAAS,SAAAC,OAAa,gBAEf,IAAMC,GAAuB,uCACvBC,GAAmB,6BACnBC,GAAmB,kCAEnBC,GAAe,CAC1B,YAAa,iBACb,gBAAiB,qBACjB,GAAGJ,EACL,ECcA,OACE,wBAAAK,GACA,eAAeC,OACV,gBACP,OAAS,4BAA4BC,OAA0B,iCAC/D,OACE,qBAAAC,GACA,kCAAAC,GACA,gBAAAC,GACA,4BAAAC,GACA,YAAAC,OACK,4BACP,OAAOC,OAAe,eACtB,OAAS,sBAAAC,OAA0B,cCrCnC,OAAOC,OAAe,eAEf,IAAMC,GAAO,IAAID,GAAU,CAAC,ECFnC,OAAS,eAAAE,OAAmB,4BAErB,IAAMC,GAAmB,CAACD,GAAY,IAAI,ECCjD,OAAS,wBAAAE,GAAsB,eAAAC,OAAmB,gBAClD,OAAS,mBAAAC,OAAuB,YCJzB,IAAMC,GAAsB,SAEtBC,GAAkB,CAC7B,CACE,KAAM,SACN,MAAO,SACP,IAAK,EACP,EACA,CACE,KAAM,kBACN,MAAO,kBACP,IAAK,gDACP,EACA,CACE,KAAM,QACN,MAAO,QACP,IAAK,EACP,EACA,CACE,KAAM,YACN,MAAO,YACP,IAAK,iGACP,EACA,CACE,KAAM,YACN,MAAO,YACP,IAAK,iGACP,EACA,CACE,KAAM,aACN,MAAO,aACP,IAAK,kGACP,EACA,CACE,KAAM,UACN,MAAO,UACP,IAAK,qLACP,EACA,CACE,KAAM,mBACN,MAAO,mBACP,IAAK,wGACP,EAEA,CACE,KAAM,cACN,MAAO,cACP,IAAK,mGACP,EACA,CACE,KAAM,SACN,MAAO,SACP,IAAK,4EACP,EACA,CACE,KAAM,UACN,MAAO,UACP,IAAK,+FACP,EACA,CACE,KAAM,QACN,MAAO,QACP,IAAK,sEACP,EACA,CACE,KAAM,QACN,MAAO,QACP,IAAK,2EACP,EACA,CACE,KAAM,QACN,MAAO,QACP,IAAK,6FACP,EACA,CACE,KAAM,OACN,MAAO,OACP,IAAK,4FACP,EACA,CACE,KAAM,mBACN,MAAO,mBACP,IAAK,8LACP,CACF,EDpEO,SAASC,GAAuBC,EAAiB,CACtD,OAAO,MAAM,KAAK,IAAI,IAAIA,CAAK,CAAC,CAClC,CAFgBC,EAAAF,GAAA,uBAIT,SAASG,GACdC,EACAC,EACA,CACA,OACED,EAAO,SAAWC,EAAO,QAAUD,EAAO,MAAM,CAACE,EAAGC,IAAMD,IAAMD,EAAOE,CAAC,CAAC,CAE7E,CAPgBL,EAAAC,GAAA,YAST,SAASK,GAASC,EAAcC,EAAc,CACnD,IAAIC,EACJ,OAAOC,EACP,SAASA,KAAWC,EAAW,CACzBF,GACF,aAAaA,CAAS,EAExBA,EAAY,WAAW,IAAM,CAC3BA,EAAY,KACZF,EAAG,GAAGI,CAAI,CACZ,EAAGH,CAAI,CACT,CACF,CAZgBR,EAAAM,GAAA,YAcT,SAASM,GAAaC,EAAcC,EAA6B,CAEtE,OAAOD,EAAK,YAAY,EAAE,QAAQC,EAAW,YAAY,CAAC,EAAI,EAChE,CAHgBd,EAAAY,GAAA,gBAKT,SAASG,GAAUF,EAAcC,EAA6B,CACnE,OAAOD,EAAK,YAAY,IAAMC,EAAW,YAAY,CACvD,CAFgBd,EAAAe,GAAA,aAIT,SAASC,GAAcH,EAAcC,EAA6B,CACvE,OAAOD,EAAK,YAAY,EAAE,WAAWC,EAAW,YAAY,CAAC,CAC/D,CAFgBd,EAAAgB,GAAA,iBAIT,IAAMC,EAAejB,EAAA,IAC1B,SAAS,eAAekB,GAAa,WAAW,EADtB,gBAGfC,GAAcnB,EAAA,IACzB,SAAS,eAAekB,GAAa,eAAe,EAD3B,eAG3B,SAASE,GACPC,EACAC,EACAC,EACA,CACA,IAAMC,EAAc,CAAC,CAACF,GAASP,GAAUO,EAAOD,CAAS,EACnDI,EAAc,CAAC,CAACF,GAASR,GAAUQ,EAAOF,CAAS,EACzD,OAAIG,IAAgBC,EACXD,EAAc,GAAK,EAGrB,CACT,CAZSxB,EAAAoB,GAAA,yBAcT,SAASM,GACPL,EACAC,EACAC,EACA,CACA,IAAMI,EAAgB,CAAC,CAACL,GAASV,GAAaU,EAAOD,CAAS,EACxDO,EAAgB,CAAC,CAACL,GAASX,GAAaW,EAAOF,CAAS,EAC9D,OAAIM,IAAkBC,EACbD,EAAgB,GAAK,EAI1BA,GAAiBC,GAAiBN,GAAO,SAAWC,GAAO,OACtDD,GAAO,OAASC,GAAO,OAGzB,CACT,CAjBSvB,EAAA0B,GAAA,uBAmBT,SAASG,GACPR,EACAC,EACAC,EACA,CACA,IAAMO,EAAiB,CAAC,CAACR,GAASN,GAAcM,EAAOD,CAAS,EAC1DU,EAAiB,CAAC,CAACR,GAASP,GAAcO,EAAOF,CAAS,EAChE,OAAIS,IAAmBC,EACdD,EAAiB,GAAK,EAI3BA,GAAkBC,GAAkBT,GAAO,SAAWC,GAAO,OACxDD,GAAO,OAASC,GAAO,OAGzB,CACT,CAjBSvB,EAAA6B,GAAA,wBAmBF,SAASG,GACdC,EACAC,EACAb,EACQ,CACR,GAAI,CAACA,EACH,MAAO,GAIT,IAAMc,EAA0Bf,GAC9BC,EACAY,EAAO,OACPC,EAAO,MACT,EACA,GAAIC,EACF,OAAOA,EAIT,GAAId,EAAU,QAAU,EAAmC,CACzD,IAAMe,EAA6BhB,GACjCC,EACAY,EAAO,KACPC,EAAO,IACT,EACA,GAAIE,EACF,OAAOA,CAEX,CAGA,GAAIf,EAAU,QAAU,EAA8B,CACpD,IAAMgB,EAAyBR,GAC7BR,EACAY,EAAO,OACPC,EAAO,MACT,EAEA,GAAIG,EACF,OAAOA,CAEX,CAGA,GAAIhB,EAAU,QAAU,EAA4B,CAClD,IAAMiB,EAAwBZ,GAC5BL,EACAY,EAAO,OACPC,EAAO,MACT,EAEA,GAAII,EACF,OAAOA,CAEX,CAGA,GAAIjB,EAAU,QAAU,EAAgC,CACtD,IAAMkB,EAA4BV,GAChCR,EACAY,EAAO,KACPC,EAAO,IACT,EAEA,GAAIK,EACF,OAAOA,CAEX,CAGA,GAAIlB,EAAU,QAAU,EAAgC,CACtD,IAAMmB,EAA2Bd,GAC/BL,EACAY,EAAO,KACPC,EAAO,IACT,EAEA,GAAIM,IAA6B,EAC/B,OAAOA,CAEX,CAGA,GAAInB,EAAU,QAAU,EAAmC,CACzD,IAAMoB,EAA0BZ,GAC9BR,EACAY,EAAO,QACPC,EAAO,OACT,EAEA,GAAIO,EACF,OAAOA,CAEX,CAGA,GAAIpB,EAAU,QAAU,EAAmC,CACzD,IAAMqB,EAAwBhB,GAC5BL,EACAY,EAAO,QACPC,EAAO,OACT,EAEA,GAAIQ,IAA0B,EAC5B,OAAOA,CAEX,CAEA,MAAO,EACT,CA9GgB1C,EAAAgC,GAAA,wBAgHT,IAAMW,GAA6B3C,EAAA,CACxC4C,EACAC,IACY,CACZ,OAAQA,EAAU,CAChB,KAAKC,GAAqB,IACxB,MAAO,GACT,KAAKA,GAAqB,KACxB,OAAOF,IAAmBG,GAAgB,SAC5C,KAAKD,GAAqB,MACxB,OACEF,IAAmBG,GAAgB,UACnCH,IAAmBG,GAAgB,QACnCH,IAAmBG,GAAgB,IAEvC,QACE,OAAOH,IAAmBC,CAC9B,CACF,EAlB0C,8BAoB7BG,GAAmBhD,EAACiD,GAClBC,GAAgB,KAAMC,GAASA,EAAK,QAAUF,CAAQ,GACtD,IAFiB,oBAKzB,SAASG,GACdC,EACAC,EACA,CACA,IAAMC,EAA8B,CAAC,CAACF,EAAQ,KAC3CG,GAAMA,EAAE,QAAUC,GAAY,SACjC,EACA,OAAOH,IAAiB,IAASC,CACnC,CARgBvD,EAAAoD,GAAA,wBEvPhB,OAAS,aAAAM,OAAiB,eAMnB,IAAMC,GAAyBC,EAACC,GAAsB,CAC3D,IAAMC,EAAU,KAAK,MAAOD,EAAI,GAAM,EAAE,EAAI,GACtCE,EAAU,UAAUF,EAAI,IAAI,SAAS,CAAC,EAC5C,OAAIE,GAAW,GACN,GAAG,KAAK,MAAMA,EAAU,CAAC,EAAI,CAAC,MAEhC,GAAGA,EAAQ,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,IAAID,EAC9C,SAAS,EACT,SAAS,EAAG,GAAG,CAAC,EACrB,EATsC,0BAWzBE,EAAiBJ,EAAA,CAC5BK,EACAC,EAA6B,KAC7BC,EAA6B,OAClB,CAIX,GAHIF,GAAW,MAGXA,IAAW,GACb,MAAO,GAET,IAAM,EAAI,IAAIG,GAAUH,CAAM,EACxBI,EAAe,EACjBC,EAAO,IACX,QAASC,EAAI,EAAGA,EAAI,GAAIA,IACtB,GAAI,IAAIH,GAAU,EAAE,QAAQG,EAAGF,CAAY,CAAC,EAAE,GAAG,CAAC,EAAG,CACnDC,EAAOC,EACP,KACF,CAGF,GAAI,EAAE,IAAI,GAAK,EACb,OAAO,EAAE,SAAS,EAAGF,CAAY,EAWnC,GATI,EAAE,IAAI,GAAI,GASV,EAAE,IAAI,GAAG,EACX,OAAO,EAAE,SACP,KAAK,IACHC,EACA,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAC5D,EACAG,CACF,EAEF,GAAI,EAAE,IAAI,CAAC,EACT,OAAO,EAAE,SACP,KAAK,IACHC,EACA,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAC5D,EACAG,CACF,EAEF,GAAI,EAAE,IAAI,GAAI,EACZ,OAAO,EAAE,SACP,KAAK,IACHC,EACA,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAC5D,EACAG,CACF,EAEF,QAASE,EAAIL,GAAe,EAAGK,EAAI,GAAIA,IACrC,GAAI,EAAE,IAAI,KAAK,IAAI,GAAI,CAACA,CAAC,CAAC,EACxB,OAAO,EAAE,SACP,KAAK,IACHD,EACA,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAGK,CAAC,CAAC,CAC5D,EACAF,CACF,EAGJ,OAAI,EAAE,UAAU,CAAC,EACR,IAGF,EAAE,SACP,KAAK,IAAIC,EAAM,KAAK,IAAIH,GAAe,IAAK,KAAK,IAAID,GAAe,EAAG,CAAC,CAAC,CAAC,EAC1EG,CACF,CACF,EA/E8B,kBAwFvB,IAAMG,GAAmBC,EAC9BC,GACGA,GAAM,OAAO,CAACC,EAAGC,IAAMD,GAAKC,EAAE,wBAA0B,GAAI,CAAC,GAAK,EAFvC,oBAazB,IAAMC,GAAeC,EAAA,CAACC,EAAcC,IACzCD,EAAK,YAAY,EAAE,QAAQC,EAAW,YAAY,CAAC,EAAI,GAD7B,gBAGfC,GAAmBH,EAACC,GAC/B,CAAC,CAACA,GAAQ,WAAWA,CAAI,EAAI,EADC,oBLzEzB,SAASG,GAAuBC,EAAkC,CACvE,OAAQ,GAAM,CACZ,KAAKA,EAAM,UACT,OAAOC,GAAa,UACtB,KAAKD,EAAM,WACT,OAAOC,GAAa,WACtB,IAAK,CAACD,EAAM,UACV,OAAOC,GAAa,cACtB,QACE,OAAOA,GAAa,YACxB,CACF,CAXgBC,EAAAH,GAAA,0BAaT,SAASI,GACdC,EACAC,EACAC,EACAC,EACuB,CACvB,OAAOD,EACJ,OAAQE,GAAW,CAACC,GAAiB,SAASD,CAAqB,CAAC,EACpE,OAAQA,GAAW,CAClB,GAAM,CAAE,gBAAAE,EAAiB,iBAAAC,CAAiB,EAAIN,EAAcG,CAAM,EAE5D,CAAE,UAAAI,EAAW,QAAAC,CAAQ,EAAIT,EAASI,CAAM,EAG9C,OADEG,IAAqB,CAACC,GAAc,CAAC,CAACL,GAASM,IAAYN,GAEpD,GAELA,EACK,CAAC,CAACG,EAAgB,KACtBI,GAAmBA,EAAe,OAASP,CAC9C,EAEK,EACT,CAAC,EACA,IAAKQ,GAAS,CACb,GAAM,CACJ,KAAAC,EACA,IAAKC,EACL,YAAAC,EACA,aAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,gBAAAX,EACA,oBAAAY,CACF,EAAIjB,EAAcU,CAAI,EAChBQ,EAAkBC,GACtBd,EAAgB,IAAKe,GAASA,EAAK,IAAI,CACzC,EAEMzB,EAAQD,GAAuBK,EAASW,CAAI,CAAC,EACnD,MAAO,CACL,MAAOC,EACP,MAAAC,EACA,KAAMS,GAAkBR,CAAW,EACnC,MAAAlB,EACA,KAAAe,EACA,aAAAI,EACA,WAAAC,EACA,gBAAAC,EACA,gBAAAE,EACA,oBAAAD,CACF,CACF,CAAC,CACL,CArDgBpB,EAAAC,GAAA,8BAuDT,SAASwB,GACdC,EACkB,CAClB,GAAI,CAACA,EACH,OAAO,KAET,IAAID,EAA2C,CAAC,EAChD,OAAAA,EAAgCC,EAAqB,IAClDC,GAAmBA,EAAe,IACrC,EAEOF,CACT,CAZgBzB,EAAAyB,GAAA,iCAcT,SAASG,GACdtB,EACAuB,EACAC,EACAC,EACAtB,EACU,CACV,IAAMuB,EAAmB,CAAC,EAE1B,SAASC,EAAWtB,EAAkBuB,EAAiB,CAIrD,GAAI,CAHiC,CAAC,CAACF,EAAO,KAC3CG,GAAYA,EAAQ,QAAUxB,CACjC,EACmC,CACjC,IAAMyB,EAAqB,CACzB,QAAAF,EACA,MAAOvB,EACP,WAAYL,CACd,EAEA0B,EAAO,KAAKI,CAAU,CACxB,CACF,CAbSpC,EAAAiC,EAAA,cAeT,IAAMP,EAAuBK,GAAuB,CAAC,EAErD,OAAAF,EAAS,QAASM,GAAY,CAC5B,GAAM,CAAE,QAAAD,EAAS,QAAAvB,CAAQ,EAAI0B,GAAmBF,CAAO,EAEjDG,EAAgBZ,EAAqB,OAAS,EAC9Ca,EAAcb,EAAqB,SAASf,CAAO,EACnD6B,EAAY7B,IAAY8B,GAAS,QAQvC,GANEH,GAAiB,CAACC,GAAe,CAACC,EAOlC,OASF,IAAME,EACJ/B,IAAY8B,GAAS,SAAWE,GAAaT,CAAO,EACtD,GAAIM,GAAa,CAACE,EAChB,OAGsBZ,EAAe,SAASnB,CAAO,GAGhC+B,EACjBjC,EAKFwB,EAAWtB,EAASuB,EAAQ,YAAY,CAAC,EAMNR,EAAqB,OACrDrB,GAAUyB,EAAe,SAASzB,CAAK,CAC1C,EAE2B,QAASM,GAAY,CAK9CsB,EAAWtB,EAASuB,EAAQ,YAAY,CAAC,CAC3C,CAAC,EAGHD,EAAWtB,EAASuB,CAAO,CAE/B,CAAC,EAEMF,CACT,CAxFgBhC,EAAA4B,GAAA,iCA0FT,SAASgB,GAAgBC,EAGnB,CACX,GAAM,CAAE,OAAAC,EAAQ,MAAAC,CAAM,EAAIF,EACpBG,EAAU,IAAI,IAEpB,OAAAD,GAAO,MAAM,QAAQ,CAACE,EAAMC,IAAc,CACxC,IAAMC,EAA4BF,EAAK,KAAK,WACtCG,EAA0BH,EAAK,GAAG,WAIxC,GAHAD,EAAQ,IAAIG,CAAyB,EAGjCF,EAAK,cAAe,CACtB,GAAM,CAAE,cAAAI,CAAc,EAAIJ,EAC1BI,EAAc,QAAQ,CAACC,EAAcC,IAAsB,CACzD,IAAMC,EAA6BF,EAAa,KAAK,WAC/CG,EAA2BH,EAAa,GAAG,WAC3CI,EAAaR,IAAcH,EAAM,MAAM,OAAS,EAChDY,EACJJ,IAAsBF,EAAc,OAAS,GAG5C,CAACK,GAAc,CAACC,GAChBD,GACCN,IAA4BI,GAC9BV,IAAW,QAEXE,EAAQ,IAAIQ,CAA0B,EAEpCV,IAAW,OACbE,EAAQ,IAAIS,CAAwB,CAExC,CAAC,CACH,CAEIX,IAAW,OACbE,EAAQ,IAAII,CAAuB,CAEvC,CAAC,EACM,MAAM,KAAKJ,CAAO,CAC3B,CAzCgBhD,EAAA4C,GAAA,mBA6CT,SAASgB,GACdzB,EACA0B,EACA,CACA,OACE1B,EAAQ,UAAY0B,EAAgB,SACpC1B,EAAQ,QAAU0B,EAAgB,OAClC1B,EAAQ,aAAe0B,EAAgB,UAE3C,CATgB7D,EAAA4D,GAAA,6BAWT,SAASE,GACdC,EACAC,EACgB,CAChB,GAAM,CAAE,WAAY3D,EAAO,SAAA4D,EAAW,CAAC,CAAE,EAAIF,EAC7C,OACEE,GAAU,IAAKC,IAAkB,CAC/B,MAAA7D,EACA,OAAQ6D,EAAa,MAAM,OAC3B,OAAQA,EAAa,MAAM,OAC3B,QAASA,EAAa,MAAM,SAAW,KACvC,UAAWA,EAAa,OAAO,OAC/B,QAASA,EAAa,OAAO,SAC7B,OAAQ,IAAIC,GAAUD,EAAa,OAAO,MAAM,EAC7C,UAAU,CAACA,EAAa,OAAO,QAAQ,EACvC,QAAQ,EACX,KAAM,GACN,SAAUF,EAAUE,EAAa,KAAK,GAAG,UAAY,IACvD,EAAE,GAAK,CAAC,CAEZ,CApBgBlE,EAAA8D,GAAA,kBAsBT,SAASM,GACdP,EACiB,CACjB,MAAO,CAAE,GAAGA,EAAiB,QAAS,GAAO,MAAO,EAAK,CAC3D,CAJgB7D,EAAAoE,GAAA,6BAMT,IAAMC,GAA0BrE,EAAC6D,GAAuC,CAC7E,IAAMS,EAAyB,IAAI,IAa7BC,EAZmCV,GAAiB,OACxD,CAACW,EAAwBC,IAChBD,EAAI,UACRE,GAAMA,EAAE,UAAYD,EAAQ,SAAWC,EAAE,QAAUD,EAAQ,KAE9D,IAAM,GACF,CAAC,GAAGD,EAAKC,CAAO,EAChBD,EAEN,CAAC,CACH,GAEiD,IAAKnE,GAAU,CAC9D,IAAMsE,EAAuC,CAC3C,KAAMtE,EAAM,MACZ,SAAU,CAAC,CACb,EACA,OAAKiE,EAAuB,IAAIjE,EAAM,OAAO,GAC3CiE,EAAuB,IAAIjE,EAAM,OAAO,EAE1CiE,EAAuB,QAASM,GAAmB,CAC7CvE,EAAM,UAAYuE,GACpBD,EAAyB,SAAS,KAAKtE,CAAK,CAEhD,CAAC,EACMsE,CACT,CAAC,EACKE,EAAQC,EACZP,GACI,QAASQ,GAAMA,EAAE,QAAQ,GACzB,QAAS,GAAM,GAAG,QAAQ,GAC1B,IAAKA,GACL,IAAIZ,GAAUY,GAAG,QAAUC,EAAI,EAAE,aAAaD,GAAG,UAAY,CAAC,CAChE,GACE,OAAO,CAAC,EAAGA,IAAM,EAAE,KAAKA,CAAC,EAAGC,EAAI,GAAKA,EAC3C,EAAE,SAAS,EAEX,OAAOC,GAA4BJ,CAAK,CAC1C,EAxCuC,2BA0CvC,SAASI,GAA4BC,EAAiC,CACpE,IAAMC,EAAQD,EAAO,SAAS,EAAE,MAAM,GAAG,EACzC,OAAAC,EAAM,CAAC,EAAIA,EAAM,CAAC,EAAE,QAAQ,wBAAyB,GAAG,EACjDA,EAAM,KAAK,GAAG,CACvB,CAJSnF,EAAAiF,GAAA,+BAMF,IAAMG,GAAsBpF,EAAA,CACjCqF,EACA/E,IACY,CACZ,IAAMgF,EAA8BC,GAClC,OAAO,QAAQF,CAAW,EACvB,IAAI,CAAC,CAAC,CAAE1D,CAAc,IAAMA,CAAc,EAC1C,OAAO6D,EAAkB,CAC9B,EACA,OACEF,GACAA,EAA4BhF,CAAM,GAAG,YAEzC,EAbmC,uBA6B5B,SAASmF,GAAcC,EAAyC,CAiBrE,OAhByCA,EACrC,CACE,GAAGA,EACH,OAAQC,EACND,EAAQ,OACR,EACA,CACF,EACA,SAAUC,EACRD,EAAQ,SACR,EACA,CACF,CACF,EACA,IAGN,CAlBgBE,EAAAH,GAAA,iBAoBT,SAASI,GACdC,EACAC,EACQ,CACR,OAAID,GAAe,UAAYC,GAAe,SAE1C,WAAWA,GAAe,UAAY,GAAG,EACzC,WAAWD,GAAe,UAAY,GAAG,EAIzCA,GAAe,QAAUC,GAAe,OAExC,WAAWA,GAAe,QAAU,GAAG,EACvC,WAAWD,GAAe,QAAU,GAAG,EAIpC,CACT,CAnBgBF,EAAAC,GAAA,uBAqBT,SAASG,GACdC,EACAC,EACA,CACA,OACED,GAAQ,aAAeC,GAAQ,YAC/BD,GAAQ,OAAO,YAAY,IAAMC,GAAQ,OAAO,YAAY,GAC5DD,GAAQ,SAAS,YAAY,IAAMC,GAAQ,SAAS,YAAY,CAEpE,CATgBN,EAAAI,GAAA,kBAWT,SAASG,GACdC,EACuB,CACvB,OAAOA,EAAQ,KACb,CAACC,EAAGC,IACF,EAAOA,EAAE,QAAUC,GAAa,WAC9B,EAAOF,EAAE,QAAUE,GAAa,YAClC,EACED,EAAE,QAAUC,GAAa,cACvBD,EAAE,QAAUC,GAAa,YAE3B,EACEF,EAAE,QAAUE,GAAa,cACvBF,EAAE,QAAUE,GAAa,WAEnC,CACF,CAhBgBX,EAAAO,GAAA,qCAkBT,SAASK,GACdC,EAEAC,EAAW,EAEXC,EAAiB,EACT,CACR,GAAIF,EAAQ,OAAS,EAAIC,EAAWC,EAClC,OAAOF,EAET,IAAMG,EAAQH,EAAQ,MAAM,EAAGC,CAAQ,EACjCG,EAAMJ,EAAQ,MAAM,CAACC,CAAQ,EACnC,MAAO,GAAGE,CAAK,GAAG,IAAI,OAAOD,CAAc,CAAC,GAAGE,CAAG,EACpD,CAbgBjB,EAAAY,GAAA,qBAeT,SAASM,GAAW,CACzB,MAAAC,EACA,iBAAAC,EACA,WAAAC,CACF,EAIuB,CACrB,OAAOD,EAAiB,KACrBE,GACCA,EAAgB,aAAeD,GAC/BC,EAAgB,QAAUH,CAC9B,GAAG,OACL,CAdgBnB,EAAAkB,GAAA,cAgBT,SAASK,GAAkBH,EAAqC,CACrE,OAAOA,EACJ,QAASI,GAAWA,EAAO,QAAQ,EACnC,OAAO,CAACC,EAAyB3B,IAAY,CAC5C,IAAM4B,EAAiB,CACrB,OAAQ5B,GAAS,QAAU,GAC3B,SAAUA,GAAS,SAAW,EAC9B,SAAUA,GAAS,SACf,IAAI6B,GAAU7B,GAAS,UAAY8B,EAAI,EACpC,aAAa9B,GAAS,MAAM,EAC5B,SAAS,EACZ,EACN,EAEM+B,EAAY/B,EACdgC,GAAgB,CACd,OAAQhC,EAAQ,OAChB,WAAYA,EAAQ,MACpB,QAASA,EAAQ,OACnB,CAAC,EACD,KAEEiC,EAAcF,EAAYJ,EAASI,CAAS,EAAI,KAOtD,OAJEA,IACC,CAACE,GACCA,GAAeA,EAAY,OAASL,EAAe,UAGtDD,EAASI,CAAS,EAAIH,GAGjBD,CACT,EAAG,CAAC,CAAC,CACT,CAnCgBzB,EAAAuB,GAAA,qBAqCT,IAAMS,GAAoBhC,EAAA,CAC/BoB,EACAa,IAEA,CAAC,CAACb,EAAiB,KAChBI,GAAWA,EAAO,QAAUS,GAAcT,EAAO,OACpD,EAN+B,qBAQ1B,SAASU,GAAiBC,EAAgC,CAC/D,OAAOA,EAAY,IAAKC,GAAMA,EAAE,KAAK,EAAE,KAAK,GAAG,CACjD,CAFgBpC,EAAAkC,GAAA,oBAIT,SAASG,GACd7B,EACA8B,EACA,CACA,IAAMC,EAAwB,IAAI,IAClC,OAAA/B,EAAQ,QAASgB,GAAW,CAC1BA,EAAO,gBAAgB,QAASgB,GAAS,CACvCD,EAAsB,IAAIC,CAAI,CAChC,CAAC,CACH,CAAC,EAC2BF,EAAY,OAAQL,GAC9CM,EAAsB,IAAIN,EAAW,IAAI,CAC3C,CAGF,CAfgBjC,EAAAqC,GAAA,kCAiBT,SAASI,GACdjC,EACAkC,EACA,CACA,OAAIA,IAAaC,GAAqB,IAC7BnC,EAGFA,EAAQ,OAAQgB,GAAW,CAChC,QAAWgB,KAAQhB,EAAO,gBACxB,GAAIoB,GAA2BJ,EAAME,CAAQ,EAC3C,MAAO,GAGX,MAAO,EACT,CAAC,CACH,CAhBgB1C,EAAAyC,GAAA,2BMthBhB,IAAII,GAAmB,CACrB,QAASC,EACX,EAEO,SAASC,GAAUC,EAAqB,CAC7C,OAAOH,GAAQG,CAAI,GAAK,EAC1B,CAFgBC,EAAAF,GAAA,aAaT,SAASG,GAAWC,EAAsB,CAC/C,IAAIC,EACJ,OAAI,OAAO,iBAAoB,WAC7BA,EAAgB,gBAAgBD,CAAW,EAE3CC,EAAgB,KAAK,MAAM,KAAK,UAAUD,CAAW,CAAC,EAExDE,GAAUD,EACHC,EACT,CATgBC,EAAAJ,GAAA,cAWT,IAAMK,GAAyB,GACzBC,GAA2B,GAE3BC,GAA0B,eAE1BC,GAA0BJ,EAAA,CACrCK,EACAC,IACG,CACH,IAAIC,EAAS,GACb,GAAID,GAAgBD,GAClB,GAAI,MAAM,QAAQC,CAAY,EAC5BC,EAAS,CAACD,EAAa,KAAME,GAAUC,GAAeD,EAAOH,CAAK,CAAC,UAC1D,CAAC,MAAM,QAAQC,CAAY,GAAKA,EAAaD,EAAM,UAAU,EAAG,CACzEE,EAASD,EAAaD,EAAM,UAAU,EAAE,OAAO,KAAMG,GACnDC,GAAeD,EAAOH,CAAK,CAC7B,EACA,IAAMK,EAAaJ,EAAaD,EAAM,UAAU,EAAE,WAClD,MAAQ,CAACK,GAAc,CAACH,GAAYG,GAAcH,CACpD,EAEF,OAAOA,CACT,EAjBuC,2BAmB1BI,GAA+BX,EAAA,CAC1CY,EACAC,IAGED,GACAC,GACA,CAACA,EAAkB,SAASD,EAAW,IAAI,EAPH,gCAW/BE,GAAsBd,EAAA,CACjCe,EACAC,EACAC,IAGGA,IAAY,aAAeF,GAAiBC,IAC5CC,IAAY,iBAAmBD,EAPD,uBR7EnC,IAAIE,GAESC,GAAcC,EAAA,IACrBF,KAGJA,GAAQ,IAAIG,GAAYC,GAAU,SAAS,EAAGA,GAAU,UAAU,CAAC,EAC5DJ,IALkB,eSOpB,SAASK,GACdC,EACAC,EAC2B,CAC3B,IAAMC,EAAoBF,EAAS,IAAKG,GAAYA,EAAQ,YAAY,EAElEC,EAAgE,CAAC,EAIvE,OAFoBC,GAAoBL,EAAS,IAAKM,GAAMA,EAAE,YAAY,CAAC,EAE/D,IAAKC,GAAoB,CACnC,IAAMC,EAAcR,EAAS,KAC1BG,GAAYA,EAAQ,eAAiBI,CACxC,EAEA,GAAIC,EAAa,CACf,IAAIC,EAAqB,GACrBP,IACFO,EAAqBP,EAAkB,KACpCQ,GAAkBA,IAAkBF,EAAY,YACnD,GAGEC,GACFD,EAAY,MAAM,IAAKG,GAAoB,CACzCP,EAA8B,KAAK,CACjC,GAAII,EAAY,aAChB,WAAYA,EAAY,aACxB,KAAMA,EAAY,KAClB,KAAMG,EACN,SAAU,CAACV,EAAyB,SAClCO,EAAY,YACd,CACF,CAAC,CACH,CAAC,CAEL,CACF,CAAC,EAEMJ,CACT,CAxCgBQ,EAAAb,GAAA,2BA0CT,SAASc,GACdC,EACAC,EACA,CACA,OAAID,EAAE,aAAeC,EAAE,aACd,GAGLD,EAAE,aAAeC,EAAE,aACd,EAGF,CACT,CAbgBH,EAAAC,GAAA,oCAeT,SAASG,GAAgBC,EAAyBC,EAAqB,CAC5E,OAAOA,IAAWD,CAAO,IAAM,QACjC,CAFgBL,EAAAI,GAAA,mBAIT,SAASG,GAAiBF,EAAyBC,EAAqB,CAC7E,OAAOA,IAAWD,CAAO,IAAM,SACjC,CAFgBL,EAAAO,GAAA,oBAIT,IAAMC,GAAmCR,EAAA,CAC9CS,EACAC,EACAJ,IAE6BF,GAAgB,eAAgBE,CAAQ,EAGjEG,EACAA,EAAgB,OAAOC,CAAY,EATO,oCClBzC,IAAMC,GAKTC,EAAA,CAACC,EAAKC,KAAS,CAEjB,sBAAuB,IAAI,IAC3B,sBAAuB,IAAI,IAC3B,2BAA4B,CAAC,EAC7B,eAAgB,CAAC,EACjB,UAAW,CAAC,EACZ,YAAa,UAEb,YAAcC,GAAY,CACxB,IAAMC,EAAuBF,EAAI,EAAE,sBAC7BG,EAAuB,MAAM,KACjCD,GAAsB,OAAO,GAAK,CAAC,CACrC,EAEA,GAAI,CAACD,GAAW,CAACA,GAAS,KACxB,OAAOE,EAET,IAAMC,EAASJ,EAAI,EAAE,OAErB,GAAIC,EAAQ,OAAS,eAAgB,CACnC,IAAMI,EAAiCC,GAAkC,CACvE,OAAAF,CACF,CAAC,EAEGG,EAAyCJ,EAM7C,OAAIE,EAA+B,OAAS,IAC1CE,EAAuBA,EAAqB,OAAQC,GAClDH,EAA+B,SAASG,EAAW,IAAI,CACzD,GAGKD,EAAqB,OAAQC,GAClCC,GAAqC,SAASD,EAAW,IAAI,CAC/D,CACF,CAEA,IAAMH,GACHJ,EAAQ,OAAS,SACdG,EAAO,MAAM,YACbA,EAAO,IAAI,cAAgB,CAAC,EAalC,OAXaD,EAAqB,OAAQK,GAEtC,EAAAH,EAA+B,OAAS,GACxC,CAACA,EAA+B,SAASG,EAAW,IAAI,EAM3D,CAGH,EACA,OAASP,GAAY,CACnB,GAAM,CACJ,sBAAAS,EACA,2BAAAC,EACA,OAAAP,EACA,cAAAQ,CACF,EAAIZ,EAAI,EACFa,EAAkB,MAAM,KAAKH,EAAsB,OAAO,CAAC,EAC3DR,EAAuBF,EAAI,EAAE,sBACnC,GAAI,CAACC,GAAW,CAACA,EAAQ,KACvB,OAAOY,EAGT,IAAMC,EAAab,EAAQ,OAAS,SAAW,OAAS,KAClDc,EACJd,EAAQ,OAAS,SACb,wBACA,6BAEFe,EAAkBC,GAAa,IAAIF,CAAQ,EAC1CC,GAAiB,SACpBA,EAAkBE,GAA8B,CAC9C,KAAMjB,EAAQ,KACd,OAAQ,CACN,YAAaG,EAAOU,CAAU,GAAG,YACjC,OAAQV,EAAOU,CAAU,GAAG,MAC9B,EACA,KAAM,CACJ,qBAAsBJ,EACtB,0BAA2BC,CAC7B,CACF,CAAC,EACDM,GAAa,IAAIF,EAAUC,CAAe,GAG5CA,EAAkBG,GAChBH,EACAJ,EACAR,EAAO,QACT,EAEA,IAAMgB,EAAcpB,EAAI,EAAE,YAAY,CACpC,KAAMC,EAAQ,IAChB,CAAC,EA8FD,OA5Fae,EACV,OAAQK,GAEDpB,EAAQ,YAAcoB,EAAM,aAAepB,EAAQ,YAMvD,CAACmB,EAAY,KAAMZ,GACVA,EAAW,OAASa,EAAM,UAClC,EAEM,GAILpB,EAAQ,UAER,GAAAqB,GAAaD,EAAM,OAAQpB,EAAQ,SAAS,GAC5CqB,GAAaD,EAAM,SAAW,GAAIpB,EAAQ,SAAS,GACnDqB,GAAaD,EAAM,MAAQ,GAAIpB,EAAQ,SAAS,GAQ7C,EACR,EACA,KAAK,CAACsB,EAAQC,IAAW,CAExB,IAAMC,EAAiBzB,EAAI,EAAE,cAAcuB,EAAQtB,EAAQ,IAAI,EACzDyB,EAAiB1B,EAAI,EAAE,cAAcwB,EAAQvB,EAAQ,IAAI,EAC/D,GAAIwB,IAAmBC,EACrB,OAAOD,EAAiB,GAAK,EAI/B,GAAIxB,EAAQ,cAAe,CACzB,IAAM0B,EAAgB1B,EAAQ,cAAcsB,CAAM,EAC5CK,EAAgB3B,EAAQ,cAAcuB,CAAM,EAC5CK,EAAiBC,GACrBH,EACAC,CACF,EACA,GAAIC,IAAmB,EACrB,OAAOA,CAEX,CAEA,IAAME,EAAc7B,EAAqB,IAAIqB,EAAO,UAAU,EACxDS,EAAc9B,EAAqB,IAAIsB,EAAO,UAAU,EAGxDS,EAAiBC,GAAcX,EAAQQ,CAAW,EAClDI,EAAiBD,GAAcV,EAAQQ,CAAW,EACxD,GAAIC,IAAmBE,EACrB,OAAOF,EAAiB,GAAK,EAI/B,GAAIV,EAAO,YAAcC,EAAO,UAC9B,OAAOD,EAAO,UAAY,GAAK,EAIjC,GAAItB,EAAQ,UAAW,CACrB,IAAMmC,EAAyBC,GAC7Bd,EACAC,EACAvB,EAAQ,SACV,EACA,GAAImC,EACF,OAAOA,CAEX,CAGA,OAAIb,EAAO,kBAAoBC,EAAO,gBAC7BD,EAAO,gBAAkB,EAAI,GAIhCQ,GAAiBC,EACdD,EAAY,KAAOC,EAAY,KAGjC,CACT,CAAC,CAGL,EACA,UAAYM,GAAU,CACpB,IAAMC,EAAuBvC,EAAI,EAAE,sBAC7BwC,EAAexC,EAAI,EAAE,aAAa,EAClCyC,EAAYC,GAAgBJ,CAAK,EACnCjB,EAAQkB,EAAqB,IAAIE,CAAS,EAC9C,OAAKpB,IACHA,EAAQmB,EAAa,KAClBG,GAAgBD,GAAgBC,CAAW,IAAMF,CACpD,GAEKpB,CACT,EACA,cAAe,CAACA,EAAOuB,IAKN,CAAC,EAHdA,IAAS,SACL5C,EAAI,EAAE,OAAO,MAAM,aACnBA,EAAI,EAAE,OAAO,IAAI,eACQ,KAAM6C,GACnCC,GAAeD,EAAaxB,CAAK,CACnC,EAGF,SAAU,IAAM,CACd,GAAM,CAAE,OAAAjB,EAAQ,aAAA2C,CAAa,EAAI/C,EAAI,EAE/BgD,EAA8BD,EAAa,kBAAkB,OAC/DA,EAAa,iBACb,KAEEE,EACJD,GAA+B5C,EAAO,iBAElC8C,EAA0BF,EAC5B,GACA5C,EAAO,wBAuBX,OAjBiBJ,EAAI,EAAE,UAAU,OAAQmD,GAAY,CACnD,IAAMC,EAAyCH,GAAkB,SAC/DE,EAAQ,YACV,EAOA,OAJED,GACA,CAACD,GACDA,EAAiB,SAAW,EAG1B,CAACG,EACDA,CACN,CAAC,EAE+B,KAAKC,EAAgC,CAGvE,EAEA,MAAO,SAAY,CACjB,GAAI,CACF,GAAM,CAAE,0BAAAC,CAA0B,EAAItD,EAAI,EAAE,OACtCuD,EAAW,MAAMC,GAAI,EAAE,eAAe,CAC1C,0BAAAF,CACF,CAAC,EACDvD,EAAI,CAAE,YAAa,SAAU,CAAC,EAC9B,IAAMG,EAAoD,IAAI,IAKxDuD,EAA8C,IAAI,IAIlDC,EACJ,CAAC,EACGC,EAAkB,CAAC,EACnBC,EAAyBL,EAAS,cAClCM,EAA0BN,EAAS,SAEnCO,EAAiC,IAAI,IAE3CP,EAAS,OAAO,QAASlC,GAAU,CACjCyC,EAA+B,IAAIzC,EAAM,UAAU,EAEnDsC,EAAO,KAAKtC,CAAK,CACnB,CAAC,EAEwBkC,EAAS,YAAY,KAC5C,CAACQ,EAAGC,IAAMD,EAAE,KAAOC,EAAE,IACvB,EAEiB,QAASxD,GAAe,CAErCA,EAAW,SACXsD,EAA+B,IAAItD,EAAW,IAAI,GAElDN,EAAqB,IAAIM,EAAW,KAAMA,CAAU,CAExD,CAAC,EAEDmD,EAAO,QAAStC,GAAU,CACxB,IAAMoB,EAAYC,GAAgBrB,CAAK,EAClCqC,EAA0BrC,EAAM,UAAU,IAC7CqC,EAA0BrC,EAAM,UAAU,EAAI,CAAC,GAEjDoC,EAAqB,IAAIhB,EAAWpB,CAAK,EACzCqC,EAA0BrC,EAAM,UAAU,EAAE,KAAKoB,CAAS,CAC5D,CAAC,EAED1C,EAAI,CACF,sBAAuBG,EACvB,sBAAuBuD,EACvB,2BAA4BC,EAC5B,eAAgBE,EAChB,UAAWC,CACb,CAAC,CACH,OAASI,EAAO,CACd,MAAAlE,EAAI,CAAE,YAAa,QAAS,CAAC,EACvBkE,CACR,CACF,CACF,GAnUI,mBC/DJ,OACE,WAAAC,GACA,WAAAC,GACA,WAAAC,GACA,UAAAC,GACA,UAAAC,GACA,UAAAC,GACA,WAAAC,GACA,YAAAC,GACA,eAAAC,GACA,UAAAC,GACA,cAAAC,GACA,WAAAC,GACA,WAAAC,GACA,WAAAC,GACA,aAAAC,OACK,gBASA,IAAMC,GAA4B,CACvC,CAAE,MAAO,UAAW,MAAO,UAAW,MAAO,KAAM,QAASd,EAAQ,EACpE,CAAE,MAAO,UAAW,MAAO,aAAW,MAAO,KAAM,QAASW,EAAQ,EACpE,CAAE,MAAO,SAAU,MAAO,cAAY,MAAO,KAAM,QAAST,EAAO,EACnE,CAAE,MAAO,WAAY,MAAO,qBAAO,MAAO,KAAM,QAASI,EAAS,EAClE,CAAE,MAAO,aAAc,MAAO,eAAa,MAAO,KAAM,QAASG,EAAW,EAC5E,CAAE,MAAO,UAAW,MAAO,qBAAO,MAAO,KAAM,QAASV,EAAQ,EAChE,CAAE,MAAO,UAAW,MAAO,6CAAW,MAAO,KAAM,QAASW,EAAQ,EACpE,CAAE,MAAO,SAAU,MAAO,UAAW,MAAO,KAAM,QAASP,EAAO,EAClE,CAAE,MAAO,YAAa,MAAO,6CAAW,MAAO,KAAM,QAASU,EAAU,EACxE,CAAE,MAAO,UAAW,MAAO,UAAW,MAAO,KAAM,QAASD,EAAQ,EACpE,CAAE,MAAO,UAAW,MAAO,cAAe,MAAO,KAAM,QAASX,EAAQ,EACxE,CAAE,MAAO,QAAS,MAAO,aAAc,MAAO,KAAM,QAASM,EAAY,EACzE,CAAE,MAAO,QAAS,MAAO,SAAU,MAAO,KAAM,QAASH,EAAO,EAChE,CAAE,MAAO,UAAW,MAAO,WAAY,MAAO,KAAM,QAASC,EAAQ,EACrE,CAAE,MAAO,SAAU,MAAO,SAAU,MAAO,KAAM,QAASG,EAAO,CACnE,EAEaO,GAAmB,KCzCzB,IAAMC,GAAY,CAAC,GAAK,EAAQ,CAAI,EAE9BC,GAAmB,EAEnBC,GAAgB,EAEhBC,GAAe,IAEfC,GAAe,ECyCrB,IAAMC,GAKTC,EAAA,CAACC,EAAKC,KAAS,CACjB,yBAA0B,CAAC,EAC3B,MAAO,OACP,SAAU,KACV,qBAAsB,CAAC,EACvB,SAAUC,GACV,eAAgB,KAChB,gBAAiB,GACjB,aAAc,KACd,iBAAkB,KAClB,iBAAkB,KAClB,cAAe,CAAC,EAEhB,uBAAyBC,GAAe,CACtC,IAAMC,EAA8BH,EAAI,EAAE,qBAW1C,GAT2BG,EAA4B,KACrD,CAACC,EAAqBC,IAAU,CAC9B,IAAMC,EAAmBF,IAAwBF,EAC3CK,EAAkBF,GAAS,EAEjC,OAAOC,GAAoBC,CAC7B,CACF,EAGE,OAGF,IAAMC,EACJL,EAA4B,OAAQC,GAG3B,EAFkBA,IAAwBF,EAGlD,EAEHH,EAAI,KAAO,CACT,qBAAsB,CAACG,EAAY,GAAGM,CAAwB,CAChE,EAAE,CACJ,EACA,YAAcC,GACZV,EAAI,KAAO,CACT,SAAUU,CACZ,EAAE,EAEJ,kBAAoBC,GAClBX,EAAI,KAAO,CACT,eAAgBW,CAClB,EAAE,EACJ,gBAAkBC,GAChBZ,EAAI,KAAO,CACT,aAAAY,CACF,EAAE,EACJ,oBAAsBC,GACpBb,EAAI,KAAO,CACT,iBAAAa,CACF,EAAE,EAEJ,oBAAsBC,GACpBd,EAAI,KAAO,CACT,iBAAAc,CACF,EAAE,EACJ,0BAA2B,CAACC,EAAUC,IACpChB,EAAKiB,GAAU,CACb,GAAID,EACF,MAAO,CAAE,yBAA0B,CAAC,CAAE,EAExC,IAAME,EAAgBC,GACpBJ,EAAS,IAAKK,GAAYA,EAAQ,YAAY,CAChD,EAEA,OAAIF,EAAc,SAAWD,EAAM,yBAAyB,OACnD,CAAE,yBAA0B,CAAC,CAAE,EAGjC,CACL,yBAA0BC,CAC5B,CACF,CAAC,EACH,sBAAuB,IACrBlB,EAAKiB,IAAW,CACd,gBAAiB,CAACA,EAAM,eAC1B,EAAE,EAEJ,sBAAwBI,GACtBrB,EAAKiB,GACCA,EAAM,yBAAyB,SAASI,CAAI,EACvC,CACL,yBAA0BJ,EAAM,yBAAyB,OACtDK,GAAoBA,GAAmBD,CAC1C,CACF,EAEK,CACL,yBAA0BJ,EAAM,yBAAyB,OAAOI,CAAI,CACtE,CACD,EACH,SAAWE,GACTvB,EAAI,KAAO,CACT,MAAAuB,CACF,EAAE,EACJ,YAAcC,GACZxB,EAAI,KAAO,CACT,SAAAwB,CACF,EAAE,EACJ,eAAiBC,GAA6B,CAC5C,GAAM,CAAE,SAAAC,EAAU,MAAAH,CAAM,EAAIE,EAEtBE,EAAgBC,GAAgB,QAASF,CAAQ,EACjDG,EAAmBD,GAAgB,WAAYF,CAAQ,EACvDI,EAAoBF,GAAgB,kBAAmBF,CAAQ,EAC/DK,EAAcR,GAAO,YACrBS,EACJP,GAAY,0BAA0B,mBAExCzB,EAAI,CACF,GAAI2B,GAAiB,CAAE,MAAOF,EAAW,OAAO,MAAQ,MAAO,EAC/D,GAAIM,GAAe,CAAE,MAAON,EAAW,OAAO,MAAQ,OAAQ,EAC9D,GAAII,GAAoB,CACtB,SAAUJ,EAAW,UAAYQ,EACnC,EACA,GAAIH,GAAqB,CACvB,yBAA0BL,EAAW,kBAAoB,CAAC,CAC5D,EACA,GAAIO,GAAsB,CAExB,SAAUP,EAAW,UAAYQ,EACnC,CACF,CAAC,CACH,EACA,eAAiBC,GACflC,EAAKiB,IAAW,CACd,cAAe,CAACiB,EAAO,GAAGjB,EAAM,aAAa,CAC/C,EAAE,EACJ,kBAAoBiB,GAClBlC,EAAKiB,IAAW,CACd,cAAeA,EAAM,cAAc,OAChCkB,GAAgBA,EAAY,UAAYD,EAAM,OACjD,CACF,EAAE,EACJ,aAAc,IAAM,CAClB,IAAME,EAASnC,EAAI,EAAE,OAEfoC,EAAepC,EAAI,EAAE,cACrBqC,EAAiCC,GAAkC,CACvE,OAAAH,CACF,CAAC,EAED,OAAQE,EAA+B,OAEnCD,EAAa,OAAQH,GACnBI,EAA+B,SAASJ,EAAM,UAAU,CAC1D,EAHAG,CAIN,CACF,GA1JI,uBnBlCG,SAASG,GAAeC,EAA4B,CACzD,OAAOC,GAAsB,EAC3BC,GACE,IAAIC,KAAO,CACT,GAAGC,GAAgB,GAAGD,CAAC,EACvB,GAAGE,GAAoB,GAAGF,CAAC,EAC3B,GAAGG,GAAkBN,EAAa,GAAGG,CAAC,CACxC,GACA,CACE,KAAM,gBACN,cAAe,GACf,WAAaI,IACJ,CACL,cAAeA,EAAM,cACrB,MAAOA,EAAM,MACb,SAAUA,EAAM,SAChB,iBAAkBA,EAAM,iBACxB,aAAcA,EAAM,aACpB,iBAAkBA,EAAM,iBACxB,SAAUA,EAAM,SAChB,eAAgBA,EAAM,eACtB,gBAAiBA,EAAM,gBACvB,qBAAsBA,EAAM,qBAC5B,yBAA0BA,EAAM,wBAClC,EAEJ,CACF,CACF,CACF,CA7BgBC,EAAAT,GAAA,kBDdT,IAAMU,GAAkBC,GAA+B,IAAI,EAE3D,SAASC,GAAc,CAC5B,IAAMC,EAAQC,GAAWJ,EAAe,EAQxC,GANAK,GAAU,IAAM,CACVF,GAAS,CAACA,EAAM,QAAQ,YAAY,GACjCA,EAAM,QAAQ,UAAU,CAEjC,EAAG,CAAC,CAAC,EAED,CAACA,EACH,MAAM,IAAI,MAAM,8CAA8C,EAGhE,OAAOA,EAAM,CACf,CAdgBG,EAAAJ,EAAA,eAgBT,SAASK,GAAiBC,EAA8B,CAC7D,IAAMC,EAAcC,GAAiB,EAErC,OAAKD,EAAY,UACfA,EAAY,QAAUE,GAAeH,EAAM,MAAM,GAIjDI,GAAA,cAACZ,GAAgB,SAAhB,CAAyB,MAAOS,EAAY,SAC1CD,EAAM,QACT,CAEJ,CAZgBF,EAAAC,GAAA,oBqBvBhB,OAAS,UAAAM,OAAc,UACvB,OAAS,yBAAAC,OAA6B,qBCJtC,OAAOC,OAAU,OAEV,IAAMC,GAAeD,GAAa,EAG5BE,GAAyC,CACpD,GAAID,GAAa,GACjB,IAAKA,GAAa,GACpB,ECHA,OAAS,gBAAgBE,OAA0B,wCAe5C,IAAKC,QACVA,EAAA,mBAAqB,mBACrBA,EAAA,oBAAsB,oBAFZA,QAAA,IAKAC,QACVA,EAAA,QAAU,UACVA,EAAA,WAAa,aAFHA,QAAA,IASAC,QACVA,EAAA,qBAAuB,qBADbA,QAAA,IAyCAC,QACVA,IAAA,WAAaJ,GAAmB,YAAhC,aACAI,IAAA,UAAYJ,GAAmB,WAA/B,YACAI,EAAA,WAAa,aACbA,EAAA,YAAc,cACdA,EAAA,QAAU,UALAA,QAAA,ICrEZ,IAAMC,GAAkBC,EACtBC,GACG,CACH,IAAMC,EAAQD,EACdC,EAAM,IAAM,CAAC,EACb,QAAWC,KAAK,OAAO,KAAKD,EAAM,SAAS,CAAC,EACzCA,EAAM,IAAYC,CAAC,EAAI,IAAMD,EAAOE,GAAMA,EAAED,CAAmB,CAAC,EAGnE,OAAOD,CACT,EAVwB,mBAYjBG,GAAQN,GHoCR,IAAMO,EAAkBC,GAC7BC,GAAqB,EACnBC,GAAsB,CAACC,EAAKC,KACnB,CACL,iBAAkB,CAAC,EACnB,SAAU,CAAC,EACX,QAAS,GACT,cAAe,CAACC,EAAUC,IAAc,CACtCC,GAAa,mBAA+B,CAC1C,eACA,QAAS,CAAE,WAAYF,EAAS,CAAC,EAAE,WAAY,SAAAA,CAAS,CAC1D,CAAC,EAED,IAAMG,EAAoBJ,EAAI,EAAE,kBAChCD,EAAKM,IAAW,CACd,QAAS,GACT,iBAAkBA,EAAM,iBACrB,OAAQC,GAAWA,EAAO,aAAeL,EAAS,CAAC,EAAE,UAAU,EAC/D,OACCA,EAAS,IAAKM,GAAY,CACxB,IAAMC,EACJ,CAACH,EAAM,iBAAiB,KACrBI,GACCA,EAAgB,QAAUF,EAAQ,OAClCE,EAAgB,UAKhBA,EAAgB,aAAeF,EAAQ,UAC3C,EACF,MAAO,CACL,SAAU,CAAC,EACX,QAASA,EAAQ,QACjB,MAAOA,EAAQ,MACf,YAAa,KACb,WAAYA,EAAQ,WACpB,SAAUC,EACV,QAAS,GACT,MAAO,EACT,CACF,CAAC,CACH,CACJ,EAAE,EACFJ,EAAkBH,EAAUC,CAAS,CACvC,EACA,iBAAmBQ,GAAe,CAChCX,EAAKM,GAAU,CAEXA,EAAM,iBAAiB,KACpBC,GAAWA,EAAO,aAAeI,CACpC,GAEAP,GAAa,mBAA+B,CAC1C,kBACA,QAAS,CAAE,WAAAO,CAAW,CACxB,CAAC,EAGH,IAAMC,EAAkBN,EAAM,iBAC3B,OACEI,GACCA,EAAgB,UAChBA,EAAgB,aAAeC,CACnC,EACC,IAAKE,GAAmBA,EAAe,KAAK,EAEzCC,EAAmBR,EAAM,iBAC5B,OACEI,GAAoBA,EAAgB,aAAeC,CACtD,EACC,IAAKD,GACmCE,EAAgB,SACrDF,EAAgB,KAClB,EAESA,GAETE,EAAgB,KAAKF,EAAgB,KAAK,EACnC,CAAE,GAAGA,EAAiB,SAAU,EAAK,EAC7C,EAIH,MAAO,CACL,SAHeK,GAAkBD,CAAgB,EAIjD,iBAAAA,CACF,CACF,CAAC,CACH,EACA,cAAgBE,GACdhB,EAAKM,IAAW,CACd,iBAAkBA,EAAM,iBAAiB,IAAKI,GAAoB,CAChE,IAAMO,EAAiB,CAAC,CAACD,EAAQ,KAC9BT,GACCA,EAAO,QAAUG,EAAgB,OACjCH,EAAO,aAAeG,EAAgB,YACtCA,EAAgB,QACpB,EACMQ,EAAoB,CAAC,CAACF,EAAQ,KACjCT,GACCA,EAAO,QAAUG,EAAgB,OACjCH,EAAO,aAAeG,EAAgB,YACtC,CAACA,EAAgB,QACrB,EACA,OAAIO,EACK,CAAE,GAAGP,EAAiB,SAAU,EAAM,EACpCQ,EACF,CAAE,GAAGR,EAAiB,SAAU,EAAK,EAGvCA,CACT,CAAC,CACH,EAAE,EACJ,qBAAsB,IACpBV,EAAI,KAAO,CACT,iBAAkB,CAAC,EACnB,gBAAiB,CAAC,CACpB,EAAE,EACJ,kBAAmB,MAAOE,EAAUC,EAAWgB,EAAc,KAAS,CACpE,IAAMd,EAAoBJ,EAAI,EAAE,kBAChCD,EAAKM,IAAW,CACd,QAAS,GACT,iBAAkBA,EAAM,iBAAiB,IAAKC,GACrCL,EAAS,KAAMM,GACpBY,GAA0BZ,EAASD,CAAM,CAC3C,EACI,CAAE,GAAGA,EAAQ,QAAS,EAAK,EAC3BA,CACL,CACH,EAAE,EACF,GAAI,CACF,IAAMc,EAAOnB,EAAS,IAAI,CAAC,CAAE,QAAAoB,EAAS,MAAAC,CAAM,KAAO,CACjD,QAAAD,EACA,WAAYC,CACd,EAAE,EAEIC,GADW,MAAMC,GAAY,EAAE,kBAAkBJ,CAAI,GACzB,QAClC,GAAIG,EACFxB,EAAKM,GAAU,CACb,IAAMQ,EAAmBR,EAAM,iBAAiB,IAC7CI,GAAoB,CACnB,IAAMgB,EAAiBxB,EAAS,KAAMM,GACpCY,GAA0BZ,EAASE,CAAe,CACpD,EACMiB,EAA0BH,EAAiB,KAC9CI,GACCA,EAAQ,UAAYlB,EAAgB,SACpCkB,EAAQ,aAAelB,EAAgB,KAC3C,EACA,OACEiB,GAAyB,QACzBD,GACAP,GAEAd,EAAkB,CAACqB,CAAc,EAAGvB,EAAW,EAAK,EAE/CuB,GAAkBC,EACrB,CACE,GAAGjB,EACH,YAAaiB,EAAwB,YACrC,SAAUE,GACRF,EACAxB,CACF,EACA,QAAS,GACT,MAAO,EACT,EACAO,CACN,CACF,EAGA,MAAO,CACL,QAAS,GACT,SAHeK,GAAkBD,CAAgB,EAIjD,iBAAAA,CACF,CACF,CAAC,MAED,OAAM,IAAI,MAAM,kBAAkB,CAEtC,MAAgB,CACdd,EAAKM,GAAU,CACb,IAAMQ,EAAmBR,EAAM,iBAAiB,IAAKsB,GAC5C1B,EAAS,KAAMM,GACpBY,GAA0BZ,EAASoB,CAAO,CAC5C,EACIE,GAA0BF,CAAO,EACjCA,CACL,EAID,MAAO,CACL,QAAS,GACT,SAJeb,GAAkBD,CAAgB,EAKjD,iBAAAA,CACF,CACF,CAAC,CACH,CACF,EACA,cAAgBiB,GAAU,CACxB,GAAM,CAAE,SAAAC,CAAS,EAAI/B,EAAI,EACnBgC,EAAYC,GAAgBH,CAAK,EAEvC,OADgBC,EAASC,CAAS,GAChB,IACpB,CACF,EACD,CACH,CACF,EIxQA,OAAS,gBAAAE,OAAoB,0BAgBtB,SAASC,GACdC,EACAC,EACqB,CACrB,IAAMC,EAAMC,GAAa,CACvB,eAAgB,CACd,cAAeF,GAAS,wBAA0B,GAClD,4BACEA,GAAS,oCACb,EACA,kBAAmBD,EACnB,OAAQC,GAAS,eACb,CAAE,SAAUA,EAAQ,cAAe,EACnC,MACN,CAAC,EAED,GAAID,EAAW,CACb,IAAMI,EAAyC,CAAC,EAEhD,OAAAJ,EAAU,QAASK,GAAsB,CAMvC,GAAI,OAAOA,GAAsB,SAAU,CACzC,IAAMC,EAAwCJ,EAAI,KAAMK,GAC/CA,EAAS,OAAO,OAASF,CACjC,EACGC,EACFF,EAAkB,KAAKE,CAAM,EAE7B,QAAQ,KACN,iBAAiBD,CAAiB,+DACpC,CAEJ,MAEED,EAAkB,KAAKC,CAAiB,CAE5C,CAAC,EACMD,CACT,CAEA,OAAOF,CACT,CA7CgBM,EAAAT,GAAA,6BA+CT,SAASU,GACdC,EACAT,EACU,CAKV,OAJkBF,GAA0BW,EAAQT,CAAO,EACnC,IAAKM,GACpBA,EAAS,OAAO,IACxB,CAEH,CATgBC,EAAAC,GAAA,6B1BzChB,IAAME,GAAwB,OAAO,OAAOC,EAAW,EAkBhD,SAASC,GAAcC,EAAsB,CAClD,GAAM,CAAE,MAAAC,CAAM,EAAID,GAAU,CAAC,EACvB,CAAE,OAAAE,CAAO,EAAIC,EAAY,EACzB,CAAE,MAAAC,EAAO,cAAAC,CAAc,EAAIC,GAAW,EACtC,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EACvCC,EAAcN,EAAY,EAAE,YAAY,EACxC,CAAE,iBAAAO,CAAiB,EAAIC,GAAmB,EAG1CC,EACJC,GAA0BX,GAAQ,QAAS,CACzC,eAAgBA,GAAQ,eACxB,uBAAwBA,GAAQ,uBAChC,qCACEA,EAAO,0BAA0B,oCACrC,CAAC,GAAKL,GAEJiB,EAAUC,GACZX,EACAC,EACAO,EACAX,CACF,EAEAa,EAAUE,GAAoB,EAC1BF,EAAQ,OACLG,GACCA,EAAO,eAAiB,IAASb,EAAMa,EAAO,IAAI,EAAE,SACxD,EACAH,EAEJ,IAAMI,EAAgBC,GAAkCL,CAAO,EAEzDM,EAA8BC,EAACC,GACnC,CAACf,EAAiB,KACfgB,GACCA,EAAgB,aAAeD,GAC/BC,EAAgB,QAAUtB,CAC9B,EALkC,+BAO9BuB,EAA6BC,GAAY,IAAM,CACnD,IAAMC,EACJZ,GAAS,OAAQG,GAAWA,EAAO,QAAUU,GAAY,UAAU,GACnE,CAAC,EACH,QAAWV,KAAUS,EACdhB,EAAiBO,EAAO,IAAI,CAErC,EAAG,CAACW,GAAiBd,CAAO,CAAC,CAAC,EAE9Be,GAAU,IACD,IAAM,CACXL,EAA2B,CAC7B,EACC,CAAC,CAAC,EAOL,IAAMM,EAAkCT,EAACP,GAA0B,CAEjE,IAAMiB,EAAgBjB,EAAQ,KAC3BG,GAAWA,EAAO,OAASnB,GAAY,OAC1C,EACA,MAAI,CAACiC,GAAiBA,EAAc,QAAUJ,GAAY,cACjD,GAOiCb,EAAQ,OAC/CG,GACCA,EAAO,OAASU,GAAY,eAC5B,CAAC,CACC7B,GAAY,QACZA,GAAY,iBACZA,GAAY,MACd,EAAE,SAASmB,EAAO,IAAmB,GACrCZ,EAAcY,EAAO,IAAI,EAAE,gBAAgB,OACxCe,GAAeA,EAAW,MAAQ,KACrC,EAAE,OAAS,CACf,EACyC,QAAU,CACrD,EA1BwC,mCA4BlCC,EAAsBZ,EAAA,CAC1BC,EACArB,EACAQ,IAGGyB,GAAoBzB,EAAaR,CAAK,GACrCmB,EAA4BE,CAAU,GACtC,CAACa,GAAyB,SAASb,CAAU,GAC9CA,GAAcxB,GAAY,SACzB,CAACgC,EAAgChB,CAAO,EAVlB,uBAc5B,MAAO,CACL,KAAMI,EAAc,OACjBD,GAAW,CAACgB,EAAoBhB,EAAO,KAAMhB,GAAS,GAAIQ,CAAW,CACxE,EACA,2BAAAe,CACF,CACF,CA5GgBH,EAAAtB,GAAA,iB2BxChB,OAAS,SAAAqC,OAAa,gBACtB,OAAOC,OAAW,QCDlB,OAAS,UAAAC,OAAc,UCDhB,IAAMC,GAAe,eCOrB,IAAMC,GAAN,KAAgD,CAOrD,YAAYC,EAAgB,CAL5B,KAAQ,MAAqD,gBAE7D,KAAQ,OAAiB,CAAC,EAS1B,UAAO,IAAM,CACX,KAAK,WAAW,EACX,KAAK,SAAS,CACrB,EAKA,gBAAa,IAAM,CACjB,GAAI,CAAC,KAAK,UAAU,EAAG,CACrB,IAAMC,EAAmB,CAAE,KAAM,cAAe,YAAa,KAAK,KAAM,EACxE,KAAK,QAAQ,YAAYA,CAAO,EAChC,WAAW,IAAM,CACV,KAAK,UAAU,GAClB,KAAK,MAAM,CAEf,EAAG,GAAO,CACZ,CACF,EAEA,eAAY,IACH,KAAK,QAAU,UAMxB,aAAU,IAAM,CACd,KAAK,QAAQ,oBAAoB,UAAW,KAAK,kBAAkB,EACnE,SAAS,oBACP,mBACA,KAAK,sBACP,EACA,SAAS,oBAAoB,SAAU,KAAK,YAAY,CAC1D,EA6CA,KAAQ,mBAAsBC,GAAiC,CAC7D,IAAMC,EAAOD,EAAM,KAAK,KAExB,OAAQC,EAAM,CACZ,IAAK,OACH,KAAK,oBAAoBD,EAAM,KAAK,MAAM,EAC1C,MAEF,IAAK,OACH,KAAK,2BAA2B,EAChC,MAEF,IAAK,cACH,KAAK,aAAaA,EAAM,KAAK,WAAW,EACxC,MAEF,IAAK,gBACC,KAAK,QAAUA,EAAM,KAAK,aAC5B,KAAK,MAAM,EAEb,MAEF,QACE,MAAM,IAAI,MAAM,GAAGC,CAAI,oBAAoB,CAC/C,CACF,EAEA,KAAQ,uBAAyB,SAAY,CACvC,SAAS,kBAAoB,WAC/B,MAAM,KAAK,SAAS,CAExB,EAEA,KAAQ,aAAe,SAAY,CAC7B,KAAK,UAAU,IACjB,MAAM,KAAK,SAAS,EACf,KAAK,UAAU,GAClB,KAAK,OAAO,YAAY,EAG9B,EA5HE,KAAK,QAAU,IAAI,iBAAiBC,EAAY,EAChD,KAAK,MAAQ,KAAK,MAAM,KAAK,OAAO,EAAI,GAAc,EACtD,KAAK,OAASJ,CAChB,CApBF,MASuD,CAAAK,EAAA,mBAoD7C,YAAa,CACnB,KAAK,QAAQ,iBAAiB,UAAW,KAAK,kBAAkB,EAEhE,SAAS,iBAAiB,mBAAoB,KAAK,sBAAsB,EAWzE,SAAS,iBAAiB,SAAU,KAAK,YAAY,CACvD,CAaQ,oBAAoBC,EAAgB,CAC1C,IAAMC,EAAmB,KAAK,cAAgB,KAAK,aAAeD,EAElE,GAAI,KAAK,UAAU,GAAKC,EAAkB,CACxC,IAAMN,EAAmB,CACvB,KAAM,MACR,EACA,KAAK,QAAQ,YAAYA,CAAO,EAChC,MACF,CACF,CA8CQ,4BAA6B,CACnC,KAAK,eAAe,CACtB,CAMA,MAAc,UAAW,CAIvB,YAAK,aAAa,EACX,IAAI,QAAeO,GAAY,CACpC,WAAW,IAAM,CACf,KAAK,MAAM,EACXA,EAAQ,CACV,EAAG,GAAO,CACZ,CAAC,CACH,CAMQ,OAAQ,CACV,KAAK,QAAU,iBACjB,KAAK,OAAO,SAAS,EAKnB,KAAK,cACP,KAAK,MAAM,EACX,KAAK,eAAe,GAEpB,KAAK,MAAQ,aAEjB,CAEQ,OAAQ,CACd,KAAK,MAAQ,UACb,KAAK,OAAO,UAAU,CACxB,CAKQ,cAAe,CACrB,KAAK,aAAe,KAAK,IAAI,EAC7B,IAAMP,EAAmB,CACvB,KAAM,OACN,OAAQ,KAAK,YACf,EACA,KAAK,QAAQ,YAAYA,CAAO,CAClC,CAEQ,gBAAiB,CACvB,KAAK,aAAe,MACtB,CAMQ,aAAaQ,EAAmB,CACtC,GAAI,KAAK,UAAU,EAAG,CACpB,KAAK,MAAQ,cAEb,KAAK,OAAO,YAAY,EAExB,IAAMR,EAAmB,CACvB,KAAM,gBACN,YAAaQ,CACf,EAEA,KAAK,QAAQ,YAAYR,CAAO,CAClC,CACF,CACF,EF1MO,IAAMS,GAAaC,GACxBC,GAAgB,EAAE,CAACC,EAAKC,KAAS,CAC/B,YAAa,GACb,oBAAqB,GACrB,qBAAsB,GACtB,UAAW,OACX,kBAAmB,GACnB,mBAAoB,CAACC,EAAuBC,IAAoB,CAC9D,GAAM,CAAE,qBAAAC,CAAqB,EAAIH,EAAI,EAEjC,CAACG,GAAwBD,EAC3BH,EAAI,CAAE,qBAAsB,EAAK,CAAC,GACzBI,GAAwB,CAACD,IAClCD,EAAsB,CAE1B,EACA,wBAA0BG,GAAS,CACjCL,EAAI,CAAE,qBAAsBK,CAAK,CAAC,CACpC,EACA,aAAeC,GAAc,CAC3BN,EAAI,CAAE,UAAAM,CAAU,CAAC,CACnB,CACF,EAAE,CACJ,EAEaC,GAAkC,IAAIC,GAAW,CAC5D,OAAQ,IAAMX,GAAW,SAAS,CAAE,oBAAqB,EAAK,CAAC,EAC/D,QAAS,IACPA,GAAW,SAAS,CAAE,YAAa,GAAM,qBAAsB,EAAM,CAAC,EACxE,UAAW,IAAMA,GAAW,SAAS,CAAE,YAAa,EAAM,CAAC,CAC7D,CAAC,ED5CM,SAASY,EAAiBC,EAA0C,CACzE,GAAM,CAAE,UAAAC,CAAU,EAAIC,GAAW,EAGjC,OACEC,GAAA,cAACC,GAAA,CAAM,aAFYH,IAAc,OAEG,GAAGD,GACpCA,EAAM,QACT,CAEJ,CATgBK,EAAAN,EAAA,oBILhB,OAAS,QAAAO,OAAY,eACrB,OACE,UAAAC,GACA,YAAAC,GACA,WAAAC,GACA,SAAAC,GACA,kBAAAC,GACA,cAAAC,GACA,SAAAC,GACA,aAAAC,OACK,gBACP,OAAS,cAAAC,OAAkB,4BAC3B,OAAOC,IAAS,WAAAC,GAAS,YAAAC,OAAgB,QCfzC,OAAS,OAAAC,GAAK,aAAAC,GAAW,cAAAC,GAAY,UAAAC,OAAc,gBAE5C,IAAMC,GAAeD,GAAOD,GAAY,CAC7C,MAAO,MACP,SAAU,WACV,QAAS,IACT,SAAU,QACV,UAAW,CACT,gBAAiB,gBACjB,CAAC,IAAID,EAAS,IAAI,EAAG,CACnB,gBAAiB,UACnB,CACF,CACF,CAAC,EAEYI,GAAgBF,GAAO,MAAO,CACzC,SAAU,WACV,WAAY,gBACZ,CAAC,IAAIF,EAAS,IAAI,EAAG,CACnB,QAAS,sBACX,EACA,MAAO,KACP,OAAQ,KACR,aAAc,MACd,MAAO,KACP,OAAQ,uBACV,CAAC,EAEYK,GAAkBH,GAAO,MAAO,CAC3C,QAAS,OACT,eAAgB,WAChB,SAAU,MACV,OAAQ,CACN,QAAS,CACX,CACF,CAAC,EAEYI,GAA8BJ,GAAO,MAAO,CACvD,SAAU,WACV,MAAO,OACP,OAAQ,OACR,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,aAAc,MACd,IAAK,KACL,MAAO,KACP,SAAU,CACR,QAAS,CACP,KAAM,CACJ,gBAAiB,WACnB,EACA,MAAO,CACL,gBAAiB,eACnB,CACF,CACF,CACF,CAAC,EAEYK,GAAeL,GAAO,MAAO,CACxC,QAAS,KACT,SAAU,CACR,YAAa,CACX,KAAM,CACJ,UAAW,iBACX,WAAY,0BACd,CACF,CACF,CACF,CAAC,EAEYM,GAAsCN,GAAO,MAAO,CAC/D,SAAU,WACV,MAAO,KACP,IAAK,KACL,gBAAiB,cACjB,aAAc,MAChB,CAAC,EAEYO,GAAYV,GAAI,CAC3B,QAAS,OACT,cAAe,MACf,eAAgB,SAChB,WAAY,QACd,CAAC,EAEYW,GAAuBR,GAAO,MAAO,CAChD,aAAc,OACd,OAAQ,0BACR,sBAAuB,CACrB,WAAY,KACd,EACA,IAAK,CACH,aAAc,MAChB,CACF,CAAC,EC/FD,OAAS,aAAAS,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAgBD,GAAO,MAAO,CACzC,aAAc,MACd,MAAO,MACP,OAAQ,MACR,gBAAiB,cACjB,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CAAC,EAEYE,GAAgBF,GAAO,MAAO,CACzC,SAAU,UACZ,CAAC,EAEKG,GAAOJ,GAAU,CACrB,KAAM,CACJ,UAAW,cACb,EACA,OAAQ,CACN,UAAW,gBACb,CACF,CAAC,EAEYK,GAAUJ,GAAO,MAAO,CACnC,SAAU,WACV,OAAQ,+BACR,UAAW,qBACX,aAAc,MACd,MAAO,MACP,OAAQ,MACR,UAAW,GAAGG,EAAI,sBAClB,IAAK,EACL,OAAQ,EACR,MAAO,EACP,KAAM,CACR,CAAC,EAEYE,GAAuBL,GAAO,MAAO,CAChD,QAAS,CACP,aAAc,KAChB,CACF,CAAC,ECzCM,SAASM,GACdC,EACAC,EACA,CACA,OAAOD,EAAY,KAAME,GAAeA,EAAW,OAASD,CAAc,GACtE,IACN,CANgBE,EAAAJ,GAAA,qBCFhB,OAAS,UAAAK,OAAc,gBAEhB,IAAMC,GAAgBD,GAAO,KAAM,CACxC,QAAS,EACT,WAAY,KACZ,cAAe,IACjB,CAAC,EJkBM,SAASE,GAAWC,EAAkB,CAC3C,GAAM,CAAE,gBAAAC,EAAiB,oBAAAC,EAAqB,cAAAC,CAAc,EAAIH,EAAM,MAEhE,CAACI,EAAoBC,CAAqB,EAAIC,GAAsB,CAAC,CAAC,EAEtEC,EAAcC,EAAY,EAAE,YAAY,EAExCC,EAAiBC,GACrB,IACER,GAAqB,IAAKS,IAAe,CACvC,KAAMA,EACN,KAAMC,GACJL,EACAM,GAAWF,CAAS,EAAE,cACxB,EACA,MAAOE,GAAWF,CAAS,EAAE,KAC/B,EAAE,EACJ,CAACT,CAAmB,CACtB,EAEMY,EAAWC,EAACJ,GAAyB,CAEvCN,EADEJ,EACoB,CAACU,CAAS,EAETP,GACrBA,EAAmB,SAASO,CAAS,EACjCP,EAAmB,OAAQY,GAASA,IAASL,CAAS,EACtDP,EAAmB,OAAOO,CAAS,CALR,CAQrC,EAViB,YAYXM,EAAgBF,EAACG,GACjBjB,EACKkB,GAAA,cAACC,GAAA,CAAU,MAAOhB,IAAqB,CAAC,GAAIc,CAAS,EAGvDC,GAAA,cAAAA,GAAA,cAAGD,CAAS,EALC,iBAQtB,OACEC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACE,GAAA,CAAQ,KAAM,GAAI,EACnBF,GAAA,cAACG,GAAA,CACC,KAAK,OACL,MAAOC,GAAK,EAAE,oBAAoB,EAClC,YAAaA,GAAK,EAChB,oFACF,EACA,KACEJ,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,KACCN,GAAA,cAACO,GAAA,CAAM,IAAKvB,EAAe,KAAM,GAAI,CACvC,EACAgB,GAAA,cAACQ,GAAA,IAAQ,CACX,EAEJ,EACAR,GAAA,cAACS,GAAA,KACEX,EACCE,GAAA,cAAAA,GAAA,cACGV,GAAgB,IAAKoB,GACpBV,GAAA,cAACW,GAAA,CACC,IAAKD,EAAkB,KACvB,GAAIA,EAAkB,KACtB,MAAOA,EAAkB,MACzB,WAAU,GACV,MAAO,CAAE,OAAQ,EAAG,EACpB,QAAS,IAAMf,EAASe,EAAkB,IAAI,EAC9C,MAAOV,GAAA,cAACO,GAAA,CAAM,IAAKG,EAAkB,KAAM,KAAM,GAAI,EACrD,IACE5B,EACEkB,GAAA,cAACY,GAAA,CAAM,MAAOF,EAAkB,KAAM,EAEtCV,GAAA,cAACa,GAAA,CACC,QAAS5B,EAAmB,SAC1ByB,EAAkB,IACpB,EACF,EAGN,CACD,CACH,CACF,CACF,EACAV,GAAA,cAACc,GAAA,CACC,KAAK,UACL,SAAU,CAAC7B,EAAmB,OAC9B,QAAS,IAAMJ,EAAM,UAAUI,CAAkB,GAChDmB,GAAK,EAAE,SAAS,CACnB,CACF,CAEJ,CA9FgBR,EAAAhB,GAAA,cKrBhB,OAAS,QAAAmC,OAAY,eACrB,OACE,UAAAC,GACA,WAAAC,GACA,SAAAC,GACA,cAAAC,GACA,UAAAC,GACA,aAAAC,OACK,gBACP,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QCV3C,OAAS,cAAAC,OAAkB,4BAEpB,IAAMC,GAAyC,CACpD,GAAI,SACJ,MAAO,SACP,uBAAyBC,GAAkBA,CAC7C,EAEO,SAASC,GACdC,EACkB,CAClB,IAAMC,EAAmCD,EACrCE,GAAWF,CAAiB,EAAE,gBAC9B,KAMJ,OAJ4CC,EACxC,CAAC,GAAGA,EAAkCJ,EAAsB,EAC5D,CAAC,CAGP,CAZgBM,EAAAJ,GAAA,sBCVhB,OAAS,UAAAK,GAAQ,cAAAC,OAAkB,gBAE5B,IAAMC,GAAkBF,GAAO,MAAO,CAC3C,WAAY,MACZ,cAAe,MACf,OAAQ,EACV,CAAC,EAEYG,GAAaH,GAAOC,GAAY,CAC3C,YAAa,KACf,CAAC,EAEYG,GAA4B,CACvC,OAAQ,MACR,gBAAiB,cACjB,aAAc,KAChB,EFaA,IAAMC,GAAgC,IAE/B,SAASC,GAAeC,EAAkB,CAC/C,GAAM,CAAE,UAAAC,CAAU,EAAID,EAChB,CACJ,UAAWE,EACX,cAAeC,EACf,aAAcC,CAChB,EAAIJ,EAAM,MAEJ,CAACK,EAA0BC,CAA2B,EAAIC,GAE9D,IAAI,EACA,CAACC,EAAqBC,CAAsB,EAAIF,GACpDT,EACF,EAEMY,EACJL,IAA6BM,GAAuB,GAEhDC,EAAkBC,GAAmBX,CAAiB,EAEtDY,EAAgCC,EAAA,CAAC,CAAE,MAAAC,CAAM,IAAyB,CACtE,IAAMC,EAAyBL,GAAiB,KAC7CM,GAAmBA,EAAe,KAAOF,CAC5C,EAEIC,IAOAZ,IAA6BM,GAAuB,IACpD,OAAO,MAAM,OAAOH,CAAmB,CAAC,GAExCC,EAAuBX,EAA6B,EAGtDQ,EAA4BW,EAAuB,EAAE,EAEzD,EApBsC,iCAsBhCE,EAAgBJ,EAAA,IAAM,CAC1B,IAAME,EAAyBL,EAAgB,KAC5CM,GAAmBA,EAAe,KAAOb,CAC5C,EACA,GAAIY,EACFhB,EACEgB,EAAuB,uBAAuBT,CAAmB,CACnE,MAGA,OAAM,IAAI,MAAM,6CAA6C,CAEjE,EAZsB,iBActB,OAAAY,GAAU,IAAM,CACdd,EACEO,GAAmBX,CAAiB,EAAE,CAAC,GAAG,IAAM,IAClD,CACF,EAAG,CAACA,CAAiB,CAAC,EAGpBmB,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACE,GAAA,CACC,KAAK,OACL,MAAOC,GAAK,EAAE,wBAAwB,EACtC,YAAaA,GAAK,EAAE,CAClB,GAAI,yEACJ,OAAQ,CACN,KAAApB,CACF,CACF,CAAC,EACD,KACEiB,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAM,IAAKxB,EAAO,KAAM,GAAI,CAC/B,EACAkB,GAAA,cAACO,GAAA,IAAQ,CACX,EAEJ,EAEAP,GAAA,cAACQ,GAAA,KACCR,GAAA,cAACS,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAS,MAAM,eAC5CN,GAAK,EAAE,iCAAiC,CAC3C,EACAH,GAAA,cAACU,GAAA,CACC,MAAO1B,GAA4B,GACnC,QAASO,EAAgB,IAAKM,IAAoB,CAChD,MAAOA,EAAe,GACtB,MAAOA,EAAe,KACxB,EAAE,EACF,QAAQ,SACR,gBAAiBJ,EACjB,OAAQ,CAAE,QAASkB,EAA0B,EAC/C,EACAX,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACS,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAS,MAAM,eAC5CpB,EACGc,GAAK,EAAE,YAAY,EACnBA,GAAK,EAAE,aAAa,CAC1B,EACAH,GAAA,cAACY,GAAA,CACC,KAAMvB,EAAyB,OAAS,SACxC,QAAQ,YACR,MAAOF,EACP,SAAW0B,GAAUzB,EAAuByB,EAAM,OAAO,KAAK,EAC9D,MAAOF,GACT,CACF,EAEAX,GAAA,cAACc,GAAA,CACC,KAAK,UACL,QAAShB,EACT,SACE,CAACP,GAAmB,CAACP,GAA4B,CAACG,GAEnDgB,GAAK,EAAE,SAAS,CACnB,CACF,CAEJ,CA3HgBT,EAAAhB,GAAA,kBG7BhB,OAAS,QAAAqC,OAAY,eACrB,OAAS,SAAAC,GAAO,cAAAC,GAAY,eAAAC,OAAmB,gBAC/C,OAAS,cAAAC,OAAkB,2BAC3B,OAAOC,OAAW,QAUX,SAASC,GAAcC,EAA2B,CAEvD,GAAM,CAAE,OAAAC,EAAQ,MAAAC,CAAM,EAAIF,EACpB,CAAE,KAAAG,EAAM,MAAAC,CAAM,EAAIH,EAClB,CAAE,MAAAI,CAAM,EAAIC,GAAW,EAG7B,OAFoBC,GAAuBF,EAAMF,CAAI,CAAC,IAElCK,GAAY,UAE5BC,GAAA,cAACC,GAAA,CACC,KAAK,UACL,MAAOC,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAChB,mDACF,EACF,EAIAT,EAEAO,GAAA,cAACC,GAAA,CACC,KAAK,QACL,MAAOC,GAAK,EAAE,mBAAmB,EACjC,YACET,GAASS,GAAK,EAAE,iDAAiD,EAErE,EAKFF,GAAA,cAACC,GAAA,CACC,KAAK,UACL,MAAOC,GAAK,EAAE,2BAA2B,EACzC,YAAaA,GAAK,EAAE,qCAAqC,EACzD,KACEF,GAAA,cAACG,GAAA,KACCH,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACK,GAAA,CAAM,IAAKV,EAAO,KAAM,GAAI,CAC/B,EACAK,GAAA,cAACM,GAAA,IAAQ,CACX,EAEJ,CAEJ,CA9CgBC,EAAAjB,GAAA,iBCfhB,OAAS,QAAAkB,OAAY,eACrB,OAAS,UAAAC,GAAQ,WAAAC,GAAS,cAAAC,OAAkB,gBAC5C,OAAOC,OAAW,QAOX,SAASC,GAAkBC,EAAkB,CAClD,GAAM,CAAE,YAAAC,EAAa,UAAAC,CAAU,EAAIF,EAEnC,OACEG,GAAA,cAACC,GAAA,CACC,MAAOC,GAAK,EAAE,CACZ,GAAI,oCACJ,OAAQ,CAAE,sBAAuBJ,CAAY,CAC/C,CAAC,EACD,KAAK,UACL,YAAaI,GAAK,EAAE,CAClB,GAAI,sHACJ,OAAQ,CAAE,sBAAuBJ,CAAY,CAC/C,CAAC,GACDE,GAAA,cAACG,GAAA,CAAQ,KAAM,GAAI,EACnBH,GAAA,cAACG,GAAA,CAAQ,KAAM,GAAI,EACnBH,GAAA,cAACI,GAAA,CACC,QAASL,EACT,QAAQ,WACR,KAAK,UACL,UAAS,GACT,KAAK,SACJG,GAAK,EAAE,SAAS,CACnB,CACF,CAEJ,CA1BgBG,EAAAT,GAAA,qBCNT,SAASU,GACdC,EACAC,EAC+B,CAC/B,OAAOD,EAAS,EAAE,SAAW,QAAU,CAAC,CAACC,CAC3C,CALgBC,EAAAH,GAAA,cAOT,SAASI,GACdH,EAC0E,CAC1E,OAAOA,EAAS,EAAE,SAAW,WAC/B,CAJgBE,EAAAC,GAAA,iBAMT,SAASC,GACdJ,EAGA,CACA,OAAOA,EAAS,EAAE,SAAW,gBAC/B,CANgBE,EAAAE,GAAA,sB7CMhB,IAAMC,GAAyB,IACzBC,GAA0B,IASzB,SAASC,GAAqBC,EAAkB,CACrD,IAAMC,EAAsBC,GAAsC,EAC5D,CAACC,EAAcC,CAAe,EAAIC,GAAS,EAAK,EAChD,CAACC,EAAOC,CAAQ,EAAIF,GAAiB,EACrCG,EAAqBC,EAACH,GAAiB,CAC3CC,EAASD,EAAM,OAAO,CACxB,EAF2B,sBAGrB,CAAE,2BAAAI,CAA2B,EAAIC,GAAc,EAE/C,CACJ,cAAAC,EACA,qBAAAC,EACA,gBAAAC,EACA,SAAAC,EACA,WAAAC,CACF,EAAIC,GAAmB,EAEjBC,EAA0BT,EAACU,GAAoC,CACnEL,EAAgBd,EAAM,OAASmB,CAAkB,EAAE,MACjDX,CACF,CACF,EAJgC,2BAM1BY,EAA8BX,EAACY,GAA2B,CAC9D,GAAI,CAACA,EACH,MAAM,IAAI,MACR,+EACF,EAGFR,EAAqBQ,CAAc,EAAE,MAAMb,CAAkB,CAC/D,EARoC,+BAU9Bc,EAAqBb,EAAA,IAAM,CAC/BL,EAAgB,EAAK,CACvB,EAF2B,sBAIrBmB,EAAkBd,EAAA,IAAM,CAC5BF,EAAS,MAAS,EAClBS,EAAW,EACXZ,EAAgB,EAAK,EAEjBH,EAAoB,SACtB,aAAaA,EAAoB,OAAO,CAE5C,EARwB,mBAUxB,OAAAuB,GAAU,IAAM,CACd,GAAIxB,EAAM,OAAQ,CAChBuB,EAAgB,EAChB,IAAIE,EAAc,GAMdC,EAAyB,GAEvBC,EAAmBlB,EAAA,IAAM,CAC7B,WAAW,IAAM,CACfiB,EAAyB,GACpBD,GACHrB,EAAgB,EAAI,CAExB,EAAGN,EAAuB,CAC5B,EAPyB,oBASnB8B,EAAiBnB,EAACoB,GAAmB,CACzC,IAAMC,EAAoBD,EAAO,qBAC3BE,EAAuB,wCAG7B,EAAE,SAASF,EAAO,MAAM,EACe,8BAGvC,EAAE,SAASA,EAAO,MAAM,IAGtBJ,EAAc,IAGZK,GAAqB,CAACJ,EACxBzB,EAAoB,QAAU,WAC5BqB,EACAzB,EACF,EACSkC,GACTT,EAAmB,EAGjBtB,EAAM,WACRA,EAAM,UAAU6B,CAAM,CAE1B,EA3BuB,kBA6BvBF,EAAiB,EACjBf,EAAcZ,EAAM,OAAQ,CAC1B,sBAAuB,EACzB,CAAC,EACE,KAAK4B,CAAc,EACnB,MAAMpB,CAAkB,CAC7B,CACF,EAAG,CAACR,EAAM,MAAM,CAAC,EAGfgC,GAAA,cAACC,EAAA,CACC,KAAM9B,EACN,QAASmB,EACT,OAAQ,IAAM,CACZC,EAAgB,EAChBb,EAA2B,EACvBV,EAAM,SACRA,EAAM,QAAQ,CAElB,EACA,UAAWkC,EAAa,GACvBC,GAAWpB,EAAUf,EAAM,MAAM,GAChCgC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACI,GAAA,CACC,OAAQ,CACN,KAAMpC,EAAM,OAAO,KACnB,MAAOA,EAAM,OAAO,KACtB,EACA,MAAOM,EACT,EACA0B,GAAA,cAACK,GAAA,CAAQ,UAAU,WAAW,KAAM,GAAI,CAC1C,EAEDC,GAAcvB,CAAQ,GACrBiB,GAAA,cAACO,GAAA,CACC,UAAWrB,EACX,MAAOH,EAAS,EAAE,UACpB,EAEDyB,GAAmBzB,CAAQ,GAC1BiB,GAAA,cAACS,GAAA,CACC,UAAWrB,EACX,MAAOL,EAAS,EAAE,eACpB,CAEJ,CAEJ,CA/IgBN,EAAAV,GAAA,wB8CvBhB,OAAS,UAAA2C,GAAQ,YAAAC,OAAgB,2BAEjC,OAAS,mBAAAC,OAAuB,YAChC,OAAOC,IAAS,iBAAAC,GAAe,aAAAC,GAAW,WAAAC,GAAS,UAAAC,OAAc,QCRjE,OAAS,aAAAC,OAAiB,QCFnB,SAASC,GACdC,EACQ,CACR,OAAOA,EACJ,IAAKC,GACA,OAAOA,GAAa,SACfA,EAEFA,EAAS,OAAO,IACxB,EACA,KAAK,GAAG,CACb,CAXgBC,EAAAH,GAAA,iBDST,SAASI,GACdC,EACAC,EACA,CACA,IAAMC,EAAuBC,EAAgB,IAAI,qBAAqB,EAClEC,EAAyCC,GAC3CL,EACAC,CACF,EAEA,OAAAK,GAAU,IAAM,CACdJ,EAAqB,EACrBE,EAAoBC,GAA0BL,EAAWC,CAAO,CAClE,EAAG,CACDM,GAAcP,GAAa,CAAC,CAAC,EAC7BC,GAAS,uBACTA,GAAS,oCACX,CAAC,EAEM,CACL,UAAWG,CACb,CACF,CAtBgBI,EAAAT,GAAA,sBDYT,IAAMU,GAAgBC,GAAsC,CACjE,gBAAiB,IAAM,CAEvB,EACA,mBAAoB,IAAM,CAE1B,CACF,CAAC,EAED,SAASC,GAAKC,EAAqC,CACjD,GAAM,CACJ,aAAAC,EACA,eAAAC,EACA,MAAOC,EACP,YAAAC,CACF,EAAIC,EAAY,EACVC,EAAcD,EAAY,EAAE,YAAY,EACxC,CAAE,UAAAE,CAAU,EAAIF,EAAY,EAC5BG,EAASH,EAAY,EAAE,OAEvBI,EAAkC,CACtC,uBAAwBD,GAAQ,uBAChC,eAAgBA,GAAQ,eACxB,qCACER,EAAM,OAAO,0BACT,oCACR,EACM,CAAE,UAAAU,CAAU,EAAIC,GAAmBH,EAAO,QAASC,CAAa,EAChE,CAAE,cAAAG,EAAe,iBAAAC,CAAiB,EAAIC,EAAgB,EACtDC,EAAyBC,GAAiC,EAC1DC,EAA4BD,GAAiC,EAEnEE,GAAU,IAAM,CACTf,EAAU,EAAE,MAAM,QAAQ,GAAG,CACpC,EAAG,CAAC,CAAC,EAELe,GAAU,IAAM,CACVlB,EAAM,SACRC,EAAaD,EAAM,MAAM,EACzBE,EAAeF,EAAM,MAAM,EAC3B,OAAO,QAAa,CAClB,OAAAQ,EACA,WAAYR,EAAM,MACpB,EAEJ,EAAG,CAACA,EAAM,OAAQI,CAAW,CAAC,EAE9B,IAAMe,EAAqBb,EACxB,OAAOc,EAAe,EACtB,IAAKC,GAAUA,EAAM,IAAI,EAEtBC,EAA8BC,EAAA,CAACC,EAAMC,EAAOC,EAAOC,EAAOC,IAAS,CACvE,GAAIH,IAAUI,GAAO,SACnB,GAAIH,EAAO,CACT,IAAMI,EACJC,GAA8BH,EAAK,oBAAoB,EACnDI,EAAOC,GACXT,EACAE,EACAP,EACAW,EACAF,EAAK,gBACP,EACII,EAAK,QACPpB,EAAcoB,EAAMzB,CAAS,CAEjC,MACEM,EAAiBW,CAAI,EACfP,EAA0B,QAC9BA,EAA0B,QAAQO,CAAI,EAEtC,QAAQ,KACN,2DACF,EAIN,GAAIC,IAAUI,GAAO,UAAYF,EAAM,UAAW,CAChD,IAAMO,EAAM,GAAGV,CAAI,IAAIG,EAAM,OAAO,IAAID,CAAK,GAEzCC,EAAM,YACFZ,EAAuB,QAC3BA,EAAuB,QAAQmB,CAAG,EAElC,QAAQ,KACN,wDACF,EAGN,CAEA,GAAIT,IAAUI,GAAO,SAAWF,EAAM,QAAS,CAC7C,IAAMO,EAAM,GAAGV,CAAI,IAAIG,EAAM,OAAO,GAC9BZ,EAAuB,QAC3BA,EAAuB,QAAQmB,CAAG,EAElC,QAAQ,KAAK,wDAAwD,CAEzE,CAGIlC,EAAM,eACRA,EAAM,cAAcwB,EAAMC,EAAOC,EAAOC,EAAOC,CAAI,CAEvD,EArDoC,iBAsD9BO,EAAcC,GAAW,IAAI,YAAY,EAEzCC,EAAWC,GACf,KAAO,CACL,gBAAkBC,GAAsC,CACtDxB,EAAuB,QAAUwB,CACnC,EACA,mBAAqBA,GAAsC,CACzDtB,EAA0B,QAAUsB,CACtC,CACF,GACA,CAAC,CACH,EAEA,OACEC,GAAA,cAAC3C,GAAc,SAAd,CAAuB,MAAOwC,GAC7BG,GAAA,cAACC,GAAA,CACC,eAAgBnC,EAChB,UAAWI,EACX,cAAeY,EACf,YAAa,CAAC,CAACa,GACdnC,EAAM,QACT,CACF,CAEJ,CAzHSuB,EAAAxB,GAAA,QA2HF,SAAS2C,GAAc1C,EAAqC,CACjE,GAAM,CAAE,OAAAQ,EAAQ,GAAGmC,CAAW,EAAI3C,EAClC,OACEwC,GAAA,cAACI,GAAA,CAAiB,OAAQpC,GACxBgC,GAAA,cAACzC,GAAA,CAAM,GAAG4C,EAAY,OAAQnC,EAAQ,CACxC,CAEJ,CAPgBe,EAAAmB,GAAA,iBGxJhB,OAAOG,OAAW,QCDlB,OAAOC,IAAS,YAAAC,OAAgB,QAChC,OAAS,gBAAAC,GAAc,sBAAAC,OAA0B,eAE1C,SAASC,GAAU,CAAE,SAAAC,CAAS,EAAsB,CAEzD,IAAMC,EADoBC,GAAmB,EACVC,GAAWC,GAE9C,OAAOC,GAAA,cAACJ,EAAA,KAAQD,CAAS,CAC3B,CALgBM,EAAAP,GAAA,aCLhB,OAAS,eAAAQ,OAAmB,gBAC5B,OAAOC,OAAW,QCDlB,OAAOC,OAAW,QAClB,OAAS,aAAAC,OAAiB,mBCDnB,IAAMC,EAAmB,CAC9B,KAAM,IACN,SAAU,YACV,OAAQ,UACR,YAAa,cACb,SAAU,WACV,aAAc,gBACd,gBAAiB,oBACjB,iBAAkB,oBAClB,QAAS,UACT,UAAW,YACX,UAAW,YACX,MAAO,QACP,QAAS,UACT,YAAa,eACb,YAAa,aACb,OAAQ,QACV,ECfA,OAAS,aAAAC,GAAW,UAAAC,OAAc,QCMlC,OAAOC,OAAe,eACtB,OAAS,UAAAC,OAAc,UACvB,OAAS,yBAAAC,OAA6B,qBCWtC,OAAS,yBAAAC,OAA6B,wCACtC,OAAOC,OAAe,eCZf,SAASC,GAAYC,EAAiBC,EAAsB,CAQjE,MAPyC,CACvC,cAAeA,EAAE,aAAa,EAC9B,cAAeA,EAAE,cAAc,EAC/B,gBAAiBA,EAAE,eAAe,EAClC,uBAAwBA,EAAE,cAAc,EACxC,YAAaA,EAAE,WAAW,CAC5B,EACYD,CAAG,CACjB,CATgBE,EAAAH,GAAA,eAgBT,IAAMI,GAAiC,CAC5C,cACA,cACA,aACA,UACA,aACF,EAEaC,GAAc,GCV3B,OAAS,QAAAC,OAAY,eACrB,OAEE,kBAAAC,OAEK,wCACP,OAAOC,OAAe,eACtB,OAAS,4BAAAC,OAAgC,cC7BzC,OAAS,QAAAC,OAAY,eAId,IAAMC,GAAgBC,EAAA,KACpB,CACL,mBAAoBC,GAAK,EAAE,yCAAyC,EACpE,sBAAuB,CACrB,MAAOA,GAAK,EAAE,sCAAsC,EACpD,YAAaA,GAAK,EAChB,4IACF,CACF,EACA,cAAe,CACb,MAAOA,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAChB,gKACF,CACF,EACA,kBAAmB,CACjB,eAAgBA,GAAK,EACnB,kDACF,EACA,eAAgBA,GAAK,EACnB,kDACF,CACF,EACA,mBAAoB,CAClB,YAAaA,GAAK,EAAE,mBAAmB,EACvC,MAAOA,GAAK,EAAE,2BAA2B,EACzC,YAAaA,GAAK,EAChB,mEACF,EACA,eAAgBA,GAAK,EAAE,2BAA2B,CACpD,EACA,8BAA+B,CAC7B,MAAOA,GAAK,EACV,8DACF,CACF,EACA,kBAAmB,CACjB,YAAaA,GAAK,EAAE,mBAAmB,EACvC,MAAOA,GAAK,EAAE,mDAAmD,EACjE,YAAaA,GAAK,EAChB,iIACF,EACA,eAAgBA,GAAK,EAAE,2BAA2B,CACpD,CACF,GA5C2B,iBA+CtB,SAASC,GAAqBC,EAAmB,CACtD,OAAQA,EAAM,KAAM,CAClB,OACE,OAAOA,EAAM,kBAAoBJ,GAAc,EAAE,cAAc,MACjE,OACE,OAAOA,GAAc,EAAE,mBACzB,QACE,MAAO,EACX,CACF,CATgBC,EAAAE,GAAA,wBCrDhB,OAAS,QAAAE,OAAY,eAEd,IAAMC,GAAmBC,EAAA,KACvB,CACL,cAAeC,GAAK,EAAE,gBAAgB,EACtC,KAAMA,GAAK,EAAE,MAAM,EACnB,WAAYA,GAAK,EAAE,aAAa,EAChC,WAAYA,GAAK,EAAE,4CAA4C,CACjE,GAN8B,oBFiEzB,SAASC,GACdC,EACAC,EACS,CACT,OACI,SAASA,EAAY,QAAQ,CAAC,GAAK,GAAG,GAAK,KAC3CD,GAAe,IAAI,IAAIE,GAAU,GAAG,CAAC,GACpC,SAASD,EAAY,QAAQ,CAAC,GAAK,GAAG,GAAK,IAC1CD,GAAe,IAAI,IAAIE,GAAU,GAAI,CAAC,IAC1C,EAEJ,CAXgBC,EAAAJ,GAAA,oBAaT,SAASK,GAAcC,EAA8B,CAC1D,OACGA,GAAS,CAAC,GAAG,OAAQC,GAAS,CAC7B,IAAMC,EAAYD,EAAK,mBACnB,IAAIJ,GAAUI,EAAK,kBAAkB,EACrC,KACEE,EAAYF,EAAK,mBACnB,IAAIJ,GAAUI,EAAK,kBAAkB,EACrC,KAEJ,OADoBA,EAAK,4BAA8B,YAE9CC,GAAS,IAAID,EAAK,UAAU,GAAKE,GAAS,IAAIF,EAAK,UAAU,EAE/DC,GAAS,GAAGD,EAAK,UAAU,GAAKE,GAAS,GAAGF,EAAK,UAAU,CACpE,CAAC,EAAE,OAAS,CAEhB,CAhBgBH,EAAAC,GAAA,iBAkBT,SAASK,GAAqBJ,EAInC,CACA,IAAMC,GAAQD,GAAS,CAAC,GAAG,OAAQC,GAAS,CAC1C,IAAMC,EAAYD,EAAK,mBACnB,IAAIJ,GAAUI,EAAK,kBAAkB,EACrC,KACEE,EAAYF,EAAK,mBACnB,IAAIJ,GAAUI,EAAK,kBAAkB,EACrC,KAEJ,OADoBA,EAAK,4BAA8B,YAE9CC,GAAS,IAAID,EAAK,UAAU,GAAKE,GAAS,IAAIF,EAAK,UAAU,EAE/DC,GAAS,GAAGD,EAAK,UAAU,GAAKE,GAAS,GAAGF,EAAK,UAAU,CACpE,CAAC,EAAE,CAAC,EAEEC,EAAYD,EAAK,mBACnB,IAAIJ,GAAUI,EAAK,kBAAkB,EACrC,KACEE,EAAYF,EAAK,mBACnB,IAAIJ,GAAUI,EAAK,kBAAkB,EACrC,KACEI,EAAcJ,EAAK,4BAA8B,YAEnDK,EAAuB,GACvBC,EAAiB,GACrB,MAAI,CAACF,GAAiBH,GAAWA,EAAQ,GAAGD,EAAK,UAAU,GACzDK,EAAuBE,GAAK,EAAE,CAC5B,GAAI,8BACJ,OAAQ,CACN,IAAKC,EACHP,EACA,EACA,CACF,EACA,OAAQD,EAAK,KAAK,MACpB,CACF,CAAC,EACDM,EAAiBG,GAAc,EAAE,kBAAkB,gBAC1CL,GAAiBH,GAAWA,EAAQ,IAAID,EAAK,UAAU,IAChEK,EAAuBE,GAAK,EAAE,CAC5B,GAAI,6BACJ,OAAQ,CACN,IAAKC,EACHP,EACA,EACA,CACF,EACA,OAAQD,EAAK,KAAK,MACpB,CACF,CAAC,EACDM,EAAiBG,GAAc,EAAE,kBAAkB,gBAGjD,CAACL,GAAiBF,GAAWA,EAAQ,GAAGF,EAAK,UAAU,GACzDK,EAAuBE,GAAK,EAAE,CAC5B,GAAI,8BACJ,OAAQ,CACN,IAAKC,EACHN,EACA,EACA,CACF,EACA,OAAQF,EAAK,KAAK,MACpB,CACF,CAAC,EACDM,EAAiBG,GAAc,EAAE,kBAAkB,gBAC1CL,GAAiBF,GAAWA,EAAQ,IAAIF,EAAK,UAAU,IAChEK,EAAuBE,GAAK,EAAE,CAC5B,GAAI,6BACJ,OAAQ,CACN,IAAKC,EACHN,EACA,EACA,CACF,EACA,OAAQF,EAAK,KAAK,MACpB,CACF,CAAC,EACDM,EAAiBG,GAAc,EAAE,kBAAkB,gBAG9C,CAAE,KAAAT,EAAM,qBAAAK,EAAsB,eAAAC,CAAe,CACtD,CAtFgBT,EAAAM,GAAA,wBAwFT,SAASO,GAAmBC,EASf,CAClB,GAAM,CACJ,gBAAAC,EACA,mBAAAC,EACA,cAAAC,EACA,YAAAC,EACA,MAAAC,EACA,QAAAC,EACA,MAAAC,EACA,qBAAAC,CACF,EAAIR,EACJ,OAAIC,IAAoB,UACf,CACL,MAAOQ,GAAiB,EAAE,cAC1B,OAAQ,iBACR,SAAU,EACZ,EAEGP,EAODC,GAAiB,CAACE,GAASE,GAAS,CAACH,GAAeA,IAAgB,IAC/D,CACL,MAAOK,GAAiB,EAAE,KAC1B,OAAQ,eACR,SAAU,EACZ,EACSH,EACF,CACL,MAAOG,GAAiB,EAAE,WAC1B,OAAQ,kBACR,SAAU,EACZ,EACSD,EACF,CACL,MAAOC,GAAiB,EAAE,WAC1B,OAAQ,kBACR,SAAU,EACZ,EAEK,CACL,MAAOA,GAAiB,EAAE,KAC1B,OAAQ,eACR,SAAU,EACZ,EA7BS,CACL,MAAOA,GAAiB,EAAE,cAC1B,OAAQ,iBACR,SAAU,EACZ,CA0BJ,CA1DgBvB,EAAAa,GAAA,sBA4DT,SAASW,GACdL,EACAD,EACAO,EACA,CACA,IAAMC,EAAoB,WAAWR,GAAe,GAAG,EAEvD,MAAO,EACLC,IACC,CAACM,GAAYA,EAAS,IAAIE,EAAI,IAC/BT,GACAA,IAAgB,KAChBQ,IAAsB,EAE1B,CAdgB1B,EAAAwB,GAAA,yBAgBT,SAASI,GACdC,EACAC,EACW,CACX,IAAIC,EAAgBJ,GACpB,QAASK,EAAI,EAAGA,EAAIH,EAAK,IAAI,OAAQG,IAAK,CACxC,IAAMC,EAAMJ,EAAK,IAAIG,CAAC,EACtB,GAAIC,EAAI,cAAgB,uBACtB,SAGF,IAAMC,EAAYJ,EAAUG,EAAI,KAAK,GAAG,UAAY,KACpDF,EAAgBA,EAAc,KAC5B,IAAIhC,GAAUkC,EAAI,MAAM,EAAE,aAAaC,GAAa,CAAC,CACvD,CACF,CAEA,OAAOH,CACT,CAlBgB/B,EAAA4B,GAAA,mBAoBT,SAASO,GACdjC,EACA4B,EACW,CACX,OAAO5B,EAAM,OACX,CAACkC,EAAqBP,IACpBO,EAAS,KAAKR,GAAgBC,EAAMC,CAAS,CAAC,EAChDH,EACF,CACF,CATgB3B,EAAAmC,GAAA,oBAWT,SAASE,GAAUJ,EAAyB,CACjD,IAAIF,EAAgBJ,GACpB,OAAAI,EAAgBA,EAAc,KAC5B,IAAIhC,GAAUkC,EAAI,MAAM,EAAE,aAAaA,EAAI,OAAS,CAAC,CACvD,EAEOF,CACT,CAPgB/B,EAAAqC,GAAA,aAST,SAASC,GAAkBC,EAA4B,CAC5D,OAAOA,EAAK,OACV,CAACH,EAAqBH,IAAQG,EAAS,KAAKC,GAAUJ,CAAG,CAAC,EAC1DN,EACF,CACF,CALgB3B,EAAAsC,GAAA,qBAMT,SAASE,GAAatC,EAAgC,CAC3D,OAAOA,EAAM,OACX,CAACuC,EAAQtC,IAAS,CAChB,QAAW8B,KAAO9B,EAAK,IAAK,CAC1B,IAAMuC,EAAOT,EAAI,KACXU,EACJV,EAAI,cAAgB,uBAChBQ,EAAO,QACPA,EAAO,YAEbE,EAASD,CAAI,EAAI,CAAC,GAAIC,EAASD,CAAI,GAAK,CAAC,EAAIT,CAAG,CAClD,CACA,OAAOQ,CACT,EACA,CAAE,QAAS,CAAC,EAAG,YAAa,CAAC,CAAE,CACjC,CACF,CAhBgBzC,EAAAwC,GAAA,gBA+BT,SAASI,GACdC,EAC6B,CAC7B,IAAMC,EAA6C,IAAI,IAMvD,OALAD,EAAM,QAAQ,CAACE,EAAMC,IAAU,CACzBD,EAAK,qBAAqB,OAC5BD,EAAqB,IAAIE,EAAOD,EAAK,oBAAoB,QAAQ,CAErE,CAAC,EACGD,EAAqB,KAAO,EACvBA,EAEF,IACT,CAbgBG,EAAAL,GAAA,uBAeT,SAASM,GACdC,EACAC,EAC6B,CAC7B,IAAMN,EAA6C,IAAI,IASvD,OARAK,GAAO,MAAM,QAAQ,CAACJ,EAAMC,IAAU,CAElCD,EAAK,qBAAqB,UAC1B,WAAWA,EAAK,oBAAoB,QAAQ,EAAIK,GAEhDN,EAAqB,IAAIE,EAAOD,EAAK,oBAAoB,QAAQ,CAErE,CAAC,EACGD,EAAqB,KAAO,EACvBA,EAEF,IACT,CAjBgBG,EAAAC,GAAA,yBAmBT,SAASG,GAAuBR,EAAoC,CAEzE,OADkBA,EAAM,IAAKS,GAAaA,EAAS,mBAAmB,GAGhE,IAAKC,GAAMA,GAAG,UAAY,GAAG,GAC7B,OAAQA,GAAM,WAAWA,CAAC,EAAI,CAAC,GAC/B,KAAK,CAACC,EAAGC,IAAM,WAAWA,CAAC,EAAI,WAAWD,CAAC,CAAC,GAC5C,KAAK,IAAM,EAAI,GAAK,IAE5B,CATgBP,EAAAI,GAAA,0BAWT,SAASK,GACdN,EACAO,EACA,CACA,OAAKA,EAGE,WAAWP,CAAY,GAAK,WAAWO,CAAmB,EAFxD,EAGX,CARgBV,EAAAS,GAAA,qBAiDT,SAASE,GAAuBC,EAelB,CACnB,GAAM,CACJ,UAAAC,EACA,QAAAC,EACA,YAAAC,EACA,QAAAC,EACA,gBAAAC,EACA,yBAAAC,EACA,iBAAAC,EACA,wBAAAC,EACA,SAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,0BAAAC,CACF,EAAId,EACEe,EAAqBV,GAAiB,OAC1C,CACEU,EACAC,KAECD,EAAmBC,EAAe,KAAK,EAAIA,EAAe,QAC3DD,GAEF,CAAC,CACH,EAEME,EAAyD,CAAC,EAEhE,OAAAb,GAAS,QAASc,GAAW,CAC3BD,EAAiB,KAAK,CACpB,WAAYC,EAAO,MACnB,UAAW,CAACA,EAAO,OAAO,CAC5B,CAAC,CACH,CAAC,EAGqC,CACpC,OAAQf,EAAY,SAAS,EAC7B,aAAcO,GAAgB,OAC9B,iBAAkBC,GAAoB,OACtC,iBAAkBC,GAAoB,OACtC,KAAM,CACJ,QAASX,EAAU,QACnB,WAAYA,EAAU,WACtB,OAAQA,EAAU,MACpB,EACA,GAAI,CACF,QAASC,EAAQ,QACjB,WAAYA,EAAQ,WACpB,OAAQA,EAAQ,MAClB,EACA,iBAAAe,EACA,gBAAiBF,GAAsB,CAAC,EACxC,SAAUN,EAAS,SAAS,EAC5B,GAAII,GAAe,CAAE,YAAaA,CAAY,EAC9C,GAAIL,GAA2B,CAC7B,cAAeF,EAAyB,OAAOC,GAAoB,CAAC,CAAC,EACrE,sBAAuB,EACzB,EACA,GAAI,CAACC,GAA2B,CAC9B,cAAeD,GAAkB,OAC9BY,GAAoB,CAACb,EAAyB,SAASa,CAAe,CACzE,EACA,sBAAuB,EACzB,EACA,0BAAAL,CACF,CAEF,CArFgBM,EAAArB,GAAA,0BAuFT,SAASsB,GAAqBhB,EAA2B,CAiB9D,OAhBgBA,EAAgB,OAC9B,CACEU,EAGAC,KAECD,EAAmBC,EAAe,KAAK,EAAI,CAC1C,QAASA,EAAe,QACxB,WAAYA,EAAe,UAC7B,EACAD,GAEF,CAAC,CACH,CAGF,CAlBgBK,EAAAC,GAAA,wBAoBT,SAASC,GAAqBC,EAAsB,CACzD,OAAOA,GAAO,cAAgB,IAChC,CAFgBH,EAAAE,GAAA,wBAIT,SAASE,GAAoBC,EAAeC,EAAgB,CACjE,OAAO,IAAIC,GAAUD,CAAM,EACxB,IAAI,IAAIC,GAAUF,CAAK,CAAC,EACxB,MAAM,CAAC,EACP,aAAa,GAAG,EAChB,SAAS,CACd,CANgBL,EAAAI,GAAA,uBAQT,SAASI,GACdC,EACAC,EACA,CACA,IAAMC,EAAkBT,GAAqBO,CAAQ,EAC/CG,EAAkBV,GAAqBQ,CAAQ,EACrD,GAAI,CAACC,GAAmB,CAACC,EACvB,MAAO,GAET,IAAMC,EAAmBC,GAAeH,EAAiBC,CAAe,EACxE,OAAKC,EAIEA,GAAoB,GAHlB,EAIX,CAfgBb,EAAAQ,GAAA,6BAiBT,SAASO,GACdZ,EACAlB,EACA+B,EACA,CACA,IAAMC,EAAMd,EAAM,iBACZe,EAAkBC,GAAgB,CAAE,OAAQ,WAAY,MAAAhB,CAAM,CAAC,EAOrE,OANuClB,EAAgB,KACrD,CAACmC,EAAiBC,IAChBH,EAAgB,QAAQE,EAAgB,KAAK,EAC7CF,EAAgB,QAAQG,EAAgB,KAAK,CACjD,EAGG,QAASvB,GAAWwB,GAA2BxB,EAAQmB,CAAG,GAAK,CAAC,CAAC,EACjE,OAAQM,GAAU,CAACA,EAAM,EAAE,EAC3B,IAAKA,GAAU,CACd,IAAMC,EAASD,EAAM,MAAM,OACrBE,EAAgBC,EACpB,IAAInB,GAAUgB,EAAM,cAAc,MAAM,EAAE,UACxC,CAACA,EAAM,cAAc,QACvB,EACA,EACA,CACF,EACMI,EAAiBD,EACrB,IAAInB,GAAUgB,EAAM,eAAe,MAAM,EAAE,UACzC,CAACA,EAAM,eAAe,QACxB,EACA,EACA,CACF,EACIK,EAAS,GACb,OAAIL,EAAM,SAAW,QACnBK,EAASC,GAAK,EAAE,kBAAkB,GAEhCN,EAAM,SAAW,gBACnBK,EAASC,GAAK,EAAE,WAAW,GAEzBN,EAAM,SAAW,wBACnBK,EAASC,GAAK,EAAE,4BAA4B,GAEvBA,GAAK,EAAE,CAC5B,GAAI,qHACJ,OAAQ,CACN,eAAAF,EACA,OAAAH,EACA,OAAAI,EACA,cAAAH,EACA,WAAYK,GACVP,EAAM,MAAM,WACZP,CACF,CACF,CACF,CAAC,CAEH,CAAC,CACL,CAzDgBhB,EAAAe,GAAA,2BA2DT,SAASgB,GACdC,EACAC,EACA,CAGA,OAFiBD,EAAe,IAAIzB,GAAUyB,CAAY,EAAIE,IAEhD,aAAaD,GAAc,CAAC,CAC5C,CAPgBjC,EAAA+B,GAAA,sBAST,SAASI,GACdC,EACS,CACT,MACE,CAAC,CAACA,GACFA,EAAgB,gBAAkB,MAClCA,EAAgB,gBAAkBC,GAAyB,cAE/D,CARgBrC,EAAAmC,GAAA,iCAUT,SAASG,GACdC,EACAC,EAIA,CACA,IAAMC,EAAgB,mBAClBC,EAAUH,EAAY,aACtBI,EAAkBJ,EAAY,mBASlC,GAPIA,EAAY,iCAAiC,SAASE,CAAa,IACrEF,EAAY,gCACVA,EAAY,gCAAgC,QAAQE,EAAe,EAAE,GAG7CN,GAA8BK,CAAW,EAMnE,OAHAE,EAAUH,EAAY,2BAA6B,GACnDI,EAAkBJ,EAAY,iCAAmC,GAEzDC,GAAa,cAAe,CAClC,KAAKH,GAAyB,2BAC5BK,EAAUA,GAAWb,GAAK,EAAE,+BAA+B,EAC3D,MACF,KAAKQ,GAAyB,gBAC5BK,EACEA,GAAWb,GAAK,EAAE,gDAAgD,EACpE,MACF,KAAKQ,GAAyB,wBAC5BK,EAAUA,GAAWb,GAAK,EAAE,qCAAqC,EACjE,MACF,QACEa,EAAUA,GAAW,GACrB,KACJ,CAEFC,EAAkBA,GAAmB,GACrCD,EAAUA,GAAW,GACrB,IAAME,EACJF,GAAS,QAAQ,MAAM,IAAM,IAAMA,GAAS,QAAQ,QAAQ,IAAM,GAEpE,MAAO,CACL,aAAcA,EACd,gBAAiB,CAAE,QAASC,EAAiB,KAAMC,CAAM,CAC3D,CACF,CA/CgB5C,EAAAsC,GAAA,mBAiDT,SAASO,GACdN,EACgB,CAChB,IAAIO,EAA8B,KAClC,GAAIP,EAAY,SAAW,SAAU,CACnC,IAAMQ,EAAkBR,EAAY,MACjC,MAAM,EACN,QAAQ,EACR,OAAQS,GAASA,EAAK,SAAW,SAAS,EAAE,CAAC,EAE5CD,IACFD,EAAc,CACZ,WAAYC,EAAgB,aAC5B,OAAQA,EAAgB,SACxB,aAAcA,EAAgB,aAC9B,QAASA,EAAgB,eAC3B,EAEJ,CACA,OAAOD,CACT,CApBgB9C,EAAA6C,GAAA,qCAsBT,SAASI,GAAgBV,EAA0B,CACxD,OAAOA,EAAY,SAAW,QAChC,CAFgBvC,EAAAiD,GAAA,mBAIT,SAASC,GACdC,EACAC,EACAC,EACAlD,EACAlB,EACAqE,EACS,CACT,GAAI,CAACnD,GAASgD,EACZ,MAAO,GAGT,IAAMI,EAAapC,GAAgB,CAAE,OAAQ,MAAO,MAAAhB,CAAM,CAAC,EAErDe,EAAkBC,GAAgB,CAAE,OAAQ,WAAY,MAAAhB,CAAM,CAAC,EAE/DqD,EAAsBD,EAAW,MAAOE,GAC5CxE,EAAgB,KACbW,GAAmBA,EAAe,QAAU6D,CAC/C,CACF,EAEMC,EAA8BxC,EAAgB,MAAOpB,GACzDb,EAAgB,KAAMW,GAAmBA,EAAe,QAAUE,CAAM,CAC1E,EAEM6D,EACJN,GAAqBC,EACjBM,GAAoBN,EAAsBD,CAAiB,EAC3D,GAEN,MACG,CAACD,GAA2B,CAACI,GAC7BJ,GAA2B,CAACC,GAC5BD,GACC,CAAC,CAACC,IACD,CAACM,GAA4B,CAACD,EAErC,CAtCgB1D,EAAAkD,GAAA,yBAwCT,SAASW,GAAkBC,EAAeC,EAAe,CAC9D,OACED,EAAO,aAAeC,EAAO,YAC7BD,EAAO,SAAWC,EAAO,QACzBD,EAAO,UAAYC,EAAO,OAE9B,CANgB/D,EAAA6D,GAAA,qBFjtBT,SAASG,GACdC,EAC2B,CAC3B,IAAMC,EAAQD,GAAO,OAAS,CAAC,EAC/B,OAAOC,EAAMA,EAAM,OAAS,CAAC,EAAE,GAAG,QACpC,CALgBC,EAAAH,GAAA,2BAOT,SAASI,GACdH,EAC2B,CAE3B,OADcA,GAAO,OAAS,CAAC,GAClB,CAAC,EAAE,KAAK,QACvB,CALgBE,EAAAC,GAAA,6BAOT,SAASC,GACdC,EACAC,EACA,CACA,IAAMC,EAAcF,GAAQ,OAAS,CAAC,EAChCG,EAAcF,GAAQ,OAAS,CAAC,EACtC,OAAOC,EAAY,SAAWC,EAAY,MAC5C,CAPgBN,EAAAE,GAAA,0BAST,SAASK,GACdJ,EACAC,EACA,CACA,IAAMI,EAAiBL,GAAQ,MAAM,IAAKM,GAASA,EAAK,SAAS,GAAK,CAAC,EACjEC,EAAiBN,GAAQ,MAAM,IAAKK,GAASA,EAAK,SAAS,GAAK,CAAC,EACvE,MAAO,CAACE,GAASH,EAAgBE,CAAc,CACjD,CAPgBV,EAAAO,GAAA,0BAST,SAASK,GACdT,EACAC,EACA,CACA,IAAMS,EAAsBV,GAAQ,MAAM,IAAKM,GAASA,EAAK,GAAG,MAAM,GAAK,CAAC,EACtEK,EAAsBV,GAAQ,MAAM,IAAKK,GAASA,EAAK,GAAG,MAAM,GAAK,CAAC,EAC5E,MAAO,CAACE,GAASE,EAAqBC,CAAmB,CAC3D,CAPgBd,EAAAY,GAAA,+BAST,SAASG,GACdZ,EACAC,EACS,CACT,OACEF,GAAuBC,EAAQC,CAAM,GACrCG,GAAuBJ,EAAQC,CAAM,GACrCQ,GAA4BT,EAAQC,CAAM,CAE9C,CATgBJ,EAAAe,GAAA,kBAuBT,SAASC,GACdC,EACAC,EACmC,CACnC,GAAIA,IAAQ,KACV,OAAO,KAET,IAAMC,EAAmBD,GACrB,KAAME,GAASA,EAAK,aAAeH,EAAe,KAAK,GACvD,QAAQ,KACPI,GACCA,EAAO,SAAS,YAAY,IAAMJ,EAAe,QAAQ,YAAY,CACzE,EACF,OAAKE,EAGEA,EAAiB,eAFf,IAGX,CAjBgBG,EAAAN,GAAA,8BAmBT,SAASO,GACdC,EACyB,CACzB,IAAIC,EACJ,OAAID,GAAe,IAAoBA,EAAc,IACnDC,EAAe,MACND,GAAe,MACxBC,EAAe,QAGVA,CACT,CAXgBH,EAAAC,GAAA,uBAwBT,SAASG,GACdC,EACAC,EACAC,EACY,CACZ,IAAMC,EAAYH,EAAY,MAAM,CAAC,EAC/BI,EAAWJ,EAAY,MAAMA,EAAY,MAAM,OAAS,CAAC,EACzDK,EAAqBC,GAAsBN,EAAY,KAAK,EAE5DO,EAAU,CACd,WAAYH,EAAS,aACrB,OAAQA,EAAS,SACjB,QAASA,EAAS,eACpB,EAEMI,EAAqBC,GACzBJ,EACIA,EAAmB,aACnBF,EAAU,eACdF,CACF,EACMS,EAAmBD,GAAeL,EAAS,aAAcH,CAAW,EACpEU,EAAgBT,EACpBG,EACI,CACE,WAAYG,GAAoB,MAAQ,GACxC,OAAQH,EAAmB,SAC3B,QAASA,EAAmB,eAC9B,EACA,CACE,WAAYG,GAAoB,MAAQ,GACxC,OAAQL,EAAU,WAClB,QAASA,EAAU,iBACrB,CACN,EACMS,EAAcV,EAAUK,CAAO,EAC/BM,EAAcR,EAChBA,EAAmB,cAAgB,GACnCL,EAAY,YAEhB,MAAO,CACL,eAAgBQ,EAChB,UAAWG,EACX,aAAcD,EACd,QAASE,EACT,YAAAC,CACF,CACF,CA/CgBC,EAAAf,GAAA,oBAiDT,SAASgB,GACdC,EACAC,EAMqB,CACrB,GAAM,CAAE,UAAAC,EAAW,QAAAX,EAAS,UAAAL,EAAW,aAAAiB,CAAa,EAAIF,EAClDG,EAAgBC,GACpBL,EAAM,cACNM,GAA0BN,CAAK,GAAKE,GAAW,QACjD,EACMK,EAAiBF,GACrBL,EAAM,aACNQ,GAAwBR,CAAK,GAAKT,GAAS,QAC7C,EAEA,GAAMS,GAASI,GAAiBG,EAAgB,CAC9C,IAAME,EAAcC,GAClBN,EAAc,SAAS,EACvBG,EAAe,SAAS,CAC1B,EAIA,GAFE,CAAC,CAACE,GAAeE,GAAiBP,EAAeK,CAAW,EAE3C,CACjB,IAAMG,EAAWC,GAAiBb,GAAO,MAAOd,CAAS,EACnD4B,EAAeC,GAAoBN,CAAW,EACpD,MAAO,CACL,OACA,cAAAL,EACA,eAAAG,EACA,YAAAE,EACA,SAAAG,EACA,aAAAE,CACF,CACF,CACF,SAAWd,IAAU,CAACI,GAAiB,CAACG,GACtC,MAAO,CAAE,MAAqC,EAGhD,IAAMS,EAAsBC,GAAuBjB,EAAM,KAAK,EACxDkB,EAAef,EAAegB,GAEpC,GAAKC,GAAkBnB,EAAO,aAAa,SAAS,EAAGe,CAAmB,GAMnE,GACLE,GACA,WAAWF,GAAuB,GAAG,EAAIb,EAEzC,MAAO,CACL,OACA,SAAUA,EAAa,SAAS,CAClC,MAZA,OAAO,CACL,OACA,qBAAsBkB,GAAsBrB,EAAOG,CAAY,EAC/D,oBAAqBa,CACvB,EAWF,OAAO,IACT,CA/DgBlB,EAAAC,GAAA,yBAiET,SAASW,GACdN,EACAG,EACe,CACf,IAAMe,EACJ,OAAOf,GAAmB,SACtB,WAAWA,CAAc,GAAK,EAC9B,CAACA,GAAgB,GAAG,CAAC,EACrBgB,EACJ,CAACnB,GAAiB,CAACG,GAAkBe,EACjC,KACAE,GACEpB,EAAc,SAAS,EACvBG,EAAe,SAAS,CAC1B,EAEN,OAAOgB,GAAoBA,EAAmB,EAAIA,EAAmB,IACvE,CAjBgBzB,EAAAY,GAAA,kBAmBT,IAAMe,GAAuB3B,EAAC4B,GAAkB,CACrD,IAAMC,EAAM,IAAI,IACVC,EAAmD,CAAC,EAC1D,OAAAF,EAAM,QAASG,GAAS,CACjBF,EAAI,IAAIE,EAAK,KAAK,MAAM,WAAW,IACtCF,EAAI,IAAIE,EAAK,KAAK,MAAM,WAAW,EACnCD,EAAO,KAAKC,EAAK,KAAK,KAAK,GAExBF,EAAI,IAAIE,EAAK,GAAG,MAAM,WAAW,IACpCF,EAAI,IAAIE,EAAK,GAAG,MAAM,WAAW,EACjCD,EAAO,KAAKC,EAAK,GAAG,KAAK,EAE7B,CAAC,EAEMD,CACT,EAfoC,wBAiBvBE,GAAehC,EAAA,CAC1BiC,EACAC,IAEOA,EAAO,KAAK,CAACC,EAAQC,IAAW,CACrC,IAAMC,EAAWrC,EAACsC,GAChBA,EAAM,QAAQ,KAAMC,GAAUA,EAAM,iBAAmBN,CAAQ,GAAG,OAClE,EAFe,YAIXO,EAAcH,EAASF,CAAM,EAC7BM,EAAcJ,EAASD,CAAM,EAEnC,GAAII,IAAgBC,EAClB,OAAOA,EAAcD,EAGvB,IAAME,EAAgBP,EAAO,UAAU,YAAY,EAC7CQ,EAAgBP,EAAO,UAAU,YAAY,EAEnD,OAAOM,EAAc,cAAcC,CAAa,CAClD,CAAC,EApByB,gBAuBfC,GAAkB5C,EAAA,CAC7B6C,EACAX,EACAY,IACyB,CACzB,GAAI,CAACZ,EAAO,OACV,OAAO,KAET,GAAI,CAACW,EAEH,MAAO,CACL,cAAeC,EACf,GAAGZ,EAAO,CAAC,CACb,EAGF,IAAMa,EAAyB,IAAI,IACjCF,EAAa,MAAM,IAAKG,GAASA,EAAK,SAAS,CACjD,EAGMC,EAAef,EAAO,KAAMhC,GAAU,CAE1C,IAAMgD,EAAkB,IAAI,IAAIhD,EAAM,MAAM,IAAK8C,GAASA,EAAK,SAAS,CAAC,EAGzE,OAAO,MAAM,KAAKD,CAAsB,EAAE,MAAOI,GAC/CD,EAAgB,IAAIC,CAAS,CAC/B,CACF,CAAC,EAGD,MAAO,CACL,cAAeL,EACf,GAAIG,GAAgBf,EAAO,CAAC,CAC9B,CACF,EApC+B,mBAsClBkB,GAAWpD,EAACqD,GAAiC,CACxD,IAAMC,EAAatD,EAAA,CAACuD,EAAaC,IAAgB,CAC/C,IAAMC,EAASC,GAAmB,QAAQH,EAAE,KAAK,EAC3CI,EAASD,GAAmB,QAAQF,EAAE,KAAK,EAEjD,OAAIC,IAAW,IAAME,IAAW,GACvBF,EAASE,EAGdF,IAAW,GACN,GACEE,IAAW,GACb,EAGF,CACT,EAfmB,cAiBnB,OAAON,EAAK,KAAKC,CAAU,CAC7B,EAnBwB,YDxUjB,IAAMM,GAAcC,EAAA,CACzBC,EACAC,IAEAD,GAAO,SACH,IAAIE,GAAUD,GAAUE,EAAI,EAAE,aAAaH,GAAO,UAAY,CAAC,EAC/D,KANqB,eAqEdI,EAAgBC,GAC3BC,GAAmB,EACjBC,GAAuBC,IAAS,CAC9B,eAAgB,KAChB,UAAW,KACX,YAAa,GACb,aAAc,KACd,cAAe,IAAIN,GAAU,CAAC,EAC9B,eAAgB,IAAIA,GAAU,CAAC,EAC/B,aAAc,KACd,QAAS,KACT,aAAc,GACd,aAAc,QACd,cAAe,KACf,OAAQ,KACR,MAAO,KACP,QAAS,KACT,sBAAuB,GACvB,gBAAiB,CAAC,EAClB,kBAAmB,KACnB,uBAAwB,GACxB,wBAAyB,CAACO,EAAKC,IAC7BF,EAAKG,IAAW,CACd,GAAGA,EACH,CAACF,CAAG,EAAGC,CACT,EAAE,EACJ,iBAAmBE,GACjBJ,EAAKG,GAAU,CACb,IAAIE,EAAiC,KACjCC,EAA4BX,GAE5BY,EAAgBJ,EAAM,cAC1B,OAAKK,GAAiBL,EAAM,WAAW,GAGjCC,IACJC,EAAiBD,GAAO,aACpB,IAAIV,GAAUU,GAAO,YAAY,EACjC,KACJG,EAAgBE,GACdN,EAAM,YACNO,GAA0BN,CAAK,GAAKD,EAAM,WAAW,QACvD,EACAG,EAAiBG,GACfL,EAAM,aACNO,GAAwBP,CAAK,GAAKD,EAAM,SAAS,QACnD,GAEK,CACL,cAAeC,EACf,GAAI,CAAC,CAACA,GAAS,CACb,aAAAC,EACA,eAAAC,EACA,cAAAC,CACF,CACF,GAtBS,CAAC,CAuBZ,CAAC,EACH,YAAa,IACXP,EAAI,KAAO,CACT,MAAO,KACP,QAAS,IACX,EAAE,EACJ,WAAY,IACVA,EAAI,KAAO,CACT,cAAe,KACf,aAAc,KACd,eAAgB,IAAIN,GAAU,CAAC,EAC/B,OAAQ,KACR,aAAc,GACd,MAAO,KACP,QAAS,IACX,EAAE,EACJ,kBAAoBkB,GAAU,CAC5BZ,EAAKG,GACCA,EAAM,gBAAgB,OAASS,GAAO,KACjC,CAAC,EAGH,CACL,eAAgBA,EAChB,cAAe,IAAIlB,GAAU,CAAC,EAC9B,GAAIS,EAAM,WAAa,CACrB,cAAe,KACf,UAAW,KACX,aAAc,KACd,eAAgB,IAAIT,GAAU,CAAC,CACjC,CACF,CACD,CACH,EACA,aAAemB,GACNb,EAAKG,IAAW,CACrB,UAAWU,EAAO,MAClB,GAAIA,EAAO,OAAS,CAClB,eACEA,EAAO,KAAK,YAAY,KACrBC,GAAeA,EAAW,OAASD,EAAO,MAAM,UACnD,GAAK,IACT,EACA,GAAI,CAAC,CAACV,EAAM,aAAe,CACzB,cAAeb,GAAYuB,EAAO,MAAOV,EAAM,WAAW,CAC5D,CACF,EAAE,EAEJ,gBAAkBS,GAAU,CAC1BZ,EAAKG,GACCA,EAAM,cAAc,OAASS,GAAO,KAC/B,CAAC,EAGH,CACL,aAAcA,EACd,GAAIT,EAAM,SAAW,CACnB,cAAe,KACf,QAAS,KACT,aAAc,KACd,eAAgB,IAAIT,GAAU,CAAC,CACjC,CACF,CACD,CACH,EACA,WAAamB,GACJb,EAAI,KAAO,CAChB,QAASa,EAAO,MAChB,GAAIA,EAAO,OAAS,CAClB,aACEA,EAAO,KAAK,YAAY,KACrBC,GAAeA,EAAW,OAASD,EAAO,MAAM,UACnD,GAAK,IACT,CACF,EAAE,EAEJ,eAAiBpB,GAAW,CAC1BO,EAAKG,IAAW,CACd,YAAaV,EACb,GAAI,CAACA,GAAU,CACb,aAAc,KACd,eAAgB,IAAIC,GAAU,CAAC,EAC/B,cAAe,IACjB,EACA,GAAI,CAAC,CAACS,EAAM,WAAa,CACvB,cAAeb,GAAYa,EAAM,UAAWV,CAAM,CACpD,CACF,EAAE,CACJ,EACA,MAAQsB,GAAe,CACrB,GAAM,CACJ,eAAAC,EACA,UAAAC,EACA,aAAAC,EACA,QAAAC,EACA,YAAAC,CACF,EAAIL,EAEJf,EAAI,CACF,eAAAgB,EACA,UAAAC,EACA,YAAAG,EACA,aAAc,KACd,cAAe9B,GAAY2B,GAAa,KAAMG,CAAW,EACzD,eAAgB,IAAI1B,GAAU,CAAC,EAC/B,aAAAwB,EACA,QAAAC,EACA,cAAe,IACjB,CAAC,CACH,EACA,gBAAiB,IACfnB,EAAKG,IAAW,CACd,eAAgBA,EAAM,aACtB,UAAWA,EAAM,QACjB,aAAcA,EAAM,eACpB,QAASA,EAAM,UACf,YAAaA,EAAM,cAAc,SAAS,GAAK,GAC/C,cAAeA,EAAM,QACjBb,GAAYa,EAAM,QAASA,EAAM,cAAc,SAAS,GAAK,EAAE,EAC/D,IAAIT,GAAU,CAAC,CACrB,EAAE,EACJ,oBAAqB,IACnBM,EAAI,KAAO,CACT,UAAW,KACX,eAAgB,KAChB,eAAgB,IAAIN,GAAU,CAAC,EAC/B,cAAe,IAAIA,GAAU,CAAC,EAC9B,YAAa,GACb,aAAc,KACd,cAAe,IACjB,EAAE,EACJ,kBAAmB,IACjBM,EAAI,KAAO,CACT,QAAS,KACT,aAAc,KACd,aAAc,KACd,eAAgB,IAAIN,GAAU,CAAC,EAC/B,cAAe,IACjB,EAAE,EACJ,wBAA0B2B,GACxBrB,EAAI,CACF,sBAAuBqB,CACzB,CAAC,EACH,mBAAqBC,GAAYtB,EAAI,CAAE,gBAAiBsB,CAAQ,CAAC,EACjE,qBAAuBC,GAAYvB,EAAI,CAAE,kBAAmBuB,CAAQ,CAAC,EACrE,kBAAmB,IACjBvB,EAAI,CACF,sBAAuB,GACvB,gBAAiB,CAAC,EAClB,kBAAmB,IACrB,CAAC,EACH,0BAA4BqB,GAC1BrB,EAAI,CAAE,uBAAwBqB,CAAK,CAAC,CACxC,EAAE,CACJ,CACF,EAEaG,GAAwB5B,EAAc,UACjD,CAAC6B,EAAeC,IAA0B,EAEtCD,EAAc,iBAAmBC,EAAsB,gBACvDD,EAAc,YAAcC,EAAsB,WAClDD,EAAc,eAAiBC,EAAsB,cACrDD,EAAc,UAAYC,EAAsB,SAChDD,EAAc,cAAgBC,EAAsB,cAGpDC,GAAa,kBAA8B,CACzC,wBACA,QAAS,CACP,eAAgBF,EAAc,gBAAgB,KAC9C,aAAcA,EAAc,cAAc,KAC1C,UAAWA,EAAc,UACrB,CACE,OAAQA,EAAc,UAAU,OAChC,KAAMA,EAAc,UAAU,KAC9B,QAASA,EAAc,UAAU,OACnC,EACA,OACJ,QAASA,EAAc,QACnB,CACE,OAAQA,EAAc,QAAQ,OAC9B,KAAMA,EAAc,QAAQ,KAC5B,QAASA,EAAc,QAAQ,OACjC,EACA,OACJ,cAAeA,EAAc,WAC/B,CACF,CAAC,EAIDA,EAAc,eAAe,YAC7BC,EAAsB,eAAe,WAErCC,GAAa,kBAA8B,CACzC,yBACA,QAASF,EAAc,cACnB,CACE,cAAeA,EAAc,cAAc,cAC3C,MAAOA,EAAc,cAAc,MACnC,aAAcA,EAAc,cAAc,aAC1C,WAAYA,EAAc,cAAc,WACxC,KAAMA,EAAc,cAAc,IACpC,EACA,IACN,CAAC,CAEL,CACF,EDlWO,SAASG,IAA0B,CACxC,GAAM,CACJ,eAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,kBAAAC,EACA,WAAAC,EACA,aAAAC,EACA,UAAAC,EACA,QAAAC,EACA,eAAAC,EACA,aAAAC,CACF,EAAIC,EAAc,EAEZC,EAASC,EAAY,EAAE,OACvBC,EAAkBD,EAAY,EAAE,YAChCE,EAAcF,EAAY,EAAE,YAAY,EACxCG,EAASH,EAAY,EAAE,OAAO,EAC9B,CAAE,UAAAI,CAAU,EAAIJ,EAAY,EAE5B,CAAE,gBAAAK,EAAiB,oBAAAC,EAAqB,oBAAAC,CAAoB,EAChEP,EAAY,EAERQ,EAAmBT,GAAQ,MAAM,OACjCU,EAAwBV,GAAQ,MAAM,YACtCW,EAAiBX,GAAQ,IAAI,OAC7BY,EAAsBZ,GAAQ,IAAI,YAClCa,EAAsBC,GAA0B,MAAS,EACzDC,EAAoBD,GAA0B,MAAS,EACvDE,EAA2BF,GAA2B,MAAS,EAC/DG,EAAyBH,GAA2B,MAAS,EAEnEI,GAAU,IAAM,CACV,OAAOlB,EAAO,OAAW,KAC3BX,EAAeW,EAAO,OAAO,SAAS,CAAC,CAE3C,EAAG,CAACA,GAAQ,MAAM,CAAC,EAEnBkB,GAAU,IAAM,CACd,GAAIhB,IAAoB,UAAW,CACjCT,EAAW,EACX,IAAM0B,EAAQhB,EAAY,KACvBgB,GAAUA,EAAM,OAASnB,GAAQ,MAAM,UAC1C,EACML,EAAYK,GAAQ,MAAM,MAC1BoB,EAAQzB,GAAaU,EAAUV,CAAS,GAE1CwB,GAAU,CAACA,GAASH,EAAyB,UAC/CxB,EAAkB2B,GAAS,IAAI,EAG7BC,EACF1B,EAAa,CAAE,MAAA0B,EAAO,KAAM,CAAE,YAAAjB,EAAa,OAAAC,CAAO,CAAE,CAAC,EAC5C,CAACgB,GAASP,EAAoB,SACvCnB,EAAa,CAAE,MAAO,IAAK,CAAC,EAG9BsB,EAAyB,QAAUhB,GAAQ,MAAM,WACjDa,EAAoB,QAAUb,GAAQ,MAAM,KAC9C,CACF,EAAG,CACDA,GAAQ,MAAM,OAAO,OACrBA,GAAQ,MAAM,OAAO,QACrBA,GAAQ,MAAM,OAAO,WACrBA,GAAQ,MAAM,WACdE,CACF,CAAC,EAEDgB,GAAU,IAAM,CACVG,GAAwB1B,EAAWc,CAAgB,GACrDf,EAAa,CAAE,MAAO,IAAK,CAAC,EAG1B4B,GAA6BzB,EAAgBa,CAAqB,GACpElB,EAAkB,IAAI,CAE1B,EAAG,CAACiB,EAAkBC,CAAqB,CAAC,EAE5CQ,GAAU,IAAM,CACVG,GAAwBzB,EAASe,CAAc,GACjDjB,EAAa,CAAE,MAAO,IAAK,CAAC,EAE1B4B,GAA6BxB,EAAcc,CAAmB,GAChErB,EAAgB,IAAI,CAExB,EAAG,CAACoB,EAAgBC,CAAmB,CAAC,EAExCM,GAAU,IAAM,CACd,GAAIhB,IAAoB,UAAW,CACjCT,EAAW,EACX,IAAM0B,EAAQhB,EAAY,KACvBgB,GAAUA,EAAM,OAASnB,GAAQ,IAAI,UACxC,EAEMJ,EAAUI,GAAQ,IAAI,MACtBoB,EAAQxB,GAAWS,EAAUT,CAAO,GAEtCuB,GAAU,CAACA,GAASF,EAAuB,UAC7C1B,EAAgB4B,GAAS,IAAI,EAG3BC,EACF9B,EAAW,CAAE,MAAA8B,EAAO,KAAM,CAAE,YAAAjB,EAAa,OAAAC,CAAO,CAAE,CAAC,EAC1C,CAACgB,GAASL,EAAkB,SACrCzB,EAAW,CAAE,MAAO,IAAK,CAAC,EAG5B2B,EAAuB,QAAUjB,GAAQ,IAAI,WAC7Ce,EAAkB,QAAUf,GAAQ,IAAI,KAC1C,CACF,EAAG,CACDA,GAAQ,IAAI,OAAO,OACnBA,GAAQ,IAAI,OAAO,QACnBA,GAAQ,IAAI,OAAO,WACnBA,GAAQ,IAAI,WACZE,CACF,CAAC,EAEDgB,GAAU,IAAM,CACdZ,EAAgBN,GAAQ,WAAW,KAAO,IAAI,EAC9CO,EAAoBP,GAAQ,WAAW,SAAW,IAAI,EACtDQ,EAAoBR,GAAQ,WAAW,SAAW,IAAI,CACxD,EAAG,CACDA,GAAQ,WAAW,IACnBA,GAAQ,WAAW,QACnBA,GAAQ,WAAW,OACrB,CAAC,CACH,CA/HgBuB,EAAAnC,GAAA,2BOXhB,OAAS,aAAAoC,GAAW,UAAAC,OAAc,QAClC,OACE,sBAAAC,GACA,eAAAC,GACA,mBAAAC,OACK,mBCHA,SAASC,GACdC,EACAC,EACO,CACP,IAAMC,EAAmBF,EAAY,MAAM,IAAI,EAE/C,MAAO,CACL,WAAYC,EAAM,KAClB,QAASC,IAAmB,CAAC,GAAK,KAClC,OAAQA,EAAiB,CAAC,CAC5B,CACF,CAXgBC,EAAAJ,GAAA,kCAaT,SAASK,GAAmBC,EAAyC,CAC1E,GAAIA,EACF,MAAO,GAAGA,EAAM,MAAM,GAAGA,EAAM,QAAU,KAAKA,EAAM,OAAO,GAAK,EAAE,EAGtE,CALgBF,EAAAC,GAAA,sBDCT,SAASE,IAAqB,CACnC,IAAMC,EAAWC,GAAY,EACvB,CAACC,EAAcC,CAAe,EAAIC,GAAgB,EAClD,CACJ,eAAAC,EACA,aAAAC,EACA,UAAAC,EACA,QAAAC,EACA,YAAAC,EACA,kBAAAC,EACA,gBAAAC,EACA,aAAAC,EACA,WAAAC,EACA,eAAAC,CACF,EAAIC,EAAc,EACZC,EAAkBC,EAAY,EAAE,YAChCC,EAAcD,EAAY,EAAE,YAAY,EACxCE,EAASF,EAAY,EAAE,OAAO,EAC9BG,EAAoBC,GAAmB,EACvC,CAAE,aAAAC,EAAc,mBAAAC,CAAmB,EAAIN,EAAY,EACnDO,EAAeP,EAAY,EAAE,iBAAiB,EAC9CQ,EAA4BC,GAAe,EAC3C,CAAE,UAAAC,CAAU,EAAIV,EAAY,EAC5BW,EAAqBC,EAAA,IAAM,CAC/B,IAAMC,EAAyC,CAAC,EAEhD,OAAW,CAACC,EAAKC,EAAK,IAAK9B,EAAa,QAAQ,EAC1C6B,EAAI,WAAW,MAAM,IACvBD,EAAeC,CAAG,EAAIC,IAG1B,IAAMC,EAAa/B,EAAa,gBAA4B,EACtDG,EAAiBH,EAAa,oBAAgC,EAC9DK,EAAYL,EAAa,eAA2B,EACpDI,EAAeJ,EAAa,kBAA8B,EAC1DM,EAAUN,EAAa,aAAyB,EAChDgC,EAAchC,EAAa,iBAA6B,EACxDiC,GAAYjC,EAAa,eAA2B,EACpDkC,GAAmBlC,EAAa,sBAAkC,EAElEmC,EAAanC,EAAa,gBAA2B,EAE3D,MAAO,CACL,WAAA+B,EACA,eAAA5B,EACA,UAAAE,EACA,aAAAD,EACA,QAAAE,EACA,YAAA0B,EACA,UAAAC,GACA,iBAAAC,GACA,eAAAN,EACA,WAAAO,CACF,CACF,EA/B2B,sBAiCrBC,EAAwBT,EAC5B3B,GACG,CACH,QAAWqC,KAAYrC,EAChBA,EAAaqC,CAAQ,GACxB,OAAOrC,EAAaqC,CAAQ,EAGhCpC,EAAgBD,EAAwC,CAAE,QAAS,EAAK,CAAC,CAC3E,EAT8B,yBAW9BsC,GAAU,IAAM,CACd,GAAM,CAAE,YAAAN,EAAa,UAAAC,EAAW,eAAAL,EAAgB,WAAAO,CAAW,EACzDT,EAAmB,EACjBR,GAAqBJ,IAAoB,WAC3CsB,EAAsB,CACnB,eAA+BjC,GAAgB,KAC/C,UAA0BoC,GAAmBlC,CAAS,EACtD,aAA6BD,GAAc,KAC3C,QAAwBmC,GAAmBjC,CAAO,EAClD,WAA2BC,EAC3B,YAA4ByB,GAAe,OAC3C,UAA0BC,GAAa,OACvC,WAA0BE,GAAc,OACxC,iBAAiCb,EAC9BC,EAA0B,QAC1B,OACJ,GAAGK,CACL,CAAC,CAEL,EAAG,CACD9B,EAAS,SACTS,EACAJ,EACAE,EACAD,EACAE,EACAgB,CACF,CAAC,EAEDgB,GAAU,IAAM,CACd,GAAI,CAACpB,EACH,OAGF,IAAMlB,EAAe0B,EAAmB,EAUxC,GARI,CAACH,EAA0B,SAAWvB,EAAa,mBACrDuB,EAA0B,QAAUvB,EAAa,kBAG/CA,EAAa,YACfY,EAAeZ,EAAa,UAAU,EAGpCc,IAAoB,UAAW,CACjC,IAAMX,EAAiBa,EAAY,KAChCmB,GAAeA,EAAW,OAASnC,EAAa,cACnD,EAEMK,EACJL,EAAa,WAAaG,EACtBsB,EACEe,GACExC,EAAa,UACbG,CACF,CACF,EACA,OACAC,EAAeY,EAAY,KAC9BmB,GAAeA,EAAW,OAASnC,EAAa,YACnD,EAEMM,EACJN,EAAa,SAAWI,EACpBqB,EACEe,GAA+BxC,EAAa,QAASI,CAAY,CACnE,EACA,OAEAD,IACJK,EAAkBL,CAAc,EAC1BE,GACJK,EAAa,CACX,MAAOL,EACP,KAAM,CACJ,YAAaW,EACb,OAAQC,CACV,CACF,CAAC,GAICb,IACJK,EAAgBL,CAAY,EACtBE,GACJK,EAAW,CACT,MAAOL,EACP,KAAM,CAAE,YAAaU,EAAa,OAAQC,CAAO,CACnD,CAAC,EAGP,CACF,EAAG,CAACH,CAAe,CAAC,EAEpBwB,GAAU,IAAM,CACd,GAAM,CAAE,UAAAL,EAAW,iBAAAC,CAAiB,EAAIR,EAAmB,EAE3DN,EAAa,YAAaa,GAAa,MAAS,EAEhDZ,EACE,mBACAa,GAAkB,MAAM,GAAG,GAAK,MAClC,CACF,EAAG,CAAC,CAAC,CACP,CA3KgBP,EAAA9B,GAAA,sBEhBhB,OAAS,QAAA4C,OAAY,eACrB,OACE,SAAAC,GACA,UAAAC,GACA,aAAAC,GACA,WAAAC,GACA,YAAAC,GACA,cAAAC,GACA,UAAAC,GACA,aAAAC,GACA,cAAAC,OACK,gBAEP,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QAC3C,OAAS,eAAAC,GAAa,mBAAAC,OAAuB,mBCZ7C,OAAS,oBAAAC,GAAkB,WAAAC,GAAS,SAAAC,GAAO,cAAAC,OAAkB,gBAC7D,OAAOC,OAAW,QCHlB,OAAS,aAAAC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAiBD,GAAO,MAAO,CAC1C,QAAS,OACT,eAAgB,gBAChB,MAAO,OACP,OAAQ,MACR,QAAS,SACT,aAAc,MACd,OAAQ,UACR,WAAY,SACZ,gBAAiB,cACjB,CAAC,IAAID,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,EAEA,UAAW,CACT,gBAAiB,gBACjB,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,CACF,EACA,SAAU,CACR,SAAU,CACR,KAAM,CACJ,OAAQ,UACR,UAAW,CACT,YAAa,cACb,QAAS,CACP,MAAO,aACT,CACF,CACF,CACF,CACF,CACF,CAAC,EAEYG,GAAYF,GAAO,MAAO,CACrC,QAAS,OACT,cAAe,SACf,MAAO,OACP,oBAAqB,CACnB,cAAe,YACjB,CACF,CAAC,EAEYG,GAAgBH,GAAO,MAAO,CACzC,QAAS,MACX,CAAC,EDrCM,SAASI,GAAyBC,EAAkB,CACzD,GAAM,CAAE,QAAAC,EAAS,MAAAC,EAAO,MAAAC,EAAO,QAAAC,EAAS,YAAAC,EAAa,SAAAC,CAAS,EAAIN,EAElE,OACEO,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAW,KAAK,QAAQ,QAAQ,SAC9BN,CACH,EACAI,GAAA,cAACG,GAAA,CAAQ,KAAM,GAAI,EACnBH,GAAA,cAACI,GAAA,CACC,QAASL,EAAW,OAAYL,EAChC,SAAUK,GACVC,GAAA,cAACK,GAAA,KACER,GACCG,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACM,GAAA,CACC,IAAKX,GAAO,KACZ,KAAM,GACN,iBAAkB,CAACA,GAAO,KAC1B,KAAK,WACP,EACAK,GAAA,cAACG,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,CAC3C,EAEFH,GAAA,cAACE,GAAA,CACC,UAAU,mBACV,KAAK,SACL,QAAQ,SACPP,GAAO,MAAQG,CAClB,CACF,EACAE,GAAA,cAACO,GAAA,CAAiB,KAAM,GAAI,MAAM,QAAQ,CAC5C,CACF,CAEJ,CAnCgBC,EAAAhB,GAAA,4BEThB,OAAS,QAAAiB,OAAY,eACrB,OACE,UAAAC,GACA,WAAAC,GACA,oBAAAC,GACA,SAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QCRX,SAASC,GACdC,EACAC,EACQ,CAER,GAAIA,EAAW,OAAS,SACtB,MAAO,GAGT,IAAMC,EAAsBD,EAAW,MAAM,WAE7C,MAAI,CAACC,GAAuB,CAACF,EACpB,GAGFE,EAAoB,QAAQ,WAAYF,CAAO,CACxD,CAhBgBG,EAAAJ,GAAA,wBCFhB,OAAS,aAAAK,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAaD,GAAO,IAAK,CACpC,eAAgB,OAChB,MAAO,qBACP,CAAC,IAAID,EAAS,IAAI,EAAG,CACnB,MAAO,oBACT,EAEA,QAAS,CACP,WAAY,KACZ,MAAO,qBACP,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,MAAO,oBACT,CACF,EAEA,SAAU,CACR,SAAU,CACR,KAAM,CACJ,UAAW,CACT,MAAO,uBACP,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,MAAO,sBACT,EACA,QAAS,CACP,MAAO,uBACP,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,MAAO,sBACT,CACF,CACF,CACF,EACA,MAAO,CAAC,CACV,CACF,CACF,CAAC,EAEYG,GAAYF,GAAO,MAAO,CACrC,QAAS,OACT,eAAgB,SAChB,cAAe,SACf,WAAY,SACZ,UAAW,SACX,uCAAwC,CACtC,MAAO,qBACP,CAAC,IAAID,EAAS,IAAI,EAAG,CACnB,MAAO,oBACT,CACF,EACA,qDAAsD,CACpD,MAAO,qBACP,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,MAAO,oBACT,CACF,CACF,CAAC,EFtCM,SAASI,GAAiBC,EAAkB,CACjD,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,MAAAC,EAAO,cAAAC,EAAe,WAAAC,CAAW,EAAIL,EAEtDM,EAAeC,GAAqBJ,EAAM,QAASE,CAAU,EAEnE,OACEG,GAAA,cAACC,EAAA,CACC,KAAMR,EACN,YAAW,GACX,QAASC,EACT,UAAWQ,EAAa,GACxBF,GAAA,cAACG,GAAA,KACCH,GAAA,cAACI,GAAA,CAAM,IAAKT,EAAM,MAAO,KAAM,GAAI,KAAK,WAAW,EACnDK,GAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9BV,EAAM,IACT,EACAK,GAAA,cAACK,GAAA,CAAW,QAAQ,OAAO,KAAK,QAAQ,UAAU,oBAC/CR,EAAW,WACd,EACAG,GAAA,cAACM,GAAA,CAAQ,KAAM,EAAG,EAElBN,GAAA,cAACK,GAAA,CAAW,QAAQ,OAAO,KAAK,UAC3BP,EACDE,GAAA,cAACO,GAAA,CACC,SAAQ,GACR,KAAMT,EACN,OAAO,SACP,IAAI,uBACHH,EAAM,QACPK,GAAA,cAACQ,GAAA,CAAiB,KAAM,GAAI,MAAM,OAAO,CAC3C,EAEAR,GAAA,cAACO,GAAA,KAAYZ,EAAM,OAAQ,CAE/B,EAEAK,GAAA,cAACM,GAAA,CAAQ,KAAM,EAAG,EAEjBX,EAAM,YACLK,GAAA,cAACK,GAAA,CAAW,UAAU,eAAe,QAAQ,OAAO,KAAK,UACtDI,GAAK,EAAE,KAAK,EAAG,IAChBT,GAAA,cAACK,GAAA,CACC,UAAU,oBACV,QAAQ,OACR,KAAK,UACJV,EAAM,UACT,CACF,EAEFK,GAAA,cAACM,GAAA,CAAQ,KAAM,KAAM,EAErBN,GAAA,cAACK,GAAA,CACC,KAAK,SACL,QAAQ,OACR,UAAU,6BACTI,GAAK,EACJ,4GACF,CACF,CACF,EACAT,GAAA,cAACM,GAAA,CAAQ,KAAM,GAAI,EACnBN,GAAA,cAACM,GAAA,CAAQ,KAAM,GAAI,EAEnBN,GAAA,cAACU,GAAA,CACC,QAAQ,YACR,KAAK,QACL,KAAK,UACL,UAAS,GACT,QAASd,GACRa,GAAK,EAAE,QAAQ,CAClB,CACF,CAEJ,CAzEgBE,EAAApB,GAAA,oBGdhB,OAAS,cAAAqB,OAAkB,iCAC3B,OAAS,cAAAC,GAAY,WAAAC,GAAS,UAAAC,OAAc,gBAC5C,OAAOC,IAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QCJnD,OAAS,UAAAC,OAAc,QCFhB,SAASC,IAAwB,CACtC,OAAO,OAAO,OAAS,OAAO,GAChC,CAFgBC,EAAAD,GAAA,yBDchB,SAASE,IAAuB,CAC9B,IAAMC,EAAiBC,GAA8B,IAAI,EACnD,CAAE,OAAAC,CAAO,EAAIC,EAAY,EACzBC,EAA4BC,GAAsB,GAAKH,EAAO,UAE9DI,EAAOC,EAACC,GAAsB,CAC9BJ,GACF,OAAO,KAAK,YAAYI,EAASN,EAAO,SAAU,CAEtD,EAJa,QA4Bb,MAAO,CACL,KAAAI,EACA,sBAxB4BC,EAACE,GAAyB,CACtDT,EAAe,QAAU,IAAI,eAAgBU,GAAY,CACvD,QAAWC,KAASD,EAClBJ,EAAK,CACH,KAAM,gBACN,KAAM,CACJ,OAAQK,EAAM,YAAY,MAC5B,CACF,CAAC,CAEL,CAAC,EAEDX,EAAe,QAAQ,QAAQS,CAAO,CACxC,EAb8B,yBAyB5B,yBAV+BF,EAAA,IAAM,CACjCP,EAAe,UACjBA,EAAe,QAAQ,WAAW,EAClCA,EAAe,QAAU,KAE7B,EALiC,2BAWjC,CACF,CAtCSO,EAAAR,GAAA,aEdT,OAAS,eAAAa,OAAmB,mBAErB,SAASC,IAA8B,CAC5C,IAAMC,EAAWC,GAAY,EAC7B,MAAO,IAAMD,EAAS,EAAE,CAC1B,CAHgBE,EAAAH,GAAA,mBCDhB,OACE,eAAAI,GACA,aAAaC,GACb,cAAcC,OACT,gBACP,OAAS,aAAAC,GAAW,YAAAC,OAAgB,QCFpC,OACE,SAASC,GACT,cAAcC,OACT,gBACP,OAAOC,OAAW,QCUlB,SAASC,GAAoBC,EAAkB,CAO7C,OALIA,EAAS,WAAW,GAAG,IACzBA,EAAWA,EAAS,MAAM,CAAC,GAIzBA,EAAS,SAAW,EAUf,IARYA,EAAS,MAAM,EAAE,EAGL,OAAO,SAAUC,EAAKC,EAAM,CACzD,OAAOD,EAAMC,EAAOA,CACtB,EAAG,EAAE,CAGiB,GAIjB,IAAIF,CAAQ,EACrB,CAtBSG,EAAAJ,GAAA,uBA6BT,SAASK,GAAkBC,EAA2B,CACpD,MAAO,UAAU,KAAKA,CAAQ,CAChC,CAFSF,EAAAC,GAAA,qBAKT,SAASE,GAAIC,EAAgBC,EAAgB,CAC3C,OAAOD,EAAO,SAASC,EAAQ,GAAG,CACpC,CAFSL,EAAAG,GAAA,OAKT,SAASG,GAASC,EAAe,CAC/B,IAAMC,EAAe,KAAK,IACxB,KAAK,IAAI,KAAK,MAAMD,CAAK,EAAG,CAAC,EAC7B,GACF,EACA,OAAOJ,GAAIK,EAAa,SAAS,EAAQ,EAAG,CAAC,CAC/C,CANSR,EAAAM,GAAA,YAST,SAASG,GAASC,EAAU,CAC1B,MAAO,IAAIJ,GAASI,EAAI,GAAG,CAAC,GAAGJ,GAASI,EAAI,KAAK,CAAC,GAAGJ,GAASI,EAAI,IAAI,CAAC,EACzE,CAFSV,EAAAS,GAAA,YAKT,SAASE,GAASC,EAAkB,CAClC,IAAMC,EAAM,SAASD,EAAI,MAAM,EAAG,CAAC,EAAG,EAAQ,EACxCE,EAAQ,SAASF,EAAI,MAAM,EAAG,CAAC,EAAG,EAAQ,EAC1CG,EAAO,SAASH,EAAI,MAAM,EAAG,CAAC,EAAG,EAAQ,EAE/C,MAAO,CAAE,IAAAC,EAAK,MAAAC,EAAO,KAAAC,CAAK,CAC5B,CANSf,EAAAW,GAAA,YAST,SAASK,GAAcN,EAAUO,EAAmB,CAClD,IAAMC,EAAS,EAAI,IAAUD,EAC7B,MAAO,CACL,IAAKP,EAAI,IAAMQ,EACf,MAAOR,EAAI,MAAQQ,EACnB,KAAMR,EAAI,KAAOQ,CACnB,CACF,CAPSlB,EAAAgB,GAAA,iBAUT,SAASG,GAAaT,EAAUO,EAAmB,CACjD,IAAMC,EAAS,IAAUD,EACzB,MAAO,CACL,IAAKP,EAAI,KAAO,IAAkBA,EAAI,KAAOQ,EAC7C,MAAOR,EAAI,OAAS,IAAkBA,EAAI,OAASQ,EACnD,KAAMR,EAAI,MAAQ,IAAkBA,EAAI,MAAQQ,CAClD,CACF,CAPSlB,EAAAmB,GAAA,gBAYF,SAASC,GAAgBR,EAAuB,CACrD,OAAOS,GAAgBT,EAAKI,EAAa,CAC3C,CAFgBhB,EAAAoB,GAAA,mBAKT,SAASE,GAAeV,EAAuB,CACpD,OAAOS,GAAgBT,EAAKO,EAAY,CAC1C,CAFgBnB,EAAAsB,GAAA,kBAKhB,SAASD,GACPT,EACAW,EACU,CACV,IAAMb,EAAMC,GAASC,CAAG,EAClBY,EAAmB,CAAC,EAC1B,QAASC,EAAI,EAAGA,EAAI,EAAGA,IACrBD,EAAO,KAAKf,GAASc,EAAcb,EAAKe,CAAC,CAAC,CAAC,EAE7C,OAAOD,CACT,CAVSxB,EAAAqB,GAAA,mBAaF,SAASK,GACdd,EACAV,EACAyB,EAC2B,CAI3B,IAAMC,EAAQN,GAAeV,CAAG,EAAE,QAAQ,EAAE,OAAOA,CAAG,EAChDiB,EAAST,GAAgBR,CAAG,EAC5BkB,EAAiBF,EAAM,OAAOC,CAAM,EAEpCE,EAAsC,CAAC,EACvC1B,EAASyB,EAAe,OAE9B,QAASL,EAAI,EAAGA,EAAIpB,EAAQoB,IAAK,CAC/B,IAAMO,EAAQ,KAAcL,EAAatB,EAAS,EAAIoB,EAAIA,GAAK,GAC/DM,EAAS,GAAG7B,CAAQ,GAAG8B,CAAK,EAAE,EAAIF,EAAeL,CAAC,CACpD,CAEA,OAAOM,CACT,CArBgB/B,EAAA0B,GAAA,wBAwBT,SAASO,GACdC,EACAC,EACAC,EACa,CACb,IAAMC,EAAS,CAAE,GAAGH,CAAW,EAE/B,QAAWhC,KAAYiC,EAAc,CACnC,IAAMG,EAAcH,EAAajC,CAA4B,EACvDqC,EACJrC,IAAa,WAAa,CAAC,CAACkC,GAAS,oBAcvC,GAAI,CAFkB,CAAC,aAAc,YAAY,EAAE,SAASlC,CAAQ,GAE9C,CAACD,GAAkBC,CAAQ,EAAG,CAClD,IAAMsC,EAAmB5C,GAAoB0C,CAAW,EACxD,OAAO,OACLD,EACAX,GAAqBc,EAAkBtC,EAAUqC,CAAiB,CACpE,CACF,CACF,CAEA,MAAO,CAAE,GAAGF,EAAQ,GAAGF,CAAa,CACtC,CAlCgBnC,EAAAiC,GAAA,+BClJhB,IAAMQ,GAAmBC,EAACC,GACxB,OAAO,aAAaA,GAAQA,EAAO,GAAK,GAAK,GAAG,EADzB,oBAGnBC,GAAmBF,EAACC,GAAiB,CACzC,IAAIE,EAAO,GACPC,EAEJ,IAAKA,EAAI,KAAK,IAAIH,CAAI,EAAGG,EAAI,GAAIA,EAAKA,EAAI,GAAM,EAC9CD,EAAOJ,GAAiBK,EAAI,EAAE,EAAID,EAGpC,OAAOJ,GAAiBK,EAAI,EAAE,EAAID,CACpC,EATyB,oBAWnBE,GAAUL,EAAA,CAACM,EAAWF,IAAc,CACxC,IAAIG,EAAIH,EAAE,OACV,KAAOG,GACLD,EAAKA,EAAI,GAAMF,EAAE,WAAW,EAAEG,CAAC,EAEjC,OAAOD,CACT,EANgB,WAQHE,GAASR,EAACS,GACrBP,GAAiBG,GAAQ,KAAM,KAAK,UAAUI,CAAK,CAAC,IAAM,CAAC,EADvC,UFCf,SAASC,GACdC,EACiB,CACjB,IAAMC,EAAaC,GAAgB,OAC7BC,EAAiB,CACrB,GAAGF,EACH,GAAGG,EACL,EACIC,EACAC,EAEJ,GAAIN,GAAQ,MAAO,CAEjB,IAAMO,EAAS,CAAE,OADGC,GAA4BP,EAAYD,EAAO,KAAK,CACnC,EAErCK,EAAa,CACX,GAFS,GAAGI,EAAuB,UAAUC,GAAOH,CAAM,CAAC,GAG3D,OAAQA,CACV,CACF,CAEA,GAAIP,GAAQ,KAAM,CAQhB,IAAMO,EAAS,CAAE,OAPEC,GACjBL,EACAH,EAAO,KACP,CACE,oBAAqB,EACvB,CACF,CACoC,EAEpCM,EAAY,CACV,GAFS,GAAGG,EAAuB,SAASC,GAAOH,CAAM,CAAC,GAG1D,OAAQA,CACV,CACF,CAEA,MAAO,CACL,MAAOF,EACP,KAAMC,CACR,CACF,CAzCgBK,EAAAZ,GAAA,yBA2CT,SAASa,GACdC,EACAC,EACA,CACA,GAAID,EAAK,QAAU,EACjB,OAAOA,EAAK,IAAI,CAAC,CAAE,QAAAE,EAAS,IAAAC,CAAI,IAAMC,GAAM,aAAaF,EAAS,CAAE,IAAAC,CAAI,CAAC,CAAC,EAG5E,IAAME,EAA8B,CAAC,EACrC,OAAAL,EAAK,QAAQ,CAACM,EAAMC,IAAU,CAC5B,GAAM,CAAE,QAAAL,EAAS,IAAAC,CAAI,EAAIG,EAEzB,GADAD,EAAO,KAAKD,GAAM,aAAaF,EAAS,CAAE,IAAAC,CAAI,CAAC,CAAC,EAC5CI,EAAQP,EAAK,OAAS,EAAG,CAC3B,IAAMG,EAAM,WAAWI,CAAK,GAC5BF,EAAO,KAAKD,GAAM,aAAaH,EAAS,CAAE,IAAAE,CAAI,CAAC,CAAC,CAClD,CACF,CAAC,EAEME,CACT,CAnBgBP,EAAAC,GAAA,YDpDhB,SAASS,IAAkC,CACzC,OACE,OAAO,YACP,OAAO,WAAW,8BAA8B,EAAE,OAEtD,CALSC,EAAAD,GAAA,mCAOF,SAASE,GAASC,EAAoB,CAC3C,GAAM,CACJ,OAAAC,EACA,WAAAC,EAAaC,GACb,aAAAC,EAAeC,GACf,sBAAAC,EAAwBC,EAC1B,EAAIP,EAEE,CAACQ,EAASC,CAAU,EAAIC,GAC5Bb,GAAgC,EAAI,OAAS,OAC/C,EAEM,CAAE,MAAAc,CAAM,EAAIC,EAAY,EAExB,CAAE,KAAAC,EAAM,MAAAC,CAAM,EAAIC,GAAsBd,CAAM,EAE9Ce,EAAYC,GAAY,CAC5B,QAASjB,EAAM,SAAW,CAAC,EAC3B,MAAO,CACL,QAAS,GAAGI,CAAY,KACxB,UAAW,GAAGE,CAAqB,IACrC,EACA,MAAO,CACL,OAAQJ,CACV,CACF,CAAC,EACKgB,EAAoB,CAACF,EAAU,UAAWG,GAAkB,SAAS,EACrEC,EAAmB,CAACJ,EAAU,UAAWK,GAAiB,SAAS,EAMzE,GAAIP,EAAO,CACT,IAAMQ,EAAuBL,GAAYH,EAAM,GAAIA,EAAM,MAAM,EAC/DI,EAAkB,KAAKI,EAAqB,SAAS,CACvD,CACA,GAAIT,EAAM,CACR,IAAMU,EAAsBN,GAAYJ,EAAK,GAAIA,EAAK,MAAM,EAC5DO,EAAiB,KAAKG,EAAoB,SAAS,CACrD,CAEA,OAAAC,GAAU,IAAM,CACd,IAAMC,EAAsB3B,EAAC4B,GAA+B,CACtDA,EAAM,QACRjB,EAAW,MAAM,EAEjBA,EAAW,OAAO,CAEtB,EAN4B,uBAQ5B,OAAIZ,GAAgC,GAClCY,EAAW,MAAM,EAGnB,OACG,WAAW,8BAA8B,EACzC,iBAAiB,SAAUgB,CAAmB,EAC1C,IAAM,CACX,OACG,WAAW,8BAA8B,EACzC,oBAAoB,SAAUA,CAAmB,CACtD,CACF,EAAG,CAAC,CAAC,EAYE,CACL,YAXqB3B,EAAA,IAAM,CAC3B,IAAM6B,EAAkBT,EAAkB,KAAK,GAAG,EAC5CU,EAAiBR,EAAiB,KAAK,GAAG,EAChD,OAAIT,IAAU,OACLH,IAAY,OAASoB,EAAiBD,EAGxChB,IAAU,OAASiB,EAAiBD,CAC7C,EARuB,kBAYrB,KAAMhB,IAAU,OAASH,EAAUG,CACrC,CACF,CA/EgBb,EAAAC,GAAA,YIlBT,IAAM8B,GAAkBC,EAACC,GAAiC,CAC/D,IAAMC,EAAmC,CAAC,EAE1C,OAAAD,GAAS,OAAO,EAAE,QAAQ,CAACE,EAAGC,IAAO,CACnC,IAAMC,EAAUF,EAAE,KAAK,WAAW,EAE9BE,GAAS,aACXH,EAAO,KAAK,CACV,GAAAE,EACA,KAAMC,GAAS,WACjB,CAAC,CAEL,CAAC,EAEMH,EAAO,KACZ,CAACI,EAAGC,IAAM,OAAOA,EAAE,KAAK,YAAY,EAAI,OAAOD,EAAE,KAAK,YAAY,CACpE,CACF,EAjB+B,mBCJ/B,OAAS,QAAAE,OAAY,eACrB,OAAS,SAAAC,GAAO,UAAAC,OAAc,gBAC9B,OAAOC,OAAW,QAEX,SAASC,GAAiBC,EAAkB,CACjD,OACEC,GAAA,cAACC,GAAA,CACC,OACED,GAAA,cAACE,GAAA,CACC,QAASH,EAAM,cACf,QAAQ,YACR,KAAK,UACL,KAAK,WACJI,GAAK,EAAE,mBAAmB,CAC7B,EAEF,KAAK,UACL,QAAQ,QACR,MAAOA,GAAK,EAAE,+CAA+C,EAC/D,CAEJ,CAjBgBC,EAAAN,GAAA,oBCJhB,OAAS,QAAAO,OAAY,eACrB,OAAS,UAAAC,GAAQ,WAAAC,GAAS,cAAAC,OAAkB,gBAC5C,OAAOC,OAAW,QAKX,SAASC,GAAiBC,EAAkB,CACjD,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,UAAAC,CAAU,EAAIH,EAErC,OACEI,GAAA,cAACC,EAAA,CACC,KAAMJ,EACN,YAAW,GACX,QAASC,EACT,UAAWI,EAAa,GACxBF,GAAA,cAACG,GAAA,CACC,MAAOC,GAAK,EAAE,sBAAsB,EACpC,KAAK,UACL,YAAaA,GAAK,EAChB,wLACF,GACAJ,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACM,GAAA,CACC,QAAQ,YACR,KAAK,QACL,KAAK,UACL,UAAS,GACT,QAASP,GACRK,GAAK,EAAE,SAAS,CACnB,CACF,CACF,CAEJ,CA3BgBG,EAAAZ,GAAA,oBCPhB,OAAS,mBAAAa,OAAuB,gBAChC,OAAOC,OAAW,QAIlB,SAASC,GAAWC,EAAkB,CACpC,OACEC,GAAA,cAACC,GAAA,CAAa,QAAQ,QAAQ,KAAK,QAAQ,QAASF,EAAM,SACxDC,GAAA,cAACE,GAAA,CAAgB,MAAM,QAAQ,KAAM,GAAI,CAC3C,CAEJ,CANSC,EAAAL,GAAA,cCLT,OAAS,QAAAM,OAAY,eACrB,OAAS,UAAAC,GAAQ,cAAAC,OAAkB,gBACnC,OAAOC,OAAW,QAIlB,SAASC,GAAaC,EAAkB,CACtC,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAO,QAAQ,QAAQ,QAASH,EAAM,QAAS,KAAK,UACnDC,GAAA,cAACG,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,YAC7CC,GAAK,EAAE,QAAQ,CAClB,CACF,CACF,CAEJ,CAVSC,EAAAP,GAAA,gBCNT,OAAS,QAAAQ,OAAY,eACrB,OAAS,SAAAC,GAAO,WAAAC,GAAS,cAAAC,OAAkB,gBAC3C,OAAOC,OAAW,QAWlB,SAASC,GAAaC,EAAkB,CACtC,GAAM,CAAE,KAAAC,CAAK,EAAIC,GAAc,EACzBC,EAAmBF,EAAK,OAC3BG,GAAWA,EAAO,QAAU,WAC/B,EACMC,EAAWF,EAAiB,OAGhCG,GAAA,cAAC,OAAI,UAAWC,GAAU,GACvBJ,EAAiB,IAAKC,GACrBE,GAAA,cAACE,GAAA,CAAqB,IAAKJ,EAAO,OAChCE,GAAA,cAACG,GAAA,CAAM,IAAKL,EAAO,MAAO,KAAM,GAAI,CACtC,CACD,CACH,EARAM,GAAK,EAAE,gBAAgB,EAWzB,OACEJ,GAAA,cAACK,GAAA,CAAQ,UAAWX,EAAM,UAAW,KAAK,SAAS,QAASK,GAC1DC,GAAA,cAACM,GAAA,CAAa,QAAQ,QAAQ,KAAK,QAAQ,QAASZ,EAAM,SACvDA,EAAM,aAAeM,GAAA,cAACO,GAAA,IAAc,EACrCP,GAAA,cAACQ,GAAA,CAAW,KAAM,GAAI,MAAM,QAAQ,CACtC,CACF,CAEJ,CAzBSC,EAAAhB,GAAA,gBCbT,OAAS,QAAAiB,OAAY,eACrB,OACE,qBAAAC,GACA,WAAAC,GACA,gBAAAC,GACA,WAAAC,GACA,mBAAAC,OACK,gBACP,OAAOC,OAAW,QCRlB,OAAS,iBAAAC,OAAqB,gBAC9B,OAAOC,OAAW,QAClB,OAAS,eAAAC,OAAmB,mBCI5B,OAAS,UAAAC,OAAc,UACvB,OAAS,WAAAC,GAAS,yBAAAC,OAA6B,qBAcxC,IAAMC,GAAuBC,GAClCC,GAA0B,EACxBC,GACEC,GAAsB,CAACC,EAAKC,KAAS,CACnC,SAAU,GACV,cAAe,CAAC,EAChB,gBAAiB,CAACC,EAAOC,IAAU,CACjC,IAAMC,EAAWD,EAAM,MAAM,CAAC,EACxBE,EAASF,EAAM,MAAMA,EAAM,MAAM,OAAS,CAAC,EAE3CG,EAA6B,CACjC,MAAAJ,EACA,aAAc,KAAK,IAAI,EACvB,UAAWC,EAAM,UACjB,MAAO,CACL,aAAc,SAASA,EAAM,YAAY,EACzC,KAAM,CACJ,WAAYC,EAAS,eACrB,QAASA,EAAS,kBAClB,OAAQA,EAAS,UACnB,EACA,GAAI,CACF,WAAYC,EAAO,aACnB,QAASA,EAAO,gBAChB,OAAQA,EAAO,QACjB,CACF,CACF,EAEME,EAAeN,EAAI,EAAE,cAAc,OACtCO,GAAqBA,EAAiB,YAAcL,EAAM,SAC7D,EAEAH,EAAI,KAAO,CACT,cAAe,CAAC,GAAGO,EAAcD,CAAY,CAC/C,EAAE,CACJ,EACA,mBAAqBG,GAAc,CACjCT,EAAKU,IAAW,CACd,cAAeA,EAAM,cAAc,OAChCJ,GAAiBA,EAAa,YAAcG,CAC/C,CACF,EAAE,CACJ,EACA,iBAAkB,IAAM,CACtB,GAAM,CAAE,SAAAE,EAAU,cAAAC,CAAc,EAAIX,EAAI,EACxC,OAAOU,EACHC,EAAc,KAAK,CAACC,EAAGC,IACjBD,EAAE,MAAM,cAAgB,CAACC,EAAE,MAAM,aAC5B,GAEL,CAACD,EAAE,MAAM,cAAgBC,EAAE,MAAM,aAC5B,EAEL,CAACD,EAAE,MAAM,cAAgB,CAACC,EAAE,MAAM,aAC7BA,EAAE,aAAeD,EAAE,aAErBC,EAAE,MAAM,aAAeD,EAAE,MAAM,YACvC,EACD,CAAC,CACP,EACA,kBAAoBE,GAAU,CAC5B,GAAM,CAAE,SAAAJ,EAAU,cAAAC,CAAc,EAAIX,EAAI,EAExC,GAAI,CAACU,EAAU,CACb,IAAMK,EAAoC,CAAC,EAC3CJ,EAAc,QAASN,GAAiB,CACpBS,EAAM,KACrBE,GAASA,EAAK,KAAK,YAAcX,EAAa,SACjD,GAEEU,EAAkB,KAAKV,CAAY,CAEvC,CAAC,EAEDN,EAAI,CAAE,SAAU,GAAM,cAAegB,CAAkB,CAAC,CAC1D,CACF,EACA,mBAAoB,IAAMhB,EAAI,CAAE,cAAe,CAAC,CAAE,CAAC,CACrD,EAAE,EAEF,CACE,KAAM,eACN,cAAe,GACf,WAAY,CAAC,CAAE,SAAAW,EAAU,GAAGO,CAAW,IAAMA,EAC7C,QAAS,EACT,QAAS,CAACC,EAAgBC,IAAY,CACpC,GAAIA,IAAY,EAAG,CAKjB,IAAMC,EACJF,EAGA,cAEDA,EAAqC,cACpCE,EACG,OACEf,GACC,CAACA,EAAa,IAClB,EACC,IAAI,CAAC,CAAE,KAAAgB,EAAM,GAAGJ,CAAW,IAAMA,CAAU,CAClD,CAEA,OAAOC,CACT,CACF,CACF,CACF,CACF,ED5HO,SAASI,IAAsB,CACpC,IAAMC,EAAWC,GAAY,EAEvB,CAAE,iBAAAC,EAAkB,mBAAAC,CAAmB,EAAIC,GAAqB,EAEhEC,EAAgCH,EAAiB,EACjDI,EAAcC,EAAY,EAAE,YAAY,EACxC,CAAE,UAAAC,CAAU,EAAID,EAAY,EAMlC,OACEE,GAAA,cAACC,GAAA,CACC,KAAML,EACN,mBAAqBM,GACnBC,GAAmBD,EAAYL,CAAW,GAAK,GAEjD,cAAgBO,GAAUL,EAAUK,CAAK,GAAG,OAAS,GACrD,YAXgBC,EAACC,GAAyC,CAC5Df,EAAS,GAAGgB,EAAiB,KAAK,IAAID,CAAS,EAAE,CACnD,EAFoB,eAYhB,WAAYZ,EACd,CAEJ,CAxBgBW,EAAAf,GAAA,uBEThB,OAAS,cAAAkB,OAAkB,iCAC3B,OAAS,kBAAAC,OAAsB,gBAC/B,OAAOC,OAAW,QAMlB,IAAMC,GAA6BC,EAAA,IAAM,CACvC,GAAM,CAAE,QAAAC,CAAQ,EAAIC,GAAW,EAG/B,OAF4BC,GAAgBF,CAAO,EAAE,IAAI,CAAC,CAAE,KAAAG,CAAK,IAAMA,CAAI,EAEjE,KAAMA,GAASA,EAAK,SAAW,SAAS,EAKhDC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAe,MAAM,OAAO,KAAM,EAAG,CACxC,EANO,IAQX,EAbmC,8BAe5BC,GAAQT,GCzBf,OAAS,iBAAAU,OAAqB,wCAC9B,OAAS,cAAAC,OAAkB,gBAC3B,OAAOC,OAAW,QAMX,SAASC,IAAqB,CACnC,GAAM,CAAE,iBAAAC,CAAiB,EAAIC,GAAqB,EAE5CC,EAAoBF,EAAiB,EAErCG,EAAqBD,EAAkB,OAEvCE,EAAuB,CAAC,CAACF,EAAkB,KAC9CG,GACCA,EAAiB,MAAM,kBAAoBC,GAAc,OAC7D,EAEA,OAAOH,EACLI,GAAA,cAACC,GAAA,CAA4B,QAASJ,GACpCG,GAAA,cAACE,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAS,MAAM,eAC5CN,CACH,CACF,EACE,IACN,CAnBgBO,EAAAX,GAAA,sBCRhB,OAAS,yBAAAY,OAA6B,gBACtC,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QAI3C,IAAMC,GAAmB,IACnBC,GAAmB,GACnBC,GAAiB,IAEvB,SAASC,GAAc,CAAE,QAAAC,CAAQ,EAA0C,CACzE,GAAM,CAACC,EAAaC,CAAc,EAAIC,GAAS,CAAC,EAC1C,CAACC,EAAaC,CAAc,EAAIF,GAAS,EAAK,EAE9CG,EAAyBC,EAACC,GAAsB,CAChD,SAAS,QAAUA,GAErBC,EAAaD,CAAQ,CAEzB,EAL+B,0BAO/BE,GAAU,IAAM,CACd,IAAIF,EACJ,OAAIR,EACFQ,EAAW,OAAO,YAAY,IAAM,CAClCN,EAAgBS,GAAaA,EAAW,CAAC,EAErCV,IAAgBJ,IAClBe,EAAmB,CAEvB,EAAGhB,EAAgB,EAEnBa,EAAaD,CAAQ,EAGvB,SAAS,iBAAiB,mBAAoB,IAC5CF,EAAuBE,CAAQ,CACjC,EAEO,IAAM,CACX,SAAS,oBAAoB,mBAAoB,IAC/CF,EAAuBE,CAAQ,CACjC,EACIA,GACF,cAAcA,CAAQ,CAE1B,CACF,EAAG,CAACP,EAAaD,CAAO,CAAC,EAEzB,IAAMS,EAAeF,EAACC,GAAsB,CACtCA,GACF,cAAcA,CAAQ,EAExBN,EAAe,CAAC,CAClB,EALqB,gBAOfU,EAAqBL,EAAA,IAAM,CAC/BP,IAAU,EACVE,EAAe,CAAC,EAChBG,EAAe,EAAI,CACrB,EAJ2B,sBAM3B,OACEQ,GAAA,cAACC,GAAA,CACC,QAAQ,QACR,KAAK,QACL,MAAO,CAAE,WAAY,EAAG,cAAe,CAAE,EACzC,QAASF,EACT,SAAU,CAACZ,GACXa,GAAA,cAACE,GAAA,CACC,gBAAiB,IAAMV,EAAe,EAAK,EAC3C,YAAaD,GACbS,GAAA,cAACG,GAAA,CACC,KAAM,GACN,MAAQhB,EAAmB,QAAT,OAClB,SAAWC,EAAcJ,GAAoBC,GAC/C,CACF,CACF,CAEJ,CAtESS,EAAAR,GAAA,iBLaF,SAASkB,GAAcC,EAA+B,CAC3D,GAAM,CACJ,eAAAC,EACA,eAAAC,EACA,gBAAAC,EACA,OAAAC,EAAS,CAAC,EACV,UAAAC,CACF,EAAIL,EAEE,CACJ,OAAQ,CAAE,SAAAM,CAAS,CACrB,EAAIC,EAAY,EAEVC,EACJC,GAAgB,eAAgBH,CAAQ,GACxCF,EAAO,SAAS,eAAe,EAEjC,OACEM,GAAA,cAAAA,GAAA,cACG,CAACN,EAAO,SAAS,SAAS,GACzBM,GAAA,cAACC,GAAA,CACC,UAAWN,GAAaO,EAAa,EACrC,KAAK,MACL,QAASC,GAAK,EAAE,SAAS,GACzBH,GAAA,cAACI,GAAA,CAAc,QAASb,EAAgB,CAC1C,EAGD,CAACO,GACAE,GAAA,cAACK,GAAA,CACC,MAAM,MACN,YAAa,IACb,WAAY,GACZ,iBAAkB,CAAE,MAAO,GAAI,KAAM,EAAG,EACxC,UAAWH,EAAa,EACxB,QAASF,GAAA,cAACM,GAAA,IAAoB,GAC9BN,GAAA,cAAC,WACCA,GAAA,cAACC,GAAA,CACC,UAAWC,EAAa,EACxB,KAAK,MACL,QAASC,GAAK,EAAE,eAAe,GAC/BH,GAAA,cAACO,GAAA,CAAa,KAAK,QAAQ,QAAQ,SACjCP,GAAA,cAACQ,GAAA,CAAkB,KAAM,GAAI,MAAM,QAAQ,EAC3CR,GAAA,cAACS,GAAA,IAAmB,CACtB,CACF,CACF,CACF,EAED,CAACf,EAAO,SAAS,UAAU,GAC1BM,GAAA,cAACC,GAAA,CACC,UAAWC,EAAa,EACxB,KAAK,MACL,QAASC,GAAK,EAAE,UAAU,GAC1BH,GAAA,cAACO,GAAA,CAAa,KAAK,QAAQ,QAAQ,QAAQ,QAASd,GAClDO,GAAA,cAACU,GAAA,CAAa,KAAM,GAAI,MAAM,QAAQ,CACxC,CACF,EAED,CAAChB,EAAO,SAAS,SAAS,GACzBM,GAAA,cAACC,GAAA,CACC,UAAWC,EAAa,EACxB,KAAK,MACL,QAASC,GAAK,EAAE,sBAAsB,GACtCH,GAAA,cAACO,GAAA,CAAa,KAAK,QAAQ,QAAQ,QAAQ,QAASf,GAClDQ,GAAA,cAACW,GAAA,CAAgB,KAAM,GAAI,MAAM,QAAQ,EACzCX,GAAA,cAACY,GAAA,IAA2B,CAC9B,CACF,CAEJ,CAEJ,CAxEgBC,EAAAxB,GAAA,iBMpBhB,OAAS,QAAAyB,OAAY,eACrB,OAAS,WAAAC,GAAS,cAAAC,GAAY,eAAAC,OAAmB,gBACjD,OAAOC,OAAW,QCJlB,OAAS,UAAAC,GAAQ,UAAAC,OAAc,gBAExB,IAAMC,GAAgBD,GAAOD,GAAQ,CAC1C,SAAU,CACR,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CACF,CAAC,EDGM,SAASG,GAAaC,EAAkB,CAC7C,GAAM,CAAE,KAAAC,EAAM,QAAAC,CAAQ,EAAIF,EAE1B,OACEG,GAAA,cAACC,EAAA,CACC,KAAMH,EACN,YAAW,GACX,QAASC,EACT,UAAWG,EAAa,GACxBF,GAAA,cAACG,GAAA,CACC,MAAOC,GAAK,EAAE,sBAAsB,EACpC,KAAK,QACL,YAAaA,GAAK,EAAE,+CAA+C,GACnEJ,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACM,GAAA,CACC,QAAQ,WACR,KAAK,QACL,KAAK,UACL,UAAS,GACT,QAAS,IAAM,SAAS,OAAO,GAC/BN,GAAA,cAACO,GAAA,CAAY,KAAM,GAAI,MAAM,UAAU,EACvCP,GAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACxCD,GAAK,EAAE,SAAS,CACnB,CACF,CACF,CAEJ,CA3BgBI,EAAAZ,GAAA,gBETT,SAASa,GAAuCC,EAAU,CAC/D,IAAMC,EAAiBD,EAAE,OAEzB,GAAIC,EAAgB,CAClB,IAAMC,EAAUD,EAAe,UACzBE,EAAYC,EAAa,EAE3BF,EAAU,EACZC,EAAU,UAAU,IAAI,cAAc,EAEtCA,EAAU,UAAU,OAAO,cAAc,CAE7C,CACF,CAbgBE,EAAAN,GAAA,0CCFhB,OAAS,OAAAO,GAAK,UAAAC,OAAc,gBAE5B,IAAMC,GAAgB,QAETC,GAAkBH,GAAI,CACjC,aAAc,WACd,QAAS,OACT,cAAe,SACf,SAAU,SACV,UAAW,gBACb,CAAC,EAEYI,GAAYH,GAAO,MAAO,CACrC,SAAU,WACV,MAAO,QACP,SAAU,QACV,SAAU,QACV,gBAAiB,cACjB,SAAU,CACR,OAAQ,CACN,KAAM,CACJ,OAAQ,OACR,UAAWC,EACb,EACA,MAAO,CACL,OAAQA,EACV,CACF,CACF,CACF,CAAC,EAEYG,GAAUJ,GAAO,MAAO,CACnC,SAAU,WACV,SAAU,SACV,SAAU,EACV,QAAS,OACT,cAAe,SACf,QAAS,EACT,UAAW,MACb,CAAC,EAEYK,GAASL,GAAO,MAAO,CAClC,QAAS,YACT,mBAAoB,CAClB,WAAY,KACd,EACA,kBAAmB,CACjB,QAAS,EACT,WAAY,yBACZ,eAAgB,CACd,QAAS,CACX,EACA,iBAAkB,CAChB,WAAY,QACd,CACF,CACF,CAAC,EvB7BD,SAASM,GAAOC,EAAqC,CACnD,GAAM,CAAE,sBAAAC,EAAuB,yBAAAC,CAAyB,EAAIC,GAAU,EAChE,CAAE,SAAAC,EAAU,OAAAC,EAAQ,OAAAC,EAAQ,OAAAC,EAAS,OAAQ,EAAIP,EACjD,CAAE,YAAAQ,CAAY,EAAIC,EAAY,EAC9B,CAACC,EAAkBC,CAAmB,EAAIC,GAAS,EAAK,EACxDC,EAAmBC,EAAgB,IAAI,iBAAiB,EACxD,CACJ,OAAQ,CAAE,SAAAC,EAAU,MAAAC,CAAM,CAC5B,EAAIP,EAAY,EACV,CAAE,UAAAQ,CAAU,EAAIC,GAAW,EAE3BC,EAAeF,IAAc,OAC7B,CAAE,YAAAG,CAAY,EAAIC,GAASL,GAAS,CAAC,CAAC,EAEtCM,EAAwBC,GAC5B,sBACAR,CACF,EAEM,CACJ,YAAAS,EACA,oBAAAC,EACA,qBAAAC,EACA,wBAAAC,EACA,mBAAAC,CACF,EAAIV,GAAW,EACTW,EAAeC,GAAgB,EAC/B,CAAE,QAAAC,CAAQ,EAAIC,GAAW,EAIzBC,EAH8BC,GAAgBH,CAAO,EAAE,IAC3D,CAAC,CAAE,KAAAI,EAAK,IAAMA,EAChB,EACoC,KAAMA,IAASA,GAAK,SAAW,SAAS,EAEtEC,EAAgBC,EAAA,IACpBT,EAAmBU,GAAW,WAAYL,CAAc,EADpC,iBAGhBM,EAAkBF,EAAA,IAAM,CAC5BhC,EAAO,WAAW,CACpB,EAFwB,mBAIlBmC,EACJ,OAAOnC,EAAO,cAAkB,KAAeA,EAAO,cAElDoC,EAAgBC,GAAuB,IAAI,EAC3CC,EAAeD,GAAuB,IAAI,EAEhD,OAAAE,GAAU,KACSC,GAAsB,GAGvBF,EAAa,SAC3B1C,EAAsB0C,EAAa,OAAO,EAGrC,IAAM,CACXzC,EAAyB,CAC3B,GACC,CAAC,CAAC,EAEL0C,GAAU,KACRH,EAAc,SAAS,iBACrB,SACAK,EACF,EACO,IAAM,CACXL,EAAc,SAAS,oBACrB,SACAK,EACF,CACF,GACC,CAAC,CAAC,EAELF,GAAU,IAAM,CACdjC,EAAoBH,IAAgB,QAAQ,CAC9C,EAAG,CAACA,CAAW,CAAC,EAGduC,GAAA,cAACC,GAAA,CACC,OAAQzC,EACR,GAAI0C,GAAa,YACjB,UAAW,GAAG7B,EAAY,CAAC,IAAI8B,GAAgB,CAAC,GAChD,IAAKP,GACLI,GAAA,cAACI,GAAA,CACC,OACEX,EACEO,GAAA,cAACK,GAAA,CACC,QAAS,IAAM,CACbvB,EAAa,EAEbxB,EAAO,QAAUA,EAAO,OAAO,CACjC,EACF,EACE,KAEN,MAAOA,EAAO,MACd,OACE0C,GAAA,cAAAA,GAAA,cACG1C,EAAO,OACPA,EAAO,UAAY,CAACiB,GACnByB,GAAA,cAACM,GAAA,CACC,UAAWC,EAAa,EACxB,QAASf,EACT,YAAa,CAAC,CAAC1B,GAAkB,OACnC,EAEDR,EAAO,UAAY0C,GAAA,cAACQ,GAAA,CAAa,QAASlD,EAAO,SAAU,CAC9D,EAEJ,EACA0C,GAAA,cAACS,GAAA,CAAQ,IAAKf,GAAgBrC,CAAS,EACvC2C,GAAA,cAACU,GAAA,CACC,KAAM/B,EACN,QAAS,IAAMC,EAAwB,EAAK,EAC5C,UAAWS,EACb,EAEAW,GAAA,cAACW,GAAA,KACCX,GAAA,cAAC,OAAI,UAAU,mBACZtB,GAAuB,CAACD,GACvBuB,GAAA,cAAC,OAAI,UAAU,iBACbA,GAAA,cAACY,GAAA,CAAiB,cAAevB,EAAe,EAChDW,GAAA,cAACa,GAAA,CAAQ,KAAM,GAAI,CACrB,EAEDtD,CACH,EAEAyC,GAAA,cAACa,GAAA,CAAQ,KAAM,GAAI,EAEnBb,GAAA,cAAC,OACC,UAAW,gBACT5B,EAAe,aAAe,cAChC,IACA4B,GAAA,cAACc,GAAA,IAAW,CACd,CACF,EACAd,GAAA,cAACe,GAAA,CACC,KAAMpD,EACN,QAAS,IAAMC,EAAoB,EAAK,EAC1C,CACF,CAEJ,CA9IS0B,EAAAtC,GAAA,UwB3BT,OAAS,UAAAgE,OAAc,gBAEvB,IAAMC,GAAkB,kBAElBC,GAAiBF,GAAO,MAAO,CACnC,QAASC,GACT,UAAW,OACX,SAAU,CACZ,CAAC,ECRD,OAAS,UAAAE,OAAc,gBAEvB,IAAMC,GAAgBD,GAAO,MAAO,CAClC,QAAS,OACT,cAAe,SACf,QAAS,iBACT,SAAU,EAEV,SAAU,CACR,KAAM,CACJ,KAAM,CACJ,SAAU,EACV,SAAU,QACZ,CACF,EACA,QAAS,CACP,KAAM,CACJ,QAAS,CACX,CACF,CACF,CACF,CAAC,ECnBD,OAAS,QAAAE,OAAY,eACrB,OAAS,YAAAC,OAAgB,QAsBlB,SAASC,IAA2C,CACzD,GAAM,CAACC,EAASC,CAAU,EAAIC,GAAS,EAAK,EACtC,CAACC,EAAOC,CAAQ,EAAIF,GAAgC,MAAS,EAC7D,CAAE,UAAAG,CAAU,EAAIC,EAAY,EAC5BC,EAAeD,EAAY,EAAE,aAAa,EAEhD,SAASE,EACPC,EACAC,EACA,CACA,OAAQD,EAAM,CACZ,IAAK,aACH,MAAO,CACL,MAAOE,GAAK,EAAE,iBAAiB,EAC/B,QAASA,GAAK,EACZ,mEACF,CACF,EACF,IAAK,cACH,MAAO,CACL,MAAOA,GAAK,EAAE,sBAAsB,EACpC,QAASA,GAAK,EACZ,2FACF,CACF,EACF,IAAK,YACH,MAAO,CACL,MAAOA,GAAK,EAAE,iBAAiB,EAC/B,QAASA,GAAK,EAAE,CACd,GAAI,6IACJ,OAAQ,CACN,WAAAD,CACF,CACF,CAAC,CACH,CACJ,CACF,CA9BS,OAAAE,EAAAJ,EAAA,uBAoFF,CAAE,iBApDyDI,EAAA,MAAO,CACvE,WAAAF,EACA,aAAAG,CACF,IAAM,CACJZ,EAAW,EAAI,EACf,GAAI,CAKF,GAHoBM,EAAa,KAC9BO,GAAUA,EAAM,SAAS,YAAY,IAAMD,EAAa,YAAY,CACvE,EACiB,CACf,IAAME,EAAeP,EAAoB,YAAY,EACrDJ,EAASW,CAAY,EACrB,MACF,CAEA,IAAMC,EAAM,MAAM,MAChB,GAAGC,GAAU,UAAU,CAAC,sBAAsBA,GAC5C,SACF,CAAC,eAAeP,CAAU,YAAYG,CAAY,EACpD,EACMK,EAAcF,EAAI,QAAQ,IAAI,cAAc,EAC5CG,EACJD,GACAA,EAAY,SAAS,kBAAkB,GACtC,MAAMF,EAAI,KAAK,EAClB,GAAI,CAACG,GAAYA,EAAS,MAAO,CAC/B,IAAMJ,EAAeP,EAAoB,YAAaE,CAAU,EAChEN,EAASW,CAAY,EACrB,MACF,CAQA,GALqBV,EAAU,CAC7B,WAAYc,EAAS,WACrB,QAASA,EAAS,QAClB,OAAQA,EAAS,MACnB,CAAC,EACiB,CAChB,IAAMJ,EAAeP,EAAoB,aAAa,EACtDJ,EAASW,CAAY,EACrB,MACF,CAEA,OAAOI,CACT,OAAShB,EAAY,CACnB,MAAAC,EAAS,MAAS,EACZ,IAAI,MAAMD,EAAM,OAAO,CAC/B,QAAE,CACAF,EAAW,EAAK,CAClB,CACF,EAnDkE,oBAoDvC,QAAAD,EAAS,MAAAG,CAAM,CAC5C,CA3FgBS,EAAAb,GAAA,uBhCGhB,IAAMqB,GAAUC,GAAO,MAAO,CAC5B,QAAS,OACT,eAAgB,gBAChB,cAAe,SACf,KAAM,EACN,iBAAkB,CAChB,QAAS,SACT,gBAAiB,cACjB,CAAC,IAAIC,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,EACA,aAAc,MACd,OAAQ,KACV,CACF,CAAC,EACKC,GAA6B,IAE5B,SAASC,IAAqB,CACnC,IAAMC,EAAWC,GAAY,EACvB,CAACC,CAAY,EAAIC,GAAgB,EACjCC,EAAeC,GAAgB,EAC/B,CAAE,eAAAC,CAAe,EAAIC,EAAY,EACjCC,EAAcD,EAAY,EAAE,YAAY,EAExCE,EAAiBP,EAAa,gBAA2B,GAAK,GAC9DQ,EAAaC,GAAeF,EAAgBD,CAAW,EACvD,CAACI,EAASC,CAAU,EAAIC,GAAS,EAAE,EACnC,CAACC,EAAkBC,CAAmB,EAAIF,GAAkB,EAAK,EACjE,CAACG,EAAOC,CAAQ,EAAIJ,GAAgB,EACpC,CAAE,iBAAAK,EAAkB,QAAAC,EAAS,MAAAC,CAAM,EAAIC,GAAoB,EAC3D,CAACC,EAAcC,CAAe,EAAIV,GAAS,EAAE,EAC7CW,EACJ,CAAC,CAACf,GAAcgB,GAAoBhB,EAAYE,CAAO,EACnDe,EAAmB,CAACjB,GAAc,CAACE,GAAW,CAACa,EAE/CG,EAAiBC,EAAA,SAAY,CACjC,GAAInB,EACF,GAAI,CACF,IAAMoB,EAAM,MAAMX,EAAiB,CACjC,WAAYV,EACZ,aAAcG,CAChB,CAAC,EACDY,EAAgB,EAAE,EACZM,GACJZ,EAASY,CAAG,CAGhB,OAAST,EAAY,CACfA,EAAM,UAAY,oBACpBG,EAAgBO,GAAK,EAAE,eAAe,CAAC,EACvCf,EAAoB,EAAI,EAE5B,CAEJ,EAnBuB,kBAqBjBgB,EAAkBH,EAAA,IAAM,CACtBR,GACJR,EAAW,EAAE,EAEfG,EAAoB,EAAK,CAC3B,EALwB,mBAOlBiB,EAA8BJ,EAAA,SAAY,CACxCN,GACJ,WAAW,SAAY,CACrB,MAAMK,EAAe,CACvB,EAAG9B,EAA0B,EAE/BkC,EAAgB,CAClB,EAPoC,+BASpC,OAAAE,GAAU,IAAM,CACRb,GACJL,EAAoB,EAAI,CAE5B,EAAG,CAACK,CAAK,CAAC,EAERc,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,MAAOL,GAAK,EAAE,kBAAkB,CAClC,GACAI,GAAA,cAACE,GAAA,KACCF,GAAA,cAACxC,GAAA,KACCwC,GAAA,cAAC,WACCA,GAAA,cAACG,GAAA,CACC,QAAS,IACPtC,EAASuC,EAAiB,YAAa,CAAE,QAAS,EAAK,CAAC,EAE1D,QAAS,CAAC,CAAC7B,GAAY,KACvB,MACIA,EACE,CACE,KAAMA,EAAW,YACjB,KAAMA,EAAW,IACnB,EACA,OAEN,MAAOqB,GAAK,EAAE,cAAc,EAC5B,YAAaA,GAAK,EAAE,cAAc,EACpC,EACAI,GAAA,cAACK,GAAA,CAAQ,KAAM,KAAM,EACrBL,GAAA,cAACM,GAAA,CAAW,KAAK,QAAQ,QAAQ,SAC9BV,GAAK,EAAE,eAAe,CACzB,EACAI,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACO,GAAA,CACC,UAAS,GACT,SAAU,CAAChC,EACX,QAAQ,YACR,YAAaqB,GAAK,EAAE,qBAAqB,EACzC,KAAK,QACL,MAAOnB,EACP,OACE,CAAC,CAACA,GACFa,GAAkBU,GAAA,cAACQ,GAAA,CAAS,MAAM,UAAU,KAAM,GAAI,EAExD,SAAWC,GAAM/B,EAAW+B,EAAE,OAAO,KAAK,EAC5C,EACC,CAACnB,GAAkB,CAAC,CAACb,GACpBuB,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,EAClBL,GAAA,cAACU,GAAA,CAAM,KAAK,QAAQ,QAAQ,QAAQ,MAAM,kBAAkB,CAC9D,CAEJ,EAEAV,GAAA,cAACW,GAAA,CACC,SAAUnB,EACV,KAAK,UACL,QAAQ,YACR,QAASP,EACT,KAAK,QACL,QAASQ,GACRG,GAAK,EAAE,QAAQ,CAClB,CACF,EACAI,GAAA,cAACY,EAAA,CACC,KAAMhC,EACN,YAAW,GACX,QAASiB,EACT,UAAWgB,EAAa,GACxBb,GAAA,cAACc,GAAA,CACC,MAAO5B,GAAO,OAASE,EACvB,KAAK,QACL,YACEF,GAAO,SAAWU,GAAK,EAAE,+BAA+B,GAE1DI,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EAEnBL,GAAA,cAACW,GAAA,CACC,QAAQ,YACR,KAAK,QACL,KAAK,UACL,UAAS,GACT,QAASb,GACRV,EACGQ,GAAK,EAAE,OAAO,EACdA,GAAK,EAAE,0BAA0B,CACvC,CACF,CACF,EACCrB,GAAcO,GACbkB,GAAA,cAACe,GAAA,CACC,WAAYxC,EACZ,MAAOO,EACP,cAAe,IAAM,CACfA,IACFX,EAAeW,CAAK,EACpBC,EAAS,MAAS,EAClBd,EAAa,EAEjB,EACA,QAAS,IAAMc,EAAS,MAAS,EACjC,KAAM,CAAC,CAACR,GAAc,CAAC,CAACO,EAC1B,CAEJ,CACF,CAEJ,CApKgBY,EAAA9B,GAAA,sBiCvChB,OAAS,QAAAoD,OAAY,eACrB,OAAS,cAAAC,OAAkB,iCAC3B,OACE,SAAAC,GACA,UAAAC,GACA,OAAAC,GACA,WAAAC,GACA,cAAAC,GACA,UAAAC,GACA,cAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,IAAS,aAAAC,GAAW,mBAAAC,GAAiB,UAAAC,GAAQ,YAAAC,OAAgB,QACpE,OAAS,eAAAC,OAAmB,mBCf5B,OAAS,QAAAC,OAAY,eACrB,OACE,SAAAC,GACA,iBAAAC,GACA,UAAAC,GACA,mBAAAC,GACA,WAAAC,GACA,cAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,GAAS,eAAAC,GAAa,aAAAC,GAAW,WAAAC,GAAS,YAAAC,OAAgB,QACjE,OAAS,eAAAC,OAAmB,mBCb5B,OAAS,QAAAC,OAAY,eAId,SAASC,GAA6BC,EAA6B,CACxE,OAAQA,EAAQ,KAAM,CACpB,OACE,OAAOC,GAAK,EAAE,yBAAyB,EACzC,OACE,OAAOA,GAAK,EACV,2EACA,CACE,gBAAiBD,EAAQ,gBACzB,iBAAkBA,EAAQ,gBAC5B,CACF,EACF,OACE,OAAOC,GAAK,EAAE,kCAAkC,EAClD,OACE,OAAOA,GAAK,EAAE,wCAAwC,EACxD,QACE,MAAO,EACX,CACF,CAnBgBC,EAAAH,GAAA,gCCHhB,OAAS,QAAAI,OAAY,eACrB,OACE,SAAAC,GACA,mBAAAC,GACA,aAAAC,GACA,WAAAC,GACA,cAAAC,GACA,aAAAC,GACA,cAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,IAAS,aAAAC,GAAW,UAAAC,OAAc,QCXzC,OAAOC,IAAS,UAAAC,OAAc,QCH9B,UAAYC,OAAiB,8BAC7B,OAAS,aAAAC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAiC,IAExCC,GAAYH,GAAU,CAC1B,KAAM,CACJ,OAAQ,CACV,EACA,GAAI,CACF,OAAQ,yCACV,CACF,CAAC,EAEKI,GAAUJ,GAAU,CACxB,KAAM,CACJ,OAAQ,yCACV,EACA,GAAI,CACF,OAAQ,CACV,CACF,CAAC,EAEYK,GAAkBJ,GAAmB,QAAM,CACtD,aAAc,MACd,SAAU,SACV,SAAU,CACR,SAAU,CACR,KAAM,CACJ,aAAc,EACd,aAAc,gBACd,aAAc,OAChB,CACF,CACF,CACF,CAAC,EAEYK,GAAUL,GAAmB,WAAS,CACjD,QAAS,KACT,OAAQ,OACR,QAAS,OACT,MAAO,OACP,gBAAiB,cACjB,WAAY,UACZ,OAAQ,SACV,CAAC,EAEYM,GAAqBN,GAAmB,WAAS,CAC5D,SAAU,SACV,SAAU,CACR,KAAM,CACJ,KAAM,CACJ,UAAW,GAAGE,EAAS,IAAID,EAA8B,aAC3D,EACA,MAAO,CACL,UAAW,GAAGE,EAAO,IAAIF,EAA8B,aACzD,CACF,CACF,CACF,CAAC,EAEYM,GAAeP,GAAO,MAAO,CACxC,WAAY,OAAOC,EAA8B,UACjD,QAAS,OACT,WAAY,SACZ,SAAU,CACR,YAAa,CACX,KAAM,CACJ,UAAW,WACb,EACA,GAAI,CACF,UAAW,gBACb,CACF,CACF,CACF,CAAC,EDhEM,SAASO,GAAkBC,EAAqC,CACrE,GAAM,CACJ,KAAAC,EACA,YAAAC,EACA,aAAAC,EACA,SAAAC,EACA,eAAAC,EACA,QAAAC,EACA,cAAAC,CACF,EAAIP,EACEQ,EAAMC,GAA8B,IAAI,EAE9C,OACEC,GAAA,cAACC,GAAA,CACC,IAAKH,EACL,UAAU,mBACV,SAAUN,GAAeD,EACzB,KAAMA,EACN,aAAcE,GACbI,IAAkB,OACjBG,GAAA,cAACE,GAAA,CAAQ,UAAU,sBAAsB,QAASP,GAC/CC,CACH,EAEFI,GAAA,cAACG,GAAA,CAAmB,UAAU,sBAAsB,KAAMZ,GACvDG,CACH,EACCG,IAAkB,UACjBG,GAAA,cAACE,GAAA,CAAQ,UAAU,sBAAsB,QAASP,GAC/CC,CACH,CAEJ,CAEJ,CAlCgBQ,EAAAf,GAAA,qBEXhB,OAAS,aAAAgB,GAAW,UAAAC,GAAQ,aAAAC,OAAiB,gBAEtC,IAAMC,GAAYF,GAAO,MAAO,CACrC,QAAS,SACT,qBAAsB,CACpB,QAAS,OACT,WAAY,QACd,EACA,YAAa,CAAE,WAAY,IAAK,EAChC,yBAA0B,CACxB,gBAAiB,aACnB,EACA,sBAAuB,CACrB,gBAAiB,aACnB,CACF,CAAC,EAEYG,GAAkBH,GAAOC,GAAW,CAC/C,gBAAiB,cACjB,QAAS,KACX,CAAC,EAEYG,GAA0BJ,GAAO,MAAO,CACnD,MAAO,OACP,aAAc,MACd,QAAS,OACT,QAAS,MACT,eAAgB,gBAChB,WAAY,SACZ,QAAS,qBACT,CAAC,IAAID,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,UACjB,wBAAyB,IACzB,uBAAwB,IACxB,kBAAmB,CACjB,aAAc,uBACd,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,aAAc,iBAChB,EACA,gBAAiB,eACjB,QAAS,CACX,CACF,CAAC,EHbM,SAASM,GAAkBC,EAAkB,CAClD,GAAM,CAAE,WAAAC,EAAY,iBAAAC,EAAkB,KAAAC,CAAK,EAAIH,EAEzC,CAAE,kBAAAI,EAAmB,qBAAAC,CAAqB,EAAIC,EAAc,EAC5D,CAAE,OAAAC,CAAO,EAAIC,EAAY,EACzBC,EAAcD,EAAY,EAAE,YAAY,EACxCE,EAAiBC,GACrBV,EAAW,KACXQ,CACF,EACMG,EAAWC,GAAgC,IAAI,EAC/CC,EACJP,GAAQ,4BAA4BN,EAAW,IAAI,EAE/Cc,EAAY,WAAW,UAAU,SAAS,SAAS,EAEnDC,EADmBb,GAAQ,CAAC,CAACC,GAAqBH,GAElC,CAACgB,GAAoBhB,EAAYG,CAAiB,EAClEc,EAAcC,EAAA,IAAM,CACxBd,EAAqB,EAAE,CACzB,EAFoB,eAIde,EAAcD,EAAA,MAAOE,GAAyC,CAElE,GADAA,EAAM,eAAe,EACjB,UAAU,YAAc,OAAW,CACrC,IAAMC,EAAa,MAAM,UAAU,UAAU,SAAS,EACtDjB,EAAqBiB,CAAU,EAC/BV,GAAU,SAAS,MAAM,CAC3B,CACF,EAPoB,eASdW,EAAeJ,EAAA,IACff,EAEAoB,GAAA,cAACC,GAAA,CAAW,QAASP,EAAa,QAAQ,SACxCM,GAAA,cAACE,GAAA,CAAU,KAAM,GAAI,MAAM,OAAO,CACpC,EAEQX,EAQL,KANHS,GAAA,cAACC,GAAA,CAAW,QAASL,EAAa,QAAQ,SACxCI,GAAA,cAACG,GAAA,CAAU,KAAM,GAAI,CACvB,EAXe,gBAkBrB,OAAAC,GAAU,IAAM,CAEZ,CAAC,CAACd,GAAqBV,IAAsB,OAG7CC,EAAqBS,CAAiB,EACtCZ,EAAiB,EAAI,EAEzB,EAAG,CAACY,CAAiB,CAAC,EAGpBU,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CACC,aAAc5B,EACd,YAAW,GACX,KAAMC,EACN,cAAc,MACd,QACEqB,GAAA,cAACO,GAAA,KACCP,GAAA,cAAC,OAAI,UAAU,mBACbA,GAAA,cAACQ,GAAA,CAAW,KAAM,GAAI,MAAM,OAAO,EACnCR,GAAA,cAACS,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCT,GAAA,cAACU,GAAA,CACC,QAAQ,QACR,KAAK,SACL,MAAO/B,EAAO,cAAgB,QAC7BgC,GAAK,EAAE,6BAA6B,CACvC,CACF,EACAX,GAAA,cAACY,GAAA,CAAa,YAAajC,EAAO,KAAO,QACvCqB,GAAA,cAACa,GAAA,CAAgB,KAAM,GAAI,MAAM,YAAY,CAC/C,CACF,EAEF,eAAgB,IAAMnC,EAAiB,CAACC,CAAI,GAC5CqB,GAAA,cAACc,GAAA,CACC,IAAK1B,EACL,MAAO,CACL,QAAS,EACT,aAAcR,EAAoB,MAAQ,KAC5C,EACA,UAAW,CAACA,EACZ,YAAa+B,GAAK,EAAE,iCAAkC,CACpD,eAAAzB,CACF,CAAC,EACD,MAAON,GAAqB,GAC5B,OAAQmB,EAAa,EACrB,SAAWgB,GAAM,CACf,IAAMnC,EAAoBmC,EAAE,OAAO,MACnClC,EAAqBD,CAAiB,CACxC,EACF,CACF,EAECY,GACCQ,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACS,GAAA,CAAQ,KAAM,EAAG,EAClBT,GAAA,cAACgB,GAAA,CACC,QAAQ,QACR,KAAK,QACL,MAAOL,GAAK,EAAE,CACZ,OAAQ,CAAE,YAAa/B,CAAkB,EACzC,GAAI,qEACN,CAAC,EACH,CACF,CAEJ,CAEJ,CAtHgBe,EAAApB,GAAA,qBI/BhB,OAAS,OAAA0C,GAAK,aAAAC,GAAW,cAAAC,GAAY,UAAAC,OAAc,gBAE5C,IAAMC,GAAQD,GAAO,MAAO,CACjC,QAAS,OACT,cAAe,SACf,eAAgB,SAChB,WAAY,QACd,CAAC,EAEYE,GAAgBF,GAAO,MAAO,CACzC,QAAS,OACT,eAAgB,eAChB,WAAY,SACZ,IAAK,MACL,SAAU,OACV,WAAY,KACZ,OAAQ,MACV,CAAC,EAEYG,GAAeH,GAAO,SAAU,CAC3C,aAAc,MACd,QAAS,MACT,OAAQ,IACR,QAAS,OACT,eAAgB,SAChB,QAAS,qBACT,CAAC,IAAIF,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,UACjB,WAAY,SACZ,OAAQ,UACR,MAAO,IACP,SAAU,WAEV,UAAW,CACT,QAAS,uBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,EAEA,kBAAmB,CACjB,QAAS,uBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,iBACX,EACA,gBAAiB,UACjB,QAAS,CACX,EACA,SAAU,CACR,SAAU,CACR,KAAM,CACJ,aAAc,EACd,aAAc,aACd,aAAc,OAChB,CACF,CACF,CACF,CAAC,EAEYM,GAAkBJ,GAAOG,GAAc,CAClD,UAAW,UACX,UAAW,MACb,CAAC,EACYE,GAAiBL,GAAO,MAAO,CAC1C,QAAS,kBACT,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,gBAAiB,cACjB,SAAU,WACV,MAAO,MACT,CAAC,EAEYM,GAAeN,GAAOD,GAAY,CAC7C,SAAU,WACV,KAAM,KACR,CAAC,EAEYQ,GAAmBP,GAAO,MAAO,CAC5C,WAAY,KACd,CAAC,EAEYQ,GAAoBX,GAAI,CACnC,QAAS,OACT,eAAgB,eAChB,WAAY,SACZ,IAAK,MACL,SAAU,OACV,WAAY,KACZ,OAAQ,MACV,CAAC,EAEYY,GAAgBT,GAAO,MAAO,CACzC,QAAS,MACX,CAAC,EAEYU,GAAUV,GAAO,MAAO,CAAE,SAAU,UAAW,MAAO,MAAO,CAAC,EChG3E,OAAS,QAAAW,OAAY,eACrB,OAAS,QAAAC,OAAY,0BACrB,OACE,WAAAC,GACA,oBAAAC,GACA,cAAAC,GACA,eAAAC,OACK,gBACP,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QCT3C,OAAS,SAAAC,GAAO,cAAAC,GAAY,WAAAC,OAAe,gBAC3C,OAAOC,OAAW,QCHlB,OAAS,aAAAC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAgBD,GAAO,MAAO,CACzC,SAAU,UACZ,CAAC,EAEKE,GAAgBH,GAAU,CAC9B,KAAM,CACJ,UAAW,cACb,EACA,OAAQ,CACN,UAAW,gBACb,CACF,CAAC,EAEYI,GAAUH,GAAO,MAAO,CACnC,SAAU,WACV,OAAQ,+BACR,UAAW,qBACX,aAAc,MACd,MAAO,MACP,OAAQ,MACR,UAAW,GAAGE,EAAa,sBAC3B,IAAK,EACL,OAAQ,EACR,MAAO,EACP,KAAM,CACR,CAAC,EAEYE,GAAuBJ,GAAO,MAAO,CAChD,QAAS,CACP,aAAc,KAChB,CACF,CAAC,EC9BD,OAAS,QAAAK,OAAY,eAEd,SAASC,GACdC,EACAC,EAKA,CACA,OAAQD,EAAQ,CACd,IAAK,cACH,MAAO,CACL,KAAM,UACN,MAAOE,GAAK,EAAE,CACZ,GAAI,oCACJ,OAAQ,CAAE,sBAAAD,CAAsB,CAClC,CAAC,EACD,YAAaC,GAAK,EAAE,CAClB,GAAI,sHACJ,OAAQ,CAAE,sBAAAD,CAAsB,CAClC,CAAC,CACH,EACF,IAAK,YACH,MAAO,CACL,KAAM,UACN,MAAOC,GAAK,EAAE,CACZ,GAAI,sCACJ,OAAQ,CAAE,sBAAAD,CAAsB,CAClC,CAAC,EACD,YAAaC,GAAK,EAAE,CAClB,GAAI,sHACJ,OAAQ,CAAE,sBAAAD,CAAsB,CAClC,CAAC,CACH,EACF,IAAK,WACH,MAAO,CACL,KAAM,QACN,MAAOC,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAAE,CAClB,GAAI,uEACJ,OAAQ,CAAE,sBAAAD,CAAsB,CAClC,CAAC,CACH,EACF,QACE,MAAM,IAAI,MACR,gGAAgGD,CAAM,EACxG,CACJ,CACF,CA/CgBG,EAAAJ,GAAA,2BFOT,SAASK,GAAwBC,EAAkB,CACxD,GAAM,CAAE,OAAAC,EAAQ,YAAAC,EAAa,MAAAC,CAAM,EAAIH,EACjCI,EAAOC,GAAwBJ,EAAQC,CAAW,EAClDI,EAAWL,GAAU,cAE3B,OACEM,GAAA,cAACC,GAAA,CACC,KAAMJ,EAAK,KACX,MAAOA,EAAK,MACZ,YAAaA,EAAK,YAClB,KACEE,EACEC,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,KACCH,GAAA,cAACI,GAAA,CAAM,IAAKR,EAAO,KAAM,GAAI,CAC/B,EACAI,GAAA,cAACK,GAAA,IAAQ,CACX,EACE,OAER,CAEJ,CAtBgBC,EAAAd,GAAA,2BDwBhB,IAAMe,GAAiC,EACjCC,GAAsB,IAErB,SAASC,GAAWC,EAAkB,CAC3C,GAAM,CAAE,MAAAC,EAAO,WAAAC,EAAY,aAAAC,EAAc,MAAAC,EAAO,WAAAC,CAAW,EAAIL,EACzDM,EAAcC,GAAW,IAAI,YAAY,EAEzCC,EAAmBC,EAAgB,IAAI,iBAAiB,EACxD,CAAE,YAAAC,CAAY,EAAIC,EAAY,EAC9B,CAACC,EAAyBC,CAA0B,EACxDC,GAA8B,EAC1B,CAACC,EAAyBC,CAA0B,EACxDF,GAAwB,IAAI,EACxB,CAACG,EAA4BC,CAA6B,EAC9DJ,GAAS,EAAK,EACV,CAACK,EAA+BC,CAAgC,EACpEN,GAA0D,IAAI,EAC1D,CAAE,kBAAAO,CAAkB,EAAIC,GAAW,EACnC,CAAE,iBAAAC,CAAiB,EAAIC,GAAmB,EAC1C,CAAE,KAAAC,CAAK,EAAIC,GAAc,CAC7B,MAAAzB,CACF,CAAC,EAEK,CAAC0B,EAAYC,CAAa,EAAId,GAAgCW,CAAI,EAClEI,EAA2BJ,EAAK,OAChCK,EAAwB1B,GAASyB,EAA2BzB,EAAQ,EAEpE2B,EAAuBC,EAAA,MAAOC,GAAmB,CACrDf,EAA8B,EAAK,EACnCE,EAAiC,aAAa,EAC9C,GAAI,CACF,MAAMC,EAAkBY,EAAO,WAAYA,EAAO,KAAK,EACvDb,EAAiC,WAAW,CAC9C,MAAY,CACVA,EAAiC,UAAU,CAC7C,CACF,EAT6B,wBAW7Bc,GAAU,IAAM,CACdN,EAAeD,GAAe,CAC5B,IAAMQ,EAAsBV,EAAK,UAAWQ,GAC1C/B,EAAW+B,EAAO,KAAMhC,CAAK,CAC/B,EAEA,OAAI6B,GAAyBK,EAAsB,EAC1C,CAACV,EAAKU,CAAmB,CAAC,EAAE,OACjCV,EAAK,OAAO,CAACW,EAAGC,IAAUA,IAAUF,CAAmB,CACzD,EAEKR,EAAW,IACfW,GACCb,EAAK,KAAMc,GAAaA,EAAS,OAASD,EAAW,IAAI,GACzDA,CACJ,CACF,CAAC,CACH,EAAG,CAAC,KAAK,UAAUb,CAAI,CAAC,CAAC,EAEzB,IAAMe,EAAiB,SAAS,eAC9BC,GAAa,WACf,EAEA,OAAAP,GAAU,IAAM,CACd,IAAIQ,EAAgD,KACpD,OACEvB,IAAkC,aAClCA,IAAkC,cAElCuB,EAAU,WACR,IAAMtB,EAAiC,IAAI,EAC3CtB,EACF,GAGK,IAAM,CACP4C,GACF,aAAaA,CAAO,CAExB,CACF,EAAG,CAACvB,CAA6B,CAAC,EAGhCwB,GAAA,cAAAA,GAAA,cACGhB,EAAW,MAAM,EAAGvB,CAAK,EAAE,IAAK6B,GAAW,CAC1C,IAAMW,EAAUC,GAAW,CACzB,iBAAArC,EACA,WAAYyB,EAAO,KACnB,MAAAhC,CACF,CAAC,EACK6C,EAAiBF,EACnBG,GAAkBH,EAAS/C,EAA8B,EACzD,GAEEmD,EAAoBC,GAAoBvC,EAAY,EAAGT,CAAK,EAE5DiD,EAA4B,CAAC1C,EAAiB,KACjD2C,IACCA,GAAgB,aAAelB,EAAO,MACtCkB,GAAgB,QAAUlD,CAC9B,EAEMmD,GACJJ,GACAE,GACAjB,EAAO,QAAUoB,GAAY,UAEzBC,GAA6BF,GAC/BG,GAAK,EAAE,CACL,GAAI,oBACJ,OAAQ,CAAE,MAAAtD,CAAM,CAClB,CAAC,EACD6C,EAEEU,EAA0BxB,EAAA,SAAY,CACnBC,EAAO,QAAUoB,GAAY,aAElDxC,EAA2BoB,CAAM,EACtBA,EAAO,YAAc,CAACa,GAEjC,MAAMvB,EAAiBU,EAAO,IAAI,EAElCpB,EAA2BoB,CAAM,GACxBmB,IACTpC,EAA2B,CACzB,WAAYiB,EAAO,KACnB,MAAAhC,EACA,QAAS2C,GAAW,EACtB,CAAC,EACD1B,EAA8B,EAAI,GAElCf,EAAa,CACX,WAAY8B,EAAO,KACnB,MAAAhC,EACA,QAAS2C,GAAW,EACtB,CAAC,CAEL,EAvBgC,2BAyB1Ba,EACJ1C,GAAyB,MACrB2C,GACE3C,EAAwB,MACxBL,EAAY,CACd,EACA,OACN,OACEiC,GAAA,cAACA,GAAM,SAAN,CAAe,IAAK,GAAGV,EAAO,KAAK,IAAIwB,CAAqB,IAC1D,CAAC,CAAC1C,GACD4B,GAAA,cAACgB,EAAA,CACC,KAAM,CAAC,CAAC5C,GAA2BE,EACnC,UAAWuB,EACX,QAAS,IAAM,CACbxB,EAA2B,IAAI,CACjC,GACA2B,GAAA,cAACiB,GAAA,CACC,YAAaH,EACb,UAAW,IAAM,CACV1B,EAAqBhB,CAAuB,CACnD,EACF,CACF,EAEDI,GACCwB,GAAA,cAACgB,EAAA,CACC,KAAM,CAAC,CAACxC,EACR,QAASC,EAAiC,KAAK,KAAM,IAAI,EACzD,UAAWoB,GACXG,GAAA,cAACkB,GAAA,CACC,OAAQ1C,EACR,YAAasC,EACb,MAAOxB,EAAO,MAChB,EACAU,GAAA,cAACmB,GAAA,CAAQ,UAAU,WAAW,KAAM,GAAI,CAC1C,EAEFnB,GAAA,cAACoB,GAAA,CACC,IAAK9B,EAAO,KACZ,YAAaqB,GACb,QAASE,EACT,SAAUtD,EAAW+B,EAAO,KAAMhC,CAAK,EACvC,SAAU,CAACK,EACV,GAAG2B,EACN,CACF,CAEJ,CAAC,EACDU,GAAA,cAACqB,GAAA,CACC,OAAQpD,EACR,QAAS,IAAM,CACbC,EAA2B,MAAS,CACtC,EACA,UAAYoD,GAAW,CACjBjE,EAAM,WAAaiE,EAAO,uBACxBrD,GAAyB,KAC3BZ,EAAM,UAAUY,EAAwB,IAAI,EAE5CsD,GACE,IAAI,MACF,8GACF,CACF,EAGN,EACF,EACCpC,GACCa,GAAA,cAACwB,GAAA,CAAgB,SAAU,GAAO,QAAS9D,GACzCsC,GAAA,cAACyB,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9Bb,GAAK,EAAE,mBAAmB,EAC3BZ,GAAA,cAACyB,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,YAAW,QACjDvC,GAA4BzB,GAAS,EAC/C,CACF,CACF,CAEJ,CAEJ,CArNgB4B,EAAAjC,GAAA,cPEhB,IAAMsE,GAA+B,EAE9B,SAASC,GAAoBC,EAAkB,CAEpD,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,SAAAC,EAAU,eAAAC,EAAgB,QAAAC,CAAQ,EAAIL,EACvDM,EAAWC,GAAY,EACvBC,EAAcC,EAAY,EAAE,YAAY,EACxC,CACJ,cAAAC,EACA,mBAAoBC,EACpB,sBAAuBC,EACvB,wBAAyBC,EACzB,kBAAAC,EACA,qBAAAC,CACF,EAAIC,EAAc,EACZ,CAAE,iBAAAC,EAAkB,cAAAC,CAAc,EAAIC,EAAgB,EACtD,CAAE,OAAAC,CAAO,EAAIX,EAAY,EAEzB,CAACY,EAAmBC,CAAoB,EAAIC,GAAS,EAAE,EACvD,CAACC,EAAiBC,CAAkB,EAAIF,GAAmB,CAAC,CAAC,EAC7D,CAACG,EAAOC,CAAQ,EAAIJ,GAAS,EAAE,EAC/B,CAACK,EAAcC,CAAe,EAAIN,GAEtC,IAAI,EAEA,CAACO,EAAyBC,CAAwB,EAAIR,GAC1D,CAAC,CAACT,CACJ,EAEMkB,EAAeC,GACnB,IACEC,GAAgB,CACd,OAAQ,MACR,MAAOxB,CACT,CAAC,EACH,CAACA,CAAa,CAChB,EAEMyB,EAAkBD,GAAgB,CACtC,OAAQ,WACR,MAAOxB,CACT,CAAC,EAEK0B,EAAuB5B,EAAY,KACtC6B,GACCA,EAAW,OACX3B,GAAe,MAAMA,GAAe,MAAM,OAAS,CAAC,EAAE,GAAG,UAC7D,EACM4B,EAAsBC,EAACF,GAC3BF,EAAgB,SAASE,CAAU,EADT,uBAGtBG,GAA8BC,GAClC,IACExB,EAAiB,OAAQyB,GAErBA,EAAgB,UAChBV,EAAa,SAASU,EAAgB,KAAK,CAE9C,EACH,CAACzB,EAAkBe,CAAY,CACjC,EAEM,CAACW,GAAmBC,CAAoB,EAAIrB,GAChDiB,GAA4B,CAC9B,EACM,CAACK,EAAqBC,EAAsB,EAAIvB,GAKpD,CAAC,CAAC,EAEEwB,EAAyBR,EAAA,CAACF,EAAoBW,IAClDF,GAAwBG,GACtBA,EAAU,OAAO,CACf,WAAAZ,EACA,WAAAW,CACF,CAAC,CACH,EAN6B,0BAQzBE,GAAiC1B,EAAgB,OAAS,EAE1D2B,GAAaZ,EAAA,CAACS,EAAoBI,IACtC,CAAC,CAACT,GAAkB,KACjBU,GACCA,EAAiB,aAAeL,GAChCK,EAAiB,QAAUD,GAC3BC,EAAiB,WAChBf,EAAoBc,CAAK,GACvB,CAACd,EAAoBc,CAAK,GAAK,CAACtC,EACvC,EARiB,cAUbwC,GAA0Bf,EAAA,CAC9BgB,EACAC,EACAC,IACG,CACH,IAAIC,GAAsB,GAC1B,OAAOH,EAAQ,IAAKI,IAAW,CAC7B,GAAIA,GAAO,QAAUH,EAAW,CAC9B,IAAII,GAAWD,GAAO,SACtB,MAAI,CAACD,IAAuBD,GAC1BC,GAAsB,GACtBE,GAAW,IACDH,IACVG,GAAW,IAEN,CACL,GAAGD,GACH,SAAAC,EACF,CACF,CACA,OAAOD,EACT,CAAC,CACH,EAtBgC,2BAwB1BE,EAA+CtB,EAACtC,GAAkB,CACtE8B,EAAyB9B,CAAI,EACxBA,EAUEqC,EAAoBF,GAAsB,MAAQ,EAAE,GACvDQ,EAAsBD,GACbW,GACLX,EACAP,GAAsB,MAAQ,GAC9B,EACF,CACD,GAhBHrB,EAAqB,EAAE,EACvB6B,EAAsBD,GACbW,GACLX,EACAP,GAAsB,MAAQ,GAC9B,EACF,CACD,EAYL,EAtBqD,gDAwB/C0B,GAAWvB,EAACoB,GAAmB,CAKnC,GAJItC,GACFC,EAAqB,EAAE,EAER6B,GAAWQ,EAAO,WAAYA,EAAO,KAAK,EAEzD,OAEF,IAAMjB,EAAkBzB,EAAiB,KACtCyB,IACCA,GAAgB,aAAeiB,EAAO,YACtCjB,GAAgB,QAAUiB,EAAO,KACrC,EAEKjB,IAILvC,EAAS,EAEPwD,EAAO,QAAUvB,GAAsB,MACvCN,GACA,CAACQ,EAAoBF,EAAqB,IAAI,IAE9CL,EAAyB,EAAK,EAC9BhB,EAAqB,IAAI,GAE3B6B,EAAsBD,IACpBA,GACG,OAAQU,IAAqBA,GAAiB,QAAUM,EAAO,KAAK,EACpE,OAAO,CAAE,GAAGjB,EAAiB,SAAU,EAAK,CAAC,CAClD,EACF,EAhCiB,YAkCXqB,GAAmBxB,EAAA,IAAM,CAC7B,IAAMyB,EAAsBrB,GAAkB,OAC3CgB,GAAWA,EAAO,QACrB,EACAzC,EAAc8C,CAAmB,EACjCrD,EAAmBqD,CAAmB,EACtCnD,EAAwB,EAAI,EAC5BX,EAAQ,CACV,EARyB,oBAUnB+D,GAAmB1B,EAAA,SAAY,CACnCd,EAAmB,CAAC,CAAC,EACrBE,EAAS,EAAE,EACXE,EAAgB,IAAI,EAEpB,IAAMqC,EAAS,MAAM9D,IAAiB,CACpC,gBAAiBuC,GAAkB,OAAQgB,GAAWA,EAAO,QAAQ,EACrE,kBAAA7C,CACF,CAAC,EACKqD,EAAWD,EAAO,SACpBC,GAAU,SAAS,UACrB1C,EAAmB0C,EAAS,QAAQ,QAAQ,EAE1CA,GAAU,aACZtC,EAAgBsC,EAAS,WAAW,EAElCD,EAAO,OACTvC,EAASyC,GAAqBF,EAAO,KAAK,CAAC,EAGzC,CAACA,EAAO,OAAU,CAACC,GAAU,SAAS,SAAS,OACjDJ,GAAiB,EAEjBtC,EAAmB0C,GAAU,SAAS,UAAY,CAAC,CAAC,CAExD,EAzByB,oBA2BzBE,GAAU,IAAM,CACdzB,EAAsBD,GAAsB,CAC1C,IAAI2B,EAAsC,CAAC,EAG3C,OAAA3B,EAAkB,QAASU,GAAqB,CACnB,CAACpC,EAAiB,KAC1CyB,IACCA,GAAgB,QAAUW,EAAiB,OAC3CX,GAAgB,aAAeW,EAAiB,YAChDX,GAAgB,UAAYW,EAAiB,OACjD,GAEEiB,EAAU,KAAKjB,CAAgB,CAEnC,CAAC,EAODiB,EAAYA,EAAU,OACpBrD,EAAiB,OAAQyB,GAOrB,CANwB,CAAC,CAAC4B,EAAU,KACnCjB,IACCA,GAAiB,QAAUX,EAAgB,KAC/C,GAIEA,EAAgB,UAChBV,EAAa,SAASU,EAAgB,KAAK,CAE9C,CACH,EACO4B,CACT,CAAC,CACH,EAAG,CAACrD,EAAkBe,CAAY,CAAC,EAEnCqC,GAAU,IAAM,CACd,IAAMC,EAAwC,CAAC,EAE3CzB,EAAoB,OAAS,IAC/BA,EAAoB,QAAS0B,GAAmB,CAC9C,IAAMZ,EAAS1C,EAAiB,KAC7B0C,IACCA,GAAO,QAAUY,EAAe,YAChCZ,GAAO,aAAeY,EAAe,UACzC,EACIZ,EACFG,GAASH,CAAM,EAEfW,EAAU,KAAKC,CAAc,CAEjC,CAAC,EACDzB,GAAuBwB,CAAS,EAEpC,EAAG,CAACrD,EAAkB4B,CAAmB,CAAC,EAE1C,IAAM2B,GAAiB,SAAS,eAC9BC,GAAa,WACf,EAEA,OACEC,EAAA,cAACC,EAAA,CACC,KAAM1E,EACN,QAAS,IAAM,CACRW,GAEHN,EADa,MACE,CAAE,QAAS,EAAK,CAAC,EAElCJ,EAAQ,CACV,EACA,YAAa,CAACmB,EACd,UAAWmD,GACV,GAAI,CAACnD,GAAqB,CACzB,OAAQ,CAAE,UAAW,CAAE,OAAQ,MAAO,CAAE,EACxC,OACEqD,EAAA,cAACE,GAAA,KACCF,EAAA,cAACG,GAAA,CACC,QAASxE,EACT,SAAUyE,GACRzE,EACAyB,EACAhB,EACAJ,EACAiC,GACAP,CACF,EACA,QAAS6B,GACT,QAAQ,YACR,KAAK,UACL,UAAS,GACT,KAAK,SACJc,GAAK,EAAE,SAAS,CACnB,CACF,CAEJ,EACC,GAAI1D,GAAqB,CACxB,OAAQ,CAAE,UAAW,CAAE,OAAQ,OAAQ,QAAS,IAAK,CAAE,EACvD,OACEqD,EAAA,cAACM,GAAA,KACCN,EAAA,cAACO,GAAA,CACC,QAAQ,QACR,QAAS3D,EAAqB,KAAK,KAAM,EAAE,GAC3CoD,EAAA,cAACQ,GAAA,CAAgB,KAAM,GAAI,CAC7B,EACAR,EAAA,cAACS,GAAA,CAAW,QAAQ,WAAW,KAAK,SACjCJ,GAAK,EAAE,CACN,GAAI,gCACJ,OAAQ,CACN,eAAgBK,GACd/D,EACAb,CACF,CACF,CACF,CAAC,CACH,CACF,CAEJ,EACA,OAAO,UACPkE,EAAA,cAACC,EAAA,CACC,KAAMzB,GACN,QAASzB,EAAmB,KAAK,KAAM,CAAC,CAAC,EACzC,UAAW+C,IACXE,EAAA,cAACW,GAAA,CACC,MAAON,GAAK,EAAE,8BAA8B,EAC5C,KAAK,QACL,YAAaL,EAAA,cAACY,GAAA,CAAc,SAAU9D,GAAmB,CAAC,EAAG,GAC7DkD,EAAA,cAACG,GAAA,CACC,QAAQ,WACR,KAAK,QACL,KAAK,UACL,UAAS,GACT,QAASd,IACRgB,GAAK,EAAE,gBAAgB,CAC1B,CACF,CACF,EACC1D,GACCqD,EAAA,cAACa,GAAA,KACCb,EAAA,cAAC,OAAI,UAAWc,GAAkB,GAChCd,EAAA,cAACe,GAAA,CACC,MAAOpE,EACP,WAAY8B,GACZ,aAAcW,GACd,WAAY,IAAMxC,EAAqBD,CAAiB,EACxD,UAAY2B,GAAe,CACzBD,EAAuB1B,EAAmB2B,CAAU,CACtD,EACF,CACF,CACF,EAED,CAAC3B,GACAqD,EAAA,cAAAA,EAAA,cACGhD,GACCgD,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACgB,GAAA,CAAM,QAAQ,QAAQ,KAAK,QAAQ,MAAOX,GAAK,EAAErD,CAAK,EAAG,EAC1DgD,EAAA,cAACiB,GAAA,CAAQ,KAAM,GAAI,CACrB,EAED/D,GACC8C,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACgB,GAAA,CACC,QAAQ,QACR,KAAK,UACL,MAAOE,GAA6BhE,CAAY,EAClD,EACA8C,EAAA,cAACiB,GAAA,CAAQ,KAAM,GAAI,CACrB,EAEFjB,EAAA,cAACmB,GAAA,KACE7D,EAAa,IAAI,CAAC8D,EAAgBC,IAAU,CAC3C,IAAM1D,EAAa7B,EAAY,KAC5B6B,IAAeA,GAAW,OAASyD,CACtC,EAEME,GAAM,UAAUD,CAAK,GACrBE,GAAeF,IAAU/D,EAAa,OAAS,EAC/CkE,GACJD,IACA7D,GACAhB,GAAQ,oBAAsB,GAChC,OACEsD,EAAA,cAAC,OAAI,IAAKsB,IACRtB,EAAA,cAACyB,GAAA,KACCzB,EAAA,cAACS,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BJ,GAAK,EAAE,CACN,GAAI,gCACJ,OAAQ,CAAE,eAAgB1C,GAAY,SAAU,CAClD,CAAC,CACH,EACAqC,EAAA,cAACS,GAAA,CACC,QAAQ,QACR,MAAM,cACN,KAAK,UACJJ,GAAK,EAAE,CACN,GAAI,iDACJ,OAAQ,CAAE,eAAgB1C,GAAY,SAAU,CAClD,CAAC,CACH,CACF,EACAqC,EAAA,cAACiB,GAAA,CAAQ,KAAM,GAAI,EACnBjB,EAAA,cAAC0B,GAAA,KACC1B,EAAA,cAACe,GAAA,CACC,MAAOK,EACP,WAAY3C,GACZ,aAAcW,GACd,MAAOhE,GACP,WAAY,IACVwB,EAAqBe,GAAY,MAAQ,EAAE,EAE7C,UAAYW,IAAe,CACzBD,EAAuB+C,EAAgB9C,EAAU,CACnD,EACF,CACF,EACC,CAACiD,IAAgBvB,EAAA,cAACiB,GAAA,CAAQ,KAAM,GAAI,EACpCO,IACCxB,EAAA,cAAC2B,GAAA,CACC,WAAYjE,EACZ,KAAMN,EACN,iBACE+B,EAEJ,CAEJ,CAEJ,CAAC,CACH,CACF,CAEJ,CAEJ,CAhcgBtB,EAAAxC,GAAA,uBWzChB,OAAS,QAAAuG,OAAY,eACrB,OAAS,SAAAC,GAAO,UAAAC,GAAQ,YAAAC,OAAgB,gBACxC,OAAOC,OAAW,QCFlB,OACE,SAAAC,GACA,UAAAC,GACA,WAAAC,GACA,eAAAC,GACA,eAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QCRlB,OAAS,QAAAC,OAAY,eASrB,IAAMC,GAA4B,GAC5BC,GAA2B,GAE1B,SAASC,GACdC,EACAC,EACAC,EACAC,EACM,CACN,OAAIH,GAAO,OAAS,EACX,CACL,MAAO,CACL,KAAM,UACN,KAAMI,GAAc,EAAE,mBACtB,OAAQ,CACN,QAASD,EACT,MAAOE,GAAK,EAAE,OAAO,CACvB,CACF,EACA,YAAa,EACf,EACSJ,EAAyB,OAC3B,CACL,MAAO,CACL,KAAM,UACN,KAAMG,GAAc,EAAE,sBAAsB,MAC5C,OAAQ,CACN,QAAS,IAAMF,EAA0B,EAAI,EAC7C,MAAOG,GAAK,EAAE,OAAO,CACvB,CACF,EACA,YAAaD,GAAc,EAAE,sBAAsB,WACrD,EAEAJ,GAAO,OAAS,GAChBA,EAAM,iBAEC,CACL,MAAO,CACL,KAAM,QACN,KAAMA,EAAM,iBACZ,OAAQ,IACV,EACA,YAAa,EACf,EAEK,CACL,MAAO,KACP,YAAaI,GAAc,EAAE,cAAc,WAC7C,CACF,CA/CgBE,EAAAP,GAAA,YAiDT,IAAKQ,QACVA,IAAA,MAAQV,IAAR,QACAU,IAAA,MAAQT,IAAR,QAFUS,QAAA,IAKAC,QACVA,EAAA,MAAQ,QACRA,EAAA,MAAQ,SAFEA,QAAA,ICpEZ,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAYD,GAAO,MAAO,CACrC,QAAS,OACT,cAAe,SACf,WAAY,QACd,CAAC,EAEYE,GAAmBF,GAAO,MAAO,CAC5C,SAAU,CACR,KAAM,CACJ,MAAO,CAAC,EACR,MAAO,CACL,SAAU,OACZ,CACF,CACF,CACF,CAAC,EAEYG,GAASH,GAAO,MAAO,CAClC,SAAU,CACR,KAAM,CACJ,MAAO,CACL,MAAO,MACT,EACA,MAAO,CAAC,CACV,CACF,CACF,CAAC,EAEYI,GAAaJ,GAAO,MAAO,CACtC,QAAS,OACX,CAAC,EFLM,SAASK,GAASC,EAAkB,CACzC,GAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,KAAAC,EAAO,OAAQ,EAAIH,EACnCI,EAA2BC,EAAY,EAAE,4BAA4B,EACrEC,EAA4BD,EAAY,EAAE,0BAE1CE,EAAWF,EAAY,EAAE,SAAS,EAClCG,EAAOC,GACXP,EACAE,EACA,IAAME,EAA0BC,EAAU,EAAI,EAC9CN,CACF,EAEA,OACES,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAY,KAAMC,GAAgBV,CAAI,EAAG,MAAM,OAAO,EACvDO,GAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,EAClBJ,GAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAMC,GAAiBb,CAAI,GACpDc,GAAc,EAAE,cAAc,KACjC,EACCd,IAAS,SAAWO,GAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,EACtC,CAAC,CAACN,EAAK,aACNE,GAAA,cAACQ,GAAA,CAAiB,KAAMf,GACtBO,GAAA,cAACK,GAAA,CACC,QAAQ,OACR,KAAK,QACL,MAAM,SACN,MAAM,cACLP,EAAK,WACR,CACF,EAEFE,GAAA,cAACI,GAAA,CAAQ,KAAMX,IAAS,QAAU,KAAO,IAAK,EAC7C,CAAC,CAACK,EAAK,OACNE,GAAA,cAACS,GAAA,CAAO,KAAMhB,GACZO,GAAA,cAACU,GAAA,CACC,KAAMZ,EAAK,MAAM,KACjB,MAAOA,EAAK,MAAM,KAClB,WAAY,OACZ,OACEA,EAAK,MAAM,QACTE,GAAA,cAACW,GAAA,CACC,KAAK,SACL,KAAMb,EAAK,MAAM,KACjB,OACEE,GAAA,cAACY,GAAA,KACCZ,GAAA,cAACa,GAAA,CAAY,KAAM,EAAG,CACxB,EAEF,QAASf,EAAK,MAAM,OAAO,SAC1BA,EAAK,MAAM,OAAO,KACrB,EAGJ,QAAQ,QACV,CACF,CAEJ,CAEJ,CA5DgBgB,EAAAzB,GAAA,YGzBhB,OAAS,QAAA0B,OAAY,eACrB,OACE,UAAAC,GACA,WAAAC,GACA,cAAAC,GACA,cAAAC,GACA,eAAAC,OACK,gBACP,OAAOC,OAAW,QCRlB,OAAS,cAAAC,OAAkB,gBAC3B,OAAOC,OAAW,QCHlB,OAAS,aAAAC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAASD,GAAO,MAAO,CAClC,MAAO,MACT,CAAC,EAEYE,GAAOF,GAAO,MAAO,CAChC,QAAS,OACT,cAAe,SACf,WAAY,aACZ,IAAK,KACL,MAAO,MACT,CAAC,EAEYG,GAAOH,GAAO,MAAO,CAChC,QAAS,OACT,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,MAAO,OACP,UAAW,CACT,QAAS,qBACT,CAAC,IAAID,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,SACT,CACF,CAAC,EAEYK,GAASJ,GAAO,MAAO,CAClC,QAAS,KACT,UAAW,aACX,OAAQ,SACV,CAAC,ED1BM,SAASK,GAAqBC,EAAyB,CAC5D,GAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,WAAAC,CAAW,EAAIH,EAErC,OACEI,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAW,KAAK,SAAS,QAAQ,QAAQ,UAAU,UACjDL,CACH,EACAG,GAAA,cAACE,GAAA,CACC,KAAK,QACL,QAAQ,QACR,MAAOH,GAAc,cACpB,GAAGA,EAAa,IAAM,GAAG,GAAGD,CAAK,EACpC,CACF,CAEJ,CAhBgBK,EAAAR,GAAA,wBD6BT,SAASS,GAA0BC,EAAc,CACtD,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,UAAAC,EAAW,QAAAC,EAAS,qBAAAC,CAAqB,EAAIL,EAC9DM,EAAOF,EAAQ,eAAiB,OAAS,QAAU,UAEnDG,EAAoB,CACxB,CACE,MAAOC,GAAK,EAAE,UAAU,EACxB,MAAOC,EACLL,EAAQ,cACR,EACA,CACF,CACF,EACA,CACE,MAAOI,GAAK,EAAE,UAAU,EACxB,MAAOC,EACLL,EAAQ,SACR,EACA,CACF,CACF,EACA,CACE,MAAOI,GAAK,EAAE,WAAW,EACzB,MAAOC,EACLL,EAAQ,eACR,EACA,CACF,CACF,EACA,CACE,MAAOI,GAAK,EAAE,cAAc,EAC5B,MAAOC,EACLL,EAAQ,YACR,EACA,CACF,EACA,WAAY,GAAGE,CAAI,KACrB,CACF,EAEA,OACEI,GAAA,cAACC,EAAA,CACC,OACED,GAAA,cAACE,GAAA,CACC,KAAK,UACL,KAAK,QACL,OAAQF,GAAA,cAACG,GAAA,IAAY,EACrB,UAAS,GACT,SAAUR,EACV,QAASF,GACRW,GAAc,EAAE,mBAAmB,cACtC,EAEF,KAAMb,EACN,QAASC,EACT,UAAWa,EAAa,GACxBL,GAAA,cAACM,GAAA,CACC,KAAMV,EACN,MAAOQ,GAAc,EAAE,mBAAmB,YAC1C,YAAaA,GAAc,EAAE,mBAAmB,YAClD,EAEAJ,GAAA,cAACO,GAAA,KACCP,GAAA,cAACQ,GAAA,CAAQ,KAAK,IAAI,EAClBR,GAAA,cAACS,GAAA,CAAW,KAAK,QAAQ,QAAQ,SAC9BX,GAAK,EAAE,SAAS,CACnB,EACAE,GAAA,cAACO,GAAA,KACEV,EAAkB,IAAI,CAACa,EAAMC,IAErBX,GAAA,cAACY,GAAA,CAAqB,IADjBD,EAC4B,GAAGD,EAAM,CAClD,CACH,CACF,CACF,CAEJ,CA5EgBG,EAAAxB,GAAA,6BG9BhB,OAAS,QAAAyB,OAAY,eAYd,SAASC,GACdC,EACAC,EACkB,CAClB,IAAMC,EAAuB,CAC3B,UAAW,UACX,MAAO,GACP,OAAQ,IACV,EACA,OAAID,GACFC,EAAU,UAAY,QAClBD,EAAM,OAAS,IACjBC,EAAU,MAAQD,EAAM,gBAGtBA,EAAM,OAAS,IACjBC,EAAU,MAAQC,GAAK,EAAE,CACvB,GAAI,kFACJ,OAAQ,CACN,oBAAqBF,EAAM,mBAC7B,CACF,CAAC,EACDC,EAAU,OAAS,mBAGdA,GAELF,GACEA,EAAQ,OAAS,IACEI,GAAoBJ,EAAQ,WAAW,IACvC,SACnBE,EAAU,UAAY,SAExBA,EAAU,OAAS,YACnBA,EAAU,MAAQG,GAAc,EAAE,mBAAmB,OAEnDL,EAAQ,OAAS,IACnBE,EAAU,MAAQG,GAAc,EAAE,kBAAkB,OAElDL,EAAQ,OAAS,IACnBE,EAAU,MAAQC,GAAK,EAAE,CACvB,GAAI,0FACJ,OAAQ,CACN,oBAAqBH,EAAQ,mBAC/B,CACF,CAAC,EACDE,EAAU,OAAS,mBAEjBF,EAAQ,OAAS,IACnBE,EAAU,MAAQC,GAAK,EAAE,iCAAiC,EAC1DD,EAAU,OAAS,mBAEdA,GAEF,IACT,CAvDgBI,EAAAP,GAAA,cCbhB,OAAS,QAAAQ,OAAY,eACrB,OAAS,UAAAC,GAAQ,WAAAC,GAAS,cAAAC,GAAY,cAAAC,OAAkB,gBACxD,OAAOC,OAAW,QAClB,OAAS,eAAAC,OAAmB,mBAgBrB,SAASC,GAAqBC,EAAmB,CACtD,GAAM,CAAE,eAAAC,EAAgB,SAAAC,CAAS,EAAIC,EAAY,EAC3C,CAAE,KAAAC,EAAM,QAAAC,EAAS,UAAAC,EAAW,QAAAC,EAAS,qBAAAC,CAAqB,EAAIR,EAC9DS,EAAWC,GAAY,EACvBC,EAAeV,GAAkBC,EAEvC,OACEU,GAAA,cAACC,EAAA,CACC,OAAO,SACP,KAAMT,EACN,OACEQ,GAAA,cAACE,GAAA,CACC,KAAK,QACL,QAAQ,QACR,QAAS,IAAML,EAAS,MAAQM,EAAiB,QAAQ,GACzDH,GAAA,cAACI,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,eAC7CC,GAAK,EAAE,iBAAiB,CAC3B,CACF,EAEF,UAAWC,EAAa,EACxB,QAASb,GACTO,GAAA,cAACO,GAAA,CACC,KAAK,UACL,MACEZ,EAAQ,OAAS,EACbU,GAAK,EAAE,eAAe,EACtBA,GAAK,EAAE,cAAc,EAE3B,YACEV,EAAQ,OAAS,EACbU,GAAK,EAAE,CACL,GAAI,kFACJ,OAAQ,CAAE,aAAAN,CAAa,CACzB,CAAC,EACDM,GAAK,EAAE,CACL,GAAI,0FACJ,OAAQ,CACN,oBAAqBV,EAAQ,mBAC/B,CACF,CAAC,GAEPK,GAAA,cAACQ,GAAA,CAAQ,KAAM,GAAI,EACnBR,GAAA,cAACQ,GAAA,CAAQ,KAAM,GAAI,EACnBR,GAAA,cAACE,GAAA,CACC,KAAK,QACL,KAAK,UACL,QAAQ,YACR,UAAS,GACT,SAAUN,EACV,QAASF,GACRW,GAAK,EAAE,gBAAgB,CAC1B,CACF,CACF,CAEJ,CAxDgBI,EAAAtB,GAAA,wBCtBhB,OAAS,UAAAuB,GAAQ,cAAAC,GAAY,eAAAC,OAAmB,gBAChD,OAAOC,OAAW,QAcX,SAASC,GAAyBC,EAAc,CACrD,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,UAAAC,EAAW,qBAAAC,CAAqB,EAAIJ,EAC3D,OACEK,GAAA,cAACC,EAAA,CACC,OACED,GAAA,cAACE,GAAA,CACC,KAAK,UACL,KAAK,QACL,OAAQF,GAAA,cAACG,GAAA,IAAY,EACrB,UAAS,GACT,SAAUJ,EACV,QAASD,GACRM,GAAc,EAAE,kBAAkB,cACrC,EAEF,KAAMR,EACN,QAASC,EACT,UAAWQ,EAAa,GACxBL,GAAA,cAACM,GAAA,CACC,KAAK,UACL,MAAOF,GAAc,EAAE,kBAAkB,YACzC,YAAaA,GAAc,EAAE,kBAAkB,YACjD,CACF,CAEJ,CAzBgBG,EAAAb,GAAA,4BTFT,SAASc,GAAuBC,EAAkB,CACvD,GAAM,CACJ,QAAAC,EACA,MAAAC,EACA,oBAAAC,EACA,iBAAAC,EACA,qBAAAC,EACA,aAAAC,EACA,mBAAAC,EACA,oBAAAC,EACA,sBAAAC,EACA,iBAAAC,CACF,EAAIV,EAEEW,EAAuB,CAC3B,qBAAAN,EACA,KAAMD,EACN,QAASI,EACT,UAAWC,CACb,EAEMG,EACJV,GAAO,OAAS,GAChBA,GAAO,OAAS,EAEZW,EAAYC,GAChBb,EACAC,GAAO,OAAS,GACdA,GAAO,OAAS,EACdA,EACA,IACN,EACA,OAAIW,GAAa,CAACV,IAChBU,EAAU,OAAS,MAMnBE,GAAA,cAAAA,GAAA,cACGH,GAAuBG,GAAA,cAACC,GAAA,CAAS,MAAOd,EAAO,MAAOI,EAAc,EAJtD,CAAC,CAACO,GAOfE,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CACC,MAAOL,EAAU,MACjB,KAAMA,EAAU,UAChB,QAAQ,QACP,GAAIA,EAAU,SAAW,aAAe,CACvC,OACEE,GAAA,cAACI,GAAA,CAAO,QAASZ,GACfQ,GAAA,cAACK,GAAA,CAAS,KAAM,GAAI,MAAM,OAAO,CACnC,CAEJ,EACC,GAAIP,EAAU,SAAW,mBAAqB,CAC7C,OACEE,GAAA,cAACM,GAAA,CACC,KAAK,UACL,KAAMR,EAAU,UAChB,QAASH,GACRY,GAAK,EAAE,QAAQ,CAClB,CAEJ,EACF,CACF,EAGDrB,GACCc,GAAA,cAAAA,GAAA,cACGd,EAAQ,OAAS,GAChBc,GAAA,cAACQ,GAAA,CACE,GAAGZ,EACJ,QAASV,EACX,GAGAA,EAAQ,OAAS,GACjBA,EAAQ,OAAS,IACjBc,GAAA,cAACS,GAAA,CAAsB,GAAGb,EAAsB,QAASV,EAAS,EAGnEA,EAAQ,OAAS,GAChBc,GAAA,cAACU,GAAA,CACE,GAAGd,EACJ,QAASV,EACX,CAEJ,CAEJ,CAEJ,CA7FgByB,EAAA3B,GAAA,0BUbhB,OAAO4B,OAAe,eACtB,OAAOC,OAAW,QCClB,OAAS,QAAAC,OAAY,eACrB,OACE,SAAAC,GACA,WAAAC,GACA,qBAAAC,GACA,YAAAC,GACA,kBAAAC,GACA,YAAAC,GACA,eAAAC,GACA,eAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAe,eACtB,OAAOC,GAAS,UAAAC,GAAQ,YAAAC,OAAgB,QCjBxC,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAiBD,GAAO,MAAO,CAC1C,MAAO,OACP,4BAA6B,CAC3B,WAAY,KACd,CACF,CAAC,EACYE,GAAkBF,GAAO,MAAO,CAC3C,cAAe,MACf,SAAU,CACR,MAAO,CACL,KAAM,CACJ,cAAe,CACjB,CACF,CACF,CACF,CAAC,EAEYG,GAAcH,GAAO,MAAO,CACvC,MAAO,OACP,QAAS,MACX,CAAC,ECtBD,UAAYI,OAAiB,8BAC7B,OACE,UAAAC,GACA,OAAAC,GACA,aAAAC,GACA,SAAAC,GACA,UAAAC,GACA,cAAAC,OACK,gBAIA,IAAMC,GAAuC,IAEvCC,GAAiBC,GAAmB,QAAM,CACrD,QAAS,OACT,cAAe,SACf,WAAY,QACZ,UAAW,OACX,UAAW,SACX,MAAO,OACP,aAAc,MACd,SAAU,CACR,SAAU,CACR,KAAM,CAAC,EACP,MAAO,CACL,QAAS,qBACT,CAAC,IAAIC,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,CACF,EACA,SAAU,CACR,KAAM,CACJ,QAAS,qBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,EACA,MAAO,CAAC,CACV,CACF,EAEA,iBAAkB,CAChB,CACE,SAAU,GACV,SAAU,GACV,IAAK,CACH,QAAS,uBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,sBACX,EACA,gBAAiB,SACnB,CACF,CACF,CACF,CAAC,EAEYC,GAAqBC,GAAI,CACpC,QAAS,SACX,CAAC,EACYC,GAAkBJ,GAAOK,GAAQ,CAC5C,gBAAiB,cACjB,OAAQ,0BACR,CAAC,IAAIJ,EAAS,IAAI,EAAG,CACnB,OAAQ,sBACV,EACA,WAAY,6BACZ,UAAW,CACT,gBAAiB,gBACjB,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,gBAAiB,YACnB,EACA,kBAAmB,CACjB,QAAS,qBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,UACP,WAAY,iBACd,CACF,CACF,CAAC,EACYK,GAAmBN,GAAO,MAAO,CAC5C,aAAc,MACd,QAAS,OACT,cAAe,SACf,WAAY,QACZ,eAAgB,gBAChB,MAAO,cACP,UAAW,aACX,SAAU,WACV,SAAU,CACR,SAAU,CACR,KAAM,CAAC,EACP,MAAO,CACL,QAAS,qBACT,CAAC,IAAIC,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,CACF,EACA,MAAO,CAAE,KAAM,CAAE,qBAAsB,IAAK,oBAAqB,GAAI,CAAE,EACvE,SAAU,CACR,KAAM,CACJ,QAAS,qBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,UACjB,UAAW,CACT,qBAAsB,CACpB,WAAY,CACV,gBAAiB,cACjB,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,CACF,EACA,gBAAiB,cACjB,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,CACF,EACA,gBAAiB,cACjB,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,CACF,EACA,OAAQ,SACV,EACA,MAAO,CAAC,CACV,CACF,EAEA,iBAAkB,CAChB,CACE,SAAU,GACV,SAAU,GACV,IAAK,CACH,QAAS,sBACX,CACF,EACA,CACE,SAAU,GACV,SAAU,GACV,IAAK,CACH,QAAS,uBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,sBACX,EACA,gBAAiB,UACjB,UAAW,CACT,gBAAiB,SACnB,CACF,CACF,EACA,CACE,SAAU,GACV,SAAU,GACV,IAAK,CACH,OAAQ,UACR,UAAW,CACT,gBAAiB,cACjB,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,CACF,CACF,CACF,CACF,CACF,CAAC,EAEYM,GAAgBJ,GAAI,CAC/B,MAAO,OACP,QAAS,iBACX,CAAC,EAEYK,GAAsBL,GAAI,CACrC,QAAS,OACT,cAAe,MACf,eAAgB,gBAChB,WAAY,SACZ,cAAe,MACf,SAAU,UACZ,CAAC,EAEYM,GAAYN,GAAI,CAC3B,QAAS,OACT,cAAe,MACf,eAAgB,SAChB,WAAY,SACZ,mBAAoB,CAClB,WAAY,KACd,CACF,CAAC,EACYO,GAAkBP,GAAI,CACjC,QAAS,OACT,WAAY,SACZ,aAAc,CACZ,QAAS,qBACT,CAAC,IAAIF,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,SACT,CACF,CAAC,EAEYU,GAAUX,GAAmB,WAAS,CACjD,QAAS,OACT,MAAO,OACP,eAAgB,gBAChB,WAAY,SACZ,OAAQ,MACR,QAAS,UACT,UAAW,aACX,OAAQ,UACR,OAAQ,OACR,QAAS,OACT,gBAAiB,cACjB,SAAU,CACR,MAAO,CACL,KAAM,CACJ,CAAC,KAAKY,EAAK,EAAE,EAAG,CACd,OAAQ,wBACR,aAAc,MAChB,CACF,EACA,MAAO,CACL,CAAC,KAAKA,EAAK,EAAE,EAAG,CACd,OAAQ,wBACR,aAAc,MAChB,CACF,CACF,EACA,SAAU,CACR,KAAM,CAAC,EACP,MAAO,CACL,QAAS,qBACT,CAAC,IAAIX,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,CACF,EACA,SAAU,CACR,KAAM,CACJ,QAAS,qBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,EACA,MAAO,CAAC,CACV,CACF,EAEA,iBAAkB,CAChB,CACE,SAAU,GACV,SAAU,GACV,IAAK,CACH,QAAS,uBACT,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,QAAS,sBACX,EACA,gBAAiB,SACnB,CACF,CACF,EACA,uBAAwB,CACtB,QAAS,MACX,EACA,MAAO,CACL,uBAAwB,CACtB,QAAS,OACX,CACF,CACF,CAAC,EAEYY,GAAiBb,GAAO,MAAO,CAC1C,MAAO,OACP,OAAQ,OACR,aAAc,OACd,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,OAAQ,0BACR,IAAK,CACH,aAAc,MAChB,EACA,SAAU,CACR,MAAO,CACL,MAAO,CACL,YAAa,WACf,EACA,QAAS,CAAE,YAAa,aAAc,CACxC,CACF,CACF,CAAC,EAEYc,GAAUd,GAAOe,GAAoB,CAChD,MAAO,OACP,WAAY,SACd,CAAC,EAEYC,GAAgBhB,GAAO,MAAO,CACzC,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,QAAS,KACT,WAAY,OAAOF,EAAoC,UACvD,SAAU,CACR,YAAa,CACX,KAAM,CACJ,UAAW,WACb,EACA,GAAI,CACF,UAAW,gBACb,CACF,CACF,CACF,CAAC,EAEYmB,GAAYjB,GAAO,MAAO,CACrC,OAAQ,MACR,WAAY,MACZ,YAAa,MACb,WAAY,uBACd,CAAC,EAEYkB,GAAsBlB,GAAO,MAAO,CAC/C,QAAS,OACT,eAAgB,SAChB,OAAQ,QACR,UAAW,YACX,QAAS,qBACT,CAAC,IAAIC,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,YAAa,SACf,CAAC,EAEYkB,GAAYnB,GAAO,MAAO,CACrC,MAAO,MACP,OAAQ,MACR,eAAgB,SAChB,WAAY,SACZ,QAAS,MACX,CAAC,EAEYoB,GAAkBpB,GAAOqB,GAAY,CAChD,SAAU,SACV,aAAc,WACd,cAAe,EACjB,CAAC,EAEYC,GAAsBtB,GAAO,MAAO,CAC/C,QAAS,OACT,SAAU,MACZ,CAAC,EAEYuB,GAAWvB,GAAO,MAAO,CACpC,MAAO,OACP,OAAQ,OACR,aAAc,OACd,gBAAiB,cACjB,OAAQ,UACR,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,OAAQ,0BACR,SAAU,CACR,MAAO,CACL,MAAO,CACL,YAAa,WACf,EACA,QAAS,CAAE,YAAa,aAAc,CACxC,CACF,CACF,CAAC,EAEYwB,GAAexB,GAAO,MAAO,CACxC,QAAS,MACX,CAAC,EAEYyB,GAAOzB,GAAO,MAAO,CAChC,MAAO,OACP,eAAgB,MAChB,eAAgB,QAChB,eAAgB,WAChB,OAAQ,OACR,CAAC,IAAIC,EAAS,IAAI,EAAG,CACnB,eAAgB,aAClB,CACF,CAAC,ECzYD,OAAS,QAAAyB,OAAY,eACrB,OACE,mBAAAC,GACA,aAAAC,GACA,WAAAC,GACA,cAAAC,GACA,kBAAAC,GACA,aAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,GAAS,YAAAC,OAAgB,QCdhC,OAAS,OAAAC,GAAK,UAAAC,OAAc,gBAErB,IAAMC,GAAaD,GAAO,MAAO,CACtC,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,QAAS,OACT,sBAAuB,CACrB,QAAS,OACX,CACF,CAAC,EAEYE,GAAOF,GAAO,MAAO,CAChC,MAAO,OACP,UAAW,wBACX,OAAQ,OACV,CAAC,EAEYG,GAAiBH,GAAO,MAAO,CAC1C,QAAS,QACT,QAAS,OACT,cAAe,SACf,yBAA0B,CACxB,QAAS,OACT,WAAY,QACd,CACF,CAAC,EAEYI,GAAcJ,GAAO,MAAO,CACvC,QAAS,cACT,UAAW,SACX,SAAU,WACV,gBAAiB,CACf,SAAU,WACV,OAAQ,GACR,IAAK,MACL,MAAO,KACT,CACF,CAAC,EACYK,GAAUN,GAAI,CACzB,QAAS,OACT,cAAe,MACf,WAAY,SACZ,QAAS,KACT,UAAW,CACT,wBAAyB,CACvB,MAAO,YACT,CACF,CACF,CAAC,EDXD,IAAMO,GAAgBC,EAACC,GACbA,EAAM,IAAI,OAAO,EAcrB,KAbFC,EAAA,cAACC,GAAA,KACCD,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,cAC7CH,EAAM,KACT,EACAC,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAAS,IAEvCC,EACCJ,EAAM,IACN,EACA,CACF,CACF,CACF,EAdkB,iBAkBf,SAASK,GAAiBL,EAA8B,CAC7D,GAAM,CAACM,EAAMC,CAAO,EAAIC,GAAkB,EAAK,EACzC,CAACC,EAAcC,CAAe,EAAIF,GAAkB,EAAK,EACzD,CAAE,MAAAG,EAAO,MAAAC,EAAO,IAAAC,EAAK,KAAAC,EAAM,WAAAC,EAAY,aAAAC,CAAa,EAAIhB,EACxDiB,EAAQL,GAAO,OAAS,CAAC,EACzBM,EAAYC,EAAa,EAEzBC,EAAYC,GAAaJ,CAAK,EAEpC,OACEhB,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACqB,GAAA,CACC,WACEN,EACKO,GAAM,CACLA,EAAE,gBAAgB,EAClBhB,EAAQ,CAACD,CAAI,CACf,EACA,OAEN,IAAKO,EACL,WAAYE,EACZ,KAAMD,EACN,MAAOH,EACP,WAAYK,EAAeQ,GAAK,EAAE,gBAAgB,EAAI,OACtD,iBAAkBN,EACpB,EAEAjB,EAAA,cAACwB,EAAA,CACC,UAAWP,EACX,KAAMZ,EACN,OACEL,EAAA,cAACyB,GAAA,KACCzB,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9BqB,GAAK,EAAE,uBAAuB,CACjC,EAEAvB,EAAA,cAAC0B,GAAA,CAAW,QAAS,IAAMpB,EAAQ,EAAK,EAAG,QAAQ,SACjDN,EAAA,cAAC2B,GAAA,CAAU,MAAM,OAAO,KAAM,GAAI,CACpC,CACF,EAEF,QAAS,IAAM,CACbrB,EAAQ,EAAK,CACf,GACAN,EAAA,cAAC4B,GAAA,KACC5B,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BqB,GAAK,EAAE,SAAS,CACnB,EACAvB,EAAA,cAAC6B,GAAA,CAAQ,KAAM,GAAI,EAClB,OAAO,QAAQV,EAAU,OAAO,EAAE,QACjC,CAAC,CAACW,EAAgBC,CAAQ,IACxBA,EAAS,IAAI,CAACnB,EAAKoB,IAAU,CAC3B,IAAMC,EAAM,eAAeD,CAAK,GAC1BE,EAAWC,GAAUvB,CAAG,EAC9B,OACEZ,EAAA,cAACC,GAAA,CAAW,IAAKgC,GACfjC,EAAA,cAACE,GAAA,CACC,QAAQ,QACR,KAAK,SACL,MAAM,cACLkC,GAAYN,EAA8BP,GAAK,CAAC,CACnD,EACAvB,EAAA,cAACqC,GAAA,CAAe,QAASzB,EAAI,OAAQ,UAAWK,GAC9CjB,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9BC,EACCS,EAAI,OACJ,EACA,CACF,EAAG,IACFA,EAAI,MAAM,OAAO,MACjBT,EACC+B,EACA,EACA,CACF,EAAE,GAEJ,CACF,CACF,CAEJ,CAAC,CACL,EAEAlC,EAAA,cAACC,GAAA,CAAW,UAAU,qBACpBD,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9BqB,GAAK,EAAE,mBAAmB,CAC7B,EACAvB,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAAS,IAEvCC,EACCS,EACA,EACA,CACF,CACF,CACF,EACAZ,EAAA,cAACsC,GAAA,IAAK,EACL,OAAO,KAAKnB,EAAU,WAAW,EAAE,QAClCnB,EAAA,cAACuC,GAAA,CACC,cAAc,SACd,eAAgB,IAAM9B,EAAiB+B,GAAS,CAACA,CAAI,EACrD,QACExC,EAAA,cAAC,OAAI,UAAWyC,GAAQ,GACtBzC,EAAA,cAACE,GAAA,CAAW,KAAK,QAAQ,QAAQ,OAAO,MAAM,cAC3CM,EACGe,GAAK,EAAE,uBAAuB,EAC9BA,GAAK,EAAE,uBAAuB,CACpC,EACAvB,EAAA,cAAC6B,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzC7B,EAAA,cAAC0C,GAAA,CAAa,YAAalC,EAAe,KAAO,QAC/CR,EAAA,cAAC2C,GAAA,CAAgB,KAAM,GAAI,MAAM,OAAO,CAC1C,CACF,EAEF,KAAMnC,GACNR,EAAA,cAACE,GAAA,CAAW,KAAK,QAAQ,QAAQ,SAC9BqB,GAAK,EAAE,aAAa,CACvB,EACAvB,EAAA,cAAC6B,GAAA,CAAQ,KAAM,EAAG,EAClB7B,EAAA,cAACE,GAAA,CAAW,KAAK,QAAQ,QAAQ,OAAO,MAAM,cAC3CqB,GAAK,EAAE;AAAA,+DACkC,CAC5C,EACAvB,EAAA,cAAC6B,GAAA,CAAQ,KAAM,GAAI,EAClB,OAAO,QAAQV,EAAU,WAAW,EAAE,IACrC,CAAC,CAACyB,EAAmBC,CAAI,EAAGb,IAAU,CACpC,IAAMc,EAAgBC,GAAkBF,CAAI,EACtCG,EAAQZ,GACZQ,EACArB,GAAK,CACP,EACMU,EAAM,mBAAmBD,CAAK,GACpC,OACEhC,EAAA,cAACH,GAAA,CACC,IAAKoC,EACL,IAAKa,EACL,MAAOE,EACT,CAEJ,CACF,EAEAhD,EAAA,cAACsC,GAAA,IAAK,CACR,CAEJ,CACF,CACF,CAEJ,CAtJgBxC,EAAAM,GAAA,oBEtDhB,OAAS,QAAA6C,OAAY,eACrB,OAAS,eAAAC,OAAmB,gBAC5B,OAAOC,OAAW,QCJlB,OAAS,OAAAC,GAAK,UAAAC,OAAc,gBAErB,IAAMC,GAAYD,GAAO,MAAO,CACrC,SAAU,WACV,QAAS,OACT,cAAe,SACf,MAAO,MACT,CAAC,EAEYE,GAAkBH,GAAI,CACjC,OAAQ,OACR,WAAY,OACZ,SAAU,WACV,WAAY,wBACZ,IAAK,KACP,CAAC,EDEM,SAASI,GAAaC,EAAkB,CAC7C,GAAM,CAAE,KAAAC,EAAM,GAAAC,EAAI,iBAAAC,EAAkB,aAAAC,CAAa,EAAIJ,EAErD,OACEK,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CACC,UAAU,aACV,MAAOC,GAAK,EAAE,YAAY,EAC1B,KAAK,QACL,iBAAkBC,EAAa,EAC/B,MAAO,CACL,MAAOR,EAAK,MAAM,MAClB,SAAUA,EAAK,MAAM,SACrB,UAAWA,EAAK,MAAM,UACtB,aAAcA,EAAK,MAAM,YAC3B,EACA,MAAO,CACL,YAAaA,EAAK,MAAM,YACxB,MAAOA,EAAK,MAAM,KACpB,EACA,MAAO,CAAE,MAAOA,EAAK,MAAM,KAAM,EACnC,EACAI,GAAA,cAAC,OAAI,UAAWK,GAAgB,EAAG,EACnCL,GAAA,cAACE,GAAA,CACC,UAAU,aACV,iBAAkBE,EAAa,EAC/B,MAAOD,GAAK,EAAE,kBAAkB,EAChC,KAAK,SACL,MAAO,CACL,MAAON,EAAG,MAAM,MAChB,SAAUA,EAAG,MAAM,SACnB,UAAWA,EAAG,MAAM,UACpB,aAAcA,EAAG,MAAM,YACzB,EACA,MAAO,CACL,YAAaA,EAAG,MAAM,YACtB,MAAOA,EAAG,MAAM,KAClB,EACA,MAAO,CAAE,MAAOA,EAAG,MAAM,KAAM,EAC/B,iBAAkBC,EAClB,aAAcC,EAChB,CACF,CAEJ,CA5CgBO,EAAAZ,GAAA,gBEfhB,OAAS,QAAAa,OAAY,eACrB,OACE,mBAAAC,GACA,oBAAAC,GACA,WAAAC,GACA,SAAAC,GACA,WAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,MAAW,QCXlB,OAAS,mBAAAC,GAAiB,YAAAC,OAAgB,QAU1C,IAAMC,GAAmB,IACnBC,GAAqB,IACrBC,GAAyB,KACzBC,GAA+B,KAE/BC,GAAkBC,EAAA,IAAM,CAC5B,GAAM,CAACC,EAAUC,CAAW,EAAIC,GAAS,EAAK,EACxC,CAACC,EAAUC,CAAW,EAAIF,GAAS,EAAK,EACxC,CAACG,EAAYC,CAAa,EAAIJ,GAAS,EAAK,EAC5C,CAACK,EAAeC,CAAgB,EAAIN,GAAS,EAAK,EAClD,CAACO,EAAoBC,CAAqB,EAAIR,GAAS,EAAK,EAE5DS,EAAeZ,EAAA,IAAM,CACzBE,EAAY,OAAO,YAAcP,EAAgB,EACjDU,EACE,OAAO,WAAaV,IAClB,OAAO,YAAcC,EACzB,EACAW,EACE,OAAO,WAAaX,IAClB,OAAO,YAAcC,EACzB,EACAY,EACE,OAAO,WAAaZ,IAClB,OAAO,YAAcC,EACzB,EACAa,EAAsB,OAAO,WAAab,EAA4B,CACxE,EAfqB,gBAiBrB,OAAAe,GAAgB,KACdD,EAAa,EACb,OAAO,iBAAiB,SAAUA,CAAY,EACvC,IAAM,OAAO,oBAAoB,SAAUA,CAAY,GAC7D,CAAC,CAAC,EAEE,CAAE,SAAAX,EAAU,SAAAG,EAAU,WAAAE,EAAY,cAAAE,EAAe,mBAAAE,CAAmB,CAC7E,EA/BwB,mBAiCjBI,GAAQf,GDvBf,IAAMgB,GAAY,EACZC,GAAkB,EAElBC,GAAiBC,EAACC,GAAmC,CACzD,GAAM,CAAE,QAAAC,EAAS,IAAAC,EAAK,UAAAC,EAAW,KAAAC,EAAM,MAAAC,EAAO,UAAAC,CAAU,EAAIN,EACtDO,EAAmBD,GAAaE,EAAa,EACnD,OACEC,EAAA,cAACC,GAAA,CACC,UAAWH,EACX,KAAK,SACL,WAAY,EACZ,KAAMH,EACN,QAASH,GACTQ,EAAA,cAACE,GAAA,CAAe,UAAWR,EAAW,MAAOE,GAC3CI,EAAA,cAACG,GAAA,CAAM,IAAKV,EAAK,KAAM,GAAI,CAC7B,CACF,CAEJ,EAfuB,kBAiBhB,SAASW,GAAab,EAA0B,CACrD,GAAM,CAAE,SAAAc,EAAU,SAAAC,EAAU,YAAAC,EAAa,MAAAC,EAAO,SAAAC,EAAU,KAAAC,EAAM,UAAAb,CAAU,EACxEN,EACIO,EAAmBD,GAAaE,EAAa,EAC7CY,EAAgBH,EAAM,OACtBI,EAAcC,GAAqBL,CAAK,EACxC,CAAE,SAAAM,EAAU,SAAAC,CAAS,EAAIC,GAAgB,EAE/C,OACEhB,EAAA,cAACiB,GAAA,CACC,SAAUP,IAAS,YACnB,IAAMQ,GAASb,EAAS,QAAUa,EAClC,SAAUZ,EACV,QAAUa,GAAM,CACdA,EAAE,gBAAgB,EAClBZ,EAAaa,GAAc,CAACA,CAAS,CACvC,GACApB,EAAA,cAAC,OAAI,UAAWqB,GAAU,GACxBrB,EAAA,cAACsB,GAAA,CAAW,QAAQ,OAAO,KAAK,UAC7BC,GAAK,EAAE,MAAM,CAChB,EACAvB,EAAA,cAACwB,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACxChB,EAAM,IAAI,CAACiB,EAAMC,IAAU,CAC1B,IAAMC,EAAM,QAAQD,CAAK,GACnBE,EACJ5B,EAAA,cAAC6B,GAAA,KACC7B,EAAA,cAAC8B,GAAA,CAAiB,KAAM,GAAI,MAAM,QAAQ,CAC5C,EAGF,OAAOf,GAAYD,EACjBd,EAAA,cAACA,EAAM,SAAN,CAAe,IAAK2B,GACnB3B,EAAA,cAACX,GAAA,CACC,QAASoC,EAAK,QAAQ,YACtB,IAAKA,EAAK,QAAQ,MAClB,MAAOA,EAAK,MACZ,UAAW5B,EACb,EACC6B,IAAUf,EAAgB,GAAKX,EAAA,cAAAA,EAAA,cAAG4B,CAAM,CAC3C,EAEA5B,EAAA,cAACA,EAAM,SAAN,CAAe,IAAK2B,GAClBhB,GAAiBxB,IACjBwB,EAAgBxB,IAAauC,EAAQvC,GAAY,EAChDa,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACX,GAAA,CACC,QAASoC,EAAK,QAAQ,YACtB,IAAKA,EAAK,QAAQ,MAClB,MAAOA,EAAK,MACZ,UAAW5B,EACb,EACC6B,IAAUf,EAAgB,GAAKX,EAAA,cAAAA,EAAA,cAAG4B,CAAM,CAC3C,EAEAF,IAAUvC,GAAY,GACpBa,EAAA,cAACC,GAAA,CACC,UAAWH,EACX,KAAK,SACL,MAAM,MACN,WAAY,EACZ,QACEE,EAAA,cAAC,OAAI,UAAWqB,GAAU,GACvBO,EACApB,EAAM,IAAI,CAACiB,EAAMM,IAAM,CACtB,IAAMJ,EAAM,SAASI,CAAC,GACtB,OACEA,GAAKL,GACH1B,EAAA,cAACA,EAAM,SAAN,CAAe,IAAK2B,GACnB3B,EAAA,cAACX,GAAA,CACC,QAASoC,EAAK,QAAQ,YACtB,IAAKA,EAAK,QAAQ,MAClB,MAAOA,EAAK,MACZ,KAAM,GACR,EACCM,IAAMpB,EAAgB,GAAKX,EAAA,cAAAA,EAAA,cAAG4B,CAAM,CACvC,CAGN,CAAC,CACH,GAEF5B,EAAA,cAACgC,GAAA,CACC,MACExB,EAAM,KACJ,CAACiB,EAAMM,IACLA,GAAKL,IACJD,EAAK,QAAU,SAAWA,EAAK,QAAU,UAC9C,GAAG,OAELzB,EAAA,cAACsB,GAAA,CAAW,KAAK,SAAS,QAAQ,QAAO,IACrCX,EAAgBe,CACpB,CACF,CACF,CAGN,CAEJ,CAAC,CACH,EACA1B,EAAA,cAAC,OAAI,UAAWqB,GAAU,GACxBrB,EAAA,cAAC,OAAI,UAAU,uBACbA,EAAA,cAAC,OAAI,UAAWqB,GAAU,GACxBrB,EAAA,cAACsB,GAAA,CAAW,QAAQ,OAAO,KAAK,UAC7BC,GAAK,EAAE,SAAS,CACnB,EACAvB,EAAA,cAACwB,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACxCZ,EAAY,IAAI,CAACqB,EAAYP,IAC5B1B,EAAA,cAACA,EAAM,SAAN,CAAe,IAAKiC,EAAW,aAC7BrB,EAAY,QAAUxB,IACtBwB,EAAY,OAASxB,IACpBsC,EAAQtC,GAAkB,EAC1BY,EAAA,cAACC,GAAA,CACC,UAAWH,EACX,KAAK,SACL,QAASmC,EAAW,YACpB,WAAY,GACZjC,EAAA,cAACX,GAAA,CACC,QAAS,GACT,IAAK4C,EAAW,MAChB,KAAM,GACN,UAAWP,IAAU,EAAI,kBAAoB,GAC/C,CACF,EAEAA,IAAUtC,GAAkB,GAC1BY,EAAA,cAACC,GAAA,CACC,UAAWH,EACX,KAAK,SACL,MAAM,MACN,WAAY,EACZ,QACEE,EAAA,cAAC,OAAI,UAAWqB,GAAU,GACvBT,EAAY,IACX,CAACsB,EAAOH,IACNA,GAAKL,GACH1B,EAAA,cAACX,GAAA,CACC,IAAK6C,EAAM,YACX,QAAS,GACT,IAAKA,EAAM,MACX,KAAM,GACN,UAAWH,EAAIL,EAAQ,kBAAoB,GAC3C,UAAW7B,EACb,CAEN,CACF,GAEFG,EAAA,cAACgC,GAAA,CAAS,UAAW,mBACnBhC,EAAA,cAACsB,GAAA,CAAW,KAAK,SAAS,QAAQ,QAAO,IACrCV,EAAY,OAASc,CACzB,CACF,CACF,CAGN,CACD,EAED1B,EAAA,cAACwB,GAAA,CAAQ,UAAU,aAAa,KAAM,GAAI,CAC5C,CACF,EAEAxB,EAAA,cAAC6B,GAAA,CAAc,YAAapB,EAAW,KAAO,QAC5CT,EAAA,cAACmC,GAAA,CAAgB,KAAM,GAAI,MAAM,QAAQ,CAC3C,CACF,CACF,CAEJ,CAzKgB7C,EAAAc,GAAA,gBP4BT,SAASgC,GAAMC,EAAmB,CACvC,GAAM,CACJ,MAAAC,EACA,MAAAC,EACA,OAAAC,EACA,MAAAC,EACA,QAAAC,EACA,KAAAC,EACA,SAAAC,EAAW,GACX,UAAAC,EAAY,GACZ,aAAAC,EAAe,GACf,iBAAAC,EACA,iBAAAC,EAAmB,GACnB,UAAWC,CACb,EAAIZ,EACEa,EAAcC,EAAY,EAAE,YAAY,EACxC,CAAE,UAAAC,CAAU,EAAID,EAAY,EAC5BE,EAAWF,EAAY,EAAE,SAAS,EAClC,CAAE,eAAAG,EAAgB,SAAAC,CAAS,EAAIJ,EAAY,EAC3CK,EAAeF,GAAkBC,EACjC,CAACE,EAAUC,CAAW,EAAIC,GAAStB,EAAM,QAAQ,EACjDuB,EAAWC,GAAiC,IAAI,EAChDC,EAAeC,EACnBxB,EAAM,MACN,EACA,CACF,EACMyB,EAAgBD,EACpBvB,EAAO,MACP,EACA,CACF,EACMyB,EAAwBzB,EAAO,SACjCuB,EACEvB,EAAO,SACP,EACA,CACF,EACA,GACE0B,EAAcC,GAAe5B,EAAM,SAAUC,EAAO,UAAY,IAAI,EACpE4B,EAAmBL,EACvBG,EACA,EACA,CACF,EACMG,EAA0BC,GAAoBJ,GAAe,CAAC,EAE9DK,EAAgBC,EAAA,CACpBC,GACAC,KAEOD,GAAM,IAAI,CAACE,EAAMC,KAAU,CAChC,IAAIC,GACEC,GACJrC,GAAO,OAAS,GAChBA,EAAM,KAAK,YAAckC,EAAK,UAE1BI,GACJtC,GAAO,OAAS,GAChBA,EAAM,sBAAsB,IAAImC,EAAK,EAEjCI,EACJtC,GAAS,OAAS,GAClBA,EAAQ,sBAAsB,IAAIkC,EAAK,EAEnCK,EAAeH,IAAuBC,GACtCG,EAAiBF,EAEnBC,EACFJ,GAAY,QACHK,IACTL,GAAY,WAGd,IAAIM,GAAaF,EACbG,GAAK,EAAE,gBAAgB,EACvBA,GAAK,EAAE,kBAAkB,EAE7B,OAAIN,KACFK,GAAaC,GAAK,EAAE,oBAAoB,GAGnC,CACL,QAAS,CACP,YAAaC,GAAsBV,EAAK,UAAWtB,CAAQ,GAAK,GAChE,MAAOsB,EAAK,WACd,EACA,KAAM,CACJ,MAAO,CAAE,YAAaA,EAAK,KAAK,OAAQ,MAAOA,EAAK,KAAK,IAAK,EAC9D,MAAO,CACL,YACEW,GAA0BX,EAAK,KAAK,WAAYzB,CAAW,GAC3D,GACF,MAAOyB,EAAK,KAAK,cACnB,EACA,MAAO,CACL,MACEC,KAAU,GAAK,CAACF,GACZX,EACExB,EAAM,MACN,EACA,CACF,EACAwB,EACEY,EAAK,WACL,EACA,CACF,EACN,SAAUZ,GACPY,EAAK,KAAK,UAAY,GAAK,WAAWA,EAAK,UAAU,EACtD,EACA,CACF,EACA,UAAWC,KAAU,EAAIrC,EAAM,MAAQoC,EAAK,WAC5C,aAAc,IAAIY,GAAUZ,EAAK,KAAK,UAAY,CAAC,EAChD,aAAaA,EAAK,UAAU,EAC5B,SAAS,CACd,CACF,EACA,GAAI,CACF,MAAO,CAAE,YAAaA,EAAK,GAAG,OAAQ,MAAOA,EAAK,GAAG,IAAK,EAC1D,MAAO,CACL,YACEW,GAA0BX,EAAK,GAAG,WAAYzB,CAAW,GAAK,GAChE,MAAOyB,EAAK,GAAG,cACjB,EACA,MAAO,CACL,MAAOZ,EACLY,EAAK,SACL,EACA,CACF,EACA,SAAUZ,GACPY,EAAK,GAAG,UAAY,GAAK,WAAWA,EAAK,QAAQ,EAClD,EACA,CACF,EACA,UAAWA,EAAK,SAChB,aAAc,IAAIY,GAAUZ,EAAK,GAAG,UAAY,CAAC,EAC9C,aAAaA,EAAK,QAAQ,EAC1B,SAAS,CACd,CACF,EACA,MAAOE,GACP,OACEI,GAAgBC,EACdM,EAAA,cAACC,GAAA,CAAgB,MAAOzC,GACtBwC,EAAA,cAACE,GAAA,CACC,QAAQ,QACR,KAAMT,EAAe,QAAU,UAC/B,MAAOE,GACP,OACEK,EAAA,cAACG,GAAA,KACEb,IACCU,EAAA,cAAC,WACCA,EAAA,cAACI,GAAA,CACC,KAAK,SACL,QAAQ,OACR,MAAM,cACLnD,EAAM,oBACT,EACA+C,EAAA,cAACK,GAAA,CAAQ,UAAU,WAAW,KAAM,EAAG,EACvCL,EAAA,cAACI,GAAA,CACC,KAAK,SACL,QAAQ,OACR,MAAM,cACLR,GAAK,EAAE,CACN,GAAI,2BACJ,OAAQ,CACN,OAAQrB,EACNY,EAAK,WACL,EACA,CACF,EACA,OAAQA,GAAM,KAAK,MACrB,CACF,CAAC,CACH,CACF,GAEAI,IAAoBC,IACpB,CAACF,IACCU,EAAA,cAAC,WACCA,EAAA,cAACI,GAAA,CACC,KAAK,SACL,QAAQ,OACR,MAAM,cACLR,GAAK,EAAE,CACN,GAAI,mDACJ,OAAQ,CACN,GAAI3C,GAAO,OACT,GAAwC,CACxC,oBACEA,EAAM,sBAAsB,IAAImC,EAAK,CACzC,EACA,GAAIlC,GAAS,OACX,GAA0C,CAC1C,oBACEA,EAAQ,sBAAsB,IAAIkC,EAAK,CAC3C,CACF,CACF,CAAC,CACH,EACAY,EAAA,cAACK,GAAA,CAAQ,UAAU,WAAW,KAAM,EAAG,EACvCL,EAAA,cAACI,GAAA,CACC,KAAK,SACL,QAAQ,OACR,MAAM,cACLR,GAAK,EAAE,CACN,GAAI,wBACJ,OAAQ,CACN,aAAA5B,CACF,CACF,CAAC,CACH,CACF,CAEN,EAEJ,CACF,EACE,OACN,KAAMsC,GAAuBnB,EAAK,sBAAsB,EACxD,IAAKZ,EACHgC,GAAgBpB,EAAMvB,CAAS,EAC/B,EACA,CACF,EACA,cAAeuB,EAAK,cAChBJ,EAAcI,EAAK,aAAa,EAChC,MACN,CACF,CAAC,EAzLmB,iBA2LhBqB,EAAQzB,EAAcjC,GAAO,OAAS,CAAC,CAAC,EAExC2D,EAAgBD,EAAM,OACtBE,GAAYjD,GAAiBkD,EAAa,EAC1CC,GAAkBC,GAAShE,EAAM,MAAM,MAAQ,CAAC,CAAC,EACjDiE,EAAsB,CAAC,CAACvD,EACxBwD,EAAYT,GAAuBU,GAAiBlE,GAAO,KAAK,CAAC,EACjEmE,GAAWC,GAAiBpE,GAAO,OAAS,CAAC,EAAGc,CAAS,EACzDuD,EAAM5C,EACV0C,GACA,EACA,CACF,EAEMG,GAAaH,GAAS,IAAI,IAAIlB,GAAUsB,EAAW,CAAC,EAE1D,OAAO7D,EACLwC,EAAA,cAACsB,GAAA,CACC,SAAUlE,EACV,IAAK+D,EACL,KAAMJ,EACN,iBAAkBQ,GAAY,EAC9B,MAAOf,EACP,KAAMI,GACN,WAAYQ,GACZ,iBAAkBxC,EAClB,aAAcC,EACd,YAAa,CACX,MAAOL,EACP,SAAUC,EACV,UAAWzB,EAAO,MAClB,aAAcA,EAAO,QACvB,EACF,EAEAgD,EAAA,cAACwB,GAAA,CACC,SAAUpE,EACV,SAAUD,IAAS,YACnB,MAAOA,IAAS,SAChB6C,EAAA,cAAC,OAAI,UAAWyB,GAAc,GAC3B,CAACpE,GAAauD,GAAgB,OAC7BZ,EAAA,cAAAA,EAAA,cACEA,EAAA,cAAC0B,GAAA,KACEd,GAAgB,IAAI,CAACe,GAAKvC,KAAU,CACnC,IAAMwC,EAAM,GAAGD,GAAI,KAAK,IAAIvC,EAAK,GACjC,OACEY,EAAA,cAACA,EAAM,SAAN,CAAe,IAAK4B,GACnB5B,EAAA,cAAC6B,GAAA,CAAS,MAAOF,GAAI,MAAO,MAAOA,GAAI,MAAO,EAC9C3B,EAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,CAC3C,CAEJ,CAAC,CACH,EACAL,EAAA,cAAC8B,GAAA,IAAK,EACL,CAAChB,GAAuBd,EAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,CAC7C,EACE,KACJL,EAAA,cAAC,OAAI,GAAG,cAAc,UAAW+B,GAAoB,GACnD/B,EAAA,cAACgC,GAAA,CACC,MAAOlF,EACP,KAAMiE,EACN,IAAKI,EACL,WAAYC,GACZ,aAAc9D,EACd,MAAOmD,EACT,EAECK,GACCd,EAAA,cAACiC,GAAA,CACC,QAAUC,IAAM,CACdA,GAAE,gBAAgB,EAClB3E,EAAiB,CACnB,EACA,KAAK,UACL,KAAK,YACL,QAAQ,UACR,IAAK,CACH,YAAa,MACb,aAAc,MACd,WAAY,KACZ,cAAe,IACjB,GACAyC,EAAA,cAACI,GAAA,CACC,MAAM,YACN,QAAQ,OACR,KAAK,SACL,UAAU,kBACTR,GAAK,EAAE,gBAAgB,CAC1B,CACF,CAEJ,EACCzC,IAAS,SACR6C,EAAA,cAAC,OAAI,UAAWmC,GAAgB,GAC9BnC,EAAA,cAACoC,GAAA,KACCpC,EAAA,cAACqC,GAAA,CAAS,KAAM,GAAI,MAAM,OAAO,CACnC,EACArC,EAAA,cAACsC,GAAA,KACCtC,EAAA,cAACuC,GAAA,CAAgB,KAAK,QAAQ,QAAQ,QACnC,GAAGjE,CAAY,IAAIkC,EAAM,CAAC,EAAE,KAAK,MAAM,WAAW,KACrD,EACAR,EAAA,cAACwC,GAAA,CACC,QAASxF,EAAO,MAChB,UAAW0D,GACX,KAAO1D,EAAO,MAAgB,OAAR,IACtBgD,EAAA,cAACuC,GAAA,CAAgB,KAAK,QAAQ,QAAQ,QAAO,OAE1C,GAAG/D,CAAa,IACfgC,EAAMA,EAAM,OAAS,CAAC,EAAE,GAAG,MAAM,WACnC,EACF,CACF,CACF,EACAR,EAAA,cAACwC,GAAA,CAAe,QAASxF,EAAO,SAAU,UAAW0D,IACnDV,EAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCL,EAAA,cAACI,GAAA,CAAW,MAAM,cAAc,KAAK,SAAS,QAAQ,QACnD,KAAK3B,CAAqB,GAC7B,CACF,CACF,EAEDtB,IAAS,aACR6C,EAAA,cAACyC,GAAA,CACC,iBAAkB/B,GAClB,KAAK,SACL,UAAU,WACV,MAAO,CACL,MAAOlC,EACP,SAAUC,EACV,UAAWzB,EAAO,MAClB,aAAcA,EAAO,QACvB,EACA,MAAO,CACL,YAAawD,EAAMC,EAAgB,CAAC,EAAE,GAAG,MAAM,YAC/C,MAAOD,EAAMC,EAAgB,CAAC,EAAE,GAAG,MAAM,KAC3C,EACA,MAAO,CAAE,MAAOD,EAAMC,EAAgB,CAAC,EAAE,GAAG,MAAM,KAAM,EACxD,iBAAkB7B,EAClB,aAAcC,EAChB,EAED1B,IAAS,gBACR6C,EAAA,cAAAA,EAAA,cACEA,EAAA,cAAC0C,GAAA,CACC,KAAMlC,EAAM,CAAC,EAAE,KACf,GAAIA,EAAMC,EAAgB,CAAC,EAAE,GAC7B,iBAAkB7B,EAClB,aAAcC,EAChB,EACAmB,EAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,CACpB,CAEJ,EACAL,EAAA,cAAC2C,GAAA,CACC,SAAUvF,EACV,SAAUD,IAAS,YACnB,KAAMc,EACN,UAAU,kBACV,aAAcC,GACd8B,EAAA,cAAC4C,GAAA,CACC,KAAMzF,EACN,SAAUiB,EACV,SAAUhB,EACV,YAAac,EACb,UAAWwC,GACX,SAAUzC,EACV,MAAOuC,EACT,EACAR,EAAA,cAAC6C,GAAA,CAAQ,KAAM5E,GACb+B,EAAA,cAAC8C,GAAA,IAAoB,EACrB9C,EAAA,cAAC,OAAI,UAAW+C,GAAmB,GAChCvC,EAAM,IAAI,CAACwC,GAAM5D,KAAU,CAC1B,IAAMwC,EAAM,QAAQxC,EAAK,GACzB,OACEY,EAAA,cAACiD,GAAA,CACC,KAAK,gBACL,IAAKrB,EACL,iBAAkBlB,GAClB,KAAMsC,GACN,aAAc5D,KAAUoB,EAAM,OAAS,EACvC,MAAOwC,GAAK,MACd,CAEJ,CAAC,CACH,CACF,CACF,CACF,CAEJ,CAvagBhE,EAAApC,GAAA,SSvEhB,OAAS,WAAAsG,GAAS,YAAAC,OAAgB,gBAClC,OAAOC,OAAW,QCHlB,OAAS,aAAAC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAYD,GAAO,MAAO,CACrC,QAAS,qBACT,CAAC,IAAID,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,UACjB,uBAAwB,MACxB,wBAAyB,MACzB,QAAS,MACT,SAAU,CACR,QAAS,CACP,KAAM,CACJ,aAAc,KAChB,CACF,EACA,SAAU,CACR,KAAM,CACJ,cAAe,KACjB,EACA,MAAO,CACL,cAAe,KACjB,CACF,CACF,CACF,CAAC,EAEYG,GAASF,GAAO,MAAO,CAClC,WAAY,IACd,CAAC,EAEYG,GAAQH,GAAO,MAAO,CACjC,YAAa,IACf,CAAC,EAEYI,GAAgBJ,GAAO,MAAO,CACzC,WAAY,yBACZ,UAAW,KACX,OAAQ,aACR,UAAW,UACX,SAAU,CACR,cAAe,CACb,KAAM,CACJ,UAAW,QACX,OAAQ,GACV,CACF,CACF,CACF,CAAC,EC/CD,OAAS,cAAAK,GAAY,WAAAC,GAAS,YAAAC,OAAgB,gBAC9C,OAAOC,MAAW,QCHlB,OAAS,OAAAC,GAAK,UAAAC,OAAc,gBAErB,IAAMC,GAAcD,GAAO,MAAO,CACvC,QAAS,MACX,CAAC,EAEYE,GAAeF,GAAO,MAAO,CACxC,QAAS,YACX,CAAC,EAEYG,GAASH,GAAO,MAAO,CAClC,QAAS,iBACT,QAAS,OACT,cAAe,QACjB,CAAC,EAEYI,GAAkBJ,GAAO,MAAO,CAC3C,QAAS,OACT,eAAgB,QAChB,WAAY,QACd,CAAC,EAEYK,GAAeL,GAAO,MAAO,CACxC,QAAS,OACT,eAAgB,gBAChB,WAAY,KACd,CAAC,EAEYM,GAAwBN,GAAO,MAAO,CACjD,OAAQ,MACR,WAAY,OACZ,WAAY,uBACd,CAAC,EAEYO,GAAcP,GAAO,MAAO,CACvC,MAAO,MACP,QAAS,OACT,eAAgB,OAClB,CAAC,EAEYQ,GAAmBR,GAAO,MAAO,CAC5C,QAAS,OACT,cAAe,SACf,WAAY,QACZ,SAAU,EACV,SAAU,OACZ,CAAC,EAEYS,GAAcT,GAAO,MAAO,CAAE,QAAS,eAAgB,CAAC,EAExDU,GAAWX,GAAI,CAC1B,QAAS,OACT,eAAgB,gBAChB,WAAY,QACd,CAAC,EDlCM,SAASY,GAAqBC,EAAkB,CACrD,GAAM,CAAE,KAAAC,EAAM,UAAAC,EAAY,EAAK,EAAIF,EAC7BG,EACJC,EAAA,cAACC,GAAA,KACCD,EAAA,cAACE,GAAA,KACCF,EAAA,cAACG,GAAA,CAAW,QAAO,GAAC,KAAK,SAAS,WAAW,GAAG,WAAW,GAAG,EAC9DH,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCJ,EAAA,cAACK,GAAA,KACCL,EAAA,cAACM,GAAA,CAAS,OAAQ,GAAI,MAAO,GAAI,QAAQ,UAAU,EACnDN,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,EAClBJ,EAAA,cAACM,GAAA,CAAS,OAAQ,GAAI,QAAQ,UAAU,CAC1C,CACF,EACAN,EAAA,cAACM,GAAA,CAAS,OAAQ,GAAI,MAAO,GAAI,QAAQ,UAAU,CACrD,EAEIC,EAAwBV,IAAS,SAAW,CAACC,EAEnD,OACEE,EAAA,cAAC,WACE,CAACF,GACAE,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACQ,GAAA,KACCR,EAAA,cAACM,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,EACnDN,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCJ,EAAA,cAACM,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,EACnDN,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCJ,EAAA,cAACM,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CACrD,EACAN,EAAA,cAACS,GAAA,IAAK,EACL,CAACF,GAAyBP,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,CAC/C,EAEFJ,EAAA,cAAC,OAAI,UAAWU,GAAS,GACvBV,EAAA,cAACQ,GAAA,KACCR,EAAA,cAACM,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,EACnDN,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCJ,EAAA,cAACM,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,EACnDN,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCJ,EAAA,cAACM,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CACrD,EACCC,GACCP,EAAA,cAACM,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CAEvD,EAECT,IAAS,SACRG,EAAA,cAACW,GAAA,KACCX,EAAA,cAACM,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,EAEDT,IAAS,aACRG,EAAA,cAACY,GAAA,KACCZ,EAAA,cAACa,GAAA,KACCb,EAAA,cAACG,GAAA,CAAW,QAAO,GAAC,KAAK,SAAS,WAAW,GAAG,WAAW,GAAG,EAC9DH,EAAA,cAACI,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCJ,EAAA,cAACM,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,EACAN,EAAA,cAACI,GAAA,CAAQ,KAAM,GAAI,EACnBJ,EAAA,cAACM,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,EAEDT,IAAS,gBACRG,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACI,GAAA,CAAQ,KAAM,EAAG,EAClBJ,EAAA,cAACc,GAAA,KACEf,EACDC,EAAA,cAACe,GAAA,IAAsB,EACtBhB,CACH,EACAC,EAAA,cAACI,GAAA,CAAQ,KAAM,GAAI,CACrB,CAEJ,CAEJ,CA3EgBY,EAAArB,GAAA,wBElBhB,OAAS,cAAAsB,GAAY,WAAAC,GAAS,YAAAC,GAAU,YAAAC,OAAgB,gBACxD,OAAOC,OAAW,QCHlB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAcD,GAAO,MAAO,CACvC,QAAS,OACT,WAAY,OACd,CAAC,EAEYE,GAAaF,GAAO,MAAO,CACtC,SAAU,EACV,WAAY,KACZ,cAAe,MACf,QAAS,OACT,WAAY,SACZ,SAAU,CACR,WAAY,CACV,KAAM,CACJ,cAAe,KACjB,CACF,CACF,CACF,CAAC,EAEYG,GAAgBH,GAAO,MAAO,CACzC,QAAS,OACT,WAAY,SACZ,SAAU,CACZ,CAAC,EAEYI,GAAoBJ,GAAO,MAAO,CAC7C,OAAQ,QACR,QAAS,KACT,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CAAC,EAEYK,GAAYL,GAAO,MAAO,CACrC,QAAS,OACT,WAAY,QACd,CAAC,EDzBM,SAASM,GAAaC,EAAkB,CAC7C,GAAM,CAAE,UAAAC,EAAY,EAAK,EAAID,EAC7B,OACEE,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAS,OAAQ,GAAI,MAAO,GAAI,QAAQ,WAAW,EACpDF,GAAA,cAACG,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCH,GAAA,cAACE,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,EACAF,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACK,GAAA,CAAc,cAAe,CAACN,EAAW,EAC1CC,GAAA,cAACM,GAAA,CAAW,WAAYP,GACtBC,GAAA,cAACO,GAAA,KACCP,GAAA,cAACQ,GAAA,CAAW,KAAK,QAAQ,QAAO,GAAC,WAAW,GAAG,WAAW,GAAG,EAC7DR,GAAA,cAACG,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCH,GAAA,cAACE,GAAA,CAAS,OAAQ,GAAI,QAAQ,UAAU,CAC1C,EACAF,GAAA,cAACS,GAAA,KACCT,GAAA,cAACU,GAAA,CAAS,MAAM,OAAO,KAAM,GAAI,CACnC,EACAV,GAAA,cAACO,GAAA,KACCP,GAAA,cAACQ,GAAA,CAAW,KAAK,QAAQ,QAAO,GAAC,WAAW,GAAG,WAAW,GAAG,EAC7DR,GAAA,cAACG,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCH,GAAA,cAACE,GAAA,CAAS,OAAQ,GAAI,QAAQ,UAAU,CAC1C,CACF,CACF,CACF,CAEJ,CA7BgBS,EAAAd,GAAA,gBJLT,SAASe,GAAcC,EAAkB,CAC9C,GAAM,CAAE,KAAAC,EAAM,SAAAC,EAAU,UAAAC,EAAY,EAAM,EAAIH,EAE9C,OACEI,GAAA,cAACC,GAAA,CAAU,SAAUH,EAAU,QAASD,IAAS,SAC/CG,GAAA,cAACE,GAAA,CAAqB,KAAML,EAAM,UAAWE,EAAW,EACxDC,GAAA,cAACG,GAAA,KACCH,GAAA,cAACI,GAAA,CAAS,OAAQ,GAAI,QAAQ,UAAU,CAC1C,EAECN,GACCE,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAQ,KAAM,GAAI,EACnBN,GAAA,cAACO,GAAA,IAAa,EACdP,GAAA,cAACO,GAAA,IAAa,EACdP,GAAA,cAACO,GAAA,CAAa,UAAW,GAAO,CAClC,CAEJ,CAEJ,CApBgBC,EAAAb,GAAA,iBVKT,SAASc,GAAUC,EAAkB,CAC1C,GAAM,CACJ,MAAAC,EACA,KAAAC,EACA,QAAAC,EACA,MAAAC,EACA,QAAAC,EACA,SAAAC,EAAW,GACX,UAAAC,EACA,QAAAC,EACA,aAAAC,EACA,SAAAC,EACA,iBAAAC,EACA,iBAAAC,EAAmB,GACnB,UAAAC,CACF,EAAIb,EACE,CAAE,YAAAc,EAAa,cAAAC,EAAe,QAAAC,CAAQ,EAAIC,EAAc,EAExDC,EAAiBjB,GAAO,aAC1B,IAAIkB,GAAUlB,GAAO,YAAY,EACjC,KACEmB,EAAmBnB,GAAO,aAC5BoB,GACEpB,GAAO,aACPqB,GAAwBrB,CAAK,GAAKe,GAAS,QAC7C,EACA,KAOEO,EAAY,EAJhBnB,IACCA,EAAM,OAAS,GACdA,EAAM,OAAS,KAEYH,GAAS,CAACE,EAEzC,OAAIA,EAEAqB,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAc,UAAWnB,EAAW,KAAML,EAAM,SAAUI,EAAU,CACvE,EAIGiB,EACLC,GAAA,cAACC,GAAA,CAAe,QAAS,IAAMjB,IAAUP,CAAK,GAC5CuB,GAAA,cAACG,GAAA,CACC,MAAO1B,EACP,MAAOG,EACP,UAAWS,EACX,aAAcJ,EACd,QAASJ,EACT,UAAWE,EACX,SAAUG,EACV,KAAMR,EACN,SAAUI,EACV,iBAAkBK,EAClB,iBAAkBC,EAClB,MAAO,CACL,MAAOE,EACP,SAAUC,GAAe,SAAS,GAAK,EACzC,EACA,OAAQ,CACN,MAAOG,GAAc,SAAS,GAAK,GACnC,SAAUE,GAAgB,SAAS,GAAK,EAC1C,EACF,CACF,EACE,IACN,CApEgBQ,EAAA7B,GAAA,agBVhB,OAAS,wBAAA8B,OAA4B,wCACrC,OAAS,aAAAC,OAAiB,QCH1B,OAAS,UAAAC,GAAQ,YAAAC,OAAgB,QAcjC,IAAMC,GAAc,IAEb,SAASC,GAA8B,CAC5C,QAAAC,CACF,EAA8E,CAC5E,GAAM,CAACC,EAASC,CAAU,EAAIC,GAAS,EAAK,EACtCC,EAAkBC,GAA+B,IAAI,EAErDC,EAAcC,EAAA,IAAMH,EAAgB,SAAS,MAAM,EAArC,eAEdI,EAAaD,EAAA,MAAOE,IACxB,MAAM,IAAI,QAASC,GAAY,WAAWA,EAASZ,EAAW,CAAC,EACxD,MAAMa,EAAMF,EAAa,EAAK,GAFpB,cAKbE,EAAsDJ,EAAA,MAC1DE,EACAG,EAAc,KACX,CACHN,EAAY,EACZF,EAAgB,QAAU,IAAI,gBAE9BF,EAAW,EAAI,EACf,GAAI,CACF,IAAMW,EAAM,MAAMb,EAAQS,EAAa,CACrC,OAAQL,EAAgB,QAAQ,MAClC,CAAC,EAED,OAAAA,EAAgB,QAAU,KACnBS,CAET,OAASC,EAAO,CACd,GAAIF,EACF,OAAO,MAAMJ,EAAWC,CAAW,EAErC,MAAMK,CACR,QAAE,CACAZ,EAAW,EAAK,CAClB,CACF,EAxB4D,SA0B5D,MAAO,CAAE,MAAAS,EAAO,QAAAV,EAAS,YAAAK,CAAY,CACvC,CAxCgBC,EAAAR,GAAA,YCXT,SAASgB,IAGd,CACA,GAAM,CAAE,MAAAC,EAAO,QAAAC,EAAS,YAAAC,CAAY,EAAIC,GAGtC,CACA,QAAS,MAAOC,EAAaC,IAC3B,MAAMC,GAAY,EAAE,oBAAoBF,EAAaC,CAAO,CAChE,CAAC,EAED,MAAO,CAAE,MAAAL,EAAO,QAAAC,EAAS,YAAAC,CAAY,CACvC,CAbgBK,EAAAR,GAAA,wBC4BT,SAASS,GAA+BC,EAAyB,CACtE,GAAI,CAACA,EAAS,MACZ,MAAM,IAAI,MAAMC,GAAc,EAAE,cAAc,MAAO,CACnD,MAAO,CACL,OACA,iBAAkBD,EAAS,oBAAoB,CAAC,CAClD,CACF,CAAC,EAEH,IAAME,EAAaC,GAAcH,EAAS,KAAK,EAC/C,GAAIE,EACF,MAAM,IAAI,MAAMA,EAAW,QAAS,CAClC,MAAOA,EAAW,OACpB,CAAC,CAEL,CAfgBE,EAAAL,GAAA,kCAiBT,SAASI,GAAcE,EAAgD,CAE5E,GADmBC,GAAcD,CAAK,EACtB,CACd,GAAM,CAAE,KAAAE,EAAM,eAAAC,EAAgB,qBAAAC,CAAqB,EACjDC,GAAqBL,CAAK,EAC5B,MAAO,CACL,QAAS,qBACT,QAAS,CACP,OACA,KAAAE,EACA,eAAAC,EACA,qBAAAC,CACF,CACF,CACF,CAEA,IAAME,EAAuBC,GAAoBP,CAAK,EAEtD,GAAIM,EAAsB,CACxB,IAAME,EAAsBC,GAAuBT,CAAK,EACxD,MAAO,CACL,QAAS,GACT,QAAS,CACP,OACA,qBAAAM,EACA,oBAAAE,CACF,CACF,CACF,CACA,OAAO,IACT,CA9BgBT,EAAAD,GAAA,iBAgCT,SAASY,GACdC,EACAC,EACAC,EAQqB,CACrB,IAAIC,EAAe,GACfH,IACFG,EAAeC,GAAeJ,EAAeC,CAAY,GAE3D,IAAMI,EAA8B,CAClC,MAAO,KACP,YAAa,KACb,QAAS,IACX,EAEMC,EAAeC,GAAsBN,EAAc,CACvD,UAAWC,EAAO,UAClB,QAASA,EAAO,QAChB,UAAWA,EAAO,UAClB,aAAcA,EAAO,YACvB,CAAC,EAEGI,IACFD,EAAO,MAAQC,GAGbN,GAAiBG,IACfK,GAA0BR,EAAeC,CAAY,EACvDI,EAAO,YAAc,CACnB,OACA,gBAAiBI,EAAeC,GAAqBT,CAAY,CAAC,EAClE,iBAAkBQ,EAChBE,GACED,GAAqBV,CAAa,GAAK,GACvCU,GAAqBT,CAAY,GAAK,EACxC,EACA,KACA,CACF,CACF,EACSW,GAAuBZ,EAAeC,CAAY,EAC3DI,EAAO,YAAc,CACnB,MACF,EACSQ,GAAuBb,EAAeC,CAAY,EAC3DI,EAAO,YAAc,CACnB,MACF,EACSS,GAA4Bd,EAAeC,CAAY,IAChEI,EAAO,YAAc,CACnB,MACF,IAIJ,IAAMU,EAAkBC,GACtBf,EACAC,EAAO,gBACPA,EAAO,KAAK,WACd,EAIA,OAFsBa,EAAgB,SAAW,IAG/CV,EAAO,QAAU,CACf,SAAUU,CACZ,GAGKV,CACT,CA7EgBjB,EAAAW,GAAA,oBA+ET,SAASkB,GAAkBC,EAAoC,CACpE,OAAIA,GAAO,OAAS,eACX,CACL,KAAM,KACN,MAAO,CACL,MACF,EACA,SAAU,IACZ,EAGEA,EAAM,MACD,CACL,KAAM,KACN,MAAOA,EAAM,MACb,SAAU,IACZ,EAGK,CACL,KAAM,KACN,MAAO,CACL,MACF,EACA,SAAU,IACZ,CACF,CA1BgB9B,EAAA6B,GAAA,qBHjJT,SAASE,IAA8B,CAC5C,GAAM,CACJ,UAAAC,EACA,QAAAC,EACA,YAAAC,EACA,iBAAAC,EACA,cAAeC,EACf,kBAAmBC,EACnB,0BAAAC,EACA,YAAAC,CACF,EAAIC,EAAc,EAEZ,CAAE,SAAAC,EAAU,eAAAC,CAAe,EAAIC,EAAY,EAC3CC,EAA2BD,EAAY,EAAE,4BAA4B,EACrEE,EAAcF,EAAY,EAAE,YAAY,EACxCG,EAASH,EAAY,EAAE,OAAO,EAC9B,CAAE,UAAAI,CAAU,EAAIJ,EAAY,EAE5BK,EAAeN,GAAkBD,EAEjC,CAAE,MAAOQ,EAAY,YAAAC,EAAa,QAAAC,CAAQ,EAAIC,GAAqB,EAEzE,OAAAC,GAAU,IAAMH,EAAa,CAAC,CAAC,EA8FxB,CACL,QAAAC,EACA,MA9FkCG,EAAA,MAAOC,GAAW,CACpD,IAAMC,EAAkBD,EAAO,gBACzBE,EACJF,GAAQ,mBAAqBlB,EAE/B,GAAI,CAACL,GAAa,CAACC,GAAW,CAACC,EAC7B,MAAO,CACL,MAAO,KACP,KAAM,KACN,MAAO,KACP,SAAU,IACZ,EAGF,IAAMwB,EAAUF,EAAgB,OAC9B,CAACG,EAA6BC,KAC5BD,EAAIC,EAAK,KAAK,EAAIA,EAAK,QAChBD,GAET,CAAC,CACH,EACME,EAAmC,CACvC,UAAWzB,GAAc,WAAa,GACtC,gBAAiBsB,EACjB,YAAaD,GAAqB,MACpC,EAEA,GAAI,CACF,OAAO,MAAMR,EAAWY,EAAa,EAAI,EAAE,KAAMC,GAAa,CAC5D,GAAM,CAAE,OAAAC,CAAO,EAAID,EAEnBE,GAA+B,CAC7B,kBAAmBD,EAAO,kBAC1B,UAAWA,EAAO,UAClB,MAAOA,EAAO,QAAQ,KACxB,CAAC,EAED,IAAME,EAA8B,CAClC,aAAcF,EAAO,QAAQ,aAC7B,UAAWA,EAAO,UAClB,WAAYA,EAAO,QAAQ,WAC3B,MAAOA,EAAO,QAAQ,OAAS,CAAC,EAChC,iBAAkBA,EAAO,iBACzB,cAAeA,EAAO,aACxB,EACA5B,EAAiB8B,CAAY,EAC7B,IAAMC,EAAoC,CACxC,SAAUlB,EAAa,SAAS,EAChC,uBAAwBJ,CAC1B,EAEMuB,EAAsBC,GAC1BhC,GAAgB,OAChB6B,EACA,CACE,UAAAjC,EACA,QAAAC,EACA,KAAM,CAAE,YAAAY,CAAY,EACpB,UAAAE,EACA,gBAAAS,EACA,aAAAR,CACF,CACF,EACImB,EAAoB,aACtB7B,EAA0B,EAAK,EAEjCC,EAAY,EAEZ,IAAM8B,EAAgB,CAAC,CAACF,EAAoB,QAEtCG,EAAOC,GACXrC,EAAY,SAAS,EACrB6B,EACAS,GAAqBhB,CAAe,EACpCU,EACA,CAAAG,EACA,CAAE,YAAAxB,EAAa,OAAAC,CAAO,CACxB,EAEA,MAAO,CACL,MAAOmB,EACP,KAAAK,EACA,MAAO,KACP,SAAUH,CACZ,CACF,CAAC,CACH,OAASM,EAAY,CAEnB,OAD0BC,GAAkBD,CAAK,CAEnD,CACF,EA1FoC,SA+FlC,YAAAvB,CACF,CACF,CAzHgBI,EAAAvB,GAAA,kBtCgBhB,IAAM4C,GAAUC,GAAO,MAAO,CAC5B,MAAO,OACP,QAAS,OACT,eAAgB,gBAChB,CAAC,KAAKC,EAAU,EAAE,EAAG,CACnB,MAAO,MACP,OAAQ,KACV,CACF,CAAC,EAEKC,GAAmBC,GAAI,CAC3B,SAAU,EACV,aAAc,KAChB,CAAC,EAEKC,GAAaD,GAAI,CACrB,MAAO,MACP,OAAQ,MACR,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CAAC,EAEKE,GAAoBF,GAAI,CAC5B,QAAS,OACT,eAAgB,gBAChB,WAAY,QACd,CAAC,EAEM,SAASG,IAAkB,CAEhC,GAAM,CACJ,cAAAC,EACA,eAAAC,EACA,gBAAAC,EACA,sBAAAC,EACA,kBAAAC,EACA,uBAAAC,CACF,EAAIC,EAAc,EACZC,EAAWC,GAAY,EACvB,CAACC,EAAgBC,CAAiB,EAAIC,GAAiB,EAAE,EAEzDC,EAAoB,CAACT,EACrB,CAACU,EAAaC,CAAc,EAAIH,GAAS,EAAK,EAC9C,CAACI,EAAcC,CAAe,EAAIL,GAAS,EAAK,EAChD,CAAE,YAAAM,CAAY,EAAIC,GAAW,EAC7BC,EAA2BC,EAAY,EAAE,4BAA4B,EACrEC,EAA+BC,GAAOH,CAAwB,EAC9D,CAAE,QAAAI,CAAQ,EAAIC,GAAW,EACzB,CACJ,MAAOC,EACP,QAASC,EACT,YAAAC,CACF,EAAIC,GAAe,EACb,CAACC,EAAmBC,CAAoB,EAC5CnB,GAAiC,CAC/B,KAAM,KACN,MAAO,KACP,SAAU,IACZ,CAAC,EACG,CAACoB,EAAuBC,CAAwB,EAAIrB,GAAS,EAAK,EAElEsB,EAAsCC,EAAA,MAAO,CACjD,gBAAAhC,EACA,kBAAAE,CACF,IAAM,CACJ,IAAM+B,GAAS,MAAMV,IAAc,CAAE,gBAAAvB,EAAiB,kBAAAE,CAAkB,CAAC,EAEzE,OAAA0B,EAAqBK,EAAM,EACpBA,EACT,EAR4C,iBAUtCC,EAAaF,EAAA,SAAY,CAC7B,GAAIL,EAAkB,MAAQ1B,EAC5B,GAAI,CACF,MAAMoB,GAAS,OACb,OACA,CAAE,YAAaM,EAAkB,IAAK,EACtC,CAAE,GAAIA,EAAkB,KAAK,SAAU,CACzC,EAEA,IAAMQ,EAAW,MAAMC,EAAiB,KAAK,IAAIT,EAAkB,KAAK,SAAS,GACjFtB,EAAS8B,EAAU,CACjB,QAAS,EACX,CAAC,EACD,WAAW,IAAM,CACfpC,EAAe,EAAE,CACnB,EAAG,CAAC,CACN,OAASsC,EAAG,CACV7B,EAAkB,UAAa6B,GAAW,OAAO,CACnD,CAEJ,EApBmB,cAsBbC,EAAYN,EAAA,SAAY,CAC5BlB,EAAgB,EAAI,EACpB,MAAMoB,EAAW,EACjBpB,EAAgB,EAAK,CACvB,EAJkB,aAMZyB,EAAqBP,EAAA,SAAY,CACjCL,GAAmB,UAAU,OAAS,CAACxB,EACzC2B,EAAyB,EAAI,EAE7B,MAAMQ,EAAU,CAEpB,EAN2B,sBAQrBE,EAAYR,EAAA,SAAY,CAC5BJ,EAAqB,CACnB,MAAO,KACP,KAAM,KACN,SAAU,IACZ,CAAC,EACDL,EAAY,CAAE,gBAAAvB,EAAiB,kBAAAE,CAAkB,CAAC,EAC/C,KAAMuC,GAAQ,CACbb,EAAqBa,CAAG,CAC1B,CAAC,EACA,MAAOC,GAAU,QAAQ,MAAMA,CAAK,CAAC,CAC1C,EAXkB,aAalBC,GAAU,IAAM,CAEZ,CAAC,CAACxB,EAA6B,QAAQ,QACvC,CAACF,EAAyB,QAErBuB,EAAU,EAEjBrB,EAA6B,QAAUF,CACzC,EAAG,CAACA,EAAyB,MAAM,CAAC,EAEpC0B,GAAU,IAAM,CACVjC,GACFe,EAAY,CAEhB,EAAG,CAACf,CAAiB,CAAC,EAEtBiC,GAAU,IAAM,CACVjC,GACFE,EAAeF,CAAiB,CAEpC,EAAG,CAACA,CAAiB,CAAC,EAEtBiC,GAAU,IAAM,CACTjC,GACHa,EAAY,CAAE,gBAAAvB,EAAiB,kBAAAE,CAAkB,CAAC,EAC/C,KAAM+B,GAAWL,EAAqBK,CAAM,CAAC,EAC7C,MAAOS,GAAU,QAAQ,MAAMA,CAAK,CAAC,CAE5C,EAAG,CAAC,CAAC,EAELE,GAAgB,IAAM,CACf9C,GAAe,WAClBO,EAAS,MAAM,SAAS,MAAM,EAAE,CAEpC,EAAG,CAACP,GAAe,SAAS,CAAC,EAE7B,IAAM+C,EAAelB,EAAkB,UAAU,OAAS,KACpDmB,GAAanB,EAAkB,MAC/BoB,GAAS,CAAC,EAkBhB,GAjBIxC,GACFwC,GAAO,KAAKC,GAAA,cAACC,GAAA,CAAM,KAAK,QAAQ,QAAQ,QAAQ,MAAO1C,EAAgB,CAAE,EAGvEoB,EAAkB,UAAU,aAC9BoB,GAAO,KACLC,GAAA,cAACC,GAAA,CACC,QAAQ,QACR,KAAK,UACL,MACEtB,EAAkB,SAAS,aAC3BuB,GAA6BvB,EAAkB,SAAS,WAAW,EAEvE,CACF,EAGEkB,GAAgBC,GAAY,CAC9B,IAAMK,EAAe,MAAMf,EAAiB,QAAQ,GACpDW,GAAO,KACLC,GAAA,cAACI,GAAA,CACC,QAASP,EACT,MAAOC,GACP,oBAAqB,GACrB,aAAcN,EACd,iBAAkBX,EAClB,qBAAsB,CAACd,EACvB,mBAAoB,IAAMe,EAAyB,EAAI,EACvD,oBAAqB,IAAMA,EAAyB,EAAK,EACzD,sBAAuB,SAAY,CACjCA,EAAyB,EAAK,EAC9B,MAAMI,EAAW,CACnB,EACA,iBAAkB,IAAM7B,EAAS8C,CAAY,EAC/C,CACF,CACF,CAEA,OACEH,GAAA,cAACK,GAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,cAAc,EAC5B,SAAU,IAAM,CACd,IAAMC,EAAc,MAAMnB,EAAiB,OAAO,GAClD/B,EAASkD,CAAW,CACtB,CACF,EACA,OACEP,GAAA,cAAC1D,GAAA,KACC0D,GAAA,cAAC,OAAI,UAAWvD,GAAiB,GAC/BuD,GAAA,cAACQ,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,UAAS,GACT,QAAShC,GAA6BX,EACtC,SAAU,CAAC,CAACc,EAAkB,OAAS,CAACZ,EACxC,QAASwB,GACRe,GAAK,EAAE,YAAY,CACtB,CACF,EACAN,GAAA,cAACxD,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAASgC,GAA6BX,EACtC,SAAU,CAACE,EACX,QAASH,EAAe,KAAK,KAAM,EAAI,GACvCoC,GAAA,cAACS,GAAA,CAAW,KAAM,GAAI,CACxB,CACF,GAED9C,GACCqC,GAAA,cAACU,GAAA,CACC,KAAM/C,EACN,QAAS,IAAMC,EAAe,EAAK,EACnC,SAAUa,EACV,QAASD,EACT,eAAgBO,EAClB,EAGFiB,GAAA,cAACW,GAAA,KACCX,GAAA,cAAC,OAAI,UAAWpD,GAAkB,GAChCoD,GAAA,cAACY,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BN,GAAK,EAAE,SAAS,CACnB,EACAN,GAAA,cAAC,OAAI,UAAWrD,GAAW,GACzBqD,GAAA,cAACa,GAAA,CACC,QACE,CAACrC,GACD,CAACb,GACD,CAACkB,EACGW,EACA,OAER,CACF,CACF,EACAQ,GAAA,cAACc,GAAA,CAAQ,KAAK,KAAK,EAElBC,GACChB,GAAO,IAAI,CAACiB,EAAOC,KAAW,CAC5B,QAASD,EACT,IAAK,SAASC,CAAK,EACrB,EAAE,EACFjB,GAAA,cAACc,GAAA,CAAQ,KAAM,GAAI,CACrB,EACCf,GAAO,OAAS,EAAIC,GAAA,cAACc,GAAA,CAAQ,KAAM,GAAI,EAAK,KAE7Cd,GAAA,cAACkB,GAAA,CACC,MAAOpE,EACP,KAAK,eACL,SAAQ,GACR,UAAS,GACT,MAAO6B,EAAkB,MACzB,QAASH,EACT,QAASG,EAAkB,UAAU,OAAS,KAChD,CACF,CACF,CAEJ,CA7PgBK,EAAAnC,GAAA,mB0C7DhB,OAAS,QAAAsE,OAAY,eACrB,OACE,UAAAC,GACA,iCAAAC,GACA,6BAAAC,GACA,cAAAC,GACA,WAAAC,GACA,cAAAC,GACA,cAAAC,GACA,YAAAC,GACA,UAAAC,OACK,gBACP,OAAOC,IAAS,YAAAC,OAAgB,QAChC,OAAS,eAAAC,OAAmB,mBCb5B,OAAS,aAAAC,GAAW,cAAAC,GAAY,cAAAC,GAAY,aAAAC,OAAiB,gBAC7D,OAAOC,OAAW,QCHlB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAcD,GAAO,MAAO,CACvC,MAAO,MACP,OAAQ,MACR,QAAS,OACT,WAAY,SACZ,eAAgB,QAClB,CAAC,EDDM,SAASE,GAAYC,EAAkB,CAC5C,GAAM,CACJ,QAAAC,EACA,UAAAC,EACA,MAAAC,EACA,KAAAC,EACA,SAAAC,EACA,MAAAC,EACA,MAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EAAIT,EAEJ,OACEU,GAAA,cAACC,GAAA,CACC,OACED,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CAAW,MAAM,QAAQ,CAC5B,EAEF,OACE,CAAC,CAACP,EAAM,QACNI,GAAA,cAACI,GAAA,CACC,QAAQ,QACR,QAAS,IAAMN,IAAW,EAAE,EAC5B,KAAK,SACLE,GAAA,cAACK,GAAA,CAAU,MAAM,OAAO,KAAM,GAAI,CACpC,EAGJ,UAAWb,EACX,MAAOC,EACP,QAASF,EACT,MAAO,CACL,QAAS,GACT,aAAc,GACd,WAAY,SACZ,GAAGM,CACL,EACA,KAAMH,EACN,MAAOE,EACP,SAAUD,EACT,GAAGI,EACN,CAEJ,CA7CgBO,EAAAjB,GAAA,eEHhB,OAAS,QAAAkB,OAAY,eACrB,OACE,aAAAC,GACA,WAAAC,GACA,oBAAAC,GACA,SAAAC,GACA,kBAAAC,GACA,YAAAC,GACA,WAAAC,GACA,YAAAC,GACA,cAAAC,GACA,mBAAAC,OACK,gBACP,OAAOC,GAAS,aAAAC,GAAW,YAAAC,OAAgB,QCf3C,OAAS,cAAAC,OAAkB,2BAC3B,OAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QAOrC,SAASC,GAAyBC,EAA6B,CACpE,GAAM,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EACvC,CAAE,cAAAC,CAAc,EAAIC,GAAW,EAC/BC,EAA6BC,GAAiB,CAAC,CAAC,EAEhD,CAACC,EAAYC,CAAa,EAAIC,GAAS,CAAC,EAE9C,OAAAC,GAAU,IAAM,CACd,IAAMC,EAAoBC,EAACC,GAA2B,CAChDA,EAAM,qBACWV,EAAcU,EAAM,QAAQ,UAAU,EAClB,gBAAgB,KACpDC,GAAUA,EAAM,OAASd,CAC5B,GAGEQ,EAAeO,GAASA,EAAO,CAAC,CAGtC,EAX0B,qBAe1B,OAFAC,GAAmB,iBAA6BL,CAAiB,EAE5DX,GAIoBC,EAAiB,OACvCgB,GAAWA,EAAO,QAAUjB,CAC/B,EAEiB,QAASiB,GAAW,CACnC,GAAM,CAAE,WAAAC,CAAW,EAAID,EACjBE,EACJd,EAA2B,QAAQ,SAASa,CAAU,EAMpDD,EAAO,SAAW,CAACE,EACrBd,EAA2B,QACzBA,EAA2B,QAAQ,OAAOa,CAAU,EAC7C,CAACD,EAAO,SAAWE,IAC5Bd,EAA2B,QACzBA,EAA2B,QAAQ,OAChCe,GAAeA,IAAeF,CACjC,EACFV,EAAeO,GAASA,EAAO,CAAC,EAEpC,CAAC,EAEM,IACLC,GAAmB,kBAA8BL,CAAiB,GA7B3DH,EAAeO,GAASA,EAAO,CAAC,CA8B3C,EAAG,CAACd,EAAkBD,EAAoBG,CAAa,CAAC,EAEjD,CAAE,WAAAI,CAAW,CACtB,CAzDgBK,EAAAb,GAAA,4BCRhB,OAAS,WAAAsB,GAAS,YAAAC,GAAU,YAAAC,OAAgB,gBAC5C,OAAOC,OAAW,QCHlB,OACE,OAAAC,GACA,aAAAC,GACA,kBAAAC,GACA,UAAAC,GACA,cAAAC,OACK,gBAEA,IAAMC,GAAkBL,GAAI,CACjC,SAAU,WACV,UAAW,OACX,WAAY,iDACZ,aAAc,WACd,WAAY,SACZ,SAAU,IACV,SAAU,QACZ,CAAC,EACYM,GAAoBN,GAAI,CACnC,SAAU,WACV,OAAQ,GACR,MAAO,MACP,SAAU,OACZ,CAAC,EACYO,GAAmBP,GAAI,CAClC,SAAU,WACV,UAAW,OACX,WAAY,iDACZ,OAAQ,MACV,CAAC,EACYQ,GAAqBR,GAAI,CACpC,UAAW,mBACX,WAAY,SACZ,QAAS,OACT,MAAO,CACL,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,SAAU,MACV,WAAY,MACZ,QAAS,qBACT,CAAC,IAAIC,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,UACP,eAAgB,MAClB,CACF,CAAC,EACYQ,GAAyBT,GAAI,CAAC,CAAC,EAC/BU,GAAiBV,GAAI,EAErBW,GAAYR,GAAO,MAAO,CACrC,QAAS,OACT,cAAe,SACf,SAAU,EACV,SAAU,SACV,eAAgB,QAClB,CAAC,EAEYS,GAAQT,GAAO,MAAO,CACjC,QAAS,OACT,WAAY,SACZ,eAAgB,CACd,aAAc,WACd,WAAY,SACZ,SAAU,IACV,SAAU,QACZ,CACF,CAAC,EACYU,GAAOV,GAAO,KAAM,CAC/B,SAAU,EACV,QAAS,EACT,OAAQ,EACR,UAAW,OAEX,OAAQ,CACN,WAAY,OAEZ,UAAW,CACT,CAAC,MAAMG,EAAiB,EAAE,EAAG,CAC3B,CAAC,MAAME,EAAkB,EAAE,EAAG,CAC5B,SAAU,WACV,UAAW,OACX,WAAY,iDACZ,WAAY,SACd,EAEA,CAAC,MAAMC,EAAsB,EAAE,EAAG,CAChC,OAAQ,OACV,EACA,CAAC,MAAMJ,EAAe,EAAE,EAAG,CACzB,SAAU,WACV,UAAW,oBACX,WAAY,QACd,EACA,CAAC,MAAME,EAAgB,EAAE,EAAG,CAC1B,SAAU,WACV,UAAW,oBACX,OAAQ,OACV,CACF,CACF,CACF,CACF,CAAC,EAEYO,GAAMX,GAAO,MAAO,CAC/B,YAAa,KACb,aAAc,KACd,aAAc,MACd,QAAS,OACT,WAAY,QACd,CAAC,EAEYY,GAAWZ,GAAOC,GAAY,CAAC,CAAC,EAEhCY,GAAmBb,GAAO,MAAO,CAC5C,UAAW,QACX,MAAO,OACP,SAAU,SACV,aAAc,WACd,WAAY,SACZ,CAAC,MAAMO,EAAc,EAAE,EAAG,CACxB,QAAS,qBACT,CAAC,IAAIT,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,SACT,CACF,CAAC,EAEYgB,GAAMd,GAAO,MAAO,CAC/B,QAAS,OACT,WAAY,MACZ,cAAe,QACjB,CAAC,EAEYe,GAAcf,GAAO,MAAO,CACvC,QAAS,OACT,WAAY,QACd,CAAC,EACYgB,GAAehB,GAAO,MAAO,CACxC,SAAU,WACV,CAAC,KAAKD,EAAc,EAAE,EAAG,CACvB,aAAc,MACd,SAAU,QACZ,CACF,CAAC,EACYkB,GAAMjB,GAAO,MAAO,CAC/B,SAAU,WACV,gBAAiB,cACjB,QAAS,KACT,aAAc,MACd,OAAQ,GACR,MAAO,EACT,CAAC,EAEYkB,GAAelB,GAAOC,GAAY,CAC7C,MAAO,OACP,SAAU,SACV,aAAc,WACd,WAAY,QACd,CAAC,EAEYkB,GAAanB,GAAO,IAAK,CACpC,cAAe,CACb,MAAO,cACT,CACF,CAAC,ED/JM,SAASoB,GAAiBC,EAA8B,CAC7D,OACEC,GAAA,cAACC,GAAA,KACE,MAAM,KAAK,MAAMF,EAAM,IAAI,EAAI,GAC9BC,GAAA,cAACE,GAAA,CACC,IAAK,EACL,WAAU,GACV,MAAOF,GAAA,cAACG,GAAA,CAAS,QAAQ,WAAW,MAAO,GAAI,OAAQ,GAAI,EAC3D,IACEH,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACG,GAAA,CAAS,QAAQ,OAAO,KAAK,QAAQ,MAAO,GAAI,EACjDH,GAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,EAClBL,GAAA,cAACG,GAAA,CAAS,QAAQ,OAAO,KAAK,SAAS,MAAO,GAAI,CACpD,EAEF,MACEH,GAAA,cAAC,WACCA,GAAA,cAACG,GAAA,CAAS,QAAQ,OAAO,KAAK,QAAQ,MAAO,GAAI,EACjDH,GAAA,cAACK,GAAA,CAAQ,KAAM,EAAG,EAClBL,GAAA,cAACG,GAAA,CAAS,QAAQ,OAAO,KAAK,SAAS,MAAO,GAAI,CACpD,EAEJ,CACD,CACH,CAEJ,CA1BgBG,EAAAR,GAAA,oBFuChB,IAAMS,GAAY,GAEZC,GAAaC,EAACC,GAA2B,CAC7C,GAAM,CAAE,QAAAC,EAAS,KAAAC,EAAM,IAAAC,EAAK,MAAAC,EAAO,gBAAAC,EAAiB,qBAAAC,CAAqB,EACvEN,EACIO,EAASN,EAAQ,OAEvB,OACEO,EAAA,cAAC,OAAI,UAAWC,GAAkB,GAC/BP,EACCM,EAAA,cAAC,OAAI,UAAWE,GAAgB,GAAIR,CAAK,EAEzCM,EAAA,cAACG,GAAA,CAAM,UAAWC,GAAiB,GACjCJ,EAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BT,EAAM,MACT,EACAI,EAAA,cAACM,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCN,EAAA,cAACO,GAAA,CAAI,IAAKV,GACRG,EAAA,cAACQ,GAAA,CAAS,QAAQ,OAAO,KAAK,SAAS,IAAKV,GACzCF,EAAM,UACT,CACF,CACF,EAGD,CAAC,CAACH,GACDO,EAAA,cAAC,OACC,UAAW,GAAGS,GAAmB,CAAC,IAChC,CAACf,GAAQgB,GAAuB,CAClC,IACCX,EAAS,GACN,GAAGN,EAAQ,MAAM,EAAG,CAAC,CAAC,MAAMA,EAAQ,MAAMM,EAAS,EAAGA,CAAM,CAAC,GAC7DN,EAAS,IACbO,EAAA,cAACM,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCN,EAAA,cAACW,GAAA,CACC,KAAMhB,EACN,OAAO,SACP,IAAI,sBACJ,QAAUiB,GAAMA,EAAE,gBAAgB,GAClCZ,EAAA,cAACa,GAAA,CAAiB,KAAM,GAAI,CAC9B,CACF,CAEJ,CAEJ,EA3CmB,cA6CZ,SAASC,GAAUtB,EAAkB,CAC1C,GAAM,CACJ,KAAAuB,EACA,YAAAC,EAAc,GACd,SAAAC,EACA,mBAAAC,EACA,UAAAC,EAAY,GACZ,OAAAC,CACF,EAAI5B,EAEE,CAAC6B,EAAQC,CAAS,EAAIC,GAAkBR,CAAI,EAC5CS,EAAcC,EAAY,EAAE,YAC5BC,EAAcD,EAAY,EAAE,YAAY,EACxC,CAACE,EAAaC,CAAc,EAAIL,GAAkB,EAAI,EACtD,CAAE,cAAAM,EAAe,QAASC,CAAc,EAAIC,EAAgB,EAC5D,CAAE,cAAAC,CAAc,EAAIP,EAAY,EAKhC,CAAE,WAAAQ,CAAW,EAAIC,GAAyBhB,CAAkB,EAE5DiB,EAAe5C,EAAA,IAAM,CACzB+B,EAAUP,EAAK,MAAM,EAAGM,EAAO,OAAShC,EAAS,CAAC,CACpD,EAFqB,gBAIrB+C,GAAU,IAAM,CACdR,EAAeb,EAAK,OAASM,EAAO,MAAM,CAC5C,EAAG,CAACA,EAAO,MAAM,CAAC,EAElBe,GAAU,IAAM,CACdd,EAAUP,EAAK,MAAM,EAAG1B,EAAS,CAAC,CACpC,EAAG,CAAC0B,EAAK,OAAQG,EAAoBe,CAAU,CAAC,EAEhD,IAAMI,EAAc9C,EAACK,GAAiB,CACpC,IAAM0C,EAAeC,GAAcV,EAAcjC,CAAK,CAAC,EAEvD,OAAIwB,EACKA,EAAOxB,CAAK,EAEjBkC,EAEA9B,EAAA,cAACwC,GAAA,KACCxC,EAAA,cAACyC,GAAA,CAAS,QAAQ,OAAO,KAAK,QAAQ,MAAO,GAAI,EACjDzC,EAAA,cAACM,GAAA,CAAQ,KAAM,EAAG,EAClBN,EAAA,cAACyC,GAAA,CAAS,QAAQ,OAAO,KAAK,SAAS,MAAO,GAAI,CACpD,EAKFH,GACEtC,EAAA,cAAC0C,GAAA,KACC1C,EAAA,cAAC2C,GAAA,CAAa,QAAQ,QAAQ,KAAK,SAChCL,EAAa,MAChB,EACAtC,EAAA,cAAC,UAAI,EACJsC,EAAa,UACZtC,EAAA,cAACK,GAAA,CACC,QAAQ,OACR,UAAWuC,GAAe,EAC1B,KAAK,UACJ,IAAIN,EAAa,QAAQ,EAC5B,CAEJ,CAGN,EAlCoB,eAoCdO,EAAatD,EAAA,IAEfS,EAAA,cAAC8C,GAAA,CACC,WAAYnB,EAAcQ,EAAe,OACzC,YAAcY,GAAU,CACtB,IAAMnD,EAAQyB,EAAO0B,CAAK,EACpBtD,EAAUG,EAAM,SAAW,GAC3BoD,EAAatB,EAAY,KAC5BsB,GAAeA,EAAW,OAASpD,EAAM,UAC5C,EACMqD,EAASC,GAAqBF,EAAW,MAAO,MAAM,EACtDnD,EAAkB,CACtB,QAASoD,EAAO,QAChB,CAAC,IAAIE,EAAS,IAAI,EAAG,CACnB,QAASF,EAAO,OAClB,EACA,gBAAiB,SACnB,EAEMnD,EAAuB,CAC3B,QAASmD,EAAO,QAChB,CAAC,IAAIE,EAAS,IAAI,EAAG,CACnB,QAASF,EAAO,OAClB,EACA,MAAO,SACT,EAEA,OACEjD,EAAA,cAAC,OACC,MAAO,CACL,aAAc,CAChB,GACAA,EAAA,cAACoD,GAAA,CACC,MAAO,CACL,MAAO,OACP,SAAU,SACV,OAAQ,MACV,EACA,YAAWL,EACX,IAAK,GAAGnD,EAAM,MAAM,GAAGA,EAAM,OAAO,GACpC,GAAI,GAAGA,EAAM,MAAM,GAAGA,EAAM,OAAO,GACnC,WAAU,GACV,QAAS,IAAMqB,GAAYA,EAASI,EAAO0B,CAAK,CAAC,EACjD,MACE/C,EAAA,cAACqD,GAAA,KACCrD,EAAA,cAACsD,GAAA,CAAM,IAAK1D,EAAM,MAAO,KAAM,GAAI,EAClCJ,EAAM,OAAS,gBACdwC,EAAcpC,EAAOJ,EAAM,IAAI,GAC7BQ,EAAA,cAACuD,GAAA,KACCvD,EAAA,cAACwD,GAAA,CAAQ,KAAM,GAAI,MAAM,OAAO,CAClC,CAEN,EAEF,MACER,GAAY,OAAS,UACnBpD,EAAM,MACP,CAACA,EAAM,MAAQ,CAACH,EACfO,EAAA,cAACG,GAAA,KACCH,EAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BT,EAAM,MACT,EACAI,EAAA,cAACM,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCN,EAAA,cAACO,GAAA,CAAI,IAAKV,GACRG,EAAA,cAACQ,GAAA,CACC,QAAQ,OACR,KAAK,SACL,IAAKV,GACJF,EAAM,UACT,CACF,CACF,EACE,OAEN,YACIoD,GAAY,MACZvD,GACFuD,EAAW,OAAS,SAChB1D,GAAW,CACT,QAAAG,EACA,MAAO4B,EAAO0B,CAAK,EACnB,gBAAAlD,EACA,qBAAAC,EACA,KAAMF,EAAM,KACZ,IAAKoD,EAAW,KAAK,WAClB,MAAM,UAAU,EAChB,KAAKvD,CAAO,CACjB,CAAC,EACDG,EAAM,MAAQ,OAEpB,IAAKyC,EAAYzC,CAAK,EACxB,CACF,CAEJ,EACA,WAAYyB,EAAO,OACnB,IAAK,GAAGH,CAAkB,IAAIF,CAAW,IAAIiB,CAAU,GACzD,EAjGe,cAqGnB,OACEjC,EAAA,cAAAA,EAAA,cACGmB,GACCnB,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BoD,GAAK,EAAE,cAAc,CACxB,EACAzD,EAAA,cAACM,GAAA,CAAQ,KAAM,EAAG,CACpB,EAGFN,EAAA,cAAC0D,GAAA,KACC1D,EAAA,cAACM,GAAA,CAAQ,KAAM,EAAG,EACjBkB,IAAgB,WAAaxB,EAAA,cAAC2D,GAAA,CAAiB,KAAMtE,GAAW,EAChEmC,IAAgB,YACdH,EAAO,OACNrB,EAAA,cAAC4D,GAAA,CAAK,GAAG,MAAMf,EAAW,CAAE,EAE5B,CAAC,CAAC7B,GACAhB,EAAA,cAAC6D,GAAA,CACC,MAAOJ,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAAE,8BAA8B,EACpD,EAGR,CACF,CAEJ,CAvMgBlE,EAAAuB,GAAA,aHjEhB,IAAMgD,GAAUC,GAAO,MAAO,CAC5B,QAAS,OACT,eAAgB,gBAChB,cAAe,SACf,KAAM,CACR,CAAC,EACKC,GAAkBD,GAAO,MAAO,CACpC,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,KAAM,MACR,CAAC,EACKE,GAAmBF,GAAOG,GAAY,CAC1C,UAAW,CACT,QAAS,CACP,MAAO,eACT,CACF,CACF,CAAC,EACM,SAASC,IAAmB,CACjC,GAAM,CAACC,EAAaC,CAAc,EAAIC,GAAiB,EAAE,EACnD,CAAE,kBAAAC,CAAkB,EAAIC,EAAY,EACpCC,EAAeD,EAAY,EAAE,aAAa,EAC1C,CAAE,UAAAE,EAAW,QAAAC,EAAS,aAAAC,EAAc,WAAAC,CAAW,EAAIC,EAAc,EACjE,CAAE,KAAAC,CAAK,EAAIC,GAAS,CAAC,CAAC,EACtBC,EAAWC,GAAY,EACvB,CAACC,EAAmBC,CAAoB,EAAId,GAAkB,EAAK,EACnE,CAACe,EAAeC,CAAgB,EAAIhB,GAAgB,EACpDiB,EAAeC,EAACC,GAA+C,CACnE,IAAMC,EAAQD,EAAM,OAAO,MAC3BpB,EAAeqB,CAAK,CACtB,EAHqB,gBAIfC,EAAcZ,IAAS,OAEvBa,EAAsBnB,EAAa,OACtCoB,GACCC,GAAaD,EAAM,OAAQzB,CAAW,GACtC0B,GAAaD,EAAM,SAAW,GAAIzB,CAAW,GAC7C0B,GAAaD,EAAM,MAAQ,GAAIzB,CAAW,CAC9C,EAEM2B,EAA0BP,EAAA,IAAM,CACpC,GAAIH,EAAe,CACjB,IAAMW,EAAcrB,EAAUsB,GAAgBtB,CAAO,EAAI,KACnDuB,EAAgBxB,EAAYuB,GAAgBvB,CAAS,EAAI,KACzDyB,EAAoBF,GAAgBZ,CAAa,EAEnDW,IAAgBG,EAClBtB,EAAW,CAAE,MAAO,IAAK,CAAC,EACjBqB,IAAkBC,GAC3BvB,EAAa,CAAE,MAAO,IAAK,CAAC,EAE9BL,EAAkBc,CAAa,CACjC,CACAD,EAAqB,EAAK,CAC5B,EAdgC,2BAgBhC,OACEgB,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,eAAe,CAC/B,GACAF,GAAA,cAACG,GAAA,KACCH,GAAA,cAACtC,GAAA,KACIW,EAAa,OACd2B,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACI,GAAA,CACC,MAAOpC,EACP,SAAUC,EACV,UAAS,GACT,MAAM,QACN,QAAQ,YACR,YAAaiC,GAAK,EAAE,cAAc,EAClC,SAAUf,EACZ,EACAa,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACM,GAAA,CACC,KAAMd,EACN,KAAK,eACL,YAAaxB,EACb,UAAW,GACX,OAASyB,GACPO,GAAA,cAACnC,GAAA,CACC,QAAQ,QACR,QAAS,IAAM,CACbmB,EAAqB,EAAI,EACzBE,EAAiBO,CAAK,CACxB,GACAO,GAAA,cAACO,GAAA,CAAW,KAAM,GAAI,MAAM,OAAO,CACrC,EAEJ,CACF,EAEAP,GAAA,cAACpC,GAAA,KACCoC,GAAA,cAACQ,GAAA,CACC,KACEjB,EACES,GAAA,cAACS,GAAA,CAA8B,KAAM,IAAK,EAE1CT,GAAA,cAACU,GAAA,CAA0B,KAAM,IAAK,EAG1C,MAAOR,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAChB,2CACF,EACF,CACF,EAEFF,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EAEnBL,GAAA,cAACW,GAAA,CACC,KAAK,UACL,QAAQ,YACR,KAAK,QACL,QAAS,IAAM9B,EAAS+B,EAAiB,eAAe,GACvDV,GAAK,EAAE,kBAAkB,CAC5B,CACF,EACAF,GAAA,cAACa,EAAA,CACC,KAAM9B,EACN,YAAW,GACX,QAAS,IAAMC,EAAqB,EAAK,EACzC,UAAW8B,EAAa,GACxBd,GAAA,cAACe,GAAA,CACC,MAAOb,GAAK,EAAE,qBAAqB,EACnC,KAAK,QACL,YAAaA,GAAK,EAAE,6CAA6C,GACjEF,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EAEnBL,GAAA,cAACW,GAAA,CACC,UAAS,GACT,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAAShB,GACRO,GAAK,EAAE,gBAAgB,CAC1B,EACAF,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACW,GAAA,CACC,UAAS,GACT,QAAQ,WACR,KAAK,UACL,KAAK,QACL,QAAS,IAAM3B,EAAqB,EAAK,GACxCkB,GAAK,EAAE,cAAc,CACxB,CACF,CACF,CACF,CACF,CAEJ,CAvIgBd,EAAArB,GAAA,oBOhDhB,OAAS,QAAAiD,OAAY,eACrB,OAAS,cAAAC,OAAkB,iCAC3B,OACE,UAAAC,GACA,aAAAC,GACA,WAAAC,GACA,cAAAC,GACA,YAAAC,GACA,UAAAC,GACA,cAAAC,OACK,gBACP,OAGE,qBAAAC,OACK,cACP,OAAOC,IAAS,WAAAC,GAAS,YAAAC,OAAgB,QACzC,OAAS,eAAAC,OAAmB,mBCf5B,OAAS,cAAAC,GAAY,WAAAC,OAAe,gBACpC,OAAOC,OAAW,QCHlB,OAAS,OAAAC,GAAK,aAAAC,GAAW,cAAAC,GAAY,UAAAC,OAAc,gBAE5C,IAAMC,GAAgBD,GAAO,MAAO,CACzC,SAAU,WACV,YAAa,CACX,SAAU,WACV,MAAO,MACP,IAAK,OACL,MAAO,KACP,OAAQ,KACR,aAAc,OACd,gBAAiB,cACjB,CAAC,IAAIF,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,EACA,QAAS,IACX,EACA,SAAU,CACR,SAAU,CACR,KAAM,CACJ,YAAa,CACX,QAAS,EACX,CACF,CACF,CACF,CACF,CAAC,EAEYI,GAAeF,GAAOD,GAAY,CAC7C,MAAO,MACP,OAAQ,MACR,SAAU,WACV,QAAS,IACT,SAAU,QACV,gBAAiB,cACjB,CAAC,IAAID,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,EACA,UAAW,CACT,gBAAiB,gBACjB,CAAC,IAAIA,EAAS,IAAI,EAAG,CACnB,gBAAiB,UACnB,EACA,CAAC,KAAKG,EAAa,UAAU,EAAG,CAC9B,gBAAiB,gBACjB,CAAC,IAAIH,EAAS,IAAI,EAAG,CACnB,gBAAiB,UACnB,CACF,CACF,EACA,SAAU,CACR,SAAU,CACR,KAAM,CACJ,OAAQ,sBACV,CACF,CACF,CACF,CAAC,EAEYK,GAAQH,GAAO,MAAO,CACjC,SAAU,WACV,MAAO,KACP,OAAQ,KACR,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,aAAc,MACd,IAAK,KACL,MAAO,MACP,gBAAiB,eACnB,CAAC,EAEYI,GAAkBJ,GAAO,MAAO,CAC3C,QAAS,MACT,aAAc,MACd,MAAO,QACP,gBAAiB,cACjB,OAAQ,EACV,CAAC,EAEYK,GAAwBR,GAAI,CACvC,QAAS,OACT,eAAgB,gBAChB,WAAY,QACd,CAAC,EAEYS,GAAaN,GAAO,KAAM,CACrC,OAAQ,EACR,UAAW,OACX,OAAQ,OACR,QAAS,EACT,wBAAyB,CACvB,aAAc,cAChB,CACF,CAAC,EC5FD,OAAS,QAAAO,OAAY,eACrB,OACE,UAAAC,GACA,WAAAC,GACA,kBAAAC,GACA,SAAAC,GACA,aAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QAQX,SAASC,GAAsBC,EAAkB,CACtD,GAAM,CAAE,SAAUC,EAAO,YAAAC,CAAY,EAAIF,EACzC,OACEG,GAAA,cAACC,GAAA,KACCD,GAAA,cAAC,OAAI,UAAWE,GAAsB,GACpCF,GAAA,cAACG,GAAA,CAAW,KAAK,QAAQ,QAAQ,QAC9BC,GAAK,EAAE,QAAQ,CAClB,EACAJ,GAAA,cAACK,GAAA,CAAO,QAAQ,QAAQ,KAAK,UAAU,QAAS,IAAMN,EAAY,EAAE,GACjEK,GAAK,EAAE,OAAO,CACjB,CACF,EACAJ,GAAA,cAACM,GAAA,CAAQ,KAAM,GAAI,EACnBN,GAAA,cAACO,GAAA,CAAU,MAAOT,GAChBE,GAAA,cAACQ,GAAA,KACEX,EAAM,KAAK,IAAI,CAACY,EAAMC,IAEnBV,GAAA,cAACW,GAAA,CACC,IAAKF,EAAK,GACV,MAAO,CAAE,OAAQ,OAAQ,MAAO,MAAO,EACvC,SAAU,GACV,WAAYZ,EAAM,KAAK,OAAS,GAAKa,EACrC,GAAID,EAAK,GACT,MACET,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACM,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCN,GAAA,cAACG,GAAA,CAAW,KAAK,SAAS,QAAQ,QAC/BM,EAAK,KACR,CACF,EAEF,MAAOT,GAAA,cAACY,GAAA,CAAM,MAAOH,EAAK,GAAI,EAC9B,QAASV,EACX,CAEH,CACH,CACF,CACF,CAEJ,CAxCgBc,EAAAjB,GAAA,yBFTT,SAASkB,GAAeC,EAAgC,CAC7D,GAAM,CAAE,YAAAC,EAAa,aAAAC,EAAc,SAAAC,EAAU,KAAAC,EAAM,KAAAC,CAAK,EAAIL,EAC5D,OACEM,GAAA,cAAC,WACCA,GAAA,cAACC,GAAA,CACC,KAAMF,EACN,MAAM,MACN,aAAcH,EACd,UAAWM,EAAa,EACxB,QACEF,GAAA,cAACG,GAAA,CACC,KAAML,EACN,SAAUD,EACV,YAAcO,GAAO,CACnBT,EAAYS,CAAE,EACdR,EAAa,EAAK,CACpB,EACF,GAEFI,GAAA,cAACK,GAAA,CACC,QAAQ,UACR,SAAU,CAAC,CAACR,EACZ,QAAS,IAAMD,EAAa,CAACF,EAAM,IAAI,GACvCM,GAAA,cAACM,GAAA,CAAc,SAAU,CAAC,CAACT,GACzBG,GAAA,cAACO,GAAA,CAAW,KAAM,GAAI,MAAM,QAAQ,EACnC,CAAC,CAACV,GAAYG,GAAA,cAACQ,GAAA,IAAM,CACxB,CACF,CACF,CACF,CAEJ,CA/BgBC,EAAAhB,GAAA,kBGRhB,OAAS,QAAAiB,OAAY,eACrB,OACE,WAAAC,GACA,0BAAAC,GACA,YAAAC,GACA,gBAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,IAAS,eAAAC,GAAa,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QCJzD,SAASC,GAAqBC,EAAuBC,EAAe,CACzE,IAAMC,EAAmB,CAAC,EACtBC,EAAQ,EACZ,EAAG,CACD,IAAMC,EAAQJ,EAAYG,CAAK,EAC/BD,EAAO,KAAK,KAAK,IAAIE,EAAOH,CAAK,CAAC,EAClCA,GAASG,EACTD,GACF,OAASF,EAAQ,GAAKE,GAASH,EAAY,QAC3C,OAAOE,CACT,CAVgBG,EAAAN,GAAA,wBCNhB,OAAS,OAAAO,GAAK,aAAAC,GAAW,UAAAC,OAAc,gBAEhC,IAAMC,GAAcH,GAAI,EAElBI,GAAoBF,GAAO,MAAO,CAC7C,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,QAAS,IACX,CAAC,EAEYG,GAAQH,GAAO,MAAO,CACjC,MAAO,OACP,QAAS,OACT,cAAe,SACf,gBAAiB,cACjB,QAAS,cACT,CAAC,MAAMC,EAAW,EAAE,EAAG,CACrB,QAAS,qBACT,CAAC,IAAIF,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,SACT,CACF,CAAC,EAEYK,GAAOJ,GAAO,MAAO,CAChC,QAAS,OACT,eAAgB,aAChB,QAAS,IACX,CAAC,EAEYK,GAAWL,GAAO,MAAO,CACpC,IAAK,MACL,QAAS,OACT,cAAe,QACjB,CAAC,EAEYM,GAAoBN,GAAO,MAAO,CAC7C,OAAQ,OACR,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CAAC,EFfD,IAAMO,GAAiB,GAEhB,SAASC,GAAmBC,EAAkB,CACnD,GAAM,CAAE,KAAAC,EAAM,YAAAC,EAAa,QAAAC,EAAS,UAAAC,CAAU,EAAIJ,EAC5C,CAACK,EAAoBC,CAAqB,EAAIC,GAAmB,CAAC,CAAC,EACnEC,EAAcC,GAAO,CAAC,EACtB,CAAE,MAAAC,EAAO,YAAAC,EAAa,OAAAC,CAAO,EAAIT,EAAQF,CAAI,EAE7CY,EAAkBC,GAAYC,GAAsB,CAAC,CAAC,EAEtDC,EAAWF,GAAY,IAAM,CACjC,IAAMG,EAAgBhB,EAAK,OAASO,EAAY,QAC5CS,IACFT,EAAY,SAAW,KAAK,IAAIS,EAAenB,EAAc,EAC7DQ,EAAsBO,EAAgBF,EAAaH,EAAY,OAAO,CAAC,EAE3E,EAAG,CAACP,EAAK,MAAM,CAAC,EAQhB,GANAiB,GAAU,IAAM,CACTd,GACHY,EAAS,CAEb,EAAG,CAACZ,EAAWY,CAAQ,CAAC,EAEpBZ,EAAW,CAEb,IAAMM,EAAQ,CAAC,EAAG,CAAC,EAEnB,OACES,GAAA,cAAAA,GAAA,cAFoB,CAACT,EAAOA,CAAK,EAGhB,IAAI,CAACU,EAAOC,IAGvBF,GAAA,cAACG,GAAA,CAAM,IAFGD,GAGRF,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACK,GAAA,CAAS,QAAQ,OAAO,MAAO,GAAI,KAAK,QAAQ,EACjDL,GAAA,cAACM,GAAA,CAAQ,KAAM,GAAI,CACrB,EACAN,GAAA,cAACM,GAAA,CAAQ,KAAM,EAAG,EAClBN,GAAA,cAACO,GAAA,KACEN,EAAM,IAAI,CAACO,EAAGN,IAENF,GAAA,cAACS,GAAA,CAAa,UAAW,GAAM,IAD1BP,EACoC,CACjD,CACH,CACF,CAEH,CACH,CAEJ,CAEA,OACEF,GAAA,cAACU,GAAA,CACC,WAAY,IAAM,CACZrB,EAAY,QAAUP,EAAK,QAC7Be,EAAS,CAEb,EACA,YAAaX,EACb,aAAegB,GAEXF,GAAA,cAACG,GAAA,KACCH,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACW,GAAA,CACC,QAAQ,QACR,KAAK,SACL,UAAWC,GAAY,GACtBnB,EAAOS,CAAK,CACf,CACF,CACF,EAGJ,YAAa,CAACA,EAAOW,IAAe,CAClC,IAAMC,EAAOvB,EAAMW,CAAK,EACxB,GAAI,CAACY,EACH,OAAO,KAET,IAAMC,EAAYD,EAAK,MAAM,CAAC,EACxBE,EAAWF,EAAK,MAAMA,EAAK,MAAM,OAAS,CAAC,EACjD,OACEd,GAAA,cAACiB,GAAA,CAAkB,IAAKH,EAAK,WAC3Bd,GAAA,cAACS,GAAA,CACC,UAAWK,EAAK,UAChB,aAAcA,EAAK,aACnB,OAAQA,EAAK,OACb,QAAS/B,EACT,iBAAkBmC,EAAa,EAC/B,aAAczB,EAAOoB,CAAU,IAAMM,GAAK,EAAE,OAAO,EACnD,cAAe,CACb,KAAM,CACJ,MAAO,CACL,MAAOJ,EAAU,SACjB,YAAaA,EAAU,UACzB,EACA,WAAY,CACV,MAAOA,EAAU,oBAAsB,EACzC,EACA,OAAQK,EACNN,EAAK,YACL,EACA,CACF,EACA,WAAYA,EAAK,WACnB,EACA,GAAI,CACF,MAAO,CACL,MAAOE,EAAS,OAChB,YAAaA,EAAS,QACxB,EACA,WAAY,CACV,MAAOA,EAAS,kBAAoB,EACtC,EACA,OAAQI,EACNJ,EAAS,cACPA,EAAS,mCACT,GACF,EACA,CACF,EACA,WACEA,EAAS,cACTA,EAAS,mCACT,EACJ,CACF,EACF,CACF,CAEJ,EACF,CAEJ,CAnIgBK,EAAAzC,GAAA,sBG3BhB,OAAS,QAAA0C,OAAY,eACrB,OAAOC,OAAW,QAEX,IAAMC,GAA4BC,EAACC,GAAU,CAClD,IAAMC,EAMF,IAAI,IAAI,CACV,CACE,QACA,CACE,MAAOC,GAAK,EAAE,OAAO,EACrB,MAAO,CAAC,CACV,CACF,EACA,CACE,OACA,CACE,MAAOA,GAAK,EAAE,WAAW,EACzB,MAAO,CAAC,CACV,CACF,EACA,CACE,QACA,CACE,MAAOA,GAAK,EAAE,YAAY,EAC1B,MAAO,CAAC,CACV,CACF,EACA,CACE,OACA,CACE,MAAOA,GAAK,EAAE,WAAW,EACzB,MAAO,CAAC,CACV,CACF,CACF,CAAC,EAED,SAASC,EAAiBC,EAAaC,EAAmB,CACnDJ,EAAO,IAAIG,CAAG,GACjBH,EAAO,IAAIG,EAAK,CACd,MAAOA,EACP,MAAO,CAAC,CACV,CAAC,EAEHH,EAAO,IAAIG,CAAG,GAAG,MAAM,KAAKC,CAAI,CAClC,CARSN,EAAAI,EAAA,oBAUT,IAAMG,EAAMC,GAAM,EAClBP,EAAM,QAASK,GAAS,CACtB,IAAMG,EAAO,OAAOH,EAAK,YAAY,EAC/BI,EAAWF,GAAMC,CAAI,EAC3B,GAAIF,EAAI,OAAOG,EAAU,KAAK,EAC5BR,EAAO,IAAI,OAAO,GAAG,MAAM,KAAKI,CAAI,UAC3BC,EAAI,OAAOG,EAAU,MAAM,EACpCR,EAAO,IAAI,MAAM,GAAG,MAAM,KAAKI,CAAI,UAC1BC,EAAI,OAAOG,EAAU,OAAO,EACrCR,EAAO,IAAI,OAAO,GAAG,MAAM,KAAKI,CAAI,UAC3BC,EAAI,OAAOG,EAAU,MAAM,EACpCR,EAAO,IAAI,MAAM,GAAG,MAAM,KAAKI,CAAI,MAC9B,CACL,IAAMK,EAAO,IAAI,KAAKF,CAAI,EAAE,YAAY,EAAE,SAAS,EACnDL,EAAiBO,EAAML,CAAI,CAC7B,CACF,CAAC,EAED,IAAMM,EAAe,MAAM,KAAKV,EAAO,OAAO,CAAC,EAAE,OAC9CW,GAASA,EAAK,MAAM,OAAS,CAChC,EACMC,EAAQF,EAAa,QAASG,GAAUA,EAAM,KAAK,EACnDC,EAAcJ,EAAa,IAAKG,GAAUA,EAAM,MAAM,MAAM,EAC5DE,EAASL,EAAa,IAAKG,GAAUA,EAAM,KAAK,EAEtD,MAAO,CAAE,MAAOD,EAAO,YAAAE,EAAa,OAAAC,CAAO,CAC7C,EA1EyC,oBPyBzC,IAAMC,GAA8BC,GAAO,MAAO,CAChD,UAAW,UACX,MAAO,OACP,QAAS,OACT,cAAe,SACf,IAAK,GACL,OAAQ,MACV,CAAC,EAEKC,GAAqBD,GAAO,MAAO,CACvC,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CAAC,EAEKE,GAAcF,GAAO,MAAO,CAChC,eAAgB,CACd,MAAO,cACP,CAAC,IAAIG,EAAS,GAAG,EAAG,CAClB,MAAO,aACT,CACF,CACF,CAAC,EAEKC,GAA2B,CAC/B,CACE,GAAIC,GAAkB,QACtB,MAAOC,GAAK,EAAE,UAAU,CAC1B,EACA,CACE,GAAID,GAAkB,QACtB,MAAOC,GAAK,EAAE,SAAS,CACzB,EACA,CAAE,GAAID,GAAkB,OAAQ,MAAOC,GAAK,EAAE,QAAQ,CAAE,CAC1D,EAEMC,GAAqBC,EAAA,CAACC,EAA0BC,IAC/CD,GAAO,OAGLA,EAAM,OACVE,GACCC,GAAaD,EAAK,eAAgBD,CAAK,GACvCE,GAAaD,EAAK,aAAcD,CAAK,GACrCE,GAAaD,EAAK,SAAUD,CAAK,GACjCE,GAAaD,EAAK,WAAYD,CAAK,CACvC,EAAE,OARO,GAFgB,sBAapB,SAASG,IAAc,CAC5B,IAAMC,EAAWC,GAAY,EACvB,CAAE,QAAAC,EAAS,MAAAC,CAAM,EAAIC,GAAW,EAChCC,EAAsBC,GAAgBJ,CAAO,EAAE,IAAI,CAAC,CAAE,KAAAK,CAAK,IAAMA,CAAI,EACrE,CAACC,EAAaC,CAAc,EAAIC,GAAiB,EAAE,EACnD,CAACC,EAAoBC,CAAqB,EAAIF,GAAS,EAAK,EAC5DG,EAAU,CAACV,EAAM,oBACjB,CAACW,EAAUC,CAAW,EAAIL,GAAS,EAAE,EACrC,CAACM,EAAgBC,CAAiB,EAAIP,GAAS,EAAK,EACpDQ,EAAexB,EAACyB,GAA+C,CACnE,IAAMvB,EAAQuB,EAAM,OAAO,MAC3BV,EAAeb,CAAK,CACtB,EAHqB,gBAKfwB,EAAeC,GAAQ,IACvB,CAACb,GAAe,CAACM,EACZT,EAGFA,EAAK,OAAQE,GAAS,CAC3B,GAAM,CAAE,YAAAe,EAAa,OAAAC,EAAQ,MAAA5B,EAAO,UAAA6B,CAAU,EAAIjB,EAWlD,OARE,CAACC,GACDV,GAAawB,EAAad,CAAW,GACrCV,GAAayB,EAAQf,CAAW,GAChCf,GAAmBE,EAAOa,CAAW,GACrCV,GAAa0B,EAAWhB,CAAW,KAEf,CAACM,GAAYA,IAAaS,EAGlD,CAAC,EACA,CAAClB,EAAMG,EAAaM,CAAQ,CAAC,EAE1BW,EAAU,CAACL,GAAc,QAAU,CAACP,EAEpCa,EAAehC,EAAA,IAAMuB,EAAkB,EAAK,EAA7B,gBACfU,EAAUjC,EAAA,SAAY,CAC1B,GAAI,CACF,MAAMQ,GAAS,WAAW,EAE1Be,EAAkB,EAAK,CACzB,OAASW,EAAG,CACV,QAAQ,IAAIA,CAAC,CACf,CACF,EARgB,WASVC,EAAwBR,GAAQ,IAC7B,CAAChB,EAAK,KACVE,GACCA,EAAK,SAAWhB,GAAkB,SAClCgB,EAAK,SAAWhB,GAAkB,MACtC,EACC,CAACc,CAAI,CAAC,EAET,OACEyB,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,MAAOvC,GAAK,EAAE,SAAS,EACvB,OACEsC,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CACC,SAAUJ,EACV,QAAQ,QACR,KAAK,SACL,QAAS,IAAMZ,EAAkB,EAAI,GACrCa,GAAA,cAACI,GAAA,CAAW,KAAK,SAAS,QAAQ,QAAQ,MAAM,SAC7C1C,GAAK,EAAE,eAAe,CACzB,CACF,CACF,CAEJ,GACAsC,GAAA,cAACK,GAAA,KACCL,GAAA,cAAC3C,GAAA,KACC2C,GAAA,cAACM,GAAA,CACC,SAAU3B,EACV,UAAS,GACT,QAAQ,YACR,YAAajB,GAAK,EAAE,oBAAoB,EACxC,UAAS,GACT,SAAU0B,EACV,MAAO,CAAE,OAAQ,EAAG,EACpB,MAAOV,EACT,EACAsB,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,UAAU,aAAa,EAE1CP,GAAA,cAACQ,GAAA,CACC,SAAUxB,EACV,KAAMH,EACN,aAAe4B,GAAS3B,EAAsB2B,CAAI,EAClD,YAAcC,GAAOzB,EAAYyB,CAAE,EACnC,KAAMlD,GACR,CACF,EAEAwC,GAAA,cAACO,GAAA,CAAQ,KAAK,KAAK,EACnBP,GAAA,cAAC7C,GAAA,KACEwC,GACCK,GAAA,cAACW,GAAA,KACCX,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,EACnBP,GAAA,cAACY,GAAA,CACC,MACElC,EACIhB,GAAK,EAAE,kBAAkB,EACzBA,GAAK,EAAE,iBAAiB,EAE9B,WAAagB,EAAwB,OAAV,QAC3B,QAAS,CAAC,CAACA,EACX,YACEA,EACIhB,GAAK,EAAE,8BAA8B,EACrCA,GAAK,EACH,wFACF,EAER,CACF,EAED,CAACiC,GACAK,GAAA,cAACa,GAAA,CACC,KAAMvB,EACN,YAAapB,EACb,QAAS4C,GACT,UAAW/B,EACb,CAEJ,CACF,EACAiB,GAAA,cAACe,EAAA,CACC,KAAM7B,EACN,QAASU,EACT,UAAWoB,EAAa,GACxBhB,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,EACnBP,GAAA,cAACiB,GAAA,CACC,KAAK,UACL,MAAOvD,GAAK,EAAE,eAAe,EAC7B,YACEsC,GAAA,cAAC1C,GAAA,KACC0C,GAAA,cAACI,GAAA,CAAW,QAAQ,OAAO,KAAK,UAC7B1C,GAAK,EACJ,yFACF,CACF,EACAsC,GAAA,cAACO,GAAA,CAAQ,KAAM,KAAM,EAErBP,GAAA,cAACI,GAAA,CAAW,QAAQ,OAAO,KAAK,SAC7B1C,GAAK,EACJ,iGACF,CACF,CACF,EAEJ,EACAsC,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,EAEnBP,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,EACnBP,GAAA,cAACG,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAASN,GACRnC,GAAK,EAAE,oBAAoB,CAC9B,EACAsC,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,EACnBP,GAAA,cAACG,GAAA,CACC,QAAQ,WACR,KAAK,UACL,KAAK,QACL,QAASP,GACTI,GAAA,cAACI,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,WAC7C1C,GAAK,EAAE,YAAY,CACtB,CACF,CACF,CACF,CAEJ,CAjLgBE,EAAAK,GAAA,eQ9EhB,OAAS,QAAAiD,OAAY,eACrB,OAAS,UAAAC,GAAQ,WAAAC,GAAS,UAAAC,GAAQ,eAAAC,OAAmB,gBACrD,OAAOC,OAAe,eACtB,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QAC3C,OAAS,eAAAC,OAAmB,mBCJ5B,OAAS,QAAAC,OAAY,eACrB,OAAS,UAAAC,OAAc,gBACvB,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QCD3C,OAAS,QAAAC,OAAY,eACrB,OAAS,WAAAC,GAAS,qBAAAC,GAAmB,cAAAC,OAAkB,gBACvD,OAAOC,OAAW,QCLlB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAkBD,GAAO,MAAO,CAC3C,QAAS,OACT,eAAgB,SAChB,cAAe,SACf,OAAQ,MACV,CAAC,EAEYE,GAAkBF,GAAO,MAAO,CAC3C,QAAS,OACT,eAAgB,gBAChB,WAAY,QACd,CAAC,EAEYG,GAAkBH,GAAO,MAAO,CAC3C,MAAO,OACT,CAAC,ECfD,OAAS,QAAAI,OAAY,eACrB,OAAS,UAAAC,OAAc,gBACvB,OAAOC,OAAW,QAMX,SAASC,GAAeC,EAAmC,CAChE,GAAM,CAAE,wBAAAC,EAAyB,aAAAC,CAAa,EAAIC,EAAc,EAE1DC,EAA6D,CACjE,CACE,MAAO,QACP,MAAOC,GAAK,EAAE,eAAe,CAC/B,EACA,CACE,MAAO,MACP,MAAOA,GAAK,EAAE,YAAY,CAC5B,EACA,CACE,MAAO,QACP,MAAOA,GAAK,EAAE,kBAAkB,CAClC,EACA,CACE,MAAO,aACP,MAAOA,GAAK,EAAE,gBAAgB,CAChC,EACA,CACE,MAAO,QACP,MAAOA,GAAK,EAAE,gBAAgB,CAChC,CACF,EAEA,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CACC,UAAWR,EAAM,UACjB,QAASI,EACT,MAAOF,EACP,gBAAkBO,GAAS,CACzBR,EAAwB,eAAgBQ,EAAK,KAAK,CACpD,EACA,QAAQ,SACV,CACF,CAEJ,CAvCgBC,EAAAX,GAAA,kBFUhB,IAAMY,GAAsB,EACrB,SAASC,GAAOC,EAAkB,CACvC,GAAM,CACJ,QAAAC,EACA,eAAAC,EACA,MAAAC,EACA,aAAAC,EACA,QAAAC,EAAU,GACV,iBAAAC,EAAmB,GACnB,UAAWC,CACb,EAAIP,EACE,CACJ,cAAAQ,EACA,OAAAC,EACA,wBAAAC,EACA,UAAAC,EACA,QAAAC,EACA,aAAAC,EACA,MAAAC,CACF,EAAIC,EAAc,EACZ,CAAE,SAAAC,EAAU,eAAAC,CAAe,EAAIC,EAAY,EAC3C,CAAE,UAAAC,CAAU,EAAID,EAAY,EAC5BE,EAAYb,GAAiBc,EAAa,EAC1CC,EAAY,CAAC,CAACb,GAAUA,EAAO,QAAQ,OACvCc,EAAeN,GAAkBD,EACjCQ,EAAkBC,EAACC,GAAsC,CAC7D,GAAI,CAACf,GAAa,CAACC,GAAW,CAACH,EAC7B,OAAO,KAET,IAAMkB,EAA6B,CACjC,cAAelB,EAAO,cACtB,GAAGiB,CACL,EAEA,OAAOE,GAAsBD,EAAa,CACxC,UAAAhB,EACA,QAAAC,EACA,aAAAW,EACA,UAAAJ,CACF,CAAC,CACH,EAfwB,mBAgBlBU,EACJf,GAAO,OAAS,GAChBA,GAAO,OAAS,EAEZgB,EAAarB,GAAQ,QACvBsB,GAAalB,EAAcJ,GAAQ,OAAO,EAC1C,CAAC,EAEL,OACEuB,GAAA,cAAAA,GAAA,cACG3B,GACC2B,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAW,KAAK,UAAU,QAAQ,SAChCC,GAAK,EAAE,SAAS,CACnB,EACAH,GAAA,cAACI,GAAA,CAAe,UAAWhB,EAAW,CACxC,EACAY,GAAA,cAACK,GAAA,CAAQ,KAAK,KAAK,CACrB,EAGDpC,GACC,MAAM,KAAK,CAAE,OAAQH,EAAoB,EAAG,CAACwC,EAAGC,IAC9CP,GAAA,cAACA,GAAM,SAAN,CAAe,IAAKO,GAClBjC,EACC0B,GAAA,cAACQ,GAAA,CAAkB,QAAO,GAAC,EAE3BR,GAAA,cAACS,GAAA,CACC,UAAW,GACX,KAAK,YACL,SAAU,GACZ,EAEDF,IAAUzC,GAAsB,GAAKkC,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,CAC3D,CACD,EAEF,CAACpC,GACA+B,GAAA,cAAAA,GAAA,cACGV,EACGQ,EAAW,IAAI,CAACJ,EAAOa,IAAU,CAC/B,IAAMG,EAAelB,EAAgBE,CAAK,EACpCiB,EAAaC,GAAclB,EAAM,KAAK,EACtCmB,EAAYf,EAAW,OAAS,IAAMS,EAE5C,OACEP,GAAA,cAACA,GAAM,SAAN,CAAe,IAAKN,EAAM,WACzBM,GAAA,cAACc,GAAA,CACC,aAAc1C,EACd,UAAWgB,EACX,SAAUZ,GAAe,YAAckB,EAAM,UAC7C,UAAW,GACX,MAAO,CAAE,GAAGA,EAAO,cAAejB,EAAO,aAAc,EACvD,QAASR,EACT,MAAO0C,GAAY,SAAW,KAC9B,QAASD,EACT,iBAAkBpC,EAClB,QAAUoB,GAAU,CACbiB,GACHjC,EAAwB,UAAWgC,CAAY,EAEjDhC,EACE,QACAiC,GAAY,SAAW,IACzB,EACAzC,EAAewB,CAAK,CACtB,EACA,KAAK,YACP,EACC,CAACmB,GAAab,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,CACpC,CAEJ,CAAC,EACDR,GACEG,GAAA,cAACe,GAAA,KACCf,GAAA,cAACgB,GAAA,CACC,KAAM1C,EAAmB,QAAU,QACnC,MAAOQ,EACP,MAAOX,EACT,CACF,CAER,CAEJ,CAEJ,CA/HgBsB,EAAA1B,GAAA,UGrBhB,OAAS,aAAAkD,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAYD,GAAO,MAAO,CACrC,WAAY,6CACZ,OAAQ,QACR,MAAO,QACP,QAAS,EACT,WAAY,MACZ,gBAAiB,cACjB,CAAC,IAAID,EAAS,IAAI,EAAG,CACnB,gBAAiB,aACnB,EAEA,SAAU,CACR,WAAY,CACV,QAAS,CACP,MAAO,OACT,EACA,KAAM,CACJ,MAAO,OACT,CACF,CACF,EAEA,cAAe,CACb,MAAO,EACP,OAAQ,EACR,QAAS,EACT,WAAY,CACd,CACF,CAAC,EAEYG,GAAUF,GAAO,MAAO,CACnC,SAAU,WACV,SAAU,SACV,QAAS,MACT,SAAU,EACV,QAAS,OACT,cAAe,SACf,UAAW,OACX,aAAc,WACd,gBAAiB,aACnB,CAAC,EJ1BM,IAAMG,GAA8B,IAEpC,SAASC,GAAeC,EAAkB,CAC/C,GAAM,CAAE,MAAAC,EAAO,QAAAC,EAAS,eAAAC,EAAgB,eAAAC,EAAgB,UAAAC,CAAU,EAAIL,EAChE,CAACM,EAAkBC,CAAmB,EAAIC,GAAS,EAAK,EACxDC,EAAiBH,EAAmB,GAAK,YACzC,CAAE,OAAAI,CAAO,EAAIC,EAAY,EACzBC,EAAmBF,GAAQ,UAAY,gBACvCG,EAAYC,GAAY,EAC9B,OAAAC,GAAU,IAAM,CACd,IAAIC,EAAgD,KAEpD,OAAIX,EACFW,EAAU,WAAW,IAAM,CACzBT,EAAoB,EAAI,CAC1B,EAAGT,EAA2B,GAE9BS,EAAoB,EAAK,EACrBS,GACF,aAAaA,CAAO,GAIjB,IAAM,CACPA,GACF,aAAaA,CAAO,CAExB,CACF,EAAG,CAACX,CAAS,CAAC,EAGZY,GAAA,cAACC,GAAA,CACC,WAAYR,GAAQ,UAAY,gBAAkB,OAAS,UAC3D,UAAW,GAAGD,CAAc,IAAIU,GAAgB,CAAC,GACjD,GAAIC,GAAa,iBACjBH,GAAA,cAACI,GAAA,CACC,MAAOC,GAAK,EAAE,QAAQ,EACtB,OACEL,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACM,GAAA,CAAe,UAAWV,EAAW,EACtCI,GAAA,cAACO,GAAA,CACC,UAAWX,EACX,eAAgBT,EAChB,OAAQ,CAAC,UAAW,gBAAiB,UAAU,EACjD,CACF,EAEJ,EACAa,GAAA,cAACQ,GAAA,KACCR,GAAA,cAACS,GAAA,CACC,aAAc,GACd,MAAOzB,EACP,QAAS,GACT,QAASC,EACT,UAAWY,GAAY,EACvB,eAAgBX,EAChB,iBAAkBS,EACpB,CACF,CACF,CAEJ,CA3DgBe,EAAA5B,GAAA,kBKhBhB,OAAS,QAAA6B,OAAY,eACrB,OAAS,aAAAC,OAAiB,gBAC1B,OAAOC,OAAW,QCJlB,OAAS,eAAAC,OAAmB,gBAC5B,OAAOC,OAAW,QCDlB,OAAS,aAAAC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAA4B,IAEnCC,GAAkBH,GAAU,CAChC,KAAM,CACJ,UAAW,2CACb,EACA,MAAO,CACL,UAAW,6CACb,EACA,MAAO,CACL,UAAW,8CACb,EACA,OAAQ,CACN,UAAW,6CACb,CACF,CAAC,EAEYI,GAAwBH,GAAO,MAAO,CACjD,SAAU,WACV,OAAQ,QACR,KAAM,MACN,UAAW,uBACX,OAAQ,SACV,CAAC,EAEYI,GAAeJ,GAAO,MAAO,CACxC,aAAc,MACd,OAAQ,wBACR,WAAY,cACZ,MAAO,MACP,OAAQ,MACR,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,MAAO,cACP,WAAY,CACV,QAAS,CACP,UAAW,GAAGE,EAAe,IAAID,EAAyB,yBAC5D,CACF,EACA,UAAW,CACT,MAAO,gBACP,UAAW,8BACX,UAAW,qCACb,CACF,CAAC,EDpCM,SAASI,IAAwB,CACtC,IAAMC,EAAkBC,EAAc,IAAI,gBAAgB,EAE1D,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CACC,QAAUC,GAAU,CAClB,IAAMC,EAASD,EAAM,cAErBC,EAAO,UAAU,IAAI,QAAQ,EAE7B,WAAW,IAAM,CACfA,EAAO,UAAU,OAAO,QAAQ,CAClC,EAAGC,EAAyB,EAC5BP,EAAgB,CAClB,GACAE,GAAA,cAACM,GAAA,CAAY,KAAM,GAAI,CACzB,CACF,CAEJ,CApBgBC,EAAAV,GAAA,yBEXhB,OAAS,UAAAW,OAAc,gBAEhB,IAAMC,GAAYD,GAAO,MAAO,CACrC,QAAS,OACT,cAAe,SACf,IAAK,KACL,UAAW,SACb,CAAC,EAEYE,GAAgBF,GAAO,MAAO,CACzC,SAAU,UACZ,CAAC,EHeM,SAASG,GAAOC,EAAkB,CACvC,GAAM,CAAE,cAAAC,EAAe,gBAAAC,EAAiB,aAAAC,EAAc,aAAAC,CAAa,EAAIJ,EACjE,CACJ,UAAAK,EACA,eAAAC,EACA,QAAAC,EACA,aAAAC,EACA,eAAAC,EACA,YAAAC,EACA,cAAAC,EACA,aAAAC,EACA,eAAAC,EACA,cAAAC,CACF,EAAIC,EAAc,EACZ,CAAE,iBAAAC,EAAkB,cAAAC,CAAc,EAAIC,EAAgB,EACtDC,EAAmBd,EAAYY,EAAcZ,CAAS,EAAI,KAC1De,EACJC,GAAcF,CAAgB,GAAG,QAAU,IAEvCG,EACFhB,GAAoBD,EAClBkB,EAAeJ,GAAkB,OAAQA,GAAkB,QAAQ,EACnE,IAEAK,EACJ,CAAC,CAAClB,GACFmB,GAAkBT,EAAkBV,EAAe,IAAI,EAEnDoB,EAAmC,CAACC,GACxCb,EACAJ,EACAC,CACF,EAEMiB,EAAoC,CAACD,GACzCb,EACAJ,EACAG,CACF,EAEMgB,EACJ,CAAClB,GAAiB,CAACE,GAAkB,CAACA,EAAe,GAAG,CAAC,EACrD,KACAiB,GAAenB,EAAc,SAAS,EAAGE,EAAe,SAAS,CAAC,EAExE,OACEkB,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CACC,MAAOC,GAAK,EAAE,MAAM,EACpB,KAAK,OACL,cAAe1B,EACf,QAASW,EACT,MAAO,CACL,YAAad,GAAgB,aAAe,GAC5C,MAAOA,GAAgB,MAAQ,EACjC,EACA,MAAO,CACL,YAAaD,GAAW,QAAU,GAClC,MAAOA,GAAW,OAAS,EAC7B,EACA,aAAc,IAAMF,EAAa,MAAM,EACvC,MAAO,CACL,MAAOO,EACP,SAAUgB,EACN,OACAH,EACEZ,EACA,EACA,CACF,EACJ,aAAce,EACV,OACAf,GAAe,SAAS,EAC5B,MAAOe,EACHU,GAAc,EAAE,kBAAkB,YAClC,MACN,EACA,SAAUlC,IAAoB,SAC9B,QAASA,IAAoB,UAC7B,eAAgBsB,EAChB,iBAAkBa,EAAa,EAC/B,mBAAoB,IAAM,CACxB5B,EAAea,EAAiB,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,CACrD,EACA,mBAAoBN,EAAiB,OAAS,EAChD,EACAe,GAAA,cAACO,GAAA,IAAsB,CACzB,EACAP,GAAA,cAACG,GAAA,CACC,iBAAkB,CAAC9B,IAAiB,CAAC,CAACU,GAAiBb,GACvD,MAAOkC,GAAK,EAAE,IAAI,EAClB,KAAK,KACL,cAAelC,EACf,MAAO,CACL,YAAaO,GAAc,aAAe,GAC1C,MAAOA,GAAc,MAAQ,EAC/B,EACA,MAAO,CACL,YAAaD,GAAS,QAAU,GAChC,MAAOA,GAAS,OAAS,EAC3B,EACA,iBAAkBgB,EAChBO,GAAenB,EAAeE,CAAc,EAC5C,EACA,CACF,EACA,aAAc0B,GAAoBV,GAAoB,CAAC,EACvD,MAAO,CACL,MAAON,EACLX,EACA,EACA,CACF,EACA,SAAUgB,EACN,OACAL,EACEV,EACA,EACA,CACF,EACJ,UAAWD,GAAc,SAAS,EAClC,aAAcgB,EACV,OACAf,GAAgB,SAAS,EAC7B,MAAOe,EACHQ,GAAc,EAAE,kBAAkB,YAClC,MACN,EACA,aAAc,IAAMjC,EAAa,IAAI,EACrC,SAAUD,IAAoB,SAC9B,QAASA,IAAoB,UAC7B,iBAAkBmC,EAAa,EACjC,CACF,CAEJ,CAxIgBG,EAAAzC,GAAA,UIxBhB,OAAS,eAAA0C,GAAa,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QCKlD,SAASC,IAGd,CACA,GAAM,CAAE,MAAAC,EAAO,QAAAC,EAAS,YAAAC,CAAY,EAAIC,GAGtC,CACA,QAAS,MAAOC,EAAaC,IAC3B,MAAMC,GAAY,EAAE,aAAaF,EAAaC,CAAO,CACzD,CAAC,EAED,MAAO,CAAE,MAAAL,EAAO,QAAAC,EAAS,YAAAC,CAAY,CACvC,CAbgBK,EAAAR,GAAA,qBDoBhB,IAAMS,GAAiB,IAmBhB,SAASC,GAAa,CAC3B,aAAAC,CACF,EAAoC,CAClC,GAAM,CAAE,MAAOC,EAAY,YAAAC,CAAY,EAAIC,GAAkB,EACvD,CACJ,wBAAyBC,EACzB,SAAAC,EACA,0BAAAC,CACF,EAAIC,EAAY,EAAE,OACZC,EAAmBC,EAAgB,IAAI,iBAAiB,EAExD,CACJ,UAAAC,EACA,QAAAC,EACA,YAAAC,EACA,cAAAC,EACA,cAAAC,EACA,aAAAC,EACA,WAAAC,EACA,MAAAC,EACA,QAAAC,EACA,iBAAAC,EACA,wBAAAC,CACF,EAAIC,EAAc,EACZ,CACJ,SAAAC,EACA,eAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,YAAAC,CACF,EAAIpB,EAAY,EACVqB,EAAmBrB,EAAY,EAAE,oBAAoB,EACrDsB,EAA2BtB,EAAY,EAAE,4BAA4B,EACrEuB,EAA0BvB,EAAY,EAAE,wBAAwB,EAChE,CAAE,UAAAwB,CAAU,EAAIxB,EAAY,EAE5B,CAACyB,EAASC,CAAU,EAAIC,GAAS,EAAI,EACrCC,EAAkBC,GAAOxB,CAAW,EACpCyB,GAAed,GAAkBD,EAEjCgB,EADqB,CAAC5B,GAAa,CAACC,GAGxC4B,GAAe7B,EAAWC,CAAO,GACjC,CAAC6B,GAAiB5B,CAAW,EAEzB6B,EAAaC,EAACV,IAAqB,CACvCC,EAAWD,EAAO,CACpB,EAFmB,cAIbW,GAAQD,EAACE,IAA6B,CAC1C,GAAM,CACJ,UAAAlC,GACA,QAAAC,GACA,YAAAC,EACA,iBAAAgB,GACA,wBAAAE,GACA,yBAAAD,GACA,SAAAP,GACA,aAAAG,EACA,iBAAAD,EACA,iBAAAE,CACF,EAAIkB,GAKJ,GAHKZ,GACHS,EAAW,EAAI,EAEb,CAACH,GAAqB5B,IAAaC,GAAS,CAC9CK,EAAW,EACX,IAAM6B,GAAcC,GAAuB,CACzC,UAAApC,GACA,QAAAC,GACA,YAAAC,EACA,iBAAkBgB,GAClB,wBAAAE,GACA,yBAAAD,GACA,QAASrB,EACT,SAAAc,GACA,aAAAG,EACA,iBAAAD,EACA,iBAAAE,EACA,0BAAApB,CACF,CAAC,EACGyC,GAAiB,oBAAqB1C,CAAQ,IAChDwC,GAAY,aAAe,IAE7B5C,EAAW4C,EAAW,EACnB,KAAMG,IAAQ,CACb,IAAMC,GAAaC,GAAanC,EAAciC,GAAI,OAAO,EACnDG,GAAQC,GACZtC,EACAmC,GACAD,GAAI,aACN,EAEAf,EAAW,EAAK,EAChBb,EAAwB,SAAU4B,EAAG,EACrC7B,EAAiBgC,EAAK,EAEtBE,GAA+B,CAC7B,kBAAmBL,GAAI,kBACvB,UAAWG,IAAO,WAAa,GAC/B,MAAOA,IAAO,KAChB,CAAC,EACD,IAAMG,GACJC,GAAwBJ,EAAK,GAAKxC,IAAS,SACvCE,GACJ2C,GAA0BL,EAAK,GAAKzC,IAAW,SAC3C+C,GACJN,IACAO,GAAsBP,GAAO,CAC3B,UAAW,CAAE,GAAGzC,GAAW,SAAUG,EAAc,EACnD,QAAS,CAAE,GAAGF,GAAS,SAAU2C,EAAe,EAChD,aAAAjB,GACA,UAAAN,CACF,CAAC,EACHX,EAAwB,UAAWqC,EAAY,CACjD,CAAC,EACA,MAAOxC,IAAU,CAChB,GAAM,CAAE,MAAO0C,EAAW,EAAIC,GAAkB3C,EAAK,GAEnD0C,IAAY,OAAS,GACrBA,IAAY,OAAS,IAErB3C,EAAW,EAET2C,IAAY,OAAS,IACvBvC,EAAwB,QAASuC,EAAU,EAC3C1B,EAAW,EAAK,EAEpB,CAAC,CACL,CACF,EAlFc,SAoFR4B,EAAiBC,GACrBC,GAAUnB,IAA6B,CACrCD,GAAMC,EAAM,CACd,EAAGoB,EAAc,EACjB,CAAC1B,CAAiB,CACpB,EAEA,OAAA2B,GAAU,IAAM,CACd,GAAI,CAACjE,EAAc,CACjBiC,EAAW,EAAK,EAChB,MACF,CACA,GAAIN,IAAgB,UAClB,OAEF,GAAIW,EAAmB,CACrBL,EAAW,EAAK,GACZnB,GAAiBG,GAASC,IAC5BF,EAAW,EAEb,MACF,CACA,GAAI,CAACwB,GAAiB5B,CAAW,GAAKC,GAAe,GAAG,CAAC,EAAG,CAC1D4B,EAAW,EAAK,EAChBvC,EAAY,EACZ,MACF,CAEAc,EAAW,EACXyB,EAAW,EAAI,EAEf,IAAIyB,GAAcvB,GAClB,OAAIR,EAAgB,SAAWA,EAAgB,SAAWvB,IACxDsD,GAAcL,GAEhB1B,EAAgB,QAAUvB,EAE1BsD,GAAY,CACV,YAAAtD,EACA,UAAAF,EACA,QAAAC,EACA,iBAAAiB,EACA,wBAAAE,EACA,yBAAAD,EACA,SAAUQ,GACV,aAAAZ,EACA,iBAAAD,EACA,iBAAAE,CACF,CAAC,EACMxB,CACT,EAAG,CACDyB,EACAf,EACAF,GAAW,OACXA,GAAW,QACXA,GAAW,WACXC,GAAS,OACTA,GAAS,QACTA,GAAS,WACT2B,EACAV,GAAkB,OAClBxB,EACAyB,EAAyB,OACzBQ,GACAZ,EACAD,EACA,KAAK,UAAUE,CAAgB,CACjC,CAAC,EAEM,CACL,MAAO,IACLiB,GAAM,CACJ,YAAA/B,EACA,UAAAF,EACA,QAAAC,EACA,iBAAAiB,EACA,wBAAAE,EACA,yBAAAD,EACA,SAAUQ,GACV,aAAAZ,EACA,iBAAAD,EACA,iBAAAE,CACF,CAAC,EACH,QAAAM,CACF,CACF,CA3NgBU,EAAA3C,GAAA,gBEtCT,SAASoE,GAAqBC,EAAgBC,EAA0B,CAC7E,IAAIC,EAAmB,GAEjBC,EAAkB,CACtB,gBAAiB,CACfD,EAAmB,EACrB,EACA,GAAIF,EAAM,UAAY,QAAa,CAAE,QAASA,EAAM,OAAQ,CAC9D,EAEAI,GAAa,eAA2B,CACtC,KAAMJ,EAAM,KACZ,QAASG,CACX,CAAC,EAEID,GACHD,EAAO,CAEX,CAlBgBI,EAAAN,GAAA,wBZkBhB,IAAMO,GAAgBC,GAAO,MAAO,CAClC,QAAS,OACT,WAAY,aACZ,UAAW,IACX,mBAAoB,CAClB,WAAY,cACd,CACF,CAAC,EACYC,GAAgC,IAEtC,SAASC,IAAO,CACrB,IAAMC,EAAWC,GAAY,EACvB,CACJ,UAAAC,EACA,QAAAC,EACA,YAAAC,EACA,cAAAC,EACA,aAAAC,EACA,MAAOC,EACP,QAASC,EACT,OAAAC,EACA,iBAAAC,EACA,kBAAAC,EACA,0BAAAC,EACA,wBAAAC,CACF,EAAIC,EAAc,EACZ,CAACC,EAAmBC,CAAoB,EAAIC,GAAkB,EAAK,EACnE,CAAE,cAAAC,EAAe,mBAAAC,CAAmB,EAAIC,GAAgB,EAExD,CAAE,MAAOC,EAAY,QAAAC,CAAQ,EAAIC,GAAa,CAAE,aAAAjB,CAAa,CAAC,EAC9D,CAAE,OAAAkB,EAAQ,YAAaC,CAAgB,EAAIC,EAAY,EAEvD,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EACvC,CAAE,YAAAC,CAAY,EAAIC,GAAW,EAC7B,CAACC,EAAuBC,CAAwB,EAAIf,GAAS,EAAK,EAIlEgB,EAAkBC,GAAmB,CACzC,gBAAAT,EACA,cAAeH,EACf,YAAAlB,EACA,MAAOC,EACP,mBAAoBsB,EAAiB,OAAS,EAC9C,MAAOpB,EACP,QAASC,EACT,qBAV2B,EAW7B,CAAC,EAEK2B,EAAeC,GACnBlB,EACAC,EACAK,GAAQ,OACV,EAEMa,EACJ,CAAC,CAACjC,GACF,CAAC,CAACF,GACF,CAAC,CAACC,GACF,IAAImC,GAAUlC,CAAW,EAAE,GAAG,CAAC,GAC/B,CAACmC,GAAkBrC,EAAWC,CAAO,EAEjCqC,EAAgBH,GAAaZ,IAAoB,WAAaH,EAK9DmB,IAFJ,CAACN,GAAiBA,GAAgB1B,GAAQ,QAAQ,UAC1BD,GAAgBD,GAG1CmC,GAAU,IAAM,CACd/B,EAAkB,EAClBE,EAAwB,eAAgB,EAAI,CAC9C,EAAG,CAAC,CAAC,EAEL6B,GAAU,IAAM,CACd1B,EAAqBqB,CAAS,CAChC,EAAG,CAACA,CAAS,CAAC,EAEd,IAAMM,GACDtC,GAAiBE,IAAe,CAACwB,EAChCV,EACA,OAEAuB,EAAqBC,EAACC,GAAkB,CACxCX,GAAgBpB,GAClBC,EAAqB,EAAK,EAC1B,WAAW,IAAM,CACfhB,EAAS8C,CAAK,CAChB,EAAGhD,EAA6B,GAEhCE,EAAS8C,CAAK,CAElB,EAT2B,sBAUrBC,GAAiBF,EAACG,GAAyB,CAC3C3C,GAAe,YAAc2C,EAAM,YACrChB,EAAyB,EAAK,EAC9BtB,EAAiBsC,CAAK,EAE1B,EALuB,kBAMvB,OACEC,GAAA,cAACrD,GAAA,KACCqD,GAAA,cAACC,GAAA,CACC,OAAO,OACP,OACED,GAAA,cAACE,GAAA,CACC,KAAK,UACL,KAAK,QACL,SAAUlB,EAAgB,UAAY,CAACJ,EACvC,OACEI,EAAgB,SAAW,mBAAqBgB,GAAA,cAACG,GAAA,IAAY,EAE/D,UAAS,GACT,QAAS,IAAM,CACTnB,EAAgB,SAAW,iBAC7BoB,GACE,CAAE,yBAAwC,EAC1C,IAAMT,EAAmBU,EAAiB,OAAO,CACnD,EACSrB,EAAgB,SAAW,kBACpCD,EAAyB,EAAI,EAE7BY,EAAmBU,EAAiB,WAAW,CAEnD,GACCrB,EAAgB,KACnB,EAEF,OAAQ,CACN,SAAU,IAAM,CACdW,EAAmBU,EAAiB,OAAO,CAC7C,EACA,cAAe,GACf,MAAO9B,EAAO,OAAS+B,GAAK,EAAE,MAAM,EACpC,OACEN,GAAA,cAACO,GAAA,CACC,OAAQrB,EAAe,CAAC,SAAS,EAAI,OACrC,eAAgBQ,EAChB,eAAgB,IAAMC,EAAmBU,EAAiB,KAAK,EAC/D,gBAAiB,IAAM,CACrBV,EAAmBU,EAAiB,QAAQ,CAC9C,EACF,CAEJ,GACAL,GAAA,cAACQ,GAAA,KACCR,GAAA,cAACS,GAAA,CACC,cAAelB,EACf,gBAAiBf,EACjB,aAAcU,EACd,aAAewB,GAAS,CACtBf,EACEe,IAAS,OACLL,EAAiB,SACjBA,EAAiB,MACvB,CACF,EACF,EACAL,GAAA,cAACW,GAAA,CAAQ,KAAK,IAAI,EAChBzB,EAiBE,KAhBFc,GAAA,cAACY,GAAA,CACC,MAAOxD,EACP,QAASmC,EACT,MAAOjC,EACP,UAAW,GACX,QAASC,EACT,KAAK,QACL,iBACIC,GAAUA,EAAO,QAAQ,OAAS,EAChC,IAAM,CACJI,EAAwB,eAAgB,EAAK,EAC7C+B,EAAmBU,EAAiB,MAAM,CAC5C,EACA,OAER,EAGDb,GACCQ,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACW,GAAA,CAAQ,KAAK,KAAK,EACnBX,GAAA,cAACa,GAAA,CACC,QAAStD,EACT,MAAOD,EACP,oBAAqB,GACrB,aAAcc,EACd,iBAAkBU,EAClB,qBAAsB,CAACF,EACvB,mBAAoB,IAAMG,EAAyB,EAAI,EACvD,oBAAqB,IAAMA,EAAyB,EAAK,EACzD,sBAAuB,IAAM,CAC3BA,EAAyB,EAAK,EAC9BpB,EAA0B,EAAI,EAC9BgC,EAAmBU,EAAiB,WAAW,CACjD,EACA,iBAAkB,IAChBV,EAAmBU,EAAiB,QAAQ,EAEhD,CACF,EACE,IACN,CACF,EACCnB,EACCc,GAAA,cAACc,GAAA,CACC,QAASvB,EACT,eAAgBO,GAChB,MAAO1B,EACP,eAAgBsB,EAChB,UAAW5B,EACb,EACE,IACN,CAEJ,CA3MgB8B,EAAA9C,GAAA,QapChB,OAAS,QAAAiE,OAAY,eACrB,OACE,SAAAC,GACA,WAAAC,GACA,QAAAC,GACA,kBAAAC,GACA,SAAAC,GACA,aAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QCKX,SAASC,IAA2B,CACzC,GAAM,CAAE,YAAAC,EAAa,SAAAC,EAAU,OAAAC,CAAO,EAAIC,EAAY,EAChDC,EAAYC,GACZC,EAAkBJ,GAAQ,UAAYK,GAE5C,MAAO,CACL,eAAgBN,GAAYK,EAC5B,UAAAF,EACA,gBAAAE,EACA,eAAiBL,GAAaD,EAAYC,GAAYM,EAAgB,EACtE,cAAe,IAAMP,EAAY,IAAI,CACvC,CACF,CAZgBQ,EAAAT,GAAA,eDCT,SAASU,IAAe,CAC7B,GAAM,CAAE,eAAAC,EAAgB,eAAAC,EAAgB,UAAAC,CAAU,EAAIC,GAAY,EAC5DC,EAAeC,GAAgB,EAE/BC,EAAeJ,EAAU,IAAKK,GAAiB,CACnD,GAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,QAAAC,CAAQ,EAAIH,EAClC,MAAO,CACL,GAAIC,EACJ,MAAOA,EACP,MACEG,GAAA,cAACC,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BH,CACH,EAEF,QAAS,IAAM,CACbR,EAAeM,EAAa,KAAK,EACjCH,EAAa,CACf,EACA,IAAKO,GAAA,cAACE,GAAA,CAAM,MAAOL,EAAO,EAC1B,MAAOG,GAAA,cAACD,EAAA,IAAQ,CAClB,CACF,CAAC,EAED,OACEC,GAAA,cAACG,GAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,UAAU,CAC1B,GACAJ,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CACC,KAAK,UACL,QAAQ,QACR,MAAM,oDACR,EACAN,GAAA,cAACO,GAAA,CAAQ,KAAM,IAAK,EACpBP,GAAA,cAACQ,GAAA,CAAU,MAAOnB,GAChBW,GAAA,cAACS,GAAA,CACC,KACET,GAAA,cAACU,GAAA,CACC,MAAON,GAAK,EAAE,UAAU,EACxB,GAAG,IACH,QAAS,IAAM,QAAQ,IAAI,EAC7B,EAEF,MAAOT,EACT,CACF,CACF,CACF,CAEJ,CAlDgBgB,EAAAvB,GAAA,gBEbhB,OAAS,QAAAwB,OAAY,eACrB,OACE,UAAAC,GACA,YAAAC,GACA,SAAAC,GACA,kBAAAC,GACA,YAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,IAAS,YAAAC,OAAgB,QCZhC,OAAS,YAAAC,GAAU,YAAAC,OAAgB,gBACnC,OAAOC,OAAW,QCDlB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAsBD,GAAO,KAAM,CAC9C,QAAS,WACT,OAAQ,EACR,UAAW,OACX,OAAQ,OACR,UAAW,OACX,SAAU,CACR,SAAU,CACR,KAAM,CACJ,cAAe,MACjB,CACF,CACF,CACF,CAAC,EAEYE,GAAwBF,GAAO,MAAO,CACjD,MAAO,GACP,QAAS,OACT,eAAgB,UAClB,CAAC,EAEYG,GAAoBH,GAAO,MAAO,CAC7C,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,OAAQ,MACV,CAAC,EC7BD,OAAS,YAAAI,GAAU,UAAAC,OAAc,gBAE1B,IAAMC,GAAiBD,GAAOD,GAAU,CAC7C,OAAQ,EACV,CAAC,EFGD,IAAMG,GAAsB,GACrB,SAASC,IAA6B,CAC3C,OACEC,GAAA,cAACC,GAAA,KACE,MAAM,KAAK,MAAMH,EAAmB,EAAG,CAACI,EAAGC,IAC1CH,GAAA,cAACI,GAAA,CACC,WAAU,GACV,IAAKD,EACL,MAAOH,GAAA,cAACK,GAAA,CAAS,QAAQ,WAAW,MAAO,GAAI,OAAQ,GAAI,EAC3D,MAAOL,GAAA,cAACK,GAAA,CAAS,QAAQ,OAAO,KAAK,QAAQ,MAAO,GAAI,EACxD,IAAKL,GAAA,cAACM,GAAA,CAAS,QAAS,GAAO,EACjC,CACD,CACH,CAEJ,CAdgBC,EAAAR,GAAA,8BDsBT,SAASS,GAAoB,CAAE,WAAAC,CAAW,EAAc,CAC7D,IAAMC,EAAcC,EAAY,EAAE,YAC5BC,EAAWD,EAAY,EAAE,SAAS,EAClCE,EAA2BF,EAAY,EAAE,4BAA4B,EACrE,CAACG,EAAaC,CAAc,EAAIC,GAAiB,EAAE,EACnDC,EAAwBN,EAAY,EAAE,sBACtCO,EAAeP,EAAY,EAAE,iBAAiB,EAC9CQ,EACJC,GAAwBR,EAAUC,CAAwB,EAEtDQ,EAAQ,CAAE,UAAWC,GAAK,EAAE,WAAW,EAAG,QAASA,GAAK,EAAE,SAAS,CAAE,EACrEC,EAAiC,CAAC,EACpCd,IAAe,aACjBc,EAAW,KAAK,KAAK,EAEnBd,IAAe,WACjBc,EAAW,KAAK,SAAU,aAAc,WAAW,EAGrD,IAAMC,EAAmBL,EAA8B,OAAQM,GAC7DF,EAAW,SAASE,EAAW,IAAI,CACrC,EAEMC,EACJF,EAAiB,SACjBA,EAAiB,OAAQG,GAAeA,EAAW,QAAQ,EAAE,OAEzDC,EAAmBC,EAAA,IAAM,CAC7BL,EAAiB,QAASG,GAAe,CACnCD,EACFT,EAAsBU,EAAW,UAAU,EAEtCA,EAAW,UACdV,EAAsBU,EAAW,UAAU,CAGjD,CAAC,CACH,EAVyB,oBAYnBG,EAAON,EAAiB,IAAKG,GAAe,CAChD,GAAM,CAAE,SAAAI,EAAU,WAAAC,EAAY,KAAAC,CAAK,EAAIN,EACvC,MAAO,CACL,MAAOO,GAAA,cAACC,GAAA,CAAM,IAAKF,EAAM,KAAM,GAAI,KAAK,WAAW,EACnD,QAAS,IAAM,CACRf,GACHD,EAAsBe,CAAU,CAEpC,EACA,IAAKE,GAAA,cAACE,GAAA,CAAS,QAASL,EAAU,SAAUb,EAAc,EAC1D,MACEgB,GAAA,cAACG,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9Bf,GAAK,EAAEU,CAAU,CACpB,EAEF,GAAGL,CACL,CACF,CAAC,EAEKW,EAAeT,EAACU,GAA+C,CACnE,IAAMC,EAAQD,EAAM,OAAO,MAC3BxB,EAAeyB,CAAK,CACtB,EAHqB,gBAKjBC,EAAeX,EACnB,OAAIhB,IACF2B,EAAeX,EAAK,OAAQH,GAC1Be,GAAaf,EAAW,WAAYb,CAAW,CACjD,GAIAoB,GAAA,cAACS,GAAA,CACC,OAAQ,CACN,MAAOrB,GAAK,EAAEb,CAAU,EACxB,OACEyB,GAAA,cAACU,GAAA,KACCV,GAAA,cAACW,GAAA,CAAO,QAAQ,QAAQ,KAAK,SAAS,QAASjB,GAC5CF,EAAeJ,GAAK,EAAE,cAAc,EAAIA,GAAK,EAAE,YAAY,CAC9D,CACF,CAEJ,GACAY,GAAA,cAACY,GAAA,CAAc,KAAI,IACjBZ,GAAA,cAACa,GAAA,CACC,MAAOjC,EACP,SAAUC,EACV,UAAS,GACT,MAAM,QACN,QAAQ,YACR,YAAaO,GAAK,EAAE,sBAAuB,CACzC,WAAYD,EAAMZ,CAAU,CAC9B,CAAC,EACD,SAAU6B,EACZ,EACC5B,IAAgB,WAAawB,GAAA,cAACc,GAAA,IAA2B,EAEzD,CAACP,EAAa,QAAY3B,EACzBoB,GAAA,cAACe,GAAA,KACCf,GAAA,cAACgB,GAAA,CACC,MAAO5B,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAAE,8BAA8B,EACpD,CACF,EAEAZ,IAAgB,WACdwB,GAAA,cAACiB,GAAA,CAAoB,SAAUjC,GAC5BuB,EAAa,IAAKd,GAAe,CAChC,GAAM,CAAE,WAAAK,EAAY,GAAGoB,CAAW,EAAIzB,EAEtC,OACEO,GAAA,cAACA,GAAM,SAAN,CAAe,IAAKP,EAAW,IAC9BO,GAAA,cAACmB,GAAA,CACC,MAAO,CAAE,OAAQ,MAAO,EACvB,GAAGD,EACJ,SAAU,GACV,WAAU,GACZ,CACF,CAEJ,CAAC,CACH,CAGN,CACF,CAEJ,CA9HgBvB,EAAArB,GAAA,uBI5BhB,OAAS,QAAA8C,OAAY,eACrB,OAAOC,OAAW,QAClB,OAAS,eAAAC,OAAmB,mBAUrB,SAASC,IAAa,CAC3B,IAAMC,EAAWC,GAAY,EACvBC,EAAeC,GAAgB,EAC/B,CACJ,cAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,wBAAAC,EACA,MAAOC,CACT,EAAIC,EAAc,EAEZ,CAAE,MAAOC,EAAY,QAASC,CAAc,EAAIC,GAAa,CACjE,aAAAP,CACF,CAAC,EAEKQ,EAAiBC,EAACC,GAAyB,CAC/CT,EAAiBS,CAAK,EACtBR,EAAwB,eAAgB,EAAK,EAC7CL,EAAa,CACf,EAJuB,kBAMjBc,EAAe,MAAMC,EAAiB,QAAQ,GAC9CC,EAAc,MAAMD,EAAiB,OAAO,GAClD,OACEE,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,SAAU,IAAM,CACdpB,EAASkB,CAAW,EACpBX,EAAwB,eAAgB,EAAI,CAC9C,EACA,OAAQ,IAAM,CACZA,EAAwB,eAAgB,EAAK,CAC/C,EACA,MAAOc,GAAK,EAAE,QAAQ,EACtB,OACEF,GAAA,cAACG,GAAA,CACC,eACIlB,GAAiBI,EAAaE,EAAa,OAE/C,OAAQ,CAAC,gBAAiB,SAAS,EACnC,gBAAiB,IAAM,CACrBV,EAASgB,CAAY,EACrBT,EAAwB,eAAgB,EAAI,CAC9C,EACF,CAEJ,GACAY,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACK,GAAA,CACC,MAAOd,EACP,QAASC,EACT,eAAgBE,EAClB,CACF,CACF,CAEJ,CAxDgBC,EAAAf,GAAA,cCdhB,OAAS,QAAA0B,OAAY,eACrB,OACE,WAAAC,GACA,sBAAAC,GACA,0BAAAC,OACK,gBACP,OAAOC,IAAS,YAAAC,OAAgB,QAChC,OAAS,eAAAC,OAAmB,mBCJ5B,OAAS,QAAAC,OAAY,eACrB,OACE,WAAAC,GACA,SAAAC,GACA,kBAAAC,GACA,YAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QCPpC,IAAMC,GAAoBC,EAAA,CAC/BC,EACAC,EACAC,IAEAF,EACG,OAAQG,GACPC,GAA2BD,EAAW,KAAMD,CAAkB,CAChE,EACC,OACEC,GACCE,GAAaF,EAAW,KAAMF,CAAW,GACzCI,GAAaF,EAAW,YAAaF,CAAW,CACpD,EAb6B,qBCJjC,OAAS,kBAAAK,GAAgB,UAAAC,OAAc,gBAIhC,IAAMC,GAA0BC,GAAO,MAAO,CACnD,QAAS,OACT,cAAe,SACf,SAAU,SACV,OAAQ,OACR,eAAgB,QAClB,CAAC,EAEYC,GAAOD,GAAOE,GAAgB,CACzC,QAAS,EACT,OAAQ,EACR,UAAW,OAEX,CAAC,KAAKC,EAAc,EAAE,EAAG,CACvB,aAAc,MACd,SAAU,QACZ,CACF,CAAC,ECrBD,OAAS,YAAAC,GAAU,YAAAC,OAAgB,gBACnC,OAAOC,OAAW,QAIlB,IAAMC,GAAsB,GACrB,SAASC,IAAwB,CACtC,OACEC,GAAA,cAACC,GAAA,KACE,MAAM,KAAK,MAAMH,EAAmB,EAAII,GACvCF,GAAA,cAACG,GAAA,CACC,IAAKD,EACL,WAAU,GACV,MAAOF,GAAA,cAACI,GAAA,CAAS,QAAQ,WAAW,MAAO,GAAI,OAAQ,GAAI,EAC3D,MAAOJ,GAAA,cAACI,GAAA,CAAS,QAAQ,OAAO,KAAK,QAAQ,MAAO,GAAI,EAC1D,CACD,CACH,CAEJ,CAbgBC,EAAAN,GAAA,yBHaT,SAASO,GAAeC,EAAkB,CAC/C,GAAM,CACJ,KAAAC,EACA,YAAAC,EACA,SAAAC,EACA,mBAAAC,EACA,UAAAC,EAAY,EACd,EAAIL,EACE,CAACM,EAAaC,CAAc,EAAIC,GAA2BP,CAAI,EAC/D,CAAE,YAAAQ,CAAY,EAAIC,EAAY,EAEpCC,GAAU,IAAM,CACdJ,EAAe,CACb,GAAGK,GAAkBX,EAAMC,EAAaE,CAAkB,CAC5D,CAAC,CACH,EAAG,CAACH,EAAMC,EAAaE,CAAkB,CAAC,EAE1C,IAAMS,EAAaC,EAAA,IACb,CAACR,EAAY,QAAYJ,EAEzBa,GAAA,cAACC,GAAA,CACC,MAAOC,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAAE,8BAA8B,EACpD,EAIFF,GAAA,cAACG,GAAA,CAAK,GAAG,KAAK,IAAK,GAAGd,CAAkB,IAAIF,CAAW,IACpDI,EAAY,IAAKa,GAChBJ,GAAA,cAACK,GAAA,CACC,IAAK,GAAGD,EAAK,IAAI,IAAIA,EAAK,OAAO,GACjC,WAAU,GACV,QAAS,IAAMhB,EAASgB,CAAI,EAC5B,MAAOJ,GAAA,cAACM,GAAA,CAAM,IAAKF,EAAK,KAAM,KAAM,GAAI,EACxC,MACEJ,GAAA,cAACO,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9BH,EAAK,WACR,EAEF,GAAIA,EAAK,QACX,CACD,CACH,EAzBe,cA6BnB,OACEJ,GAAA,cAAAA,GAAA,cACGV,GACCU,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACO,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BL,GAAK,EAAE,mBAAmB,CAC7B,EACAF,GAAA,cAACQ,GAAA,CAAQ,KAAM,EAAG,CACpB,EAEFR,GAAA,cAACS,GAAA,KACEf,IAAgB,WAAaM,GAAA,cAACU,GAAA,IAAsB,EACpDhB,IAAgB,WAAaI,EAAW,CAC3C,CACF,CAEJ,CA9DgBC,EAAAf,GAAA,kBDET,SAAS2B,GAAqBC,EAAkB,CACrD,GAAM,CAAE,KAAAC,CAAK,EAAID,EACXE,EAAeC,GAAgB,EAC/B,CAACC,EAAaC,CAAc,EAAIC,GAAiB,EAAE,EACnD,CAACC,EAAoBC,CAAqB,EAAIF,GAAiB,KAAK,EACpEG,EAAkBC,EAAc,IAAI,gBAAgB,EACpDC,EAAoBD,EAAc,IAAI,kBAAkB,EACxD,CAAE,YAAAE,CAAY,EAAIC,EAAY,EAC9BC,EAAWC,GAAY,EAEvBC,EAAcH,EAAY,EAAE,YAAY,CAC5C,KAAAZ,CACF,CAAC,EACKgB,EAAwBC,GAAmBF,CAAW,EAEtDG,EAAe,CAACnB,EAAM,cAAgBiB,IAA0B,EAEtE,OACEG,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,mBAAmB,CACnC,GACAF,GAAA,cAACG,GAAA,CAAc,KAAI,IAChBJ,GACCC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACI,GAAA,CACC,YAAahB,EACb,SAAUD,EACV,YAAaS,EACb,UAAWJ,IAAgB,UAC7B,EACAQ,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,CACrB,EAGFL,GAAA,cAACM,GAAA,CACC,MAAOtB,EACP,UAAS,GACT,YAAakB,GAAK,EAAE,mBAAmB,EACvC,MAAM,QACN,QAAQ,YACR,KAAK,QACL,SAAU,IAAMjB,EAAe,EAAE,EACjC,SAAWsB,GAAUtB,EAAesB,EAAM,OAAO,KAAK,EACxD,EACAP,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EAEnBL,GAAA,cAACQ,GAAA,CACC,KAAMZ,EACN,UAAWf,IAAS,eACpB,YAAaG,EACb,mBAAoBG,EACpB,SAAWsB,GAAe,CACpB5B,IAAS,eACXa,EAAS,iBAAiBe,EAAW,IAAI,GAAI,CAAE,QAAS,EAAK,CAAC,GAE1D5B,IAAS,SACXU,EAAkBkB,CAAU,EAE5BpB,EAAgBoB,CAAU,EAE5B3B,EAAa,EAEjB,EACF,CACF,CACF,CAEJ,CApEgB4B,EAAA/B,GAAA,wBKnBhB,OAAS,QAAAgC,OAAY,eACrB,OAAS,WAAAC,OAAe,gBACxB,OAAOC,IAAS,YAAAC,OAAgB,QAChC,OAAS,eAAAC,OAAmB,mBCF5B,OAAS,QAAAC,OAAY,eACrB,OACE,mBAAAC,GACA,WAAAC,GACA,SAAAC,GACA,YAAAC,GACA,WAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QCNlB,OAAS,aAAAC,OAAiB,QCNnB,IAAMC,GAAwB,CAAC,MAAO,SAAU,SAAS,ECQzD,SAASC,GACdC,EACAC,EACAC,EACe,CAOf,IAAMC,EAAyB,KAAK,MAAM,KAAK,UAAUH,CAAW,CAAC,EACjEI,EAAyB,CAAC,EAK9B,GAHAD,EAAK,KAAKE,EAAyB,EAG7BH,GAAS,OAASF,EAAY,OAASE,EAAQ,MAAO,CAC1D,IAAMI,EAAQJ,EAAQ,MAClBK,EAAsCN,EAE1C,GAAIA,EAAqB,QAAUC,EAAQ,MAAO,CAmBhD,IAAMM,EACJN,EAAQ,MAAQD,EAAqB,OAEvC,QAASQ,EAAI,EAAGA,GAAKD,EAAyCC,IAAK,CACjE,IAAMC,EAAaP,EAAKM,CAAC,EAEzBF,EACEA,EAAoC,OAAQI,GACnCD,EAAW,OAASC,CAC5B,CACL,CACF,CAEAR,EAAK,KACHS,GAAsCL,CAAmC,CAC3E,EAMAH,EAAOD,EAAK,OAAOG,CAAK,CAC1B,CACA,MAAO,CACL,KAAAH,EACA,KAAAC,CACF,CACF,CAnEgBS,EAAAd,GAAA,WAsET,SAASM,GACdS,EACAC,EACA,CACA,IAAMC,EAAWC,GACXC,EAAmBF,EAAS,UAAWG,GAAUA,IAAUL,EAAE,IAAI,EACjEM,EAAmBJ,EAAS,UAAWG,GAAUA,IAAUJ,EAAE,IAAI,EACjEM,EAAcH,EAAmB,GACjCI,EAAcF,EAAmB,GAEvC,OAAIC,GAAeC,EACVJ,EAAmBE,EAAmB,EAAI,GAG/CC,EACK,GAGLC,EACK,EAGF,CACT,CAvBgBT,EAAAR,GAAA,6BAyBT,SAASO,GACdX,EACA,CACA,OAAOY,EAAA,SAAyBC,EAAmBC,EAAmB,CACpE,IAAMQ,EAAoBtB,EAAqB,UAC5CS,GAAeA,IAAeI,EAAE,IACnC,EACMU,EAAoBvB,EAAqB,UAC5CS,GAAeA,IAAeK,EAAE,IACnC,EAEMU,EAAeF,EAAoB,GACnCG,EAAeF,EAAoB,GAEzC,OAAIC,GAAgBC,EACXH,EAAoBC,EAAoB,EAAI,GAGjDvB,EAAqB,SAASa,EAAE,IAAI,EAC/B,GAELb,EAAqB,SAASc,EAAE,IAAI,EAC/B,EAGF,CACT,EAvBO,kBAwBT,CA3BgBF,EAAAD,GAAA,yCA6BT,SAASe,GACdjB,EACAkB,EACS,CACT,MAAO,CAAC,CAACA,EAAc,KAAK,KAAMC,GAASA,EAAK,OAASnB,CAAU,CACrE,CALgBG,EAAAc,GAAA,mBFlHT,SAASG,GACdC,EACAC,EACgB,CAChB,GAAM,CAAE,qBAAAC,EAAsB,uBAAAC,CAAuB,EAAIC,EAAY,EAErEC,GAAU,IAAM,CACd,GAAIJ,GAAS,SAAU,CACrB,IAAMK,EAASC,GAAQP,EAAaE,EAAsBD,CAAO,EAO5DO,GAAgBP,EAAQ,SAAUK,CAAM,GAC3CH,EAAuBF,GAAS,QAAQ,CAE5C,CACF,EAAG,CAACA,GAAS,QAAQ,CAAC,EAEtB,IAAMK,EAASC,GAAQP,EAAaE,EAAsBD,CAAO,EAEjE,MAAO,CACL,KAAMK,EAAO,KACb,KAAMA,EAAO,KACb,QAAS,CAAC,CACZ,CACF,CA5BgBG,EAAAV,GAAA,4BGlBhB,OAAS,UAAAW,OAAc,gBAEhB,IAAMC,GAAcD,GAAO,MAAO,CACvC,QAAS,OACT,IAAK,MACL,oBAAqB,2BACvB,CAAC,EJgBD,IAAME,GAAoB,GAEnB,SAASC,GAAmBC,EAAkB,CACnD,GAAM,CAAE,YAAAC,EAAa,KAAAC,EAAM,WAAAC,EAAY,SAAAC,EAAU,YAAAC,CAAY,EAAIL,EAC3DM,EAAkBC,GAAyBN,EAAa,CAC5D,MAAO,GACP,SAAUE,GAAY,IACxB,CAAC,EAEK,CAAE,YAAAK,CAAY,EAAIC,EAAY,EAC9BC,EAAoBC,EAAc,IAAI,kBAAkB,EACxDC,EAAsBD,EAAc,IAAI,oBAAoB,EAC5DE,EAAqBP,EAAgB,KAAK,OAAS,EAInDQ,EAAoBR,EAAgB,KAAK,SAAW,EACpDS,EAAiB,CAACD,GAAqBD,EAE7C,OACEG,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BC,GAAK,EAAE,mBAAmB,CAC7B,EACAH,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACI,GAAA,KACEZ,IAAgB,WACf,MAAM,KAAK,MAAMV,EAAiB,EAAIuB,GACpCL,GAAA,cAACM,GAAA,CAAS,IAAKD,EAAG,QAAQ,UAAU,OAAQ,GAAI,CACjD,EACFb,IAAgB,WACfQ,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACO,GAAA,CACC,SAAU,CAACpB,EACX,QAAS,IAAM,CACTD,IAAS,OACXU,EAAoB,EAEpBF,EAAkB,CAEtB,GACAM,GAAA,cAACE,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAS,MAAM,gBAC5CC,GAAK,EAAE,KAAK,CACf,CACF,EACCb,EAAgB,KAAK,IAAKkB,GACzBR,GAAA,cAACS,GAAA,CACC,IAAKD,EAAK,KACV,QAASA,EAAK,UACd,KAAK,SACL,WAAY,EACZ,UAAWE,EAAa,GACxBV,GAAA,cAACO,GAAA,CACC,IAAKC,EAAK,KACV,SAAU,CAAC,CAACrB,GAAcA,EAAW,OAASqB,EAAK,KACnD,QAAS,IAAMpB,EAASoB,CAAI,GAC5BR,GAAA,cAACW,GAAA,CAAM,IAAKH,EAAK,KAAM,KAAM,GAAI,CACnC,CACF,CACD,EAEAV,EACCE,GAAA,cAACO,GAAA,CACC,IAAKjB,EAAgB,KAAK,CAAC,EAAE,KAC7B,SACE,CAAC,CAACH,GACFA,EAAW,OAASG,EAAgB,KAAK,CAAC,EAAE,KAE9C,QAAS,IAAMF,EAASE,EAAgB,KAAK,CAAC,CAAC,GAC/CU,GAAA,cAACW,GAAA,CAAM,IAAKrB,EAAgB,KAAK,CAAC,EAAE,KAAM,KAAM,GAAI,CACtD,EACE,KAEHS,EACCC,GAAA,cAACO,GAAA,CAAgB,QAASlB,EAAa,IAAI,oBACzCW,GAAA,cAACE,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAS,MAAM,gBAC5CC,GAAK,EAAE,gBAAiB,CACvB,MAAOb,EAAgB,KAAK,MAC9B,CAAC,CACH,CACF,EACE,IACN,CAEJ,CACF,CAEJ,CAtFgBsB,EAAA7B,GAAA,sBDHT,SAAS8B,GAAoBC,EAAkB,CACpD,GAAM,CAAE,KAAAC,CAAK,EAAID,EACXE,EAAWC,GAAY,EACvBC,EAAeC,GAAgB,EAC/B,CACJ,eAAAC,EACA,aAAAC,EACA,aAAAC,EACA,WAAAC,EACA,kBAAAC,EACA,gBAAAC,CACF,EAAIC,EAAc,EACZC,EAAgBC,EAAgB,IAAI,cAAc,EAClD,CAACC,EAAaC,CAAc,EAAIC,GAAiB,EAAE,EAGnDC,GADqBjB,IAAS,SAAWK,EAAiBC,IACb,MAAQ,GAGrDY,EAAcC,EAAY,EAAE,YAAY,CAC5C,KAAAnB,CACF,CAAC,EACKoB,EAASD,EAAY,EAAE,OAAO,CAClC,KAAAnB,EACA,WAAYiB,EACZ,UAAWH,EACX,cAAeF,CACjB,CAAC,EAEKS,EAAmBC,EAACC,GAA+B,CACnDvB,IAAS,SACXS,EAAkBc,CAAU,EAE5Bb,EAAgBa,CAAU,CAE9B,EANyB,oBAQnBC,EAAcF,EAACG,GAAiB,CAChCzB,IAAS,SACXO,EAAa,CAAE,MAAAkB,EAAO,KAAM,CAAE,YAAAP,EAAa,OAAAE,CAAO,CAAE,CAAC,EAErDZ,EAAW,CAAE,MAAAiB,EAAO,KAAM,CAAE,YAAAP,EAAa,OAAAE,CAAO,CAAE,CAAC,CAEvD,EANoB,eAOdM,EAAQ,CACZ,OAAQC,GAAK,EAAE,QAAQ,EACvB,YAAaA,GAAK,EAAE,aAAa,CACnC,EAEA,OACEC,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,MAAOF,GAAK,EAAE,cAAe,CAAE,KAAMD,EAAM1B,CAAI,CAAE,CAAC,CACpD,GACA4B,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CACC,YAAab,EACb,KAAMlB,GAAQ,SAAW,OAAS,KAClC,WAAYA,IAAS,SAAWK,EAAiBC,EACjD,YAAa,IAAML,EAAS+B,EAAiB,WAAW,EACxD,SAAWT,GAAe,CACxBF,EAAiBE,CAAU,CAC7B,EACF,EACAK,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACM,GAAA,CACC,MAAOpB,EACP,UAAS,GACT,YAAaa,GAAK,EAAE,cAAc,EAClC,MAAM,QACN,QAAQ,YACR,KAAK,QACL,SAAU,IAAMZ,EAAe,EAAE,EACjC,SAAWoB,GAAUpB,EAAeoB,EAAM,OAAO,KAAK,EACxD,EACAP,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACQ,GAAA,CACC,KAAMhB,EACN,mBAAoBH,EACpB,YAAaH,EACb,KAAMd,EACN,SAAWyB,GAAU,CACnBD,EAAYC,CAAK,EAEjB,IAAMY,EAAkBnB,EAAY,KACjCoB,GAAUb,EAAM,aAAea,EAAM,IACxC,EACID,GACFhB,EAAiBgB,CAAe,EAGlClC,EAAa,CACf,EACF,CACF,CACF,CAEJ,CAjGgBmB,EAAAxB,GAAA,uBMrBhB,OAAS,QAAAyC,OAAY,eACrB,OAAS,SAAAC,GAAO,UAAAC,GAAQ,UAAAC,OAAc,gBACtC,OAAOC,OAAW,QAClB,OAAS,sBAAAC,GAAoB,mBAAAC,OAAuB,mBCHpD,OAAS,QAAAC,OAAY,eACrB,OACE,WAAAC,GACA,YAAAC,GACA,gBAAAC,GACA,aAAAC,GACA,WAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QCTlB,OAAS,QAAAC,GAAM,UAAAC,GAAQ,aAAAC,OAAiB,gBAEjC,IAAMC,GAAgBF,GAAO,MAAO,CACzC,WAAY,KACZ,QAAS,QACX,CAAC,EAEYG,GAAyBH,GAAO,MAAO,CAClD,QAAS,OACT,SAAU,OACV,IAAK,MACL,CAAC,KAAKC,EAAS,EAAE,EAAG,CAClB,KAAM,QACN,SAAU,QACV,SAAU,MACZ,CACF,CAAC,EAEYG,GAAOJ,GAAO,MAAO,CAChC,QAAS,OACT,eAAgB,QAChB,WAAY,SACZ,cAAe,KACjB,CAAC,EAEYK,GAA2BL,GAAO,MAAO,CACpD,SAAU,QACV,QAAS,KACX,CAAC,EAEYM,GAAeN,GAAOD,GAAM,CACvC,MAAO,OACP,WAAY,CACd,CAAC,ECjCD,OAAS,QAAAQ,OAAY,eACrB,OAAS,cAAAC,OAAkB,gBAC3B,OAAOC,OAAW,QAIX,SAASC,IAAyB,CACvC,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,cAC7CC,GAAK,EACJ,iGACF,EACAH,GAAA,cAAC,SAAG,EACJA,GAAA,cAAC,SAAG,EACJA,GAAA,cAAC,SAAGG,GAAK,EAAE,SAAS,CAAE,EAAI,IACzBA,GAAK,EACJ,sIACF,CACF,CACF,CAEJ,CAhBgBC,EAAAL,GAAA,0BFqBT,SAASM,IAAW,CACzB,GAAM,CAAE,SAAAC,EAAU,YAAAC,EAAa,eAAAC,EAAgB,kBAAAC,CAAkB,EAC/DC,EAAY,EAEd,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CAAa,KAAM,GAAI,MAAM,OAAO,EACrCH,GAAA,cAACI,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCJ,GAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,6BAA6B,CACvC,EACAN,GAAA,cAACI,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCJ,GAAA,cAACO,GAAA,CACC,UAAWC,EAAa,EACxB,KAAK,MACL,WAAY,EACZ,QAASR,GAAA,cAACS,GAAA,IAAuB,GACjCT,GAAA,cAACU,GAAA,CAAS,MAAM,OAAO,CACzB,CACF,EACAV,GAAA,cAACW,GAAA,KACEC,GAAU,IAAI,CAACC,EAAcC,IAAU,CACtC,IAAMC,EAAM,YAAYD,CAAK,GAC7B,OACEd,GAAA,cAACgB,GAAA,CACC,IAAKD,EACL,QAAS,IAAM,CACTlB,GACFC,EAAkB,IAAI,EAExBF,EAAYiB,CAAY,CAC1B,EACA,SAAU,CAAChB,GAAkBgB,IAAiBlB,EAC9C,MAAO,GAAGkB,EAAa,SAAS,CAAC,IACnC,CAEJ,CAAC,EACDb,GAAA,cAACiB,GAAA,CACC,KAAK,SACL,IAAI,OACJ,IAAI,KACJ,KAAK,OACL,UAAS,GACT,QAAQ,YACR,MAAOpB,IAAmB,KAAO,GAAKA,EACtC,MAAM,OACN,SAAWqB,GAAU,CACnB,IAAMC,EAAQD,EAAM,OAAO,MACrBE,EAAc,WAAWD,CAAK,EAChCC,GAAeC,IAAgBD,GAAeE,GAChDxB,EAAkBsB,CAAW,EAE7BtB,EAAkB,IAAI,CAE1B,EACA,OACED,GACEG,GAAA,cAACK,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAQ,GAExC,EAGJ,YAAaC,GAAK,EAAE,QAAQ,EAC9B,CACF,CACF,CAEJ,CApEgBiB,EAAA7B,GAAA,YGxBhB,OAAS,QAAA8B,OAAY,eACrB,OACE,iBAAAC,GACA,eAAAC,GACA,oBAAAC,GACA,gBAAAC,GACA,WAAAC,GACA,gBAAAC,GACA,gBAAAC,GACA,YAAAC,GACA,gBAAAC,GACA,iBAAAC,GACA,QAAAC,GACA,YAAAC,GACA,kBAAAC,GACA,YAAAC,GACA,UAAAC,GACA,UAAAC,GACA,QAAAC,GACA,cAAAC,GACA,WAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,MAAW,QAClB,OAAS,eAAAC,OAAmB,mBAU5B,IAAMC,GAAeC,GAAO,MAAO,CACjC,MAAO,QACP,OAAQ,KACV,CAAC,EAEKC,GAAa,CACjB,CACE,WACA,KAAMC,EAAA,cAACC,GAAA,CAAc,MAAM,QAAQ,KAAM,GAAI,EAC7C,QACED,EAAA,cAACE,GAAA,CAAW,KAAK,SAAS,QAAQ,QAC/BC,GAAK,EAAE,OAAO,CACjB,CAEJ,EACA,CACE,UACA,KAAMH,EAAA,cAACI,GAAA,CAAa,MAAM,QAAQ,KAAM,GAAI,EAC5C,QACEJ,EAAA,cAACE,GAAA,CAAW,KAAK,SAAS,QAAQ,QAC/BC,GAAK,EAAE,MAAM,CAChB,CAEJ,EACA,CACE,UACA,KAAMH,EAAA,cAACK,GAAA,CAAc,MAAM,QAAQ,KAAM,GAAI,EAC7C,QACEL,EAAA,cAACE,GAAA,CAAW,KAAK,SAAS,QAAQ,QAC/BC,GAAK,EAAE,MAAM,CAChB,CAEJ,CACF,EAEMG,GAAeC,EAACC,GAAqB,CACzC,IAAMC,EAA0B,CAAE,MAAO,OAAQ,KAAM,EAAG,EAE1D,OAAQD,EAAO,CACb,IAAK,OACH,OAAOR,EAAA,cAACK,GAAA,CAAe,GAAGI,EAAW,EACvC,IAAK,OACH,OAAOT,EAAA,cAACI,GAAA,CAAc,GAAGK,EAAW,EACtC,QACE,OAAOT,EAAA,cAACC,GAAA,CAAe,GAAGQ,EAAW,CACzC,CACF,EAXqB,gBAad,SAASC,IAAgB,CAC9B,IAAMC,EAAWC,GAAY,EACvB,CAAE,MAAOC,CAAY,EAAIC,EAAY,EAAE,OACvC,CAAE,SAAAC,EAAU,MAAAP,CAAM,EAAIM,EAAY,EAClC,CAAE,eAAAE,EAAgB,UAAAC,CAAU,EAAIC,GAAY,EAC5CC,EAAkBF,EAAU,KAC/BG,GAAaA,EAAS,QAAUJ,CACnC,GAAG,MAEGK,EAAcP,EAAY,EAAE,YAC5BQ,EAAWR,EAAY,EAAE,SAAS,EAClCS,EAA2BT,EAAY,EAAE,4BAA4B,EACrE,CACJ,OAAQ,CAAE,SAAAU,CAAS,CACrB,EAAIV,EAAY,EACVW,EAAeX,EAAY,EAAE,aAAa,EAC1CY,EAAgBC,GAAgB,QAASH,CAAQ,EACjDI,EAAoBD,GAAgB,kBAAmBH,CAAQ,EAC/DK,EAAmBF,GAAgB,WAAYH,CAAQ,EACvDM,EAAuBH,GAAgB,eAAgBH,CAAQ,EAE/DO,EAAkBjB,EAAY,EAAE,gBAChCkB,EAAwBlB,EAAY,EAAE,sBAEtCmB,EAAgCC,GACpCZ,EACAC,CACF,EAEMY,EAAgBF,EAA8B,OAAQG,GAC1D,CAAC,SAAU,aAAc,WAAW,EAAE,SAASA,EAAW,IAAI,CAChE,EAEMC,EAAqBF,EAAc,OACnCG,EAA6BH,EAAc,OAC9CC,GAAeA,EAAW,QAC7B,EAAE,OAEIG,EAAkBN,EAA8B,OACnDG,GAAeA,EAAW,OAAS,KACtC,EAEMI,EAAuBD,EAAgB,OACvCE,EAA+BF,EAAgB,OAClDH,GAAeA,EAAW,QAC7B,EAAE,OAEIM,EAAuBnC,EAAA,CAACoC,EAAuBC,IAAkB,CACrE,OAAQvB,EAAa,CACnB,IAAK,UACH,OAAOrB,EAAA,cAAC6C,GAAA,CAAS,QAAQ,OAAO,KAAK,SAAS,MAAO,GAAI,EAC3D,IAAK,SACH,OACE7C,EAAA,cAACE,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAS,MAAM,aAC5CC,GAAK,EAAE,gBAAgB,CAC1B,EAEJ,QACE,OACEH,EAAA,cAACE,GAAA,CAAW,QAAQ,OAAO,KAAK,UAC7B,GAAGyC,CAAa,MAAMC,CAAK,EAC9B,CAEN,CACF,EAjB6B,wBAmBvBE,EAAa,CACjB,GAAI,cACJ,MACE9C,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,SAAS,CACnB,EAEF,IACEH,EAAA,cAAAA,EAAA,cACG0C,EAAqBJ,EAA4BD,CAAkB,EACpErC,EAAA,cAAC+C,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzC/C,EAAA,cAACgD,GAAA,CAAiB,MAAM,QAAQ,CAClC,EAEF,QAAS,IAAMrC,EAASsC,EAAiB,OAAO,EAChD,MAAOjD,EAAA,cAACkD,GAAA,CAAY,MAAM,OAAO,KAAM,GAAI,CAC7C,EAEMC,EAAe,CACnB,GAAI,gBACJ,MACEnD,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,WAAW,CACrB,EAEF,IACEH,EAAA,cAAAA,EAAA,cACG0C,EACCD,EACAD,CACF,EACAxC,EAAA,cAAC+C,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzC/C,EAAA,cAACgD,GAAA,CAAiB,MAAM,QAAQ,CAClC,EAEF,MAAOhD,EAAA,cAACoD,GAAA,CAAa,MAAM,OAAO,KAAM,GAAI,EAC5C,QAAS,IAAMzC,EAASsC,EAAiB,SAAS,CACpD,EAEMI,EAAmB,CACvB,GAAI,qBACJ,MACErD,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,eAAe,CACzB,EAEF,IACEH,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACE,GAAA,CAAW,QAAQ,OAAO,KAAK,UAC7B,GAAGuB,EAAa,MAAM,EACzB,EACAzB,EAAA,cAAC+C,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzC/C,EAAA,cAACgD,GAAA,CAAiB,MAAM,QAAQ,CAClC,EAEF,MAAOhD,EAAA,cAACsD,GAAA,CAAW,MAAM,OAAO,KAAM,GAAI,EAC1C,QAAS,IAAM3C,EAASsC,EAAiB,YAAY,CACvD,EACMM,EAAe,CACnB,GAAI,gBACJ,MACEvD,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,UAAU,CACpB,EAEF,MAAOH,EAAA,cAACwD,GAAA,CAAa,MAAM,OAAO,KAAM,GAAI,EAC5C,IACExD,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACE,GAAA,CAAW,QAAQ,OAAO,KAAK,UAC7BiB,CACH,EACAnB,EAAA,cAAC+C,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzC/C,EAAA,cAACgD,GAAA,CAAiB,MAAM,QAAQ,CAClC,EAEF,QAAS,IAAMrC,EAASsC,EAAiB,SAAS,CACpD,EAEMQ,EAAuB,CAC3B,GAAI,yBACJ,MACEzD,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,mBAAmB,CAC7B,EACAH,EAAA,cAAC+C,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzC/C,EAAA,cAAC0D,GAAA,CACC,KAAK,MACL,WAAY,EACZ,UAAWC,EAAa,EACxB,QACE3D,EAAA,cAAC4D,GAAA,KACC5D,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,cAC7CC,GAAK,EACJ,+KACF,CACF,CACF,GAEFH,EAAA,cAAC6D,GAAA,CAAS,MAAM,OAAO,CACzB,CACF,EAEF,MAAO7D,EAAA,cAAC8D,GAAA,CAAa,MAAM,OAAO,KAAM,GAAI,EAC5C,IAAK9D,EAAA,cAAC+D,GAAA,CAAO,QAAShC,EAAiB,EACvC,QAASC,CACX,EAEMgC,GAAY,CAChB,GAAI,aACJ,KAAMhE,EAAA,cAACiE,GAAA,IAAS,EAChB,MACEjE,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,OAAO,CACjB,EAEF,IACEH,EAAA,cAACH,GAAA,KACCG,EAAA,cAACkE,GAAA,CACC,UAAWP,EAAa,EACxB,MAAO5D,GACP,MAAOS,EACP,SAAW2D,GAASpD,EAASoD,EAAK,EAAe,EACjD,KAAK,UACL,aAAa,QACf,CACF,EAEF,MAAO7D,GAAaE,CAAK,CAC3B,EAEM4D,GAAuCxC,EACzC,CAAC,EACD,CAACkB,EAAYK,CAAY,EAC7B,OAAKrB,GACHsC,GAAa,KAAKf,CAAgB,EAE/BxB,GACHuC,GAAa,KAAKb,CAAY,EAEhCa,GAAa,KAAKX,CAAoB,EAElC,CAAC5C,GAAa,aAAe,CAACa,GAChC0C,GAAa,KAAKJ,EAAS,EAI3BhE,EAAA,cAACqE,GAAA,CACC,KAAMrE,EAAA,cAACsE,GAAA,CAAe,WAAU,GAAC,GAAG,IAAI,QAAS,IAAM,QAAQ,IAAI,EAAG,EACtE,MAAOF,GACT,CAEJ,CA1NgB7D,EAAAG,GAAA,iBJ1EhB,IAAM6D,GAAcC,GAAO,MAAO,CAChC,YAAa,IACf,CAAC,EAEM,SAASC,IAAe,CAC7B,GAAM,CAAE,iBAAAC,EAAkB,mBAAAC,CAAmB,EAAIC,EAAY,EACvDC,EAAeH,EAAiB,EAEhC,CAAC,CAAEI,CAAe,EAAIC,GAAgB,EACtCC,EAAoBC,GAAmB,EAEvCC,EAAUC,EAAA,IAAM,CAChBH,GAAqBH,IACvBC,EACGM,IACCA,EAAK,yBAAqC,EACnCA,GAET,CAAE,QAAS,EAAK,CAClB,EACAT,EAAmB,mBAAoB,MAAS,EAEpD,EAXgB,WAYhB,OACEU,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,UAAU,CAC1B,GACAF,GAAA,cAACG,GAAA,KACEX,GACCQ,GAAA,cAACI,GAAA,CACC,KAAK,OACL,QAAQ,QACR,MAAOF,GAAK,EACV,uKACF,EACA,OACEF,GAAA,cAACd,GAAA,KACCc,GAAA,cAACK,GAAA,CAAO,KAAK,YAAY,KAAK,QAAQ,QAASR,GAC5CK,GAAK,EAAE,OAAO,CACjB,CACF,EAEJ,EAEFF,GAAA,cAACM,GAAA,IAAS,EACVN,GAAA,cAACO,GAAA,IAAc,CACjB,CACF,CAEJ,CA9CgBT,EAAAV,GAAA,gBKfhB,OAAS,QAAAoB,OAAY,eACrB,OAAS,cAAAC,OAAkB,wCAC3B,OAAS,cAAAC,OAAkB,iCAC3B,OAAS,SAAAC,OAAa,gBACtB,OAAOC,OAAW,QAClB,OAAS,aAAAC,OAAiB,mBCF1B,OAAS,QAAAC,OAAY,eACrB,OACE,gCAAAC,GACA,kBAAAC,GACA,0BAAAC,OACK,wCACP,OACE,UAAAC,GACA,YAAAC,GACA,WAAAC,GACA,YAAAC,GACA,cAAAC,GACA,aAAAC,GACA,qBAAAC,GACA,eAAAC,GACA,WAAAC,GACA,cAAAC,GACA,sBAAAC,OACK,gBACP,OAAS,cAAAC,OAAkB,2BAC3B,OAAOC,OAAe,eACtB,OAAS,4BAAAC,OAAgC,cACzC,OAAOC,GAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QACnD,OAAS,eAAAC,OAAmB,mBCxB5B,OAAS,QAAAC,OAAY,eAErB,IAAMC,GAAa,CACjBC,GAAK,EAAE,QAAQ,EACfA,GAAK,EAAE,QAAQ,EACfA,GAAK,EAAE,SAAS,EAChBA,GAAK,EAAE,WAAW,EAClBA,GAAK,EAAE,UAAU,EACjBA,GAAK,EAAE,QAAQ,EACfA,GAAK,EAAE,UAAU,CACnB,EAEO,SAASC,GAAUC,EAAqB,CAC7C,IAAMC,EAAO,IAAI,KAAKD,CAAW,EAC3BE,EAAMD,EAAK,QAAQ,EACnBE,EAAQF,EAAK,eAAe,UAAW,CAAE,MAAO,MAAO,CAAC,EACxDG,EAAOH,EAAK,YAAY,EAM9B,MAAO,GALSA,EAAK,OAAO,IAAM,IAAI,KAAK,EAAE,OAAO,EAEhDH,GAAK,EAAE,OAAO,EACd,GAAGD,GAAWI,EAAK,OAAO,CAAC,CAAC,IAAIC,CAAG,IAAIC,CAAK,IAAIC,CAAI,EAEjC,KAAK,IAAI,KAAKJ,CAAW,EAAE,mBAAmB,CAAC,EACxE,CAXgBK,EAAAN,GAAA,aAaT,SAASO,GAAYC,EAA0B,CAIpD,OAHaA,EAAY,WACrBR,GAAU,SAASQ,EAAY,UAAU,CAAC,EAC1CR,GAAU,SAASQ,EAAY,YAAY,CAAC,CAElD,CALgBF,EAAAC,GAAA,eCzBhB,OAAS,4BAAAE,OAAgC,cACzC,OAAOC,OAAW,QCDlB,OAAS,QAAAC,OAAY,eACrB,OAAS,UAAAC,GAAQ,WAAAC,GAAS,cAAAC,OAAkB,gBAC5C,OAAOC,OAAW,QAEX,IAAMC,GAAgBC,EAAA,CAAC,CAAE,SAAAC,EAAU,QAAAC,CAAQ,IAE9CC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACE,GAAA,CACC,KAAK,QACL,MAAOC,GAAK,EAAE,aAAa,EAC3B,YAAaA,GAAK,EAAE,4CAA4C,EAClE,EACAH,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACI,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAASN,GACRK,GAAK,EAAE,gBAAgB,CAC1B,EACAH,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACI,GAAA,CAAO,QAAQ,WAAW,KAAK,UAAU,KAAK,QAAQ,QAASL,GAC7DI,GAAK,EAAE,cAAc,CACxB,CACF,EArByB,iBCJ7B,OAAS,QAAAE,OAAY,eACrB,OAAS,UAAAC,GAAQ,WAAAC,GAAS,cAAAC,GAAY,cAAAC,OAAkB,gBACxD,OAAOC,OAAW,QAEX,IAAMC,GAAgBC,EAAA,CAAC,CAAE,SAAAC,EAAU,QAAAC,CAAQ,IAE9CC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACE,GAAA,CACC,KAAK,QACL,MAAOC,GAAK,EAAE,oBAAoB,EAClC,YAAaA,GAAK,EAAE,4CAA4C,EAClE,EACAH,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACI,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAASN,GACRK,GAAK,EAAE,gBAAgB,CAC1B,EACAH,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACI,GAAA,CAAO,QAAQ,WAAW,KAAK,UAAU,KAAK,QAAQ,QAASL,GAC9DC,GAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,WAC7CF,GAAK,EAAE,YAAY,CACtB,CACF,CACF,EAvByB,iBCJ7B,OAAS,QAAAG,OAAY,eACrB,OAAS,4BAAAC,OAAgC,cAElC,IAAMC,GAGT,CACF,CAACD,GAAyB,uBAAuB,EAAG,CAClD,KAAM,UACN,MAAOD,GAAK,EAAE,gBAAgB,CAChC,EACA,CAACC,GAAyB,0BAA0B,EAAG,CACrD,KAAM,UACN,MAAOD,GAAK,EAAE,gBAAgB,CAChC,EACA,CAACC,GAAyB,cAAc,EAAG,CACzC,KAAM,UACN,MAAOD,GAAK,EAAE,iBAAiB,CACjC,CACF,EClBA,OAAS,QAAAG,OAAY,0BACrB,OAAS,cAAAC,GAAY,UAAAC,OAAc,gBACnC,OAAS,cAAAC,OAAkB,2BAC3B,OAAOC,IAAS,YAAAC,OAAgB,QCNhC,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAkBD,GAAO,MAAO,CAC3C,QAAS,OACT,eAAgB,QAClB,CAAC,EAEYE,GAAsBF,GAAO,MAAO,CAC/C,SAAU,IACV,iBAAkB,CAChB,SAAU,aACV,QAAS,OACX,CACF,CAAC,EDEM,IAAMG,GAAqBC,EAACC,GAAmC,CACpE,GAAM,CACJ,KAAAC,EACA,MAAAC,EACA,kBAAAC,EACA,QAAAC,EACA,iBAAAC,EACA,qBAAAC,CACF,EAAIN,EACE,CAACO,EAAyBC,CAA0B,EACxDC,GAA8B,EAC1B,CAAE,cAAAC,EAAe,MAAAC,CAAM,EAAIC,GAAW,EACtCC,EAAaV,GAAmB,WAChCW,EAAcD,EAChBE,GAAuBJ,EAAME,CAAU,CAAC,EACxC,KACEG,EAAaH,EAAaH,EAAcG,CAAU,EAAI,KACtDI,EACJZ,GAAoB,CAAC,CAACQ,GAAc,CAAC,CAACC,GAAe,CAAC,CAACE,EACnD,CAAE,KAAAE,CAAK,EAAIC,GAAc,EAEzBC,EAAwBrB,EAAA,IAAM,CAClC,GAAMc,EAAY,CAChB,IAAMQ,EAASH,EAAK,KAAMG,GAAWA,EAAO,OAASR,CAAU,EAE3DQ,EACFb,EAA2Ba,CAAM,EAEjCC,GACE,IAAI,MACF,6FAA6FD,CAAM,EACrG,CACF,CAEJ,CACF,EAd8B,yBAgB9B,OACEE,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAW,KAAMvB,EAAM,MAAOC,EAAO,YAAaE,EAAS,EAC3Da,GACCM,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CACC,UAAWC,EAAa,EACxB,MAAOX,EAAW,KAClB,MAAOA,EAAW,IAClB,KAAMH,EACN,MAAOC,EACP,KAAME,EAAW,YACjB,SAAUV,EAEV,QAASc,EACX,CACF,EAEFG,GAAA,cAACK,GAAA,CACC,OAAQrB,EACR,QAAS,IAAM,CACbC,EAA2B,MAAS,CACtC,EACF,CACF,CAEJ,EA/DkC,sBJF3B,SAASqB,GAAiBC,EAAuB,CACtD,GAAM,CACJ,MAAAC,EACA,QAAAC,EACA,SAAAC,EACA,SAAAC,EACA,kBAAAC,EACA,QAAAC,EACA,qBAAAC,CACF,EAAIP,EAEEQ,EACJP,IAAUQ,GAAyB,yBACnCR,IAAUQ,GAAyB,4BACnCR,IAAUQ,GAAyB,eAErC,OACEC,GAAA,cAACC,EAAA,CACC,KAAM,CAAC,CAACV,EACR,QAASC,EACT,UACE,SAAS,eAAeU,GAAa,WAAW,GAAK,SAAS,MAE/DJ,GACCE,GAAA,cAACG,GAAA,CACC,KAAMC,GAAmBb,CAAK,EAAE,KAChC,MAAOa,GAAmBb,CAAK,EAAE,MACjC,kBAAmBI,EACnB,QAASC,EACT,qBAAsBC,EACtB,iBACEN,IAAUQ,GAAyB,wBAEvC,EAEDR,IAAU,UACTS,GAAA,cAACK,GAAA,CAAc,QAASb,EAAS,SAAUC,EAAU,EAEtDF,IAAU,UACTS,GAAA,cAACM,GAAA,CAAc,QAASd,EAAS,SAAUE,EAAU,CAEzD,CAEJ,CA3CgBa,EAAAlB,GAAA,oBMXhB,OAAS,QAAAmB,OAAY,eACrB,OACE,UAAAC,GACA,WAAAC,GACA,cAAAC,GACA,eAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QAClB,OAAS,eAAAC,OAAmB,mBAMrB,SAASC,GAAyBC,EAA+B,CACtE,GAAM,CACJ,KAAAC,EACA,QAAAC,EACA,OAAAC,EACA,WAAAC,EACA,SAAAC,EACA,aAAAC,EACA,UAAAC,EACA,MAAAC,EACA,MAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,aAAAC,CACF,EAAIZ,EACEa,EAAWC,GAAY,EAE7B,OACEC,GAAA,cAACC,EAAA,CACC,KAAMf,EACN,QAASC,EACT,UACE,SAAS,eAAee,GAAa,WAAW,GAAK,SAAS,MAE/Dd,IAAW,UACVY,GAAA,cAACG,GAAA,CAAW,KAAK,UAAU,MAAOC,GAAK,EAAE,iBAAiB,GACxDJ,GAAA,cAACK,GAAA,CACC,UAAU,WACV,iBAAkBC,EAAa,EAC/B,KAAK,SACL,YAAa,GACb,MAAO,CACL,MAAOjB,EACP,SAAAC,EACA,aAAAC,EACA,UAAAC,CACF,EACA,MAAOC,EACP,MAAOC,EACP,iBAAkBC,EACpB,EACAK,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,EACnBP,GAAA,cAACQ,GAAA,CACC,QAAQ,OACR,KAAK,SACL,MAAM,aACN,MAAM,UACLZ,CACH,CACF,EAEAI,GAAA,cAACG,GAAA,CACC,KAAK,QACL,MAAOC,GAAK,EAAE,oBAAoB,EAClC,YAAaR,EACf,EAEFI,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,EAClBnB,IAAW,WACVY,GAAA,cAACS,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAAS,IAAM,CAEbX,EADa,QACA,CACf,GACAE,GAAA,cAACQ,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,cAC7CJ,GAAK,EAAE,MAAM,CAChB,CACF,EAEFJ,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,EAClBV,GACCG,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACS,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAAS,IAAM,OAAO,KAAKZ,EAAc,QAAQ,GAChDO,GAAK,EAAE,WAAW,CACrB,EACAJ,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,CACrB,EAEFP,GAAA,cAACS,GAAA,CAAO,QAAQ,WAAW,KAAK,UAAU,KAAK,QAAQ,QAAStB,GAC9Da,GAAA,cAACQ,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,WAC7CJ,GAAK,EAAE,aAAa,CACvB,CACF,CACF,CAEJ,CA5FgBM,EAAA1B,GAAA,4BCbhB,OAAO2B,OAAW,QCFlB,OAAS,QAAAC,OAAY,eACrB,OAAS,SAAAC,GAAO,cAAAC,GAAY,YAAAC,OAAgB,gBAC5C,OAAOC,IAAS,YAAAC,OAAgB,QCFhC,OAAS,SAAAC,GAAO,mBAAAC,GAAiB,cAAAC,OAAkB,gBACnD,OAAOC,IAAS,YAAAC,OAAgB,QCHhC,OAAS,OAAAC,GAAK,aAAAC,GAAW,UAAAC,GAAQ,cAAAC,OAAkB,gBAI5C,IAAMC,GAAYC,GAAO,MAAO,CACrC,QAAS,OACT,cAAe,SACf,SAAU,EACV,SAAU,QACZ,CAAC,EAEYC,GAAgBD,GAAO,MAAO,CACzC,MAAO,OACP,kBAAmB,CACjB,UAAW,CACT,QAAS,CACP,MAAO,gBACP,CAAC,IAAIE,EAAS,IAAI,EAAG,CACnB,MAAO,eACT,CACF,CACF,CACF,CACF,CAAC,EAEYC,GAAYH,GAAOI,GAAgB,CAC9C,QAAS,gBACX,CAAC,EAEYC,GAASL,GAAO,MAAO,CAClC,QAAS,OACT,cAAe,SACf,IAAK,KACP,CAAC,EAEYM,GAAuBN,GAAO,MAAO,CAChD,OAAQ,QACR,QAAS,OACT,WAAY,SACZ,eAAgB,QAClB,CAAC,EAEYO,GAAkBP,GAAO,MAAO,CAC3C,QAAS,OACT,eAAgB,SAChB,MAAO,OACP,WAAY,MACZ,KAAM,CACR,CAAC,EAEYQ,GAAYC,GAAI,CAC3B,QAAS,OACT,MAAO,OACP,eAAgB,gBAChB,WAAY,SACZ,QAAS,UACT,aAAc,YACd,QAAS,qBACT,CAAC,IAAIP,EAAS,IAAI,EAAG,CACnB,QAAS,oBACX,EACA,YAAa,UACb,MAAO,aACT,CAAC,EAEYQ,GAAwBD,GAAI,CACvC,QAAS,MACX,CAAC,EAEYE,GAAkBF,GAAI,CACjC,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,OAAQ,KACV,CAAC,EAEYG,GAAeH,GAAI,CAC9B,QAAS,OACT,MAAO,OACP,QAAS,cACT,cAAe,SACf,WAAY,OACd,CAAC,EAEYI,GAAmBJ,GAAI,CAClC,MAAO,OACP,QAAS,WACX,CAAC,EAEYK,GAAad,GAAO,IAAK,CACpC,SAAU,MACV,WAAY,OACZ,MAAO,cACP,QAAS,OACT,WAAY,SACZ,eAAgB,QAClB,CAAC,EAEYe,GAAgBf,GAAO,MAAO,CACzC,QAAS,OACT,cAAe,SACf,IAAK,IACP,CAAC,EACYgB,GAAchB,GAAOiB,GAAY,CAC5C,UAAW,YACb,CAAC,ECzGD,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAASD,GAAO,MAAO,CAClC,QAAS,OACT,cAAe,SACf,IAAK,KACP,CAAC,EAEYE,GAAaF,GAAO,MAAO,CACtC,WAAY,6BACZ,SAAU,CACR,QAAS,CACP,KAAM,CACJ,UAAW,gBACb,CACF,CACF,CACF,CAAC,EAEYG,GAAcH,GAAO,MAAO,CACvC,WAAY,8BACZ,UAAW,MACX,SAAU,SACV,SAAU,CACR,KAAM,CACJ,KAAM,CACJ,UAAW,OACb,CACF,CACF,CACF,CAAC,EFrBM,SAASI,GAAYC,EAA0B,CACpD,GAAM,CAAE,QAAAC,CAAQ,EAAID,EACd,CAACE,EAAkBC,CAAmB,EAAIC,GAAS,EAAK,EAE9D,OACEC,GAAA,cAACC,GAAA,CACC,KAAK,QACL,MAAOL,EAAQ,aACf,gBAAiB,CACf,YAAa,CACX,WAAY,IACd,CACF,EACA,OACEA,EAAQ,gBAAgB,SACtBI,GAAA,cAACE,GAAA,CACC,QAAS,IAAMJ,EAAqBK,GAAS,CAACA,CAAI,EAClD,QAAQ,QACR,KAAK,UACLH,GAAA,cAACI,GAAA,CAAW,QAASP,GACnBG,GAAA,cAACK,GAAA,CAAgB,KAAM,GAAI,MAAM,OAAO,CAC1C,CACF,EAGJ,OACEL,GAAA,cAACM,GAAA,CAAY,KAAMT,GACjBG,GAAA,cAACO,GAAA,CAAY,QAAQ,OAAO,KAAK,SAAS,MAAM,cAC7CX,EAAQ,gBAAgB,OAC3B,CACF,EAEJ,CAEJ,CAlCgBY,EAAAd,GAAA,eGPhB,OAAS,QAAAe,OAAY,eACrB,OAAS,SAAAC,GAAO,UAAAC,OAAc,gBAC9B,OAAS,4BAAAC,OAAgC,cACzC,OAAOC,OAAW,QAEX,SAASC,GAAaC,EAA0B,CACrD,GAAM,CAAE,cAAAC,EAAe,gBAAAC,EAAiB,QAAAC,EAAS,iBAAAC,CAAiB,EAAIJ,EACtE,OAAMC,EAEFI,GAAA,cAACC,GAAA,CACC,KAAK,UACL,MAAOH,EAAQ,aACf,OACEE,GAAA,cAACE,GAAA,CACC,KAAK,UACL,KAAK,UACL,QAAS,IAAM,CACbL,EAAgBM,GAAyB,uBAAuB,EAChEP,EAAc,EAAE,MAAOQ,GAAM,CAC3B,QAAQ,IAAIA,CAAC,CACf,CAAC,CACH,GACCC,GAAK,EAAE,QAAQ,CAClB,EAEJ,EAIFN,IAAqBI,GAAyB,2BAG5CH,GAAA,cAACC,GAAA,CACC,KAAK,UACL,MAAOH,EAAQ,aACf,OACEE,GAAA,cAACE,GAAA,CACC,KAAK,UACL,KAAK,UACL,QAAS,IAAM,CACbL,EACEM,GAAyB,0BAC3B,CACF,GACCE,GAAK,EAAE,SAAS,CACnB,EAEJ,EAIGL,GAAA,cAACC,GAAA,CAAM,KAAK,UAAU,MAAOH,EAAQ,aAAc,CAC5D,CA/CgBQ,EAAAZ,GAAA,gBJKT,SAASa,GAAkBC,EAAwB,CACxD,GAAM,CACJ,cAAAC,EACA,iBAAAC,EACA,gBAAAC,EACA,QAAAC,EACA,KAAAC,EACA,0BAAAC,CACF,EAAIN,EAEEO,EAAaC,GAA8BH,CAAI,EAC/CI,EACJJ,EAAK,SAAW,sBAAwB,CAACE,EACrCG,EAAaL,EAAK,SAAW,WAAa,CAACE,EAC3CI,EACHD,GAAc,CAACJ,GACfG,GAAsB,CAACJ,EAAK,aAAa,OAE5C,OACEO,GAAA,cAACC,GAAA,KACER,EAAK,aAAa,IAAI,CAACS,EAAaC,EAAOC,IAAS,CACnD,IAAMC,EAAMF,EAAQD,EAAY,IAC1BI,EAAUH,IAAUC,EAAK,OAAS,EAClCG,GACFD,GAAWR,GAAeD,IAAuB,CAACE,EAChDS,EAAQF,GAAWb,EAAK,SAAW,SAEzC,OACEO,GAAA,cAACS,GAAA,CAAS,IAAKJ,GACbL,GAAA,cAACU,GAAA,CACC,KACEJ,IACKC,GAAW,WAAeC,GAAS,UAAY,UAGtD,MACGN,EAAY,YAET,GAAGA,EAAY,WAAW,MAD1BS,GAAK,EAAE,kBAAkB,EAG/B,OACET,EAAY,KACVF,GAAA,cAACY,GAAA,CACC,QAAQ,QACR,KAAK,SACL,QAAS,IAAM,OAAO,KAAKV,EAAY,IAAK,QAAQ,GACpDF,GAAA,cAACa,GAAA,CAAS,KAAM,GAAI,CACtB,EAGN,CACF,CAEJ,CAAC,EACAd,GAAmBC,GAAA,cAACU,GAAA,CAAM,KAAK,UAAU,MAAOlB,EAAQ,aAAc,EACtEC,EAAK,SAAW,UAAYE,GAC3BK,GAAA,cAACc,GAAA,CACC,cAAezB,EACf,iBAAkBC,EAClB,gBAAiBC,EACjB,QAASC,EACX,EAGDC,EAAK,SAAW,UAAYO,GAAA,cAACe,GAAA,CAAY,QAASvB,EAAS,CAC9D,CAEJ,CAnEgBwB,EAAA7B,GAAA,qBDMT,IAAM8B,GAAiB,IAGvB,IAAMC,GAAWC,EAAA,CAAC,CACvB,KAAAC,EACA,YAAAC,EACA,SAAAC,EACA,GAAGC,CACL,IAAuB,CACrB,IAAMC,EAA4BJ,EAAK,4BAA8B,GACrE,OAAOA,EAAK,MAAM,IAAI,CAACK,EAAMC,IAAU,CACrC,IAAMC,EACJD,IAAU,EACNN,EAAK,YACLA,EAAK,MAAMM,EAAQ,CAAC,EAAE,cACtBN,EAAK,MAAMM,EAAQ,CAAC,EAAE,kCAC5B,MAAO,CACL,KAAM,CACJ,MAAO,CAAE,YAAaD,EAAK,WAAY,MAAOA,EAAK,UAAY,EAAG,EAClE,MAAO,CACL,YACEG,GAA0BH,EAAK,eAAgBJ,CAAW,GAAK,GACjE,MAAOI,EAAK,oBAAsB,EACpC,EACA,MAAO,CACL,MAAOI,EACLF,EACA,EACA,CACF,EACA,UAAWA,GAAmB,EAChC,CACF,EACA,GAAI,CACF,MAAO,CAAE,YAAaF,EAAK,SAAU,MAAOA,EAAK,MAAO,EACxD,MAAO,CACL,YACEG,GAA0BH,EAAK,aAAcJ,CAAW,GAAK,GAC/D,MAAOI,EAAK,kBAAoB,EAClC,EACA,MAAO,CACL,MAAOI,EACLJ,EAAK,cAAgBA,EAAK,kCAC1B,EACA,CACF,EACA,UACEA,EAAK,cAAgBA,EAAK,mCAAqC,EACnE,CACF,EACA,QAAS,CACP,YAAaK,GAAsBL,EAAK,UAAWH,CAAQ,GAAK,GAChE,MAAOG,EAAK,aAAe,GAC3B,KAAMA,EAAK,WACb,EACA,cAAeA,EAAK,cAChBA,EAAK,cAAc,IAAKM,IACf,CACL,KAAM,CACJ,MAAO,CACL,YACEH,GACEG,EAAa,eACbV,CACF,GAAK,GACP,MAAOU,EAAa,oBAAsB,EAC5C,CACF,EACA,GAAI,CACF,MAAO,CACL,YACEH,GACEG,EAAa,aACbV,CACF,GAAK,GACP,MAAOU,EAAa,kBAAoB,EAC1C,CACF,EACA,QAAS,CACP,YACED,GAAsBC,EAAa,UAAWT,CAAQ,GAAK,GAC7D,MAAOS,EAAa,aAAe,GACnC,KAAMA,EAAa,WACrB,CACF,EACD,EACD,CAAC,EACL,OACEC,GAAA,cAACC,GAAA,CACC,KAAMR,EACN,0BAA2BD,EAC1B,GAAGD,EACN,CAEJ,CACF,CAAC,CACH,EA7FwB,YA+FjB,SAASW,GAAaT,EAAkD,CAC7E,GACEU,GAA8BV,CAAI,GAClCA,EAAK,SAAW,UAChBA,EAAK,SAAW,UAEhB,MAAO,UAGT,OAAQA,EAAK,OAAQ,CACnB,IAAK,UACH,MAAO,UACT,IAAK,WACL,IAAK,qBACL,IAAK,UACH,MAAO,cACT,IAAK,SACH,MAAO,QACT,IAAK,UACH,MAAO,WACX,CACF,CArBgBN,EAAAe,GAAA,gBTlCT,SAASE,GAAYC,EAAyB,CACnD,GAAM,CAAE,KAAAC,EAAM,UAAAC,EAAW,SAAAC,EAAU,SAAUC,CAAc,EAAIJ,EACzD,CAAE,mBAAAK,EAAoB,QAAAC,EAAS,cAAAC,CAAc,EAAIC,GAAW,EAC5DC,EAAcC,EAAY,EAAE,YAAY,EACxCC,EAAWD,EAAY,EAAE,SAAS,EAClC,CAAE,UAAAE,CAAU,EAAIF,EAAY,EAC5BG,EAAQC,EAAc,IAAI,MAAM,EAChCC,EAAcC,GAAW,IAAI,YAAY,EACzCC,EAAWC,GAAY,EACvB,CAACC,EAAUC,CAAU,EAAIC,GAAmBC,EAAc,EAC1DC,EAAUC,GAA8B,IAAI,EAC5C,CAACC,EAAYC,CAAa,EAAIC,GAAqB,IAAI,EACvD,CAACC,EAAoBC,CAAqB,EAAIF,GAElD,IAAI,EAEAG,EAAWC,EAAA,IAAM,CACrB3B,EAAc,EACdsB,EAAc,IAAI,CACpB,EAHiB,YAKXM,EAAmBC,GAAqB,IAAI,iBAAiB,EAC7DC,EAAqBD,GAAqB,IAAI,mBAAmB,EACjEE,EAAgBH,EAAiB,EACjCI,EAAcC,GAAepC,CAAI,EACjCqC,EAA2BF,GAAa,cAE9CG,GAAU,IAAM,CACYJ,EAAc,KACrCK,IAAMA,GAAE,YAAcvC,EAAK,SAC9B,IAEMA,EAAK,SAAW,WAAaA,EAAK,SAAW,UAC/C4B,EAAsB5B,EAAK,MAAM,EACjCiC,EAAmBjC,EAAK,SAAS,GACxB2B,GACTC,EAAsB,IAAI,EAGhC,EAAG,CAAC5B,EAAK,OAAQA,EAAK,SAAS,CAAC,EAEhCsC,GAAU,IAAM,CACVE,EACFf,EAAcgB,GAAyB,uBAAuB,EAE9DJ,IACEI,GAAyB,4BAC3BJ,IAA6BI,GAAyB,eAEtDhB,EAAcY,CAAwB,EAEtCZ,EAAc,IAAI,CAEtB,EAAG,CAACY,CAAwB,CAAC,EAE7B,IAAMK,EACJC,GAAkC3C,CAAI,EAElC4C,EAAwBT,EAC1BU,GAA6B7C,EAAMmC,CAAW,EAC9C,KACEW,EAAoBX,EACtBY,GAAuB/C,EAAMmC,CAAW,EACxC,KAEEa,EAAWC,GAAYjD,CAAI,EAC3BkD,GAAcC,GAAgBnD,CAAI,EAElCoD,GAAiBtB,EAACuB,IACtB,CAAC,CAAC/C,EAAc+C,EAAU,GAAG,aADR,kBAGjBb,EACJH,IACEI,GAAyB,yBAC3B,CAAC,CAACG,GACF,CAAC,CAACE,GAAmB,aACpBM,GAAeN,EAAkB,UAAU,GAC1C1C,EAAmB0C,EAAkB,WAAYF,CAAqB,GAEpEU,EAAgBd,EAClBnC,EAAQ,KAAK,KAAMyC,EAAkB,WAAYF,CAAqB,EACtE,OAEEW,GAAcC,GAAgBxD,EAAMmC,CAAW,EAC/CsB,EAAQC,GAAS,CACrB,KAAA1D,EACA,cAAAsD,EACA,iBAAkBjB,EAClB,gBAAiBZ,EACjB,QAAS8B,GACT,YAAa/C,EACb,SAAAE,CACF,CAAC,EACKiD,GAAgBF,EAAM,OACtB,CAACG,GAAWC,EAAQ,EAAI,CAAC7D,EAAK,MAAM,CAAC,EAAGA,EAAK,MAAM2D,GAAgB,CAAC,CAAC,EACrEG,EACJD,GAAS,cAAgBA,GAAS,kCAE9BE,GAAW/D,EAAK,MAAM,OAC1B,CAAC+D,GAAUN,KAAUM,GAAW,WAAWN,GAAM,UAAY,EAAE,EAC/D,CACF,EAEMO,GAAehE,EAAK,MAAM,KAC7BiE,IAASA,GAAK,YACjB,GAAG,aAEGC,GAAiBC,EACrB,WAAWL,GAAgB,GAAG,GAAKD,GAAS,YAAc,GAC1D,EACA,CACF,EAEMO,GAAgBD,EACpB,WAAWnE,EAAK,WAAW,GAAK4D,GAAU,cAAgB,GAC1D,EACA,CACF,EAEMS,EAAqBP,EACvB,IAAIQ,GAAUR,CAAY,EACvB,aAAaD,GAAS,YAAc,CAAC,EACrC,SAAS,EACZ,GAEEU,EAAoB,IAAID,GAAUtE,EAAK,WAAW,EACrD,aAAa4D,GAAU,cAAgB,CAAC,EACxC,SAAS,EAENY,EAAmBC,GAAeL,GAAeF,EAAc,EAE/DQ,GACJnB,GAAY,gBAAgB,SAAWA,GAAY,aAE/CoB,GACJ3E,EAAK,SAAW,UACd4E,GAAK,EAAE,CACL,GAAI,kFACJ,OAAQ,CACN,OAAQT,EACNL,EACA,EACA,CACF,EACA,MAAOL,EAAME,GAAgB,CAAC,EAAE,GAAG,MAAM,YACzC,eAAgBkB,GACd7E,EAAK,QAAQyD,EAAME,GAAgB,CAAC,EAAE,GAAG,MAAM,WAAW,GACtD,SAAW,EACjB,EACA,MAAOF,EAAME,GAAgB,CAAC,EAAE,GAAG,MAAM,WAC3C,CACF,CAAC,EAEDmB,EAAA,cAACC,GAAA,KACCD,EAAA,cAACE,GAAA,CACC,QAAQ,OACR,KAAK,SACL,MAAM,aACN,MAAM,UACJN,GAA0D,GAAtCE,GAAK,EAAE,2BAA2B,EACvDlC,EACG,GAAGkC,GAAK,EAAE,CACR,GAAI,0DACJ,OAAQ,CACN,OAAQlC,EAA+B,aACvC,OAAQA,EAA+B,OACvC,WAAYA,EAA+B,UAC7C,CACF,CAAC,CAAC,GACF,EACN,EACCgC,IACCI,EAAA,cAACG,GAAA,CACC,MAAM,SACN,QAAQ,OACR,KAAK,SACL,MAAM,cACNH,EAAA,cAAC,SAAE,SAAO,EAAI,IAAEJ,EAClB,CAEJ,EAGJ,OACEI,EAAA,cAACI,GAAA,CACC,OAAQ,CACN,MAAON,GAAK,EAAE,cAAc,EAC5B,SACE5E,EAAK,SAAW,UAAY,IAAMyB,EAAc,QAAQ,EAAI,OAC9D,OAAQzB,EAAK,SAAW,WACtB8E,EAAA,cAACK,GAAA,KACCL,EAAA,cAACM,GAAA,CACC,QAAQ,QACR,KAAK,QACL,KAAK,SACL,QAAS,IAAM3D,EAAc,QAAQ,GACrCqD,EAAA,cAACE,GAAA,CAAW,KAAK,SAAS,QAAQ,QAAQ,MAAM,SAC7CJ,GAAK,EAAE,QAAQ,CAClB,CACF,CACF,CAEJ,EACA,OACE1B,IACA,CAACvB,GACCmD,EAAA,cAACM,GAAA,CACC,UAAS,GACT,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAAS,IAAM,CACb,IAAMC,GAAYC,GAAiBtF,EAAMQ,EAAaG,CAAS,EAC/DC,EAAMyE,EAAS,EACf,WAAW,IAAM,CAEfrE,EADa,QACA,CACf,EAAG,CAAC,CACN,GACC4D,GAAK,EAAE,WAAW,CACrB,GAGJE,EAAA,cAACS,GAAA,CAAc,QAAO,GAAC,KAAI,IACzBT,EAAA,cAACU,GAAA,KACCV,EAAA,cAAC,OAAI,UAAWW,GAAU,GACxBX,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5C,GAAGJ,GAAK,EAAE,YAAY,CAAC,GAC1B,EACAE,EAAA,cAAC,OAAI,UAAWY,GAAgB,GAC9BZ,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5C/E,CACH,EACA6E,EAAA,cAACa,GAAA,CACC,UAAWC,EAAa,EACxB,QACE1E,EACI0D,GAAK,EAAE,qBAAqB,EAC5BA,GAAK,EAAE,iBAAiB,EAE9B,KAAM1D,GAAY,OAClB,KAAK,SACL,YAAa,IACb,MAAM,OACN4D,EAAA,cAACe,GAAA,CACC,QAAQ,QACR,QAAS1E,EAAW,KAAK,KAAMlB,GAAa,EAAE,GAC7CiB,EACC4D,EAAA,cAACgB,GAAA,CAAS,KAAM,GAAI,MAAM,YAAY,EAEtChB,EAAA,cAACiB,GAAA,CAAS,KAAM,GAAI,MAAM,OAAO,CAErC,CACF,EAEAjB,EAAA,cAACkB,GAAA,CACC,OAAO,SACP,KAAM,GAAGC,EAAgB,SAAShG,CAAS,IAC3C6E,EAAA,cAACa,GAAA,CACC,UAAWC,EAAa,EACxB,QAAShB,GAAK,EAAE,wBAAwB,EACxC,KAAK,UACLE,EAAA,cAACoB,GAAA,CAAkB,KAAM,GAAI,CAC/B,CACF,CACF,CACF,EACApB,EAAA,cAAC,OAAI,UAAWW,GAAU,GACxBX,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5ChF,EAAK,WAAa4E,GAAK,EAAE,aAAa,EAAIA,GAAK,EAAE,YAAY,CAChE,EACAE,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5ChC,CACH,CACF,CACF,EAEA8B,EAAA,cAAC,OAAI,UAAWqB,GAAa,GAC3BrB,EAAA,cAACsB,GAAA,CACC,IAAKjC,EACH,OAAOJ,EAAQ,EACf,EACA,CACF,EACA,KAAMsC,GAAuBC,GAAiBtG,EAAK,KAAK,CAAC,EACzD,MAAO2D,GACT,EACAmB,EAAA,cAACyB,GAAA,CACC,KAAM,CACJ,MAAO,CACL,MAAOpC,EACLnE,EAAK,YACL,EACA,CACF,EACA,SAAUoE,GACV,aAAcG,EACd,UAAWvE,EAAK,WAClB,EACA,MAAO,CACL,YAAayD,EAAM,CAAC,EAAE,KAAK,MAAM,YACjC,MAAOA,EAAM,CAAC,EAAE,KAAK,MAAM,KAC7B,EACA,MAAO,CACL,MAAOA,EAAM,CAAC,EAAE,KAAK,MAAM,MAC3B,YAAaA,EAAM,CAAC,EAAE,KAAK,MAAM,WACnC,CACF,EACA,GAAI,CACF,MAAO,CACL,MAAOU,EACLL,EACA,EACA,CACF,EACA,SAAUI,GACV,aAAcG,EACd,UAAWP,GAAgB,EAC7B,EACA,MAAO,CACL,YAAaL,EAAME,GAAgB,CAAC,EAAE,GAAG,MAAM,YAC/C,MAAOF,EAAME,GAAgB,CAAC,EAAE,GAAG,MAAM,KAC3C,EACA,MAAO,CACL,MAAOF,EAAME,GAAgB,CAAC,EAAE,GAAG,MAAM,MACzC,YAAaF,EAAME,GAAgB,CAAC,EAAE,GAAG,MAAM,WACjD,CACF,EACA,iBAAkBQ,EAChBK,EACA,EACA,CACF,EACA,aAAcgC,GAAoBhC,GAAoB,CAAC,EACzD,CACF,EACAM,EAAA,cAAC,OAAI,UAAW2B,GAAiB,GAC/B3B,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BJ,GAAK,EAAE,aAAa,CACvB,CACF,EACAE,EAAA,cAAC4B,GAAA,CAAQ,KAAM,EAAG,EAClB5B,EAAA,cAAC6B,GAAA,CAAU,IAAKrF,GACbmC,EAAM,IAAI,CAACQ,GAAM2C,KAAU,CAC1B,IAAMC,GAAMD,GACNE,GAAQC,GAAa/G,EAAK,MAAM4G,EAAK,CAAC,EACtCI,GACJF,KAAU,SACVA,KAAU,eACVA,KAAU,WACTA,KAAU,aAAeF,KAAUnD,EAAM,OAAS,EACrD,OACEqB,EAAA,cAACmC,GAAA,CACC,IAAKJ,GACL,KAAM5C,GACN,KAAK,gBACL,IAAK3C,EACL,MAAOwF,GACP,aAAcF,KAAU,EACxB,SAAUC,GACV,UAAWG,GACX,iBAAkBpB,EAAa,EACjC,CAEJ,CAAC,CACH,CACF,EAEAd,EAAA,cAACoC,GAAA,CACC,MAAO1F,EACP,QAAS,IAAMC,EAAc,IAAI,EACjC,SAAUI,EACV,SAAU3B,EACV,QAASqD,GAAY,gBAAgB,QACrC,kBAAmBT,EACnB,qBAAsB,CAAChC,EACzB,EACAgE,EAAA,cAACqC,GAAA,CACC,KAAM,CAAC,CAACxF,EACR,aAAcqC,GACd,QAAS,IAAMpC,EAAsB,IAAI,EACzC,OAAQ5B,EAAK,SAAW,UAAY,UAAY,SAChD,WAAYmE,EACVL,EACA,EACA,CACF,EACA,SAAUI,GACV,aAAcG,EACd,UAAWP,GAAgB,GAC3B,iBAAkBK,EAChBK,EACA,EACA,CACF,EACA,MAAO,CACL,YAAaf,EAAME,GAAgB,CAAC,EAAE,GAAG,MAAM,YAC/C,MAAOF,EAAME,GAAgB,CAAC,EAAE,GAAG,MAAM,KAC3C,EACA,MAAO,CAAE,MAAOF,EAAME,GAAgB,CAAC,EAAE,GAAG,MAAM,KAAM,EACxD,YAAagB,GACf,CACF,CAEJ,CApZgB7C,EAAAhC,GAAA,eehFhB,OAAS,QAAAsH,OAAY,eACrB,OAAS,WAAAC,GAAS,YAAAC,GAAU,YAAAC,GAAU,cAAAC,OAAkB,gBACxD,OAAOC,OAAW,QCJlB,OAAS,QAAAC,OAAY,eACrB,OAAS,WAAAC,GAAS,YAAAC,GAAU,cAAAC,OAAkB,gBAC9C,OAAOC,OAAW,QCFlB,OAAS,OAAAC,GAAK,UAAAC,OAAc,gBAErB,IAAMC,GAAYD,GAAO,MAAO,CACrC,MAAO,OACP,OAAQ,OACR,QAAS,SACX,CAAC,EAEYE,GAAgBF,GAAO,MAAO,CACzC,gBAAiB,cACjB,aAAc,MACd,QAAS,SACX,CAAC,EAEYG,GAAgBH,GAAO,MAAO,CACzC,MAAO,MACP,OAAQ,MACR,WAAY,yBACZ,WAAY,MACd,CAAC,EAEYI,GAAyBL,GAAI,CACxC,QAAS,OACT,eAAgB,gBAChB,WAAY,QACd,CAAC,EAEYM,GAAoBN,GAAI,CACnC,QAAS,OACT,eAAgB,gBAChB,WAAY,QACd,CAAC,EAEYO,GAAaP,GAAI,CAC5B,WAAY,MACZ,QAAS,MACX,CAAC,EAEYQ,GAAqBR,GAAI,CACpC,QAAS,QACX,CAAC,EAEYS,GAA8BT,GAAI,CAC7C,MAAO,MACP,OAAQ,MACR,WAAY,wBACZ,WAAY,MACd,CAAC,EAEYU,GAAmBV,GAAI,CAClC,cAAe,KACjB,CAAC,EAEYW,GAAkBX,GAAI,CACjC,QAAS,OACT,eAAgB,QAChB,WAAY,QACd,CAAC,EAEYY,GAAmBZ,GAAI,CAClC,WAAY,KACZ,QAAS,OACT,WAAY,QACd,CAAC,EAEYa,GAAiBb,GAAI,CAChC,QAAS,OACT,WAAY,QACd,CAAC,EAEYc,GAAiBd,GAAI,CAChC,QAAS,QACT,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CAAC,EAEYe,GAAkBf,GAAI,CACjC,QAAS,OACT,WAAY,MACZ,cAAe,IACjB,CAAC,EDpEM,SAASgB,IAAqB,CACnC,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAqB,KAAK,eAAe,EAC1CF,GAAA,cAAC,OAAI,UAAU,eACbA,GAAA,cAACG,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BC,GAAK,EAAE,aAAa,CACvB,CACF,EAEAJ,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAa,UAAW,GAAO,EAChCN,GAAA,cAAC,OAAI,UAAWO,GAAgB,GAC9BP,GAAA,cAACQ,GAAA,CAAQ,UAAU,aAAa,KAAM,GAAI,EAC1CR,GAAA,cAACS,GAAA,CAAS,OAAQ,GAAI,QAAQ,cAAc,CAC9C,CACF,EACAT,GAAA,cAACU,GAAA,IAAc,EACfV,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAa,UAAW,GAAO,CAClC,EACAN,GAAA,cAACU,GAAA,IAAc,EACfV,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAa,UAAW,GAAO,CAClC,EACAN,GAAA,cAACU,GAAA,IAAc,EACfV,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAa,UAAW,GAAO,CAClC,CACF,CACF,CAEJ,CAjCgBK,EAAAZ,GAAA,sBDMT,SAASa,GAAuBC,EAAwC,CAC7E,GAAM,CAAE,UAAAC,EAAW,aAAAC,CAAa,EAAIF,EACpC,OACEG,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,cAAc,EAC5B,OAAQF,GAAA,cAACG,GAAA,IAAgB,CAC3B,GACCJ,GACCC,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACK,GAAA,KACCL,GAAA,cAAC,OAAI,UAAWM,GAAU,GACxBN,GAAA,cAACO,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5C,GAAGL,GAAK,EAAE,YAAY,CAAC,GAC1B,EACAF,GAAA,cAAC,OAAI,UAAWQ,GAAgB,GAC9BR,GAAA,cAACO,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC7CP,GAAA,cAACS,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CACrD,EACAT,GAAA,cAACU,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCV,GAAA,cAACS,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,cAAc,EACvDT,GAAA,cAACU,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCV,GAAA,cAACS,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,cAAc,CACzD,CACF,EACAT,GAAA,cAAC,OAAI,UAAWM,GAAU,GACxBN,GAAA,cAACO,GAAA,CACC,UAAWI,GAAsB,EACjC,QAAQ,QACR,KAAK,QACL,MAAM,cACNX,GAAA,cAACS,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CACrD,EACAT,GAAA,cAACO,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC7CP,GAAA,cAACS,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CACrD,CACF,CACF,EACAT,GAAA,cAACY,GAAA,IAAmB,CACtB,EAED,CAACb,GACAC,GAAA,cAACa,GAAA,KACCb,GAAA,cAACc,GAAA,CACC,MAAOZ,GAAK,EAAE,WAAW,EACzB,YAAaA,GAAK,EAAE,CAClB,GAAI,gDACJ,OAAQ,CAAE,UAAAJ,CAAU,CACtB,CAAC,EACH,CACF,CAEJ,CAEJ,CAtDgBiB,EAAAnB,GAAA,0BhBNT,SAASoB,IAAkB,CAChC,GAAM,CAAE,QAAAC,EAAS,MAAAC,CAAM,EAAIC,GAAW,EAChCC,EAAU,CAACF,EAAM,oBACjBG,EAAeC,GAAgBL,CAAO,EACtC,CAAE,UAAAM,CAAU,EAAIC,GAAiC,EACjDC,EAAeC,GAAgB,EAC/B,CAAE,YAAaC,CAAgB,EAAIC,EAAY,EAErD,GAAI,CAACL,EACH,OACEM,GAAA,cAACC,GAAA,CACC,gBAAiB,CAAE,OAAQ,MAAO,EAClC,KAAK,QACL,MAAOC,GAAK,EACV,0DACF,EACF,EAIJ,IAAMC,EAAeZ,GAAWO,IAAoB,UAE9CM,EAAeV,EACjBF,EAAa,KAAK,CAAC,CAAE,KAAAa,CAAK,IAAMA,EAAK,YAAcX,CAAS,EAC5D,OAEEY,EAAWC,EAAA,IAAM,CACrB,GAAIH,GAAc,GAAI,CACpB,IAAMC,EAAOjB,GAAS,IAAIgB,EAAa,EAAE,EACrCC,GACFG,GAAWH,CAAI,CAEnB,CACF,EAPiB,YASXI,EAAWF,EAAA,SAAY,CAC3B,GAAIH,GAAc,GAChB,GAAI,CACFhB,GAAS,YAAYgB,EAAa,EAAE,EACpCR,EAAa,CACf,OAASc,EAAG,CACV,QAAQ,IAAIA,CAAC,CACf,CAEJ,EATiB,YAUXL,EAAOD,GAAc,KAE3B,MAAI,CAACC,GAAQF,EAETH,GAAA,cAACW,GAAA,CACC,UAAWjB,EACX,aAAcS,EAChB,EAKFH,GAAA,cAACY,GAAA,CACC,KAAMP,EACN,UAAWX,EACX,SAAUY,EACV,SAAUG,EACZ,CAEJ,CAhEgBF,EAAApB,GAAA,mBmBXhB,OAAS,QAAA0B,OAAY,eACrB,OACE,WAAAC,GACA,sBAAAC,GACA,0BAAAC,GACA,UAAAC,GACA,cAAAC,GACA,UAAAC,OACK,gBACP,OAAOC,IAAS,YAAAC,OAAgB,QAahC,IAAMC,GAAgBC,GAAO,MAAO,CAClC,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,IAAK,MACL,SAAU,OACV,WAAY,IACd,CAAC,EAEKC,GAAYD,GAAOE,GAAe,CACtC,UAAW,QACb,CAAC,EAEM,SAASC,IAAc,CAC5B,GAAM,CAAE,YAAaC,CAAgB,EAAIC,EAAY,EAC/C,CAACC,EAAoBC,CAAqB,EAAIC,GAAiB,KAAK,EACpEC,EAAcJ,EAAY,EAAE,YAAY,EACxC,CAAE,OAAAK,CAAO,EAAIL,EAAY,EAEzB,CAACM,EAAyBC,CAA0B,EACxDJ,GAA8B,EAC1BK,EAAcC,GAAW,IAAI,YAAY,EAEzC,CAAE,KAAAC,CAAK,EAAIC,GAAc,EAEzBC,EAAsBC,GAA+BH,EAAMN,CAAW,EAEtEU,EADwBC,GAAmBH,CAAmB,IACrB,EAEzCI,EAAkBC,GAAwBP,EAAMT,CAAkB,EAElEiB,EAAwBC,EAACC,GAAgC,CACzDC,GAAqBX,EAAML,EAAO,YAAY,GAIlDE,EAA2Ba,CAAM,CACnC,EAN8B,yBAQ9B,OACEE,GAAA,cAACC,GAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,iBAAiB,CACjC,GACAF,GAAA,cAAC1B,GAAA,KACEkB,GACCQ,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACG,GAAA,CACC,YAAavB,EACb,SAAUD,EACV,YAAaW,EACb,UAAWb,IAAoB,UACjC,EACAuB,GAAA,cAACI,GAAA,CAAQ,KAAM,GAAI,CACrB,EAEFJ,GAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAAU,MAAM,UAC9CH,GAAK,EAAE,6BAA6B,CACvC,EACAF,GAAA,cAAC5B,GAAA,KACEsB,EAAgB,IAAI,CAACI,EAAQQ,IAAU,CACtC,IAAMC,EAAM,UAAUD,CAAK,IAAIR,EAAO,IAAI,GAC1C,OACEE,GAAA,cAACQ,GAAA,CACC,IAAKD,EACJ,GAAGT,EACJ,UAAWW,EAAa,EACxB,QAAS,IAAMb,EAAsBE,CAAM,EAC3C,UAAWrB,IAAoB,UAC/B,SAAU,CAACS,EACb,CAEJ,CAAC,EACDc,GAAA,cAACU,GAAA,CACC,OAAQ1B,EACR,QAAS,IAAM,CACbC,EAA2B,MAAS,CACtC,EACF,CACF,CACF,CACF,CAEJ,CAtEgBY,EAAArB,GAAA,e5JjBT,SAASmC,IAAY,CAO1B,OAAAC,GAAwB,EACxBC,GAAmB,EAEZC,GAAU,CACf,CACE,KAAMC,EAAiB,KACvB,QAASC,GAAA,cAACC,GAAA,IAAK,CACjB,EACA,CACE,KAAMF,EAAiB,OACvB,QAASC,GAAA,cAACE,GAAA,IAAW,CACvB,EACA,CACE,KAAMH,EAAiB,SACvB,SAAU,CACR,CACE,MAAO,GACP,QAASC,GAAA,cAACG,GAAA,CAAoB,KAAK,SAAS,CAC9C,EACA,CACE,KAAMJ,EAAiB,YACvB,QAASC,GAAA,cAACI,GAAA,CAAqB,KAAK,SAAS,CAC/C,CACF,CACF,EACA,CACE,KAAML,EAAiB,OACvB,SAAU,CACR,CACE,MAAO,GACP,QAASC,GAAA,cAACG,GAAA,CAAoB,KAAK,cAAc,CACnD,EACA,CACE,KAAMJ,EAAiB,YACvB,QAASC,GAAA,cAACI,GAAA,CAAqB,KAAK,cAAc,CACpD,CACF,CACF,EACA,CACE,KAAML,EAAiB,SACvB,SAAU,CACR,CACE,MAAO,GACP,QAASC,GAAA,cAACK,GAAA,IAAa,CACzB,EACA,CACE,KAAMN,EAAiB,UACvB,QAASC,GAAA,cAACM,GAAA,IAAa,CACzB,EACA,CACE,KAAMP,EAAiB,UACvB,QAASC,GAAA,cAACO,GAAA,CAAoB,WAAW,YAAY,CACvD,EACA,CACE,KAAMR,EAAiB,QACvB,QAASC,GAAA,cAACO,GAAA,CAAoB,WAAW,UAAU,CACrD,EACA,CACE,KAAMR,EAAiB,aACvB,SAAU,CACR,CACE,MAAO,GACP,QAASC,GAAA,cAACQ,GAAA,IAAiB,CAC7B,EACA,CACE,KAAMT,EAAiB,gBACvB,SAAU,CACR,CACE,MAAO,GACP,QAASC,GAAA,cAACS,GAAA,IAAmB,CAC/B,EACA,CACE,KAAMV,EAAiB,YACvB,QACEC,GAAA,cAACI,GAAA,CACC,aAAc,GACd,KAAK,eACP,CAEJ,CACF,CACF,CACF,CACF,CACF,CACF,EAEA,CACE,KAAML,EAAiB,MACvB,SAAU,CACR,CACE,MAAO,GACP,QAASC,GAAA,cAACU,GAAA,IAAY,CACxB,EACA,CACE,KAAMX,EAAiB,YACvB,QAASC,GAAA,cAACW,GAAA,IAAgB,CAC5B,CACF,CACF,EACA,CACE,KAAMZ,EAAiB,QACvB,QAASC,GAAA,cAACY,GAAA,IAAY,CACxB,EACA,CACE,KAAMb,EAAiB,YACvB,QAASC,GAAA,cAACa,GAAA,IAAgB,CAC5B,CACF,CAAC,CACH,CApHgBC,EAAAnB,GAAA,a6JlBhB,OAAS,mBAAAoB,OAAuB,wCAChC,OAAS,sBAAAC,OAA0B,4BACnC,OAAS,mBAAAC,OAAuB,YAChC,OAAS,cAAAC,GAAY,aAAAC,GAAW,YAAAC,OAAgB,QCLhD,OAAS,aAAAC,OAAiB,gBAEnB,IAAMC,GAAaC,EAAA,IACxBC,GAAU,CACR,UACE,uJACJ,CAAC,EAAE,EAJqB,cCanB,SAASC,IAAuC,CACrD,GAAM,CAAE,aAAAC,CAAa,EAAIC,GAAW,EAepC,MAAO,CAAE,eAbmDC,EAAA,SAAY,CACtE,IAAMC,EAAW,MAAM,MACrB,GAAGC,GAAU,UAAU,CAAC,4BAA4BA,GAAU,SAAS,CAAC,EAC1E,EAEA,GAAI,CAACD,EAAS,GACZ,MAAM,IAAI,MAAM,+BAA+BA,EAAS,MAAM,GAAG,EAGnE,IAAME,EAAuB,MAAMF,EAAS,KAAK,EAEjDH,EAAaK,EAAK,OAAO,SAAS,CACpC,EAZ4D,iBAapC,CAC1B,CAjBgBH,EAAAH,GAAA,qBCfhB,OAAS,cAAAO,OAAkB,2BAC3B,OAAS,aAAAC,GAAW,UAAAC,OAAc,QAK3B,SAASC,IAA4B,CAC1C,GAAM,CAAE,QAAAC,EAAS,MAAAC,CAAM,EAAIC,GAAW,EAChCC,EAAYC,GAAmC,CAAC,CAAC,EACjD,CAAE,YAAAC,CAAY,EAAIC,EAAY,EAC9BC,EACJ,IAAI,gBAAgB,SAAS,MAAM,EAAE,iBAA6B,GAAK,GACnEC,EAAcP,EAAMM,CAAU,EAEpCE,GAAU,IAAM,CAEZJ,IAAgB,WAChBE,GACAC,EAAY,WACZ,CAACA,EAAY,YACb,CAACA,EAAY,WACS,CAACL,EAAU,QAAQI,CAAU,IACnDJ,EAAU,QAAQI,CAAU,EAAI,GAC3BP,EAAQO,CAAU,EAE3B,EAAG,CAACC,EAAaH,CAAW,CAAC,CAC/B,CApBgBK,EAAAX,GAAA,uBCJhB,OACE,gBAAAY,GACA,kBAAAC,GACA,iBAAAC,GACA,4BAAAC,GACA,gBAAAC,OACK,wCACP,OAAS,aAAAC,OAAiB,QAOnB,SAASC,IAA6B,CAC3C,IAAMC,EAAmBC,EAAgB,IAAI,iBAAiB,EACxDC,EAAoBD,EAAgB,IAAI,kBAAkB,EAC1DE,EAAkBC,GAAqB,IAAI,gBAAgB,EAC3D,CAAE,UAAAC,CAAU,EAAIC,EAAY,EAElCC,GAAU,IAAM,CACd,IAAMC,EAAkBC,EAACC,GAA+B,CACtD,GAAM,CAAE,MAAAC,EAAO,KAAAC,EAAM,MAAAC,CAAM,EAAIH,EAO/B,GALGC,EAAM,OAASG,GAAc,cAC5BH,EAAM,SAAWI,GAAyB,SAC1C,CAACC,GAAaJ,CAAI,GACpBD,EAAM,OAASG,GAAc,UAEL,CACxB,IAAMG,EAAcjB,EAAiB,KAClCkB,GAAYA,EAAQ,QAAUN,GAAM,cACvC,EACMO,EACJP,GAAM,iBAAmBA,GAAM,cAC/BZ,EAAiB,KACdoB,GAAWA,EAAO,QAAUR,GAAM,YACrC,EAEFK,GAAef,EAAkB,CAACe,CAAW,EAAGZ,CAAS,EACzDc,GAAajB,EAAkB,CAACiB,CAAS,EAAGd,CAAS,CACvD,CAEAF,EAAgBQ,EAAOE,CAAK,CAC9B,EAvBwB,mBAwBxB,OAAAQ,GAAa,GAAGC,GAAa,UAAWd,CAAe,EAChD,IAAMa,GAAa,IAAIC,GAAa,UAAWd,CAAe,CACvE,EAAG,CAACa,GAAcrB,CAAgB,CAAC,EAEnCO,GAAU,IAAM,CACd,IAAMgB,EAAmBd,EAACC,GAAgC,CACxD,GAAM,CAAE,MAAAC,EAAO,MAAAE,CAAM,EAAIH,GAGvBC,EAAM,OAASa,GAAe,QAC9Bb,EAAM,OAASa,GAAe,YAE9BrB,EAAgBQ,EAAOE,CAAK,CAEhC,EATyB,oBAUzB,OAAAQ,GAAa,GAAGC,GAAa,WAAYC,CAAgB,EAElD,IAAMF,GAAa,IAAIC,GAAa,WAAYC,CAAgB,CACzE,EAAG,CAACF,EAAY,CAAC,CACnB,CAlDgBZ,EAAAV,GAAA,8BChBhB,OAAS,cAAA0B,OAAkB,iCAC3B,OAAS,aAAAC,OAAiB,QAKnB,SAASC,IAAuB,CACrC,GAAM,CAAE,SAAAC,EAAU,kBAAAC,CAAkB,EAAIC,GAAqB,EACvD,CAAE,QAAAC,EAAS,MAAAC,CAAM,EAAIC,GAAW,EAEtCC,GAAU,IAAM,CAEZJ,GAAqB,QAAQ,YAAY,GACzCE,EAAM,qBACN,CAACJ,GAGDC,EAAkBM,GAAgBJ,CAAO,CAAC,CAE9C,EAAG,CACDD,GAAqB,QAAQ,YAAY,EACzCE,EAAM,oBACNJ,CACF,CAAC,CACH,CAlBgBQ,EAAAT,GAAA,wBLaT,SAASU,IAAe,CAC7BC,GAAoB,EACpBC,GAAW,EACXC,GAA2B,EAC3BC,GAAqB,EACrB,IAAMC,EAAcC,EAAY,EAAE,YAAY,EACxC,CAAE,mBAAAC,CAAmB,EAAIC,GAAW,EACpC,CAACC,EAAgCC,CAAiC,EACtEC,GAAS,EAAE,EACP,CAACC,EAAoBC,CAAqB,EAAIF,GAAqB,EACnEG,EAAgBC,GAAWC,EAAa,EAExCC,EAAYZ,EAAY,OAAOa,EAAe,EAE9C,CAAE,eAAAC,CAAe,EAAIC,GAAkB,EAG7CC,GAAU,IAAM,IAAMC,GAAsB,EAAG,CAAC,CAAC,EAGjDC,GAAgB,CACd,oBAAqBd,EACrB,wBAAyB,IAAM,CAC7BI,EAAsB,MAAS,CACjC,EACA,mBAAoBD,EACpB,UAAAK,EACA,mBAAAV,CACF,CAAC,EAEDc,GAAU,KACRG,GAAW,KAAK,EAEXC,GAAqB,QAAQ,YAAY,GACvCA,GAAqB,QAAQ,UAAU,EAY9CX,EAAc,gBAAgBJ,CAAiC,EAC/DI,EAAc,mBAAoBY,GAAe,CAC/Cb,EAAsBa,CAAU,EAE9BA,IAAeC,GAAmBlB,CAA8B,IAAI,CAAC,GAErEC,EAAkC,EAAE,CAExC,CAAC,EAEIS,EAAe,EAAE,MAAM,QAAQ,GAAG,EAEhCK,GAAW,SACjB,CAAC,CAAC,CACP,CA5DgBI,EAAA5B,GAAA,gBMnBhB,OAAS,UAAA6B,OAAc,gBAEhB,IAAMC,GAAgBD,GAAO,MAAO,CACzC,WAAY,UACZ,UAAW,aACX,UAAW,OACX,2BAA4B,CAC1B,UAAW,SACb,EACA,oBAAqB,CACnB,aAAc,WACd,WAAY,MACd,EACA,eAAgB,CAAE,cAAe,MAAO,CAC1C,CAAC,EpKHM,SAASE,IAAO,CACrBC,GAAa,EACb,GAAM,CAAE,OAAAC,CAAO,EAAIC,EAAY,EACzB,CAAE,YAAAC,CAAY,EAAIC,GAASH,GAAQ,OAAS,CAAC,CAAC,EAC9C,CAAE,eAAAI,CAAe,EAAIC,GAAY,EAEvC,OACEC,GAAA,cAACC,GAAA,CAAY,SAAUH,GACrBE,GAAA,cAACE,GAAA,CAAc,GAAG,iBAAiB,UAAWN,EAAY,GACxDI,GAAA,cAACG,GAAA,IAAU,CACb,CACF,CAEJ,CAbgBC,EAAAZ,GAAA,QqKRhB,OAAS,yBAAAa,OAA6B,2BACtC,OAAOC,IAAS,aAAAC,GAAW,WAAAC,OAAe,QCJ1C,OAAS,YAAAC,OAAgB,QASzB,IAAMC,GAAgBC,EAAA,IAAM,CAC1B,GAAM,CAACC,EAAUC,CAAW,EAAIC,GAAiC,IAAI,EAE/DC,EAAWJ,EAACK,GAAoB,CACpC,IAAMC,EAAO,SAAS,cAAc,MAAM,EAC1C,OAAAA,EAAK,KAAOD,EACZC,EAAK,IAAM,aACX,SAAS,KAAK,YAAYA,CAAI,EACvBA,CACT,EANiB,YAQXC,EAAaP,EAAA,IAAM,CACnBC,IACF,SAAS,KAAK,YAAYA,CAAQ,EAClCC,EAAY,IAAI,EAEpB,EALmB,cAgBnB,MAAO,CAAE,qBAToBF,EAACQ,GAAqB,CACjDD,EAAW,EACX,IAAMF,EAAUI,GAAiBD,CAAQ,EACzC,GAAIH,EAAS,CACX,IAAMK,EAAcN,EAASC,CAAO,EACpCH,EAAYQ,CAAW,CACzB,CACF,EAP6B,uBASC,CAChC,EA5BsB,iBA8BfC,GAAQZ,GCnCf,OACE,gCAAAa,GACA,uBAAAC,OACK,wCACP,OAAS,YAAYC,OAAuB,iCAC5C,OAAS,cAAAC,OAAkB,2BAC3B,OAAS,0CAAAC,OAA8C,4BACvD,OAAS,mBAAAC,OAAuB,cAChC,OAAOC,IAAS,WAAAC,OAAe,QAS/B,SAASC,GAAaC,EAA+C,CACnE,GAAM,CACJ,UAAAC,EACA,WAAAC,EACA,MAAAC,EACA,QAAAC,EACA,mBAAAC,EACA,cAAAC,CACF,EAAIC,GAAW,EAETC,EAAeC,GAAQ,IACpBC,GAAoB,CACzB,QAASV,EAAM,QAAUW,GAAU,SAAS,EAC5C,SAAUA,GAAU,UAAU,EAC9B,QAAS,CACP,KAAMC,GAAa,IACrB,CACF,CAAC,EACA,CAACZ,EAAM,MAAM,CAAC,EAEXa,EAAcC,EAAY,EAAE,YAAY,EAGxCC,EAAU,CACd,YAHuBC,EAAgB,IAAI,iBAAiB,EAG9B,IAAKC,IAAY,CAC7C,SAAU,CAACA,CAAM,EACjB,KAAMA,EAAO,KACf,EAAE,CACJ,EAEMC,EAAgBC,EAAA,MAAOF,EAAoBG,IAAqB,CACpE,GAAKf,EAAmBY,EAAQG,CAAO,EAGvC,OAAOhB,EAAQa,EAAQG,CAAO,CAChC,EALsB,iBAOhBC,EAAiBF,EAACG,GACtB,CAAC,CAAChB,EAAcgB,CAAU,EAAE,aADP,kBAIjBC,EAAiBV,EACpB,OAAQW,GAAeA,EAAW,OAAO,EACzC,OACC,CAACC,EAAqBD,KACnBC,EAAeD,EAAW,IAAI,EAAIA,EAAaC,GAElD,CAAC,CACH,EACIC,EAAiBb,EAAY,OAAOc,EAAe,EACnDC,EAAyBT,EAACU,GAAqB,CACnD,GAAM,CAAE,gBAAAC,CAAgB,EAAIxB,EAAcuB,CAAI,EAC9C,OAAOE,GAA8BD,CAAe,CACtD,EAH+B,0BAIzBE,EAAe/B,EAAU,EAEzBgC,EAA4B,CAChC,KAAM,CACJ,YAAaV,EACb,eAAgBG,EAChB,oBACEQ,GAAuCR,CAAc,EACvD,uBAAAE,CACF,EACA,WAAA1B,EACA,QAAAa,EACA,UAAWiB,EACX,cAAAd,EACA,mBAAAb,EACA,QAAAD,EACA,MAAAD,EACA,eAAAkB,CACF,EAEMc,EAAcC,GAAW,IAAI,YAAY,EAE/C,OACEC,GAAA,cAACC,GAAA,CACC,WAAY,CAAC9B,CAAY,EACzB,QAASyB,EACT,sBAAwBM,GAAY,CAClCC,GAA6BD,CAAO,CACtC,EACA,SAAU,CAACJ,GACVnC,EAAM,QACT,CAEJ,CAvFSmB,EAAApB,GAAA,gBAyFT,IAAO0C,GAAQ1C,GC5Gf,OAAS,cAAA2C,OAAkB,iCAC3B,OAAOC,IAAS,iBAAAC,GAAe,cAAAC,OAAkB,QCG1C,SAASC,IAAuB,CACrC,GAAM,CAAE,UAAAC,CAAU,EAAIC,EAAY,EAC5BC,EAAcD,EAAY,EAAE,YAAY,EACxCE,EAASF,EAAY,EAAE,OAAO,EAC9B,CACJ,kBAAAG,EACA,aAAAC,EACA,gBAAAC,EACA,WAAAC,EACA,eAAAC,CACF,EAAIC,EAAc,EAgClB,OA9B6CC,EAACC,GAAW,CACvD,GAAM,CAAE,eAAAC,EAAgB,UAAAC,EAAW,aAAAC,EAAc,QAAAC,EAAS,cAAAC,CAAc,EACtEL,EACIM,EAAO,CAAE,YAAAf,EAAa,OAAAC,CAAO,EAEnC,GAAIS,IAAmB,OAAW,CAChC,IAAMM,EACJhB,EAAY,KAAMiB,GAAeA,EAAW,OAASP,CAAc,GACnE,KACFR,EAAkBc,CAAc,CAClC,CACA,GAAIL,IAAc,OAAW,CAC3B,IAAMO,EAAQP,EAAYb,EAAUa,CAAS,GAAK,KAAO,KACzDR,EAAa,CAAE,KAAAY,EAAM,MAAAG,CAAM,CAAC,CAC9B,CACA,GAAIN,IAAiB,OAAW,CAC9B,IAAMI,EACJhB,EAAY,KAAMiB,GAAeA,EAAW,OAASL,CAAY,GACjE,KACFR,EAAgBY,CAAc,CAChC,CACA,GAAIH,IAAY,OAAW,CACzB,IAAMK,EAAQL,EAAUf,EAAUe,CAAO,GAAK,KAAO,KACrDR,EAAW,CAAE,KAAAU,EAAM,MAAAG,CAAM,CAAC,CAC5B,CACIJ,IAAkB,QACpBR,EAAeQ,CAAa,CAEhC,EA5B6C,oBA+B/C,CA3CgBN,EAAAX,GAAA,wBCDhB,OACE,cAAAsB,GACA,gCAAAC,GACA,kBAAAC,GACA,0BAAAC,OACK,wCAUA,IAAMC,GAAN,KAAoB,CApB3B,MAoB2B,CAAAC,EAAA,sBAIzB,YAAYC,EAA8BC,EAA+B,CACvE,KAAK,QAAUD,EACf,KAAK,QAAUC,CACjB,CAEO,aAAc,CACnB,OAAOC,GAAgB,KAAK,OAAO,CACrC,CAEO,eAAeC,EAAmB,CACvC,OAAO,KAAK,mBAAmBA,CAAI,EAAE,IACvC,CAEO,qBAAqBA,EAAmB,CAC7C,OAAO,KAAK,mBAAmBA,CAAI,EAAE,MACvC,CAEO,sBAAsBA,EAAmB,CAC9C,OAAO,KAAK,mBAAmBA,CAAI,EAAE,OACvC,CAEO,MAAMA,EAAmBC,EAAY,CAC1C,IAAMC,EAAaC,GACjBH,EACAC,EAAK,YACL,KAAK,QAAQ,SACf,EAEA,OAAO,KAAK,QAAQ,UAAUC,CAAU,CAC1C,CAEO,OAAOE,EAAY,CACxB,IAAMC,EAAQ,KAAK,SAAS,IAAID,CAAE,EAC9BC,GACFC,GAAWD,CAAK,CAEpB,CAEQ,mBAAmBL,EAAmB,CAC5C,IAAMO,EAAcC,GAAeR,CAAI,EACvC,MAAO,CACL,KAAMO,EACN,OAAQA,EAAcE,GAAuBT,EAAMO,CAAW,EAAI,KAClE,QAASA,EACLG,GAA6BV,EAAMO,CAAW,EAC9C,IACN,CACF,CACF,EFxDO,IAAMI,GAAoBC,GAE/B,MAAS,EAEJ,SAASC,GAAWC,EAAgC,CACzD,GAAM,CAAE,QAAAC,CAAQ,EAAIC,GAAW,EACzBC,EAAcC,GAAW,IAAI,YAAY,EACzCC,EAAYC,EAAc,IAAI,MAAM,EACpC,CAAE,UAAAC,CAAU,EAAIC,EAAY,EAE5BC,EAAU,IAAIC,GAAcT,EAAS,CAAE,UAAAI,EAAW,UAAAE,CAAU,CAAC,EAC7DI,EAAUC,EAAgB,IAAI,iBAAiB,EAC/CC,EAAYD,EAAgB,IAAI,QAAQ,EACxCE,EAAeC,GAAwBJ,CAAO,EAC9CK,EAAUJ,EAAgB,IAAI,kBAAkB,EAChDK,EAAcT,EAAY,EAAE,YAAY,EACxCU,EAASV,EAAY,EAAE,OAAO,EAC9BW,EAAWX,EAAY,EAAE,SAAS,EAClCY,EAAgBZ,EAAY,EAAE,YAC9Ba,EAAgBC,GAAY,EAAE,cAC9BC,EAAgBC,GAAqB,EAAE,iBAAiB,EACxDC,EAAqBD,GAAqB,EAAE,mBAC5CE,EAAoBC,GAAqB,EACzC,CAAE,eAAAC,EAAgB,aAAAC,EAAc,UAAAC,EAAW,QAAAC,EAAS,YAAAC,CAAY,EACpE1B,EAAc,EAGV2B,EAAoC,CACxC,YAAA9B,EACA,sBAAuB+B,GAAW,WAClC,QAAAzB,EACA,QAAS,CACP,UAAAI,EACA,QAAAF,EACA,aAAAG,EACA,QAAUqB,GAAanB,EAAQmB,EAAU5B,CAAS,CACpD,EACA,KAAM,CACJ,YAAAU,EACA,OAAAC,EACA,SAAAC,EACA,cAAAC,EACA,UAAAb,CACF,EACA,cAAAc,EACA,cAAe,CACb,KAAME,EACN,SAAUE,CACZ,EACA,MAAO,CACL,YAAa,CACX,eAAgBG,GAAgB,MAAQ,KACxC,UAAWE,EACP,CACE,OAAQA,EAAU,OAClB,WAAYA,EAAU,WACtB,QAASA,EAAU,OACrB,EACA,KACJ,aAAcD,GAAc,MAAQ,KACpC,QAASE,EACL,CACE,OAAQA,EAAQ,OAChB,WAAYA,EAAQ,WACpB,QAASA,EAAQ,OACnB,EACA,KACJ,cAAeC,CACjB,EACA,kBAAAN,CACF,CACF,EAEA,OACEU,GAAA,cAACvC,GAAkB,SAAlB,CAA2B,MAAOoC,GAChCjC,EAAM,QACT,CAEJ,CA1EgBqC,EAAAtC,GAAA,cA4ET,SAASuC,IAAwC,CACtD,IAAMC,EAAUC,GAAW3C,EAAiB,EAC5C,GAAI,CAAC0C,EACH,MAAM,IAAI,MACR,gEACF,EAEF,OAAOA,CACT,CARgBF,EAAAC,GAAA,aHnFT,SAASG,GAAeC,EAAqC,CAClE,GAAM,CAAE,cAAAC,EAAe,OAAAC,CAAO,EAAIF,EAE5BG,EAAaH,EAAM,QAAQ,OAAO,WAElC,CAAE,qBAAAI,CAAqB,EAAIC,GAAc,EAE/C,OAAAC,GAAU,IAAM,CACVH,GACFC,EAAqBD,CAAU,CAEnC,EAAG,CAACA,CAAU,CAAC,EAEfI,GAAQ,IAAM,CACZC,GAAW,CACT,QAASN,GAAQ,QAAUO,GAC3B,SAAUP,GAAQ,QAAUQ,EAC9B,CAAC,CACH,EAAG,CAACR,EAAO,OAAQA,EAAO,MAAM,CAAC,EAEjCI,GAAU,IAAM,CACVN,EAAM,QAAQ,SAAS,iBACzBW,GAAsB,YAAaX,EAAM,OAAO,QAAQ,eAAe,CAE3E,EAAG,CAACA,EAAM,QAAQ,SAAS,eAAe,CAAC,EAGzCY,GAAA,cAACC,GAAA,CAAc,OAAQX,EAAQ,cAAeD,GAC5CW,GAAA,cAACE,GAAA,CAAa,OAAQZ,EAAO,QAC3BU,GAAA,cAACG,GAAA,KAAYf,EAAM,QAAS,CAC9B,CACF,CAEJ,CAjCgBgB,EAAAjB,GAAA,kBvKHT,SAASkB,GAAOC,EAAuC,CAC5D,IAAMC,EAA2BD,EAAM,QAAQ,gBAE/C,OACEE,GAAA,cAACC,GAAA,KACEF,EACCC,GAAA,cAACE,GAAA,IAAK,EAENF,GAAA,cAACG,GAAA,CAAe,OAAQL,EAAM,QAAUM,IACtCJ,GAAA,cAACE,GAAA,IAAK,CACR,CAEJ,CAEJ,CAdgBG,EAAAR,GAAA,U6KNT,SAASS,IAAsC,CAEpD,GAAM,CAAE,GAAAC,EAAI,IAAAC,CAAI,EAAIC,GACpB,MAAO,CAAE,GAAAF,EAAI,IAAAC,CAAI,CACnB,CAJgBE,EAAAJ,GAAA,mB/N+ET,IAAMK,GAAkB,CAC7B,eAAAC,GACA,WAAAC,GACA,mBAAAC,GACA,cAAAC,EACF",
6
6
  "names": ["EventSeverity", "RouteEventType", "StepEventType", "StepExecutionBlockedEventStatus", "StepExecutionEventStatus", "readAccountAddress", "useWallets", "WalletEvents", "Networks", "WalletTypes", "PendingSwapNetworkStatus", "Divider", "React", "useEffect", "useRef", "useState", "WalletState", "useWallets", "useReducer", "isStateOnDerivationPathStep", "state", "__name", "isStateOnNamespace", "initState", "reducer", "state", "action", "__name", "useStatefulConnect", "state", "disconnect", "connect", "useWallets", "connectState", "dispatch", "useReducer", "reducer", "initState", "runConnect", "__name", "type", "namespaces", "_options", "e", "message", "handleConnect", "wallet", "options", "WalletState", "needsNamespace", "needsDerivationPath", "namespace", "handleDisconnect", "handleNamespace", "selectedNamespaces", "isSingleNamespace", "firstSelectedNamespace", "isStateOnNamespace", "handleDerivationPath", "derivationPath", "isStateOnDerivationPathStep", "section", "WalletState", "useWallets", "detectMobileScreens", "KEPLR_COMPATIBLE_WALLETS", "WalletTypes", "useCallback", "useEffect", "React", "createContext", "useContext", "useEffect", "useRef", "create", "persist", "CacheService", "__name", "#cache", "key", "value", "cacheService", "getBlockchainDisplayNameFor", "blockchainName", "blockchains", "blockchain", "__name", "getBlockchainShortNameFor", "getBlockchainImage", "getSwapperDisplayName", "swapperId", "swappers", "swapper", "findBlockchain", "name", "isTokenNative", "token", "feeAsset", "createTokenHash", "asset", "isValidTokenAddress", "chain", "address", "matchTokensFromConfigWithMeta", "params", "config", "meta", "result", "configTokens", "addTokens", "__name", "tokens", "item", "createTokenHash", "tokenFromMeta", "configBlockchains", "configBlockchainsSet", "blockchain", "targetTokensForBlockchain", "token", "tokenHash", "getSupportedBlockchainsFromConfig", "configFromBlockchains", "configToBlockchains", "blockchains", "supportedBlockchains", "DEFAULT_CONFIG", "DEFAULT_IFRAME_CONFIGS", "DEFAULT_CAMPAIGN_MODE", "createConfigSlice", "__name", "initialData", "set", "get", "config", "campaignMode", "disabledLiquiditySources", "nextConfig", "currentConfig", "tokensMapByTokenHash", "tokensMapByBlockchainName", "supportedSourceTokens", "matchTokensFromConfigWithMeta", "supportedDestinationTokens", "cacheService", "name", "value", "currentCampaignMode", "currentIframeConfig", "TransactionType", "ACTIVE_BLOCKCHAINS_FOR_CUSTOM_TOKENS", "RangoClient", "UI_ID", "RANGO_PUBLIC_API_KEY", "DEFAULT_BASE_URL", "SCANNER_BASE_URL", "WIDGET_UI_ID", "BlockchainCategories", "WalletStatus", "readAccountAddress", "detectInstallLink", "getCosmosExperimentalChainInfo", "isEvmAddress", "KEPLR_COMPATIBLE_WALLETS", "Networks", "BigNumber", "isCosmosBlockchain", "BigNumber", "ZERO", "WalletTypes", "EXCLUDED_WALLETS", "BlockchainCategories", "WalletState", "TransactionType", "DEFAULT_FONT_FAMILY", "SUPPORTED_FONTS", "removeDuplicateFrom", "array", "__name", "areEqual", "array1", "array2", "v", "i", "debounce", "fn", "time", "timeoutId", "wrapper", "args", "containsText", "text", "searchText", "exactText", "startWithText", "getContainer", "WIDGET_UI_ID", "getExpanded", "compareExactMatchText", "searchFor", "textA", "textB", "exactMatchA", "exactMatchB", "compareContainsText", "textContainsA", "textContainsB", "compareStartWithText", "textStartWithA", "textStartWithB", "compareWithSearchFor", "tokenA", "tokenB", "symbolExactMatchCompare", "tokenNameExactMatchCompare", "symbolStartWithCompare", "symbolContainsCompare", "tokenNameStartWithCompare", "tokenNameContainsCompare", "addressStartWithCompare", "addressContainCompare", "isBlockchainTypeInCategory", "blockchainType", "category", "BlockchainCategories", "TransactionType", "getFontUrlByName", "fontName", "SUPPORTED_FONTS", "font", "isSingleWalletActive", "wallets", "multiWallets", "atLeastOneWalletIsConnected", "w", "WalletState", "BigNumber", "roundedSecondsToString", "__name", "s", "seconds", "minutes", "numberToString", "number", "minDecimals", "maxDecimals", "BigNumber", "roundingMode", "maxI", "i", "totalArrivalTime", "__name", "data", "a", "b", "containsText", "__name", "text", "searchText", "isPositiveNumber", "mapStatusToWalletState", "state", "WalletStatus", "__name", "mapWalletTypesToWalletInfo", "getState", "getWalletInfo", "list", "chain", "wallet", "EXCLUDED_WALLETS", "supportedChains", "isContractWallet", "installed", "network", "supportedChain", "type", "name", "image", "installLink", "showOnMobile", "namespaces", "singleNamespace", "needsDerivationPath", "blockchainTypes", "removeDuplicateFrom", "item", "detectInstallLink", "walletAndSupportedChainsNames", "supportedBlockchains", "blockchainMeta", "prepareAccountsForWalletStore", "accounts", "evmBasedChains", "supportedChainNames", "result", "addAccount", "address", "account", "newAccount", "readAccountAddress", "hasLimitation", "isSupported", "isUnknown", "Networks", "isUnknownAndEvmBased", "isEvmAddress", "getQuoteWallets", "params", "filter", "quote", "wallets", "swap", "swapIndex", "currentStepFromBlockchain", "currentStepToBlockchain", "internalSwaps", "internalSwap", "internalSwapIndex", "internalStepFromBlockchain", "internalStepToBlockchain", "isLastStep", "isLastInternalStep", "isAccountAndWalletMatched", "connectedWallet", "makeBalanceFor", "retrievedBalance", "findToken", "balances", "tokenBalance", "BigNumber", "resetConnectedWalletState", "calculateWalletUsdValue", "uniqueAccountAddresses", "modifiedWalletBlockchains", "acc", "current", "i", "modifiedWalletBlockchain", "accountAddress", "total", "numberToString", "b", "ZERO", "numberWithThousandSeparator", "number", "parts", "isExperimentalChain", "blockchains", "cosmosExperimentalChainInfo", "getCosmosExperimentalChainInfo", "isCosmosBlockchain", "formatBalance", "balance", "numberToString", "__name", "compareTokenBalance", "token1Balance", "token2Balance", "areTokensEqual", "tokenA", "tokenB", "sortWalletsBasedOnConnectionState", "wallets", "a", "b", "WalletStatus", "getConciseAddress", "address", "maxChars", "ellipsisLength", "start", "end", "getAddress", "chain", "connectedWallets", "walletType", "connectedWallet", "makeTokensBalance", "wallet", "balances", "currentBalance", "BigNumber", "ZERO", "tokenHash", "createTokenHash", "prevBalance", "isFetchingBalance", "blockchain", "hashWalletsState", "walletsInfo", "w", "filterBlockchainsByWalletTypes", "blockchains", "uniqueBlockchainTypes", "type", "filterWalletsByCategory", "category", "BlockchainCategories", "isBlockchainTypeInCategory", "configs", "RANGO_PUBLIC_API_KEY", "getConfig", "name", "__name", "initConfig", "nextConfigs", "clonedConfigs", "configs", "__name", "DEFAULT_PRIMARY_RADIUS", "DEFAULT_SECONDARY_RADIUS", "THEME_CLASS_NAME_PREFIX", "isTokenExcludedInConfig", "token", "tokensConfig", "result", "asset", "areTokensEqual", "isExcluded", "isBlockchainExcludedInConfig", "blockchain", "blockchainsConfig", "isVariantExpandable", "isLargeScreen", "isExtraLargeScreen", "variant", "rango", "httpService", "__name", "RangoClient", "getConfig", "getUniqueSwappersGroups", "swappers", "disabledLiquiditySources", "supportedSwappers", "swapper", "uniqueSupportedSwappersGroups", "removeDuplicateFrom", "s", "uniqueGroupItem", "swapperItem", "isSupportedSwapper", "supportedItem", "swapperTypeItem", "__name", "sortLiquiditySourcesByGroupTitle", "a", "b", "isFeatureHidden", "feature", "features", "isFeatureEnabled", "addCustomTokensToSupportedTokens", "supportedTokens", "customTokens", "createDataSlice", "__name", "set", "get", "options", "blockchainsMapByName", "blockchainsFromState", "config", "supportedBlockchainsFromConfig", "getSupportedBlockchainsFromConfig", "supportedBlockchains", "blockchain", "ACTIVE_BLOCKCHAINS_FOR_CUSTOM_TOKENS", "_tokensMapByTokenHash", "_tokensMapByBlockchainName", "_customTokens", "tokensFromState", "configType", "cacheKey", "supportedTokens", "cacheService", "matchTokensFromConfigWithMeta", "addCustomTokensToSupportedTokens", "blockchains", "token", "containsText", "tokenA", "tokenB", "isToken1Pinned", "isToken2Pinned", "token1Balance", "token2Balance", "balanceCompare", "compareTokenBalance", "blockChainA", "blockChainB", "isNativeTokenA", "isTokenNative", "isNativeTokenB", "symbolSearchForCompare", "compareWithSearchFor", "asset", "tokensMapByHashToken", "customTokens", "tokenHash", "createTokenHash", "customToken", "type", "pinnedToken", "areTokensEqual", "campaignMode", "campaignModeLiquiditySource", "liquiditySources", "excludeLiquiditySources", "swapper", "swapperGroupIncludedInLiquiditySources", "sortLiquiditySourcesByGroupTitle", "enableCentralizedSwappers", "response", "httpService", "tokensMapByTokenHash", "tokensMapByBlockchainName", "tokens", "popularTokens", "swappers", "blockchainsWithAtLeastOneToken", "a", "b", "error", "Chinese", "English", "Finland", "French", "German", "Greece", "Italian", "Japanese", "Netherlands", "Poland", "Portuguese", "Russian", "Spanish", "Swedish", "Ukrainian", "LANGUAGES", "DEFAULT_LANGUAGE", "SLIPPAGES", "DEFAULT_SLIPPAGE", "HIGH_SLIPPAGE", "MAX_SLIPPAGE", "MIN_SLIPPGAE", "createSettingsSlice", "__name", "set", "get", "DEFAULT_SLIPPAGE", "blockchain", "currentPreferredBlockchains", "preferredBlockchain", "index", "isSameBlockchain", "isInVisibleList", "nextPreferredBlockchains", "slippage", "customSlippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "swappers", "shouldReset", "state", "swappersGroup", "removeDuplicateFrom", "swapper", "name", "liquiditySource", "theme", "language", "nextConfig", "features", "isThemeHidden", "isFeatureHidden", "isLanguageHidden", "isLiquidityHidden", "singleTheme", "autoUpdateSettings", "DEFAULT_LANGUAGE", "token", "customToken", "config", "customTokens", "supportedBlockchainsFromConfig", "getSupportedBlockchainsFromConfig", "createAppStore", "initialData", "create", "persist", "a", "createDataSlice", "createSettingsSlice", "createConfigSlice", "state", "__name", "AppStoreContext", "createContext", "useAppStore", "store", "useContext", "useEffect", "__name", "AppStoreProvider", "props", "appStoreRef", "useRef", "createAppStore", "React", "create", "subscribeWithSelector", "mitt", "eventEmitter", "widgetEventEmitter", "QueueManagerEvents", "QuoteEventTypes", "WalletEventTypes", "UiEventTypes", "WidgetEvents", "createSelectors", "__name", "_store", "store", "k", "s", "selectors_default", "useWalletsStore", "selectors_default", "create", "subscribeWithSelector", "set", "get", "accounts", "findToken", "eventEmitter", "getWalletsDetails", "state", "wallet", "account", "shouldMarkWalletAsSelected", "connectedWallet", "walletType", "selectedWallets", "selectedWallet", "connectedWallets", "makeTokensBalance", "wallets", "walletSelected", "walletNotSelected", "shouldRetry", "isAccountAndWalletMatched", "data", "address", "chain", "retrievedBalance", "httpService", "matchedAccount", "retrievedBalanceAccount", "balance", "makeBalanceFor", "resetConnectedWalletState", "token", "balances", "tokenHash", "createTokenHash", "allProviders", "matchAndGenerateProviders", "providers", "options", "all", "allProviders", "selectedProviders", "requestedProvider", "result", "provider", "__name", "configWalletsToWalletName", "config", "ALL_SUPPORTED_WALLETS", "WalletTypes", "useWalletList", "params", "chain", "config", "useAppStore", "state", "getWalletInfo", "useWallets", "connectedWallets", "useWalletsStore", "blockchains", "handleDisconnect", "useStatefulConnect", "listAvailableWalletTypes", "configWalletsToWalletName", "wallets", "mapWalletTypesToWalletInfo", "detectMobileScreens", "wallet", "sortedWallets", "sortWalletsBasedOnConnectionState", "isExperimentalChainNotAdded", "__name", "walletType", "connectedWallet", "terminateConnectingWallets", "useCallback", "connectingWallets", "WalletState", "hashWalletsState", "useEffect", "shouldShowDefaultInjectedWallet", "defaultWallet", "blockchain", "shouldExcludeWallet", "isExperimentalChain", "KEPLR_COMPATIBLE_WALLETS", "Modal", "React", "create", "CHANNEL_NAME", "TabManager", "events", "message", "event", "name", "CHANNEL_NAME", "__name", "pingAt", "isPingSentBefore", "resolve", "nextActiveTab", "useUiStore", "selectors_default", "create", "set", "get", "setCurrentTabAsActive", "hasRunningSwaps", "showActivateTabModal", "flag", "watermark", "tabManager", "TabManager", "WatermarkedModal", "props", "watermark", "useUiStore", "React", "Modal", "__name", "i18n", "Button", "Checkbox", "Divider", "Image", "ListItemButton", "MessageBox", "Radio", "RadioRoot", "namespaces", "React", "useMemo", "useState", "css", "darkTheme", "IconButton", "styled", "HeaderButton", "ConnectedIcon", "SuffixContainer", "NotificationsBadgeContainer", "ProgressIcon", "InProgressTransactionBadgeContainer", "rowStyles", "WalletImageContainer", "keyframes", "styled", "IconContainer", "LogoContainer", "spin", "Spinner", "WalletImageContainer", "getBlockchainLogo", "blockchains", "blockchainName", "blockchain", "__name", "styled", "NamespaceList", "Namespaces", "props", "singleNamespace", "availableNamespaces", "providerImage", "selectedNamespaces", "setSelectedNamespaces", "useState", "blockchains", "useAppStore", "namespacesInfo", "useMemo", "namespace", "getBlockchainLogo", "namespaces", "onSelect", "__name", "item", "wrapRadioRoot", "children", "React", "RadioRoot", "Divider", "MessageBox", "i18n", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "NamespaceList", "namespaceInfoItem", "ListItemButton", "Radio", "Checkbox", "Button", "i18n", "Button", "Divider", "Image", "MessageBox", "Select", "TextField", "React", "useEffect", "useState", "namespaces", "CUSTOM_DERIVATION_PATH", "index", "getDerivationPaths", "selectedNamespace", "selectedNamespaceDerivationPaths", "namespaces", "__name", "styled", "Typography", "InputsContainer", "InputLabel", "derivationPathInputStyles", "DEFAULT_DERIVATION_PATH_INDEX", "DerivationPath", "props", "onConfirm", "selectedNamespace", "image", "type", "selectedDerivationPathId", "setSelectedDerivationPathId", "useState", "derivationPathIndex", "setDerivationPathIndex", "isCustomOptionSelected", "CUSTOM_DERIVATION_PATH", "derivationPaths", "getDerivationPaths", "handleDerivationPathItemClick", "__name", "value", "selectedDerivationPath", "derivationPath", "handleConfirm", "useEffect", "React", "Divider", "MessageBox", "i18n", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "InputsContainer", "InputLabel", "Select", "derivationPathInputStyles", "TextField", "event", "Button", "i18n", "Image", "MessageBox", "WalletState", "useWallets", "React", "ConnectStatus", "props", "wallet", "error", "type", "image", "state", "useWallets", "mapStatusToWalletState", "WalletState", "React", "MessageBox", "i18n", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "__name", "i18n", "Button", "Divider", "MessageBox", "React", "ExperimentalChain", "props", "displayName", "onConfirm", "React", "MessageBox", "i18n", "Divider", "Button", "__name", "isOnStatus", "getState", "wallet", "__name", "isOnNamespace", "isOnDerivationPath", "KEEP_SUCCESS_MODAL_FOR", "DELAY_SHOWING_MODAL_FOR", "StatefulConnectModal", "props", "successModalTimerId", "useRef", "isConnecting", "setIsConnecting", "useState", "error", "setError", "catchErrorOnHandle", "__name", "terminateConnectingWallets", "useWalletList", "handleConnect", "handleDerivationPath", "handleNamespace", "getState", "resetState", "useStatefulConnect", "handleConfirmNamespaces", "selectedNamespaces", "handleDerivationPathConfirm", "derivationPath", "handleClosingModal", "resetModalState", "useEffect", "isConnected", "isImmediatelyConnected", "beforeConnecting", "afterConnected", "result", "resultIsConnected", "resultIsDisconnected", "React", "WatermarkedModal", "getContainer", "isOnStatus", "ConnectStatus", "Divider", "isOnNamespace", "Namespaces", "isOnDerivationPath", "DerivationPath", "Events", "Provider", "isEvmBlockchain", "React", "createContext", "useEffect", "useMemo", "useRef", "useEffect", "hashProviders", "providers", "provider", "__name", "useWalletProviders", "providers", "options", "clearConnectedWallet", "useWalletsStore", "generateProviders", "matchAndGenerateProviders", "useEffect", "hashProviders", "__name", "WidgetContext", "createContext", "Main", "props", "updateConfig", "updateSettings", "fetchMeta", "fetchStatus", "useAppStore", "blockchains", "findToken", "config", "walletOptions", "providers", "useWalletProviders", "connectWallet", "disconnectWallet", "useWalletsStore", "onConnectWalletHandler", "useRef", "onDisconnectWalletHandler", "useEffect", "evmBasedChainNames", "isEvmBlockchain", "chain", "onUpdateState", "__name", "type", "event", "value", "state", "meta", "Events", "supportedChainNames", "walletAndSupportedChainsNames", "data", "prepareAccountsForWalletStore", "key", "isActiveTab", "useUiStore", "handlers", "useMemo", "handler", "React", "Provider", "WidgetWallets", "otherProps", "AppStoreProvider", "React", "React", "Fragment", "MemoryRouter", "useInRouterContext", "AppRouter", "children", "Router", "useInRouterContext", "Fragment", "MemoryRouter", "React", "__name", "I18nManager", "React", "React", "useRoutes", "navigationRoutes", "useEffect", "useRef", "BigNumber", "create", "subscribeWithSelector", "getLastSuccessfulStep", "BigNumber", "getFeeLabel", "fee", "t", "__name", "HIGH_PRIORITY_TAGS", "GAS_FEE_MAX", "i18n", "RouteEventType", "BigNumber", "PendingSwapNetworkStatus", "i18n", "errorMessages", "__name", "i18n", "getQuoteErrorMessage", "error", "i18n", "swapButtonTitles", "__name", "i18n", "hasHighValueLoss", "inputUsdValue", "priceImpact", "BigNumber", "__name", "hasLimitError", "swaps", "swap", "minimum", "maximum", "getLimitErrorMessage", "isExclusive", "fromAmountRangeError", "recommendation", "i18n", "numberToString", "errorMessages", "getSwapButtonState", "params", "fetchMetaStatus", "anyWalletConnected", "fetchingQuote", "inputAmount", "quote", "warning", "error", "needsToWarnEthOnPath", "swapButtonTitles", "canComputePriceImpact", "usdValue", "inputAmountNumber", "ZERO", "getUsdFeeOfStep", "step", "findToken", "totalFeeInUsd", "i", "fee", "unitPrice", "getTotalFeeInUsd", "totalFee", "getUsdFee", "getTotalFeesInUsd", "fees", "getFeesGroup", "result", "name", "feeGroup", "checkSlippageErrors", "swaps", "recommendedSlippages", "swap", "index", "__name", "checkSlippageWarnings", "quote", "userSlippage", "getMinRequiredSlippage", "slippage", "s", "a", "b", "hasProperSlippage", "minRequiredSlippage", "createQuoteRequestBody", "params", "fromToken", "toToken", "inputAmount", "wallets", "selectedWallets", "disabledLiquiditySources", "liquiditySources", "excludeLiquiditySources", "slippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "destination", "enableCentralizedSwappers", "selectedWalletsMap", "selectedWallet", "connectedWallets", "wallet", "liquiditySource", "__name", "getWalletsForNewSwap", "getQuoteOutputAmount", "quote", "getPercentageChange", "input", "output", "BigNumber", "isOutputAmountChangedALot", "oldQuote", "newQuote", "oldOutputAmount", "newOutputAmount", "percentageChange", "getPriceImpact", "generateBalanceWarnings", "blockchains", "fee", "requiredWallets", "getQuoteWallets", "selectedWallet1", "selectedWallet2", "getRequiredBalanceOfWallet", "asset", "symbol", "currentAmount", "numberToString", "requiredAmount", "reason", "i18n", "getBlockchainShortNameFor", "calcOutputUsdValue", "outputAmount", "tokenPrice", "ZERO", "isNetworkStatusInWarningState", "pendingSwapStep", "PendingSwapNetworkStatus", "getSwapMessages", "pendingSwap", "currentStep", "textForRemove", "message", "detailedMessage", "isRpc", "getLastConvertedTokenInFailedSwap", "resultToken", "lastSuccessStep", "step", "shouldRetrySwap", "isConfirmSwapDisabled", "fetching", "isCustomDestinationOpen", "customDestination", "lastStepToBlockchain", "allWallets", "everyWalletSelected", "blockchain", "everyRequiredWalletSelected", "customDestinationIsValid", "isValidTokenAddress", "isTokensIdentical", "tokenA", "tokenB", "getQuoteToTokenUsdPrice", "quote", "swaps", "__name", "getQuoteFromTokenUsdPrice", "isNumberOfSwapsChanged", "quoteA", "quoteB", "quoteASwaps", "quoteBSwaps", "isQuoteSwappersUpdated", "quoteASwappers", "swap", "quoteBSwappers", "areEqual", "isQuoteInternalCoinsUpdated", "quoteAInternalCoins", "quoteBInternalCoins", "isQuoteChanged", "getRequiredBalanceOfWallet", "selectedWallet", "fee", "relatedFeeStatus", "item", "wallet", "__name", "getPriceImpactLevel", "priceImpact", "warningLevel", "createRetryQuote", "pendingSwap", "blockchains", "findToken", "firstStep", "lastStep", "lastSuccessfulStep", "getLastSuccessfulStep", "toToken", "fromBlockchainMeta", "findBlockchain", "toBlockchainMeta", "fromTokenMeta", "toTokenMeta", "inputAmount", "__name", "generateQuoteWarnings", "quote", "params", "fromToken", "userSlippage", "inputUsdValue", "calcOutputUsdValue", "getQuoteFromTokenUsdPrice", "outputUsdValue", "getQuoteToTokenUsdPrice", "priceImpact", "getPriceImpact", "hasHighValueLoss", "totalFee", "getTotalFeeInUsd", "warningLevel", "getPriceImpactLevel", "minRequiredSlippage", "getMinRequiredSlippage", "highSlippage", "HIGH_SLIPPAGE", "hasProperSlippage", "checkSlippageWarnings", "outputUsdValueIsInvalid", "percentageChange", "getPercentageChange", "getUniqueBlockchains", "steps", "set", "result", "step", "sortQuotesBy", "strategy", "quotes", "quote1", "quote2", "getScore", "route", "score", "quote1Score", "quote2Score", "lowerQuoteId1", "lowerQuoteId2", "getDefaultQuote", "currentQuote", "requestAmount", "currentQuoteSwapperIds", "swap", "matchedQuote", "quoteSwapperIds", "swapperId", "sortTags", "tags", "customSort", "a", "b", "indexA", "HIGH_PRIORITY_TAGS", "indexB", "getUsdValue", "__name", "token", "amount", "BigNumber", "ZERO", "useQuoteStore", "selectors_default", "create", "subscribeWithSelector", "set", "key", "value", "state", "quote", "outputAmount", "outputUsdValue", "inputUsdValue", "isPositiveNumber", "calcOutputUsdValue", "getQuoteFromTokenUsdPrice", "getQuoteToTokenUsdPrice", "chain", "params", "blockchain", "retryQuote", "fromBlockchain", "fromToken", "toBlockchain", "toToken", "inputAmount", "flag", "wallets", "address", "unsubscribeQuoteStore", "selectedState", "previousSelectedState", "eventEmitter", "useSyncStoresWithConfig", "setInputAmount", "setToToken", "setToBlockchain", "setFromBlockchain", "resetQuote", "setFromToken", "fromToken", "toToken", "fromBlockchain", "toBlockchain", "useQuoteStore", "config", "useAppStore", "fetchMetaStatus", "blockchains", "tokens", "findToken", "setAffiliateRef", "setAffiliatePercent", "setAffiliateWallets", "fromTokensConfig", "fromBlockchainsConfig", "toTokensConfig", "toBlockchainsConfig", "prevConfigFromToken", "useRef", "prevConfigToToken", "prevConfigFromBlockchain", "prevConfigToBlockchain", "useEffect", "chain", "token", "isTokenExcludedInConfig", "isBlockchainExcludedInConfig", "__name", "useEffect", "useRef", "useInRouterContext", "useLocation", "useSearchParams", "convertTokenSearchParamToAsset", "searchParam", "chain", "symbolAndAddress", "__name", "tokenToSearchParam", "token", "useSyncUrlAndStore", "location", "useLocation", "searchParams", "setSearchParams", "useSearchParams", "fromBlockchain", "toBlockchain", "fromToken", "toToken", "inputAmount", "setFromBlockchain", "setToBlockchain", "setFromToken", "setToToken", "setInputAmount", "useQuoteStore", "fetchMetaStatus", "useAppStore", "blockchains", "tokens", "isInRouterContext", "useInRouterContext", "updateIframe", "updateCampaignMode", "campaignMode", "liquiditySourcesParamsRef", "useRef", "findToken", "getUrlSearchParams", "__name", "utmQueryParams", "key", "value", "fromAmount", "autoConnect", "clientUrl", "liquiditySources", "blockchain", "updateUrlSearchParams", "property", "useEffect", "tokenToSearchParam", "convertTokenSearchParamToAsset", "i18n", "Alert", "Button", "darkTheme", "Divider", "DoneIcon", "MessageBox", "styled", "TextField", "Typography", "React", "useEffect", "useState", "useNavigate", "useSearchParams", "ChevronRightIcon", "Divider", "Image", "Typography", "React", "darkTheme", "styled", "InputContainer", "Container", "FlexContainer", "BlockchainSelectorButton", "props", "onClick", "value", "title", "hasLogo", "placeholder", "disabled", "React", "Container", "Typography", "Divider", "InputContainer", "FlexContainer", "Image", "ChevronRightIcon", "__name", "i18n", "Button", "Divider", "ExternalLinkIcon", "Image", "Typography", "React", "generateExplorerLink", "address", "blockchain", "explorerLinkPattern", "__name", "darkTheme", "styled", "StyledLink", "Container", "CustomTokenModal", "props", "open", "onClose", "token", "onSubmitClick", "blockchain", "explorerLink", "generateExplorerLink", "React", "WatermarkedModal", "getContainer", "Container", "Image", "Typography", "Divider", "StyledLink", "ExternalLinkIcon", "i18n", "Button", "__name", "useManager", "BottomLogo", "Divider", "Header", "React", "useEffect", "useRef", "useState", "useRef", "isAppLoadedIntoIframe", "__name", "useIframe", "heightObserver", "useRef", "iframe", "useAppStore", "isMessagePassingAvailable", "isAppLoadedIntoIframe", "send", "__name", "message", "element", "entries", "entry", "useNavigate", "useNavigateBack", "navigate", "useNavigate", "__name", "createTheme", "defaultDarkTheme", "defaultLightTheme", "useEffect", "useState", "baseThemeTokens", "defaultDarkColors", "React", "expandShortHexColor", "hexColor", "acc", "char", "__name", "isOverridingColor", "colorKey", "pad", "number", "length", "intToHex", "value", "clampedValue", "rgbToHex", "rgb", "hexToRGB", "hex", "red", "green", "blue", "generateShade", "step", "factor", "generateTint", "calculateShades", "calculateColors", "calculateTints", "generateColor", "colors", "i", "createTintsAndShades", "isReversed", "tints", "shades", "combinedColors", "colorMap", "index", "expandToGenerateThemeColors", "baseColors", "expandColors", "options", "output", "expandColor", "isNeutralReversed", "expandedHexColor", "toAlphabeticChar", "__name", "code", "toAlphabeticName", "name", "x", "toPhash", "h", "i", "toHash", "value", "customizedThemeTokens", "colors", "baseColors", "baseThemeTokens", "baseDarkColors", "defaultDarkColors", "lightTheme", "darkTheme", "tokens", "expandToGenerateThemeColors", "THEME_CLASS_NAME_PREFIX", "toHash", "__name", "joinList", "list", "divider", "element", "key", "React", "output", "item", "index", "doesWindowPreferDarkColorScheme", "__name", "useTheme", "props", "colors", "fontFamily", "DEFAULT_FONT_FAMILY", "borderRadius", "DEFAULT_PRIMARY_RADIUS", "secondaryBorderRadius", "DEFAULT_SECONDARY_RADIUS", "OSTheme", "setOSTheme", "useState", "theme", "useAppStore", "dark", "light", "customizedThemeTokens", "baseTheme", "createTheme", "lightThemeClasses", "defaultLightTheme", "darkThemeClasses", "defaultDarkTheme", "customizedLightTheme", "customizedDarkTheme", "useEffect", "switchThemeListener", "event", "lightClassNames", "darkClassNames", "getPendingSwaps", "__name", "manager", "result", "q", "id", "storage", "a", "b", "i18n", "Alert", "Button", "React", "ActivateTabAlert", "props", "React", "Alert", "Button", "i18n", "__name", "i18n", "Button", "Divider", "MessageBox", "React", "ActivateTabModal", "props", "open", "onClose", "onConfirm", "React", "WatermarkedModal", "getContainer", "MessageBox", "i18n", "Divider", "Button", "__name", "ChevronLeftIcon", "React", "BackButton", "props", "React", "HeaderButton", "ChevronLeftIcon", "__name", "i18n", "Button", "Typography", "React", "CancelButton", "props", "React", "SuffixContainer", "Button", "Typography", "i18n", "__name", "i18n", "Image", "Tooltip", "WalletIcon", "React", "WalletButton", "props", "list", "useWalletList", "connectedWallets", "wallet", "content", "React", "rowStyles", "WalletImageContainer", "Image", "i18n", "Tooltip", "HeaderButton", "ConnectedIcon", "WalletIcon", "__name", "i18n", "NotificationsIcon", "Popover", "SettingsIcon", "Tooltip", "TransactionIcon", "React", "Notifications", "React", "useNavigate", "create", "persist", "subscribeWithSelector", "useNotificationStore", "selectors_default", "create", "persist", "subscribeWithSelector", "set", "get", "event", "route", "fromStep", "toStep", "notification", "excludedList", "notificationItem", "requestId", "state", "isSynced", "notifications", "a", "b", "swaps", "nextNotifications", "swap", "otherProps", "persistedState", "version", "oldNotifications", "read", "NotificationContent", "navigate", "useNavigate", "getNotifications", "clearNotifications", "useNotificationStore", "notifications", "blockchains", "useAppStore", "findToken", "React", "Notifications", "blockchain", "getBlockchainImage", "token", "__name", "requestId", "navigationRoutes", "useManager", "InProgressIcon", "React", "InProgressTransactionBadge", "__name", "manager", "useManager", "getPendingSwaps", "swap", "React", "InProgressTransactionBadgeContainer", "InProgressIcon", "InProgressTransactionBadge_default", "EventSeverity", "Typography", "React", "NotificationsBadge", "getNotifications", "useNotificationStore", "notificationsList", "notificationsCount", "hasSeverNotification", "notificationItem", "EventSeverity", "React", "NotificationsBadgeContainer", "Typography", "__name", "RefreshProgressButton", "React", "useEffect", "useState", "REFRESH_INTERVAL", "MAX_ELAPSED_TIME", "MAX_PERCENTAGE", "RefreshButton", "onClick", "elapsedTime", "setElapsedTime", "useState", "isRefetched", "setIsRefetched", "handleVisibilityChange", "__name", "interval", "clearTimeout", "useEffect", "prevTime", "handleRefreshClick", "React", "HeaderButton", "ProgressIcon", "RefreshProgressButton", "HeaderButtons", "props", "onClickRefresh", "onClickHistory", "onClickSettings", "hidden", "container", "features", "useAppStore", "isNotificationsHidden", "isFeatureHidden", "React", "Tooltip", "getContainer", "i18n", "RefreshButton", "Popover", "NotificationContent", "HeaderButton", "NotificationsIcon", "NotificationsBadge", "SettingsIcon", "TransactionIcon", "InProgressTransactionBadge_default", "__name", "i18n", "Divider", "MessageBox", "RefreshIcon", "React", "Button", "styled", "RefreshButton", "RefreshModal", "props", "open", "onClose", "React", "WatermarkedModal", "getContainer", "MessageBox", "i18n", "Divider", "RefreshButton", "RefreshIcon", "__name", "onScrollContentAttachStatusToContainer", "e", "contentElement", "fromTop", "container", "getContainer", "__name", "css", "styled", "WIDGET_HEIGHT", "LayoutContainer", "Container", "Content", "Footer", "Layout", "props", "connectHeightObserver", "disconnectHeightObserver", "useIframe", "children", "header", "footer", "height", "fetchStatus", "useAppStore", "openRefreshModal", "setOpenRefreshModal", "useState", "connectedWallets", "useWalletsStore", "features", "theme", "watermark", "useUiStore", "hasWatermark", "activeTheme", "useTheme", "isConnectWalletHidden", "isFeatureHidden", "isActiveTab", "tabManagerInitiated", "showActivateTabModal", "setShowActivateTabModal", "activateCurrentTab", "navigateBack", "useNavigateBack", "manager", "useManager", "hasRunningSwap", "getPendingSwaps", "swap", "onActivateTab", "__name", "tabManager", "onConnectWallet", "showBackButton", "scrollViewRef", "useRef", "containerRef", "useEffect", "isAppLoadedIntoIframe", "onScrollContentAttachStatusToContainer", "React", "Container", "WIDGET_UI_ID", "LayoutContainer", "Header", "BackButton", "WalletButton", "getContainer", "CancelButton", "Content", "ActivateTabModal", "Footer", "ActivateTabAlert", "Divider", "BottomLogo", "RefreshModal", "styled", "CONTENT_PADDING", "ScrollableArea", "styled", "PageContainer", "i18n", "useState", "useFetchCustomToken", "loading", "setLoading", "useState", "error", "setError", "findToken", "useAppStore", "customTokens", "produceErrorMessage", "type", "blockchain", "i18n", "__name", "tokenAddress", "token", "errorMessage", "res", "getConfig", "contentType", "response", "Content", "styled", "darkTheme", "CUSTOM_TOKEN_REFRESH_DELAY", "AddCustomTokenPage", "navigate", "useNavigate", "searchParams", "useSearchParams", "navigateBack", "useNavigateBack", "setCustomToken", "useAppStore", "blockchains", "blockchainName", "blockchain", "findBlockchain", "address", "setAddress", "useState", "isOpenErrorModal", "setIsOpenErrorModal", "token", "setToken", "fetchCustomToken", "loading", "error", "useFetchCustomToken", "networkError", "setNetworkError", "isValidAddress", "isValidTokenAddress", "isImportDisabled", "getCustomToken", "__name", "res", "i18n", "closeErrorModal", "handleErrorModalButtonClick", "useEffect", "React", "Layout", "PageContainer", "BlockchainSelectorButton", "navigationRoutes", "Divider", "Typography", "TextField", "DoneIcon", "e", "Alert", "Button", "WatermarkedModal", "getContainer", "MessageBox", "CustomTokenModal", "i18n", "useManager", "Alert", "Button", "css", "Divider", "IconButton", "styled", "Typography", "WalletIcon", "React", "useEffect", "useLayoutEffect", "useRef", "useState", "useNavigate", "i18n", "Alert", "BalanceErrors", "Button", "ChevronLeftIcon", "Divider", "MessageBox", "Typography", "React", "useCallback", "useEffect", "useMemo", "useState", "useNavigate", "i18n", "getQuoteUpdateWarningMessage", "warning", "i18n", "__name", "i18n", "Alert", "ChevronDownIcon", "CloseIcon", "Divider", "IconButton", "PasteIcon", "Typography", "WalletIcon", "React", "useEffect", "useRef", "React", "useRef", "Collapsible", "keyframes", "styled", "EXPANDABLE_TRANSITION_DURATION", "slideDown", "slideUp", "CollapsibleRoot", "Trigger", "CollapsibleContent", "ExpandedIcon", "CustomCollapsible", "props", "open", "hasSelected", "onOpenChange", "children", "onClickTrigger", "trigger", "triggerAnchor", "ref", "useRef", "React", "CollapsibleRoot", "Trigger", "CollapsibleContent", "__name", "darkTheme", "styled", "TextField", "Container", "StyledTextField", "CustomDestinationButton", "CustomDestination", "props", "blockchain", "handleOpenChange", "open", "customDestination", "setCustomDestination", "useQuoteStore", "config", "useAppStore", "blockchains", "blockchainName", "getBlockchainDisplayNameFor", "inputRef", "useRef", "configDestination", "isFirefox", "isAddressInvalid", "isValidTokenAddress", "handleClear", "__name", "handlePaste", "event", "pastedText", "renderSuffix", "React", "IconButton", "CloseIcon", "PasteIcon", "useEffect", "Container", "CustomCollapsible", "CustomDestinationButton", "WalletIcon", "Divider", "Typography", "i18n", "ExpandedIcon", "ChevronDownIcon", "StyledTextField", "e", "Alert", "css", "darkTheme", "IconButton", "styled", "Title", "ListContainer", "WalletButton", "ShowMoreWallets", "ShowMoreHeader", "NavigateBack", "WalletsContainer", "walletsListStyles", "ConfirmButton", "Wallets", "i18n", "warn", "Divider", "SelectableWallet", "Typography", "WalletState", "React", "useEffect", "useState", "Image", "MessageBox", "Spinner", "React", "keyframes", "styled", "LogoContainer", "SpinAnimation", "Spinner", "WalletImageContainer", "i18n", "generateMessageByStatus", "status", "blockchainDisplayName", "i18n", "__name", "ExperimentalChainStatus", "props", "status", "displayName", "image", "data", "generateMessageByStatus", "hasImage", "React", "MessageBox", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "__name", "ACCOUNT_ADDRESS_MAX_CHARACTERS", "TIME_TO_CLOSE_MODAL", "WalletList", "props", "chain", "isSelected", "selectWallet", "limit", "onShowMore", "isActiveTab", "useUiStore", "connectedWallets", "useWalletsStore", "blockchains", "useAppStore", "selectedWalletToConnect", "setSelectedWalletToConnect", "useState", "experimentalChainWallet", "setExperimentalChainWallet", "showExperimentalChainModal", "setShowExperimentalChainModal", "addingExperimentalChainStatus", "setAddingExperimentalChainStatus", "suggestAndConnect", "useWallets", "handleDisconnect", "useStatefulConnect", "list", "useWalletList", "sortedList", "setSortedList", "numberOfSupportedWallets", "shouldShowMoreWallets", "addExperimentalChain", "__name", "wallet", "useEffect", "selectedWalletIndex", "_", "index", "sortedItem", "listItem", "modalContainer", "WIDGET_UI_ID", "timeout", "React", "address", "getAddress", "conciseAddress", "getConciseAddress", "experimentalChain", "isExperimentalChain", "experimentalChainNotAdded", "connectedWallet", "couldAddExperimentalChain", "WalletState", "connectedWalletDescription", "i18n", "onSelectableWalletClick", "blockchainDisplayName", "getBlockchainDisplayNameFor", "WatermarkedModal", "ExperimentalChain", "ExperimentalChainStatus", "Divider", "SelectableWallet", "StatefulConnectModal", "result", "warn", "ShowMoreWallets", "Typography", "NUMBER_OF_WALLETS_TO_DISPLAY", "ConfirmWalletsModal", "props", "open", "onClose", "onCancel", "onCheckBalance", "loading", "navigate", "useNavigate", "blockchains", "useAppStore", "selectedQuote", "selectQuoteWallets", "quoteWalletsConfirmed", "setQuoteWalletConfirmed", "customDestination", "setCustomDestination", "useQuoteStore", "connectedWallets", "selectWallets", "useWalletsStore", "config", "showMoreWalletFor", "setShowMoreWalletFor", "useState", "balanceWarnings", "setBalanceWarnings", "error", "setError", "quoteWarning", "setQuoteWarning", "isCustomDestinationOpen", "setCustomDestinationOpen", "quoteWallets", "useMemo", "getQuoteWallets", "requiredWallets", "lastStepToBlockchain", "blockchain", "isWalletRequiredFor", "__name", "getInitialSelectableWallets", "useCallback", "connectedWallet", "selectableWallets", "setSelectableWallets", "nextSelectedWallets", "setNextSelectedWallets", "addNextSelectedWallets", "walletType", "prevState", "isInsufficientBalanceModalOpen", "isSelected", "chain", "selectableWallet", "updateSelectableWallets", "wallets", "chainName", "shouldSelect", "isAnyWalletSelected", "wallet", "selected", "handleCustomDestinationCollapsibleOpenChange", "onChange", "onConfirmBalance", "lastSelectedWallets", "onConfirmWallets", "result", "warnings", "getQuoteErrorMessage", "useEffect", "nextState", "selectedWallet", "modalContainer", "WIDGET_UI_ID", "React", "WatermarkedModal", "ConfirmButton", "Button", "isConfirmSwapDisabled", "i18n", "ShowMoreHeader", "NavigateBack", "ChevronLeftIcon", "Typography", "getBlockchainShortNameFor", "MessageBox", "BalanceErrors", "WalletsContainer", "walletsListStyles", "WalletList", "Alert", "Divider", "getQuoteUpdateWarningMessage", "Wallets", "requiredWallet", "index", "key", "isLastWallet", "showCustomDestination", "Title", "ListContainer", "CustomDestination", "i18n", "Alert", "Button", "InfoIcon", "React", "Alert", "Button", "Divider", "NoRouteIcon", "RefreshIcon", "Typography", "React", "i18n", "SMALL_NO_ROUTE__ICON_SIZE", "LARGE_NO_ROUTE_ICON_SIZE", "makeInfo", "error", "disabledLiquiditySources", "toggleAllLiquiditySources", "refetchQuote", "errorMessages", "i18n", "__name", "NoRouteIconSize", "NoRouteTitleSize", "styled", "Container", "ErrorDescription", "Footer", "PrefixIcon", "NoResult", "props", "fetch", "error", "size", "disabledLiquiditySources", "useAppStore", "toggleAllLiquiditySources", "swappers", "info", "makeInfo", "React", "Container", "NoRouteIcon", "NoRouteIconSize", "Divider", "Typography", "NoRouteTitleSize", "errorMessages", "ErrorDescription", "Footer", "Alert", "Button", "PrefixIcon", "RefreshIcon", "__name", "i18n", "Button", "Divider", "MessageBox", "Typography", "WarningIcon", "React", "Typography", "React", "darkTheme", "styled", "Alerts", "Flex", "Item", "Action", "QuoteErrorsModalItem", "props", "title", "value", "valueColor", "React", "Item", "Typography", "__name", "HighValueLossWarningModal", "props", "open", "onClose", "onConfirm", "warning", "confirmationDisabled", "type", "highValueLossData", "i18n", "numberToString", "React", "WatermarkedModal", "Button", "WarningIcon", "errorMessages", "getContainer", "MessageBox", "Flex", "Divider", "Typography", "item", "index", "QuoteErrorsModalItem", "__name", "i18n", "makeAlerts", "warning", "error", "alertInfo", "i18n", "getPriceImpactLevel", "errorMessages", "__name", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "useNavigate", "SlippageWarningModal", "props", "customSlippage", "slippage", "useAppStore", "open", "onClose", "onConfirm", "warning", "confirmationDisabled", "navigate", "useNavigate", "userSlippage", "React", "WatermarkedModal", "Button", "navigationRoutes", "Typography", "i18n", "getContainer", "MessageBox", "Divider", "__name", "Button", "MessageBox", "WarningIcon", "React", "UnknownPriceWarningModal", "props", "open", "onClose", "onConfirm", "confirmationDisabled", "React", "WatermarkedModal", "Button", "WarningIcon", "errorMessages", "getContainer", "MessageBox", "__name", "QuoteWarningsAndErrors", "props", "warning", "error", "couldChangeSettings", "showWarningModal", "confirmationDisabled", "refetchQuote", "onOpenWarningModal", "onCloseWarningModal", "onConfirmWarningModal", "onChangeSettings", "warningModalHandlers", "showNoResultMessage", "alertInfo", "makeAlerts", "React", "NoResult", "Alerts", "Alert", "Action", "InfoIcon", "Button", "i18n", "HighValueLossWarningModal", "SlippageWarningModal", "UnknownPriceWarningModal", "__name", "BigNumber", "React", "i18n", "Alert", "Divider", "FullExpandedQuote", "InfoIcon", "NumericTooltip", "QuoteTag", "StepDetails", "TokenAmount", "Typography", "BigNumber", "React", "useRef", "useState", "styled", "QuoteContainer", "FooterStepAlarm", "FooterAlert", "Collapsible", "Button", "css", "darkTheme", "Image", "styled", "Typography", "EXPANDABLE_QUOTE_TRANSITION_DURATION", "QuoteContainer", "styled", "darkTheme", "stepsDetailsStyles", "css", "AllRoutesButton", "Button", "SummaryContainer", "summaryStyles", "summaryHeaderStyles", "rowStyles", "basicInfoStyles", "Trigger", "Image", "ImageContainer", "Content", "CollapsibleContent", "IconContainer", "Separator", "HorizontalSeparator", "FrameIcon", "BasicInfoOutput", "Typography", "ContainerInfoOutput", "MoreStep", "TagContainer", "Line", "i18n", "ChevronDownIcon", "CloseIcon", "Divider", "IconButton", "NumericTooltip", "QuoteCost", "Typography", "React", "useState", "css", "styled", "FeeSection", "Line", "ModalContainer", "ModalHeader", "trigger", "NonPayableFee", "__name", "props", "React", "FeeSection", "Typography", "numberToString", "QuoteCostDetails", "open", "setOpen", "useState", "openCollapse", "setOpenCollapse", "steps", "quote", "fee", "time", "feeWarning", "showModalFee", "swaps", "container", "getContainer", "feesGroup", "getFeesGroup", "QuoteCost", "e", "i18n", "WatermarkedModal", "ModalHeader", "IconButton", "CloseIcon", "ModalContainer", "Divider", "payableFeesKey", "feeArray", "index", "key", "usdValue", "getUsdFee", "getFeeLabel", "NumericTooltip", "Line", "CustomCollapsible", "prev", "trigger", "ExpandedIcon", "ChevronDownIcon", "nonPayableFeesKey", "fees", "totalFeeInUsd", "getTotalFeesInUsd", "label", "i18n", "TokenAmount", "React", "css", "styled", "Container", "separatorStyles", "QuoteSummary", "props", "from", "to", "percentageChange", "warningLevel", "React", "Container", "TokenAmount", "i18n", "getContainer", "separatorStyles", "__name", "i18n", "ChevronDownIcon", "ChevronRightIcon", "Divider", "Image", "Tooltip", "Typography", "React", "useLayoutEffect", "useState", "MIN_TABLET_WIDTH", "MIN_NOTEBOOK_WIDTH", "MIN_LARGE_SCREEN_WIDTH", "MIN_EXTRA_LARGE_SCREEN_WIDTH", "useScreenDetect", "__name", "isMobile", "setIsMobile", "useState", "isTablet", "setIsTablet", "isNotebook", "setIsNotebook", "isLargeScreen", "setIsLargeScreen", "isExtraLargeScreen", "setIsExtraLargeScreen", "handleResize", "useLayoutEffect", "useScreenDetect_default", "MAX_STEPS", "MAX_BLOCKCHAINS", "ImageComponent", "__name", "props", "content", "src", "className", "open", "state", "container", "tooltipContainer", "getContainer", "React", "Tooltip", "ImageContainer", "Image", "QuoteTrigger", "quoteRef", "selected", "setExpanded", "steps", "expanded", "type", "numberOfSteps", "blockchains", "getUniqueBlockchains", "isTablet", "isMobile", "useScreenDetect_default", "Trigger", "ref", "e", "prevState", "rowStyles", "Typography", "i18n", "Divider", "step", "index", "key", "arrow", "IconContainer", "ChevronRightIcon", "i", "MoreStep", "blockchain", "chain", "ChevronDownIcon", "Quote", "props", "quote", "input", "output", "error", "warning", "type", "selected", "tagHidden", "showModalFee", "onClickAllRoutes", "fullExpandedMode", "propContainer", "blockchains", "useAppStore", "findToken", "swappers", "customSlippage", "slippage", "userSlippage", "expanded", "setExpanded", "useState", "quoteRef", "useRef", "roundedInput", "numberToString", "roundedOutput", "roundedOutputUsdValue", "priceImpact", "getPriceImpact", "percentageChange", "priceImpactWarningLevel", "getPriceImpactLevel", "getQuoteSteps", "__name", "swaps", "internalSwap", "swap", "index", "stepState", "hasBridgeLimitError", "hasSlippageError", "hasSlippageWarning", "stepHasError", "stepHasWarning", "alertTitle", "i18n", "getSwapperDisplayName", "getBlockchainShortNameFor", "BigNumber", "React", "FooterStepAlarm", "Alert", "FooterAlert", "Typography", "Divider", "roundedSecondsToString", "getUsdFeeOfStep", "steps", "numberOfSteps", "container", "getContainer", "sortedQuoteTags", "sortTags", "showAllRoutesButton", "totalTime", "totalArrivalTime", "totalFee", "getTotalFeeInUsd", "fee", "feeWarning", "GAS_FEE_MAX", "FullExpandedQuote", "getExpanded", "SummaryContainer", "summaryStyles", "TagContainer", "tag", "key", "QuoteTag", "Line", "summaryHeaderStyles", "QuoteCostDetails", "AllRoutesButton", "e", "basicInfoStyles", "FrameIcon", "InfoIcon", "ContainerInfoOutput", "BasicInfoOutput", "NumericTooltip", "TokenAmount", "QuoteSummary", "QuoteContainer", "QuoteTrigger", "Content", "HorizontalSeparator", "stepsDetailsStyles", "step", "StepDetails", "Divider", "Skeleton", "React", "darkTheme", "styled", "Container", "Chains", "Steps", "StepSeparator", "ChainToken", "Divider", "Skeleton", "React", "css", "styled", "FlexContent", "BasicSummary", "Output", "OutputTokenInfo", "QuoteSummary", "QuoteSummarySeparator", "TokenAmount", "TokenAmountLabel", "SwapPreview", "RowStyle", "QuoteSummarySkeleton", "props", "type", "tagHidden", "quotePreview", "React", "QuoteSummary", "TokenAmount", "ChainToken", "Divider", "TokenAmountLabel", "Skeleton", "showAllRoutesSkeleton", "FlexContent", "Line", "RowStyle", "BasicSummary", "Output", "OutputTokenInfo", "SwapPreview", "QuoteSummarySeparator", "__name", "ChainToken", "Divider", "NextIcon", "Skeleton", "React", "styled", "StepContent", "StepTokens", "StepTokenInfo", "StepIconContainer", "StepTitle", "StepSkeleton", "props", "separator", "React", "StepTitle", "Skeleton", "Divider", "StepContent", "StepSeparator", "StepTokens", "StepTokenInfo", "ChainToken", "StepIconContainer", "NextIcon", "__name", "QuoteSkeleton", "props", "type", "expanded", "tagHidden", "React", "Container", "QuoteSummarySkeleton", "Chains", "Skeleton", "Steps", "Divider", "StepSkeleton", "__name", "QuoteInfo", "props", "quote", "type", "loading", "error", "warning", "expanded", "tagHidden", "onClick", "showModalFee", "selected", "onClickAllRoutes", "fullExpandedMode", "container", "inputAmount", "inputUsdValue", "toToken", "useQuoteStore", "outputAmount", "BigNumber", "outputUsdValue", "calcOutputUsdValue", "getQuoteToTokenUsdPrice", "showQuote", "React", "QuoteContainer", "QuoteSkeleton", "Quote", "__name", "calculatePendingSwap", "useEffect", "useRef", "useState", "RETRY_DELAY", "useFetch", "request", "loading", "setLoading", "useState", "abortController", "useRef", "cancelFetch", "__name", "retryFetch", "requestBody", "resolve", "fetch", "retryOnFail", "res", "error", "useFetchConfirmQuote", "fetch", "loading", "cancelFetch", "useFetch", "requestBody", "options", "httpService", "__name", "throwErrorIfResponseIsNotValid", "response", "errorMessages", "quoteError", "getQuoteError", "__name", "swaps", "hasLimitError", "swap", "recommendation", "fromAmountRangeError", "getLimitErrorMessage", "recommendedSlippages", "checkSlippageErrors", "minRequiredSlippage", "getMinRequiredSlippage", "generateWarnings", "previousQuote", "currentQuote", "params", "quoteChanged", "isQuoteChanged", "output", "quoteWarning", "generateQuoteWarnings", "isOutputAmountChangedALot", "numberToString", "getQuoteOutputAmount", "getPriceImpact", "isNumberOfSwapsChanged", "isQuoteSwappersUpdated", "isQuoteInternalCoinsUpdated", "balanceWarnings", "generateBalanceWarnings", "handleQuoteErrors", "error", "useConfirmSwap", "fromToken", "toToken", "inputAmount", "setSelectedQuote", "initialQuote", "customDestinationFromStore", "setQuoteWarningsConfirmed", "resetAlerts", "useQuoteStore", "slippage", "customSlippage", "useAppStore", "disabledLiquiditySources", "blockchains", "tokens", "findToken", "userSlippage", "fetchQuote", "cancelFetch", "loading", "useFetchConfirmQuote", "useEffect", "__name", "params", "selectedWallets", "customDestination", "wallets", "acc", "item", "requestBody", "response", "result", "throwErrorIfResponseIsNotValid", "currentQuote", "swapSettings", "confirmSwapWarnings", "generateWarnings", "proceedAnyway", "swap", "calculatePendingSwap", "getWalletsForNewSwap", "error", "handleQuoteErrors", "Buttons", "styled", "IconButton", "confirmBtnStyles", "css", "iconStyles", "descriptionStyles", "ConfirmSwapPage", "selectedQuote", "setInputAmount", "selectedWallets", "quoteWalletsConfirmed", "customDestination", "quoteWarningsConfirmed", "useQuoteStore", "navigate", "useNavigate", "dbErrorMessage", "setDbErrorMessage", "useState", "showWalletsOnInit", "showWallets", "setShowWallets", "isConfirming", "setIsConfirming", "isActiveTab", "useUiStore", "disabledLiquiditySources", "useAppStore", "prevDisabledLiquiditySources", "useRef", "manager", "useManager", "confirmSwap", "fetchingConfirmationQuote", "cancelFetch", "useConfirmSwap", "confirmSwapResult", "setConfirmSwapResult", "showQuoteWarningModal", "setShowQuoteWarningModal", "onConfirmSwap", "__name", "result", "addNewSwap", "swap_url", "navigationRoutes", "e", "onConfirm", "onStartConfirmSwap", "onRefresh", "res", "error", "useEffect", "useLayoutEffect", "quoteWarning", "quoteError", "alerts", "React", "Alert", "getQuoteUpdateWarningMessage", "settings_url", "QuoteWarningsAndErrors", "Layout", "i18n", "wallets_url", "Button", "WalletIcon", "ConfirmWalletsModal", "PageContainer", "Typography", "RefreshButton", "Divider", "joinList", "alert", "index", "QuoteInfo", "i18n", "Button", "CustomTokensZeroStateDarkIcon", "CustomTokensZeroStateIcon", "DeleteIcon", "Divider", "IconButton", "MessageBox", "NotFound", "styled", "React", "useState", "useNavigate", "CloseIcon", "IconButton", "SearchIcon", "TextField", "React", "styled", "IconWrapper", "SearchInput", "props", "variant", "fullWidth", "color", "size", "onChange", "value", "style", "setValue", "inputAttributes", "React", "TextField", "IconWrapper", "SearchIcon", "IconButton", "CloseIcon", "__name", "i18n", "darkTheme", "Divider", "ExternalLinkIcon", "Image", "ListItemButton", "NotFound", "PinIcon", "Skeleton", "Typography", "VirtualizedList", "React", "useEffect", "useState", "useWallets", "useEffect", "useRef", "useState", "useObserveBalanceChanges", "selectedBlockchain", "connectedWallets", "useWalletsStore", "getWalletInfo", "useWallets", "prevFetchingBalanceWallets", "useRef", "balanceKey", "setBalanceKey", "useState", "useEffect", "handleWalletEvent", "__name", "event", "chain", "prev", "widgetEventEmitter", "wallet", "walletType", "walletIsAlreadyFetching", "prevWallet", "Divider", "ListItem", "Skeleton", "React", "css", "darkTheme", "ImageContainer", "styled", "Typography", "tokenNameStyles", "descriptionStyles", "tokenTitleStyles", "tokenAddressStyles", "tokenWithoutNameStyles", "usdValueStyles", "Container", "Title", "List", "Tag", "TagTitle", "BalanceContainer", "End", "Description", "ImageSection", "Pin", "TokenBalance", "StyledLink", "LoadingTokenList", "props", "React", "List", "ListItem", "Skeleton", "End", "Divider", "__name", "PAGE_SIZE", "renderDesc", "__name", "props", "address", "name", "url", "token", "customCssForTag", "customCssForTagTitle", "length", "React", "descriptionStyles", "tokenNameStyles", "Title", "tokenTitleStyles", "Typography", "Divider", "Tag", "TagTitle", "tokenAddressStyles", "tokenWithoutNameStyles", "StyledLink", "e", "ExternalLinkIcon", "TokenList", "list", "searchedFor", "onChange", "selectedBlockchain", "showTitle", "action", "tokens", "setTokens", "useState", "fetchStatus", "useAppStore", "blockchains", "hasNextPage", "setHasNextPage", "getBalanceFor", "loadingWallet", "useWalletsStore", "isTokenPinned", "balanceKey", "useObserveBalanceChanges", "loadNextPage", "useEffect", "endRenderer", "tokenBalance", "formatBalance", "End", "Skeleton", "BalanceContainer", "TokenBalance", "usdValueStyles", "renderList", "VirtualizedList", "index", "blockchain", "colors", "createTintsAndShades", "darkTheme", "ListItemButton", "ImageSection", "Image", "Pin", "PinIcon", "i18n", "Container", "LoadingTokenList", "List", "NotFound", "Content", "styled", "NotFoundContent", "DeleteIconButton", "IconButton", "CustomTokensPage", "searchedFor", "setSearchedFor", "useState", "deleteCustomToken", "useAppStore", "customTokens", "fromToken", "toToken", "setFromToken", "setToToken", "useQuoteStore", "mode", "useTheme", "navigate", "useNavigate", "isDeleteModalOpen", "setIsDeleteModalOpen", "selectedToken", "setSelectedToken", "handleSearch", "__name", "event", "value", "isDarkTheme", "customTokensResults", "token", "containsText", "handleDeleteCustomToken", "toTokenHash", "createTokenHash", "fromTokenHash", "selectedTokenHash", "React", "Layout", "i18n", "PageContainer", "SearchInput", "Divider", "TokenList", "DeleteIcon", "NotFound", "CustomTokensZeroStateDarkIcon", "CustomTokensZeroStateIcon", "Button", "navigationRoutes", "WatermarkedModal", "getContainer", "MessageBox", "i18n", "useManager", "Button", "darkTheme", "Divider", "MessageBox", "NotFound", "styled", "Typography", "TransactionStatus", "React", "useMemo", "useState", "useNavigate", "FilterIcon", "Popover", "React", "css", "darkTheme", "IconButton", "styled", "IconContainer", "FilterButton", "Badge", "FilterContainer", "centeredFlexContainer", "FilterList", "i18n", "Button", "Divider", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "FilterSelectorContent", "props", "value", "onClickItem", "React", "FilterContainer", "centeredFlexContainer", "Typography", "i18n", "Button", "Divider", "RadioRoot", "FilterList", "item", "index", "ListItemButton", "Radio", "__name", "FilterSelector", "props", "onClickItem", "onOpenChange", "filterBy", "list", "open", "React", "Popover", "getContainer", "FilterSelectorContent", "id", "FilterButton", "IconContainer", "FilterIcon", "Badge", "__name", "i18n", "Divider", "GroupedVirtualizedList", "Skeleton", "SwapListItem", "Typography", "React", "useCallback", "useEffect", "useRef", "useState", "calculateGroupsSoFar", "totalGroups", "count", "groups", "index", "group", "__name", "css", "darkTheme", "styled", "groupStyles", "SwapItemContainer", "Group", "Time", "SwapList", "NotFoundContainer", "ITEMS_PER_PAGE", "HistoryGroupedList", "props", "list", "onSwapClick", "groupBy", "isLoading", "currentGroupCounts", "setCurrentGroupCounts", "useState", "loadedItems", "useRef", "swaps", "groupCounts", "groups", "calculateGroups", "useCallback", "calculateGroupsSoFar", "loadMore", "remainedItems", "useEffect", "React", "group", "index", "Group", "Time", "Skeleton", "Divider", "SwapList", "_", "SwapListItem", "GroupedVirtualizedList", "Typography", "groupStyles", "groupIndex", "swap", "firstStep", "lastStep", "SwapItemContainer", "getContainer", "i18n", "numberToString", "__name", "i18n", "dayjs", "groupSwapsByDate", "__name", "swaps", "output", "i18n", "addYearsToOutput", "key", "swap", "now", "dayjs", "time", "swapDate", "year", "groupedSwaps", "item", "items", "group", "groupCounts", "groups", "HistoryGroupedListContainer", "styled", "SearchAndFilterBar", "Description", "darkTheme", "transactionStatusFilters", "TransactionStatus", "i18n", "isStepContainsText", "__name", "steps", "value", "step", "containsText", "HistoryPage", "navigate", "useNavigate", "manager", "state", "useManager", "list", "getPendingSwaps", "swap", "searchedFor", "setSearchedFor", "useState", "openFilterSelector", "setOpenFilterSelector", "loading", "filterBy", "setFilterBy", "openClearModal", "setOpenClearModal", "handleSearch", "event", "filteredList", "useMemo", "inputAmount", "status", "requestId", "isEmpty", "onCloseModal", "onClear", "e", "isClearButtonDisabled", "React", "Layout", "SuffixContainer", "Button", "Typography", "PageContainer", "SearchInput", "Divider", "FilterSelector", "open", "id", "NotFoundContainer", "NotFound", "HistoryGroupedList", "groupSwapsByDate", "WatermarkedModal", "getContainer", "MessageBox", "i18n", "Button", "Divider", "styled", "WarningIcon", "BigNumber", "React", "useEffect", "useState", "useNavigate", "i18n", "Header", "React", "useEffect", "useState", "i18n", "Divider", "FullExpandedQuote", "Typography", "React", "styled", "ErrorsContainer", "StrategyContent", "SelectContainer", "i18n", "Select", "React", "SelectStrategy", "props", "updateQuotePartialState", "sortStrategy", "useQuoteStore", "ROUTE_STRATEGY", "i18n", "React", "SelectContainer", "Select", "item", "__name", "ITEM_SKELETON_COUNT", "Quotes", "props", "loading", "onClickOnQuote", "fetch", "showModalFee", "hasSort", "fullExpandedMode", "propContainer", "selectedQuote", "quotes", "updateQuotePartialState", "fromToken", "toToken", "sortStrategy", "error", "useQuoteStore", "slippage", "customSlippage", "useAppStore", "findToken", "container", "getContainer", "hasQuotes", "userSlippage", "getQuoteWarning", "__name", "quote", "mergedQuote", "generateQuoteWarnings", "showNoResultMessage", "sortQuotes", "sortQuotesBy", "React", "StrategyContent", "Typography", "i18n", "SelectStrategy", "Divider", "_", "index", "FullExpandedQuote", "QuoteSkeleton", "quoteWarning", "quoteError", "getQuoteError", "lastIndex", "QuoteInfo", "ErrorsContainer", "NoResult", "darkTheme", "styled", "Container", "Content", "TIME_TO_CLOSE_OPEN_EXPANDED", "ExpandedQuotes", "props", "fetch", "loading", "onClickOnQuote", "onClickRefresh", "isVisible", "isDelayedVisible", "setIsDelayedVisible", "useState", "containerClass", "config", "useAppStore", "fullExpandedMode", "container", "getExpanded", "useEffect", "timeout", "React", "Container", "LayoutContainer", "WIDGET_UI_ID", "Header", "i18n", "SelectStrategy", "HeaderButtons", "Content", "Quotes", "__name", "i18n", "SwapInput", "React", "ReverseIcon", "React", "keyframes", "styled", "ROTATE_ANIMATION_DURATION", "rotateAnimation", "SwitchButtonContainer", "StyledButton", "SwitchFromAndToButton", "switchFromAndTo", "useQuoteStore", "React", "SwitchButtonContainer", "StyledButton", "event", "button", "ROTATE_ANIMATION_DURATION", "ReverseIcon", "__name", "styled", "Container", "FromContainer", "Inputs", "props", "fetchingQuote", "fetchMetaStatus", "onClickToken", "isExpandable", "fromToken", "fromBlockchain", "toToken", "toBlockchain", "setInputAmount", "inputAmount", "inputUsdValue", "outputAmount", "outputUsdValue", "selectedQuote", "useQuoteStore", "connectedWallets", "getBalanceFor", "useWalletsStore", "fromTokenBalance", "fromTokenFormattedBalance", "formatBalance", "tokenBalanceReal", "numberToString", "fetchingBalance", "isFetchingBalance", "priceImpactInputCanNotBeComputed", "canComputePriceImpact", "priceImpactOutputCanNotBeComputed", "percentageChange", "getPriceImpact", "React", "Container", "FromContainer", "SwapInput", "i18n", "errorMessages", "getContainer", "SwitchFromAndToButton", "getPriceImpactLevel", "__name", "useCallback", "useEffect", "useRef", "useState", "useFetchAllQuotes", "fetch", "loading", "cancelFetch", "useFetch", "requestBody", "options", "httpService", "__name", "DEBOUNCE_DELAY", "useSwapInput", "refetchQuote", "fetchQuote", "cancelFetch", "useFetchAllQuotes", "configExcludeLiquiditySources", "features", "enableCentralizedSwappers", "useAppStore", "connectedWallets", "useWalletsStore", "fromToken", "toToken", "inputAmount", "inputUsdValue", "selectedQuote", "sortStrategy", "resetQuote", "error", "warning", "setSelectedQuote", "updateQuotePartialState", "useQuoteStore", "slippage", "customSlippage", "affiliatePercent", "affiliateRef", "affiliateWallets", "fetchStatus", "liquiditySources", "disabledLiquiditySources", "excludeLiquiditySources", "findToken", "loading", "setLoading", "useState", "prevInputAmount", "useRef", "userSlippage", "shouldSkipRequest", "areTokensEqual", "isPositiveNumber", "resetState", "__name", "fetch", "params", "requestBody", "createQuoteRequestBody", "isFeatureEnabled", "res", "sortQuotes", "sortQuotesBy", "quote", "getDefaultQuote", "throwErrorIfResponseIsNotValid", "outputUsdValue", "getQuoteToTokenUsdPrice", "getQuoteFromTokenUsdPrice", "quoteWarning", "generateQuoteWarnings", "quoteError", "handleQuoteErrors", "debouncedFetch", "useCallback", "debounce", "DEBOUNCE_DELAY", "useEffect", "fetchQuotes", "emitPreventableEvent", "event", "action", "defaultPrevented", "extendedPayload", "eventEmitter", "__name", "MainContainer", "styled", "TIME_TO_NAVIGATE_ANOTHER_PAGE", "Home", "navigate", "useNavigate", "fromToken", "toToken", "inputAmount", "selectedQuote", "refetchQuote", "quoteError", "quoteWarning", "quotes", "setSelectedQuote", "resetQuoteWallets", "setQuoteWarningsConfirmed", "updateQuotePartialState", "useQuoteStore", "isVisibleExpanded", "setIsVisibleExpanded", "useState", "isLargeScreen", "isExtraLargeScreen", "useScreenDetect_default", "fetchQuote", "loading", "useSwapInput", "config", "fetchMetaStatus", "useAppStore", "connectedWallets", "useWalletsStore", "isActiveTab", "useUiStore", "showQuoteWarningModal", "setShowQuoteWarningModal", "swapButtonState", "getSwapButtonState", "isExpandable", "isVariantExpandable", "hasInputs", "BigNumber", "isTokensIdentical", "fetchingQuote", "showMessages", "useEffect", "onClickRefresh", "onHandleNavigation", "__name", "route", "onClickOnQuote", "quote", "React", "Layout", "Button", "WarningIcon", "emitPreventableEvent", "navigationRoutes", "i18n", "HeaderButtons", "PageContainer", "Inputs", "mode", "Divider", "QuoteInfo", "QuoteWarningsAndErrors", "ExpandedQuotes", "i18n", "Alert", "Divider", "List", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "useLanguage", "setLanguage", "language", "config", "useAppStore", "languages", "LANGUAGES", "defaultLanguage", "DEFAULT_LANGUAGE", "__name", "LanguagePage", "activeLanguage", "changeLanguage", "languages", "useLanguage", "navigateBack", "useNavigateBack", "languageList", "languageItem", "local", "label", "SVGFlag", "React", "Typography", "Radio", "Layout", "i18n", "PageContainer", "Alert", "Divider", "RadioRoot", "List", "ListItemButton", "__name", "i18n", "Button", "Checkbox", "Image", "ListItemButton", "NotFound", "Typography", "React", "useState", "Checkbox", "Skeleton", "React", "styled", "LiquiditySourceList", "LiquiditySourceSuffix", "NotFoundContainer", "ListItem", "styled", "CustomListItem", "ITEM_SKELETON_COUNT", "LoadingLiquiditySourceList", "React", "LiquiditySourceList", "_", "index", "CustomListItem", "Skeleton", "Checkbox", "__name", "LiquiditySourcePage", "sourceType", "fetchStatus", "useAppStore", "swappers", "disabledLiquiditySources", "searchedFor", "setSearchedFor", "useState", "toggleLiquiditySource", "campaignMode", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "types", "i18n", "validTypes", "liquiditySources", "uniqueItem", "hasSelectAll", "sourceItem", "toggleAllSources", "__name", "list", "selected", "groupTitle", "logo", "React", "Image", "Checkbox", "Typography", "handleSearch", "event", "value", "filteredList", "containsText", "Layout", "LiquiditySourceSuffix", "Button", "PageContainer", "SearchInput", "LoadingLiquiditySourceList", "NotFoundContainer", "NotFound", "LiquiditySourceList", "otherProps", "ListItemButton", "i18n", "React", "useNavigate", "RoutesPage", "navigate", "useNavigate", "navigateBack", "useNavigateBack", "selectedQuote", "refetchQuote", "setSelectedQuote", "updateQuotePartialState", "quoteError", "useQuoteStore", "fetchQuote", "fetchingQuote", "useSwapInput", "onClickOnQuote", "__name", "quote", "settings_url", "navigationRoutes", "wallets_url", "React", "Layout", "i18n", "HeaderButtons", "PageContainer", "Quotes", "i18n", "Divider", "getCategoriesCount", "SelectableCategoryList", "React", "useState", "useNavigate", "i18n", "Divider", "Image", "ListItemButton", "NotFound", "Typography", "React", "useEffect", "useState", "filterBlockchains", "__name", "list", "searchedFor", "blockchainCategory", "blockchain", "isBlockchainTypeInCategory", "containsText", "ImageContainer", "styled", "BlockchainListContainer", "styled", "List", "ScrollableArea", "ImageContainer", "ListItem", "Skeleton", "React", "ITEM_SKELETON_COUNT", "LoadingBlockchainList", "React", "List", "e", "ListItem", "Skeleton", "__name", "BlockchainList", "props", "list", "searchedFor", "onChange", "blockchainCategory", "showTitle", "blockchains", "setBlockchains", "useState", "fetchStatus", "useAppStore", "useEffect", "filterBlockchains", "renderList", "__name", "React", "NotFound", "i18n", "List", "item", "ListItemButton", "Image", "Typography", "Divider", "BlockchainListContainer", "LoadingBlockchainList", "SelectBlockchainPage", "props", "type", "navigateBack", "useNavigateBack", "searchedFor", "setSearchedFor", "useState", "blockchainCategory", "setBlockchainCategory", "setToBlockchain", "useQuoteStore", "setFromBlockchain", "fetchStatus", "useAppStore", "navigate", "useNavigate", "blockchains", "activeCategoriesCount", "getCategoriesCount", "showCategory", "React", "Layout", "i18n", "PageContainer", "SelectableCategoryList", "Divider", "SearchInput", "event", "BlockchainList", "blockchain", "__name", "i18n", "Divider", "React", "useState", "useNavigate", "i18n", "BlockchainsChip", "Divider", "Image", "Skeleton", "Tooltip", "Typography", "React", "useEffect", "MOST_USED_BLOCKCHAINS", "prepare", "blockchains", "preferredBlockchains", "options", "list", "more", "sortByMostUsedBlockchains", "start", "preferredBlockchainsWithoutMainList", "howManyItemsShouldBeCheckedFromMainList", "i", "blockchain", "preferredBlockchain", "generateSortByPreferredBlockchainsFor", "__name", "a", "b", "mostUsed", "MOST_USED_BLOCKCHAINS", "aIndexInMostUsed", "token", "bIndexInMostUsed", "aIsMostUsed", "bIsMostUsed", "aIndexInPreferred", "bIndexInPreferred", "aIsPreferred", "bIsPreferred", "isInVisibleList", "prepareOutput", "item", "usePrepareBlockchainList", "blockchains", "options", "preferredBlockchains", "addPreferredBlockchain", "useAppStore", "useEffect", "output", "prepare", "isInVisibleList", "__name", "styled", "Blockchains", "NUMBER_OF_LOADING", "BlockchainsSection", "props", "blockchains", "type", "blockchain", "onChange", "onMoreClick", "blockchainsList", "usePrepareBlockchainList", "fetchStatus", "useAppStore", "resetToBlockchain", "useQuoteStore", "resetFromBlockchain", "hasMoreItemsInList", "onlyOneItemInList", "showMoreButton", "React", "Divider", "Typography", "i18n", "Blockchains", "e", "Skeleton", "BlockchainsChip", "item", "Tooltip", "getContainer", "Image", "__name", "SelectSwapItemsPage", "props", "type", "navigate", "useNavigate", "navigateBack", "useNavigateBack", "fromBlockchain", "toBlockchain", "setFromToken", "setToToken", "setFromBlockchain", "setToBlockchain", "useQuoteStore", "getBalanceFor", "useWalletsStore", "searchedFor", "setSearchedFor", "useState", "selectedBlockchainName", "blockchains", "useAppStore", "tokens", "updateBlockchain", "__name", "blockchain", "updateToken", "token", "types", "i18n", "React", "Layout", "PageContainer", "BlockchainsSection", "navigationRoutes", "Divider", "SearchInput", "event", "TokenList", "tokenBlockchain", "chain", "i18n", "Alert", "Button", "styled", "React", "useInRouterContext", "useSearchParams", "i18n", "Divider", "InfoIcon", "SlippageIcon", "TextField", "Tooltip", "Typography", "React", "Chip", "styled", "TextField", "BaseContainer", "SlippageChipsContainer", "Head", "SlippageTooltipContainer", "SlippageChip", "i18n", "Typography", "React", "SlippageTooltipContent", "React", "SlippageTooltipContainer", "Typography", "i18n", "__name", "Slippage", "slippage", "setSlippage", "customSlippage", "setCustomSlippage", "useAppStore", "React", "BaseContainer", "Head", "SlippageIcon", "Divider", "Typography", "i18n", "Tooltip", "getContainer", "SlippageTooltipContent", "InfoIcon", "SlippageChipsContainer", "SLIPPAGES", "slippageItem", "index", "key", "SlippageChip", "TextField", "event", "value", "parsedValue", "MIN_SLIPPGAE", "MAX_SLIPPAGE", "__name", "i18n", "AutoThemeIcon", "BridgesIcon", "ChevronRightIcon", "DarkModeIcon", "Divider", "ExchangeIcon", "InfinityIcon", "InfoIcon", "LanguageIcon", "LightModeIcon", "List", "ListItem", "ListItemButton", "Skeleton", "styled", "Switch", "Tabs", "TargetIcon", "Tooltip", "Typography", "React", "useNavigate", "ThemeSection", "styled", "themesList", "React", "LightModeIcon", "Typography", "i18n", "DarkModeIcon", "AutoThemeIcon", "getThemeIcon", "__name", "theme", "iconProps", "SettingsLists", "navigate", "useNavigate", "themeConfig", "useAppStore", "setTheme", "activeLanguage", "languages", "useLanguage", "currentLanguage", "language", "fetchStatus", "swappers", "disabledLiquiditySources", "features", "customTokens", "isThemeHidden", "isFeatureHidden", "isLiquidityHidden", "isLanguageHidden", "isCustomTokensHidden", "infiniteApprove", "toggleInfiniteApprove", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "bridgeSources", "uniqueItem", "totalBridgeSources", "totalSelectedBridgeSources", "exchangeSources", "totalExchangeSources", "totalSelectedExchangeSources", "handleSwapperEndItem", "totalSelected", "total", "Skeleton", "bridgeItem", "Divider", "ChevronRightIcon", "navigationRoutes", "BridgesIcon", "exchangeItem", "ExchangeIcon", "customTokensItem", "TargetIcon", "languageItem", "LanguageIcon", "infiniteApprovalItem", "Tooltip", "getContainer", "SlippageTooltipContainer", "InfoIcon", "InfinityIcon", "Switch", "themeItem", "ListItem", "Tabs", "item", "settingItems", "List", "ListItemButton", "ResetAction", "styled", "SettingsPage", "isInCampaignMode", "updateCampaignMode", "useAppStore", "campaignMode", "setSearchParams", "useSearchParams", "isRouterInContext", "useInRouterContext", "onClick", "__name", "prev", "React", "Layout", "i18n", "PageContainer", "Alert", "Button", "Slippage", "SettingsLists", "i18n", "cancelSwap", "useManager", "Alert", "React", "useParams", "i18n", "getCurrentBlockchainOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "Button", "CopyIcon", "Divider", "DoneIcon", "IconButton", "QuoteCost", "RangoExplorerIcon", "StepDetails", "Tooltip", "Typography", "useCopyToClipboard", "useWallets", "BigNumber", "PendingSwapNetworkStatus", "React", "useEffect", "useRef", "useState", "useNavigate", "i18n", "daysOfWeek", "i18n", "timeSince", "millisecond", "date", "day", "month", "year", "__name", "getSwapDate", "pendingSwap", "PendingSwapNetworkStatus", "React", "i18n", "Button", "Divider", "MessageBox", "React", "CancelContent", "__name", "onCancel", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "DeleteContent", "__name", "onDelete", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "Typography", "i18n", "PendingSwapNetworkStatus", "modalNetworkValues", "warn", "MessageBox", "Wallet", "useWallets", "React", "useState", "styled", "WalletContainer", "TooltipErrorContent", "WalletStateContent", "__name", "props", "type", "title", "currentStepWallet", "message", "showWalletButton", "walletButtonDisabled", "selectedWalletToConnect", "setSelectedWalletToConnect", "useState", "getWalletInfo", "state", "useWallets", "walletType", "walletState", "mapStatusToWalletState", "walletInfo", "shouldShowWallet", "list", "useWalletList", "handleWalletItemClick", "wallet", "warn", "React", "MessageBox", "WalletContainer", "Wallet", "getContainer", "StatefulConnectModal", "SwapDetailsModal", "props", "state", "onClose", "onDelete", "onCancel", "currentStepWallet", "message", "walletButtonDisabled", "showWalletStateContent", "PendingSwapNetworkStatus", "React", "WatermarkedModal", "WIDGET_UI_ID", "WalletStateContent", "modalNetworkValues", "DeleteContent", "CancelContent", "__name", "i18n", "Button", "Divider", "MessageBox", "TokenAmount", "Typography", "React", "useNavigate", "SwapDetailsCompleteModal", "props", "open", "onClose", "status", "priceValue", "usdValue", "realUsdValue", "realValue", "token", "chain", "percentageChange", "description", "diagnosisUrl", "navigate", "useNavigate", "React", "WatermarkedModal", "WIDGET_UI_ID", "MessageBox", "i18n", "TokenAmount", "getContainer", "Divider", "Typography", "Button", "__name", "React", "i18n", "Alert", "IconButton", "LinkIcon", "React", "Fragment", "Alert", "ChevronDownIcon", "IconButton", "React", "useState", "css", "darkTheme", "styled", "Typography", "Container", "styled", "HeaderDetails", "darkTheme", "StepsList", "ScrollableArea", "Alerts", "PlaceholderContainer", "LoaderContainer", "rowStyles", "css", "datePlaceholderStyles", "requestIdStyles", "outputStyles", "titleStepsStyles", "StyledLink", "ErrorMessages", "MessageText", "Typography", "styled", "Alerts", "ActionIcon", "AlertFooter", "FailedAlert", "props", "message", "showContentError", "setShowContentError", "useState", "React", "Alert", "IconButton", "prev", "ActionIcon", "ChevronDownIcon", "AlertFooter", "MessageText", "__name", "i18n", "Alert", "Button", "PendingSwapNetworkStatus", "React", "WarningAlert", "props", "switchNetwork", "setNetworkModal", "message", "showNetworkModal", "React", "Alert", "Button", "PendingSwapNetworkStatus", "e", "i18n", "__name", "SwapDetailsAlerts", "props", "switchNetwork", "showNetworkModal", "setNetworkModal", "message", "step", "hasAlreadyProceededToSign", "hasWarning", "isNetworkStatusInWarningState", "waitingForApproval", "inProgress", "waitingProgress", "React", "Alerts", "explorerUrl", "index", "urls", "key", "lastUrl", "loading", "error", "Fragment", "Alert", "i18n", "IconButton", "LinkIcon", "WarningAlert", "FailedAlert", "__name", "RESET_INTERVAL", "getSteps", "__name", "swap", "blockchains", "swappers", "args", "hasAlreadyProceededToSign", "step", "index", "amountToConvert", "getBlockchainShortNameFor", "numberToString", "getSwapperDisplayName", "internalSwap", "React", "SwapDetailsAlerts", "getStepState", "isNetworkStatusInWarningState", "SwapDetails", "props", "swap", "requestId", "onDelete", "onCancelProps", "canSwitchNetworkTo", "connect", "getWalletInfo", "useWallets", "blockchains", "useAppStore", "swappers", "findToken", "retry", "useQuoteStore", "isActiveTab", "useUiStore", "navigate", "useNavigate", "isCopied", "handleCopy", "useCopyToClipboard", "RESET_INTERVAL", "listRef", "useRef", "modalState", "setModalState", "useState", "showCompletedModal", "setShowCompletedModal", "onCancel", "__name", "getNotifications", "useNotificationStore", "removeNotification", "notifications", "currentStep", "getCurrentStep", "currentStepNetworkStatus", "useEffect", "n", "showSwitchNetwork", "PendingSwapNetworkStatus", "lastConvertedTokenInFailedSwap", "getLastConvertedTokenInFailedSwap", "currentStepBlockchain", "getCurrentBlockchainOfOrNull", "currentStepWallet", "getRelatedWalletOrNull", "swapDate", "getSwapDate", "shouldRetry", "shouldRetrySwap", "isMobileWallet", "walletType", "switchNetwork", "stepMessage", "getSwapMessages", "steps", "getSteps", "numberOfSteps", "firstStep", "lastStep", "outputAmount", "totalFee", "diagnosisUrl", "step", "outputUsdValue", "numberToString", "inputUsdValue", "realOutputUsdValue", "BigNumber", "realInputUsdValue", "percentageChange", "getPriceImpact", "stepDetailMessage", "completeModalDesc", "i18n", "getConciseAddress", "React", "ErrorMessages", "Typography", "MessageText", "Layout", "SuffixContainer", "Button", "swapInput", "createRetryQuote", "PageContainer", "HeaderDetails", "rowStyles", "requestIdStyles", "Tooltip", "getContainer", "IconButton", "DoneIcon", "CopyIcon", "StyledLink", "SCANNER_BASE_URL", "RangoExplorerIcon", "outputStyles", "QuoteCost", "roundedSecondsToString", "totalArrivalTime", "QuoteSummary", "getPriceImpactLevel", "titleStepsStyles", "Divider", "StepsList", "index", "key", "state", "getStepState", "isFocused", "StepDetails", "SwapDetailsModal", "SwapDetailsCompleteModal", "i18n", "Divider", "NotFound", "Skeleton", "Typography", "React", "i18n", "Divider", "Skeleton", "Typography", "React", "css", "styled", "Container", "StepContainer", "StepSeparator", "quoteSummaryItemStyles", "tokenAmountStyles", "costStyles", "quoteSummaryStyles", "quoteSummarySeparatorStyles", "swapsStepsStyles", "stepTitleStyles", "stepTokensStyles", "stepInfoStyles", "stepIconStyles", "extraInfoStyles", "LoadingSwapDetails", "React", "Container", "QuoteSummarySkeleton", "Typography", "i18n", "StepContainer", "StepSkeleton", "extraInfoStyles", "Divider", "Skeleton", "StepSeparator", "__name", "SwapDetailsPlaceholder", "props", "requestId", "showSkeleton", "React", "Layout", "i18n", "SuffixContainer", "Container", "HeaderDetails", "rowStyles", "Typography", "requestIdStyles", "Skeleton", "Divider", "datePlaceholderStyles", "LoadingSwapDetails", "PlaceholderContainer", "NotFound", "__name", "SwapDetailsPage", "manager", "state", "useManager", "loading", "pendingSwaps", "getPendingSwaps", "requestId", "useParams", "navigateBack", "useNavigateBack", "fetchMetaStatus", "useAppStore", "React", "Alert", "i18n", "showSkeleton", "selectedSwap", "swap", "onCancel", "__name", "cancelSwap", "onDelete", "e", "SwapDetailsPlaceholder", "SwapDetails", "i18n", "Divider", "getCategoriesCount", "SelectableCategoryList", "styled", "Typography", "Wallet", "React", "useState", "ListContainer", "styled", "Container", "PageContainer", "WalletsPage", "fetchMetaStatus", "useAppStore", "blockchainCategory", "setBlockchainCategory", "useState", "blockchains", "config", "selectedWalletToConnect", "setSelectedWalletToConnect", "isActiveTab", "useUiStore", "list", "useWalletList", "filteredBlockchains", "filterBlockchainsByWalletTypes", "showCategory", "getCategoriesCount", "filteredWallets", "filterWalletsByCategory", "handleWalletItemClick", "__name", "wallet", "isSingleWalletActive", "React", "Layout", "i18n", "SelectableCategoryList", "Divider", "Typography", "index", "key", "Wallet", "getContainer", "StatefulConnectModal", "AppRoutes", "useSyncStoresWithConfig", "useSyncUrlAndStore", "useRoutes", "navigationRoutes", "React", "Home", "RoutesPage", "SelectSwapItemsPage", "SelectBlockchainPage", "SettingsPage", "LanguagePage", "LiquiditySourcePage", "CustomTokensPage", "AddCustomTokenPage", "HistoryPage", "SwapDetailsPage", "WalletsPage", "ConfirmSwapPage", "__name", "useQueueManager", "splitWalletNetwork", "isEvmBlockchain", "useContext", "useEffect", "useState", "globalCss", "globalFont", "__name", "globalCss", "useFetchApiConfig", "setWatermark", "useUiStore", "__name", "response", "getConfig", "data", "useWallets", "useEffect", "useRef", "useForceAutoConnect", "connect", "state", "useWallets", "initiated", "useRef", "fetchStatus", "useAppStore", "walletType", "walletState", "useEffect", "__name", "isApprovalTX", "RouteEventType", "StepEventType", "StepExecutionEventStatus", "WidgetEvents", "useEffect", "useSubscribeToWidgetEvents", "connectedWallets", "useWalletsStore", "getWalletsDetails", "setNotification", "useNotificationStore", "findToken", "useAppStore", "useEffect", "handleStepEvent", "__name", "widgetEvent", "event", "step", "route", "StepEventType", "StepExecutionEventStatus", "isApprovalTX", "fromAccount", "account", "toAccount", "wallet", "eventEmitter", "WidgetEvents", "handleRouteEvent", "RouteEventType", "useManager", "useEffect", "useSyncNotifications", "isSynced", "syncNotifications", "useNotificationStore", "manager", "state", "useManager", "useEffect", "getPendingSwaps", "__name", "useBootstrap", "useForceAutoConnect", "globalFont", "useSubscribeToWidgetEvents", "useSyncNotifications", "blockchains", "useAppStore", "canSwitchNetworkTo", "useWallets", "lastConnectedWalletWithNetwork", "setLastConnectedWalletWithNetwork", "useState", "disconnectedWallet", "setDisconnectedWallet", "widgetContext", "useContext", "WidgetContext", "evmChains", "isEvmBlockchain", "fetchApiConfig", "useFetchApiConfig", "useEffect", "unsubscribeQuoteStore", "useQueueManager", "tabManager", "useNotificationStore", "walletType", "splitWalletNetwork", "__name", "styled", "MainContainer", "Main", "useBootstrap", "config", "useAppStore", "activeTheme", "useTheme", "activeLanguage", "useLanguage", "React", "I18nManager", "MainContainer", "AppRoutes", "__name", "setSolanaSignerConfig", "React", "useEffect", "useMemo", "useState", "useFontLoader", "__name", "fontLink", "setFontLink", "useState", "loadFont", "fontUrl", "link", "unloadFont", "fontName", "getFontUrlByName", "newFontLink", "useFontLoader_default", "checkWaitingForNetworkChange", "makeQueueDefinition", "ManagerProvider", "useWallets", "convertEvmBlockchainMetaToEvmChainInfo", "isEvmBlockchain", "React", "useMemo", "QueueManager", "props", "providers", "getSigners", "state", "connect", "canSwitchNetworkTo", "getWalletInfo", "useWallets", "swapQueueDef", "useMemo", "makeQueueDefinition", "getConfig", "eventEmitter", "blockchains", "useAppStore", "wallets", "useWalletsStore", "wallet", "switchNetwork", "__name", "network", "isMobileWallet", "walletType", "allBlockchains", "blockchain", "blockchainsObj", "evmBasedChains", "isEvmBlockchain", "getSupportedChainNames", "type", "supportedChains", "walletAndSupportedChainsNames", "allProviders", "context", "convertEvmBlockchainMetaToEvmChainInfo", "isActiveTab", "useUiStore", "React", "ManagerProvider", "manager", "checkWaitingForNetworkChange", "QueueManager_default", "useManager", "React", "createContext", "useContext", "useUpdateQuoteInputs", "findToken", "useAppStore", "blockchains", "tokens", "setFromBlockchain", "setFromToken", "setToBlockchain", "setToToken", "setInputAmount", "useQuoteStore", "__name", "params", "fromBlockchain", "fromToken", "toBlockchain", "toToken", "requestAmount", "meta", "blockchainMeta", "blockchain", "token", "cancelSwap", "getCurrentBlockchainOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "WidgetHistory", "__name", "manager", "actions", "getPendingSwaps", "swap", "meta", "retryQuote", "createRetryQuote", "id", "queue", "cancelSwap", "currentStep", "getCurrentStep", "getRelatedWalletOrNull", "getCurrentBlockchainOfOrNull", "WidgetInfoContext", "createContext", "WidgetInfo", "props", "manager", "useManager", "isActiveTab", "useUiStore", "retrySwap", "useQuoteStore", "findToken", "useAppStore", "history", "WidgetHistory", "details", "useWalletsStore", "isLoading", "totalBalance", "calculateWalletUsdValue", "refetch", "blockchains", "tokens", "swappers", "loadingStatus", "resetLanguage", "useLanguage", "notifications", "useNotificationStore", "clearNotifications", "updateQuoteInputs", "useUpdateQuoteInputs", "fromBlockchain", "toBlockchain", "fromToken", "toToken", "inputAmount", "value", "tabManager", "accounts", "React", "__name", "useWidget", "context", "useContext", "WidgetProvider", "props", "onUpdateState", "config", "fontFamily", "handleLoadCustomFont", "useFontLoader_default", "useEffect", "useMemo", "initConfig", "RANGO_PUBLIC_API_KEY", "DEFAULT_BASE_URL", "setSolanaSignerConfig", "React", "WidgetWallets", "QueueManager_default", "WidgetInfo", "__name", "Widget", "props", "isExternalWalletsEnabled", "React", "AppRouter", "Main", "WidgetProvider", "DEFAULT_CONFIG", "__name", "useWidgetEvents", "on", "off", "eventEmitter", "__name", "StatefulConnect", "DerivationPath", "Namespaces", "isOnDerivationPath", "isOnNamespace"]
7
7
  }