@rango-dev/widget-embedded 0.17.1-next.21 → 0.17.1-next.23

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
- "sources": ["../src/index.ts", "../src/containers/Wallets/Wallets.tsx", "../src/hooks/useWalletProviders.ts", "../src/store/wallets.ts", "../src/services/httpService.ts", "../src/constants/index.ts", "../src/utils/configs.ts", "../src/utils/wallets.ts", "../src/constants/numbers.ts", "../src/constants/wallets.ts", "../src/utils/numbers.ts", "../src/store/selectors.ts", "../src/utils/providers.ts", "../src/store/AppStore.tsx", "../src/store/app.ts", "../src/store/slices/config.ts", "../src/utils/common.ts", "../src/store/settings.ts", "../src/constants/languages.ts", "../src/constants/swapSettings.ts", "../src/utils/settings.ts", "../src/store/slices/data.ts", "../src/containers/Widget/Widget.tsx", "../src/containers/App/App.tsx", "../src/components/AppRouter.tsx", "../src/hooks/useForceAutoConnect.ts", "../src/components/UpdateUrl.tsx", "../src/constants/navigationRoutes.ts", "../src/hooks/useSyncStoresWithConfig.ts", "../src/store/quote.ts", "../src/utils/quote.ts", "../src/types/quote.ts", "../src/utils/meta.ts", "../src/utils/swap.ts", "../src/components/ConfirmWalletsModal/ConfirmWallets.helpers.ts", "../src/constants/errors.ts", "../src/constants/messages.ts", "../src/store/ui.ts", "../src/components/AppRoutes.tsx", "../src/pages/ConfirmSwapPage.tsx", "../src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx", "../src/constants/warnings.ts", "../src/components/ConfirmWalletsModal/ConfirmWallets.styles.ts", "../src/components/ConfirmWalletsModal/WalletList.tsx", "../src/hooks/useWalletList.ts", "../src/pages/WalletsPage.tsx", "../src/components/Layout/Layout.tsx", "../src/hooks/useNavigateBack.ts", "../src/components/HeaderButtons/BackButton.tsx", "../src/components/HeaderButtons/HeaderButtons.styles.ts", "../src/components/HeaderButtons/CancelButton.tsx", "../src/components/HeaderButtons/WalletButton.tsx", "../src/components/HeaderButtons/HomeButtons.tsx", "../src/components/NotificationContent/NotificationContent.tsx", "../src/store/notification.ts", "../src/components/NotificationContent/NotificationContent.styles.ts", "../src/components/NotificationContent/NotificationNotFound.tsx", "../src/components/HeaderButtons/UnreadNotificationsBadge.tsx", "../src/components/Layout/Layout.styles.ts", "../src/components/WalletModal/WalletModal.tsx", "../src/components/WalletModal/WalletModalContent.tsx", "../src/components/WalletModal/WalletModalContent.styles.ts", "../src/components/ConfirmWalletsModal/WalletList.styles.ts", "../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/QuoteSummary.tsx", "../src/components/Quote/QuoteSummary.styles.ts", "../src/components/Quote/QuoteSkeleton.tsx", "../src/components/Quote/QuoteSkeleton.styles.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/hooks/useConfirmSwap/useConfirmSwap.ts", "../src/hooks/useFetchQuote.ts", "../src/hooks/useConfirmSwap/useConfirmSwap.helpers.ts", "../src/pages/HistoryPage.tsx", "../src/components/SearchInput/SearchInput.tsx", "../src/components/SearchInput/SearchInput.styles.ts", "../src/components/SwapsGroup/SwapsGroup.tsx", "../src/components/SwapsGroup/SwapsGroup.styles.ts", "../src/utils/date.ts", "../src/utils/queue.ts", "../src/pages/Home.tsx", "../src/components/SwitchFromAndTo.tsx", "../src/hooks/useSwapInput.ts", "../src/pages/LanguagePage.tsx", "../src/components/SettingsContainer/SettingsContainer.style.ts", "../src/hooks/useLanguage.ts", "../src/pages/LiquiditySourcePage.tsx", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.tsx", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.ts", "../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/components/TokenList/TokenList.tsx", "../src/utils/colors.ts", "../src/components/TokenList/LoadingTokenList.tsx", "../src/components/TokenList/TokenList.styles.ts", "../src/pages/SettingsPage.tsx", "../src/components/Slippage/Slippage.tsx", "../src/components/Slippage/Slippage.styles.ts", "../src/components/Slippage/SlippageTooltipContent.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/SwapDetailsAlerts/SwapDetailsAlerts.styles.ts", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.Warning.tsx", "../src/components/SwapDetails/SwapDetails.styles.ts", "../src/components/SwapDetails/SwapDetails.Placeholder.tsx", "../src/components/LoadingSwapDetails/LoadingSwapDetails.tsx", "../src/components/LoadingSwapDetails/LoadingSwapDetails.styles.ts", "../src/components/LoadingSwapDetails/LoadingSwapDetailStep.tsx", "../src/pages/ThemePage.tsx", "../src/components/WidgetEvents.tsx", "../src/types/notification.ts", "../src/globalStyles.ts", "../src/hooks/useTheme.ts", "../src/utils/ui.ts", "../src/utils/hash.ts", "../src/containers/App/App.styles.ts", "../src/containers/WidgetProvider/WidgetProvider.tsx", "../src/QueueManager.tsx", "../src/containers/WidgetInfo/WidgetInfo.tsx"],
4
- "sourcesContent": ["import type { WidgetProps } from './containers/Widget';\nimport type { ConnectedWallet } from './store/wallets';\nimport type {\n BlockchainAndTokenConfig,\n WidgetColors,\n WidgetColorsKeys,\n WidgetConfig,\n WidgetTheme,\n} from './types';\nimport type {\n Route,\n RouteEvent,\n RouteFailedEvent,\n RouteStartedEvent,\n RouteSucceededEvent,\n Step,\n StepApprovalTxSucceededEvent,\n StepCheckStatusEvent,\n StepEvent,\n StepFailedEvent,\n StepOutputRevealedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepTxExecutionBlockedEvent,\n StepTxExecutionUpdatedEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport type {\n EventHandler as HandleWalletsUpdate,\n ProviderInterface,\n} from '@rango-dev/wallets-react';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport {\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionBlockedEventStatus,\n StepExecutionEventStatus,\n useEvents as useWidgetEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useWallets } from '@rango-dev/wallets-react';\n\nimport { WidgetWallets } from './containers/Wallets';\nimport { Widget } from './containers/Widget';\nimport { useWidget } from './containers/WidgetInfo';\nimport { WidgetProvider } from './containers/WidgetProvider';\nimport { customizedThemeTokens } from './utils/ui';\n\nexport type {\n WidgetConfig,\n WalletType,\n WidgetTheme,\n WidgetColors,\n WidgetColorsKeys,\n ProviderInterface,\n BlockchainAndTokenConfig,\n WidgetProps,\n RouteEvent,\n StepEvent,\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};\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 useWidgetEvents,\n customizedThemeTokens,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n};\n", "import type {\n OnConnectHandler,\n PropTypes,\n WidgetContextInterface,\n} from './Wallets.types';\nimport type { ProvidersOptions } from '../../utils/providers';\nimport type { EventHandler } from '@rango-dev/wallets-react';\nimport type { Network } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport { Events, Provider } from '@rango-dev/wallets-react';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport React, { createContext, useEffect, useRef } from 'react';\n\nimport { useWalletProviders } from '../../hooks/useWalletProviders';\nimport { AppStoreProvider, useAppStore } from '../../store/AppStore';\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});\n\nfunction Main(props: PropsWithChildren<PropTypes>) {\n const updateConfig = useAppStore().updateConfig;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const walletOptions: ProvidersOptions = {\n walletConnectProjectId: props.config?.walletConnectProjectId,\n };\n const { providers } = useWalletProviders(props.config.wallets, walletOptions);\n const disconnectWallet = useWalletsStore.use.disconnectWallet();\n const connectWallet = useWalletsStore.use.connectWallet();\n const onConnectWalletHandler = useRef<OnConnectHandler>();\n\n useEffect(() => {\n if (props.config) {\n updateConfig(props.config);\n }\n }, [props.config]);\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 connectWallet(data, tokens);\n } else {\n disconnectWallet(type);\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 return (\n <WidgetContext.Provider\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n value={{\n onConnectWallet: (handler) => {\n onConnectWalletHandler.current = handler;\n },\n }}>\n <Provider\n allBlockChains={blockchains}\n providers={providers}\n onUpdateState={onUpdateState}\n autoConnect>\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\nexport function useWalletProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n) {\n const clearConnectedWallet = useWalletsStore.use.clearConnectedWallet();\n let generateProviders: ProviderInterface[] = matchAndGenerateProviders(\n undefined,\n options\n );\n\n useEffect(() => {\n clearConnectedWallet();\n generateProviders = matchAndGenerateProviders(providers, {\n walletConnectProjectId: options?.walletConnectProjectId,\n });\n }, [providers?.length]);\n\n return {\n providers: generateProviders,\n };\n}\n", "import type { 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 { httpService } from '../services/httpService';\nimport {\n isAccountAndWalletMatched,\n makeBalanceFor,\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}\n\ninterface WalletsStore {\n connectedWallets: ConnectedWallet[];\n customDestination: string;\n loading: boolean;\n connectWallet: (accounts: Wallet[], tokens: Token[]) => void;\n disconnectWallet: (walletType: WalletType) => void;\n selectWallets: (wallets: { walletType: string; chain: string }[]) => void;\n clearConnectedWallet: () => void;\n getWalletsDetails: (\n accounts: Wallet[],\n tokens: Token[],\n shouldRetry?: boolean\n ) => void;\n}\n\nexport const useWalletsStore = createSelectors(\n create<WalletsStore>()(\n subscribeWithSelector((set, get) => ({\n connectedWallets: [],\n customDestination: '',\n loading: false,\n connectWallet: (accounts, tokens) => {\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 = !state.connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.chain === account.chain &&\n connectedWallet.selected\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, tokens);\n },\n disconnectWallet: (walletType) => {\n set((state) => {\n const selectedWallets = state.connectedWallets\n .filter(\n (connectedWallet) =>\n connectedWallet.selected &&\n connectedWallet.walletType !== walletType\n )\n .map((selectedWallet) => selectedWallet.chain);\n return {\n 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 });\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, tokens, 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 loading: false,\n 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], tokens, false);\n }\n return matchedAccount && retrievedBalanceAccount\n ? {\n ...connectedWallet,\n explorerUrl: retrievedBalanceAccount.explorerUrl,\n balances: makeBalanceFor(\n retrievedBalanceAccount,\n tokens\n ),\n loading: false,\n }\n : connectedWallet;\n }\n ),\n }));\n } else {\n throw new Error('Wallet not found');\n }\n } catch (error) {\n set((state) => ({\n loading: false,\n connectedWallets: state.connectedWallets.map((balance) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, balance)\n )\n ? resetConnectedWalletState(balance)\n : balance;\n }),\n }));\n }\n },\n }))\n )\n);\n\nexport const fetchingBalanceSelector = (state: WalletsStore) =>\n !!state.connectedWallets.find((wallet) => wallet.loading);\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", "export const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\nexport const DEFAULT_BASE_URL = 'https://api.rango.exchange';\n", "import { RANGO_PUBLIC_API_KEY } from '../constants';\n\nexport interface Configs {\n API_KEY: string;\n BASE_URL?: string;\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;\nexport const DEFAULT_FONT_FAMILY = 'Roboto';\n\nexport const THEME_CLASS_NAME_PREFIX = `theme-widget`;\n", "import type { TokenWithBalance } from '../components/TokenList';\nimport type { ConnectedWallet, TokenBalance } from '../store/wallets';\nimport type { Wallet } 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 BestRouteResponse,\n BlockchainMeta,\n Token,\n WalletDetail,\n} from 'rango-sdk';\n\nimport { WalletState as WalletStatus } from '@rango-dev/ui';\nimport { readAccountAddress } from '@rango-dev/wallets-react';\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 { EXCLUDED_WALLETS } from '../constants/wallets';\n\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): ModalWalletInfo[] {\n return list\n .filter((wallet) => !EXCLUDED_WALLETS.includes(wallet as WalletTypes))\n .filter((wallet) => {\n const { supportedChains, isContractWallet } = getWalletInfo(wallet);\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 { name, img: image, installLink } = getWalletInfo(type);\n const state = mapStatusToWalletState(getState(type));\n return {\n title: name,\n image,\n link: detectInstallLink(installLink),\n state,\n type,\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 getRequiredChains(quote: BestRouteResponse | null) {\n const wallets: string[] = [];\n\n quote?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n if (!wallets.includes(currentStepFromBlockchain)) {\n wallets.push(currentStepFromBlockchain);\n }\n if (!wallets.includes(currentStepToBlockchain)) {\n wallets.push(currentStepToBlockchain);\n }\n\n // Check if internalSwaps array exists\n if (swap.internalSwaps && Array.isArray(swap.internalSwaps)) {\n swap.internalSwaps.forEach((internalSwap) => {\n const internalStepFromBlockchain = internalSwap.from.blockchain;\n const internalStepToBlockchain = internalSwap.to.blockchain;\n if (!wallets.includes(internalStepFromBlockchain)) {\n wallets.push(internalStepFromBlockchain);\n }\n if (!wallets.includes(internalStepToBlockchain)) {\n wallets.push(internalStepToBlockchain);\n }\n });\n }\n });\n return wallets;\n}\n\ntype Blockchain = { name: string; accounts: ConnectedWallet[] };\n\nexport function getBalanceFromWallet(\n connectedWallets: ConnectedWallet[],\n chain: string,\n symbol: string,\n address: string | null\n): TokenBalance | null {\n if (connectedWallets.length === 0) {\n return null;\n }\n\n const selectedChainWallets = connectedWallets.filter(\n (wallet) => wallet.chain === chain\n );\n if (selectedChainWallets.length === 0) {\n return null;\n }\n\n return (\n selectedChainWallets\n .map(\n (wallet) =>\n wallet.balances?.find(\n (balance) =>\n (address !== null && balance.address === address) ||\n (address === null &&\n balance.address === address &&\n balance.symbol === symbol)\n ) || null\n )\n .filter((balance) => balance !== null)\n .sort(\n (a, b) => parseFloat(b?.amount || '0') - parseFloat(a?.amount || '1')\n )\n .find(() => true) || null\n );\n}\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 tokens: Token[]\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:\n getUsdPrice(\n chain,\n tokenBalance.asset.symbol,\n tokenBalance.asset.address,\n tokens\n ) || 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 sortTokens = (tokens: TokenWithBalance[]): TokenWithBalance[] => {\n const walletConnected = !!tokens.some((token) => token.balance);\n if (!walletConnected) {\n return tokens\n .filter((token) => !token.address)\n .concat(\n tokens.filter((token) => token.address && !token.isSecondaryCoin),\n tokens.filter((token) => token.isSecondaryCoin)\n );\n }\n\n return tokens\n .filter((token) => !!token.balance)\n .sort(\n (tokenA, tokenB) =>\n parseFloat(tokenB.balance?.usdValue || '0') -\n parseFloat(tokenA.balance?.usdValue || '0')\n )\n .concat(\n tokens.filter((token) => !token.balance && !token.isSecondaryCoin),\n tokens.filter((token) => !token.balance && token.isSecondaryCoin)\n );\n};\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\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 getTokensWithBalance(\n tokens: TokenWithBalance[],\n connectedWallets: ConnectedWallet[]\n): TokenWithBalance[] {\n return tokens.map(({ balance, ...otherProps }) => {\n const tokenAmount = numberToString(\n new BigNumber(\n getBalanceFromWallet(\n connectedWallets,\n otherProps.blockchain,\n otherProps.symbol,\n otherProps.address\n )?.amount || ZERO\n )\n );\n\n let tokenUsdValue = '';\n if (otherProps.usdPrice) {\n tokenUsdValue = numberToString(\n new BigNumber(\n getBalanceFromWallet(\n connectedWallets,\n otherProps.blockchain,\n otherProps.symbol,\n otherProps.address\n )?.amount || ZERO\n ).multipliedBy(otherProps.usdPrice)\n );\n }\n\n return {\n ...otherProps,\n ...(tokenAmount !== '0' && {\n balance: { amount: tokenAmount, usdValue: tokenUsdValue },\n }),\n };\n });\n}\n\nexport function getTokensBalanceFromWalletAndSort(\n tokens: TokenWithBalance[],\n connectedWallets: ConnectedWallet[]\n) {\n const list =\n connectedWallets.length > 0\n ? getTokensWithBalance(tokens, connectedWallets)\n : tokens;\n list.sort((tokenA, tokenB) => {\n if (tokenA.balance?.usdValue && tokenB.balance?.usdValue) {\n return (\n parseFloat(tokenB.balance.usdValue) -\n parseFloat(tokenA.balance.usdValue)\n );\n }\n\n if (!tokenA.balance?.usdValue && tokenB.balance?.usdValue) {\n return 1;\n }\n\n if (tokenA.balance?.usdValue && !tokenB.balance?.usdValue) {\n return -1;\n }\n\n if (!tokenA.balance?.usdValue && !tokenB.balance?.usdValue) {\n return (\n parseFloat(tokenB.balance?.amount || '0') -\n parseFloat(tokenA.balance?.amount || '0')\n );\n }\n\n return 0;\n });\n\n return list;\n}\n\nexport function getSortedTokens(\n chain: BlockchainMeta | null,\n tokens: Token[],\n connectedWallets: ConnectedWallet[],\n otherChainTokens: TokenWithBalance[]\n): TokenWithBalance[] {\n const fromChainEqualsToToBlockchain =\n chain?.name === otherChainTokens[0]?.name;\n if (fromChainEqualsToToBlockchain) {\n return otherChainTokens;\n }\n\n const filteredTokens = tokens.filter(\n (token) => token.blockchain === chain?.name\n );\n return sortTokens(getTokensWithBalance(filteredTokens, connectedWallets));\n}\n\nexport function tokensAreEqual(\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 === tokenB?.symbol &&\n tokenA?.address === tokenB?.address\n );\n}\n\nexport function sortWalletsBasedOnConnectionState(\n wallets: ModalWalletInfo[]\n): ModalWalletInfo[] {\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", "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", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n\nimport type { BestRouteResponse } from 'rango-sdk';\n\nimport { BigNumber } from 'bignumber.js';\n\nexport const percentToString = (p: number, fractions = 0): string =>\n (p * 100).toFixed(fractions);\n\nexport const secondsToString = (s: number): string => {\n const seconds = (s % 60).toString().padStart(2, '0');\n const minutes = parseInt((s / 60).toString())\n .toString()\n .padStart(2, '0');\n return `${minutes}:${seconds}`;\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 convertBigNumberToHex = (\n value: BigNumber,\n decimals: number\n): string => {\n return '0x' + value.shiftedBy(decimals).toString(16);\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 function dollarToConciseString(num: number | undefined): string {\n if (!num) {\n return '-';\n }\n if (num < 1) {\n return ' < 1$';\n }\n if (num < 1000) {\n return numberToString(new BigNumber(num)) + '$';\n }\n if (num < 10_000) {\n return parseInt((num / 100).toString()) / 10 + 'K';\n }\n if (num < 1_000_000) {\n return parseInt((num / 1000).toString()) + 'K';\n }\n if (num < 100_000_000) {\n return parseInt((num / 100000).toString()) / 10 + 'M';\n }\n return parseInt((num / 1000000).toString()) + 'M';\n}\n\nexport function removeExtraDecimals(num: string, maxDecimals: number): string {\n try {\n if (!num.includes('.')) {\n return num;\n }\n const [b, f] = num.split('.');\n if (f && f.length > maxDecimals) {\n return `${b}.${f.substring(0, maxDecimals)}`;\n }\n return num;\n } catch (e) {\n return num;\n }\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;\n10;\n\nexport function limitDecimalPlaces(\n numberString: string,\n maxDecimalPlaces = 4\n): string {\n const number = parseFloat(numberString);\n if (isNaN(number)) {\n return numberString;\n } // Return the original string if it's not a valid number\n\n const multiplier = Math.pow(10, maxDecimalPlaces);\n const roundedNumber = Math.round(number * multiplier) / multiplier;\n return roundedNumber.toString();\n}\n", "import { 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>>>(_store: S) => {\n let store = _store as WithSelectors<typeof _store>;\n store.use = {};\n for (let 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 { allProviders } from '@rango-dev/provider-all';\nimport { ProviderInterface } from '@rango-dev/wallets-react';\nimport { WidgetConfig } from '../types';\n\nexport interface ProvidersOptions {\n walletConnectProjectId?: WidgetConfig['walletConnectProjectId'];\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 },\n });\n\n if (providers) {\n const selectedProviders: ProviderInterface[] = [];\n\n providers.forEach((requestedProvider) => {\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 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 { WidgetConfig } from '../types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { createContext, useContext, 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 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 { WidgetConfig } from '../types';\nimport type { StateCreator } from 'zustand';\n\nimport { create } from 'zustand';\n\nimport { createConfigSlice } from './slices/config';\nimport { createDataSlice } from './slices/data';\n\nexport type StateCreatorWithInitialData<\n T extends Partial<WidgetConfig>,\n R extends Record<string, unknown>,\n V extends Record<string, unknown>\n> = (\n initialData: T | undefined,\n ...rest: Parameters<StateCreator<R, [], [], V>>\n) => ReturnType<StateCreator<R, [], [], V>>;\n\nexport type AppStoreState = DataSlice & ConfigSlice;\n\nexport function createAppStore(initialData?: WidgetConfig) {\n return create<AppStoreState>()((...a) => ({\n ...createDataSlice(...a),\n ...createConfigSlice(initialData, ...a),\n }));\n}\n", "import type { WidgetConfig } from '../../types';\nimport type { StateCreatorWithInitialData } from '../app';\n\nexport const DEFAULT_CONFIG: WidgetConfig = {\n apiKey: '',\n multiWallets: true,\n enableNewLiquiditySources: true,\n};\n\nexport type ConfigSlice = {\n config: WidgetConfig;\n\n updateConfig: (config: WidgetConfig) => void;\n};\n\nexport const createConfigSlice: StateCreatorWithInitialData<\n WidgetConfig,\n ConfigSlice,\n ConfigSlice\n> = (initialData, set, get) => {\n return {\n config: { ...DEFAULT_CONFIG, ...initialData },\n\n // Actions\n updateConfig: (nextConfig: WidgetConfig) => {\n const currentConfig = get().config;\n\n set({\n config: {\n ...currentConfig,\n ...nextConfig,\n },\n });\n },\n };\n};\n", "export 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 const getContainer = () =>\n document.getElementById('swap-box') as HTMLElement;\n", "import type { SwapperMeta } from 'rango-sdk';\n\nimport { type Language } from '@rango-dev/ui';\nimport { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\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';\n\nimport createSelectors from './selectors';\n\nexport type ThemeMode = 'auto' | 'dark' | 'light';\n\nexport interface SettingsState {\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 disabledLiquiditySources: string[];\n theme: ThemeMode;\n language: Language;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\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) => 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}\n\nexport const useSettingsStore = createSelectors(\n create<SettingsState>()(\n persist(\n subscribeWithSelector((set, get) => ({\n preferredBlockchains: [],\n slippage: DEFAULT_SLIPPAGE,\n customSlippage: null,\n infiniteApprove: false,\n affiliateRef: null,\n affiliatePercent: null,\n affiliateWallets: null,\n disabledLiquiditySources: [],\n theme: 'auto',\n language: DEFAULT_LANGUAGE,\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 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 (\n swappersGroup.length === state.disabledLiquiditySources.length\n ) {\n return { disabledLiquiditySources: [] };\n }\n\n return {\n disabledLiquiditySources: swappersGroup,\n };\n }),\n toggleInfiniteApprove: () =>\n set((state) => ({\n infiniteApprove: !state.infiniteApprove,\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:\n state.disabledLiquiditySources.concat(name),\n };\n }),\n setTheme: (theme) =>\n set(() => ({\n theme,\n })),\n setLanguage: (language) =>\n set(() => ({\n language,\n })),\n })),\n {\n name: 'user-settings',\n skipHydration: true,\n }\n )\n )\n);\n", "import type { FlagPropTypes, Language } from '@rango-dev/ui';\n\nimport { English, French, Japanese, Spanish } 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];\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 { SwapperMeta } from 'rango-sdk';\n\nimport { useSettingsStore } from '../store/settings';\n\nimport { removeDuplicateFrom } from './common';\n\nexport type LiquiditySourceType = 'BRIDGE' | 'AGGREGATOR' | 'DEX';\n\nexport type UniqueSwappersGroupType = {\n id: string;\n groupTitle: string;\n logo: string;\n type: LiquiditySourceType;\n selected: boolean;\n};\n\nexport function getUniqueSwappersGroups(\n swappers: SwapperMeta[]\n): UniqueSwappersGroupType[] {\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\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", "// We keep all the received data from server in this slice\n\nimport type { ConfigSlice } from './config';\nimport type { BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\nimport type { StateCreator } from 'zustand';\n\nimport { httpService as sdk } from '../../services/httpService';\nimport { containsText } from '../../utils/common';\nimport { sortLiquiditySourcesByGroupTitle } from '../../utils/settings';\nimport { tokensAreEqual } from '../../utils/wallets';\n\ntype BlockchainOptions = {\n type?: 'source' | 'destination';\n};\n\ntype TokenOptions = {\n type?: 'source' | 'destination';\n // filter by an specific blockchain\n blockchain?: string;\n searchFor?: string;\n};\nexport type FetchStatus = 'loading' | 'success' | 'failed';\nexport interface DataSlice {\n _blockchains: BlockchainMeta[];\n _tokens: Token[];\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) => boolean;\n\n fetch: () => Promise<void>;\n}\n\nexport const createDataSlice: StateCreator<\n DataSlice & ConfigSlice,\n [],\n [],\n DataSlice\n> = (set, get) => ({\n // State\n _blockchains: [],\n _tokens: [],\n _popularTokens: [],\n _swappers: [],\n fetchStatus: 'loading',\n // Selectors\n blockchains: (options) => {\n const blockchainsFromState = get()._blockchains;\n\n if (!options || !options?.type) {\n return blockchainsFromState;\n }\n\n const config = get().config;\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 tokensFromState = get()._tokens;\n\n if (!options || !options?.type) {\n return tokensFromState;\n }\n\n const config = get().config;\n const supportedTokensFromConfig =\n (options.type === 'source' ? config.from?.tokens : config.to?.tokens) ??\n [];\n const blockchains = get().blockchains({\n type: options.type,\n });\n\n const list = tokensFromState\n .filter((token) => {\n // If there is a list of tokens in config, we only keep them.\n if (\n supportedTokensFromConfig.length > 0 &&\n !supportedTokensFromConfig.some((asset) => {\n return tokensAreEqual(asset, token);\n })\n ) {\n return false;\n }\n\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((a, b) => {\n // Check pinned tokens\n if (get().isTokenPinned(a)) {\n return -1;\n }\n if (get().isTokenPinned(b)) {\n return 1;\n }\n\n // Check secondary coins\n if (a.isSecondaryCoin) {\n return 1;\n }\n if (b.isSecondaryCoin) {\n return -1;\n }\n\n // Check it has an address or not.\n if (!a.address && b.address) {\n return -1;\n }\n if (a.address && !b.address) {\n return 1;\n }\n\n return 0;\n });\n\n return list;\n },\n isTokenPinned: (token) => {\n const pinned = !!get().config.pinnedTokens?.some((pinnedToken) =>\n tokensAreEqual(pinnedToken, token)\n );\n return pinned;\n },\n swappers: () => {\n const {\n config: { enableNewLiquiditySources, liquiditySources },\n } = get();\n\n /*\n * If the enableNewLiquiditySources 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 enableNewLiquiditySources ||\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 response = await sdk().getAllMetadata();\n\n set({ fetchStatus: 'success' });\n const blockchains: BlockchainMeta[] = [];\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 response.blockchains.forEach((blockchain) => {\n if (\n blockchain.enabled &&\n blockchainsWithAtLeastOneToken.has(blockchain.name)\n ) {\n blockchains.push(blockchain);\n }\n });\n\n // Sort\n blockchains.sort((a, b) => a.sort - b.sort);\n\n set({\n _blockchains: blockchains,\n _tokens: tokens,\n _popularTokens: popularTokens,\n _swappers: swappers,\n });\n } catch (error) {\n set({ fetchStatus: 'failed' });\n throw error;\n }\n },\n});\n", "import type { WidgetProps } from './Widget.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React from 'react';\n\nimport { DEFAULT_CONFIG } from '../../store/slices/config';\nimport { Main } from '../App';\nimport { WidgetProvider } from '../WidgetProvider';\n\nexport function Widget(props: PropsWithChildren<WidgetProps>) {\n if (!props.config?.externalWallets) {\n return (\n <WidgetProvider config={props.config ?? DEFAULT_CONFIG}>\n <Main />\n </WidgetProvider>\n );\n }\n return <Main />;\n}\n", "import type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { I18nManager } from '@rango-dev/ui';\nimport React, { useContext, useEffect, useState } from 'react';\n\nimport { AppRouter } from '../../components/AppRouter';\nimport { AppRoutes } from '../../components/AppRoutes';\nimport { WidgetEvents } from '../../components/WidgetEvents';\nimport { globalFont } from '../../globalStyles';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useSettingsStore } from '../../store/settings';\nimport { WidgetContext } from '../Wallets';\n\nimport { MainContainer } from './App.styles';\n\nexport function Main() {\n globalFont();\n\n const { fetch: fetchMeta, config } = useAppStore();\n const { activeTheme } = useTheme(config?.theme || {});\n const { activeLanguage, changeLanguage } = useLanguage();\n const [lastConnectedWalletWithNetwork, setLastConnectedWalletWithNetwork] =\n useState<string>('');\n const [disconnectedWallet, setDisconnectedWallet] = useState<WalletType>();\n const widgetContext = useContext(WidgetContext);\n\n useEffect(() => {\n void fetchMeta().catch();\n void useSettingsStore.persist.rehydrate();\n void useNotificationStore.persist.rehydrate();\n widgetContext.onConnectWallet(setLastConnectedWalletWithNetwork);\n }, []);\n useEffect(() => {\n changeLanguage(config?.language);\n }, [config?.language]);\n\n return (\n <I18nManager language={activeLanguage}>\n <MainContainer id=\"swap-container\" className={activeTheme()}>\n <WidgetEvents />\n <AppRouter\n lastConnectedWallet={lastConnectedWalletWithNetwork}\n disconnectedWallet={disconnectedWallet}\n clearDisconnectedWallet={() => {\n setDisconnectedWallet(undefined);\n }}>\n <AppRoutes />\n </AppRouter>\n </MainContainer>\n </I18nManager>\n );\n}\n", "import type { WalletType } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport { useQueueManager } from '@rango-dev/queue-manager-rango-preset';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { isEvmBlockchain } from 'rango-types';\nimport React, { Fragment } from 'react';\nimport { MemoryRouter, useInRouterContext } from 'react-router';\n\nimport { useForceAutoConnect } from '../hooks/useForceAutoConnect';\nimport { useAppStore } from '../store/AppStore';\n\nimport { UpdateUrl } from './UpdateUrl';\n\nexport function AppRouter({\n children,\n ...props\n}: PropsWithChildren & {\n lastConnectedWallet: string;\n disconnectedWallet: WalletType | undefined;\n clearDisconnectedWallet: () => void;\n}) {\n const isRouterInContext = useInRouterContext();\n const Router = isRouterInContext ? Fragment : MemoryRouter;\n const blockchains = useAppStore().blockchains();\n const { canSwitchNetworkTo } = useWallets();\n\n useForceAutoConnect();\n\n const evmChains = blockchains.filter(isEvmBlockchain);\n\n useQueueManager({\n lastConnectedWallet: props.lastConnectedWallet,\n clearDisconnectedWallet: props.clearDisconnectedWallet,\n disconnectedWallet: props.disconnectedWallet,\n evmChains,\n canSwitchNetworkTo,\n });\n\n return (\n <>\n <Router>{children}</Router>\n {isRouterInContext && <UpdateUrl />}\n </>\n );\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 { useEffect, useRef } from 'react';\nimport {\n createSearchParams,\n useLocation,\n useSearchParams,\n} from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { SearchParams } from '../constants/searchParams';\nimport { useSyncStoresWithConfig } from '../hooks/useSyncStoresWithConfig';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { searchParamsToToken } from '../utils/quote';\n\nexport function UpdateUrl() {\n const firstRender = useRef(true);\n const [searchParams, setSearchParams] = useSearchParams();\n const location = useLocation();\n const firstRenderSearchParams = useRef(location.search);\n const searchParamsRef = useRef<Record<string, string>>({});\n const fromBlockchain = useQuoteStore.use.fromBlockchain();\n const toBlockchain = useQuoteStore.use.toBlockchain();\n const fromToken = useQuoteStore.use.fromToken();\n const toToken = useQuoteStore.use.toToken();\n const setFromBlockchain = useQuoteStore.use.setFromBlockchain();\n const setFromToken = useQuoteStore.use.setFromToken();\n const setToBlockchain = useQuoteStore.use.setToBlockchain();\n const setToToken = useQuoteStore.use.setToToken();\n const inputAmount = useQuoteStore.use.inputAmount();\n const setInputAmount = useQuoteStore.use.setInputAmount();\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n useSyncStoresWithConfig();\n\n useEffect(() => {\n const params: Record<string, string> = {};\n createSearchParams(firstRenderSearchParams.current).forEach(\n (value, key) => {\n params[key] = value;\n }\n );\n searchParamsRef.current = params;\n const requestId =\n location.pathname.split(navigationRoutes.swaps + '/')[1] || null;\n if (requestId) {\n setSelectedSwap(requestId);\n }\n }, []);\n\n useEffect(() => {\n if (!firstRender.current) {\n let fromChainString = '',\n fromTokenString = '',\n toChainString = '',\n toTokenString = '',\n fromAmount = '';\n const autoConnect = searchParamsRef.current[SearchParams.AUTO_CONNECT];\n if (fetchMetaStatus !== 'success') {\n fromChainString = searchParamsRef.current[SearchParams.FROM_CHAIN];\n fromTokenString = searchParamsRef.current[SearchParams.FROM_TOKEN];\n toChainString = searchParamsRef.current[SearchParams.TO_CHAIN];\n toTokenString = searchParamsRef.current[SearchParams.TO_TOKEN];\n fromAmount =\n searchParamsRef.current[SearchParams.FROM_AMOUNT] || inputAmount;\n } else {\n fromChainString = fromBlockchain?.name || '';\n fromTokenString =\n (fromToken?.symbol || '') +\n (fromToken?.address ? `--${fromToken?.address}` : '');\n toChainString = toBlockchain?.name || '';\n toTokenString =\n (toToken?.symbol || '') +\n (toToken?.address ? `--${toToken?.address}` : '');\n fromAmount = inputAmount;\n }\n setSearchParams(\n {\n ...(fromChainString && {\n [SearchParams.FROM_CHAIN]: fromChainString,\n }),\n ...(fromTokenString && {\n [SearchParams.FROM_TOKEN]: fromTokenString,\n }),\n ...(toChainString && { [SearchParams.TO_CHAIN]: toChainString }),\n ...(toTokenString && { [SearchParams.TO_TOKEN]: toTokenString }),\n ...(fromAmount && {\n [SearchParams.FROM_AMOUNT]: fromAmount.toString(),\n }),\n ...(autoConnect && {\n [SearchParams.AUTO_CONNECT]: autoConnect,\n }),\n },\n { replace: true }\n );\n }\n firstRender.current = false;\n }, [\n location.pathname,\n inputAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n ]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n const fromChainString = searchParams.get(SearchParams.FROM_CHAIN);\n const fromTokenString = searchParams.get(SearchParams.FROM_TOKEN);\n const toChainString = searchParams.get(SearchParams.TO_CHAIN);\n const toTokenString = searchParams.get(SearchParams.TO_TOKEN);\n const fromAmount = searchParams.get(SearchParams.FROM_AMOUNT);\n const fromBlockchain = blockchains.find(\n (blockchain) => blockchain.name === fromChainString\n );\n const fromToken = searchParamsToToken(\n tokens,\n fromTokenString,\n fromBlockchain || null\n );\n const toBlockchain = blockchains.find(\n (blockchain) => blockchain.name === toChainString\n );\n const toToken = searchParamsToToken(\n tokens,\n toTokenString,\n toBlockchain || null\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 if (!!toBlockchain) {\n setToBlockchain(toBlockchain);\n if (!!toToken) {\n setToToken({\n token: toToken,\n meta: { blockchains: blockchains, tokens: tokens },\n });\n }\n }\n if (fromAmount) {\n setInputAmount(fromAmount);\n }\n }\n }, [fetchMetaStatus]);\n\n return null;\n}\n", "export const navigationRoutes = {\n home: '/',\n fromSwap: 'from-swap',\n toSwap: 'to-swap',\n blockchains: 'blockchains',\n settings: 'settings',\n liquiditySources: 'liquidity-sources',\n themes: 'themes',\n bridges: 'bridges',\n exchanges: 'exchanges',\n languages: 'languages',\n swaps: 'swaps',\n wallets: 'wallets',\n confirmSwap: 'confirm-swap',\n swapDetails: ':requestId',\n};\n", "import type { Asset } from 'rango-sdk';\n\nimport { useEffect, useMemo, useRef } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useSettingsStore } from '../store/settings';\nimport { tokensAreEqual } from '../utils/wallets';\n\nexport function useSyncStoresWithConfig() {\n const {\n setInputAmount,\n setToToken,\n setToBlockchain,\n setFromBlockchain,\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\n const { setAffiliateRef, setAffiliatePercent, setAffiliateWallets } =\n useSettingsStore();\n\n const fromTokensConfig = useMemo(\n () => config?.from?.tokens,\n [config?.from?.tokens]\n );\n const fromBlockchainsConfig = useMemo(\n () => config?.from?.blockchains,\n [config?.from?.blockchains]\n );\n const toTokensConfig = useMemo(\n () => config?.to?.tokens,\n [config?.to?.tokens]\n );\n const toBlockchainsConfig = useMemo(\n () => config?.to?.blockchains,\n [config?.to?.blockchains]\n );\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 setInputAmount(config?.amount?.toString() || '');\n }, [config?.amount]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.from?.blockchain\n );\n const token = tokens.find((t) =>\n tokensAreEqual(t, config?.from?.token || null)\n );\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 (fromToken && fromTokensConfig) {\n if (!fromTokensConfig.some((token) => tokensAreEqual(token, fromToken))) {\n setFromToken({ token: null });\n }\n }\n\n if (fromBlockchain && fromBlockchainsConfig) {\n if (!fromBlockchainsConfig.includes(fromBlockchain.name)) {\n setFromBlockchain(null);\n }\n }\n }, [fromTokensConfig, fromBlockchainsConfig]);\n\n useEffect(() => {\n if (toToken && toTokensConfig) {\n if (!toTokensConfig.some((token) => tokensAreEqual(token, toToken))) {\n setToToken({ token: null });\n }\n }\n\n if (toBlockchain && toBlockchainsConfig) {\n if (!toBlockchainsConfig.includes(toBlockchain.name)) {\n setToBlockchain(null);\n }\n }\n }, [toTokensConfig, toBlockchainsConfig]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.to?.blockchain\n );\n const token = tokens.find((t) =>\n tokensAreEqual(t, config?.to?.token || null)\n );\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 { TokenWithBalance } from '../components/TokenList';\nimport type { Wallet } from '../types';\nimport type { PendingSwap } from '@rango-dev/queue-manager-rango-preset/dist/shared';\nimport type {\n BestRouteResponse,\n BlockchainMeta,\n MetaResponse,\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 { isPositiveNumber } from '../utils/numbers';\nimport { createRetryQuote, getQuoteToTokenUsdPrice } 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\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: TokenWithBalance | null;\n toToken: TokenWithBalance | null;\n quoteWalletsConfirmed: boolean;\n selectedWallets: Wallet[];\n quoteWarningsConfirmed: boolean;\n resetQuote: () => void;\n resetToBlockchain: () => void;\n resetFromBlockchain: () => void;\n setFromBlockchain: (chain: BlockchainMeta | null) => void;\n setToBlockchain: (chian: BlockchainMeta | null) => void;\n\n setFromToken: (params: SetTokenParams) => void;\n setToToken: (params: SetTokenParams) => void;\n setInputAmount: (amount: string) => void;\n quote: BestRouteResponse | null;\n setQuote: (quote: BestRouteResponse | null) => void;\n retry: (pendingSwap: PendingSwap, meta: Meta) => void;\n switchFromAndTo: () => void;\n setQuoteWalletConfirmed: (flag: boolean) => void;\n setSelectedWallets: (wallets: Wallet[]) => void;\n customDestination: string;\n setCustomDestination: (address: string) => 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 quote: null,\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: '',\n quoteWarningsConfirmed: false,\n setQuote: (quote) =>\n set((state) => {\n let outputAmount: BigNumber | null = null;\n let outputUsdValue: BigNumber = ZERO;\n if (!isPositiveNumber(state.inputAmount)) {\n return {};\n }\n if (!!quote) {\n outputAmount = !!quote.result?.outputAmount\n ? new BigNumber(quote.result?.outputAmount)\n : null;\n outputUsdValue = calcOutputUsdValue(\n quote.result?.outputAmount,\n getQuoteToTokenUsdPrice(quote) || state.toToken?.usdPrice\n );\n }\n return {\n quote: quote,\n ...(!!quote && {\n outputAmount,\n outputUsdValue,\n }),\n };\n }),\n resetQuote: () =>\n set(() => ({\n quote: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n })),\n setFromBlockchain: (chain) => {\n set((state) => {\n if (state.fromBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n fromBlockchain: chain,\n ...(state.fromToken && {\n quote: null,\n fromToken: null,\n outputAmount: null,\n outputUsdValue: null,\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 quote: null,\n toToken: null,\n outputAmount: null,\n outputUsdValue: null,\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: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n quote: null,\n }),\n ...(!!state.fromToken && {\n inputUsdValue: getUsdValue(state.fromToken, amount),\n }),\n }));\n },\n retry: (pendingSwap, meta) => {\n const { tokens, blockchains } = meta;\n const {\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n inputAmount,\n } = createRetryQuote(pendingSwap, blockchains, tokens);\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 quote: 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: getUsdValue(\n state.toToken,\n state.outputAmount?.toString() || ''\n ),\n })),\n resetFromBlockchain: () =>\n set(() => ({\n fromToken: null,\n fromBlockchain: null,\n outputAmount: null,\n outputUsdValue: null,\n quote: null,\n })),\n resetToBlockchain: () =>\n set(() => ({\n toToken: null,\n toBlockchain: null,\n outputAmount: null,\n outputUsdValue: null,\n quote: 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: '',\n }),\n setQuoteWarningsConfirmed: (flag) =>\n set({ quoteWarningsConfirmed: flag }),\n }))\n )\n);\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { QuoteError, QuoteWarning, Wallet } from '../types';\nimport type { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport type { PriceImpactWarningLevel } from '@rango-dev/ui';\nimport type {\n SimulationAssetAndAmount,\n SimulationValidationStatus,\n} from '@rango-dev/ui/dist/widget/ui/src/types/swaps';\nimport type {\n Asset,\n BestRouteResponse,\n BlockchainMeta,\n Token,\n} from 'rango-sdk';\n\nimport { getLastSuccessfulStep } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\n\nimport { HIGHT_PRICE_IMPACT, LOW_PRICE_IMPACT } from '../constants/routing';\nimport { HIGH_SLIPPAGE } from '../constants/swapSettings';\nimport { getUsdValue } from '../store/quote';\nimport { QuoteErrorType, QuoteWarningType } from '../types';\n\nimport { areEqual } from './common';\nimport { findBlockchain, findToken } from './meta';\nimport {\n checkSlippageErrors,\n checkSlippageWarnings,\n getLimitErrorMessage,\n getMinRequiredSlippage,\n getPercentageChange,\n getTotalFeeInUsd,\n hasHighValueLoss,\n hasLimitError,\n hasProperSlippage,\n} from './swap';\n\nexport function searchParamsToToken(\n tokens: Token[],\n searchParams: string | null,\n chain: BlockchainMeta | null\n): Token | null {\n if (!chain) {\n return null;\n }\n return (\n tokens.find((token) => {\n const symbolAndAddress = searchParams?.split('--');\n if (symbolAndAddress?.length === 1) {\n return (\n token.symbol === symbolAndAddress[0] &&\n token.address === null &&\n token.blockchain === chain.name\n );\n }\n return (\n token.symbol === symbolAndAddress?.[0] &&\n token.address === symbolAndAddress?.[1] &&\n token.blockchain === chain.name\n );\n }) || null\n );\n}\n\nexport function getQuoteToTokenUsdPrice(\n quote: BestRouteResponse | null\n): number | null | undefined {\n return quote?.result?.swaps[quote?.result?.swaps.length - 1].to.usdPrice;\n}\n\nexport function isNumberOfSwapsChanged(\n quoteA: BestRouteResponse,\n quoteB: BestRouteResponse\n) {\n const quoteASwaps = quoteA.result?.swaps || [];\n const quoteBSwaps = quoteB.result?.swaps || [];\n return quoteASwaps.length !== quoteBSwaps.length;\n}\n\nexport function isQuoteSwappersUpdated(\n quoteA: BestRouteResponse,\n quoteB: BestRouteResponse\n) {\n const quoteASwappers =\n quoteA.result?.swaps.map((swap) => swap.swapperId) || [];\n const quoteBSwappers =\n quoteB.result?.swaps.map((swap) => swap.swapperId) || [];\n return !areEqual(quoteASwappers, quoteBSwappers);\n}\n\nexport function isQuoteInternalCoinsUpdated(\n quoteA: BestRouteResponse,\n quoteB: BestRouteResponse\n) {\n const quoteAInternalCoins =\n quoteA.result?.swaps.map((swap) => swap.to.symbol) || [];\n const quoteBInternalCoins =\n quoteB.result?.swaps.map((swap) => swap.to.symbol) || [];\n return !areEqual(quoteAInternalCoins, quoteBInternalCoins);\n}\n\nexport function isQuoteChanged(\n quoteA: BestRouteResponse,\n quoteB: BestRouteResponse\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 tokenToString = (token: Asset): string =>\n `${token.symbol}-${token.blockchain}-${token.address ?? ''}`;\n\n const set = new Set();\n\n listA.forEach((token) => set.add(tokenToString(token)));\n\n return listB.filter((token) => set.has(tokenToString(token))) as R;\n}\n\nexport function createRetryQuote(\n pendingSwap: PendingSwap,\n blockchains: BlockchainMeta[],\n tokens: Token[]\n): {\n fromBlockchain: BlockchainMeta | null;\n fromToken: Token | null;\n toBlockchain: BlockchainMeta | null;\n toToken: Token | null;\n inputAmount: string;\n} {\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 tokens\n );\n const toTokenMeta = findToken(toToken, tokens);\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: BestRouteResponse,\n params: {\n fromToken: Token;\n toToken: Token;\n tokens: Token[];\n userSlippage: number;\n }\n): QuoteWarning | null {\n const { fromToken, toToken, tokens, userSlippage } = params;\n const inputUsdValue = getUsdValue(fromToken, quote.requestAmount);\n const outputUsdValue = getUsdValue(toToken, quote.result?.outputAmount ?? '');\n\n if (quote.result && 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.result.swaps, tokens);\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.result && (!inputUsdValue || !outputUsdValue)) {\n return { type: QuoteWarningType.UNKNOWN_PRICE };\n }\n\n const minRequiredSlippage = getMinRequiredSlippage(quote);\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 generateQuoteErrors(\n quote: BestRouteResponse\n): QuoteError | null {\n if (!quote.result) {\n return {\n type: QuoteErrorType.NO_RESULT,\n diagnosisMessage: quote.diagnosisMessages?.[0],\n };\n }\n const limitError = hasLimitError(quote);\n if (limitError) {\n const { swap, recommendation, fromAmountRangeError } =\n getLimitErrorMessage(quote);\n return {\n type: QuoteErrorType.BRIDGE_LIMIT,\n swap: swap,\n recommendation,\n fromAmountRangeError,\n };\n }\n\n const recommendedSlippages = checkSlippageErrors(quote);\n\n if (recommendedSlippages) {\n const minRequiredSlippage = getMinRequiredSlippage(quote);\n return {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages,\n minRequiredSlippage,\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", "/* eslint-disable @typescript-eslint/prefer-enum-initializers */\n\nimport type { PriceImpactWarningLevel } from '@rango-dev/ui';\nimport type BigNumber from 'bignumber.js';\nimport type { SwapResult } from 'rango-sdk';\n\nexport enum QuoteErrorType {\n NO_RESULT,\n REQUEST_FAILED,\n REQUEST_CANCELED,\n BRIDGE_LIMIT,\n INSUFFICIENT_SLIPPAGE,\n}\n\nexport type NoResultError = {\n type: QuoteErrorType.NO_RESULT;\n diagnosisMessage?: string;\n};\n\nexport type BridgeLimitError = {\n type: QuoteErrorType.BRIDGE_LIMIT;\n swap: SwapResult;\n recommendation: string;\n fromAmountRangeError: string;\n};\n\nexport type InsufficientSlippageError = {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE;\n recommendedSlippages: RecommendedSlippages | null;\n minRequiredSlippage: string | null;\n};\n\nexport type QuoteRequestFailed = { type: QuoteErrorType.REQUEST_FAILED };\nexport type QuoteRequestCanceled = { type: QuoteErrorType.REQUEST_CANCELED };\n\nexport type QuoteError =\n | NoResultError\n | BridgeLimitError\n | InsufficientSlippageError\n | QuoteRequestFailed\n | QuoteRequestCanceled;\n\nexport enum QuoteWarningType {\n HIGH_VALUE_LOSS,\n UNKNOWN_PRICE,\n INSUFFICIENT_SLIPPAGE,\n HIGH_SLIPPAGE,\n}\n\nexport enum QuoteUpdateType {\n QUOTE_UPDATED,\n QUOTE_SWAPPERS_UPDATED,\n QUOTE_COINS_UPDATED,\n QUOTE_AND_OUTPUT_AMOUNT_UPDATED,\n QUOTE_UPDATED_WITH_HIGH_VALUE_LOSS,\n}\n\nexport type QuoteUpdateWarning =\n | {\n type: QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED;\n newOutputAmount: string;\n percentageChange: string;\n }\n | {\n type: Exclude<\n QuoteUpdateType,\n QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED\n >;\n };\n\nexport type RecommendedSlippages = Map<number, string>;\n\nexport type InsufficientSlippageWarning = {\n type: QuoteWarningType.INSUFFICIENT_SLIPPAGE;\n recommendedSlippages: RecommendedSlippages | null;\n minRequiredSlippage: string | null;\n};\n\nexport type HighSlippageWarning = {\n type: QuoteWarningType.HIGH_SLIPPAGE;\n slippage: string | null;\n};\n\nexport type HighValueLossWarning = {\n type: QuoteWarningType.HIGH_VALUE_LOSS;\n warningLevel: PriceImpactWarningLevel;\n inputUsdValue: BigNumber;\n outputUsdValue: BigNumber;\n totalFee: BigNumber;\n priceImpact: number;\n};\n\nexport type UnknownPriceWarning = {\n type: QuoteWarningType.UNKNOWN_PRICE;\n};\n\nexport type QuoteWarning =\n | HighValueLossWarning\n | InsufficientSlippageWarning\n | HighSlippageWarning\n | UnknownPriceWarning;\n\nexport type ConfirmSwapWarnings = {\n quote: QuoteWarning | null;\n quoteUpdate: QuoteUpdateWarning | null;\n balance: { messages: string[] } | null;\n};\n", "import type { Asset, BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\n\nimport { tokensAreEqual } from './wallets';\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 getSwapperDisplayName(\n swapperId: string,\n swappers: SwapperMeta[]\n) {\n return swappers.find((swapper) => swapper.id === swapperId)?.swapperGroup;\n}\n\nexport function findToken(t: Asset, tokens: Token[]) {\n return tokens.find((token) => tokensAreEqual(token, t)) ?? null;\n}\n\nexport function findBlockchain(name: string, blockchains: BlockchainMeta[]) {\n return blockchains.find((blockchain) => blockchain.name === name) ?? null;\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { FetchStatus } from '../store/slices/data';\nimport type {\n ConvertedToken,\n QuoteError,\n QuoteWarning,\n RecommendedSlippages,\n SwapButtonState,\n Wallet,\n} from '../types';\nimport type {\n PendingSwap,\n PendingSwapStep,\n} from '@rango-dev/queue-manager-rango-preset';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type {\n BestRouteRequest,\n BestRouteResponse,\n BlockchainMeta,\n RecommendedSlippage,\n SwapResult,\n Token,\n} from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { PendingSwapNetworkStatus } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\n\nimport { isValidAddress } from '../components/ConfirmWalletsModal/ConfirmWallets.helpers';\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 { removeDuplicateFrom } from './common';\nimport { getBlockchainShortNameFor } from './meta';\nimport { numberToString } from './numbers';\nimport { getPriceImpact, getRequiredBalanceOfWallet } from './quote';\nimport { getRequiredChains } 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(quote: BestRouteResponse | null): boolean {\n return (\n (quote?.result?.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}\nexport function getLimitErrorMessage(quote: BestRouteResponse): {\n swap: SwapResult;\n fromAmountRangeError: string;\n recommendation: string;\n} {\n const swap = (quote.result?.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: BestRouteResponse | 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 (\n fetchingQuote ||\n !quote ||\n !quote.result ||\n error ||\n !inputAmount ||\n inputAmount === '0'\n ) {\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: BestRouteResponse | null,\n inputAmount: string,\n usdValue: BigNumber | null\n) {\n return !(\n (!usdValue || usdValue.lte(ZERO)) &&\n !!quote?.result &&\n !!inputAmount &&\n inputAmount !== '0' &&\n parseFloat(inputAmount || '0') !== 0 &&\n !!quote.result\n );\n}\n\nexport function requiredWallets(quote: BestRouteResponse | null) {\n const wallets: string[] = [];\n\n quote?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n let lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepFromBlockchain != lastAddedWallet) {\n wallets.push(currentStepFromBlockchain);\n }\n lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepToBlockchain != lastAddedWallet) {\n wallets.push(currentStepToBlockchain);\n }\n });\n return wallets;\n}\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\n};\n\nexport function getUsdFeeOfStep(\n step: SwapResult,\n allTokens: Token[]\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 = getUsdPrice(\n fee.asset.blockchain,\n fee.asset.symbol,\n fee.asset.address,\n allTokens\n );\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 allTokens: Token[]\n): BigNumber {\n return swaps.reduce(\n (totalFee: BigNumber, step) =>\n totalFee.plus(getUsdFeeOfStep(step, allTokens)),\n ZERO\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 quote: BestRouteResponse\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n quote.result?.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: BestRouteResponse,\n userSlippage: number\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n quote.result?.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(\n quote: BestRouteResponse\n): string | null {\n const slippages = quote.result?.swaps.map(\n (slippage) => slippage.recommendedSlippage\n );\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: BestRouteResponse,\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: BestRouteResponse,\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?: Wallet[];\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 initialQuote?: BestRouteResponse;\n destination?: string;\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 initialQuote,\n destination,\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 const chainAndAccounts = connectedWallets.find(\n (connectedWallet) => connectedWallet.blockchain === wallet.chain\n );\n if (!!chainAndAccounts) {\n chainAndAccounts.addresses.push(wallet.address);\n } else {\n connectedWallets.push({\n blockchain: wallet.chain,\n addresses: [wallet.address],\n });\n }\n });\n\n const checkPrerequisites = !!initialQuote;\n\n const filteredBlockchains = removeDuplicateFrom(\n (initialQuote?.result?.swaps || []).reduce(\n (blockchains: string[], swap) => {\n blockchains.push(swap.from.blockchain, swap.to.blockchain);\n // Check if internalSwaps array exists\n if (swap.internalSwaps && Array.isArray(swap.internalSwaps)) {\n swap.internalSwaps.map((internalSwap) => {\n blockchains.push(\n internalSwap.from.blockchain,\n internalSwap.to.blockchain\n );\n });\n }\n return blockchains;\n },\n []\n )\n );\n\n const requestBody: BestRouteRequest = {\n amount: inputAmount.toString(),\n affiliateRef: affiliateRef ?? undefined,\n affiliatePercent: affiliatePercent ?? undefined,\n affiliateWallets: affiliateWallets ?? undefined,\n checkPrerequisites,\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 ...(checkPrerequisites && { blockchains: filteredBlockchains }),\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: BestRouteResponse) {\n return quote.result?.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: BestRouteResponse,\n newQuote: BestRouteResponse\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: BestRouteResponse,\n selectedWallets: Wallet[],\n blockchains: BlockchainMeta[]\n) {\n const fee = quote.validationStatus;\n const requiredWallets = getRequiredChains(quote);\n const walletsSortedByRequiredWallets = selectedWallets.sort(\n (selectedWallet1, selectedWallet2) =>\n requiredWallets.indexOf(selectedWallet1.chain) -\n requiredWallets.indexOf(selectedWallet2.chain)\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 (\n pendingSwap.status === 'failed' &&\n !!pendingSwap.finishTime &&\n new Date().getTime() - parseInt(pendingSwap.finishTime) < 4 * 3600 * 1000\n );\n}\n\nexport function confirmSwapDisabled(\n fetching: boolean,\n showCustomDestination: boolean,\n customDestination: string,\n quote: BestRouteResponse | null,\n selectedWallets: { walletType: string; chain: string }[],\n lastStepToBlockchain?: BlockchainMeta\n) {\n return (\n fetching ||\n (!showCustomDestination &&\n !requiredWallets(quote).every((chain) =>\n selectedWallets.map((wallet) => wallet.chain).includes(chain)\n )) ||\n (!!showCustomDestination && !customDestination) ||\n (!!showCustomDestination &&\n !!customDestination &&\n lastStepToBlockchain &&\n !isValidAddress(lastStepToBlockchain, customDestination))\n );\n}\n", "import type { BestRouteResponse, BlockchainMeta } from 'rango-sdk';\n\nexport function getRequiredWallets(quote: BestRouteResponse | null): string[] {\n const wallets: string[] = [];\n\n quote?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n let lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepFromBlockchain != lastAddedWallet) {\n wallets.push(currentStepFromBlockchain);\n }\n lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepToBlockchain != lastAddedWallet) {\n wallets.push(currentStepToBlockchain);\n }\n });\n return wallets;\n}\n\nexport function isValidAddress(\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 { 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. If you are sure, continue, otherwise, change the swap.'\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 { create } from 'zustand';\n\nimport createSelectors from './selectors';\n\ninterface UiState {\n connectWalletsButtonDisabled: boolean;\n selectedSwapRequestId: string | null;\n currentPage: string;\n setSelectedSwap: (requestId: string | null) => void;\n setCurrentPage: (path: string) => void;\n}\n\nexport const useUiStore = createSelectors(\n create<UiState>()((set) => ({\n connectWalletsButtonDisabled: false,\n selectedSwapRequestId: null,\n currentPage: '',\n setSelectedSwap: (requestId) => set({ selectedSwapRequestId: requestId }),\n setCurrentPage: (path) => set({ currentPage: path }),\n }))\n);\n", "import React from 'react';\nimport { useRoutes } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { ConfirmSwapPage } from '../pages/ConfirmSwapPage';\nimport { HistoryPage } from '../pages/HistoryPage';\nimport { Home } from '../pages/Home';\nimport { LanguagePage } from '../pages/LanguagePage';\nimport { LiquiditySourcePage } from '../pages/LiquiditySourcePage';\nimport { SelectBlockchainPage } from '../pages/SelectBlockchainPage';\nimport { SelectSwapItemsPage } from '../pages/SelectSwapItemsPage';\nimport { SettingsPage } from '../pages/SettingsPage';\nimport { SwapDetailsPage } from '../pages/SwapDetailsPage';\nimport { ThemePage } from '../pages/ThemePage';\nimport { WalletsPage } from '../pages/WalletsPage';\n\nexport function AppRoutes() {\n return useRoutes([\n {\n path: navigationRoutes.home,\n element: <Home />,\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.themes,\n element: <ThemePage />,\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 },\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", "/* 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 Divider,\n IconButton,\n RefreshIcon,\n SettingsIcon,\n styled,\n Tooltip,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { flushSync } from 'react-dom';\nimport { useNavigate } from 'react-router-dom';\n\nimport { getRequiredWallets } from '../components/ConfirmWalletsModal/ConfirmWallets.helpers';\nimport { ConfirmWalletsModal } from '../components/ConfirmWalletsModal/ConfirmWalletsModal';\nimport { HeaderButton } from '../components/HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../components/Layout';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { getQuoteUpdateWarningMessage } from '../constants/warnings';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport { useConfirmSwap } from '../hooks/useConfirmSwap';\nimport { useQuoteStore } from '../store/quote';\nimport { useSettingsStore } from '../store/settings';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport { QuoteWarningType } from '../types';\nimport { getContainer } from '../utils/common';\n\nconst Container = styled('div', {\n position: 'relative',\n width: '100%',\n '& .description': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n '& .icon': {\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n '& .quote-update__alert': {\n paddingTop: '$10',\n },\n});\n\nconst Buttons = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'space-between',\n '& .confirm-button': {\n flexGrow: 1,\n paddingRight: '$10',\n },\n [`& ${IconButton}`]: {\n width: '$48',\n height: '$48',\n },\n});\n\nexport function ConfirmSwapPage() {\n //TODO: move component's logics to a custom hook\n const {\n quote,\n setInputAmount,\n selectedWallets,\n quoteWalletsConfirmed,\n setQuoteWalletConfirmed,\n customDestination,\n quoteWarningsConfirmed,\n } = useQuoteStore();\n const navigate = useNavigate();\n const [dbErrorMessage, setDbErrorMessage] = useState<string>('');\n\n const { connectedWallets } = useWalletsStore();\n const showWalletsOnInit = !quoteWalletsConfirmed;\n const [showWallets, setShowWallets] = useState(false);\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\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\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 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 setSelectedSwap(confirmSwapResult.swap.requestId);\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 await addNewSwap();\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 useEffect(() => {\n const quoteChanged =\n confirmSwapResult.warnings?.quote?.type &&\n Object.values(QuoteWarningType).includes(\n confirmSwapResult.warnings?.quote?.type\n );\n\n const selectedWalletDisconnected =\n selectedWallets.length < 1 ||\n !selectedWallets.every((selectedWallet) =>\n connectedWallets.find(\n (connectedWallet) =>\n selectedWallet.address === connectedWallet.address &&\n selectedWallet.walletType === connectedWallet.walletType &&\n selectedWallet.chain === connectedWallet.chain\n )\n );\n\n let quoteWalletsChanged = false;\n\n if (quoteChanged) {\n let requiredWallets = getRequiredWallets(quote);\n\n const lastStepToBlockchain =\n quote?.result?.swaps[quote.result.swaps.length - 1].to.blockchain;\n\n const isLastWalletRequired = !!quote?.result?.swaps.find(\n (swap) => swap.from.blockchain === lastStepToBlockchain\n );\n\n if (!isLastWalletRequired) {\n requiredWallets = requiredWallets.slice(\n -requiredWallets.length,\n requiredWallets.length - 1\n );\n }\n\n const allRequiredWalletsSelected = requiredWallets.every(\n (requiredWallet) =>\n selectedWallets.find(\n (selectedWallet) => selectedWallet.chain === requiredWallet\n )\n );\n\n if (!allRequiredWalletsSelected) {\n quoteWalletsChanged = true;\n }\n }\n\n if (quote && (selectedWalletDisconnected || quoteWalletsChanged)) {\n queueMicrotask(() => flushSync(setShowWallets.bind(null, true)));\n setQuoteWalletConfirmed(false);\n }\n }, [\n confirmSwapResult.warnings?.quote,\n selectedWallets.length,\n connectedWallets.length,\n ]);\n\n useLayoutEffect(() => {\n if (!quote) {\n navigate(`../`);\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 suffix: (\n <Tooltip\n container={getContainer()}\n side=\"bottom\"\n content={i18n.t('Settings')}>\n <HeaderButton\n size=\"small\"\n variant=\"ghost\"\n onClick={() => navigate('../' + navigationRoutes.settings)}>\n <SettingsIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n ),\n }}\n footer={\n <Buttons>\n <div className=\"confirm-button\">\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n fullWidth\n loading={fetchingConfirmationQuote}\n disabled={!!confirmSwapResult.error}\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}\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 <Container>\n <div className=\"description\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('You get')}\n </Typography>\n <Button\n style={{ padding: '0' }}\n variant=\"ghost\"\n disabled={fetchingConfirmationQuote}\n onClick={onRefresh}>\n <div className=\"icon\">\n <RefreshIcon size={16} />\n </div>\n </Button>\n </div>\n {dbErrorMessage && (\n <>\n <Alert type=\"error\" variant=\"alarm\" title={dbErrorMessage} />\n <Divider size={12} />\n </>\n )}\n {confirmSwapResult.warnings?.quoteUpdate && (\n <div className=\"quote-update__alert\">\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={\n confirmSwapResult.warnings.quoteUpdate &&\n getQuoteUpdateWarningMessage(\n confirmSwapResult.warnings.quoteUpdate\n )\n }\n />\n </div>\n )}\n <QuoteInfo\n quote={quote}\n type=\"swap-preview\"\n expanded={true}\n alertPosition=\"top\"\n error={confirmSwapResult.error}\n loading={fetchingConfirmationQuote}\n warning={confirmSwapResult.warnings?.quote ?? null}\n refetchQuote={onRefresh}\n showWarningModal={showQuoteWarningModal}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={async () => {\n setShowQuoteWarningModal(false);\n await addNewSwap();\n }}\n onChangeSettings={() => navigate('../' + navigationRoutes.settings)}\n />\n </Container>\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 ChevronDownIcon,\n ChevronLeftIcon,\n Divider,\n MessageBox,\n Modal,\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 { 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 { confirmSwapDisabled } from '../../utils/swap';\n\nimport { getRequiredWallets, isValidAddress } from './ConfirmWallets.helpers';\nimport {\n CollapsibleContent,\n CollapsibleRoot,\n ConfirmButton,\n CustomDestination,\n CustomDestinationButton,\n EXPANDABLE_TRANSITION_DURATION,\n ExpandedIcon,\n ListContainer,\n NavigateBack,\n ShowMoreHeader,\n StyledTextField,\n Title,\n Trigger,\n Wallets,\n WalletsContainer,\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 config = useAppStore().config;\n const blockchains = useAppStore().blockchains();\n const {\n quote,\n setSelectedWallets: selectQuoteWallets,\n quoteWalletsConfirmed: quoteWalletsConfirmed,\n setQuoteWalletConfirmed: setQuoteWalletConfirmed,\n customDestination,\n setCustomDestination,\n } = useQuoteStore();\n const { connectedWallets, selectWallets } = useWalletsStore();\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 const [destination, setDestination] = useState(customDestination);\n const [showCustomDestination, setShowCustomDestination] = useState(\n !!customDestination\n );\n const customDestinationRef = useRef<HTMLDivElement | null>(null);\n\n const requiredWallets = getRequiredWallets(quote);\n\n const lastStepToBlockchain = blockchains.find(\n (blockchain) =>\n blockchain.name ===\n quote?.result?.swaps[quote?.result?.swaps.length - 1].to.blockchain\n );\n const isWalletRequiredFor = (blockchain: string) =>\n !!quote?.result?.swaps.find((swap) => swap.from.blockchain === blockchain);\n\n const [selectableWallets, setSelectableWallets] = useState<ConnectedWallet[]>(\n connectedWallets.filter((connectedWallet) => {\n return (\n connectedWallet.selected &&\n requiredWallets.includes(connectedWallet.chain)\n );\n })\n );\n const lastStepToBlockchainMeta = blockchains.find(\n (chain) => chain.name === lastStepToBlockchain?.name\n );\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) && !destination))\n );\n\n const isAddressMatched =\n !!destination &&\n showCustomDestination &&\n lastStepToBlockchainMeta &&\n !isValidAddress(lastStepToBlockchainMeta, destination);\n\n const resetCustomDestination = () => {\n setShowCustomDestination(false);\n setDestination('');\n setSelectableWallets((selectableWallets) => {\n let anyWalletSelected = false;\n return selectableWallets.map((selectableWallet) => {\n if (\n !anyWalletSelected &&\n selectableWallet.chain === lastStepToBlockchain?.name\n ) {\n anyWalletSelected = true;\n return {\n ...selectableWallet,\n selected: true,\n };\n }\n return selectableWallet;\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 (wallet.chain === lastStepToBlockchain?.name && showCustomDestination) {\n setShowCustomDestination(false);\n setDestination('');\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 setCustomDestination(destination);\n setQuoteWalletConfirmed(true);\n onClose();\n };\n\n const onConfirmWallets = async () => {\n setBalanceWarnings([]);\n setError('');\n setQuoteWarning(null);\n const selectedWallets = connectedWallets.filter((connectedWallet) =>\n selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain &&\n selectableWallet.walletType === connectedWallet.walletType\n )\n );\n const result = await onCheckBalance?.({\n selectedWallets,\n customDestination: destination,\n });\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 selectableWallets.concat(\n connectedWallets.filter((connectedWallet) => {\n const anyWalletSelected = !!selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain\n );\n\n return (\n !anyWalletSelected &&\n connectedWallet.selected &&\n requiredWallets.includes(connectedWallet.chain)\n );\n })\n )\n );\n }, [connectedWallets.length]);\n\n useLayoutEffect(() => {\n if (showCustomDestination && customDestinationRef.current) {\n setTimeout(() => {\n customDestinationRef?.current?.scrollIntoView({ behavior: 'smooth' });\n }, EXPANDABLE_TRANSITION_DURATION);\n }\n }, [showCustomDestination]);\n\n const modalContainer = document.querySelector('#swap-box') as HTMLDivElement;\n\n const navigate = useNavigate();\n return (\n <Modal\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 footer: (\n <ConfirmButton>\n <Button\n loading={loading}\n disabled={confirmSwapDisabled(\n loading,\n showCustomDestination,\n destination,\n quote,\n selectableWallets,\n lastStepToBlockchain\n )}\n onClick={onConfirmWallets}\n variant=\"contained\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n Confirm\n </Button>\n </ConfirmButton>\n ),\n })}\n {...(showMoreWalletFor && {\n containerStyle: { 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 <Modal\n open={balanceWarnings.length > 0}\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 </Modal>\n {showMoreWalletFor && (\n <WalletsContainer>\n <div className=\"wallets-list\">\n <WalletList\n chain={showMoreWalletFor}\n isSelected={isSelected}\n selectWallet={onChange}\n onShowMore={setShowMoreWalletFor.bind(null, showMoreWalletFor)}\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 {requiredWallets.map((requiredWallet, index) => {\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === requiredWallet\n );\n\n const key = `wallet-${index}`;\n const isLastWallet = index === requiredWallets.length - 1;\n\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 />\n </ListContainer>\n {!isLastWallet && <Divider size={32} />}\n {isLastWallet && config?.customDestination && (\n <CustomDestination>\n <CollapsibleRoot\n ref={customDestinationRef}\n selected={showCustomDestination}\n open={showCustomDestination}\n onOpenChange={(checked) => {\n if (!checked) {\n resetCustomDestination();\n } else {\n if (\n !isWalletRequiredFor(\n lastStepToBlockchain?.name ?? ''\n )\n ) {\n setSelectableWallets((selectableWallets) =>\n selectableWallets.map((selectableWallet) => {\n if (\n selectableWallet.chain ===\n lastStepToBlockchain?.name\n ) {\n return {\n ...selectableWallet,\n selected: false,\n };\n }\n return selectableWallet;\n })\n );\n }\n }\n }}>\n <Trigger\n onClick={() =>\n setShowCustomDestination((prevState) => !prevState)\n }>\n <CustomDestinationButton\n fullWidth\n variant=\"default\"\n suffix={\n <ExpandedIcon\n orientation={\n showCustomDestination ? 'up' : 'down'\n }>\n <ChevronDownIcon size={10} color=\"gray\" />\n </ExpandedIcon>\n }>\n <div className=\"button__content\">\n <WalletIcon size={18} color=\"info\" />\n <Divider size={4} direction=\"horizontal\" />\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Send to a different address')}\n </Typography>\n </div>\n </CustomDestinationButton>\n </Trigger>\n <CollapsibleContent open={showCustomDestination}>\n <>\n <Divider size={4} />\n <StyledTextField\n autoFocus\n placeholder={i18n.t('Your destination address')}\n value={destination}\n onChange={(e) => {\n setDestination(e.target.value);\n }}\n />\n </>\n </CollapsibleContent>\n </CollapsibleRoot>\n {isAddressMatched && (\n <div className=\"alarms\">\n <Alert\n variant=\"alarm\"\n type=\"error\"\n title={i18n.t({\n values: { destination },\n id: \"Address {destination} doesn't match the blockchain address pattern.\",\n })}\n />\n </div>\n )}\n </CustomDestination>\n )}\n </div>\n );\n })}\n </Wallets>\n </>\n )}\n </Modal>\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 * as Collapsible from '@radix-ui/react-collapsible';\nimport {\n Button,\n darkTheme,\n IconButton,\n keyframes,\n styled,\n TextField,\n} 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 Title = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const ListContainer = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: ' repeat(3, minmax(0, 1fr))',\n alignContent: 'baseline',\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$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral100',\n },\n backgroundColor: '$$color',\n },\n\n '&:focus-visible': {\n $$color: '$colors$info100',\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});\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});\n\nexport const ShowMoreHeader = styled('div', {\n padding: '$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 '& .wallets-list': {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: ' repeat(3, minmax(0, 1fr))',\n alignContent: 'baseline',\n },\n});\n\nexport const CollapsibleRoot = styled(Collapsible.Root, {\n backgroundColor: '$neutral200',\n borderRadius: '$sm',\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary500',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const CustomDestinationButton = styled(Button, {\n width: '100%',\n borderRadius: '$sm !important',\n padding: '$15 !important',\n justifyContent: 'space-between',\n alignItems: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n\n '&:hover': {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral100',\n },\n backgroundColor: '$$color',\n },\n '&:focus-visible': {\n $$background: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$background: '$colors$info700',\n },\n backgroundColor: '$$background',\n outline: 0,\n },\n});\n\nexport const CustomDestination = styled('div', {\n padding: '$10 $0',\n '& .button__content': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n '& .alarms': { paddingTop: '5px' },\n});\n\nexport const ExpandedIcon = styled('div', {\n transition: `all ${EXPANDABLE_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 ConfirmButton = styled('div', {\n display: 'flex',\n});\n\nexport const StyledTextField = styled(TextField, {\n padding: '$0 $15 $15 $15',\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 Wallets = styled('div', { overflow: 'visible', width: '100%' });\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes } from './WalletList.type';\nimport type { Wallet } from '../../types';\nimport type { WalletInfo } from '@rango-dev/ui';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n Image,\n MessageBox,\n Modal,\n SelectableWallet,\n Typography,\n WalletState,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { useWalletList } from '../../hooks/useWalletList';\nimport {\n TIME_TO_CLOSE_MODAL,\n TIME_TO_IGNORE_MODAL,\n} from '../../pages/WalletsPage';\nimport { useAppStore } from '../../store/AppStore';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainDisplayNameFor } from '../../utils/meta';\nimport {\n getAddress,\n getConciseAddress,\n isExperimentalChain,\n} from '../../utils/wallets';\nimport { WalletModal } from '../WalletModal';\n\nimport { WalletButton } from './ConfirmWallets.styles';\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './WalletList.styles';\n\nexport function WalletList(props: PropTypes) {\n const { chain, isSelected, selectWallet, limit, onShowMore } = props;\n const { config } = useAppStore();\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const { blockchains } = useAppStore();\n const [openWalletStateModal, setOpenWalletStateModal] =\n useState<WalletType>('');\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 let modalTimerId: ReturnType<typeof setTimeout> | null = null;\n const { list, error, handleClick } = useWalletList({\n config,\n chain,\n onBeforeConnect: (type) => {\n modalTimerId = setTimeout(() => {\n setOpenWalletStateModal(type);\n }, TIME_TO_IGNORE_MODAL);\n },\n onConnect: () => {\n if (modalTimerId) {\n clearTimeout(modalTimerId);\n }\n setTimeout(() => {\n setOpenWalletStateModal('');\n }, TIME_TO_CLOSE_MODAL);\n },\n });\n const [sortedList, setSortedList] = useState<WalletInfo[]>(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.querySelector('#swap-box') 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 ? getConciseAddress(address) : '';\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 onClick = () => {\n if (wallet.state === WalletState.DISCONNECTED) {\n void handleClick(wallet.type);\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 <>\n <WalletModal\n open={openWalletStateModal === wallet.type}\n onClose={() => setOpenWalletStateModal('')}\n image={wallet.image}\n state={wallet.state}\n error={error}\n />\n {!!experimentalChainWallet && (\n <Modal\n open={!!experimentalChainWallet && showExperimentalChainModal}\n container={modalContainer}\n onClose={() => {\n setExperimentalChainWallet(null);\n }}>\n <MessageBox\n title={i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName },\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 },\n })}>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n onClick={addExperimentalChain.bind(\n null,\n experimentalChainWallet\n )}\n variant=\"outlined\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n </Modal>\n )}\n {addingExperimentalChainStatus && (\n <Modal\n open={!!addingExperimentalChainStatus}\n onClose={setAddingExperimentalChainStatus.bind(null, null)}\n container={modalContainer}>\n {addingExperimentalChainStatus === 'in-progress' && (\n <MessageBox\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 icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={wallet.image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n )}\n\n {addingExperimentalChainStatus === 'completed' && (\n <MessageBox\n type=\"success\"\n title={i18n.t({\n id: '{blockchainDisplayName} Chain Added',\n values: { blockchainDisplayName },\n })}\n description={i18n.t({\n id: '{blockchainDisplayName} is added to your wallet, you can use it to swap.',\n values: { blockchainDisplayName },\n })}\n />\n )}\n\n {addingExperimentalChainStatus === 'rejected' && (\n <MessageBox\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 )}\n\n <Divider direction=\"vertical\" size={32} />\n </Modal>\n )}\n <SelectableWallet\n key={wallet.type}\n description={connectedWalletDescription}\n onClick={onClick}\n selected={isSelected(wallet.type, chain)}\n {...wallet}\n />\n </>\n );\n })}\n {shouldShowMoreWallets && (\n <WalletButton selected={false} onClick={onShowMore.bind(null)}>\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 </WalletButton>\n )}\n </>\n );\n}\n", "import type { WidgetConfig } from '../types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n KEPLR_COMPATIBLE_WALLETS,\n type WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useWalletsStore } from '../store/wallets';\nimport { configWalletsToWalletName } from '../utils/providers';\nimport {\n isExperimentalChain,\n mapWalletTypesToWalletInfo,\n sortWalletsBasedOnConnectionState,\n} from '../utils/wallets';\n\nconst ALL_SUPPORTED_WALLETS = Object.values(WalletTypes);\n\ninterface Params {\n config?: WidgetConfig;\n chain?: string;\n onBeforeConnect?: (walletType: string) => void;\n onConnect?: (walletType: string) => void;\n}\n\n/**\n * gets list of wallets with their information and an action for handling click callback fo UI\n * we need to share the logic of rendering list of wallets and handle clicking on them in different places\n * you can use this list whenever you need to show the list of wallets and needed callbacks\n */\nexport function useWalletList(params: Params) {\n const { config, chain, onBeforeConnect, onConnect } = params;\n const { state, disconnect, getWalletInfo, connect } = useWallets();\n const { connectedWallets } = useWalletsStore();\n const blockchains = useAppStore().blockchains();\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 walletConnectProjectId: config?.walletConnectProjectId,\n }) || ALL_SUPPORTED_WALLETS;\n\n const wallets = mapWalletTypesToWalletInfo(\n state,\n getWalletInfo,\n listAvailableWalletTypes,\n chain\n );\n\n const sortedWallets = sortWalletsBasedOnConnectionState(wallets);\n const [error, setError] = useState('');\n\n const isExperimentalChainNotAdded = (walletType: string) =>\n !connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.chain === chain\n );\n\n const handleClick = async (type: WalletType) => {\n const wallet = state(type);\n try {\n if (error) {\n setError('');\n }\n if (wallet.connected) {\n await disconnect(type);\n } else {\n const atLeastOneWalletIsConnected = !!wallets.find(\n (w) => w.state === WalletState.CONNECTED\n );\n if (!config?.multiWallets && atLeastOneWalletIsConnected) {\n return;\n }\n onBeforeConnect?.(type);\n await connect(type);\n onConnect?.(type);\n }\n } catch (e) {\n setError('Error: ' + (e as any)?.message);\n }\n };\n\n const disconnectConnectingWallets = () => {\n const connectingWallets =\n wallets?.filter((wallet) => wallet.state === WalletState.CONNECTING) ||\n [];\n for (const wallet of connectingWallets) {\n void disconnect(wallet.type);\n }\n };\n\n useEffect(() => {\n return () => {\n disconnectConnectingWallets();\n };\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 );\n };\n\n return {\n list: sortedWallets.filter(\n (wallet) => !shouldExcludeWallet(wallet.type, chain ?? '', blockchains)\n ),\n error,\n handleClick,\n };\n}\n", "import type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport { styled, Typography, Wallet, WalletState } from '@rango-dev/ui';\nimport React, { Fragment, useState } from 'react';\n\nimport { Layout } from '../components/Layout';\nimport { WalletModal } from '../components/WalletModal';\nimport { useWalletList } from '../hooks/useWalletList';\nimport { useAppStore } from '../store/AppStore';\nimport { getContainer } from '../utils/common';\n\nconst ListContainer = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: ' repeat(3, minmax(0, 1fr))',\n alignContent: 'baseline',\n paddingTop: '$15',\n height: '100%',\n});\n\nconst Container = styled('div', {\n textAlign: 'center',\n});\n\nexport const TIME_TO_CLOSE_MODAL = 3_000;\nexport const TIME_TO_IGNORE_MODAL = 300;\n\nexport function WalletsPage() {\n const { config, fetchStatus: fetchMetaStatus } = useAppStore();\n const [openModal, setOpenModal] = useState(false);\n const [selectedWalletType, setSelectedWalletType] = useState<WalletType>('');\n let modalTimerId: ReturnType<typeof setTimeout> | null = null;\n\n const { list, handleClick, error } = useWalletList({\n config,\n onBeforeConnect: (type) => {\n modalTimerId = setTimeout(() => {\n setOpenModal(true);\n setSelectedWalletType(type);\n }, TIME_TO_IGNORE_MODAL);\n },\n onConnect: () => {\n if (modalTimerId) {\n clearTimeout(modalTimerId);\n }\n setTimeout(() => {\n setOpenModal(false);\n }, TIME_TO_CLOSE_MODAL);\n },\n });\n\n const selectedWallet = list.find(\n (wallet) => wallet.type === selectedWalletType\n );\n const selectedWalletImage = selectedWallet?.image || '';\n const selectedWalletState =\n selectedWallet?.state || WalletState.NOT_INSTALLED;\n\n return (\n <Layout\n header={{\n title: i18n.t('Connect Wallets'),\n }}>\n <Container>\n <Typography variant=\"title\" size=\"xmedium\" align=\"center\">\n {i18n.t('Choose a wallet to connect.')}\n </Typography>\n <ListContainer>\n {list.map((wallet, index) => {\n const key = `wallet-${index}-${wallet.type}`;\n return (\n <Fragment key={key}>\n <Wallet\n {...wallet}\n container={getContainer()}\n onClick={(type) => {\n void handleClick(type);\n }}\n isLoading={fetchMetaStatus === 'loading'}\n />\n </Fragment>\n );\n })}\n <WalletModal\n open={!!openModal}\n onClose={() => setOpenModal(false)}\n image={selectedWalletImage}\n state={selectedWalletState}\n error={error}\n />\n </ListContainer>\n </Container>\n </Layout>\n );\n}\n", "import type { PropTypes, Ref } from './Layout.types';\nimport type { PropsWithChildren } from 'react';\n\nimport { BottomLogo, Divider, Header } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { BackButton, CancelButton, WalletButton } from '../HeaderButtons';\n\nimport { Container, Content, Footer } from './Layout.styles';\n\nfunction LayoutComponent(props: PropsWithChildren<PropTypes>, ref: Ref) {\n const {\n children,\n header,\n footer,\n noPadding,\n hasLogo = true,\n fixedHeight = true,\n } = props;\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const connectWalletsButtonDisabled =\n useUiStore.use.connectWalletsButtonDisabled();\n const navigateBack = useNavigateBack();\n\n const onConnectWallet = () => {\n if (!connectWalletsButtonDisabled && header.onWallet) {\n header.onWallet();\n }\n };\n\n const showBackButton =\n typeof header.hasBackButton === 'undefined' || header.hasBackButton;\n\n return (\n <Container ref={ref} fixedHeight={fixedHeight} id=\"swap-box\">\n <Header\n prefix={<>{showBackButton && <BackButton onClick={navigateBack} />}</>}\n title={header.title}\n suffix={\n <>\n {header.suffix}\n {header.onWallet && (\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 noPadding={noPadding}>{children}</Content>\n {(hasLogo || footer) && (\n <Footer>\n <div className=\"footer__content\">{footer}</div>\n {hasLogo && (\n <div className=\"footer__logo\">\n <Divider size={12} />\n <BottomLogo />\n </div>\n )}\n </Footer>\n )}\n </Container>\n );\n}\n\nconst Layout = React.forwardRef(LayoutComponent);\nLayout.displayName = 'Layout';\n\nexport { Layout };\n", "import { useNavigate } from 'react-router-dom';\n\nexport function useNavigateBack(): () => void {\n const navigate = useNavigate();\n return () => navigate(-1);\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 { 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});\n\nexport const ConnectedIcon = styled('div', {\n position: 'absolute',\n background: '$secondary500',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary400',\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 width: '$40',\n});\n\nexport const NotificationsBadgeContainer = styled('div', {\n position: 'absolute',\n backgroundColor: '$secondary500',\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});\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 { Tooltip, WalletIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { ConnectedIcon, HeaderButton } from './HeaderButtons.styles';\n\nfunction WalletButton(props: PropTypes) {\n return (\n <Tooltip\n container={props.container}\n side=\"top\"\n content={i18n.t('Connect Wallet')}>\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 { HomeButtonsPropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n NotificationsIcon,\n Popover,\n RefreshIcon,\n SettingsIcon,\n Tooltip,\n TransactionIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { NotificationContent } from '../NotificationContent';\n\nimport { HeaderButton } from './HeaderButtons.styles';\nimport { UnreadNotificationsBadge } from './UnreadNotificationsBadge';\n\nexport function HomeButtons(props: HomeButtonsPropTypes) {\n const {\n layoutRef,\n onClickRefresh,\n onClickHistory,\n onClickSettings,\n onClickNotifications,\n } = props;\n\n return (\n <>\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Refresh')}>\n <HeaderButton\n variant=\"ghost\"\n size=\"small\"\n onClick={onClickRefresh}\n disabled={!onClickRefresh}>\n <RefreshIcon size={16} color={!onClickRefresh ? 'gray' : 'black'} />\n </HeaderButton>\n </Tooltip>\n\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Notifications')}>\n <Popover\n align=\"center\"\n collisionBoundary={layoutRef}\n collisionPadding={{ right: 20, left: 20 }}\n container={getContainer()}\n content={<NotificationContent />}>\n <HeaderButton\n size=\"small\"\n variant=\"ghost\"\n onClick={onClickNotifications}>\n <NotificationsIcon size={18} color=\"black\" />\n <UnreadNotificationsBadge />\n </HeaderButton>\n </Popover>\n </Tooltip>\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 <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 </HeaderButton>\n </Tooltip>\n </>\n );\n}\n", "import type { Notification } from '../../types/notification';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChainToken,\n ChevronRightIcon,\n ListItemButton,\n Typography,\n} 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 { useUiStore } from '../../store/ui';\n\nimport { Container, Images, List } from './NotificationContent.styles';\nimport { NotificationNotFound } from './NotificationNotFound';\n\nconst MAX_NOTIFICATIONS_DISPLAYED = 4;\n\nexport function NotificationContent() {\n const navigate = useNavigate();\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n\n const { getUnreadNotifications } = useNotificationStore();\n\n const notifications: Notification[] = getUnreadNotifications();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const sortedNotification = notifications\n .sort((a, b) => b.creationTime - a.creationTime)\n .slice(0, MAX_NOTIFICATIONS_DISPLAYED);\n\n const handleOnClick = (requestId: Notification['requestId']) => {\n setSelectedSwap(requestId);\n navigate(`${navigationRoutes.swaps}/${requestId}`);\n };\n\n return (\n <Container>\n {sortedNotification.length ? (\n <List>\n {sortedNotification.map((notificationItem) => {\n const fromToken = tokens.find(\n (tokenItem) =>\n tokenItem.address ===\n notificationItem.route.from.tokenAddress &&\n tokenItem.blockchain ===\n notificationItem.route.from.blockchain &&\n tokenItem.symbol === notificationItem.route.from.tokenSymbol\n );\n\n const fromBlockchain = blockchains.find(\n (blockchainItem) =>\n blockchainItem.name === notificationItem.route.from.blockchain\n );\n\n const toToken = tokens.find(\n (tokenItem) =>\n tokenItem.address === notificationItem.route.to.tokenAddress &&\n tokenItem.blockchain === notificationItem.route.to.blockchain &&\n tokenItem.symbol === notificationItem.route.to.tokenSymbol\n );\n\n const toBlockchain = blockchains.find(\n (blockchainItem) =>\n blockchainItem.name === notificationItem.route.to.blockchain\n );\n\n return (\n <ListItemButton\n key={notificationItem.requestId}\n onClick={() => handleOnClick(notificationItem.requestId)}\n title={\n <Typography variant=\"body\" size=\"small\" color=\"$neutral700\">\n {i18n.t(notificationItem.event.message)}\n </Typography>\n }\n id={notificationItem.requestId}\n start={\n <Images>\n <div className=\"from-chain-token\">\n <ChainToken\n tokenImage={fromToken ? fromToken.image : ''}\n chainImage={fromBlockchain ? fromBlockchain.logo : ''}\n size=\"small\"\n />\n </div>\n <div className=\"to-chain-token\">\n <ChainToken\n tokenImage={toToken ? toToken.image : ''}\n chainImage={toBlockchain ? toBlockchain.logo : ''}\n size=\"small\"\n />\n </div>\n </Images>\n }\n end={<ChevronRightIcon size={12} color=\"gray\" />}\n />\n );\n })}\n </List>\n ) : (\n <NotificationNotFound />\n )}\n </Container>\n );\n}\n", "import type { Notification } from '../types/notification';\nimport type {\n Route,\n RouteEvent,\n StepEvent,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\n\nimport createSelectors from './selectors';\n\nexport interface NotificationState {\n notifications: Notification[];\n setNotification: (event: RouteEvent | StepEvent, route: Route) => void;\n setAsRead: (requestId: Notification['requestId']) => void;\n getUnreadNotifications: () => Notification[];\n}\n\nexport const useNotificationStore = createSelectors(\n create<NotificationState>()(\n persist(\n subscribeWithSelector((set, get) => ({\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 read: false,\n requestId: route.requestId,\n route: {\n from: {\n blockchain: fromStep.fromBlockchain,\n tokenAddress: fromStep.fromSymbolAddress,\n tokenSymbol: fromStep.fromSymbol,\n },\n to: {\n blockchain: toStep.toBlockchain,\n tokenSymbol: toStep.toSymbol,\n tokenAddress: toStep.toSymbolAddress,\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 setAsRead: (requestId) => {\n set((state) => ({\n notifications: state.notifications.map((notificationItem) =>\n notificationItem.requestId === requestId\n ? { ...notificationItem, read: true }\n : notificationItem\n ),\n }));\n },\n getUnreadNotifications: () => {\n return get().notifications.filter(\n (notificationItem) => !notificationItem.read\n );\n },\n })),\n {\n name: 'notification',\n skipHydration: true,\n }\n )\n )\n);\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n padding: '$10',\n width: '350px',\n minHeight: '150px',\n});\n\nexport const List = styled('ul', {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n '.to-chain-token': {\n transform: 'translateX(-3px)',\n },\n});\n\nexport const Images = styled('div', {\n display: 'flex',\n padding: 0,\n alignItems: 'center',\n alignSelf: 'stretch',\n});\n\nexport const NotFoundContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'column',\n padding: '$10',\n width: '100%',\n height: '150px',\n});\n", "import { i18n } from '@lingui/core';\nimport { Divider, NoNotificationIcon, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { NotFoundContainer } from './NotificationContent.styles';\n\nexport function NotificationNotFound() {\n return (\n <NotFoundContainer>\n <NoNotificationIcon color=\"secondary\" size={26} />\n <Divider size={12} />\n <Typography variant=\"body\" size=\"medium\" color=\"neutral700\">\n {i18n.t('You have no notification')}\n </Typography>\n </NotFoundContainer>\n );\n}\n", "import { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useNotificationStore } from '../../store/notification';\n\nimport { NotificationsBadgeContainer } from './HeaderButtons.styles';\n\nexport function UnreadNotificationsBadge() {\n const { getUnreadNotifications } = useNotificationStore();\n\n const notificationsCount = getUnreadNotifications().length;\n\n return notificationsCount ? (\n <NotificationsBadgeContainer>\n <Typography variant=\"body\" size=\"xsmall\" color=\"$background\">\n {notificationsCount}\n </Typography>\n </NotificationsBadgeContainer>\n ) : null;\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n borderRadius: '$primary',\n overflow: 'hidden !important',\n boxShadow: '15px 15px 15px 0px rgba(0, 0, 0, 0.05)',\n width: '95vw',\n maxWidth: '390px',\n maxHeight: '700px',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n variants: {\n fixedHeight: {\n true: {\n height: '95vh',\n },\n false: {\n height: 'auto',\n },\n },\n },\n});\n\nexport const Content = styled('div', {\n borderTopLeftRadius: '20px',\n borderTopRightRadius: '20px',\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n padding: '$20 $20 $10 $20',\n backgroundColor: '$background',\n position: 'relative',\n overflowY: 'auto',\n overflowX: 'hidden',\n variants: {\n noPadding: {\n true: {\n padding: '0',\n },\n },\n },\n});\n\nexport const Footer = styled('div', {\n backgroundColor: '$background',\n '& .footer__content': {\n padding: '$0 $20',\n },\n '& .footer__logo': {\n padding: '$0 $20 $10 $20',\n },\n});\n", "import type { PropTypes } from './WalletModal.types';\n\nimport { Divider, Modal } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { ModalContent } from './WalletModalContent';\n\nexport function WalletModal(props: PropTypes) {\n const { open, onClose, ...otherProps } = props;\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n container={document.getElementById('swap-box') || document.body}>\n <ModalContent {...otherProps} />\n <Divider direction=\"vertical\" size={32} />\n </Modal>\n );\n}\n", "import type { ModalContentProps } from './WalletModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Image, MessageBox, WalletState } from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './WalletModalContent.styles';\n\nexport function ModalContent(props: ModalContentProps) {\n const { state, image, error } = props;\n if (state === 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 { 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 { 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 './QuoteInfo.types';\n\nimport { Divider } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Quote, QuoteSkeleton } from '../../components/Quote';\nimport { QuoteWarningsAndErrors } from '../../components/QuoteWarningsAndErrors';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType } from '../../types';\n\nimport {\n PositionTopAlerts,\n QuoteContainer,\n SkeletonContainer,\n} from './QuoteInfo.styles';\n\nexport function QuoteInfo(props: PropTypes) {\n const {\n quote,\n type,\n loading,\n error,\n warning,\n refetchQuote,\n showWarningModal,\n onOpenWarningModal,\n onCloseWarningModal,\n onConfirmWarningModal,\n onChangeSettings,\n expanded = false,\n alertPosition = 'bottom',\n } = props;\n const { inputAmount, inputUsdValue, outputUsdValue, outputAmount } =\n useQuoteStore();\n\n const noResult =\n error &&\n (error.type === QuoteErrorType.NO_RESULT ||\n error.type === QuoteErrorType.REQUEST_FAILED);\n\n const showQuote = !noResult && quote && quote.result && !loading;\n\n const quoteWarningsAndErrors = (warning || error) && (\n <QuoteWarningsAndErrors\n warning={warning}\n error={error}\n loading={loading}\n refetchQuote={refetchQuote}\n showWarningModal={showWarningModal}\n onOpenWarningModal={onOpenWarningModal}\n onCloseWarningModal={onCloseWarningModal}\n onConfirmWarningModal={onConfirmWarningModal}\n onChangeSettings={onChangeSettings}\n />\n );\n return (\n <>\n {loading && (\n <QuoteContainer>\n <SkeletonContainer paddingTop={alertPosition === 'top'}>\n <QuoteSkeleton type={type} expanded={expanded} />\n </SkeletonContainer>\n </QuoteContainer>\n )}\n\n {alertPosition === 'top' && (\n <PositionTopAlerts>{quoteWarningsAndErrors}</PositionTopAlerts>\n )}\n {showQuote ? (\n <QuoteContainer>\n <Quote\n quote={quote}\n error={error}\n warning={warning}\n type={type}\n expanded={expanded}\n recommended={true}\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 {alertPosition === 'bottom' && (\n <>\n {!warning && !error && <Divider size={16} />}\n {quoteWarningsAndErrors}\n </>\n )}\n </>\n );\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 ChevronDownIcon,\n ChevronRightIcon,\n Divider,\n Image,\n InfoIcon,\n QuoteCost,\n StepDetails,\n TokenAmount,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useLayoutEffect, useRef, useState } from 'react';\n\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 } from '../../utils/common';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport {\n numberToString,\n secondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport { getTotalFeeInUsd } from '../../utils/swap';\n\nimport {\n ChainImageContainer,\n Chains,\n Content,\n EXPANDABLE_QUOTE_TRANSITION_DURATION,\n FrameIcon,\n HorizontalSeparator,\n IconContainer,\n QuoteContainer,\n SummaryContainer,\n} from './Quote.styles';\nimport { QuoteSummary } from './QuoteSummary';\n\nexport function Quote(props: QuoteProps) {\n const {\n quote,\n input,\n output,\n error,\n warning,\n type,\n recommended = true,\n } = props;\n const tokens = useAppStore().tokens();\n const blockchains = useAppStore().blockchains();\n const swappers = useAppStore().swappers();\n\n const [expanded, setExpanded] = useState(props.expanded);\n const quoteRef = useRef<HTMLButtonElement | null>(null);\n const prevExpanded = useRef(expanded);\n const totalFee = numberToString(\n getTotalFeeInUsd(quote.result?.swaps ?? [], tokens),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n );\n const totalTime = secondsToString(totalArrivalTime(quote.result?.swaps));\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 = (swaps: SwapResult[]): Step[] => {\n return swaps.map((swap, index) => {\n let stepState: 'error' | 'warning' | undefined = undefined;\n const stepHasError =\n (error?.type === QuoteErrorType.BRIDGE_LIMIT &&\n error.swap.swapperId === swap.swapperId) ||\n (error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE &&\n error.recommendedSlippages?.has(index));\n const stepHasWarning =\n warning?.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE &&\n warning.recommendedSlippages?.has(index);\n\n if (stepHasError) {\n stepState = 'error';\n } else if (stepHasWarning) {\n stepState = 'warning';\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: getBlockchainShortNameFor(\n swap.from.blockchain,\n blockchains\n ),\n image: swap.from.blockchainLogo,\n },\n price: {\n value:\n index === 0\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 },\n },\n to: {\n token: { displayName: swap.to.symbol, image: swap.to.logo },\n chain: {\n displayName: getBlockchainShortNameFor(\n swap.to.blockchain,\n blockchains\n ),\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 },\n },\n state: stepState,\n alerts:\n stepHasError || stepHasWarning ? (\n <FooterStepAlarm>\n <Alert\n type={stepHasError ? 'error' : 'warning'}\n title={\n error?.type === QuoteErrorType.BRIDGE_LIMIT\n ? error?.recommendation\n : i18n.t('Slippage Error:')\n }\n footer={\n <FooterAlert>\n {error?.type === QuoteErrorType.BRIDGE_LIMIT && (\n <>\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {error.fromAmountRangeError}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n |\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\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 </>\n )}\n {(error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE ||\n warning?.type ===\n QuoteWarningType.INSUFFICIENT_SLIPPAGE) && (\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Minimum required slippage is {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 )}\n </FooterAlert>\n }\n />\n </FooterStepAlarm>\n ) : undefined,\n };\n });\n };\n const steps = getQuoteSteps(quote.result?.swaps ?? []);\n const numberOfSteps = steps.length;\n const tooltipContainer = getContainer();\n\n useLayoutEffect(() => {\n if (expanded && !prevExpanded.current && quoteRef.current) {\n setTimeout(() => {\n quoteRef?.current?.scrollIntoView({ behavior: 'smooth' });\n }, EXPANDABLE_QUOTE_TRANSITION_DURATION);\n }\n prevExpanded.current = expanded;\n }, [expanded, prevExpanded]);\n\n return (\n <>\n <SummaryContainer\n recommended={recommended}\n listItem={type === 'list-item'}\n basic={type === 'basic'}>\n <div className=\"summary\">\n <QuoteCost fee={totalFee} time={totalTime} steps={numberOfSteps} />\n {type === 'basic' && (\n <div className=\"basic-info\">\n <FrameIcon>\n <InfoIcon size={12} color=\"gray\" />\n </FrameIcon>\n <Typography\n size=\"small\"\n variant=\"body\"\n style={{ letterSpacing: 0.4 }}>\n {`${roundedInput} ${\n steps[0].from.token.displayName\n } = ${roundedOutput} ${\n steps[steps.length - 1].to.token.displayName\n }`}\n </Typography>\n <Typography\n color=\"$neutral600\"\n ml={2}\n size=\"xsmall\"\n variant=\"body\">\n {`($${roundedOutputUsdValue})`}\n </Typography>\n </div>\n )}\n {type === 'list-item' && (\n <TokenAmount\n type=\"output\"\n direction=\"vertical\"\n price={{ value: roundedOutput, usdValue: roundedOutputUsdValue }}\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 recommended={recommended}\n open={expanded}\n onOpenChange={setExpanded}>\n <Chains\n ref={(ref) => (quoteRef.current = ref)}\n recommended={recommended}\n onClick={() => setExpanded((prevState) => !prevState)}>\n <div>\n {steps.map((step, index) => {\n const key = `item-${index}`;\n const arrow = (\n <IconContainer>\n <ChevronRightIcon\n size={12}\n color=\"black\"\n {...(step.state && {\n color: step.state === 'error' ? 'error' : 'warning',\n })}\n />\n </IconContainer>\n );\n return (\n <React.Fragment key={key}>\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n sideOffset={4}\n content={step.from.chain.displayName}>\n <ChainImageContainer\n state={step.state || steps[index - 1]?.state}>\n <Image src={step.from.chain.image} size={16} />\n </ChainImageContainer>\n </Tooltip>\n {index === numberOfSteps - 1 && (\n <>\n {arrow}\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n sideOffset={4}\n content={step.to.chain.displayName}>\n <ChainImageContainer state={step.state}>\n <Image src={step.to.chain.image} size={16} />\n </ChainImageContainer>\n </Tooltip>\n </>\n )}\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n );\n })}\n </div>\n <IconContainer orientation={expanded ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"black\" />\n </IconContainer>\n </Chains>\n <Content open={expanded}>\n <HorizontalSeparator />\n <div className=\"steps-details\">\n {steps.map((step, index) => {\n const key = `item-${index}`;\n return (\n <StepDetails\n type=\"quote-details\"\n key={key}\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}\n", "import { styled } from '@rango-dev/ui';\n\nexport const PositionTopAlerts = styled('div', {\n paddingBottom: '$10',\n});\n\nexport const QuoteContainer = styled('div', {\n width: '100%',\n '& .position-top__skeleton': {\n paddingTop: '$10',\n },\n});\n\nexport const SkeletonContainer = styled('div', {\n variants: {\n paddingTop: {\n true: {\n paddingTop: '$10',\n },\n },\n },\n});\n\nexport const FooterStepAlarm = styled('div', {\n paddingBottom: '$15',\n});\n\nexport const FooterAlert = styled('div', {\n width: '100%',\n display: 'flex',\n});\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport { darkTheme, Image, styled } from '@rango-dev/ui';\n\nimport { CollapsibleContent } from '../ConfirmWalletsModal/ConfirmWallets.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 cursor: 'default',\n variants: {\n recommended: {\n true: {\n $$color: '$colors$info300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n },\n '& .steps-details': {\n padding: '$10 $15',\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 cursor: 'pointer',\n boxSizing: 'border-box',\n position: 'relative',\n variants: {\n recommended: {\n true: {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary600',\n },\n backgroundColor: '$$color',\n '&:hover': {\n backgroundColor: '$$color',\n },\n },\n false: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n '&:hover': {\n backgroundColor: '$$color',\n },\n },\n },\n basic: { true: { borderTopRightRadius: '0', borderTopLeftRadius: '0' } },\n listItem: {\n true: {},\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: true,\n recommended: true,\n css: {\n '&:hover': {\n $$color: '$colors$secondary200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary700',\n },\n backgroundColor: '$$color',\n },\n },\n },\n {\n listItem: true,\n recommended: false,\n css: {\n '&:hover': {\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n backgroundColor: '$$color',\n },\n },\n },\n ],\n '& .summary': {\n width: '100%',\n padding: '$15 $15 $10 $15',\n cursor: 'default',\n },\n '& .basic-info': {\n paddingTop: '$10',\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});\n\nexport const Chains = 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 recommended: {\n true: {\n $$color: '$colors$info300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n },\n '& div:nth-child(1)': { display: 'flex' },\n});\n\nexport const ChainImageContainer = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n border: '1.5px transparent solid',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\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});\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", "import type { PriceImpactWarningLevel, Step } from '@rango-dev/ui';\n\nimport { TokenAmount } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Container } 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 return (\n <Container>\n <TokenAmount\n direction=\"horizontal\"\n label=\"Swap input\"\n type=\"input\"\n price={{ value: from.price.value, usdValue: from.price.usdValue }}\n token={{\n displayName: from.token.displayName,\n image: from.token.image,\n }}\n chain={{ image: from.chain.image }}\n />\n <div className=\"separator\" />\n <TokenAmount\n direction=\"horizontal\"\n label=\"Estimated output\"\n type=\"output\"\n price={{ value: to.price.value, usdValue: to.price.usdValue }}\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 { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n '& .separator': {\n height: '14px',\n marginLeft: '14px',\n position: 'absolute',\n borderLeft: '1px solid $foreground',\n top: '42%',\n },\n});\n", "import type { PropTypes } from './QuoteSkeleton.types';\n\nimport { ChainToken, Divider, NextIcon, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Container, StepSeparator } from './QuoteSkeleton.styles';\n\nfunction StepSkeleton(props: { separator?: boolean }) {\n const { separator = true } = props;\n return (\n <>\n <div className=\"step__title\">\n <Skeleton height={22} width={22} variant=\"circular\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </div>\n <div className=\"step__content\">\n <StepSeparator hideSeparator={!separator} />\n <div className=\"step__tokens\">\n <div className=\"step__token-info\">\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} width={76} variant=\"rounded\" />\n </div>\n <div className=\"step__icon-container\">\n <NextIcon color=\"gray\" size={16} />\n </div>\n <div className=\"step__token-info\">\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} width={76} variant=\"rounded\" />\n </div>\n </div>\n </div>\n </>\n );\n}\n\nexport function QuoteSkeleton(props: PropTypes) {\n const { type, expanded, tag = false } = props;\n const quoteSummary = (\n <div className=\"quote-summary\">\n <div className=\"token-amount\">\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider size={8} direction=\"horizontal\" />\n <div className=\"token-amount__label\">\n <Skeleton height={10} width={60} variant=\"rounded\" />\n <Divider size={4} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </div>\n </div>\n <Skeleton height={12} width={64} variant=\"rounded\" />\n </div>\n );\n\n return (\n <Container rounded={type !== 'basic'}>\n <div className=\"cost-and-tag\">\n <div className=\"cost\">\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 </div>\n {tag && <Skeleton height={22} width={100} variant=\"rounded\" />}\n </div>\n {type === 'basic' && (\n <div className=\"basic-summary\">\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </div>\n )}\n {type === 'list-item' && (\n <div className=\"output\">\n <div className=\"output__token-info\">\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton height={15} width={150} variant=\"rounded\" />\n </div>\n <Divider size={4} />\n <Skeleton height={10} width={184} variant=\"rounded\" />\n </div>\n )}\n {type === 'swap-preview' && (\n <>\n <Divider size={4} />\n <div className=\"swap-preview\">\n {quoteSummary}\n <div className=\"quote-summary__separator\" />\n {quoteSummary}\n </div>\n </>\n )}\n <div className=\"chains\">\n <Skeleton height={15} width={321} variant=\"rounded\" />\n </div>\n\n {expanded && (\n <div className=\"steps\">\n <Divider size={20} />\n <StepSkeleton />\n <StepSkeleton />\n <StepSkeleton separator={false} />\n </div>\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 '& .cost-and-tag': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n height: '22px',\n },\n variants: {\n rounded: {\n true: {\n borderRadius: '$xm',\n },\n },\n },\n '& .cost': {\n display: 'flex',\n },\n '& .basic-summary': {\n padding: '$15 $0 14px $0',\n },\n '& .output': {\n padding: '$6 $0 $15 $0',\n display: 'flex',\n flexDirection: 'column',\n },\n '& .output__token-info': {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n paddingBottom: '$5',\n },\n '& .quote-summary': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'end',\n },\n '& .quote-summary__separator': {\n height: '$28',\n marginLeft: '13px',\n borderLeft: '1px solid $neutral700',\n },\n '& .token-amount': {\n display: 'flex',\n justifyContent: 'space-between',\n },\n '& .token-amount__label': {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n },\n '& .chains': {\n paddingTop: '$2',\n },\n '& .swap-preview': {\n padding: '$15 $0 $15 $0',\n },\n '& .steps': {\n paddingLeft: '$8',\n },\n '& .step__title': {\n display: 'flex',\n alignItems: 'center',\n },\n '& .step__content': {\n display: 'flex',\n alignItems: 'start',\n },\n '& .step__tokens': {\n paddingTop: '$5',\n paddingBottom: '$10',\n display: 'flex',\n alignItems: 'center',\n },\n '& .step__token-info': {\n display: 'flex',\n alignItems: 'center',\n },\n '& .step__icon-container': {\n margin: '$0 $2',\n padding: '$4',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n});\n\nexport const StepSeparator = styled('div', {\n borderLeft: '1px dashed black',\n minHeight: ' 64px',\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 './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 refetchQuote,\n showWarningModal,\n onOpenWarningModal,\n onCloseWarningModal,\n onConfirmWarningModal,\n onChangeSettings,\n } = props;\n\n const warningModalHandlers = {\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\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';\nimport { useSettingsStore } from '../../store/settings';\n\nimport { makeInfo } from './NoResult.helpers';\nimport { Container, Footer, PrefixIcon } from './NoResult.styles';\n\nexport function NoResult(props: PropTypes) {\n const { fetch, error } = props;\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\n const toggleAllLiquiditySources =\n useSettingsStore.use.toggleAllLiquiditySources();\n\n const swappers = useAppStore().swappers();\n\n const info = makeInfo(\n error,\n disabledLiquiditySources,\n () => toggleAllLiquiditySources(swappers, true),\n fetch\n );\n\n return (\n <Container>\n <NoRouteIcon size={24} color=\"gray\" />\n <Divider size={4} />\n <Typography variant=\"title\" size=\"small\">\n {errorMessages().noResultError.title}\n </Typography>\n {!!info.description && (\n <Typography\n variant=\"body\"\n size=\"small\"\n align=\"center\"\n color=\"neutral700\">\n {info.description}\n </Typography>\n )}\n <Divider size={4} />\n {!!info.alert && (\n <Footer>\n <Alert\n type={info.alert.type}\n title={info.alert.text}\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\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", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n minHeight: '162px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const Footer = styled('div', {\n width: '100%',\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 Modal,\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';\n\nimport { QuoteErrorsModalItem } from './QuoteErrorsModalItem';\nimport { Flex } from './QuoteWarningsAndErrors.styles';\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: HighValueLossWarning;\n};\n\nexport function HighValueLossWarningModal(props: Props) {\n const { open, onClose, onConfirm, warning } = props;\n const type = warning.warningLevel === 'high' ? 'error' : 'warning';\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 <Modal open={open} onClose={onClose} container={getContainer()}>\n <MessageBox\n type={type}\n title={errorMessages().highValueLossError.impactTitle}\n description={errorMessages().highValueLossError.description}\n />\n\n <Flex>\n <Divider size={20} />\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\n <Divider size={32} />\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n onClick={onConfirm}>\n {errorMessages().highValueLossError.confirmMessage}\n </Button>\n </Modal>\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 paddingTop: '$10',\n});\n\nexport const Flex = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: 10,\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: 'show-info',\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 = null;\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 }\n return alertInfo;\n }\n if (error) {\n alertInfo.alertType = 'error';\n if (error.type === QuoteErrorType.BRIDGE_LIMIT) {\n alertInfo.title = error.recommendation;\n alertInfo.action = 'show-info';\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 return null;\n}\n", "import type {\n HighSlippageWarning,\n InsufficientSlippageWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Modal, Typography } from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useSettingsStore } from '../../store/settings';\nimport { QuoteWarningType } from '../../types';\nimport { getContainer } from '../../utils/common';\n\ntype PropsTypes = {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: InsufficientSlippageWarning | HighSlippageWarning;\n};\n\nexport function SlippageWarningModal(props: PropsTypes) {\n const { customSlippage, slippage } = useSettingsStore();\n const { open, onClose, onConfirm, warning } = props;\n const navigate = useNavigate();\n const userSlippage = customSlippage ?? slippage;\n return (\n <Modal\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 onClick={onConfirm}>\n {i18n.t('Confirm anyway')}\n </Button>\n </MessageBox>\n </Modal>\n );\n}\n", "import type { UnknownPriceWarning } from '../../types';\n\nimport { Button, Divider, MessageBox, Modal, WarningIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { getContainer } from '../../utils/common';\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: UnknownPriceWarning;\n};\n\nexport function UnknownPriceWarningModal(props: Props) {\n const { open, onClose, onConfirm } = props;\n\n return (\n <Modal open={open} onClose={onClose} container={getContainer()}>\n <MessageBox\n type=\"warning\"\n title={errorMessages().unknownPriceError.impactTitle}\n description={errorMessages().unknownPriceError.description}\n />\n\n <Divider size={32} />\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n onClick={onConfirm}>\n {errorMessages().unknownPriceError.confirmMessage}\n </Button>\n </Modal>\n );\n}\n", "import type { ConfirmSwap, Params } from './useConfirmSwap.types';\nimport type { PendingSwapSettings } from '../../types';\nimport type { BestRouteResponse } 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 { useSettingsStore } from '../../store/settings';\nimport { useWalletsStore } from '../../store/wallets';\nimport { createQuoteRequestBody, getWalletsForNewSwap } from '../../utils/swap';\nimport { useFetchQuote } from '../useFetchQuote';\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 setQuote,\n quote: initialQuote,\n customDestination: customDestinationFromStore,\n setQuoteWarningsConfirmed,\n } = useQuoteStore();\n\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n disabledLiquiditySources,\n } = useSettingsStore();\n const { connectedWallets } = useWalletsStore();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const { experimental } = useAppStore().config;\n const { enableNewLiquiditySources } = useAppStore().config;\n\n const userSlippage = customSlippage || slippage;\n\n const { fetch: fetchQuote, cancelFetch, loading } = useFetchQuote();\n\n useEffect(() => cancelFetch, []);\n\n const fetch: ConfirmSwap['fetch'] = async (params: 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 requestBody = createQuoteRequestBody({\n fromToken,\n toToken,\n inputAmount,\n wallets: connectedWallets,\n selectedWallets,\n excludeLiquiditySources: enableNewLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n initialQuote: initialQuote ?? undefined,\n destination: customDestination,\n });\n if (experimental?.routing) {\n requestBody.experimental = true;\n }\n let currentQuote: BestRouteResponse;\n try {\n currentQuote = await fetchQuote(requestBody).then((response) =>\n throwErrorIfResponseIsNotValid(response)\n );\n setQuote(currentQuote);\n } catch (error: any) {\n const confirmSwapResult = handleQuoteErrors(error);\n return confirmSwapResult;\n }\n\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n const swap = calculatePendingSwap(\n inputAmount.toString(),\n currentQuote,\n getWalletsForNewSwap(selectedWallets),\n swapSettings,\n false,\n { blockchains, tokens }\n );\n\n const confirmSwapWarnings = generateWarnings(\n initialQuote ?? undefined,\n currentQuote,\n {\n fromToken,\n toToken,\n meta: { blockchains, tokens },\n selectedWallets,\n userSlippage,\n }\n );\n\n if (confirmSwapWarnings.quoteUpdate) {\n setQuoteWarningsConfirmed(false);\n }\n\n return {\n quote: currentQuote,\n swap,\n error: null,\n warnings: confirmSwapWarnings,\n };\n };\n\n return {\n loading,\n fetch,\n cancelFetch,\n };\n}\n", "import type { BestRouteRequest, BestRouteResponse } from 'rango-sdk';\n\nimport { useRef, useState } from 'react';\n\nimport { httpService } from '../services/httpService';\n\ninterface UseFetchQuote {\n fetch: (requestBody: BestRouteRequest) => Promise<BestRouteResponse>;\n cancelFetch: () => void;\n loading: boolean;\n}\n\nexport function useFetchQuote(): UseFetchQuote {\n const [loading, setLoading] = useState(false);\n const abortController = useRef<AbortController | null>(null);\n const cancel = () => abortController.current?.abort();\n\n const fetch: UseFetchQuote['fetch'] = async (requestBody) => {\n cancel();\n abortController.current = new AbortController();\n\n setLoading(true);\n\n try {\n const res = await httpService().getBestRoute(requestBody, {\n signal: abortController.current.signal,\n });\n abortController.current = null;\n return res;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-useless-catch\n } catch (error: any) {\n throw error;\n } finally {\n setLoading(false);\n }\n };\n return { fetch, loading, cancelFetch: cancel };\n}\n", "import type { ConfirmSwapFetchResult } from './useConfirmSwap.types';\nimport type { ConfirmSwapWarnings, Wallet } from '../../types';\nimport type { BestRouteResponse, BlockchainMeta, 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: BestRouteResponse) {\n if (!response.result) {\n throw new Error(errorMessages().noResultError.title, {\n cause: {\n type: QuoteErrorType.NO_RESULT,\n diagnosisMessage: response.diagnosisMessages?.[0],\n },\n });\n }\n const limitError = hasLimitError(response);\n if (limitError) {\n const { swap, recommendation, fromAmountRangeError } =\n getLimitErrorMessage(response);\n\n throw new Error('bridge limit error', {\n cause: {\n type: QuoteErrorType.BRIDGE_LIMIT,\n swap: swap,\n recommendation,\n fromAmountRangeError,\n },\n });\n }\n\n const recommendedSlippages = checkSlippageErrors(response);\n\n if (recommendedSlippages) {\n const minRequiredSlippage = getMinRequiredSlippage(response);\n throw new Error('', {\n cause: {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages,\n minRequiredSlippage,\n },\n });\n }\n\n return response;\n}\n\nexport function generateWarnings(\n previousQuote: BestRouteResponse | undefined,\n currentQuote: BestRouteResponse,\n params: {\n fromToken: Token;\n toToken: Token;\n meta: { blockchains: BlockchainMeta[]; tokens: Token[] };\n selectedWallets: Wallet[];\n userSlippage: number;\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 tokens: params.meta.tokens,\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 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 { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport type { PendingSwapStep } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { Divider, NotFound, styled } from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { Layout } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { SwapsGroup } from '../components/SwapsGroup';\nimport { NotFoundContainer } from '../components/SwapsGroup/SwapsGroup.styles';\nimport { useUiStore } from '../store/ui';\nimport { groupSwapsByDate } from '../utils/date';\nimport { containsText } from '../utils/numbers';\nimport { getPendingSwaps } from '../utils/queue';\n\nconst Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n height: '100%',\n gap: 15,\n});\n\nconst SwapsGroupContainer = styled('div', {\n overflowY: 'visible',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: 15,\n height: '100%',\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 setSelectedSwap = useUiStore.use.setSelectedSwap();\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 loading = !state.loadedFromPersistor;\n\n const searchHandler = (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(\n (swap) =>\n containsText(swap.inputAmount, searchedFor) ||\n containsText(swap.status, searchedFor) ||\n isStepContainsText(swap.steps, searchedFor) ||\n containsText(swap.requestId, searchedFor)\n );\n }\n\n const isEmpty = !filteredList?.length && !loading;\n\n return (\n <Layout\n header={{\n title: i18n.t('History'),\n }}>\n <Container>\n <SearchInput\n setValue={setSearchedFor}\n fullWidth\n variant=\"contained\"\n placeholder={i18n.t('Search Transaction')}\n autoFocus\n onChange={searchHandler}\n value={searchedFor}\n />\n <SwapsGroupContainer>\n {isEmpty && (\n <NotFoundContainer>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={\n searchedFor ? i18n.t('Try using different keywords') : ''\n }\n />\n </NotFoundContainer>\n )}\n {!isEmpty && (\n <SwapsGroup\n list={filteredList}\n onSwapClick={(requestId) => {\n setSelectedSwap(requestId);\n navigate(requestId);\n }}\n groupBy={groupSwapsByDate}\n isLoading={loading}\n />\n )}\n </SwapsGroupContainer>\n </Container>\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 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 }}\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", "import type { PropTypes } from './SwapsGroup.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, SwapListItem, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { limitDecimalPlaces } from '../../utils/numbers';\n\nimport { Group, SwapList, Time } from './SwapsGroup.styles';\n\nexport function SwapsGroup(props: PropTypes) {\n const { list, onSwapClick, groupBy, isLoading } = props;\n const groups = groupBy ? groupBy(list) : [{ title: 'History', swaps: list }];\n\n if (isLoading) {\n const swaps = [{}, {}];\n\n const loadingGroups = [\n {\n title: 'Today',\n swaps,\n },\n {\n title: 'Last month',\n swaps,\n },\n ];\n return (\n <>\n {loadingGroups.map((group) => (\n <React.Fragment key={group.title}>\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n className=\"group-title\">\n {i18n.t(group.title)}\n </Typography>\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.swaps.map((_, index) => {\n const key = index + group.title;\n return (\n <React.Fragment key={key}>\n <SwapListItem isLoading={true} />\n </React.Fragment>\n );\n })}\n </SwapList>\n </Group>\n </React.Fragment>\n ))}\n </>\n );\n }\n\n return (\n <>\n {groups\n .filter((group) => group.swaps.length > 0)\n .map((group) => (\n <React.Fragment key={group.title}>\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n className=\"group-title\">\n {i18n.t(group.title)}\n </Typography>\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.swaps.map((swap) => {\n const firstStep = swap.steps[0];\n const lastStep = swap.steps[swap.steps.length - 1];\n return (\n <React.Fragment key={swap.requestId}>\n <SwapListItem\n requestId={swap.requestId}\n creationTime={swap.creationTime}\n status={swap.status}\n onClick={onSwapClick}\n onlyShowTime={group.title === '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: limitDecimalPlaces(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: limitDecimalPlaces(\n lastStep.outputAmount || ''\n ),\n estimatedAmount: limitDecimalPlaces(\n lastStep.expectedOutputAmountHumanReadable || ''\n ),\n },\n }}\n />\n </React.Fragment>\n );\n })}\n </SwapList>\n </Group>\n </React.Fragment>\n ))}\n </>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Group = styled('div', {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n '.group-title': {\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/SwapsGroup/SwapsGroup.types';\nimport type { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\n\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: 'Today',\n swaps: [],\n },\n ],\n [\n 'month',\n {\n title: 'Last month',\n swaps: [],\n },\n ],\n [\n 'year',\n {\n title: 'Last year',\n swaps: [],\n },\n ],\n [\n 'history',\n {\n title: 'History',\n swaps: [],\n },\n ],\n ]);\n\n const now = dayjs();\n swaps.forEach((swap) => {\n const swapDate = dayjs(Number(swap.creationTime));\n if (now.isSame(swapDate, 'day')) {\n output.get('today')?.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 output.get('history')?.swaps.push(swap);\n }\n });\n\n return Array.from(output.values());\n};\n", "import { Manager } from '@rango-dev/queue-manager-core';\nimport {\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 { i18n } from '@lingui/core';\nimport { Button, styled, SwapInput, WarningIcon } from '@rango-dev/ui';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HomeButtons } from '../components/HeaderButtons';\nimport { Layout } from '../components/Layout';\nimport { SwitchFromAndToButton } from '../components/SwitchFromAndTo';\nimport { errorMessages } from '../constants/errors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_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 { QuoteInfo } from '../containers/QuoteInfo';\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 { numberToString } from '../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../utils/quote';\nimport { canComputePriceImpact, getSwapButtonState } from '../utils/swap';\nimport { getBalanceFromWallet } from '../utils/wallets';\n\nconst Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'visible',\n '& .quote__container': {\n paddingTop: '$2',\n },\n});\n\nconst FromContainer = styled('div', {\n position: 'relative',\n});\n\nconst InputsContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: 5,\n alignSelf: 'stretch',\n});\nexport function Home() {\n const navigate = useNavigate();\n const {\n fetch: fetchQuote,\n loading: fetchingQuote,\n error: quoteError,\n warning: quoteWarning,\n } = useSwapInput();\n const {\n fromToken,\n fromBlockchain,\n toToken,\n toBlockchain,\n setInputAmount,\n inputAmount,\n inputUsdValue,\n outputAmount,\n outputUsdValue,\n quote,\n resetQuoteWallets,\n setQuoteWarningsConfirmed,\n } = useQuoteStore();\n\n const fetchMetaStatus = useAppStore().fetchStatus;\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const setCurrentPage = useUiStore.use.setCurrentPage();\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n const layoutRef = useRef<HTMLDivElement>(null);\n\n const needsToWarnEthOnPath = false;\n\n const priceImpactInputCanNotBeComputed = !canComputePriceImpact(\n quote,\n inputAmount,\n inputUsdValue\n );\n\n const priceImpactOutputCanNotBeComputed = !canComputePriceImpact(\n quote,\n inputAmount,\n outputUsdValue\n );\n\n const swapButtonState = getSwapButtonState({\n fetchMetaStatus,\n fetchingQuote,\n inputAmount,\n quote,\n anyWalletConnected: connectedWallets.length > 0,\n error: quoteError,\n warning: quoteWarning,\n needsToWarnEthOnPath,\n });\n\n const tokenBalance =\n !!fromBlockchain && !!fromToken\n ? numberToString(\n getBalanceFromWallet(\n connectedWallets,\n fromBlockchain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.amount || '0',\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n )\n : '0';\n\n const tokenBalanceReal =\n !!fromBlockchain && !!fromToken\n ? numberToString(\n getBalanceFromWallet(\n connectedWallets,\n fromBlockchain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.amount || '0',\n getBalanceFromWallet(\n connectedWallets,\n fromBlockchain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.decimal\n )\n : '0';\n\n useEffect(() => {\n setCurrentPage(navigationRoutes.home);\n resetQuoteWallets();\n return setCurrentPage.bind(null, '');\n }, []);\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPriceImpact(inputUsdValue.toString(), outputUsdValue.toString());\n\n return (\n <Layout\n ref={layoutRef}\n fixedHeight={false}\n hasLogo\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n disabled={swapButtonState.disabled}\n prefix={\n swapButtonState.action === 'confirm-warning' && <WarningIcon />\n }\n fullWidth\n onClick={() => {\n if (swapButtonState.action === 'connect-wallet') {\n navigate(navigationRoutes.wallets);\n } else if (swapButtonState.action === 'confirm-warning') {\n setShowQuoteWarningModal(true);\n } else {\n navigate(navigationRoutes.confirmSwap);\n }\n }}>\n {swapButtonState.title}\n </Button>\n }\n header={{\n onWallet: () => {\n navigate(navigationRoutes.wallets);\n },\n hasBackButton: false,\n title: i18n.t('Swap'),\n suffix: (\n <HomeButtons\n layoutRef={layoutRef.current}\n onClickRefresh={!!quote || quoteError ? fetchQuote : undefined}\n onClickHistory={() => navigate(navigationRoutes.swaps)}\n onClickSettings={() => navigate(navigationRoutes.settings)}\n />\n ),\n }}>\n <Container>\n <InputsContainer>\n <FromContainer>\n <SwapInput\n label={i18n.t('From')}\n mode=\"From\"\n onInputChange={setInputAmount}\n balance={tokenBalance}\n chain={{\n displayName: fromBlockchain?.displayName || '',\n image: fromBlockchain?.logo || '',\n }}\n token={{\n displayName: fromToken?.symbol || '',\n image: fromToken?.image || '',\n }}\n onClickToken={() => navigate(navigationRoutes.fromSwap)}\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 error: priceImpactInputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n onSelectMaxBalance={() => {\n if (tokenBalance !== '0') {\n setInputAmount(tokenBalanceReal.split(',').join(''));\n }\n }}\n />\n <SwitchFromAndToButton />\n </FromContainer>\n <SwapInput\n sharpBottomStyle={!!quote?.result || 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 error: priceImpactOutputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n onClickToken={() => navigate(navigationRoutes.toSwap)}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n />\n </InputsContainer>\n <div className=\"quote__container\">\n <QuoteInfo\n quote={quote}\n loading={fetchingQuote}\n error={quoteError}\n warning={quoteWarning}\n type=\"basic\"\n refetchQuote={fetchQuote}\n showWarningModal={showQuoteWarningModal}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={() => {\n setShowQuoteWarningModal(false);\n setQuoteWarningsConfirmed(true);\n navigate(navigationRoutes.confirmSwap);\n }}\n onChangeSettings={() => navigate(navigationRoutes.settings)}\n />\n </div>\n </Container>\n </Layout>\n );\n}\n", "import { ReverseIcon, styled } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../store/quote';\n\nconst SwitchButtonContainer = styled('div', {\n position: 'absolute',\n bottom: '-12px',\n left: '50%',\n transform: 'translate(-50%, 10%)',\n cursor: 'pointer',\n});\n\nconst 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 '&:hover': {\n color: '$secondary500',\n },\n});\n\nexport function SwitchFromAndToButton() {\n const switchFromAndTo = useQuoteStore.use.switchFromAndTo();\n\n return (\n <SwitchButtonContainer>\n <StyledButton\n onClick={() => {\n switchFromAndTo();\n }}>\n <ReverseIcon size={12} />\n </StyledButton>\n </SwitchButtonContainer>\n );\n}\n", "import type { QuoteError, QuoteWarning } from '../types';\nimport type { Token } from 'rango-sdk';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useSettingsStore } from '../store/settings';\nimport { QuoteErrorType } from '../types';\nimport { debounce } from '../utils/common';\nimport { isPositiveNumber } from '../utils/numbers';\nimport { generateQuoteWarnings } from '../utils/quote';\nimport { createQuoteRequestBody } from '../utils/swap';\nimport { tokensAreEqual } from '../utils/wallets';\n\nimport {\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap/useConfirmSwap.helpers';\nimport { useFetchQuote } from './useFetchQuote';\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: () => void;\n loading: boolean;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n};\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(): UseSwapInput {\n const { fetch: fetchQuote, cancelFetch } = useFetchQuote();\n const { liquiditySources, enableNewLiquiditySources, experimental } =\n useAppStore().config;\n const tokens = useAppStore().tokens();\n const {\n fromToken,\n toToken,\n inputAmount,\n inputUsdValue,\n resetQuote,\n setQuote,\n } = useQuoteStore();\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n disabledLiquiditySources,\n } = useSettingsStore();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<QuoteError | null>(null);\n const [warning, setWarning] = useState<QuoteWarning | null>(null);\n const userSlippage = customSlippage ?? slippage;\n const hasTokensValue = !fromToken || !toToken;\n const shouldSkipRequest =\n hasTokensValue ||\n tokensAreEqual(fromToken, toToken) ||\n !isPositiveNumber(inputAmount);\n\n const resetState = (loading: boolean) => {\n setLoading(loading);\n setError(null);\n setWarning(null);\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 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,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n });\n if (experimental?.routing) {\n requestBody.experimental = true;\n }\n fetchQuote(requestBody)\n .then((res) => {\n setLoading(false);\n setQuote(res);\n throwErrorIfResponseIsNotValid(res);\n const quoteWarning = generateQuoteWarnings(res, {\n fromToken,\n toToken,\n userSlippage,\n tokens,\n });\n setWarning(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 setError(quoteError);\n setLoading(false);\n }\n });\n }\n };\n\n const debouncedFetch = useCallback(\n debounce((params: FetchQuoteParams) => {\n if (!shouldSkipRequest) {\n fetch(params);\n }\n }, DEBOUNCE_DELAY),\n [shouldSkipRequest]\n );\n\n useEffect(() => {\n if (!isPositiveNumber(inputAmount) || inputUsdValue?.eq(0)) {\n resetState(false);\n cancelFetch();\n return;\n }\n if (shouldSkipRequest) {\n return;\n }\n resetQuote();\n resetState(true);\n debouncedFetch({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources: enableNewLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n });\n return cancelFetch;\n }, [\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 enableNewLiquiditySources,\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: enableNewLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n }),\n loading,\n error,\n warning,\n };\n}\n", "import { i18n } from '@lingui/core';\nimport {\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Layout } from '../components/Layout';\nimport { SettingsContainer } from '../components/SettingsContainer';\nimport { useLanguage } from '../hooks/useLanguage';\n\nexport function LanguagePage() {\n const { activeLanguage, changeLanguage, languages } = useLanguage();\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: () => changeLanguage(languageItem.local),\n end: <Radio value={local} />,\n start: <SVGFlag />,\n };\n });\n\n return (\n <Layout\n header={{\n title: i18n.t('Language'),\n }}>\n <SettingsContainer>\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 </SettingsContainer>\n </Layout>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const SettingsContainer = styled('div', {\n height: '100%',\n overflow: 'hidden',\n});\n\nexport const LiquiditySourceList = styled('ul', {\n padding: '$15 $5 0',\n margin: 0,\n listStyle: 'none',\n height: '100%',\n overflowY: 'auto',\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 type { LanguageItem } from '../constants/languages';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { DEFAULT_LANGUAGE, LANGUAGES } from '../constants/languages';\nimport { useSettingsStore } from '../store/settings';\n\ninterface UseLanguage {\n languages: LanguageItem[];\n defaultLanguage: Language;\n activeLanguage: Language;\n changeLanguage: (language?: Language) => void;\n}\n\nexport function useLanguage(): UseLanguage {\n const language = useSettingsStore.use.language();\n const setLanguage = useSettingsStore.use.setLanguage();\n const languages = LANGUAGES;\n const defaultLanguage = DEFAULT_LANGUAGE;\n\n return {\n activeLanguage: language,\n languages,\n defaultLanguage,\n changeLanguage: (language) => setLanguage(language || DEFAULT_LANGUAGE),\n };\n}\n", "import type {\n LiquiditySourceType,\n UniqueSwappersGroupType,\n} from '../utils/settings';\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 } from '../components/Layout';\nimport { LoadingLiquiditySourceList } from '../components/LoadingLiquiditySourceList';\nimport { SearchInput } from '../components/SearchInput';\nimport {\n LiquiditySourceList,\n LiquiditySourceSuffix,\n NotFoundContainer,\n SettingsContainer,\n} from '../components/SettingsContainer';\nimport { useAppStore } from '../store/AppStore';\nimport { useSettingsStore } from '../store/settings';\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 [searchedFor, setSearchedFor] = useState<string>('');\n const toggleLiquiditySource = useSettingsStore.use.toggleLiquiditySource();\n const supportedUniqueSwappersGroups: Array<UniqueSwappersGroupType> =\n getUniqueSwappersGroups(swappers);\n\n const validTypes: Array<LiquiditySourceType> = [];\n if (sourceType === 'Exchanges') {\n validTypes.push('DEX');\n }\n if (sourceType === 'Bridges') {\n validTypes.push('BRIDGE');\n validTypes.push('AGGREGATOR');\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: () => toggleLiquiditySource(groupTitle),\n end: <Checkbox checked={selected} />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t(groupTitle)}\n </Typography>\n ),\n ...sourceItem,\n };\n });\n\n const searchHandler = (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 {i18n.t(hasSelectAll ? 'Deselect all' : 'Select all')}\n </Button>\n </LiquiditySourceSuffix>\n ),\n }}>\n <SettingsContainer>\n <SearchInput\n value={searchedFor}\n setValue={setSearchedFor}\n fullWidth\n color=\"light\"\n variant=\"contained\"\n placeholder={i18n.t('Search {sourceType}', { sourceType })}\n onChange={searchHandler}\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>\n {filteredList.map((sourceItem) => {\n return (\n <React.Fragment key={sourceItem.id}>\n <ListItemButton\n style={{ height: '61px' }}\n {...sourceItem}\n selected={false}\n hasDivider\n />\n </React.Fragment>\n );\n })}\n </LiquiditySourceList>\n )\n )}\n </SettingsContainer>\n </Layout>\n );\n}\n", "import { Checkbox, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { LiquiditySourceList } from '../SettingsContainer';\n\nimport { CustomeListItem } from './LoadingLiquiditySourceList.styles';\n\nconst ITEM_SKELETON_COUNT = 30;\nexport function LoadingLiquiditySourceList() {\n return (\n <LiquiditySourceList>\n {Array.from(Array(ITEM_SKELETON_COUNT), (e) => (\n <CustomeListItem\n hasDivider\n key={e}\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 { ListItem, styled } from '@rango-dev/ui';\n\nexport const CustomeListItem = styled(ListItem, {\n height: 61,\n});\n", "import { i18n } from '@lingui/core';\nimport {\n Divider,\n getCountCategories,\n SelectableCategoryList\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { BlockchainList } from '../components/BlockchainList';\nimport { Layout } 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';\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().fetchStatus;\n\n const blockchains = useAppStore().blockchains({\n type: type\n });\n\n const countActiveCategories = getCountCategories(blockchains);\n\n const showCategory = countActiveCategories !== 1;\n\n return (\n <Layout\n header={{\n title: i18n.t(`Select Blockchain`)\n }}>\n <Divider size={12} />\n\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 searchedFor={searchedFor}\n blockchainCategory={blockchainCategory}\n onChange={(blockchain) => {\n if (type === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n navigateBack();\n }}\n />\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 { Container, List } from './BlockchainList.styles';\nimport { LoadingBlockchainList } from './LoadingBlockchainList';\n\nexport function BlockchainList(props: PropTypes) {\n const { list, searchedFor, onChange, blockchainCategory } = 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 <>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </>\n );\n }\n return (\n <List 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 <Container>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={4} />\n {fetchStatus === 'loading' && <LoadingBlockchainList />}\n {fetchStatus === 'success' && renderList()}\n </Container>\n );\n}\n", "import { BlockchainCategories } from '@rango-dev/ui';\nimport { type BlockchainMeta, TransactionType } from 'rango-sdk';\n\nimport { containsText } from '../../utils/common';\n\nexport const filterByType = (\n blockchain: BlockchainMeta,\n type: string\n): boolean => {\n switch (type) {\n case BlockchainCategories.ALL:\n return true;\n case BlockchainCategories.UTXO:\n return blockchain.type === TransactionType.TRANSFER;\n case BlockchainCategories.OTHER:\n return (\n blockchain.type !== TransactionType.TRANSFER &&\n blockchain.type !== TransactionType.COSMOS &&\n blockchain.type !== TransactionType.EVM\n );\n default:\n return blockchain.type === type;\n }\n};\n\nexport const filterBlockchains = (\n list: BlockchainMeta[],\n searchedFor: string,\n blockchainType: string\n) =>\n list\n .filter((blockchain) => filterByType(blockchain, blockchainType))\n .filter(\n (blockchain) =>\n containsText(blockchain.name, searchedFor) ||\n containsText(blockchain.displayName, searchedFor)\n );\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n});\n\nexport const List = styled('ul', {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n overflowY: 'auto',\n paddingRight: '$5',\n '.image-container': {\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 } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { TokenList } from '../components/TokenList/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';\nimport { getTokensBalanceFromWalletAndSort } from '../utils/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 { connectedWallets } = useWalletsStore();\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: type,\n });\n const tokens = useAppStore().tokens({\n type,\n blockchain: selectedBlockchainName,\n searchFor: searchedFor,\n });\n const tokensList = getTokensBalanceFromWalletAndSort(\n tokens,\n connectedWallets\n );\n\n // Actions\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\n return (\n <Layout\n header={{\n title: i18n.t('Swap {type}', { type }),\n }}>\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={tokensList}\n selectedBlockchain={selectedBlockchainName}\n searchedFor={searchedFor}\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 </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 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';\n\nimport { Container } 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 <div>\n <Divider size={12} />\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={12} />\n <Container>\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 <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 ))}\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 </Container>\n </div>\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 { useSettingsStore } from '../../store/settings';\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 } = useSettingsStore();\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 Container = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: 'repeat(6, minmax(0, 1fr))',\n});\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type {\n PropTypes,\n RenderDescProps,\n TokenWithBalance,\n} from './TokenList.types';\nimport type { CommonProps } from 'react-window';\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, { forwardRef, useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useWalletsStore } from '../../store/wallets';\nimport { generateRangeColors } from '../../utils/colors';\n\nimport { LoadingTokenList } from './LoadingTokenList';\nimport {\n BalanceContainer,\n Container,\n End,\n ImageSection,\n List,\n Pin,\n Tag,\n TagTitle,\n Title,\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=\"description\">\n {name ? (\n <div className=\"token-name\">{name}</div>\n ) : (\n <Title className=\"token-title\">\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={`token-address ${!name && 'token-address-without-name'}`}>\n <a\n href={url}\n target=\"_blank\"\n rel=\"nofollow noreferrer\"\n onClick={(e) => e.stopPropagation()}>\n {length > 10\n ? `${address.slice(0, 5)}...${address.slice(length - 6, length)}`\n : address}{' '}\n <ExternalLinkIcon color=\"gray\" size={12} />\n </a>\n </div>\n )}\n </div>\n );\n};\n\nexport function TokenList(props: PropTypes) {\n const { list, searchedFor = '', onChange, selectedBlockchain } = props;\n\n const [tokens, setTokens] = useState<TokenWithBalance[]>(list);\n const fetchStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const [hasNextPage, setHasNextPage] = useState<boolean>(true);\n const loadingWallet = useWalletsStore.use.loading();\n const { isTokenPinned } = useAppStore();\n\n // eslint-disable-next-line react/display-name\n const innerElementType: React.FC<CommonProps> = forwardRef((render, ref) => {\n return (\n <div\n {...render}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref={ref as any}\n style={{\n ...render.style,\n height: `${parseFloat(render.style?.height as string) + 8 * 2}px`,\n }}\n />\n );\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]);\n\n const renderList = () => {\n if (!tokens.length && !!searchedFor) {\n return (\n <>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </>\n );\n }\n return (\n <VirtualizedList\n Item={({ index, style }) => {\n const token = tokens[index];\n\n const address = token.address || '';\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === token.blockchain\n );\n const color = generateRangeColors(\n token.symbol,\n blockchain?.color || ''\n );\n\n const customCssForTag = {\n $$color: color[`${token.symbol}100`],\n [`.${darkTheme} &`]: {\n $$color: color[`${token.symbol}900`],\n },\n backgroundColor: '$$color',\n };\n\n const customCssForTagTitle = {\n $$color: color[`${token.symbol}700`],\n [`.${darkTheme} &`]: {\n $$color: color[`${token.symbol}100`],\n },\n color: '$$color',\n };\n\n return (\n <div\n style={{\n ...style,\n paddingRight: 5,\n }}>\n <ListItemButton\n style={{\n height: style?.height,\n }}\n tab-index={index}\n key={`${token.symbol}${token.address}`}\n id={`${token.symbol}${token.address}`}\n hasDivider\n onClick={() => onChange(tokens[index])}\n start={\n <ImageSection>\n <Image src={token.image} size={30} />\n {isTokenPinned(token) && (\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={\n loadingWallet ? (\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 tokens[index]?.balance && (\n <BalanceContainer>\n <Typography variant=\"title\" size=\"small\">\n {token.balance?.amount}\n </Typography>\n <div />\n {token.balance?.usdValue && (\n <Typography\n variant=\"body\"\n className=\"usd-value\"\n size=\"xsmall\">\n {`$${token.balance?.usdValue}`}\n </Typography>\n )}\n </BalanceContainer>\n )\n )\n }\n />\n </div>\n );\n }}\n hasNextPage={hasNextPage}\n itemCount={tokens.length}\n loadNextPage={loadNextPage}\n innerElementType={innerElementType}\n size={60}\n key={`${selectedBlockchain}-${searchedFor}`}\n />\n );\n };\n\n return (\n <Container>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Token')}\n </Typography>\n <Divider size={4} />\n {fetchStatus === 'loading' && <LoadingTokenList size={PAGE_SIZE} />}\n {fetchStatus === 'success' && <List>{renderList()}</List>}\n </Container>\n );\n}\n", "import type { WidgetColors, WidgetColorsKeys } from '../types';\n\nexport const colorShade = (col: string, amt: number) => {\n const RANGE = 255;\n const COL = 3;\n const RADIX = 16;\n\n col = col.replace(/^#/, '');\n if (col.length === COL) {\n col = col[0] + col[0] + col[1] + col[1] + col[2] + col[2];\n }\n let [r, g, b]: any = col.match(/.{2}/g);\n [r, g, b] = [\n parseInt(r, RADIX) + amt,\n parseInt(g, RADIX) + amt,\n parseInt(b, RADIX) + amt,\n ];\n\n r = Math.max(Math.min(RANGE, r), 0).toString(RADIX);\n g = Math.max(Math.min(RANGE, g), 0).toString(RADIX);\n b = Math.max(Math.min(RANGE, b), 0).toString(RADIX);\n\n const rr = (r.length < 2 ? '0' : '') + r;\n const gg = (g.length < 2 ? '0' : '') + g;\n const bb = (b.length < 2 ? '0' : '') + b;\n\n return `#${rr}${gg}${bb}`;\n};\n\nexport const generateRangeColors = (name: string, color: string) => {\n const NUMBER_OF_COLORS = 10;\n const HALF_NUMBER_OF_COLORS = 5;\n const COLOR_SUFFIX = 100;\n const AMT = 25;\n\n let colors = { [name]: color };\n for (let i = 1; i < NUMBER_OF_COLORS; i++) {\n if (i < HALF_NUMBER_OF_COLORS) {\n colors = {\n ...colors,\n [name + i * COLOR_SUFFIX]: colorShade(\n color,\n (HALF_NUMBER_OF_COLORS - i) * AMT\n ),\n };\n }\n if (i === HALF_NUMBER_OF_COLORS) {\n colors = {\n ...colors,\n [name + i * COLOR_SUFFIX]: color,\n };\n }\n if (i > HALF_NUMBER_OF_COLORS) {\n colors = {\n ...colors,\n [name + i * COLOR_SUFFIX]: colorShade(\n color,\n -((i - HALF_NUMBER_OF_COLORS) * AMT)\n ),\n };\n }\n }\n\n return colors;\n};\nexport const generateColors = (\n mainColors: { [x: string]: string },\n reverseNeutralRange: boolean,\n colors?: WidgetColors\n) => {\n if (!colors || !Object.entries(colors).length) {\n return {};\n }\n let changeColors = false;\n let listOfColors = { ...mainColors };\n for (const colorKey in colors) {\n const color = colors[colorKey as WidgetColorsKeys];\n\n if (!!color && color !== mainColors[colorKey]) {\n changeColors = true;\n if (colorKey === 'background' || colorKey === 'foreground') {\n listOfColors = {\n ...listOfColors,\n [colorKey]: color,\n };\n } else if (colorKey === 'neutral' && reverseNeutralRange) {\n const range = generateRangeColors(colorKey, color);\n listOfColors = {\n ...listOfColors,\n // Reverse the neutral shade\n [`${colorKey}100`]: range[`${colorKey}900`],\n [`${colorKey}200`]: range[`${colorKey}800`],\n [`${colorKey}300`]: range[`${colorKey}700`],\n [`${colorKey}400`]: range[`${colorKey}600`],\n [`${colorKey}500`]: range[`${colorKey}500`],\n [`${colorKey}600`]: range[`${colorKey}400`],\n [`${colorKey}700`]: range[`${colorKey}300`],\n [`${colorKey}800`]: range[`${colorKey}200`],\n [`${colorKey}900`]: range[`${colorKey}100`],\n };\n } else {\n listOfColors = {\n ...listOfColors,\n ...generateRangeColors(colorKey, color),\n };\n }\n }\n }\n return changeColors ? listOfColors : {};\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 { darkTheme, styled, Typography } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\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 '& li': {\n alignItems: 'none',\n '.description': {\n position: 'relative',\n height: 12,\n width: 150,\n '.token-title': {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n bottom: '-8px',\n },\n\n '.token-address': {\n transform: 'translateY(12px)',\n visibility: 'hidden',\n '& a': {\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 },\n '.token-name': {\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 },\n },\n '&:hover': {\n '.description': {\n '.token-address': {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n visibility: 'visible',\n },\n '.token-address-without-name': {\n bottom: '-15px',\n },\n '.token-name': {\n position: 'absolute',\n transform: 'translateY(-12px)',\n visibility: 'hidden',\n },\n '.token-title': {\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\n '.usd-value': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const End = styled('ul', {\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 '.image-container': {\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", "import { i18n } from '@lingui/core';\nimport {\n ChevronRightIcon,\n Divider,\n InfoIcon,\n List,\n ListItemButton,\n Skeleton,\n Switch,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { Layout } from '../components/Layout';\nimport { SettingsContainer } from '../components/SettingsContainer';\nimport { Slippage } from '../components/Slippage';\nimport { SlippageTooltipContainer as TooltipContainer } from '../components/Slippage/Slippage.styles';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useAppStore } from '../store/AppStore';\nimport { useSettingsStore } from '../store/settings';\nimport { getContainer } from '../utils/common';\nimport { getUniqueSwappersGroups } from '../utils/settings';\n\nexport function SettingsPage() {\n const navigate = useNavigate();\n const { theme } = useAppStore().config;\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n\n const infiniteApprove = useSettingsStore.use.infiniteApprove();\n const toggleInfiniteApprove = useSettingsStore.use.toggleInfiniteApprove();\n\n const supportedUniqueSwappersGroups = getUniqueSwappersGroups(swappers);\n\n const bridgeSources = supportedUniqueSwappersGroups.filter(\n (uniqueItem) =>\n uniqueItem.type === 'BRIDGE' || uniqueItem.type === 'AGGREGATOR'\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 const totalExchangeSources = exchangeSources.length;\n const totalSelectedExchangeSources = exchangeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const handleEndItem = (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('Enabled bridges')}\n </Typography>\n ),\n end: (\n <>\n {handleEndItem(totalSelectedBridgeSources, totalBridgeSources)}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.bridges),\n };\n\n const exchangeItem = {\n id: 'exchange-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Enabled exchanges')}\n </Typography>\n ),\n end: (\n <>\n {handleEndItem(totalSelectedExchangeSources, totalExchangeSources)}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"gray\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.exchanges),\n };\n\n /*\n * const languageItem = {\n * id: 'language-item',\n * title: (\n * <Typography variant=\"title\" size=\"xmedium\">\n * {i18n.t('Language')}\n * </Typography>\n * ),\n * end: <ChevronRightIcon color=\"gray\" />,\n * onClick: () => navigate(navigationRoutes.languages),\n * };\n */\n\n const themeItem = {\n id: 'theme-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Theme')}\n </Typography>\n ),\n end: <ChevronRightIcon color=\"gray\" />,\n onClick: () => navigate(navigationRoutes.themes),\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 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 end: <Switch checked={infiniteApprove} />,\n onClick: toggleInfiniteApprove,\n };\n\n const settingItems = [\n bridgeItem,\n exchangeItem,\n // languageItem\n ];\n if (!theme?.singleTheme) {\n settingItems.push(themeItem);\n }\n settingItems.push(infiniteApprovalItem);\n\n return (\n <Layout\n header={{\n title: i18n.t('Setting'),\n }}>\n <SettingsContainer>\n <Slippage />\n <List\n type={\n <ListItemButton title=\"_\" id=\"_\" onClick={() => console.log()} />\n }\n items={settingItems}\n />\n </SettingsContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Chip,\n Divider,\n InfoIcon,\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 { useSettingsStore } from '../../store/settings';\nimport { getContainer } from '../../utils/common';\n\nimport { BaseContainer, Head, SlippageChipsContainer } from './Slippage.styles';\nimport { SlippageTooltipContent } from './SlippageTooltipContent';\n\nexport function Slippage() {\n const slippage = useSettingsStore.use.slippage();\n const setSlippage = useSettingsStore.use.setSlippage();\n const customSlippage = useSettingsStore.use.customSlippage();\n const setCustomSlippage = useSettingsStore.use.setCustomSlippage();\n\n return (\n <BaseContainer>\n <Head>\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 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 <>\n <Chip\n style={{ width: '64px', flexShrink: 0 }}\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 <Divider direction=\"horizontal\" size={8} />\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 || ''}\n color=\"dark\"\n onChange={(event) => {\n const parsedValue = parseFloat(event.target.value);\n if (\n !parsedValue ||\n (parsedValue >= MIN_SLIPPGAE && parsedValue <= MAX_SLIPPAGE)\n ) {\n setCustomSlippage(parsedValue);\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 { styled } from '@rango-dev/ui';\n\nexport const BaseContainer = styled('div', {\n paddingTop: '$5',\n paddingBottom: '30px',\n});\n\nexport const SlippageChipsContainer = styled('div', {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'start',\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: '300px',\n padding: '$10',\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. and only that step will be reverted, not the whole transaction'\n )}\n </Typography>\n </SlippageTooltipContainer>\n );\n}\n", "import { cancelSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport React from 'react';\n\nimport { SwapDetails } from '../components/SwapDetails';\nimport { SwapDetailsPlaceholder } from '../components/SwapDetails/SwapDetails.Placeholder';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { useUiStore } from '../store/ui';\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 = useUiStore.use.selectedSwapRequestId();\n const navigateBack = useNavigateBack();\n const { fetchStatus: fetchMetaStatus } = useAppStore();\n\n const showSkeleton = loading || fetchMetaStatus === 'loading';\n\n const selectedSwap = pendingSwaps.find(\n ({ swap }) => swap.requestId === requestId\n );\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 PendingSwapNetworkStatus,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n Button,\n CopyIcon,\n Divider,\n IconButton,\n QuoteCost,\n StepDetails,\n Typography,\n useCopyToClipboard,\n} from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\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 {\n numberToString,\n secondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport {\n getLastConvertedTokenInFailedSwap,\n getSwapMessages,\n shouldRetrySwap,\n} from '../../utils/swap';\nimport { getSwapDate } from '../../utils/time';\nimport { getConciseAddress, getUsdPrice } from '../../utils/wallets';\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../Layout';\nimport { QuoteSummary } from '../Quote';\nimport {\n SwapDetailsCompleteModal,\n SwapDetailsModal,\n} from '../SwapDetailsModal';\n\nimport { getSteps, getStepState, RESET_INTERVAL } from './SwapDetails.helpers';\nimport { Container, HeaderDetails, StepsList } 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 tokens = useAppStore().tokens();\n const retry = useQuoteStore.use.retry();\n const navigate = useNavigate();\n const [_, 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 getUnreadNotifications =\n useNotificationStore.use.getUnreadNotifications();\n const setAsRead = useNotificationStore.use.setAsRead();\n const unreadNotifications = getUnreadNotifications();\n const currentStep = getCurrentStep(swap);\n const currentStepNetworkStatus = currentStep?.networkStatus;\n\n useEffect(() => {\n const existNotification = unreadNotifications.find(\n (n) => n.requestId === swap.requestId\n );\n if (existNotification) {\n if (swap.status === 'success' || swap.status === 'failed') {\n setShowCompletedModal(swap.status);\n setAsRead(swap.requestId);\n }\n }\n }, [swap.status]);\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 });\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 String(\n parseFloat(\n numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n ) *\n (getUsdPrice(\n lastStep.toBlockchain,\n lastStep.toSymbol,\n lastStep.toSymbolAddress,\n tokens\n ) || 0)\n ),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const inputUsdValue = numberToString(\n String(\n parseFloat(swap.inputAmount) *\n (getUsdPrice(\n firstStep.fromBlockchain,\n firstStep.fromSymbol,\n firstStep.fromSymbolAddress,\n tokens\n ) || 0)\n ),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const percentageChange = getPriceImpact(inputUsdValue, outputUsdValue);\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 : `${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 }`;\n\n return (\n <Layout\n noPadding\n header={{\n title: i18n.t('Swap and Bridge'),\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 retry(swap, { blockchains: blockchains, tokens: tokens });\n setTimeout(() => {\n const home = '../../';\n navigate(home);\n }, 0);\n }}>\n {i18n.t('Try again')}\n </Button>\n )\n }>\n <Container>\n <HeaderDetails>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className=\"request-id\">\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {requestId}\n </Typography>\n <IconButton\n variant=\"ghost\"\n onClick={handleCopy.bind(null, requestId || '')}>\n <CopyIcon size={16} color=\"gray\" />\n </IconButton>\n </div>\n </div>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${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=\"output\">\n <QuoteCost\n fee={numberToString(\n String(totalFee),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n time={secondsToString(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 },\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 },\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=\"title-steps\">\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 />\n );\n })}\n </StepsList>\n </Container>\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 />\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 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-dev/queue-manager-rango-preset';\n\nimport { i18n } from '@lingui/core';\n\nconst MILLISECOND_PER_SECOND = 1000;\nconst SECONDS_PER_YEAR = 31536000;\nconst SECONDS_PER_MONTH = 2592000;\nconst SECONDS_PER_DAY = 86400;\nconst SECONDS_PER_HOUR = 3600;\nconst SECONDS_PER_MINUTE = 60;\n\nexport function timeSince(millisecond: number): string {\n const seconds = Math.floor(\n (Date.now() - millisecond) / MILLISECOND_PER_SECOND\n );\n\n const intervals = [\n {\n turningPoint: SECONDS_PER_YEAR,\n label: i18n.t('year'),\n pluralLabel: i18n.t('years'),\n },\n {\n turningPoint: SECONDS_PER_MONTH,\n label: i18n.t('month'),\n pluralLabel: i18n.t('months'),\n },\n {\n turningPoint: SECONDS_PER_DAY,\n label: i18n.t('day'),\n pluralLabel: i18n.t('days'),\n },\n {\n turningPoint: SECONDS_PER_HOUR,\n label: i18n.t('hour'),\n pluralLabel: i18n.t('hours'),\n },\n {\n turningPoint: SECONDS_PER_MINUTE,\n label: i18n.t('minute'),\n pluralLabel: i18n.t('minutes'),\n },\n ];\n\n const sortedIntervals = intervals.sort(\n (a, b) => b.turningPoint - a.turningPoint\n );\n\n for (const interval of sortedIntervals) {\n const { turningPoint, label, pluralLabel } = interval;\n const intervalCount = Math.floor(seconds / turningPoint);\n if (intervalCount > 1) {\n return `${intervalCount} ${pluralLabel}`;\n }\n if (intervalCount === 1) {\n return `${intervalCount} ${label}`;\n }\n }\n\n if (seconds > 1) {\n return `${seconds} ${i18n.t('seconds')}`;\n }\n\n return `${seconds} ${i18n.t('second')}`;\n}\n\nexport function getSwapDate(pendingSwap: PendingSwap) {\n return pendingSwap.finishTime\n ? i18n.t({\n id: '{time} ago',\n values: { time: timeSince(parseInt(pendingSwap.finishTime)) },\n })\n : i18n.t({\n id: '{time} ago',\n values: { time: timeSince(parseInt(pendingSwap.creationTime)) },\n });\n}\n", "import type { ModalPropTypes } from './SwapDetailsModal.types';\n\nimport { PendingSwapNetworkStatus } from '@rango-dev/queue-manager-rango-preset';\nimport { Modal } from '@rango-dev/ui';\nimport React from 'react';\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 { state, onClose, onDelete, onCancel, currentStepWallet, message } =\n props;\n\n const showWalletStateContent =\n state === PendingSwapNetworkStatus.WaitingForNetworkChange ||\n state === PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n state === PendingSwapNetworkStatus.NetworkChanged;\n\n return (\n <Modal\n open={!!state}\n onClose={onClose}\n container={document.getElementById('swap-box') || document.body}>\n {showWalletStateContent && (\n <WalletStateContent\n type={modalNetworkValues[state].type}\n title={modalNetworkValues[state].title}\n currentStepWallet={currentStepWallet}\n message={message}\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 </Modal>\n );\n}\n", "import type { CancelContentProps } 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 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 <Typography variant=\"title\" size=\"medium\" color=\"neutral100\">\n {i18n.t('Yes, Cancel it')}\n </Typography>\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, Continue')}\n </Typography>\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 <Typography variant=\"title\" size=\"medium\" color=\"neutral100\">\n {i18n.t('Yes, Delete it')}\n </Typography>\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-dev/queue-manager-rango-preset';\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';\n\nimport { MessageBox, Wallet, WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport { WalletContainer } from './SwapDetailsModal.styles';\n\nexport const WalletStateContent = (props: WalletStateContentProps) => {\n const { type, title, currentStepWallet, message, showWalletButton } = props;\n const { connect, getWalletInfo, state: walletState } = useWallets();\n const walletType = currentStepWallet?.walletType;\n const isConnected = walletType && walletState(walletType).connected;\n const state = isConnected ? WalletState.CONNECTED : WalletState.DISCONNECTED;\n return (\n <>\n <MessageBox type={type} title={title} description={message} />\n {showWalletButton && walletType && (\n <WalletContainer>\n <Wallet\n container={getContainer()}\n title={getWalletInfo(walletType).name}\n image={getWalletInfo(walletType).img}\n type={walletType}\n state={state}\n onClick={async () => connect(walletType)}\n />\n </WalletContainer>\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", "import type { CompleteModalPropTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n Modal,\n TokenAmount,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nexport function SwapDetailsCompleteModal(props: CompleteModalPropTypes) {\n const {\n open,\n onClose,\n status,\n priceValue,\n usdValue,\n token,\n chain,\n percentageChange,\n description,\n diagnosisUrl,\n } = props;\n const navigate = useNavigate();\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n container={document.getElementById('swap-box') || document.body}>\n {status === 'success' ? (\n <MessageBox type=\"success\" title={i18n.t('Swap Successful')}>\n <TokenAmount\n direction=\"vertical\"\n type=\"output\"\n centerAlign={true}\n price={{\n value: priceValue,\n usdValue,\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 <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('Diagnosis')}\n </Typography>\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 </Modal>\n );\n}\n", "import type { GetStep } from '../SwapDetailsAlerts';\nimport type { PendingSwapStep } from '@rango-dev/queue-manager-rango-preset';\nimport type { Step, StepDetailsProps } from '@rango-dev/ui';\n\nimport React from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getBlockchainShortNameFor } 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 = ({ swap, blockchains, ...args }: GetStep): Step[] => {\n const hasAlreadyProceededToSign = swap.hasAlreadyProceededToSign !== false;\n return swap.steps.map((step, index) => {\n const amountToConvert =\n index === 0 ? swap.inputAmount : swap.steps[index - 1].outputAmount;\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 },\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 },\n },\n swapper: { displayName: step.swapperId, image: step.swapperLogo ?? '' },\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 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 = (lastUrl && inProgress) || waitingForApproval;\n const error = lastUrl && step.status === 'failed';\n\n return (\n <Fragment key={key}>\n <Alert\n type={(loading && 'loading') || (error && 'error') || 'success'}\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={16} />\n </IconButton>\n )\n }\n />\n </Fragment>\n );\n })}\n {((inProgress && !hasAlreadyProceededToSign) ||\n (waitingForApproval && !step.explorerUrl?.length)) && (\n <Alert type=\"loading\" title={message.shortMessage} />\n )}\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 {\n Alert,\n ChevronDownIcon,\n ChevronUpIcon,\n IconButton,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\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 action={\n message.detailedMessage.content && (\n <IconButton\n onClick={() => setShowContentError((prev) => !prev)}\n variant=\"ghost\"\n size=\"xsmall\">\n {showContentError ? (\n <ChevronUpIcon size={12} color=\"gray\" />\n ) : (\n <ChevronDownIcon size={12} color=\"gray\" />\n )}\n </IconButton>\n )\n }\n footer={showContentError ? message.detailedMessage.content : undefined}\n />\n );\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", "import type { WaningAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { PendingSwapNetworkStatus } from '@rango-dev/queue-manager-rango-preset';\nimport { Alert, Button } from '@rango-dev/ui';\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 { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n width: '100%',\n flexDirection: 'column',\n alignItems: 'center',\n height: '0',\n flexGrow: 1,\n '& .row': {\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 '& .request-id': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '$24',\n },\n '& .output': {\n display: 'flex',\n width: '100%',\n padding: '$15 $20 $20',\n flexDirection: 'column',\n alignItems: 'start',\n },\n '& .title-steps': {\n textAlign: 'left',\n width: '100%',\n padding: '0 $20 $10',\n },\n});\n\nexport const HeaderDetails = styled('div', {\n width: '100%',\n});\n\nexport const StepsList = styled('div', {\n padding: '$0 $20 $20 $20',\n width: '100%',\n overflow: 'auto',\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", "import type { SwapDetailsPlaceholderPropTypes } from './SwapDetails.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n CopyIcon,\n IconButton,\n NotFound,\n Skeleton,\n Typography,\n} 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 HeaderDetails,\n PlaceholderContainer,\n} from './SwapDetails.styles';\n\nexport function SwapDetailsPlaceholder(props: SwapDetailsPlaceholderPropTypes) {\n const { requestId, showSkeleton } = props;\n\n return (\n <Layout\n noPadding\n header={{\n title: i18n.t('Swap and Bridge'),\n suffix: <SuffixContainer />,\n }}>\n {showSkeleton && (\n <Container>\n <HeaderDetails>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className=\"request-id\">\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <IconButton variant=\"ghost\">\n <CopyIcon size={16} color=\"gray\" />\n </IconButton>\n </div>\n </div>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Created at')}:`}\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 { ChainToken, Divider, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Container, StepSeparator } from './LoadingSwapDetails.styles';\nimport { LoadingSwapDetailStep } from './LoadingSwapDetailStep';\n\nexport function LoadingSwapDetails() {\n const quoteSummary = (\n <div className=\"quote-summary-item\">\n <div className=\"token-amount\">\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider size={8} direction=\"horizontal\" />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </div>\n <Skeleton height={12} width={64} variant=\"rounded\" />\n </div>\n );\n\n return (\n <Container>\n <div className=\"cost\">\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 </div>\n\n <div className=\"quote-summary\">\n {quoteSummary}\n <div className=\"quote-summary-separator\"></div>\n {quoteSummary}\n </div>\n\n <div className=\"swaps-steps\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n\n <div className=\"step-container\">\n <LoadingSwapDetailStep extraInfo />\n <StepSeparator />\n <LoadingSwapDetailStep />\n <StepSeparator />\n <LoadingSwapDetailStep />\n <StepSeparator />\n <LoadingSwapDetailStep />\n </div>\n </Container>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n width: '100%',\n height: '100%',\n padding: '$0 $20',\n\n '.cost': {\n paddingTop: '$15',\n display: 'flex',\n },\n\n '.quote-summary': {\n padding: '$15 $0',\n },\n\n '.quote-summary-item': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n\n '.token-amount': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n\n '.quote-summary-separator': {\n width: '0px',\n height: '$16',\n borderLeft: '1px solid $neutral400',\n marginLeft: '13px',\n },\n\n '.swaps-steps': {\n paddingBottom: '$10',\n },\n});\n\nexport const StepContainer = styled('div', {\n backgroundColor: '$neutral100',\n borderRadius: '$xm',\n padding: '$10 $15',\n\n '.step-title': {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n },\n '.step-tokens': {\n paddingTop: '$5',\n display: 'flex',\n alignItems: 'center',\n },\n '.step-token-info': {\n display: 'flex',\n alignItems: 'center',\n },\n '.step-icon-container': {\n padding: '$4 $6',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n\n '.extra-info': {\n display: 'flex',\n paddingTop: '$10',\n paddingBottom: '$5',\n },\n});\nexport const StepSeparator = styled('div', {\n width: '0px',\n height: '$20',\n borderLeft: '1px dashed $neutral700',\n marginLeft: '25px',\n});\n", "import type { StepSkeletonPropsTypes } from './LoadingSwapDetails.types';\n\nimport { ChainToken, Divider, NextIcon, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { StepContainer } from './LoadingSwapDetails.styles';\n\nexport function LoadingSwapDetailStep(props: StepSkeletonPropsTypes) {\n const { extraInfo } = props;\n return (\n <StepContainer>\n <div className=\"step-title\">\n <Skeleton height={28} width={28} variant=\"circular\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </div>\n <div className=\"step-tokens\">\n <Divider direction=\"horizontal\" size={20} />\n <div className=\"step-token-info\">\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} width={76} variant=\"rounded\" />\n </div>\n <div className=\"step-icon-container\">\n <NextIcon color=\"gray\" size={16} />\n </div>\n <div className=\"step-token-info\">\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} width={76} variant=\"rounded\" />\n </div>\n </div>\n {extraInfo && (\n <div className=\"extra-info\">\n <Divider direction=\"horizontal\" size={20} />\n <Skeleton height={22} width={297} variant=\"rectangular\" />\n </div>\n )}\n </StepContainer>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n AutoThemeIcon,\n DarkModeIcon,\n LightModeIcon,\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Layout } from '../components/Layout';\nimport { SettingsContainer } from '../components/SettingsContainer';\nimport { useSettingsStore } from '../store/settings';\n\ntype Theme = 'dark' | 'light' | 'auto';\n\nenum Mode {\n DARK = 'dark',\n LIGHT = 'light',\n AUTO = 'auto',\n}\n\nexport function ThemePage() {\n const theme = useSettingsStore.use.theme();\n const setTheme = useSettingsStore.use.setTheme();\n\n const themesList = [\n {\n id: Mode.LIGHT,\n value: Mode.LIGHT,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Light')}\n </Typography>\n ),\n onClick: () => setTheme(Mode.LIGHT as Theme),\n start: <LightModeIcon color=\"gray\" />,\n end: <Radio value={Mode.LIGHT} />,\n },\n {\n id: Mode.DARK,\n value: Mode.DARK,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Dark')}\n </Typography>\n ),\n onClick: () => setTheme(Mode.DARK as Theme),\n start: <DarkModeIcon color=\"gray\" />,\n end: <Radio value={Mode.DARK} />,\n },\n {\n id: Mode.AUTO,\n value: Mode.AUTO,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Auto')}\n </Typography>\n ),\n onClick: () => setTheme(Mode.AUTO as Theme),\n start: <AutoThemeIcon color=\"gray\" />,\n end: <Radio value={Mode.AUTO} />,\n },\n ];\n\n return (\n <Layout\n header={{\n title: i18n.t('Theme'),\n }}>\n <SettingsContainer>\n <RadioRoot\n onValueChange={(value) => setTheme(value as Theme)}\n value={theme}>\n <List\n type={\n <ListItemButton\n title={i18n.t('Theme')}\n id=\"_\"\n onClick={() => console.log()}\n />\n }\n items={themesList}\n />\n </RadioRoot>\n </SettingsContainer>\n </Layout>\n );\n}\n", "import {\n isApprovalTX,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n useEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useNotificationStore } from '../store/notification';\nimport { useWalletsStore } from '../store/wallets';\nimport { validBlockedStatuses } from '../types/notification';\n\nexport function WidgetEvents() {\n const tokens = useAppStore().tokens();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const getWalletsDetails = useWalletsStore.use.getWalletsDetails();\n const setNotification = useNotificationStore.use.setNotification();\n const setAsRead = useNotificationStore.use.setAsRead();\n const widgetEvents = useEvents();\n\n useEffect(() => {\n widgetEvents.on(MainEvents.StepEvent, (widgetEvent) => {\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], tokens);\n toAccount && getWalletsDetails([toAccount], tokens);\n }\n if (\n (event.type === StepEventType.TX_EXECUTION_BLOCKED &&\n validBlockedStatuses.includes(event.status)) ||\n event.type === StepEventType.FAILED\n ) {\n setNotification(event, route);\n } else if (\n event.type === StepEventType.TX_EXECUTION ||\n event.type === StepEventType.CHECK_STATUS\n ) {\n setAsRead(route.requestId);\n }\n });\n\n return () => widgetEvents.all.clear();\n }, [widgetEvents, connectedWallets.length]);\n\n useEffect(() => {\n widgetEvents.on(MainEvents.RouteEvent, (widgetEvent) => {\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\n return () => widgetEvents.all.clear();\n }, [widgetEvents, connectedWallets.length]);\n\n return null;\n}\n", "import {\n type Route,\n type RouteEvent,\n type Step,\n type StepEvent,\n StepExecutionBlockedEventStatus,\n} from '@rango-dev/queue-manager-rango-preset';\n\ntype NotificationRoute = {\n from: {\n blockchain: Step['fromBlockchain'];\n tokenSymbol: Step['fromSymbol'];\n tokenAddress: Step['fromSymbolAddress'];\n };\n to: {\n blockchain: Step['toBlockchain'];\n tokenSymbol: Step['toSymbol'];\n tokenAddress: Step['toSymbolAddress'];\n };\n};\n\nexport type Notification = Pick<Route, 'requestId'> & {\n event: RouteEvent | StepEvent;\n creationTime: number;\n read: boolean;\n route: NotificationRoute;\n};\n\nexport const validBlockedStatuses: StepExecutionBlockedEventStatus[] = [\n StepExecutionBlockedEventStatus.WAITING_FOR_CHANGE_WALLET_ACCOUNT,\n StepExecutionBlockedEventStatus.WAITING_FOR_NETWORK_CHANGE,\n StepExecutionBlockedEventStatus.WAITING_FOR_WALLET_CONNECT,\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 \"url('https://fonts.cdnfonts.com/css/times-new-roman')\",\n ],\n })();\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { WidgetTheme } from '../types';\n\nimport {\n createTheme,\n darkTheme as defaultDarkTheme,\n lightTheme as defaultLightTheme,\n} from '@rango-dev/ui';\nimport { useEffect, useState } from 'react';\n\nimport { useSettingsStore } from '../store/settings';\nimport {\n DEFAULT_FONT_FAMILY,\n DEFAULT_PRIMARY_RADIUS,\n DEFAULT_SECONDARY_RADIUS,\n} from '../utils/configs';\nimport { customizedThemeTokens } from '../utils/ui';\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 mode = 'auto',\n } = props;\n\n const [OSTheme, setOSTheme] = useState('light');\n const theme = useSettingsStore.use.theme();\n const setTheme = useSettingsStore.use.setTheme();\n\n const { dark, light } = customizedThemeTokens(colors);\n\n const baseTheme = createTheme({\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 (\n window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches\n ) {\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 useEffect(() => {\n if (mode !== 'auto') {\n setTheme(mode);\n }\n }, [mode]);\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 return theme === 'dark' ? darkClassNames : lightClassNames;\n };\n\n return { activeTheme: getActiveTheme };\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';\n\nimport { generateColors } from '../utils/colors';\nimport { toHash } from '../utils/hash';\n\nimport { THEME_CLASS_NAME_PREFIX } from './configs';\n\ninterface CustomizedThemeValues {\n id: string;\n tokens: Parameters<typeof createTheme>[0];\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\n const darkColorsWithDefaults = generateColors(\n {\n ...baseColors,\n ...defaultDarkColors,\n },\n true,\n colors?.dark\n );\n const lightColorsWithDefaults = generateColors(\n baseColors,\n false,\n colors?.light\n );\n const hasDefaultDarkColors = Object.keys(darkColorsWithDefaults).length > 0;\n const hasDefaultLightColors = Object.keys(lightColorsWithDefaults).length > 0;\n\n let light: CustomizedTheme['light'] = undefined;\n let dark: CustomizedTheme['dark'] = undefined;\n\n if (hasDefaultLightColors) {\n const tokens = { colors: lightColorsWithDefaults };\n const id = `${THEME_CLASS_NAME_PREFIX}-light-${toHash(tokens)}`;\n light = {\n id,\n tokens,\n };\n }\n if (hasDefaultDarkColors) {\n const tokens = {\n colors: darkColorsWithDefaults,\n };\n const id = `${THEME_CLASS_NAME_PREFIX}-dark-${toHash(tokens)}`;\n dark = {\n id,\n tokens,\n };\n }\n\n return {\n light,\n dark,\n };\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 { styled } from '@rango-dev/ui';\n\nexport const MainContainer = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n fontFamily: '$widget',\n boxSizing: 'border-box',\n '& *, *::before, *::after': {\n boxSizing: 'inherit',\n listStyleType: 'none',\n },\n '& *:focus-visible': {\n outlineColor: '$info500',\n transition: 'none',\n },\n});\n", "import type { PropTypes } from './WidgetProvider.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useMemo } from 'react';\n\nimport { DEFAULT_BASE_URL, RANGO_PUBLIC_API_KEY } from '../../constants';\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 useMemo(() => {\n initConfig({\n API_KEY: config?.apiKey || RANGO_PUBLIC_API_KEY,\n BASE_URL: config?.apiUrl || DEFAULT_BASE_URL,\n });\n }, [config]);\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 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 { useAppStore } from './store/AppStore';\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 });\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 //todo: remove Network type\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore\n wallets,\n providers: allProviders,\n switchNetwork,\n canSwitchNetworkTo,\n connect,\n state,\n isMobileWallet,\n };\n\n return (\n <ManagerProvider\n queuesDefs={[swapQueueDef]}\n context={context}\n onPersistedDataLoaded={(manager) => {\n checkWaitingForNetworkChange(manager);\n }}\n isPaused={false}>\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 { useWalletsStore } from '../../store/wallets';\nimport { getPendingSwaps } from '../../utils/queue';\nimport { calculateWalletUsdValue } from '../../utils/wallets';\n\nexport const WidgetInfoContext = createContext<\n WidgetInfoContextInterface | undefined\n>(undefined);\n\nexport function WidgetInfo(props: React.PropsWithChildren) {\n const { manager } = useManager();\n const swaps = getPendingSwaps(manager);\n const details = useWalletsStore.use.connectedWallets();\n const isLoading = useWalletsStore.use.loading();\n const totalBalance = calculateWalletUsdValue(details);\n const refetch = useWalletsStore.use.getWalletsDetails();\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n const value = {\n swaps,\n wallets: {\n isLoading,\n details,\n totalBalance,\n refetch,\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"],
5
- "mappings": "iFAgCA,OACE,cAAAA,GACA,kBAAAC,GACA,iBAAAC,GACA,mCAAAC,GACA,4BAAAC,GACA,aAAaC,OACR,wCACP,OAAS,cAAAC,OAAkB,2BC9B3B,OAAS,UAAAC,GAAQ,YAAAC,OAAgB,2BACjC,OAAS,mBAAAC,OAAuB,YAChC,OAAOC,IAAS,iBAAAC,GAAe,aAAAC,GAAW,UAAAC,OAAc,QCRxD,OAAS,aAAAC,OAAiB,QCA1B,OAAS,UAAAC,OAAc,UACvB,OAAS,yBAAAC,OAA6B,qBCLtC,OAAS,eAAAC,OAAmB,YCArB,IAAMC,GAAuB,uCACvBC,GAAmB,6BCMhC,IAAIC,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,GAC3BC,GAAsB,SAEtBC,GAA0B,eFnCvC,IAAIC,GAESC,GAAcC,EAAA,IACrBF,KAGJA,GAAQ,IAAIG,GAAYC,GAAU,SAAS,EAAGA,GAAU,UAAU,CAAC,EAC5DJ,IALkB,eGY3B,OAAS,eAAeK,OAAoB,gBAC5C,OAAS,sBAAAC,OAA0B,2BACnC,OACE,qBAAAC,GACA,kCAAAC,GACA,gBAAAC,GACA,4BAAAC,GACA,YAAAC,OACK,4BACP,OAAOC,OAAe,eACtB,OAAS,sBAAAC,OAA0B,cC5BnC,OAAOC,OAAe,eAEf,IAAMC,GAAO,IAAID,GAAU,CAAC,ECFnC,OAAS,eAAAE,OAAmB,4BAErB,IAAMC,GAAmB,CAACD,GAAY,IAAI,ECEjD,OAAS,aAAAE,OAAiB,eAKnB,IAAMC,GAAkBC,EAACC,GAAsB,CACpD,IAAMC,GAAWD,EAAI,IAAI,SAAS,EAAE,SAAS,EAAG,GAAG,EAInD,MAAO,GAHS,UAAUA,EAAI,IAAI,SAAS,CAAC,EACzC,SAAS,EACT,SAAS,EAAG,GAAG,KACGC,GACvB,EAN+B,mBAQlBC,EAAiBH,EAAA,CAC5BI,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,MAIJ,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,kBAoIvB,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,oBAIzB,SAASG,GACdC,EACAC,EAAmB,EACX,CACR,IAAMC,EAAS,WAAWF,CAAY,EACtC,GAAI,MAAME,CAAM,EACd,OAAOF,EAGT,IAAMG,EAAa,KAAK,IAAI,GAAIF,CAAgB,EAEhD,OADsB,KAAK,MAAMC,EAASC,CAAU,EAAIA,GACnC,SAAS,CAChC,CAZgBR,EAAAI,GAAA,sBHtIT,SAASK,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,EACmB,CACnB,OAAOD,EACJ,OAAQE,GAAW,CAACC,GAAiB,SAASD,CAAqB,CAAC,EACpE,OAAQA,GAAW,CAClB,GAAM,CAAE,gBAAAE,EAAiB,iBAAAC,CAAiB,EAAIN,EAAcG,CAAM,EAC5D,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,CAAE,KAAAC,EAAM,IAAKC,EAAO,YAAAC,CAAY,EAAIb,EAAcU,CAAI,EACtDf,EAAQD,GAAuBK,EAASW,CAAI,CAAC,EACnD,MAAO,CACL,MAAOC,EACP,MAAAC,EACA,KAAME,GAAkBD,CAAW,EACnC,MAAAlB,EACA,KAAAe,CACF,CACF,CAAC,CACL,CAlCgBb,EAAAC,GAAA,8BAoCT,SAASiB,GACdC,EACkB,CAClB,GAAI,CAACA,EACH,OAAO,KAET,IAAID,EAA2C,CAAC,EAChD,OAAAA,EAAgCC,EAAqB,IAClDC,GAAmBA,EAAe,IACrC,EAEOF,CACT,CAZgBlB,EAAAkB,GAAA,iCAcT,SAASG,GACdf,EACAgB,EACAC,EACAC,EACAf,EACU,CACV,IAAMgB,EAAmB,CAAC,EAE1B,SAASC,EAAWf,EAAkBgB,EAAiB,CAIrD,GAAI,CAHiC,CAAC,CAACF,EAAO,KAC3CG,GAAYA,EAAQ,QAAUjB,CACjC,EACmC,CACjC,IAAMkB,EAAqB,CACzB,QAAAF,EACA,MAAOhB,EACP,WAAYL,CACd,EAEAmB,EAAO,KAAKI,CAAU,EAE1B,CAbS7B,EAAA0B,EAAA,cAeT,IAAMP,EAAuBK,GAAuB,CAAC,EAErD,OAAAF,EAAS,QAASM,GAAY,CAC5B,GAAM,CAAE,QAAAD,EAAS,QAAAhB,CAAQ,EAAImB,GAAmBF,CAAO,EAEjDG,EAAgBZ,EAAqB,OAAS,EAC9Ca,EAAcb,EAAqB,SAASR,CAAO,EACnDsB,EAAYtB,IAAYuB,GAAS,QAQvC,GANEH,GAAiB,CAACC,GAAe,CAACC,EAOlC,OASF,IAAME,EACJxB,IAAYuB,GAAS,SAAWE,GAAaT,CAAO,EACtD,GAAIM,GAAa,CAACE,EAChB,OAGsBZ,EAAe,SAASZ,CAAO,GAGhCwB,EACjB1B,EAKFiB,EAAWf,EAASgB,EAAQ,YAAY,CAAC,EAMNR,EAAqB,OACrDd,GAAUkB,EAAe,SAASlB,CAAK,CAC1C,EAE2B,QAASM,GAAY,CAK9Ce,EAAWf,EAASgB,EAAQ,YAAY,CAAC,CAC3C,CAAC,EAGHD,EAAWf,EAASgB,CAAO,CAE/B,CAAC,EAEMF,CACT,CAxFgBzB,EAAAqB,GAAA,iCA0FT,SAASgB,GAAkBC,EAAiC,CACjE,IAAMC,EAAoB,CAAC,EAE3B,OAAAD,GAAO,QAAQ,MAAM,QAASE,GAAS,CACrC,IAAMC,EAA4BD,EAAK,KAAK,WACtCE,EAA0BF,EAAK,GAAG,WACnCD,EAAQ,SAASE,CAAyB,GAC7CF,EAAQ,KAAKE,CAAyB,EAEnCF,EAAQ,SAASG,CAAuB,GAC3CH,EAAQ,KAAKG,CAAuB,EAIlCF,EAAK,eAAiB,MAAM,QAAQA,EAAK,aAAa,GACxDA,EAAK,cAAc,QAASG,GAAiB,CAC3C,IAAMC,EAA6BD,EAAa,KAAK,WAC/CE,EAA2BF,EAAa,GAAG,WAC5CJ,EAAQ,SAASK,CAA0B,GAC9CL,EAAQ,KAAKK,CAA0B,EAEpCL,EAAQ,SAASM,CAAwB,GAC5CN,EAAQ,KAAKM,CAAwB,CAEzC,CAAC,CAEL,CAAC,EACMN,CACT,CA5BgBvC,EAAAqC,GAAA,qBAgCT,SAASS,GACdC,EACA1C,EACA2C,EACArB,EACqB,CACrB,GAAIoB,EAAiB,SAAW,EAC9B,OAAO,KAGT,IAAME,EAAuBF,EAAiB,OAC3CzC,GAAWA,EAAO,QAAUD,CAC/B,EACA,OAAI4C,EAAqB,SAAW,EAC3B,KAIPA,EACG,IACE3C,GACCA,EAAO,UAAU,KACd4C,GACEvB,IAAY,MAAQuB,EAAQ,UAAYvB,GACxCA,IAAY,MACXuB,EAAQ,UAAYvB,GACpBuB,EAAQ,SAAWF,CACzB,GAAK,IACT,EACC,OAAQE,GAAYA,IAAY,IAAI,EACpC,KACC,CAACC,EAAGC,IAAM,WAAWA,GAAG,QAAU,GAAG,EAAI,WAAWD,GAAG,QAAU,GAAG,CACtE,EACC,KAAK,IAAM,EAAI,GAAK,IAE3B,CAnCgBnD,EAAA8C,GAAA,wBAqCT,SAASO,GACdzB,EACA0B,EACA,CACA,OACE1B,EAAQ,UAAY0B,EAAgB,SACpC1B,EAAQ,QAAU0B,EAAgB,OAClC1B,EAAQ,aAAe0B,EAAgB,UAE3C,CATgBtD,EAAAqD,GAAA,6BAWT,SAASE,GACdC,EACAC,EACgB,CAChB,GAAM,CAAE,WAAYpD,EAAO,SAAAqD,EAAW,CAAC,CAAE,EAAIF,EAC7C,OACEE,GAAU,IAAKC,IAAkB,CAC/B,MAAAtD,EACA,OAAQsD,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,SACEE,GACExD,EACAsD,EAAa,MAAM,OACnBA,EAAa,MAAM,QACnBF,CACF,GAAK,IACT,EAAE,GAAK,CAAC,CAEZ,CA1BgBzD,EAAAuD,GAAA,kBA4BT,SAASO,GACdR,EACiB,CACjB,MAAO,CAAE,GAAGA,EAAiB,QAAS,GAAO,MAAO,EAAK,CAC3D,CAJgBtD,EAAA8D,GAAA,6BAMT,IAAMC,GAA0B/D,EAACsD,GAAuC,CAC7E,IAAMU,EAAyB,IAAI,IAa7BC,EAZmCX,GAAiB,OACxD,CAACY,EAAwBC,IAChBD,EAAI,UACRE,GAAMA,EAAE,UAAYD,EAAQ,SAAWC,EAAE,QAAUD,EAAQ,KAE9D,IAAM,GACF,CAAC,GAAGD,EAAKC,CAAO,EAChBD,EAEN,CAAC,CACH,GAEiD,IAAK7D,GAAU,CAC9D,IAAMgE,EAAuC,CAC3C,KAAMhE,EAAM,MACZ,SAAU,CAAC,CACb,EACA,OAAK2D,EAAuB,IAAI3D,EAAM,OAAO,GAC3C2D,EAAuB,IAAI3D,EAAM,OAAO,EAE1C2D,EAAuB,QAASM,GAAmB,CAC7CjE,EAAM,UAAYiE,GACpBD,EAAyB,SAAS,KAAKhE,CAAK,CAEhD,CAAC,EACMgE,CACT,CAAC,EACKE,EAAQC,EACZP,GACI,QAASb,GAAMA,EAAE,QAAQ,GACzB,QAASD,GAAMA,GAAG,QAAQ,GAC1B,IAAKC,GACL,IAAIQ,GAAUR,GAAG,QAAUqB,EAAI,EAAE,aAAarB,GAAG,UAAY,CAAC,CAChE,GACE,OAAO,CAACD,EAAGC,IAAMD,EAAE,KAAKC,CAAC,EAAGqB,EAAI,GAAKA,EAC3C,EAAE,SAAS,EAEX,OAAOC,GAA4BH,CAAK,CAC1C,EAxCuC,2BA0CvC,SAASG,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,CAJS5E,EAAA0E,GAAA,+BA8BF,IAAMG,GAAcC,EAAA,CACzBC,EACAC,EACAC,EACAC,IAEcA,GAAW,KACtBC,GACCA,EAAE,aAAeJ,GACjBI,EAAE,QAAQ,YAAY,IAAMH,GAAQ,YAAY,GAChDG,EAAE,UAAYF,CAClB,GACc,UAAY,KAZD,eAcdG,GAAsBN,EAAA,CACjCO,EACAC,IACY,CACZ,IAAMC,EAA8BC,GAClC,OAAO,QAAQH,CAAW,EACvB,IAAI,CAAC,CAAC,CAAEI,CAAc,IAAMA,CAAc,EAC1C,OAAOC,EAAkB,CAC9B,EACA,OACEH,GACAA,EAA4BD,CAAM,GAAG,YAEzC,EAbmC,uBA6B5B,SAASK,GACdC,EACAC,EACoB,CACpB,OAAOD,EAAO,IAAI,CAAC,CAAE,QAAAE,EAAS,GAAGC,CAAW,IAAM,CAChD,IAAMC,EAAcC,EAClB,IAAIC,GACFC,GACEN,EACAE,EAAW,WACXA,EAAW,OACXA,EAAW,OACb,GAAG,QAAUK,EACf,CACF,EAEIC,EAAgB,GACpB,OAAIN,EAAW,WACbM,EAAgBJ,EACd,IAAIC,GACFC,GACEN,EACAE,EAAW,WACXA,EAAW,OACXA,EAAW,OACb,GAAG,QAAUK,EACf,EAAE,aAAaL,EAAW,QAAQ,CACpC,GAGK,CACL,GAAGA,EACH,GAAIC,IAAgB,KAAO,CACzB,QAAS,CAAE,OAAQA,EAAa,SAAUK,CAAc,CAC1D,CACF,CACF,CAAC,CACH,CArCgBC,EAAAX,GAAA,wBAuCT,SAASY,GACdX,EACAC,EACA,CACA,IAAMW,EACJX,EAAiB,OAAS,EACtBF,GAAqBC,EAAQC,CAAgB,EAC7CD,EACN,OAAAY,EAAK,KAAK,CAACC,EAAQC,IACbD,EAAO,SAAS,UAAYC,EAAO,SAAS,SAE5C,WAAWA,EAAO,QAAQ,QAAQ,EAClC,WAAWD,EAAO,QAAQ,QAAQ,EAIlC,CAACA,EAAO,SAAS,UAAYC,EAAO,SAAS,SACxC,EAGLD,EAAO,SAAS,UAAY,CAACC,EAAO,SAAS,SACxC,GAGL,CAACD,EAAO,SAAS,UAAY,CAACC,EAAO,SAAS,SAE9C,WAAWA,EAAO,SAAS,QAAU,GAAG,EACxC,WAAWD,EAAO,SAAS,QAAU,GAAG,EAIrC,CACR,EAEMD,CACT,CAnCgBF,EAAAC,GAAA,qCAuDT,SAASI,GACdC,EACAC,EACA,CACA,OACED,GAAQ,aAAeC,GAAQ,YAC/BD,GAAQ,SAAWC,GAAQ,QAC3BD,GAAQ,UAAYC,GAAQ,OAEhC,CATgBC,EAAAH,GAAA,kBAWT,SAASI,GACdC,EACmB,CACnB,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,CAhBgBL,EAAAC,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,IAAQ,IAAI,OAAOD,CAAc,IAAIE,GACjD,CAbgBX,EAAAM,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,CAdgBb,EAAAY,GAAA,cIniBhB,IAAMK,GAAkBC,EAA2CC,GAAc,CAC/E,IAAIC,EAAQD,EACZC,EAAM,IAAM,CAAC,EACb,QAASC,KAAK,OAAO,KAAKD,EAAM,SAAS,CAAC,EACvCA,EAAM,IAAYC,CAAC,EAAI,IAAMD,EAAOE,GAAMA,EAAED,CAAmB,CAAC,EAGnE,OAAOD,CACT,EARwB,mBAUjBG,GAAQN,GRiCR,IAAMO,EAAkBC,GAC7BC,GAAqB,EACnBC,GAAsB,CAACC,EAAKC,KAAS,CACnC,iBAAkB,CAAC,EACnB,kBAAmB,GACnB,QAAS,GACT,cAAe,CAACC,EAAUC,IAAW,CACnC,IAAMC,EAAoBH,EAAI,EAAE,kBAChCD,EAAKK,IAAW,CACd,QAAS,GACT,iBAAkBA,EAAM,iBACrB,OAAQC,GAAWA,EAAO,aAAeJ,EAAS,CAAC,EAAE,UAAU,EAC/D,OACCA,EAAS,IAAKK,GAAY,CACxB,IAAMC,EAA6B,CAACH,EAAM,iBAAiB,KACxDI,GACCA,EAAgB,QAAUF,EAAQ,OAClCE,EAAgB,QACpB,EACA,MAAO,CACL,SAAU,CAAC,EACX,QAASF,EAAQ,QACjB,MAAOA,EAAQ,MACf,YAAa,KACb,WAAYA,EAAQ,WACpB,SAAUC,EACV,QAAS,GACT,MAAO,EACT,CACF,CAAC,CACH,CACJ,EAAE,EACFJ,EAAkBF,EAAUC,CAAM,CACpC,EACA,iBAAmBO,GAAe,CAChCV,EAAKK,GAAU,CACb,IAAMM,EAAkBN,EAAM,iBAC3B,OACEI,GACCA,EAAgB,UAChBA,EAAgB,aAAeC,CACnC,EACC,IAAKE,GAAmBA,EAAe,KAAK,EAC/C,MAAO,CACL,iBAAkBP,EAAM,iBACrB,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,CACL,CACF,CAAC,CACH,EACA,cAAgBI,GACdb,EAAKK,IAAW,CACd,iBAAkBA,EAAM,iBAAiB,IAAKI,GAAoB,CAChE,IAAMK,EAAiB,CAAC,CAACD,EAAQ,KAC9BP,GACCA,EAAO,QAAUG,EAAgB,OACjCH,EAAO,aAAeG,EAAgB,YACtCA,EAAgB,QACpB,EACMM,EAAoB,CAAC,CAACF,EAAQ,KACjCP,GACCA,EAAO,QAAUG,EAAgB,OACjCH,EAAO,aAAeG,EAAgB,YACtC,CAACA,EAAgB,QACrB,EACA,OAAIK,EACK,CAAE,GAAGL,EAAiB,SAAU,EAAM,EACpCM,EACF,CAAE,GAAGN,EAAiB,SAAU,EAAK,EAGvCA,CACT,CAAC,CACH,EAAE,EACJ,qBAAsB,IACpBT,EAAI,KAAO,CACT,iBAAkB,CAAC,EACnB,gBAAiB,CAAC,CACpB,EAAE,EACJ,kBAAmB,MAAOE,EAAUC,EAAQa,EAAc,KAAS,CACjE,IAAMZ,EAAoBH,EAAI,EAAE,kBAChCD,EAAKK,IAAW,CACd,QAAS,GACT,iBAAkBA,EAAM,iBAAiB,IAAKC,GACrCJ,EAAS,KAAMK,GACpBU,GAA0BV,EAASD,CAAM,CAC3C,EACI,CAAE,GAAGA,EAAQ,QAAS,EAAK,EAC3BA,CACL,CACH,EAAE,EACF,GAAI,CACF,IAAMY,EAAOhB,EAAS,IAAI,CAAC,CAAE,QAAAiB,EAAS,MAAAC,CAAM,KAAO,CACjD,QAAAD,EACA,WAAYC,CACd,EAAE,EAEIC,GADW,MAAMC,GAAY,EAAE,kBAAkBJ,CAAI,GACzB,QAClC,GAAIG,EACFrB,EAAKK,IAAW,CACd,QAAS,GACT,iBAAkBA,EAAM,iBAAiB,IACtCI,GAAoB,CACnB,IAAMc,EAAiBrB,EAAS,KAAMK,GACpCU,GAA0BV,EAASE,CAAe,CACpD,EACMe,EAA0BH,EAAiB,KAC9CI,GACCA,EAAQ,UAAYhB,EAAgB,SACpCgB,EAAQ,aAAehB,EAAgB,KAC3C,EACA,OACEe,GAAyB,QACzBD,GACAP,GAEAZ,EAAkB,CAACmB,CAAc,EAAGpB,EAAQ,EAAK,EAE5CoB,GAAkBC,EACrB,CACE,GAAGf,EACH,YAAae,EAAwB,YACrC,SAAUE,GACRF,EACArB,CACF,EACA,QAAS,EACX,EACAM,CACN,CACF,CACF,EAAE,MAEF,OAAM,IAAI,MAAM,kBAAkB,CAEtC,MAAE,CACAT,EAAKK,IAAW,CACd,QAAS,GACT,iBAAkBA,EAAM,iBAAiB,IAAKoB,GACrCvB,EAAS,KAAMK,GACpBU,GAA0BV,EAASkB,CAAO,CAC5C,EACIE,GAA0BF,CAAO,EACjCA,CACL,CACH,EAAE,CACJ,CACF,CACF,EAAE,CACJ,CACF,ESpNA,OAAS,gBAAAG,OAAoB,0BActB,SAASC,GACdC,EACAC,EACqB,CACrB,IAAMC,EAAMC,GAAa,CACvB,eAAgB,CACd,cAAeF,GAAS,wBAA0B,EACpD,CACF,CAAC,EAED,GAAID,EAAW,CACb,IAAMI,EAAyC,CAAC,EAEhD,OAAAJ,EAAU,QAASK,GAAsB,CAIvC,GAAI,OAAOA,GAAsB,SAAU,CACzC,IAAMC,EAAwCJ,EAAI,KAAMK,GAC/CA,EAAS,OAAO,OAASF,CACjC,EACGC,EACFF,EAAkB,KAAKE,CAAM,EAE7B,QAAQ,KACN,iBAAiBD,gEACnB,OAIFD,EAAkB,KAAKC,CAAiB,CAE5C,CAAC,EACMD,EAGT,OAAOF,CACT,CArCgBM,EAAAT,GAAA,6BAuCT,SAASU,GACdC,EACAT,EACU,CAKV,OAJkBF,GAA0BW,EAAQT,CAAO,EACnC,IAAKM,GACpBA,EAAS,OAAO,IACxB,CAEH,CATgBC,EAAAC,GAAA,6BV5CT,SAASE,GACdC,EACAC,EACA,CACA,IAAMC,EAAuBC,EAAgB,IAAI,qBAAqB,EAClEC,EAAyCC,GAC3C,OACAJ,CACF,EAEA,OAAAK,GAAU,IAAM,CACdJ,EAAqB,EACrBE,EAAoBC,GAA0BL,EAAW,CACvD,uBAAwBC,GAAS,sBACnC,CAAC,CACH,EAAG,CAACD,GAAW,MAAM,CAAC,EAEf,CACL,UAAWI,CACb,CACF,CApBgBG,EAAAR,GAAA,sBWNhB,OAAOS,IAAS,iBAAAC,GAAe,cAAAC,GAAY,UAAAC,OAAc,QCEzD,OAAS,UAAAC,OAAc,UCFhB,IAAMC,GAA+B,CAC1C,OAAQ,GACR,aAAc,GACd,0BAA2B,EAC7B,EAQaC,GAITC,EAAA,CAACC,EAAaC,EAAKC,KACd,CACL,OAAQ,CAAE,GAAGL,GAAgB,GAAGG,CAAY,EAG5C,aAAeG,GAA6B,CAC1C,IAAMC,EAAgBF,EAAI,EAAE,OAE5BD,EAAI,CACF,OAAQ,CACN,GAAGG,EACH,GAAGD,CACL,CACF,CAAC,CACH,CACF,GAfE,qBCnBG,SAASE,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,IAAMG,EAAef,EAAA,IAC1B,SAAS,eAAe,UAAU,EADR,gBC7B5B,OAAS,UAAAgB,OAAc,UACvB,OAAS,WAAAC,GAAS,yBAAAC,OAA6B,qBCF/C,OAAS,WAAAC,GAAS,UAAAC,GAAQ,YAAAC,GAAU,WAAAC,OAAe,gBAS5C,IAAMC,GAA4B,CACvC,CAAE,MAAO,UAAW,MAAO,UAAW,MAAO,KAAM,QAASJ,EAAQ,EACpE,CAAE,MAAO,UAAW,MAAO,aAAW,MAAO,KAAM,QAASG,EAAQ,EACpE,CAAE,MAAO,SAAU,MAAO,cAAY,MAAO,KAAM,QAASF,EAAO,EACnE,CAAE,MAAO,WAAY,MAAO,qBAAO,MAAO,KAAM,QAASC,EAAS,CACpE,EAEaG,GAAmB,KCdzB,IAAMC,GAAY,CAAC,GAAK,EAAQ,CAAI,EAE9BC,GAAmB,EAEnBC,GAAgB,EAEhBC,GAAe,IAEfC,GAAe,EFkCrB,IAAMC,EAAmBC,GAC9BC,GAAsB,EACpBC,GACEC,GAAsB,CAACC,EAAKC,KAAS,CACnC,qBAAsB,CAAC,EACvB,SAAUC,GACV,eAAgB,KAChB,gBAAiB,GACjB,aAAc,KACd,iBAAkB,KAClB,iBAAkB,KAClB,yBAA0B,CAAC,EAC3B,MAAO,OACP,SAAUC,GACV,uBAAyBC,GAAe,CACtC,IAAMC,EAA8BJ,EAAI,EAAE,qBAW1C,GAT2BI,EAA4B,KACrD,CAACC,EAAqBC,IAAU,CAC9B,IAAMC,EAAmBF,IAAwBF,EAC3CK,EAAkBF,GAAS,GAAuB,EAExD,OAAOC,GAAoBC,CAC7B,CACF,EAGE,OAGF,IAAMC,EACJL,EAA4B,OAAQC,GAG3B,EAFkBA,IAAwBF,EAGlD,EAEHJ,EAAI,KAAO,CACT,qBAAsB,CAACI,EAAY,GAAGM,CAAwB,CAChE,EAAE,CACJ,EACA,YAAcC,GACZX,EAAI,KAAO,CACT,SAAUW,CACZ,EAAE,EACJ,kBAAoBC,GAClBZ,EAAI,KAAO,CACT,eAAgBY,CAClB,EAAE,EACJ,gBAAkBC,GAChBb,EAAI,KAAO,CACT,aAAAa,CACF,EAAE,EACJ,oBAAsBC,GACpBd,EAAI,KAAO,CACT,iBAAAc,CACF,EAAE,EAEJ,oBAAsBC,GACpBf,EAAI,KAAO,CACT,iBAAAe,CACF,EAAE,EACJ,0BAA2B,CAACC,EAAUC,IACpCjB,EAAKkB,GAAU,CACb,GAAID,EACF,MAAO,CAAE,yBAA0B,CAAC,CAAE,EAExC,IAAME,EAAgBC,GACpBJ,EAAS,IAAKK,GAAYA,EAAQ,YAAY,CAChD,EAEA,OACEF,EAAc,SAAWD,EAAM,yBAAyB,OAEjD,CAAE,yBAA0B,CAAC,CAAE,EAGjC,CACL,yBAA0BC,CAC5B,CACF,CAAC,EACH,sBAAuB,IACrBnB,EAAKkB,IAAW,CACd,gBAAiB,CAACA,EAAM,eAC1B,EAAE,EACJ,sBAAwBI,GACtBtB,EAAKkB,GACCA,EAAM,yBAAyB,SAASI,CAAI,EACvC,CACL,yBAA0BJ,EAAM,yBAAyB,OACtDK,GAAoBA,GAAmBD,CAC1C,CACF,EAEK,CACL,yBACEJ,EAAM,yBAAyB,OAAOI,CAAI,CAC9C,CACD,EACH,SAAWE,GACTxB,EAAI,KAAO,CACT,MAAAwB,CACF,EAAE,EACJ,YAAcC,GACZzB,EAAI,KAAO,CACT,SAAAyB,CACF,EAAE,CACN,EAAE,EACF,CACE,KAAM,gBACN,cAAe,EACjB,CACF,CACF,CACF,EGhJO,SAASC,GACdC,EAC2B,CAC3B,IAAMC,EACJC,EAAiB,IAAI,yBAAyB,EAC1CC,EAAoBH,EAAS,IAAKI,GAAYA,EAAQ,YAAY,EAElEC,EAAgE,CAAC,EAIvE,OAFoBC,GAAoBN,EAAS,IAAKO,GAAMA,EAAE,YAAY,CAAC,EAE/D,IAAKC,GAAoB,CACnC,IAAMC,EAAcT,EAAS,KAC1BI,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,CAACX,EAAyB,SAClCQ,EAAY,YACd,CACF,CAAC,CACH,CAAC,EAGP,CAAC,EAEMJ,CACT,CAzCgBQ,EAAAd,GAAA,2BA2CT,SAASe,GACdC,EACAC,EACA,CACA,OAAID,EAAE,aAAeC,EAAE,aACd,GAGLD,EAAE,aAAeC,EAAE,aACd,EAGF,CACT,CAbgBH,EAAAC,GAAA,oCCvBT,IAAMG,GAKTC,EAAA,CAACC,EAAKC,KAAS,CAEjB,aAAc,CAAC,EACf,QAAS,CAAC,EACV,eAAgB,CAAC,EACjB,UAAW,CAAC,EACZ,YAAa,UAEb,YAAcC,GAAY,CACxB,IAAMC,EAAuBF,EAAI,EAAE,aAEnC,GAAI,CAACC,GAAW,CAACA,GAAS,KACxB,OAAOC,EAGT,IAAMC,EAASH,EAAI,EAAE,OACfI,GACHH,EAAQ,OAAS,SACdE,EAAO,MAAM,YACbA,EAAO,IAAI,cAAgB,CAAC,EAalC,OAXaD,EAAqB,OAAQG,GAEtC,EAAAD,EAA+B,OAAS,GACxC,CAACA,EAA+B,SAASC,EAAW,IAAI,EAM3D,CAGH,EACA,OAASJ,GAAY,CACnB,IAAMK,EAAkBN,EAAI,EAAE,QAE9B,GAAI,CAACC,GAAW,CAACA,GAAS,KACxB,OAAOK,EAGT,IAAMH,EAASH,EAAI,EAAE,OACfO,GACHN,EAAQ,OAAS,SAAWE,EAAO,MAAM,OAASA,EAAO,IAAI,SAC9D,CAAC,EACGK,EAAcR,EAAI,EAAE,YAAY,CACpC,KAAMC,EAAQ,IAChB,CAAC,EAuED,OArEaK,EACV,OAAQG,GAGLF,EAA0B,OAAS,GACnC,CAACA,EAA0B,KAAMG,GACxBC,GAAeD,EAAOD,CAAK,CACnC,GAMGR,EAAQ,YAAcQ,EAAM,aAAeR,EAAQ,YAMvD,CAACO,EAAY,KAAMH,GACVA,EAAW,OAASI,EAAM,UAClC,EAEM,GAILR,EAAQ,UAER,GAAAW,GAAaH,EAAM,OAAQR,EAAQ,SAAS,GAC5CW,GAAaH,EAAM,SAAW,GAAIR,EAAQ,SAAS,GACnDW,GAAaH,EAAM,MAAQ,GAAIR,EAAQ,SAAS,GAQ7C,EACR,EACA,KAAK,CAACY,EAAGC,IAEJd,EAAI,EAAE,cAAca,CAAC,EAChB,GAELb,EAAI,EAAE,cAAcc,CAAC,GAKrBD,EAAE,gBACG,EAELC,EAAE,iBAKF,CAACD,EAAE,SAAWC,EAAE,QACX,GAELD,EAAE,SAAW,CAACC,EAAE,QACX,EAGF,CACR,CAGL,EACA,cAAgBL,GACC,CAAC,CAACT,EAAI,EAAE,OAAO,cAAc,KAAMe,GAChDJ,GAAeI,EAAaN,CAAK,CACnC,EAGF,SAAU,IAAM,CACd,GAAM,CACJ,OAAQ,CAAE,0BAAAO,EAA2B,iBAAAC,CAAiB,CACxD,EAAIjB,EAAI,EAuBR,OAjBiBA,EAAI,EAAE,UAAU,OAAQkB,GAAY,CACnD,IAAMC,EAAyCF,GAAkB,SAC/DC,EAAQ,YACV,EAOA,OAJEF,GACA,CAACC,GACDA,EAAiB,SAAW,EAG1B,CAACE,EACDA,CACN,CAAC,EAE+B,KAAKC,EAAgC,CAGvE,EAEA,MAAO,SAAY,CACjB,GAAI,CACF,IAAMC,EAAW,MAAMC,GAAI,EAAE,eAAe,EAE5CvB,EAAI,CAAE,YAAa,SAAU,CAAC,EAC9B,IAAMS,EAAgC,CAAC,EACjCe,EAAkB,CAAC,EACnBC,EAAyBH,EAAS,cAClCI,EAA0BJ,EAAS,SAEnCK,EAAiC,IAAI,IAE3CL,EAAS,OAAO,QAASZ,GAAU,CACjCiB,EAA+B,IAAIjB,EAAM,UAAU,EAEnDc,EAAO,KAAKd,CAAK,CACnB,CAAC,EAEDY,EAAS,YAAY,QAAShB,GAAe,CAEzCA,EAAW,SACXqB,EAA+B,IAAIrB,EAAW,IAAI,GAElDG,EAAY,KAAKH,CAAU,CAE/B,CAAC,EAGDG,EAAY,KAAK,CAACK,EAAGC,IAAMD,EAAE,KAAOC,EAAE,IAAI,EAE1Cf,EAAI,CACF,aAAcS,EACd,QAASe,EACT,eAAgBC,EAChB,UAAWC,CACb,CAAC,CACH,OAASE,EAAP,CACA,MAAA5B,EAAI,CAAE,YAAa,QAAS,CAAC,EACvB4B,CACR,CACF,CACF,GApMI,mBPpBG,SAASC,GAAeC,EAA4B,CACzD,OAAOC,GAAsB,EAAE,IAAIC,KAAO,CACxC,GAAGC,GAAgB,GAAGD,CAAC,EACvB,GAAGE,GAAkBJ,EAAa,GAAGE,CAAC,CACxC,EAAE,CACJ,CALgBG,EAAAN,GAAA,kBDXT,IAAMO,GAAkBC,GAA+B,IAAI,EAE3D,SAASC,GAAc,CAC5B,IAAMC,EAAQC,GAAWJ,EAAe,EAExC,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,8CAA8C,EAGhE,OAAOA,EAAM,CACf,CARgBE,EAAAH,EAAA,eAUT,SAASI,GAAiBC,EAA8B,CAC7D,IAAMC,EAAcC,GAAiB,EAErC,OAAKD,EAAY,UACfA,EAAY,QAAUE,GAAeH,EAAM,MAAM,GAIjDI,GAAA,cAACX,GAAgB,SAAhB,CAAyB,MAAOQ,EAAY,SAC1CD,EAAM,QACT,CAEJ,CAZgBF,EAAAC,GAAA,oBZAT,IAAMM,GAAgBC,GAAsC,CACjE,gBAAiB,IAAM,CAEvB,CACF,CAAC,EAED,SAASC,GAAKC,EAAqC,CACjD,IAAMC,EAAeC,EAAY,EAAE,aAC7BC,EAAcD,EAAY,EAAE,YAAY,EACxCE,EAASF,EAAY,EAAE,OAAO,EAC9BG,EAAkC,CACtC,uBAAwBL,EAAM,QAAQ,sBACxC,EACM,CAAE,UAAAM,CAAU,EAAIC,GAAmBP,EAAM,OAAO,QAASK,CAAa,EACtEG,EAAmBC,EAAgB,IAAI,iBAAiB,EACxDC,EAAgBD,EAAgB,IAAI,cAAc,EAClDE,EAAyBC,GAAyB,EAExDC,GAAU,IAAM,CACVb,EAAM,QACRC,EAAaD,EAAM,MAAM,CAE7B,EAAG,CAACA,EAAM,MAAM,CAAC,EAEjB,IAAMc,EAAqBX,EACxB,OAAOY,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,EACAb,EAAciB,EAAMvB,CAAM,OAE1BI,EAAiBW,CAAI,EAGzB,GAAIC,IAAUI,GAAO,UAAYF,EAAM,UAAW,CAChD,IAAMO,EAAM,GAAGV,KAAQG,EAAM,WAAWD,IAEpCC,EAAM,YACFX,EAAuB,QAC3BA,EAAuB,QAAQkB,CAAG,EAElC,QAAQ,KACN,wDACF,GAKN,GAAIT,IAAUI,GAAO,SAAWF,EAAM,QAAS,CAC7C,IAAMO,EAAM,GAAGV,KAAQG,EAAM,UACvBX,EAAuB,QAC3BA,EAAuB,QAAQkB,CAAG,EAElC,QAAQ,KAAK,wDAAwD,EAKrE7B,EAAM,eACRA,EAAM,cAAcmB,EAAMC,EAAOC,EAAOC,EAAOC,CAAI,CAEvD,EA5CoC,iBA6CpC,OACEO,GAAA,cAACjC,GAAc,SAAd,CAEC,MAAO,CACL,gBAAkBkC,GAAY,CAC5BpB,EAAuB,QAAUoB,CACnC,CACF,GACAD,GAAA,cAACE,GAAA,CACC,eAAgB7B,EAChB,UAAWG,EACX,cAAeW,EACf,YAAW,IACVjB,EAAM,QACT,CACF,CAEJ,CApFSkB,EAAAnB,GAAA,QAsFF,SAASkC,GAAcjC,EAAqC,CACjE,GAAM,CAAE,OAAAkC,EAAQ,GAAGC,CAAW,EAAInC,EAClC,OACE8B,GAAA,cAACM,GAAA,CAAiB,OAAQF,GACxBJ,GAAA,cAAC/B,GAAA,CAAM,GAAGoC,EAAY,OAAQD,EAAQ,CACxC,CAEJ,CAPgBhB,EAAAe,GAAA,iBqB/GhB,OAAOI,OAAW,QCDlB,OAAS,eAAAC,OAAmB,gBAC5B,OAAOC,IAAS,cAAAC,GAAY,aAAAC,GAAW,YAAAC,OAAgB,QCAvD,OAAS,mBAAAC,OAAuB,wCAChC,OAAS,cAAAC,OAAkB,2BAC3B,OAAS,mBAAAC,OAAuB,cAChC,OAAOC,IAAS,YAAAC,OAAgB,QAChC,OAAS,gBAAAC,GAAc,sBAAAC,OAA0B,eCPjD,OAAS,cAAAC,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,uBCNhB,OAAS,aAAAY,GAAW,UAAAC,OAAc,QAClC,OACE,sBAAAC,GACA,eAAAC,GACA,mBAAAC,OACK,mBCLA,IAAMC,EAAmB,CAC9B,KAAM,IACN,SAAU,YACV,OAAQ,UACR,YAAa,cACb,SAAU,WACV,iBAAkB,oBAClB,OAAQ,SACR,QAAS,UACT,UAAW,YACX,UAAW,YACX,MAAO,QACP,QAAS,UACT,YAAa,eACb,YAAa,YACf,ECbA,OAAS,aAAAC,GAAW,WAAAC,GAAS,UAAAC,OAAc,QCQ3C,OAAOC,OAAe,eACtB,OAAS,UAAAC,OAAc,UACvB,OAAS,yBAAAC,OAA6B,qBCGtC,OAAS,yBAAAC,OAA6B,wCACtC,OAAOC,OAAe,eC0Bf,IAAKC,QACVA,IAAA,qCACAA,IAAA,iCACAA,IAAA,iDACAA,IAAA,iCAJUA,QAAA,ICtCL,SAASC,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,GACdC,EACAC,EACA,CACA,OAAOA,EAAS,KAAMC,GAAYA,EAAQ,KAAOF,CAAS,GAAG,YAC/D,CALgBH,EAAAE,GAAA,yBAOT,SAASI,GAAU,EAAUC,EAAiB,CACnD,OAAOA,EAAO,KAAMC,GAAUC,GAAeD,EAAO,CAAC,CAAC,GAAK,IAC7D,CAFgBR,EAAAM,GAAA,aAIT,SAASI,GAAeC,EAAcb,EAA+B,CAC1E,OAAOA,EAAY,KAAMC,GAAeA,EAAW,OAASY,CAAI,GAAK,IACvE,CAFgBX,EAAAU,GAAA,kBCNhB,OAAS,QAAAE,OAAY,eACrB,OAAS,4BAAAC,OAAgC,wCACzC,OAAOC,OAAe,eCxBf,SAASC,GAAmBC,EAA2C,CAC5E,IAAMC,EAAoB,CAAC,EAE3B,OAAAD,GAAO,QAAQ,MAAM,QAASE,GAAS,CACrC,IAAMC,EAA4BD,EAAK,KAAK,WACtCE,EAA0BF,EAAK,GAAG,WACpCG,EAAkBJ,EAAQA,EAAQ,OAAS,CAAC,EAC5CE,GAA6BE,GAC/BJ,EAAQ,KAAKE,CAAyB,EAExCE,EAAkBJ,EAAQA,EAAQ,OAAS,CAAC,EACxCG,GAA2BC,GAC7BJ,EAAQ,KAAKG,CAAuB,CAExC,CAAC,EACMH,CACT,CAhBgBK,EAAAP,GAAA,sBAkBT,SAASQ,GACdC,EACAC,EACS,CAGT,OAFcD,EAAM,gBACA,OAAQ,GAAM,IAAI,OAAO,CAAC,EAAE,KAAKC,CAAO,CAAC,EAAE,OAAS,CAE1E,CAPgBH,EAAAC,GAAA,kBClBhB,OAAS,QAAAG,OAAY,eAId,IAAMC,EAAgBC,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,0HACF,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,EAAc,EAAE,cAAc,MACjE,OACE,OAAOA,EAAc,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,oBH8DzB,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,EAA0C,CACtE,OACGA,GAAO,QAAQ,OAAS,CAAC,GAAG,OAAQC,GAAS,CAC5C,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,iBAiBT,SAASK,GAAqBJ,EAInC,CACA,IAAMC,GAAQD,EAAM,QAAQ,OAAS,CAAC,GAAG,OAAQC,GAAS,CACxD,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,EAAc,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,EAAc,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,EAAc,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,EAAc,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,MAAAhB,EACA,QAAAiB,EACA,MAAAC,EACA,qBAAAC,CACF,EAAIP,EACJ,OAAIC,IAAoB,UACf,CACL,MAAOO,GAAiB,EAAE,cAC1B,OAAQ,iBACR,SAAU,EACZ,EAEGN,EAQHC,GACA,CAACf,GACD,CAACA,EAAM,QACPkB,GACA,CAACF,GACDA,IAAgB,IAET,CACL,MAAOI,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,EApCS,CACL,MAAOA,GAAiB,EAAE,cAC1B,OAAQ,iBACR,SAAU,EACZ,CAiCJ,CAjEgBtB,EAAAa,GAAA,sBAmET,SAASU,GACdrB,EACAgB,EACAM,EACA,CACA,MAAO,GACJ,CAACA,GAAYA,EAAS,IAAIC,EAAI,IAC7BvB,GAAO,QACPgB,GACFA,IAAgB,KAChB,WAAWA,GAAe,GAAG,IAAM,GACjChB,EAAM,OAEZ,CAbgBF,EAAAuB,GAAA,yBAeT,SAASG,GAAgBxB,EAAiC,CAC/D,IAAMyB,EAAoB,CAAC,EAE3B,OAAAzB,GAAO,QAAQ,MAAM,QAASC,GAAS,CACrC,IAAMyB,EAA4BzB,EAAK,KAAK,WACtC0B,EAA0B1B,EAAK,GAAG,WACpC2B,EAAkBH,EAAQA,EAAQ,OAAS,CAAC,EAC5CC,GAA6BE,GAC/BH,EAAQ,KAAKC,CAAyB,EAExCE,EAAkBH,EAAQA,EAAQ,OAAS,CAAC,EACxCE,GAA2BC,GAC7BH,EAAQ,KAAKE,CAAuB,CAExC,CAAC,EACMF,CACT,CAhBgB3B,EAAA0B,GAAA,mBAkBT,IAAMK,GAAc/B,EAAA,CACzBgC,EACAC,EACAC,EACAC,IAEcA,GAAW,KACtBC,GACCA,EAAE,aAAeJ,GACjBI,EAAE,QAAQ,YAAY,IAAMH,GAAQ,YAAY,GAChDG,EAAE,UAAYF,CAClB,GACc,UAAY,KAZD,eAepB,SAASG,GACdC,EACAH,EACW,CACX,IAAII,EAAgBd,GACpB,QAASe,EAAI,EAAGA,EAAIF,EAAK,IAAI,OAAQE,IAAK,CACxC,IAAMC,EAAMH,EAAK,IAAIE,CAAC,EACtB,GAAIC,EAAI,cAAgB,uBACtB,SAGF,IAAMC,EAAYX,GAChBU,EAAI,MAAM,WACVA,EAAI,MAAM,OACVA,EAAI,MAAM,QACVN,CACF,EACAI,EAAgBA,EAAc,KAC5B,IAAIxC,GAAU0C,EAAI,MAAM,EAAE,aAAaC,GAAa,CAAC,CACvD,EAGF,OAAOH,CACT,CAvBgBvC,EAAAqC,GAAA,mBAyBT,SAASM,GACdC,EACAT,EACW,CACX,OAAOS,EAAM,OACX,CAACC,EAAqBP,IACpBO,EAAS,KAAKR,GAAgBC,EAAMH,CAAS,CAAC,EAChDV,EACF,CACF,CATgBzB,EAAA2C,GAAA,oBAwBT,SAASG,GACdC,EAC6B,CAC7B,IAAMC,EAA6C,IAAI,IAMvD,OALAD,EAAM,QAAQ,MAAM,QAAQ,CAACE,EAAMC,IAAU,CACvCD,EAAK,qBAAqB,OAC5BD,EAAqB,IAAIE,EAAOD,EAAK,oBAAoB,QAAQ,CAErE,CAAC,EACGD,EAAqB,KAAO,EACvBA,EAEF,IACT,CAbgBG,EAAAL,GAAA,uBAeT,SAASM,GACdL,EACAM,EAC6B,CAC7B,IAAML,EAA6C,IAAI,IASvD,OARAD,EAAM,QAAQ,MAAM,QAAQ,CAACE,EAAMC,IAAU,CAEzCD,EAAK,qBAAqB,UAC1B,WAAWA,EAAK,oBAAoB,QAAQ,EAAII,GAEhDL,EAAqB,IAAIE,EAAOD,EAAK,oBAAoB,QAAQ,CAErE,CAAC,EACGD,EAAqB,KAAO,EACvBA,EAEF,IACT,CAjBgBG,EAAAC,GAAA,yBAmBT,SAASE,GACdP,EACe,CAIf,OAHkBA,EAAM,QAAQ,MAAM,IACnCQ,GAAaA,EAAS,mBACzB,GAGM,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,CAbgBN,EAAAG,GAAA,0BAeT,SAASK,GACdN,EACAO,EACA,CACA,OAAKA,EAGE,WAAWP,CAAY,GAAK,WAAWO,CAAmB,EAFxD,EAGX,CARgBT,EAAAQ,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,aAAAC,EACA,YAAAC,CACF,EAAId,EACEe,EAAqBV,GAAiB,OAC1C,CACEU,EACAC,KAECD,EAAmBC,EAAe,KAAK,EAAIA,EAAe,QAC3DD,GAEF,CAAC,CACH,EAEME,EAAyD,CAAC,EAEhEb,GAAS,QAASc,GAAW,CAC3B,IAAMC,EAAmBF,EAAiB,KACvCG,GAAoBA,EAAgB,aAAeF,EAAO,KAC7D,EACMC,EACJA,EAAiB,UAAU,KAAKD,EAAO,OAAO,EAE9CD,EAAiB,KAAK,CACpB,WAAYC,EAAO,MACnB,UAAW,CAACA,EAAO,OAAO,CAC5B,CAAC,CAEL,CAAC,EAED,IAAMG,EAAqB,CAAC,CAACR,EAEvBS,EAAsBC,IACzBV,GAAc,QAAQ,OAAS,CAAC,GAAG,OAClC,CAACW,EAAuBC,KACtBD,EAAY,KAAKC,EAAK,KAAK,WAAYA,EAAK,GAAG,UAAU,EAErDA,EAAK,eAAiB,MAAM,QAAQA,EAAK,aAAa,GACxDA,EAAK,cAAc,IAAKC,GAAiB,CACvCF,EAAY,KACVE,EAAa,KAAK,WAClBA,EAAa,GAAG,UAClB,CACF,CAAC,EAEIF,GAET,CAAC,CACH,CACF,EAkCA,MAhCsC,CACpC,OAAQrB,EAAY,SAAS,EAC7B,aAAcO,GAAgB,OAC9B,iBAAkBC,GAAoB,OACtC,iBAAkBC,GAAoB,OACtC,mBAAAS,EACA,KAAM,CACJ,QAASpB,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,GAAIK,GAAe,CAAE,YAAaA,CAAY,EAC9C,GAAIN,GAA2B,CAC7B,cAAeF,EAAyB,OAAOC,GAAoB,CAAC,CAAC,EACrE,sBAAuB,EACzB,EACA,GAAI,CAACC,GAA2B,CAC9B,cAAeD,GAAkB,OAC9BoB,GAAoB,CAACrB,EAAyB,SAASqB,CAAe,CACzE,EACA,sBAAuB,EACzB,EACA,GAAIN,GAAsB,CAAE,YAAaC,CAAoB,CAC/D,CAEF,CAjHgBM,EAAA7B,GAAA,0BAmHT,SAAS8B,GAAqBxB,EAA2B,CAiB9D,OAhBgBA,EAAgB,OAC9B,CACEU,EAGAC,KAECD,EAAmBC,EAAe,KAAK,EAAI,CAC1C,QAASA,EAAe,QACxB,WAAYA,EAAe,UAC7B,EACAD,GAEF,CAAC,CACH,CAGF,CAlBgBa,EAAAC,GAAA,wBAoBT,SAASC,GAAqBC,EAA0B,CAC7D,OAAOA,EAAM,QAAQ,cAAgB,IACvC,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,EACA1B,EACAmB,EACA,CACA,IAAMoB,EAAMb,EAAM,iBACZc,EAAkBC,GAAkBf,CAAK,EAM/C,OALuC1B,EAAgB,KACrD,CAAC0C,EAAiBC,IAChBH,EAAgB,QAAQE,EAAgB,KAAK,EAC7CF,EAAgB,QAAQG,EAAgB,KAAK,CACjD,EAEG,QAAS9B,GAAW+B,GAA2B/B,EAAQ0B,CAAG,GAAK,CAAC,CAAC,EACjE,OAAQM,GAAU,CAACA,EAAM,EAAE,EAC3B,IAAKA,GAAU,CACd,IAAMC,EAASD,EAAM,MAAM,OACrBE,EAAgBC,EACpB,IAAIlB,GAAUe,EAAM,cAAc,MAAM,EAAE,UACxC,CAACA,EAAM,cAAc,QACvB,EACA,EACA,CACF,EACMI,EAAiBD,EACrB,IAAIlB,GAAUe,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,WACZ1B,CACF,CACF,CACF,CAAC,CAEH,CAAC,CACL,CAxDgBI,EAAAe,GAAA,2BA0DT,SAASe,GACdC,EACAC,EACA,CAGA,OAFiBD,EAAe,IAAIxB,GAAUwB,CAAY,EAAIE,IAEhD,aAAaD,GAAc,CAAC,CAC5C,CAPgBhC,EAAA8B,GAAA,sBAST,SAASI,GACdC,EACS,CACT,MACE,CAAC,CAACA,GACFA,EAAgB,gBAAkB,MAClCA,EAAgB,gBAAkBC,GAAyB,cAE/D,CARgBpC,EAAAkC,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/CgB3C,EAAAqC,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,GAGJ,OAAOD,CACT,CApBgB7C,EAAA4C,GAAA,qCAsBT,SAASI,GAAgBV,EAA0B,CACxD,OACEA,EAAY,SAAW,UACvB,CAAC,CAACA,EAAY,YACd,IAAI,KAAK,EAAE,QAAQ,EAAI,SAASA,EAAY,UAAU,EAAI,EAAI,KAAO,GAEzE,CANgBtC,EAAAgD,GAAA,mBAQT,SAASC,GACdC,EACAC,EACAC,EACAjD,EACA1B,EACA4E,EACA,CACA,OACEH,GACC,CAACC,GACA,CAAClC,GAAgBd,CAAK,EAAE,MAAOmD,GAC7B7E,EAAgB,IAAKa,GAAWA,EAAO,KAAK,EAAE,SAASgE,CAAK,CAC9D,GACD,CAAC,CAACH,GAAyB,CAACC,GAC5B,CAAC,CAACD,GACD,CAAC,CAACC,GACFC,GACA,CAACE,GAAeF,EAAsBD,CAAiB,CAE7D,CApBgBpD,EAAAiD,GAAA,uBHvtBT,SAASO,GACdC,EACAC,EACAC,EACc,CACd,OAAKA,GAIHF,EAAO,KAAMG,GAAU,CACrB,IAAMC,EAAmBH,GAAc,MAAM,IAAI,EACjD,OAAIG,GAAkB,SAAW,EAE7BD,EAAM,SAAWC,EAAiB,CAAC,GACnCD,EAAM,UAAY,MAClBA,EAAM,aAAeD,EAAM,KAI7BC,EAAM,SAAWC,IAAmB,CAAC,GACrCD,EAAM,UAAYC,IAAmB,CAAC,GACtCD,EAAM,aAAeD,EAAM,IAE/B,CAAC,GAAK,IAEV,CAzBgBG,EAAAN,GAAA,uBA2BT,SAASO,GACdC,EAC2B,CAC3B,OAAOA,GAAO,QAAQ,MAAMA,GAAO,QAAQ,MAAM,OAAS,CAAC,EAAE,GAAG,QAClE,CAJgBF,EAAAC,GAAA,2BAMT,SAASE,GACdC,EACAC,EACA,CACA,IAAMC,EAAcF,EAAO,QAAQ,OAAS,CAAC,EACvCG,EAAcF,EAAO,QAAQ,OAAS,CAAC,EAC7C,OAAOC,EAAY,SAAWC,EAAY,MAC5C,CAPgBP,EAAAG,GAAA,0BAST,SAASK,GACdJ,EACAC,EACA,CACA,IAAMI,EACJL,EAAO,QAAQ,MAAM,IAAKM,GAASA,EAAK,SAAS,GAAK,CAAC,EACnDC,EACJN,EAAO,QAAQ,MAAM,IAAKK,GAASA,EAAK,SAAS,GAAK,CAAC,EACzD,MAAO,CAACE,GAASH,EAAgBE,CAAc,CACjD,CATgBX,EAAAQ,GAAA,0BAWT,SAASK,GACdT,EACAC,EACA,CACA,IAAMS,EACJV,EAAO,QAAQ,MAAM,IAAKM,GAASA,EAAK,GAAG,MAAM,GAAK,CAAC,EACnDK,EACJV,EAAO,QAAQ,MAAM,IAAKK,GAASA,EAAK,GAAG,MAAM,GAAK,CAAC,EACzD,MAAO,CAACE,GAASE,EAAqBC,CAAmB,CAC3D,CATgBf,EAAAa,GAAA,+BAWT,SAASG,GACdZ,EACAC,EACS,CACT,OACEF,GAAuBC,EAAQC,CAAM,GACrCG,GAAuBJ,EAAQC,CAAM,GACrCQ,GAA4BT,EAAQC,CAAM,CAE9C,CATgBL,EAAAgB,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,uBA2BT,SAASG,GACdC,EACAC,EACAC,EAOA,CACA,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,EAAgBC,GACpBP,EACI,CACE,WAAYG,GAAoB,MAAQ,GACxC,OAAQH,EAAmB,SAC3B,QAASA,EAAmB,eAC9B,EACA,CACE,WAAYG,GAAoB,MAAQ,GACxC,OAAQL,EAAU,WAClB,QAASA,EAAU,iBACrB,EACJD,CACF,EACMW,EAAcD,GAAUL,EAASL,CAAM,EACvCY,EAAcT,EAChBA,EAAmB,cAAgB,GACnCL,EAAY,YAEhB,MAAO,CACL,eAAgBQ,EAChB,UAAWG,EACX,aAAcD,EACd,QAASG,EACT,YAAAC,CACF,CACF,CAtDgBC,EAAAhB,GAAA,oBAwDT,SAASiB,GACdC,EACAC,EAMqB,CACrB,GAAM,CAAE,UAAAC,EAAW,QAAAZ,EAAS,OAAAL,EAAQ,aAAAkB,CAAa,EAAIF,EAC/CG,EAAgBC,GAAYH,EAAWF,EAAM,aAAa,EAC1DM,EAAiBD,GAAYf,EAASU,EAAM,QAAQ,cAAgB,EAAE,EAE5E,GAAIA,EAAM,QAAUI,GAAiBE,EAAgB,CACnD,IAAMC,EAAcC,GAClBJ,EAAc,SAAS,EACvBE,EAAe,SAAS,CAC1B,EAIA,GAFE,CAAC,CAACC,GAAeE,GAAiBL,EAAeG,CAAW,EAE3C,CACjB,IAAMG,EAAWC,GAAiBX,EAAM,OAAO,MAAOf,CAAM,EACtD2B,EAAeC,GAAoBN,CAAW,EACpD,MAAO,CACL,OACA,cAAAH,EACA,eAAAE,EACA,YAAAC,EACA,SAAAG,EACA,aAAAE,CACF,WAEOZ,EAAM,SAAW,CAACI,GAAiB,CAACE,GAC7C,MAAO,CAAE,MAAqC,EAGhD,IAAMQ,EAAsBC,GAAuBf,CAAK,EAClDgB,EAAeb,EAAec,GAEpC,GAAKC,GAAkBjB,EAAO,aAAa,SAAS,EAAGa,CAAmB,GAMnE,GACLE,GACA,WAAWF,GAAuB,GAAG,EAAIX,EAEzC,MAAO,CACL,OACA,SAAUA,EAAa,SAAS,CAClC,MAZA,OAAO,CACL,OACA,qBAAsBgB,GAAsBnB,EAAOG,CAAY,EAC/D,oBAAqBW,CACvB,EAWF,OAAO,IACT,CAzDgBhB,EAAAC,GAAA,yBA8FT,SAASqB,GACdC,EACAC,EACe,CACf,IAAMC,EACJ,OAAOD,GAAmB,SACtB,WAAWA,CAAc,GAAK,EAC9B,CAACA,GAAgB,GAAG,CAAC,EACrBE,EACJ,CAACH,GAAiB,CAACC,GAAkBC,EACjC,KACAE,GACEJ,EAAc,SAAS,EACvBC,EAAe,SAAS,CAC1B,EAEN,OAAOE,GAAoBA,EAAmB,EAAIA,EAAmB,IACvE,CAjBgBE,EAAAN,GAAA,kBD3ST,IAAMO,GAAcC,EAAA,CACzBC,EACAC,IAEAD,GAAO,SACH,IAAIE,GAAUD,GAAUE,EAAI,EAAE,aAAaH,GAAO,UAAY,CAAC,EAC/D,KANqB,eA6CdI,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,MAAO,KACP,sBAAuB,GACvB,gBAAiB,CAAC,EAClB,kBAAmB,GACnB,uBAAwB,GACxB,SAAWO,GACTD,EAAKE,GAAU,CACb,IAAIC,EAAiC,KACjCC,EAA4BT,GAChC,OAAKU,GAAiBH,EAAM,WAAW,GAGjCD,IACJE,EAAiBF,EAAM,QAAQ,aAC3B,IAAIP,GAAUO,EAAM,QAAQ,YAAY,EACxC,KACJG,EAAiBE,GACfL,EAAM,QAAQ,aACdM,GAAwBN,CAAK,GAAKC,EAAM,SAAS,QACnD,GAEK,CACL,MAAOD,EACP,GAAI,CAAC,CAACA,GAAS,CACb,aAAAE,EACA,eAAAC,CACF,CACF,GAjBS,CAAC,CAkBZ,CAAC,EACH,WAAY,IACVJ,EAAI,KAAO,CACT,MAAO,KACP,aAAc,KACd,eAAgB,IAAIN,GAAU,CAAC,CACjC,EAAE,EACJ,kBAAoBc,GAAU,CAC5BR,EAAKE,GACCA,EAAM,gBAAgB,OAASM,GAAO,KACjC,CAAC,EAGH,CACL,eAAgBA,EAChB,GAAIN,EAAM,WAAa,CACrB,MAAO,KACP,UAAW,KACX,aAAc,KACd,eAAgB,IAClB,CACF,CACD,CACH,EACA,aAAeO,GACNT,EAAKE,IAAW,CACrB,UAAWO,EAAO,MAClB,GAAIA,EAAO,OAAS,CAClB,eACEA,EAAO,KAAK,YAAY,KACrBC,GAAeA,EAAW,OAASD,EAAO,MAAM,UACnD,GAAK,IACT,EACA,GAAI,CAAC,CAACP,EAAM,aAAe,CACzB,cAAeZ,GAAYmB,EAAO,MAAOP,EAAM,WAAW,CAC5D,CACF,EAAE,EAEJ,gBAAkBM,GAAU,CAC1BR,EAAKE,GACCA,EAAM,cAAc,OAASM,GAAO,KAC/B,CAAC,EAGH,CACL,aAAcA,EACd,GAAIN,EAAM,SAAW,CACnB,MAAO,KACP,QAAS,KACT,aAAc,KACd,eAAgB,IAClB,CACF,CACD,CACH,EACA,WAAaO,GACJT,EAAI,KAAO,CAChB,QAASS,EAAO,MAChB,GAAIA,EAAO,OAAS,CAClB,aACEA,EAAO,KAAK,YAAY,KACrBC,GAAeA,EAAW,OAASD,EAAO,MAAM,UACnD,GAAK,IACT,CACF,EAAE,EAEJ,eAAiBhB,GAAW,CAC1BO,EAAKE,IAAW,CACd,YAAaT,EACb,GAAI,CAACA,GAAU,CACb,aAAc,IAAIC,GAAU,CAAC,EAC7B,eAAgB,IAAIA,GAAU,CAAC,EAC/B,MAAO,IACT,EACA,GAAI,CAAC,CAACQ,EAAM,WAAa,CACvB,cAAeZ,GAAYY,EAAM,UAAWT,CAAM,CACpD,CACF,EAAE,CACJ,EACA,MAAO,CAACkB,EAAaC,IAAS,CAC5B,GAAM,CAAE,OAAAC,EAAQ,YAAAC,CAAY,EAAIF,EAC1B,CACJ,eAAAG,EACA,UAAAC,EACA,aAAAC,EACA,QAAAC,EACA,YAAAC,CACF,EAAIC,GAAiBT,EAAaG,EAAaD,CAAM,EACrDb,EAAI,CACF,eAAAe,EACA,UAAAC,EACA,YAAAG,EACA,aAAc,KACd,cAAe7B,GAAY0B,GAAa,KAAMG,CAAW,EACzD,eAAgB,IAAIzB,GAAU,CAAC,EAC/B,aAAAuB,EACA,QAAAC,EACA,MAAO,IACT,CAAC,CACH,EACA,gBAAiB,IACflB,EAAKE,IAAW,CACd,eAAgBA,EAAM,aACtB,UAAWA,EAAM,QACjB,aAAcA,EAAM,eACpB,QAASA,EAAM,UACf,YAAaA,EAAM,cAAc,SAAS,GAAK,GAC/C,cAAeZ,GACbY,EAAM,QACNA,EAAM,cAAc,SAAS,GAAK,EACpC,CACF,EAAE,EACJ,oBAAqB,IACnBF,EAAI,KAAO,CACT,UAAW,KACX,eAAgB,KAChB,aAAc,KACd,eAAgB,KAChB,MAAO,IACT,EAAE,EACJ,kBAAmB,IACjBA,EAAI,KAAO,CACT,QAAS,KACT,aAAc,KACd,aAAc,KACd,eAAgB,KAChB,MAAO,IACT,EAAE,EACJ,wBAA0BqB,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,EACrB,CAAC,EACH,0BAA4BqB,GAC1BrB,EAAI,CAAE,uBAAwBqB,CAAK,CAAC,CACxC,EAAE,CACJ,CACF,EDhPO,SAASG,IAA0B,CACxC,GAAM,CACJ,eAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,kBAAAC,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,EAE9B,CAAE,gBAAAI,EAAiB,oBAAAC,EAAqB,oBAAAC,CAAoB,EAChEC,EAAiB,EAEbC,EAAmBC,GACvB,IAAMV,GAAQ,MAAM,OACpB,CAACA,GAAQ,MAAM,MAAM,CACvB,EACMW,EAAwBD,GAC5B,IAAMV,GAAQ,MAAM,YACpB,CAACA,GAAQ,MAAM,WAAW,CAC5B,EACMY,EAAiBF,GACrB,IAAMV,GAAQ,IAAI,OAClB,CAACA,GAAQ,IAAI,MAAM,CACrB,EACMa,EAAsBH,GAC1B,IAAMV,GAAQ,IAAI,YAClB,CAACA,GAAQ,IAAI,WAAW,CAC1B,EACMc,EAAsBC,GAA0B,MAAS,EACzDC,EAAoBD,GAA0B,MAAS,EACvDE,EAA2BF,GAA2B,MAAS,EAC/DG,EAAyBH,GAA2B,MAAS,EAEnEI,GAAU,IAAM,CACd7B,EAAeU,GAAQ,QAAQ,SAAS,GAAK,EAAE,CACjD,EAAG,CAACA,GAAQ,MAAM,CAAC,EAEnBmB,GAAU,IAAM,CACd,GAAIjB,IAAoB,UAAW,CACjC,IAAMkB,EAAQjB,EAAY,KACvBiB,GAAUA,EAAM,OAASpB,GAAQ,MAAM,UAC1C,EACMqB,EAAQjB,EAAO,KAAMkB,GACzBC,GAAeD,EAAGtB,GAAQ,MAAM,OAAS,IAAI,CAC/C,GAEIoB,GAAU,CAACA,GAASH,EAAyB,UAC/CxB,EAAkB2B,GAAS,IAAI,EAG7BC,EACF3B,EAAa,CAAE,MAAA2B,EAAO,KAAM,CAAE,YAAAlB,EAAa,OAAAC,CAAO,CAAE,CAAC,EAC5C,CAACiB,GAASP,EAAoB,SACvCpB,EAAa,CAAE,MAAO,IAAK,CAAC,EAG9BuB,EAAyB,QAAUjB,GAAQ,MAAM,WACjDc,EAAoB,QAAUd,GAAQ,MAAM,MAEhD,EAAG,CACDA,GAAQ,MAAM,OAAO,OACrBA,GAAQ,MAAM,OAAO,QACrBA,GAAQ,MAAM,OAAO,WACrBA,GAAQ,MAAM,WACdE,CACF,CAAC,EAEDiB,GAAU,IAAM,CACVxB,GAAac,IACVA,EAAiB,KAAMY,GAAUE,GAAeF,EAAO1B,CAAS,CAAC,GACpED,EAAa,CAAE,MAAO,IAAK,CAAC,GAI5BG,GAAkBc,IACfA,EAAsB,SAASd,EAAe,IAAI,GACrDJ,EAAkB,IAAI,EAG5B,EAAG,CAACgB,EAAkBE,CAAqB,CAAC,EAE5CQ,GAAU,IAAM,CACVvB,GAAWgB,IACRA,EAAe,KAAMS,GAAUE,GAAeF,EAAOzB,CAAO,CAAC,GAChEL,EAAW,CAAE,MAAO,IAAK,CAAC,GAI1BO,GAAgBe,IACbA,EAAoB,SAASf,EAAa,IAAI,GACjDN,EAAgB,IAAI,EAG1B,EAAG,CAACoB,EAAgBC,CAAmB,CAAC,EAExCM,GAAU,IAAM,CACd,GAAIjB,IAAoB,UAAW,CACjC,IAAMkB,EAAQjB,EAAY,KACvBiB,GAAUA,EAAM,OAASpB,GAAQ,IAAI,UACxC,EACMqB,EAAQjB,EAAO,KAAMkB,GACzBC,GAAeD,EAAGtB,GAAQ,IAAI,OAAS,IAAI,CAC7C,GAEIoB,GAAU,CAACA,GAASF,EAAuB,UAC7C1B,EAAgB4B,GAAS,IAAI,EAG3BC,EACF9B,EAAW,CAAE,MAAA8B,EAAO,KAAM,CAAE,YAAAlB,EAAa,OAAAC,CAAO,CAAE,CAAC,EAC1C,CAACiB,GAASL,EAAkB,SACrCzB,EAAW,CAAE,MAAO,IAAK,CAAC,EAG5B2B,EAAuB,QAAUlB,GAAQ,IAAI,WAC7CgB,EAAkB,QAAUhB,GAAQ,IAAI,MAE5C,EAAG,CACDA,GAAQ,IAAI,OAAO,OACnBA,GAAQ,IAAI,OAAO,QACnBA,GAAQ,IAAI,OAAO,WACnBA,GAAQ,IAAI,WACZE,CACF,CAAC,EAEDiB,GAAU,IAAM,CACdd,EAAgBL,GAAQ,WAAW,KAAO,IAAI,EAC9CM,EAAoBN,GAAQ,WAAW,SAAW,IAAI,EACtDO,EAAoBP,GAAQ,WAAW,SAAW,IAAI,CACxD,EAAG,CACDA,GAAQ,WAAW,IACnBA,GAAQ,WAAW,QACnBA,GAAQ,WAAW,OACrB,CAAC,CACH,CA/IgBwB,EAAAnC,GAAA,2BSThB,OAAS,UAAAoC,OAAc,UAYhB,IAAMC,GAAaC,GACxBC,GAAgB,EAAGC,IAAS,CAC1B,6BAA8B,GAC9B,sBAAuB,KACvB,YAAa,GACb,gBAAkBC,GAAcD,EAAI,CAAE,sBAAuBC,CAAU,CAAC,EACxE,eAAiBC,GAASF,EAAI,CAAE,YAAaE,CAAK,CAAC,CACrD,EAAE,CACJ,EXLO,SAASC,IAAY,CAC1B,IAAMC,EAAcC,GAAO,EAAI,EACzB,CAACC,EAAcC,CAAe,EAAIC,GAAgB,EAClDC,EAAWC,GAAY,EACvBC,EAA0BN,GAAOI,EAAS,MAAM,EAChDG,EAAkBP,GAA+B,CAAC,CAAC,EACnDQ,EAAiBC,EAAc,IAAI,eAAe,EAClDC,EAAeD,EAAc,IAAI,aAAa,EAC9CE,EAAYF,EAAc,IAAI,UAAU,EACxCG,EAAUH,EAAc,IAAI,QAAQ,EACpCI,EAAoBJ,EAAc,IAAI,kBAAkB,EACxDK,EAAeL,EAAc,IAAI,aAAa,EAC9CM,EAAkBN,EAAc,IAAI,gBAAgB,EACpDO,EAAaP,EAAc,IAAI,WAAW,EAC1CQ,EAAcR,EAAc,IAAI,YAAY,EAC5CS,EAAiBT,EAAc,IAAI,eAAe,EAClDU,EAAkBC,EAAY,EAAE,YAChCC,EAAcD,EAAY,EAAE,YAAY,EACxCE,EAASF,EAAY,EAAE,OAAO,EAC9BG,EAAkBC,GAAW,IAAI,gBAAgB,EACvD,OAAAC,GAAwB,EAExBC,GAAU,IAAM,CACd,IAAMC,EAAiC,CAAC,EACxCC,GAAmBtB,EAAwB,OAAO,EAAE,QAClD,CAACuB,EAAOC,IAAQ,CACdH,EAAOG,CAAG,EAAID,CAChB,CACF,EACAtB,EAAgB,QAAUoB,EAC1B,IAAMI,EACJ3B,EAAS,SAAS,MAAM4B,EAAiB,MAAQ,GAAG,EAAE,CAAC,GAAK,KAC1DD,GACFR,EAAgBQ,CAAS,CAE7B,EAAG,CAAC,CAAC,EAELL,GAAU,IAAM,CACd,GAAI,CAAC3B,EAAY,QAAS,CACxB,IAAIkC,EAAkB,GACpBC,EAAkB,GAClBC,EAAgB,GAChBC,EAAgB,GAChBC,EAAa,GACTC,EAAc/B,EAAgB,qBAAiC,EACjEY,IAAoB,WACtBc,EAAkB1B,EAAgB,wBAA+B,EACjE2B,EAAkB3B,EAAgB,mBAA+B,EACjE4B,EAAgB5B,EAAgB,sBAA6B,EAC7D6B,EAAgB7B,EAAgB,iBAA6B,EAC7D8B,EACE9B,EAAgB,oBAAgC,GAAKU,IAEvDgB,EAAkBzB,GAAgB,MAAQ,GAC1C0B,GACGvB,GAAW,QAAU,KACrBA,GAAW,QAAU,KAAKA,GAAW,UAAY,IACpDwB,EAAgBzB,GAAc,MAAQ,GACtC0B,GACGxB,GAAS,QAAU,KACnBA,GAAS,QAAU,KAAKA,GAAS,UAAY,IAChDyB,EAAapB,GAEff,EACE,CACE,GAAI+B,GAAmB,CACrB,iBAAwB,EAAGA,CAC7B,EACA,GAAIC,GAAmB,CACrB,YAAwB,EAAGA,CAC7B,EACA,GAAIC,GAAiB,CAAE,eAAsB,EAAGA,CAAc,EAC9D,GAAIC,GAAiB,CAAE,UAAsB,EAAGA,CAAc,EAC9D,GAAIC,GAAc,CAChB,aAAyB,EAAGA,EAAW,SAAS,CAClD,EACA,GAAIC,GAAe,CACjB,cAA0B,EAAGA,CAC/B,CACF,EACA,CAAE,QAAS,EAAK,CAClB,EAEFvC,EAAY,QAAU,EACxB,EAAG,CACDK,EAAS,SACTa,EACAT,EACAG,EACAD,EACAE,CACF,CAAC,EAEDc,GAAU,IAAM,CACd,GAAIP,IAAoB,UAAW,CACjC,IAAMc,EAAkBhC,EAAa,oBAA2B,EAC1DiC,EAAkBjC,EAAa,eAA2B,EAC1DkC,EAAgBlC,EAAa,kBAAyB,EACtDmC,EAAgBnC,EAAa,aAAyB,EACtDoC,EAAapC,EAAa,gBAA4B,EACtDO,EAAiBa,EAAY,KAChCkB,GAAeA,EAAW,OAASN,CACtC,EACMtB,EAAY6B,GAChBlB,EACAY,EACA1B,GAAkB,IACpB,EACME,EAAeW,EAAY,KAC9BkB,GAAeA,EAAW,OAASJ,CACtC,EACMvB,EAAU4B,GACdlB,EACAc,EACA1B,GAAgB,IAClB,EACMF,IACJK,EAAkBL,CAAc,EAC1BG,GACJG,EAAa,CACX,MAAOH,EACP,KAAM,CACJ,YAAaU,EACb,OAAQC,CACV,CACF,CAAC,GAGCZ,IACJK,EAAgBL,CAAY,EACtBE,GACJI,EAAW,CACT,MAAOJ,EACP,KAAM,CAAE,YAAaS,EAAa,OAAQC,CAAO,CACnD,CAAC,GAGDe,GACFnB,EAAemB,CAAU,EAG/B,EAAG,CAAClB,CAAe,CAAC,EAEb,IACT,CAhJgBsB,EAAA3C,GAAA,aFDT,SAAS4C,GAAU,CACxB,SAAAC,EACA,GAAGC,CACL,EAIG,CACD,IAAMC,EAAoBC,GAAmB,EACvCC,EAASF,EAAoBG,GAAWC,GACxCC,EAAcC,EAAY,EAAE,YAAY,EACxC,CAAE,mBAAAC,CAAmB,EAAIC,GAAW,EAE1CC,GAAoB,EAEpB,IAAMC,EAAYL,EAAY,OAAOM,EAAe,EAEpD,OAAAC,GAAgB,CACd,oBAAqBb,EAAM,oBAC3B,wBAAyBA,EAAM,wBAC/B,mBAAoBA,EAAM,mBAC1B,UAAAW,EACA,mBAAAH,CACF,CAAC,EAGCM,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACX,EAAA,KAAQJ,CAAS,EACjBE,GAAqBa,GAAA,cAACC,GAAA,IAAU,CACnC,CAEJ,CA/BgBC,EAAAlB,GAAA,acdhB,OAAOmB,OAAW,QAClB,OAAS,aAAAC,OAAiB,mBCK1B,OAAS,QAAAC,OAAY,eACrB,OAAS,cAAAC,OAAkB,iCAC3B,OACE,SAAAC,GACA,UAAAC,GACA,WAAAC,GACA,cAAAC,GACA,eAAAC,GACA,gBAAAC,GACA,UAAAC,GACA,WAAAC,GACA,cAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,IAAS,aAAAC,GAAW,mBAAAC,GAAiB,UAAAC,GAAQ,YAAAC,OAAgB,QACpE,OAAS,aAAAC,OAAiB,YAC1B,OAAS,eAAAC,OAAmB,mBClB5B,OAAS,QAAAC,OAAY,eACrB,OACE,SAAAC,GACA,iBAAAC,GACA,UAAAC,GACA,mBAAAC,GACA,mBAAAC,GACA,WAAAC,GACA,cAAAC,GACA,SAAAC,GACA,cAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,GAAS,aAAAC,GAAW,mBAAAC,GAAiB,UAAAC,GAAQ,YAAAC,OAAgB,QACpE,OAAS,eAAAC,OAAmB,mBChB5B,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,gCCNhB,UAAYI,OAAiB,8BAC7B,OACE,UAAAC,GACA,aAAAC,GACA,cAAAC,GACA,aAAAC,GACA,UAAAC,GACA,aAAAC,OACK,gBAEA,IAAMC,GAAiC,IAExCC,GAAYJ,GAAU,CAC1B,KAAM,CACJ,OAAQ,CACV,EACA,GAAI,CACF,OAAQ,yCACV,CACF,CAAC,EAEKK,GAAUL,GAAU,CACxB,KAAM,CACJ,OAAQ,yCACV,EACA,GAAI,CACF,OAAQ,CACV,CACF,CAAC,EAEYM,GAAQL,GAAO,MAAO,CACjC,QAAS,OACT,cAAe,SACf,eAAgB,SAChB,WAAY,QACd,CAAC,EAEYM,GAAgBN,GAAO,MAAO,CACzC,QAAS,OACT,IAAK,MACL,oBAAqB,6BACrB,aAAc,UAChB,CAAC,EAEYO,GAAeP,GAAO,SAAU,CAC3C,aAAc,MACd,QAAS,MACT,OAAQ,IACR,QAAS,OACT,eAAgB,SAChB,QAAS,qBACT,CAAC,IAAIH,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,UACjB,WAAY,SACZ,OAAQ,UACR,MAAO,IACP,SAAU,WAEV,UAAW,CACT,QAAS,kBACT,CAAC,IAAIA,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,EAEA,kBAAmB,CACjB,QAAS,kBACT,CAAC,IAAIA,MAAa,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,EACYW,GAAUR,GAAmB,WAAS,CACjD,QAAS,KACT,OAAQ,OACR,QAAS,OACT,MAAO,OACP,gBAAiB,cACjB,WAAY,SACd,CAAC,EAEYS,GAAiBT,GAAO,MAAO,CAC1C,QAAS,MACT,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,gBAAiB,cACjB,SAAU,WACV,MAAO,MACT,CAAC,EAEYU,GAAeV,GAAOF,GAAY,CAC7C,SAAU,WACV,KAAM,KACR,CAAC,EAEYa,GAAmBX,GAAO,MAAO,CAC5C,WAAY,MACZ,kBAAmB,CACjB,QAAS,OACT,IAAK,MACL,oBAAqB,6BACrB,aAAc,UAChB,CACF,CAAC,EAEYY,GAAkBZ,GAAmB,QAAM,CACtD,gBAAiB,cACjB,aAAc,MACd,SAAU,CACR,SAAU,CACR,KAAM,CACJ,aAAc,EACd,aAAc,gBACd,aAAc,OAChB,CACF,CACF,CACF,CAAC,EAEYa,GAA0Bb,GAAOJ,GAAQ,CACpD,MAAO,OACP,aAAc,iBACd,QAAS,iBACT,eAAgB,gBAChB,WAAY,SACZ,QAAS,qBACT,CAAC,IAAIC,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,UAEjB,UAAW,CACT,QAAS,kBACT,CAAC,IAAIA,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,EACA,kBAAmB,CACjB,aAAc,kBACd,CAAC,IAAIA,MAAa,EAAG,CACnB,aAAc,iBAChB,EACA,gBAAiB,eACjB,QAAS,CACX,CACF,CAAC,EAEYiB,GAAoBd,GAAO,MAAO,CAC7C,QAAS,SACT,qBAAsB,CACpB,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,EACA,YAAa,CAAE,WAAY,KAAM,CACnC,CAAC,EAEYe,GAAef,GAAO,MAAO,CACxC,WAAY,OAAOE,YACnB,SAAU,CACR,YAAa,CACX,KAAM,CACJ,UAAW,WACb,EACA,GAAI,CACF,UAAW,gBACb,CACF,CACF,CACF,CAAC,EAEYc,GAAgBhB,GAAO,MAAO,CACzC,QAAS,MACX,CAAC,EAEYiB,GAAkBjB,GAAOC,GAAW,CAC/C,QAAS,gBACX,CAAC,EAEYiB,GAAqBlB,GAAmB,WAAS,CAC5D,SAAU,SACV,SAAU,CACR,KAAM,CACJ,KAAM,CACJ,UAAW,GAAGG,MAAaD,eAC7B,EACA,MAAO,CACL,UAAW,GAAGE,MAAWF,eAC3B,CACF,CACF,CACF,CAAC,EAEYiB,GAAUnB,GAAO,MAAO,CAAE,SAAU,UAAW,MAAO,MAAO,CAAC,EC3M3E,OAAS,QAAAoB,OAAY,eACrB,OACE,UAAAC,GACA,WAAAC,GACA,SAAAC,GACA,cAAAC,GACA,SAAAC,GACA,oBAAAC,GACA,cAAAC,GACA,eAAAC,OACK,gBACP,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QCd3C,OAAS,eAAAC,OAAmB,gBAC5B,OAAS,cAAAC,OAAkB,2BAC3B,OACE,4BAAAC,GAEA,eAAAC,OACK,4BACP,OAAS,aAAAC,GAAW,YAAAC,OAAgB,QAWpC,IAAMC,GAAwB,OAAO,OAAOC,EAAW,EAchD,SAASC,GAAcC,EAAgB,CAC5C,GAAM,CAAE,OAAAC,EAAQ,MAAAC,EAAO,gBAAAC,EAAiB,UAAAC,CAAU,EAAIJ,EAChD,CAAE,MAAAK,EAAO,WAAAC,EAAY,cAAAC,EAAe,QAAAC,CAAQ,EAAIC,GAAW,EAC3D,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EACvCC,EAAcC,EAAY,EAAE,YAAY,EAGxCC,EACJC,GAA0Bd,GAAQ,QAAS,CACzC,uBAAwBA,GAAQ,sBAClC,CAAC,GAAKJ,GAEFmB,EAAUC,GACdZ,EACAE,EACAO,EACAZ,CACF,EAEMgB,EAAgBC,GAAkCH,CAAO,EACzD,CAACI,EAAOC,CAAQ,EAAIC,GAAS,EAAE,EAE/BC,EAA8BC,EAACC,GACnC,CAACf,EAAiB,KACfgB,GACCA,EAAgB,aAAeD,GAC/BC,EAAgB,QAAUxB,CAC9B,EALkC,+BAO9ByB,EAAcH,EAAA,MAAOI,GAAqB,CAC9C,IAAMC,EAASxB,EAAMuB,CAAI,EACzB,GAAI,CAIF,GAHIR,GACFC,EAAS,EAAE,EAETQ,EAAO,UACT,MAAMvB,EAAWsB,CAAI,MAChB,CACL,IAAME,EAA8B,CAAC,CAACd,EAAQ,KAC3Ce,GAAMA,EAAE,QAAUC,GAAY,SACjC,EACA,GAAI,CAAC/B,GAAQ,cAAgB6B,EAC3B,OAEF3B,IAAkByB,CAAI,EACtB,MAAMpB,EAAQoB,CAAI,EAClBxB,IAAYwB,CAAI,EAEpB,OAASK,EAAP,CACAZ,EAAS,UAAaY,GAAW,OAAO,CAC1C,CACF,EAtBoB,eAwBdC,EAA8BV,EAAA,IAAM,CACxC,IAAMW,EACJnB,GAAS,OAAQa,GAAWA,EAAO,QAAUG,GAAY,UAAU,GACnE,CAAC,EACH,QAAWH,KAAUM,EACd7B,EAAWuB,EAAO,IAAI,CAE/B,EAPoC,+BASpCO,GAAU,IACD,IAAM,CACXF,EAA4B,CAC9B,EACC,CAAC,CAAC,EAEL,IAAMG,EAAsBb,EAAA,CAC1BC,EACAvB,EACAU,IAGE0B,GAAoB1B,EAAaV,CAAK,GACtCqB,EAA4BE,CAAU,GACtC,CAACc,GAAyB,SAASd,CAAU,EARrB,uBAY5B,MAAO,CACL,KAAMP,EAAc,OACjBW,GAAW,CAACQ,EAAoBR,EAAO,KAAM3B,GAAS,GAAIU,CAAW,CACxE,EACA,MAAAQ,EACA,YAAAO,CACF,CACF,CAvFgBH,EAAAzB,GAAA,iBCjChB,OAAS,QAAAyC,OAAY,eACrB,OAAS,UAAAC,GAAQ,cAAAC,GAAY,UAAAC,GAAQ,eAAAC,OAAmB,gBACxD,OAAOC,IAAS,YAAAC,GAAU,YAAAC,OAAgB,QCD1C,OAAS,cAAAC,GAAY,WAAAC,GAAS,UAAAC,OAAc,gBAC5C,OAAOC,OAAW,QCJlB,OAAS,eAAAC,OAAmB,mBAErB,SAASC,IAA8B,CAC5C,IAAMC,EAAWC,GAAY,EAC7B,MAAO,IAAMD,EAAS,EAAE,CAC1B,CAHgBE,EAAAH,GAAA,mBCAhB,OAAS,mBAAAI,OAAuB,gBAChC,OAAOC,OAAW,QCHlB,OAAS,aAAAC,GAAW,cAAAC,GAAY,UAAAC,OAAc,gBAEvC,IAAMC,GAAeD,GAAOD,GAAY,CAC7C,MAAO,MACP,SAAU,WACV,QAAS,IACT,SAAU,OACZ,CAAC,EAEYG,GAAgBF,GAAO,MAAO,CACzC,SAAU,WACV,WAAY,gBACZ,CAAC,IAAIF,MAAa,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,MAAO,KACT,CAAC,EAEYI,GAA8BJ,GAAO,MAAO,CACvD,SAAU,WACV,gBAAiB,gBACjB,MAAO,OACP,OAAQ,OACR,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,aAAc,MACd,IAAK,KACL,MAAO,IACT,CAAC,EDhCD,SAASK,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,cELT,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,WAAAC,GAAS,cAAAC,OAAkB,gBACpC,OAAOC,OAAW,QAIlB,SAASC,GAAaC,EAAkB,CACtC,OACEC,GAAA,cAACC,GAAA,CACC,UAAWF,EAAM,UACjB,KAAK,MACL,QAASG,GAAK,EAAE,gBAAgB,GAChCF,GAAA,cAACG,GAAA,CAAa,QAAQ,QAAQ,KAAK,QAAQ,QAASJ,EAAM,SACvDA,EAAM,aAAeC,GAAA,cAACI,GAAA,IAAc,EACrCJ,GAAA,cAACK,GAAA,CAAW,KAAM,GAAI,MAAM,QAAQ,CACtC,CACF,CAEJ,CAZSC,EAAAR,GAAA,gBCNT,OAAS,QAAAS,OAAY,eACrB,OACE,qBAAAC,GACA,WAAAC,GACA,eAAAC,GACA,gBAAAC,GACA,WAAAC,GACA,mBAAAC,OACK,gBACP,OAAOC,OAAW,QCTlB,OAAS,QAAAC,OAAY,eACrB,OACE,cAAAC,GACA,oBAAAC,GACA,kBAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QAClB,OAAS,eAAAC,OAAmB,mBCH5B,OAAS,UAAAC,OAAc,UACvB,OAAS,WAAAC,GAAS,yBAAAC,OAA6B,qBAWxC,IAAMC,GAAuBC,GAClCC,GAA0B,EACxBC,GACEC,GAAsB,CAACC,EAAKC,KAAS,CACnC,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,KAAM,GACN,UAAWC,EAAM,UACjB,MAAO,CACL,KAAM,CACJ,WAAYC,EAAS,eACrB,aAAcA,EAAS,kBACvB,YAAaA,EAAS,UACxB,EACA,GAAI,CACF,WAAYC,EAAO,aACnB,YAAaA,EAAO,SACpB,aAAcA,EAAO,eACvB,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,UAAYG,GAAc,CACxBT,EAAKU,IAAW,CACd,cAAeA,EAAM,cAAc,IAAKF,GACtCA,EAAiB,YAAcC,EAC3B,CAAE,GAAGD,EAAkB,KAAM,EAAK,EAClCA,CACN,CACF,EAAE,CACJ,EACA,uBAAwB,IACfP,EAAI,EAAE,cAAc,OACxBO,GAAqB,CAACA,EAAiB,IAC1C,CAEJ,EAAE,EACF,CACE,KAAM,eACN,cAAe,EACjB,CACF,CACF,CACF,EC5EA,OAAS,UAAAG,OAAc,gBAEhB,IAAMC,GAAYD,GAAO,MAAO,CACrC,QAAS,MACT,MAAO,QACP,UAAW,OACb,CAAC,EAEYE,GAAOF,GAAO,KAAM,CAC/B,QAAS,EACT,OAAQ,EACR,UAAW,OAEX,kBAAmB,CACjB,UAAW,kBACb,CACF,CAAC,EAEYG,GAASH,GAAO,MAAO,CAClC,QAAS,OACT,QAAS,EACT,WAAY,SACZ,UAAW,SACb,CAAC,EAEYI,GAAoBJ,GAAO,MAAO,CAC7C,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,cAAe,SACf,QAAS,MACT,MAAO,OACP,OAAQ,OACV,CAAC,ECjCD,OAAS,QAAAK,OAAY,eACrB,OAAS,WAAAC,GAAS,sBAAAC,GAAoB,cAAAC,OAAkB,gBACxD,OAAOC,OAAW,QAIX,SAASC,IAAuB,CACrC,OACEC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAmB,MAAM,YAAY,KAAM,GAAI,EAChDF,GAAA,cAACG,GAAA,CAAQ,KAAM,GAAI,EACnBH,GAAA,cAACI,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAS,MAAM,cAC5CC,GAAK,EAAE,0BAA0B,CACpC,CACF,CAEJ,CAVgBC,EAAAP,GAAA,wBHchB,IAAMQ,GAA8B,EAE7B,SAASC,IAAsB,CACpC,IAAMC,EAAWC,GAAY,EACvBC,EAAkBC,GAAW,IAAI,gBAAgB,EAEjD,CAAE,uBAAAC,CAAuB,EAAIC,GAAqB,EAElDC,EAAgCF,EAAuB,EACvDG,EAAcC,EAAY,EAAE,YAAY,EACxCC,EAASD,EAAY,EAAE,OAAO,EAC9BE,EAAqBJ,EACxB,KAAK,CAACK,EAAGC,IAAMA,EAAE,aAAeD,EAAE,YAAY,EAC9C,MAAM,EAAGb,EAA2B,EAEjCe,EAAgBC,EAACC,GAAyC,CAC9Db,EAAgBa,CAAS,EACzBf,EAAS,GAAGgB,EAAiB,SAASD,GAAW,CACnD,EAHsB,iBAKtB,OACEE,GAAA,cAACC,GAAA,KACER,EAAmB,OAClBO,GAAA,cAACE,GAAA,KACET,EAAmB,IAAKU,GAAqB,CAC5C,IAAMC,EAAYZ,EAAO,KACtBa,GACCA,EAAU,UACRF,EAAiB,MAAM,KAAK,cAC9BE,EAAU,aACRF,EAAiB,MAAM,KAAK,YAC9BE,EAAU,SAAWF,EAAiB,MAAM,KAAK,WACrD,EAEMG,EAAiBhB,EAAY,KAChCiB,GACCA,EAAe,OAASJ,EAAiB,MAAM,KAAK,UACxD,EAEMK,EAAUhB,EAAO,KACpBa,GACCA,EAAU,UAAYF,EAAiB,MAAM,GAAG,cAChDE,EAAU,aAAeF,EAAiB,MAAM,GAAG,YACnDE,EAAU,SAAWF,EAAiB,MAAM,GAAG,WACnD,EAEMM,EAAenB,EAAY,KAC9BiB,GACCA,EAAe,OAASJ,EAAiB,MAAM,GAAG,UACtD,EAEA,OACEH,GAAA,cAACU,GAAA,CACC,IAAKP,EAAiB,UACtB,QAAS,IAAMP,EAAcO,EAAiB,SAAS,EACvD,MACEH,GAAA,cAACW,GAAA,CAAW,QAAQ,OAAO,KAAK,QAAQ,MAAM,eAC3CC,GAAK,EAAET,EAAiB,MAAM,OAAO,CACxC,EAEF,GAAIA,EAAiB,UACrB,MACEH,GAAA,cAACa,GAAA,KACCb,GAAA,cAAC,OAAI,UAAU,oBACbA,GAAA,cAACc,GAAA,CACC,WAAYV,EAAYA,EAAU,MAAQ,GAC1C,WAAYE,EAAiBA,EAAe,KAAO,GACnD,KAAK,QACP,CACF,EACAN,GAAA,cAAC,OAAI,UAAU,kBACbA,GAAA,cAACc,GAAA,CACC,WAAYN,EAAUA,EAAQ,MAAQ,GACtC,WAAYC,EAAeA,EAAa,KAAO,GAC/C,KAAK,QACP,CACF,CACF,EAEF,IAAKT,GAAA,cAACe,GAAA,CAAiB,KAAM,GAAI,MAAM,OAAO,EAChD,CAEJ,CAAC,CACH,EAEAf,GAAA,cAACgB,GAAA,IAAqB,CAE1B,CAEJ,CAvFgBnB,EAAAf,GAAA,uBItBhB,OAAS,cAAAmC,OAAkB,gBAC3B,OAAOC,OAAW,QAMX,SAASC,IAA2B,CACzC,GAAM,CAAE,uBAAAC,CAAuB,EAAIC,GAAqB,EAElDC,EAAqBF,EAAuB,EAAE,OAEpD,OAAOE,EACLC,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAS,MAAM,eAC5CH,CACH,CACF,EACE,IACN,CAZgBI,EAAAP,GAAA,4BLYT,SAASQ,GAAYC,EAA6B,CACvD,GAAM,CACJ,UAAAC,EACA,eAAAC,EACA,eAAAC,EACA,gBAAAC,EACA,qBAAAC,CACF,EAAIL,EAEJ,OACEM,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CACC,UAAWC,EAAa,EACxB,KAAK,MACL,QAASC,GAAK,EAAE,SAAS,GACzBH,GAAA,cAACI,GAAA,CACC,QAAQ,QACR,KAAK,QACL,QAASR,EACT,SAAU,CAACA,GACXI,GAAA,cAACK,GAAA,CAAY,KAAM,GAAI,MAAQT,EAA0B,QAAT,OAAkB,CACpE,CACF,EAEAI,GAAA,cAACC,GAAA,CACC,UAAWC,EAAa,EACxB,KAAK,MACL,QAASC,GAAK,EAAE,eAAe,GAC/BH,GAAA,cAACM,GAAA,CACC,MAAM,SACN,kBAAmBX,EACnB,iBAAkB,CAAE,MAAO,GAAI,KAAM,EAAG,EACxC,UAAWO,EAAa,EACxB,QAASF,GAAA,cAACO,GAAA,IAAoB,GAC9BP,GAAA,cAACI,GAAA,CACC,KAAK,QACL,QAAQ,QACR,QAASL,GACTC,GAAA,cAACQ,GAAA,CAAkB,KAAM,GAAI,MAAM,QAAQ,EAC3CR,GAAA,cAACS,GAAA,IAAyB,CAC5B,CACF,CACF,EACAT,GAAA,cAACC,GAAA,CACC,UAAWC,EAAa,EACxB,KAAK,MACL,QAASC,GAAK,EAAE,UAAU,GAC1BH,GAAA,cAACI,GAAA,CAAa,KAAK,QAAQ,QAAQ,QAAQ,QAASN,GAClDE,GAAA,cAACU,GAAA,CAAa,KAAM,GAAI,MAAM,QAAQ,CACxC,CACF,EACAV,GAAA,cAACC,GAAA,CACC,UAAWC,EAAa,EACxB,KAAK,MACL,QAASC,GAAK,EAAE,sBAAsB,GACtCH,GAAA,cAACI,GAAA,CAAa,KAAK,QAAQ,QAAQ,QAAQ,QAASP,GAClDG,GAAA,cAACW,GAAA,CAAgB,KAAM,GAAI,MAAM,QAAQ,CAC3C,CACF,CACF,CAEJ,CA7DgBC,EAAAnB,GAAA,eMnBhB,OAAS,aAAAoB,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAYD,GAAO,MAAO,CACrC,SAAU,WACV,QAAS,OACT,cAAe,SACf,aAAc,WACd,SAAU,oBACV,UAAW,yCACX,MAAO,OACP,SAAU,QACV,UAAW,QACX,QAAS,qBACT,CAAC,IAAID,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,UACjB,SAAU,CACR,YAAa,CACX,KAAM,CACJ,OAAQ,MACV,EACA,MAAO,CACL,OAAQ,MACV,CACF,CACF,CACF,CAAC,EAEYG,GAAUF,GAAO,MAAO,CACnC,oBAAqB,OACrB,qBAAsB,OACtB,QAAS,OACT,cAAe,SACf,KAAM,EACN,QAAS,kBACT,gBAAiB,cACjB,SAAU,WACV,UAAW,OACX,UAAW,SACX,SAAU,CACR,UAAW,CACT,KAAM,CACJ,QAAS,GACX,CACF,CACF,CACF,CAAC,EAEYG,GAASH,GAAO,MAAO,CAClC,gBAAiB,cACjB,qBAAsB,CACpB,QAAS,QACX,EACA,kBAAmB,CACjB,QAAS,gBACX,CACF,CAAC,EZ3CD,SAASI,GAAgBC,EAAqCC,EAAU,CACtE,GAAM,CACJ,SAAAC,EACA,OAAAC,EACA,OAAAC,EACA,UAAAC,EACA,QAAAC,EAAU,GACV,YAAAC,EAAc,EAChB,EAAIP,EACEQ,EAAmBC,EAAgB,IAAI,iBAAiB,EAExDC,EACJC,GAAW,IAAI,6BAA6B,EACxCC,EAAeC,GAAgB,EAE/BC,EAAkBC,EAAA,IAAM,CACxB,CAACL,GAAgCP,EAAO,UAC1CA,EAAO,SAAS,CAEpB,EAJwB,mBAMlBa,EACJ,OAAOb,EAAO,cAAkB,KAAeA,EAAO,cAExD,OACEc,GAAA,cAACC,GAAA,CAAU,IAAKjB,EAAK,YAAaM,EAAa,GAAG,YAChDU,GAAA,cAACE,GAAA,CACC,OAAQF,GAAA,cAAAA,GAAA,cAAGD,GAAkBC,GAAA,cAACG,GAAA,CAAW,QAASR,EAAc,CAAG,EACnE,MAAOT,EAAO,MACd,OACEc,GAAA,cAAAA,GAAA,cACGd,EAAO,OACPA,EAAO,UACNc,GAAA,cAACI,GAAA,CACC,UAAWC,EAAa,EACxB,QAASR,EACT,YAAa,CAAC,CAACN,GAAkB,OACnC,EAEDL,EAAO,UAAYc,GAAA,cAACM,GAAA,CAAa,QAASpB,EAAO,SAAU,CAC9D,EAEJ,EACAc,GAAA,cAACO,GAAA,CAAQ,UAAWnB,GAAYH,CAAS,GACvCI,GAAWF,IACXa,GAAA,cAACQ,GAAA,KACCR,GAAA,cAAC,OAAI,UAAU,mBAAmBb,CAAO,EACxCE,GACCW,GAAA,cAAC,OAAI,UAAU,gBACbA,GAAA,cAACS,GAAA,CAAQ,KAAM,GAAI,EACnBT,GAAA,cAACU,GAAA,IAAW,CACd,CAEJ,CAEJ,CAEJ,CAzDSZ,EAAAhB,GAAA,mBA2DT,IAAM6B,EAASX,GAAM,WAAWlB,EAAe,EAC/C6B,EAAO,YAAc,SaxErB,OAAS,WAAAC,GAAS,SAAAC,OAAa,gBAC/B,OAAOC,OAAW,QCDlB,OAAS,QAAAC,OAAY,eACrB,OAAS,SAAAC,GAAO,cAAAC,GAAY,eAAAC,OAAmB,gBAC/C,OAAOC,OAAW,QCJlB,OAAS,aAAAC,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,wBACd,IAAK,EACL,OAAQ,EACR,MAAO,EACP,KAAM,CACR,CAAC,EAEYE,GAAuBL,GAAO,MAAO,CAChD,QAAS,CACP,aAAc,KAChB,CACF,CAAC,ED/BM,SAASM,GAAaC,EAA0B,CACrD,GAAM,CAAE,MAAAC,EAAO,MAAAC,EAAO,MAAAC,CAAM,EAAIH,EAChC,OAAIC,IAAUG,GAAY,UAEtBC,GAAA,cAACC,GAAA,CACC,KAAK,UACL,MAAOC,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAChB,mDACF,EACF,EAIAJ,EAEAE,GAAA,cAACC,GAAA,CACC,KAAK,QACL,MAAOC,GAAK,EAAE,mBAAmB,EACjC,YACEJ,GAASI,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,IAAKR,EAAO,KAAM,GAAI,CAC/B,EACAG,GAAA,cAACM,GAAA,IAAQ,CACX,EAEJ,CAEJ,CAzCgBC,EAAAb,GAAA,gBDLT,SAASc,GAAYC,EAAkB,CAC5C,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,GAAGC,CAAW,EAAIH,EAEzC,OACEI,GAAA,cAACC,GAAA,CACC,KAAMJ,EACN,QAASC,EACT,UAAW,SAAS,eAAe,UAAU,GAAK,SAAS,MAC3DE,GAAA,cAACE,GAAA,CAAc,GAAGH,EAAY,EAC9BC,GAAA,cAACG,GAAA,CAAQ,UAAU,WAAW,KAAM,GAAI,CAC1C,CAEJ,CAZgBC,EAAAT,GAAA,edKhB,IAAMU,GAAgBC,GAAO,MAAO,CAClC,QAAS,OACT,IAAK,MACL,oBAAqB,6BACrB,aAAc,WACd,WAAY,MACZ,OAAQ,MACV,CAAC,EAEKC,GAAYD,GAAO,MAAO,CAC9B,UAAW,QACb,CAAC,EAEYE,GAAsB,IACtBC,GAAuB,IAE7B,SAASC,IAAc,CAC5B,GAAM,CAAE,OAAAC,EAAQ,YAAaC,CAAgB,EAAIC,EAAY,EACvD,CAACC,EAAWC,CAAY,EAAIC,GAAS,EAAK,EAC1C,CAACC,EAAoBC,CAAqB,EAAIF,GAAqB,EAAE,EACvEG,EAAqD,KAEnD,CAAE,KAAAC,EAAM,YAAAC,EAAa,MAAAC,CAAM,EAAIC,GAAc,CACjD,OAAAZ,EACA,gBAAkBa,GAAS,CACzBL,EAAe,WAAW,IAAM,CAC9BJ,EAAa,EAAI,EACjBG,EAAsBM,CAAI,CAC5B,EAAGf,EAAoB,CACzB,EACA,UAAW,IAAM,CACXU,GACF,aAAaA,CAAY,EAE3B,WAAW,IAAM,CACfJ,EAAa,EAAK,CACpB,EAAGP,EAAmB,CACxB,CACF,CAAC,EAEKiB,EAAiBL,EAAK,KACzBM,GAAWA,EAAO,OAAST,CAC9B,EACMU,EAAsBF,GAAgB,OAAS,GAC/CG,EACJH,GAAgB,OAASI,GAAY,cAEvC,OACEC,GAAA,cAACC,EAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,iBAAiB,CACjC,GACAF,GAAA,cAACvB,GAAA,KACCuB,GAAA,cAACG,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAAU,MAAM,UAC9CD,GAAK,EAAE,6BAA6B,CACvC,EACAF,GAAA,cAACzB,GAAA,KACEe,EAAK,IAAI,CAACM,EAAQQ,IAAU,CAC3B,IAAMC,EAAM,UAAUD,KAASR,EAAO,OACtC,OACEI,GAAA,cAACM,GAAA,CAAS,IAAKD,GACbL,GAAA,cAACO,GAAA,CACE,GAAGX,EACJ,UAAWY,EAAa,EACxB,QAAUd,GAAS,CACZH,EAAYG,CAAI,CACvB,EACA,UAAWZ,IAAoB,UACjC,CACF,CAEJ,CAAC,EACDkB,GAAA,cAACS,GAAA,CACC,KAAM,CAAC,CAACzB,EACR,QAAS,IAAMC,EAAa,EAAK,EACjC,MAAOY,EACP,MAAOC,EACP,MAAON,EACT,CACF,CACF,CACF,CAEJ,CAnEgBkB,EAAA9B,GAAA,eiB5BhB,OAAS,aAAA+B,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,wBACd,IAAK,EACL,OAAQ,EACR,MAAO,EACP,KAAM,CACR,CAAC,EAEYE,GAAuBJ,GAAO,MAAO,CAChD,QAAS,CACP,aAAc,KAChB,CACF,CAAC,EnBSM,SAASK,GAAWC,EAAkB,CAC3C,GAAM,CAAE,MAAAC,EAAO,WAAAC,EAAY,aAAAC,EAAc,MAAAC,EAAO,WAAAC,CAAW,EAAIL,EACzD,CAAE,OAAAM,CAAO,EAAIC,EAAY,EAEzBC,EAAmBC,EAAgB,IAAI,iBAAiB,EACxD,CAAE,YAAAC,CAAY,EAAIH,EAAY,EAC9B,CAACI,EAAsBC,CAAuB,EAClDC,GAAqB,EAAE,EACnB,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,EACrCC,EAAqD,KACnD,CAAE,KAAAC,EAAM,MAAAC,EAAO,YAAAC,CAAY,EAAIC,GAAc,CACjD,OAAApB,EACA,MAAAL,EACA,gBAAkB0B,GAAS,CACzBL,EAAe,WAAW,IAAM,CAC9BV,EAAwBe,CAAI,CAC9B,EAAGC,EAAoB,CACzB,EACA,UAAW,IAAM,CACXN,GACF,aAAaA,CAAY,EAE3B,WAAW,IAAM,CACfV,EAAwB,EAAE,CAC5B,EAAGiB,EAAmB,CACxB,CACF,CAAC,EACK,CAACC,EAAYC,CAAa,EAAIlB,GAAuBU,CAAI,EACzDS,EAA2BT,EAAK,OAChCU,EAAwB7B,GAAS4B,EAA2B5B,EAAQ,EAEpE8B,EAAuBC,EAAA,MAAOC,GAAmB,CACrDnB,EAA8B,EAAK,EACnCE,EAAiC,aAAa,EAC9C,GAAI,CACF,MAAMC,EAAkBgB,EAAO,WAAYA,EAAO,KAAK,EACvDjB,EAAiC,WAAW,CAC9C,MAAE,CACAA,EAAiC,UAAU,CAC7C,CACF,EAT6B,wBAW7BkB,GAAU,IAAM,CACdN,EAAeD,GAAe,CAC5B,IAAMQ,EAAsBf,EAAK,UAAWa,GAC1ClC,EAAWkC,EAAO,KAAMnC,CAAK,CAC/B,EAEA,OAAIgC,GAAyBK,EAAsB,EAC1C,CAACf,EAAKe,CAAmB,CAAC,EAAE,OACjCf,EAAK,OAAO,CAACgB,EAAGC,IAAUA,IAAUF,CAAmB,CACzD,EAEKR,EAAW,IACfW,GACClB,EAAK,KAAMmB,GAAaA,EAAS,OAASD,EAAW,IAAI,GACzDA,CACJ,CACF,CAAC,CACH,EAAG,CAAC,KAAK,UAAUlB,CAAI,CAAC,CAAC,EAEzB,IAAMoB,EAAiB,SAAS,cAAc,WAAW,EAEzD,OAAAN,GAAU,IAAM,CACd,IAAIO,EAAgD,KACpD,OACE1B,IAAkC,aAClCA,IAAkC,cAElC0B,EAAU,WACR,IAAMzB,EAAiC,IAAI,EAC3CU,EACF,GAGK,IAAM,CACPe,GACF,aAAaA,CAAO,CAExB,CACF,EAAG,CAAC1B,CAA6B,CAAC,EAGhC2B,GAAA,cAAAA,GAAA,cACGf,EAAW,MAAM,EAAG1B,CAAK,EAAE,IAAKgC,GAAW,CAC1C,IAAMU,EAAUC,GAAW,CACzB,iBAAAvC,EACA,WAAY4B,EAAO,KACnB,MAAAnC,CACF,CAAC,EACK+C,EAAiBF,EAAUG,GAAkBH,CAAO,EAAI,GAExDI,EAAoBC,GAAoBzC,EAAY,EAAGT,CAAK,EAE5DmD,GAA4B,CAAC5C,EAAiB,KACjD6C,IACCA,GAAgB,aAAejB,EAAO,MACtCiB,GAAgB,QAAUpD,CAC9B,EAEMqD,GACJJ,GACAE,IACAhB,EAAO,QAAUmB,GAAY,UAEzBC,EAA6BF,GAC/BG,GAAK,EAAE,CACL,GAAI,oBACJ,OAAQ,CAAE,MAAAxD,CAAM,CAClB,CAAC,EACD+C,EAEEU,GAAUvB,EAAA,IAAM,CAChBC,EAAO,QAAUmB,GAAY,aAC1B9B,EAAYW,EAAO,IAAI,EACnBkB,IACTvC,EAA2B,CACzB,WAAYqB,EAAO,KACnB,MAAAnC,EACA,QAAS6C,GAAW,EACtB,CAAC,EACD7B,EAA8B,EAAI,GAElCd,EAAa,CACX,WAAYiC,EAAO,KACnB,MAAAnC,EACA,QAAS6C,GAAW,EACtB,CAAC,CAEL,EAjBgB,WAmBVa,GACJ7C,GAAyB,MACrB8C,GACE9C,EAAwB,MACxBJ,EAAY,CACd,EACA,OACN,OACEmC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACgB,GAAA,CACC,KAAMlD,IAAyByB,EAAO,KACtC,QAAS,IAAMxB,EAAwB,EAAE,EACzC,MAAOwB,EAAO,MACd,MAAOA,EAAO,MACd,MAAOZ,EACT,EACC,CAAC,CAACV,GACD+B,GAAA,cAACiB,GAAA,CACC,KAAM,CAAC,CAAChD,GAA2BE,EACnC,UAAW2B,EACX,QAAS,IAAM,CACb5B,EAA2B,IAAI,CACjC,GACA8B,GAAA,cAACkB,GAAA,CACC,MAAON,GAAK,EAAE,CACZ,GAAI,oCACJ,OAAQ,CAAE,sBAAAE,EAAsB,CAClC,CAAC,EACD,KAAK,UACL,YAAaF,GAAK,EAAE,CAClB,GAAI,sHACJ,OAAQ,CAAE,sBAAAE,EAAsB,CAClC,CAAC,GACDd,GAAA,cAACmB,GAAA,CAAQ,KAAM,GAAI,EACnBnB,GAAA,cAACmB,GAAA,CAAQ,KAAM,GAAI,EACnBnB,GAAA,cAACoB,GAAA,CACC,QAAS/B,EAAqB,KAC5B,KACApB,CACF,EACA,QAAQ,WACR,KAAK,UACL,UAAS,GACT,KAAK,SACJ2C,GAAK,EAAE,SAAS,CACnB,CACF,CACF,EAEDvC,GACC2B,GAAA,cAACiB,GAAA,CACC,KAAM,CAAC,CAAC5C,EACR,QAASC,EAAiC,KAAK,KAAM,IAAI,EACzD,UAAWwB,GACVzB,IAAkC,eACjC2B,GAAA,cAACkB,GAAA,CACC,KAAK,UACL,MAAON,GAAK,EAAE,CACZ,GAAI,oCACJ,OAAQ,CAAE,sBAAAE,EAAsB,CAClC,CAAC,EACD,YAAaF,GAAK,EAAE,CAClB,GAAI,sHACJ,OAAQ,CAAE,sBAAAE,EAAsB,CAClC,CAAC,EACD,KACEd,GAAA,cAACqB,GAAA,KACCrB,GAAA,cAACsB,GAAA,KACCtB,GAAA,cAACuB,GAAA,CAAM,IAAKhC,EAAO,MAAO,KAAM,GAAI,CACtC,EACAS,GAAA,cAACwB,GAAA,IAAQ,CACX,EAEJ,EAGDnD,IAAkC,aACjC2B,GAAA,cAACkB,GAAA,CACC,KAAK,UACL,MAAON,GAAK,EAAE,CACZ,GAAI,sCACJ,OAAQ,CAAE,sBAAAE,EAAsB,CAClC,CAAC,EACD,YAAaF,GAAK,EAAE,CAClB,GAAI,2EACJ,OAAQ,CAAE,sBAAAE,EAAsB,CAClC,CAAC,EACH,EAGDzC,IAAkC,YACjC2B,GAAA,cAACkB,GAAA,CACC,KAAK,QACL,MAAON,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAAE,CAClB,GAAI,uEACJ,OAAQ,CAAE,sBAAAE,EAAsB,CAClC,CAAC,EACH,EAGFd,GAAA,cAACmB,GAAA,CAAQ,UAAU,WAAW,KAAM,GAAI,CAC1C,EAEFnB,GAAA,cAACyB,GAAA,CACC,IAAKlC,EAAO,KACZ,YAAaoB,EACb,QAASE,GACT,SAAUxD,EAAWkC,EAAO,KAAMnC,CAAK,EACtC,GAAGmC,EACN,CACF,CAEJ,CAAC,EACAH,GACCY,GAAA,cAAC0B,GAAA,CAAa,SAAU,GAAO,QAASlE,EAAW,KAAK,IAAI,GAC1DwC,GAAA,cAAC2B,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9Bf,GAAK,EAAE,mBAAmB,EAC3BZ,GAAA,cAAC2B,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,YAAW,QACjDxC,GAA4B5B,GAAS,EAC/C,CACF,CACF,CAEJ,CAEJ,CAvQgB+B,EAAApC,GAAA,cHMhB,IAAM0E,GAA+B,EAE9B,SAASC,GAAoBC,EAAkB,CAEpD,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,SAAAC,EAAU,eAAAC,EAAgB,QAAAC,CAAQ,EAAIL,EACvDM,EAASC,EAAY,EAAE,OACvBC,EAAcD,EAAY,EAAE,YAAY,EACxC,CACJ,MAAAE,EACA,mBAAoBC,EACpB,sBAAuBC,EACvB,wBAAyBC,EACzB,kBAAAC,EACA,qBAAAC,CACF,EAAIC,EAAc,EACZ,CAAE,iBAAAC,EAAkB,cAAAC,CAAc,EAAIC,EAAgB,EAEtD,CAACC,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,EACA,CAACO,EAAaC,CAAc,EAAIR,GAASR,CAAiB,EAC1D,CAACiB,EAAuBC,CAAwB,EAAIV,GACxD,CAAC,CAACR,CACJ,EACMmB,EAAuBC,GAA8B,IAAI,EAEzDC,EAAkBC,GAAmB1B,CAAK,EAE1C2B,EAAuB5B,EAAY,KACtC6B,GACCA,EAAW,OACX5B,GAAO,QAAQ,MAAMA,GAAO,QAAQ,MAAM,OAAS,CAAC,EAAE,GAAG,UAC7D,EACM6B,EAAsBC,EAACF,GAC3B,CAAC,CAAC5B,GAAO,QAAQ,MAAM,KAAM+B,GAASA,EAAK,KAAK,aAAeH,CAAU,EAD/C,uBAGtB,CAACI,GAAmBC,EAAoB,EAAIrB,GAChDL,EAAiB,OAAQ2B,GAErBA,EAAgB,UAChBT,EAAgB,SAASS,EAAgB,KAAK,CAEjD,CACH,EACMC,EAA2BpC,EAAY,KAC1CqC,GAAUA,EAAM,OAAST,GAAsB,IAClD,EAEMU,GAAaP,EAAA,CAACQ,EAAoBF,IACtC,CAAC,CAACJ,GAAkB,KACjBO,GACCA,EAAiB,aAAeD,GAChCC,EAAiB,QAAUH,GAC3BG,EAAiB,WAChBV,EAAoBO,CAAK,GACvB,CAACP,EAAoBO,CAAK,GAAK,CAACjB,EACvC,EARiB,cAUbqB,GACJ,CAAC,CAACrB,GACFE,GACAc,GACA,CAACM,GAAeN,EAA0BhB,CAAW,EAEjDuB,GAAyBZ,EAAA,IAAM,CACnCR,EAAyB,EAAK,EAC9BF,EAAe,EAAE,EACjBa,GAAsBD,GAAsB,CAC1C,IAAIW,EAAoB,GACxB,OAAOX,EAAkB,IAAKO,GAE1B,CAACI,GACDJ,EAAiB,QAAUZ,GAAsB,MAEjDgB,EAAoB,GACb,CACL,GAAGJ,EACH,SAAU,EACZ,GAEKA,CACR,CACH,CAAC,CACH,EAnB+B,0BAqBzBK,GAAWd,EAACe,GAAmB,CAKnC,GAJInC,GACFC,EAAqB,EAAE,EAER0B,GAAWQ,EAAO,WAAYA,EAAO,KAAK,EAEzD,OAEF,IAAMX,EAAkB3B,EAAiB,KACtC2B,IACCA,GAAgB,aAAeW,EAAO,YACtCX,GAAgB,QAAUW,EAAO,KACrC,EAEKX,IAILxC,EAAS,EACLmD,EAAO,QAAUlB,GAAsB,MAAQN,IACjDC,EAAyB,EAAK,EAC9BF,EAAe,EAAE,GAEnBa,GAAsBD,IACpBA,GACG,OAAQO,IAAqBA,GAAiB,QAAUM,EAAO,KAAK,EACpE,OAAO,CAAE,GAAGX,EAAiB,SAAU,EAAK,CAAC,CAClD,EACF,EA5BiB,YA8BXY,GAAmBhB,EAAA,IAAM,CAC7B,IAAMiB,EAAsBf,GAAkB,OAC3Ca,GAAWA,EAAO,QACrB,EACArC,EAAcuC,CAAmB,EACjC9C,EAAmB8C,CAAmB,EACtC1C,EAAqBc,CAAW,EAChChB,EAAwB,EAAI,EAC5BV,EAAQ,CACV,EATyB,oBAWnBuD,GAAmBlB,EAAA,SAAY,CACnChB,EAAmB,CAAC,CAAC,EACrBE,EAAS,EAAE,EACXE,EAAgB,IAAI,EACpB,IAAM+B,EAAkB1C,EAAiB,OAAQ2B,IAC/CF,GAAkB,KACfO,IACCA,GAAiB,QAAUL,GAAgB,OAC3CK,GAAiB,aAAeL,GAAgB,UACpD,CACF,EACMgB,EAAS,MAAMvD,IAAiB,CACpC,gBAAAsD,EACA,kBAAmB9B,CACrB,CAAC,EAEKgC,EAAWD,EAAO,SACpBC,GAAU,SAAS,UACrBrC,EAAmBqC,EAAS,QAAQ,QAAQ,EAE1CA,GAAU,aACZjC,EAAgBiC,EAAS,WAAW,EAElCD,EAAO,OACTlC,EAASoC,GAAqBF,EAAO,KAAK,CAAC,EAGzC,CAACA,EAAO,QAAU,CAACC,GAAU,SAAS,SAAS,QAAU,EAAI,GAC/DL,GAAiB,EAEjBhC,EAAmBqC,GAAU,SAAS,UAAY,CAAC,CAAC,CAExD,EAhCyB,oBAkCzBE,GAAU,IAAM,CACdpB,GAAsBD,GACpBA,EAAkB,OAChBzB,EAAiB,OAAQ2B,GAOrB,CANwB,CAAC,CAACF,EAAkB,KAC3CO,IACCA,GAAiB,QAAUL,EAAgB,KAC/C,GAIEA,EAAgB,UAChBT,EAAgB,SAASS,EAAgB,KAAK,CAEjD,CACH,CACF,CACF,EAAG,CAAC3B,EAAiB,MAAM,CAAC,EAE5B+C,GAAgB,IAAM,CAChBjC,GAAyBE,EAAqB,SAChD,WAAW,IAAM,CACfA,GAAsB,SAAS,eAAe,CAAE,SAAU,QAAS,CAAC,CACtE,EAAGgC,EAA8B,CAErC,EAAG,CAAClC,CAAqB,CAAC,EAE1B,IAAMmC,GAAiB,SAAS,cAAc,WAAW,EAEnDC,GAAWC,GAAY,EAC7B,OACEC,EAAA,cAACC,GAAA,CACC,KAAMpE,EACN,QAAS,IAAM,CACRU,GAEHuD,GADa,MACE,CAAE,QAAS,EAAK,CAAC,EAElChE,EAAQ,CACV,EACA,YAAa,CAACiB,EACd,UAAW8C,GACV,GAAI,CAAC9C,GAAqB,CACzB,OACEiD,EAAA,cAACE,GAAA,KACCF,EAAA,cAACG,GAAA,CACC,QAASlE,EACT,SAAUmE,GACRnE,EACAyB,EACAF,EACAnB,EACAgC,GACAL,CACF,EACA,QAASqB,GACT,QAAQ,YACR,KAAK,UACL,UAAS,GACT,KAAK,SAAQ,SAEf,CACF,CAEJ,EACC,GAAItC,GAAqB,CACxB,eAAgB,CAAE,QAAS,IAAK,EAChC,OACEiD,EAAA,cAACK,GAAA,KACCL,EAAA,cAACM,GAAA,CACC,QAAQ,QACR,QAAStD,EAAqB,KAAK,KAAM,EAAE,GAC3CgD,EAAA,cAACO,GAAA,CAAgB,KAAM,GAAI,CAC7B,EACAP,EAAA,cAACQ,GAAA,CAAW,QAAQ,WAAW,KAAK,SACjCC,GAAK,EAAE,CACN,GAAI,gCACJ,OAAQ,CACN,eAAgBC,GACd3D,EACAX,CACF,CACF,CACF,CAAC,CACH,CACF,CAEJ,EACA,OAAO,UACP4D,EAAA,cAACC,GAAA,CACC,KAAM/C,EAAgB,OAAS,EAC/B,QAASC,EAAmB,KAAK,KAAM,CAAC,CAAC,EACzC,UAAW0C,IACXG,EAAA,cAACW,GAAA,CACC,MAAOF,GAAK,EAAE,8BAA8B,EAC5C,KAAK,QACL,YAAaT,EAAA,cAACY,GAAA,CAAc,SAAU1D,GAAmB,CAAC,EAAG,GAC7D8C,EAAA,cAACG,GAAA,CACC,QAAQ,WACR,KAAK,QACL,KAAK,UACL,UAAS,GACT,QAAShB,IACRsB,GAAK,EAAE,gBAAgB,CAC1B,CACF,CACF,EACC1D,GACCiD,EAAA,cAACa,GAAA,KACCb,EAAA,cAAC,OAAI,UAAU,gBACbA,EAAA,cAACc,GAAA,CACC,MAAO/D,EACP,WAAY2B,GACZ,aAAcO,GACd,WAAYjC,EAAqB,KAAK,KAAMD,CAAiB,EAC/D,CACF,CACF,EAED,CAACA,GACAiD,EAAA,cAAAA,EAAA,cACG5C,GACC4C,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACe,GAAA,CAAM,QAAQ,QAAQ,KAAK,QAAQ,MAAON,GAAK,EAAErD,CAAK,EAAG,EAC1D4C,EAAA,cAACgB,GAAA,CAAQ,KAAM,GAAI,CACrB,EAED1D,GACC0C,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACe,GAAA,CACC,QAAQ,QACR,KAAK,UACL,MAAOE,GAA6B3D,CAAY,EAClD,EACA0C,EAAA,cAACgB,GAAA,CAAQ,KAAM,GAAI,CACrB,EAEFhB,EAAA,cAACkB,GAAA,KACEpD,EAAgB,IAAI,CAACqD,EAAgBC,IAAU,CAC9C,IAAMnD,EAAa7B,EAAY,KAC5B6B,IAAeA,GAAW,OAASkD,CACtC,EAEME,GAAM,UAAUD,IAChBE,GAAeF,IAAUtD,EAAgB,OAAS,EAExD,OACEkC,EAAA,cAAC,OAAI,IAAKqB,IACRrB,EAAA,cAACuB,GAAA,KACCvB,EAAA,cAACQ,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,CACN,GAAI,gCACJ,OAAQ,CAAE,eAAgBxC,GAAY,SAAU,CAClD,CAAC,CACH,EACA+B,EAAA,cAACQ,GAAA,CACC,QAAQ,QACR,MAAM,cACN,KAAK,UACJC,GAAK,EAAE,CACN,GAAI,iDACJ,OAAQ,CAAE,eAAgBxC,GAAY,SAAU,CAClD,CAAC,CACH,CACF,EACA+B,EAAA,cAACgB,GAAA,CAAQ,KAAM,GAAI,EACnBhB,EAAA,cAACwB,GAAA,KACCxB,EAAA,cAACc,GAAA,CACC,MAAOK,EACP,WAAYzC,GACZ,aAAcO,GACd,MAAOvD,GACP,WAAY,IACVsB,EAAqBiB,GAAY,MAAQ,EAAE,EAE/C,CACF,EACC,CAACqD,IAAgBtB,EAAA,cAACgB,GAAA,CAAQ,KAAM,GAAI,EACpCM,IAAgBpF,GAAQ,mBACvB8D,EAAA,cAACyB,GAAA,KACCzB,EAAA,cAAC0B,GAAA,CACC,IAAK9D,EACL,SAAUF,EACV,KAAMA,EACN,aAAeiE,IAAY,CACpBA,GAIAzD,EACCF,GAAsB,MAAQ,EAChC,GAEAM,GAAsBD,IACpBA,GAAkB,IAAKO,IAEnBA,GAAiB,QACjBZ,GAAsB,KAEf,CACL,GAAGY,GACH,SAAU,EACZ,EAEKA,EACR,CACH,EApBFG,GAAuB,CAuB3B,GACAiB,EAAA,cAAC4B,GAAA,CACC,QAAS,IACPjE,EAA0BkE,IAAc,CAACA,EAAS,GAEpD7B,EAAA,cAAC8B,GAAA,CACC,UAAS,GACT,QAAQ,UACR,OACE9B,EAAA,cAAC+B,GAAA,CACC,YACErE,EAAwB,KAAO,QAEjCsC,EAAA,cAACgC,GAAA,CAAgB,KAAM,GAAI,MAAM,OAAO,CAC1C,GAEFhC,EAAA,cAAC,OAAI,UAAU,mBACbA,EAAA,cAACiC,GAAA,CAAW,KAAM,GAAI,MAAM,OAAO,EACnCjC,EAAA,cAACgB,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzChB,EAAA,cAACQ,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9BC,GAAK,EAAE,6BAA6B,CACvC,CACF,CACF,CACF,EACAT,EAAA,cAACkC,GAAA,CAAmB,KAAMxE,GACxBsC,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACgB,GAAA,CAAQ,KAAM,EAAG,EAClBhB,EAAA,cAACmC,GAAA,CACC,UAAS,GACT,YAAa1B,GAAK,EAAE,0BAA0B,EAC9C,MAAOjD,EACP,SAAW4E,IAAM,CACf3E,EAAe2E,GAAE,OAAO,KAAK,CAC/B,EACF,CACF,CACF,CACF,EACCvD,IACCmB,EAAA,cAAC,OAAI,UAAU,UACbA,EAAA,cAACe,GAAA,CACC,QAAQ,QACR,KAAK,QACL,MAAON,GAAK,EAAE,CACZ,OAAQ,CAAE,YAAAjD,CAAY,EACtB,GAAI,qEACN,CAAC,EACH,CACF,CAEJ,CAEJ,CAEJ,CAAC,CACH,CACF,CAEJ,CAEJ,CA/agBW,EAAAxC,GAAA,uBuBhDhB,OAAS,WAAA0G,OAAe,gBACxB,OAAOC,OAAW,QCClB,OAAS,QAAAC,OAAY,eACrB,OACE,SAAAC,GACA,mBAAAC,GACA,oBAAAC,GACA,WAAAC,GACA,SAAAC,GACA,YAAAC,GACA,aAAAC,GACA,eAAAC,GACA,eAAAC,GACA,WAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,GAAS,mBAAAC,GAAiB,UAAAC,GAAQ,YAAAC,OAAgB,QClBzD,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAoBD,GAAO,MAAO,CAC7C,cAAe,KACjB,CAAC,EAEYE,GAAiBF,GAAO,MAAO,CAC1C,MAAO,OACP,4BAA6B,CAC3B,WAAY,KACd,CACF,CAAC,EAEYG,GAAoBH,GAAO,MAAO,CAC7C,SAAU,CACR,WAAY,CACV,KAAM,CACJ,WAAY,KACd,CACF,CACF,CACF,CAAC,EAEYI,GAAkBJ,GAAO,MAAO,CAC3C,cAAe,KACjB,CAAC,EAEYK,GAAcL,GAAO,MAAO,CACvC,MAAO,OACP,QAAS,MACX,CAAC,EC9BD,UAAYM,OAAiB,8BAC7B,OAAS,aAAAC,GAAW,SAAAC,GAAO,UAAAC,OAAc,gBAIlC,IAAMC,GAAuC,IAEvCC,GAAiBC,GAAmB,QAAM,CACrD,QAAS,OACT,cAAe,SACf,WAAY,QACZ,UAAW,OACX,UAAW,SACX,MAAO,OACP,aAAc,MACd,OAAQ,UACR,SAAU,CACR,YAAa,CACX,KAAM,CACJ,QAAS,kBACT,CAAC,IAAIC,MAAa,EAAG,CACnB,QAAS,sBACX,EACA,gBAAiB,SACnB,EACA,MAAO,CACL,QAAS,qBACT,CAAC,IAAIA,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,CACF,CACF,EACA,mBAAoB,CAClB,QAAS,SACX,CACF,CAAC,EAEYC,GAAmBF,GAAO,MAAO,CAC5C,aAAc,MACd,QAAS,OACT,cAAe,SACf,WAAY,QACZ,eAAgB,gBAChB,MAAO,cACP,OAAQ,UACR,UAAW,aACX,SAAU,WACV,SAAU,CACR,YAAa,CACX,KAAM,CACJ,QAAS,kBACT,CAAC,IAAIC,MAAa,EAAG,CACnB,QAAS,sBACX,EACA,gBAAiB,UACjB,UAAW,CACT,gBAAiB,SACnB,CACF,EACA,MAAO,CACL,QAAS,qBACT,CAAC,IAAIA,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,UACjB,UAAW,CACT,gBAAiB,SACnB,CACF,CACF,EACA,MAAO,CAAE,KAAM,CAAE,qBAAsB,IAAK,oBAAqB,GAAI,CAAE,EACvE,SAAU,CACR,KAAM,CAAC,EACP,MAAO,CAAC,CACV,CACF,EAEA,iBAAkB,CAChB,CACE,SAAU,GACV,YAAa,GACb,IAAK,CACH,UAAW,CACT,QAAS,uBACT,CAAC,IAAIA,MAAa,EAAG,CACnB,QAAS,sBACX,EACA,gBAAiB,SACnB,CACF,CACF,EACA,CACE,SAAU,GACV,YAAa,GACb,IAAK,CACH,UAAW,CACT,QAAS,qBACT,CAAC,IAAIA,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,CACF,CACF,CACF,EACA,aAAc,CACZ,MAAO,OACP,QAAS,kBACT,OAAQ,SACV,EACA,gBAAiB,CACf,WAAY,MACZ,QAAS,OACT,WAAY,SACZ,aAAc,CACZ,QAAS,qBACT,CAAC,IAAIA,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,SACT,CACF,CACF,CAAC,EAEYE,GAASH,GAAmB,WAAS,CAChD,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,KAAKI,IAAO,EAAG,CACd,OAAQ,wBACR,aAAc,MAChB,CACF,EACA,MAAO,CACL,CAAC,KAAKA,IAAO,EAAG,CACd,OAAQ,wBACR,aAAc,MAChB,CACF,CACF,EACA,YAAa,CACX,KAAM,CACJ,QAAS,kBACT,CAAC,IAAIH,MAAa,EAAG,CACnB,QAAS,sBACX,EACA,gBAAiB,SACnB,EACA,MAAO,CACL,QAAS,qBACT,CAAC,IAAIA,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,SACnB,CACF,CACF,EACA,qBAAsB,CAAE,QAAS,MAAO,CAC1C,CAAC,EAEYI,GAAsBL,GAAO,MAAO,CAC/C,MAAO,OACP,OAAQ,OACR,aAAc,OACd,OAAQ,0BACR,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,SAAU,CACR,MAAO,CACL,MAAO,CACL,YAAa,WACf,EACA,QAAS,CAAE,YAAa,aAAc,CACxC,CACF,CACF,CAAC,EAEYM,GAAUN,GAAOO,GAAoB,CAChD,MAAO,MACT,CAAC,EAEYC,GAAgBR,GAAO,MAAO,CACzC,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,QAAS,KACT,WAAY,OAAOF,YACnB,SAAU,CACR,YAAa,CACX,KAAM,CACJ,UAAW,WACb,EACA,GAAI,CACF,UAAW,gBACb,CACF,CACF,CACF,CAAC,EAEYW,GAAYT,GAAO,MAAO,CACrC,OAAQ,MACR,WAAY,MACZ,YAAa,MACb,WAAY,uBACd,CAAC,EAEYU,GAAsBV,GAAO,MAAO,CAC/C,QAAS,OACT,eAAgB,SAChB,OAAQ,QACR,UAAW,YACX,QAAS,qBACT,CAAC,IAAIC,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,YAAa,SACf,CAAC,EAEYU,GAAYX,GAAO,MAAO,CACrC,MAAO,MACP,OAAQ,MACR,eAAgB,SAChB,WAAY,SACZ,QAAS,MACX,CAAC,EC5OD,OAAS,eAAAY,OAAmB,gBAC5B,OAAOC,OAAW,QCHlB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAYD,GAAO,MAAO,CACrC,SAAU,WACV,QAAS,OACT,cAAe,SACf,MAAO,OACP,eAAgB,CACd,OAAQ,OACR,WAAY,OACZ,SAAU,WACV,WAAY,wBACZ,IAAK,KACP,CACF,CAAC,EDAM,SAASE,GAAaC,EAAkB,CAC7C,GAAM,CAAE,KAAAC,EAAM,GAAAC,EAAI,iBAAAC,EAAkB,aAAAC,CAAa,EAAIJ,EACrD,OACEK,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CACC,UAAU,aACV,MAAM,aACN,KAAK,QACL,MAAO,CAAE,MAAON,EAAK,MAAM,MAAO,SAAUA,EAAK,MAAM,QAAS,EAChE,MAAO,CACL,YAAaA,EAAK,MAAM,YACxB,MAAOA,EAAK,MAAM,KACpB,EACA,MAAO,CAAE,MAAOA,EAAK,MAAM,KAAM,EACnC,EACAI,GAAA,cAAC,OAAI,UAAU,YAAY,EAC3BA,GAAA,cAACE,GAAA,CACC,UAAU,aACV,MAAM,mBACN,KAAK,SACL,MAAO,CAAE,MAAOL,EAAG,MAAM,MAAO,SAAUA,EAAG,MAAM,QAAS,EAC5D,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,CA/BgBI,EAAAT,GAAA,gBHgDT,SAASU,GAAMC,EAAmB,CACvC,GAAM,CACJ,MAAAC,EACA,MAAAC,EACA,OAAAC,EACA,MAAAC,EACA,QAAAC,EACA,KAAAC,EACA,YAAAC,EAAc,EAChB,EAAIP,EACEQ,EAASC,EAAY,EAAE,OAAO,EAC9BC,EAAcD,EAAY,EAAE,YAAY,EACxCE,EAAWF,EAAY,EAAE,SAAS,EAElC,CAACG,EAAUC,CAAW,EAAIC,GAASd,EAAM,QAAQ,EACjDe,EAAWC,GAAiC,IAAI,EAChDC,EAAeD,GAAOJ,CAAQ,EAC9BM,EAAWC,EACfC,GAAiBnB,EAAM,QAAQ,OAAS,CAAC,EAAGO,CAAM,EAClD,EACA,CACF,EACMa,EAAYC,GAAgBC,GAAiBtB,EAAM,QAAQ,KAAK,CAAC,EACjEuB,EAAeL,EACnBjB,EAAM,MACN,EACA,CACF,EACMuB,EAAgBN,EACpBhB,EAAO,MACP,EACA,CACF,EACMuB,EAAwBvB,EAAO,SACjCgB,EACEhB,EAAO,SACP,EACA,CACF,EACA,GACEwB,EAAcC,GAAe1B,EAAM,SAAUC,EAAO,UAAY,IAAI,EACpE0B,EAAmBV,EACvBQ,EACA,EACA,CACF,EACMG,EAA0BC,GAAoBJ,GAAe,CAAC,EA2J9DK,EAzJgBC,EAACC,GACdA,EAAM,IAAI,CAACC,EAAMC,IAAU,CAChC,IAAIC,EACEC,EACHlC,GAAO,OAAS,GACfA,EAAM,KAAK,YAAc+B,EAAK,WAC/B/B,GAAO,OAAS,GACfA,EAAM,sBAAsB,IAAIgC,CAAK,EACnCG,GACJlC,GAAS,OAAS,GAClBA,EAAQ,sBAAsB,IAAI+B,CAAK,EAEzC,OAAIE,EACFD,EAAY,QACHE,KACTF,EAAY,WAGP,CACL,QAAS,CACP,YAAaG,GAAsBL,EAAK,UAAWxB,CAAQ,EAC3D,MAAOwB,EAAK,WACd,EACA,KAAM,CACJ,MAAO,CAAE,YAAaA,EAAK,KAAK,OAAQ,MAAOA,EAAK,KAAK,IAAK,EAC9D,MAAO,CACL,YAAaM,GACXN,EAAK,KAAK,WACVzB,CACF,EACA,MAAOyB,EAAK,KAAK,cACnB,EACA,MAAO,CACL,MACEC,IAAU,EACNjB,EACEjB,EAAM,MACN,EACA,CACF,EACAiB,EACEgB,EAAK,WACL,EACA,CACF,EACN,SAAUhB,GACPgB,EAAK,KAAK,UAAY,GAAK,WAAWA,EAAK,UAAU,EACtD,EACA,CACF,CACF,CACF,EACA,GAAI,CACF,MAAO,CAAE,YAAaA,EAAK,GAAG,OAAQ,MAAOA,EAAK,GAAG,IAAK,EAC1D,MAAO,CACL,YAAaM,GACXN,EAAK,GAAG,WACRzB,CACF,EACA,MAAOyB,EAAK,GAAG,cACjB,EACA,MAAO,CACL,MAAOhB,EACLgB,EAAK,SACL,EACA,CACF,EACA,SAAUhB,GACPgB,EAAK,GAAG,UAAY,GAAK,WAAWA,EAAK,QAAQ,EAClD,EACA,CACF,CACF,CACF,EACA,MAAOE,EACP,OACEC,GAAgBC,GACdG,EAAA,cAACC,GAAA,KACCD,EAAA,cAACE,GAAA,CACC,KAAMN,EAAe,QAAU,UAC/B,MACElC,GAAO,OAAS,EACZA,GAAO,eACPyC,GAAK,EAAE,iBAAiB,EAE9B,OACEH,EAAA,cAACI,GAAA,KACE1C,GAAO,OAAS,GACfsC,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACK,GAAA,CACC,KAAK,SACL,QAAQ,OACR,MAAM,cACL3C,EAAM,oBACT,EACAsC,EAAA,cAACM,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCN,EAAA,cAACK,GAAA,CACC,KAAK,SACL,QAAQ,OACR,MAAM,cAAa,GAErB,EACAL,EAAA,cAACM,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCN,EAAA,cAACK,GAAA,CACC,KAAK,SACL,QAAQ,OACR,MAAM,cACLF,GAAK,EAAE,CACN,GAAI,2BACJ,OAAQ,CACN,OAAQ1B,EACNgB,EAAK,WACL,EACA,CACF,EACA,OAAQA,GAAM,KAAK,MACrB,CACF,CAAC,CACH,CACF,GAEA/B,GAAO,OAAS,GAChBC,GAAS,OACP,IACFqC,EAAA,cAACK,GAAA,CACC,KAAK,SACL,QAAQ,OACR,MAAM,cACLF,GAAK,EAAE,CACN,GAAI,qDACJ,OAAQ,CACN,GAAIzC,GAAO,OACT,GAAwC,CACxC,oBACEA,EAAM,sBAAsB,IAAIgC,CAAK,CACzC,EACA,GAAI/B,GAAS,OACX,GAA0C,CAC1C,oBACEA,EAAQ,sBAAsB,IAAI+B,CAAK,CAC3C,CACF,CACF,CAAC,CACH,CAEJ,EAEJ,CACF,EACE,MACR,CACF,CAAC,EAvJmB,iBAyJMnC,EAAM,QAAQ,OAAS,CAAC,CAAC,EAC/CgD,EAAgBjB,EAAM,OACtBkB,EAAmBC,EAAa,EAEtC,OAAAC,GAAgB,IAAM,CAChBxC,GAAY,CAACK,EAAa,SAAWF,EAAS,SAChD,WAAW,IAAM,CACfA,GAAU,SAAS,eAAe,CAAE,SAAU,QAAS,CAAC,CAC1D,EAAGsC,EAAoC,EAEzCpC,EAAa,QAAUL,CACzB,EAAG,CAACA,EAAUK,CAAY,CAAC,EAGzByB,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACY,GAAA,CACC,YAAa/C,EACb,SAAUD,IAAS,YACnB,MAAOA,IAAS,SAChBoC,EAAA,cAAC,OAAI,UAAU,WACbA,EAAA,cAACa,GAAA,CAAU,IAAKrC,EAAU,KAAMG,EAAW,MAAO4B,EAAe,EAChE3C,IAAS,SACRoC,EAAA,cAAC,OAAI,UAAU,cACbA,EAAA,cAACc,GAAA,KACCd,EAAA,cAACe,GAAA,CAAS,KAAM,GAAI,MAAM,OAAO,CACnC,EACAf,EAAA,cAACK,GAAA,CACC,KAAK,QACL,QAAQ,OACR,MAAO,CAAE,cAAe,EAAI,GAC3B,GAAGvB,KACFQ,EAAM,CAAC,EAAE,KAAK,MAAM,iBAChBP,KACJO,EAAMA,EAAM,OAAS,CAAC,EAAE,GAAG,MAAM,aAErC,EACAU,EAAA,cAACK,GAAA,CACC,MAAM,cACN,GAAI,EACJ,KAAK,SACL,QAAQ,QACP,KAAKrB,IACR,CACF,EAEDpB,IAAS,aACRoC,EAAA,cAACgB,GAAA,CACC,KAAK,SACL,UAAU,WACV,MAAO,CAAE,MAAOjC,EAAe,SAAUC,CAAsB,EAC/D,MAAO,CACL,YAAaM,EAAMiB,EAAgB,CAAC,EAAE,GAAG,MAAM,YAC/C,MAAOjB,EAAMiB,EAAgB,CAAC,EAAE,GAAG,MAAM,KAC3C,EACA,MAAO,CAAE,MAAOjB,EAAMiB,EAAgB,CAAC,EAAE,GAAG,MAAM,KAAM,EACxD,iBAAkBpB,EAClB,aAAcC,EAChB,EAEDxB,IAAS,gBACRoC,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACiB,GAAA,CACC,KAAM3B,EAAM,CAAC,EAAE,KACf,GAAIA,EAAMiB,EAAgB,CAAC,EAAE,GAC7B,iBAAkBpB,EAClB,aAAcC,EAChB,EACAY,EAAA,cAACM,GAAA,CAAQ,KAAM,EAAG,CACpB,CAEJ,EACAN,EAAA,cAACkB,GAAA,CACC,YAAarD,EACb,KAAMK,EACN,aAAcC,GACd6B,EAAA,cAACmB,GAAA,CACC,IAAMC,GAAS/C,EAAS,QAAU+C,EAClC,YAAavD,EACb,QAAS,IAAMM,EAAakD,GAAc,CAACA,CAAS,GACpDrB,EAAA,cAAC,WACEV,EAAM,IAAI,CAACgC,EAAM5B,IAAU,CAC1B,IAAM6B,EAAM,QAAQ7B,IACd8B,EACJxB,EAAA,cAACyB,GAAA,KACCzB,EAAA,cAAC0B,GAAA,CACC,KAAM,GACN,MAAM,QACL,GAAIJ,EAAK,OAAS,CACjB,MAAOA,EAAK,QAAU,QAAU,QAAU,SAC5C,EACF,CACF,EAEF,OACEtB,EAAA,cAACA,EAAM,SAAN,CAAe,IAAKuB,GACnBvB,EAAA,cAAC2B,GAAA,CACC,UAAWnB,EACX,KAAK,SACL,WAAY,EACZ,QAASc,EAAK,KAAK,MAAM,aACzBtB,EAAA,cAAC4B,GAAA,CACC,MAAON,EAAK,OAAShC,EAAMI,EAAQ,CAAC,GAAG,OACvCM,EAAA,cAAC6B,GAAA,CAAM,IAAKP,EAAK,KAAK,MAAM,MAAO,KAAM,GAAI,CAC/C,CACF,EACC5B,IAAUa,EAAgB,GACzBP,EAAA,cAAAA,EAAA,cACGwB,EACDxB,EAAA,cAAC2B,GAAA,CACC,UAAWnB,EACX,KAAK,SACL,WAAY,EACZ,QAASc,EAAK,GAAG,MAAM,aACvBtB,EAAA,cAAC4B,GAAA,CAAoB,MAAON,EAAK,OAC/BtB,EAAA,cAAC6B,GAAA,CAAM,IAAKP,EAAK,GAAG,MAAM,MAAO,KAAM,GAAI,CAC7C,CACF,CACF,EAED5B,IAAUa,EAAgB,GAAKP,EAAA,cAAAA,EAAA,cAAGwB,CAAM,CAC3C,CAEJ,CAAC,CACH,EACAxB,EAAA,cAACyB,GAAA,CAAc,YAAavD,EAAW,KAAO,QAC5C8B,EAAA,cAAC8B,GAAA,CAAgB,KAAM,GAAI,MAAM,QAAQ,CAC3C,CACF,EACA9B,EAAA,cAAC+B,GAAA,CAAQ,KAAM7D,GACb8B,EAAA,cAACgC,GAAA,IAAoB,EACrBhC,EAAA,cAAC,OAAI,UAAU,iBACZV,EAAM,IAAI,CAACgC,EAAM5B,IAAU,CAC1B,IAAM6B,EAAM,QAAQ7B,IACpB,OACEM,EAAA,cAACiC,GAAA,CACC,KAAK,gBACL,IAAKV,EACL,KAAMD,EACN,aAAc5B,IAAUJ,EAAM,OAAS,EACvC,MAAOgC,EAAK,MACd,CAEJ,CAAC,CACH,CACF,CACF,CACF,CACF,CAEJ,CA9VgB/B,EAAAlC,GAAA,SK5DhB,OAAS,cAAA6E,GAAY,WAAAC,GAAS,YAAAC,GAAU,YAAAC,OAAgB,gBACxD,OAAOC,MAAW,QCHlB,OAAS,aAAAC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAYD,GAAO,MAAO,CACrC,QAAS,qBACT,CAAC,IAAID,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,gBAAiB,UACjB,uBAAwB,MACxB,wBAAyB,MACzB,QAAS,OACT,kBAAmB,CACjB,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,OAAQ,MACV,EACA,SAAU,CACR,QAAS,CACP,KAAM,CACJ,aAAc,KAChB,CACF,CACF,EACA,UAAW,CACT,QAAS,MACX,EACA,mBAAoB,CAClB,QAAS,gBACX,EACA,YAAa,CACX,QAAS,eACT,QAAS,OACT,cAAe,QACjB,EACA,wBAAyB,CACvB,QAAS,OACT,eAAgB,QAChB,WAAY,SACZ,cAAe,IACjB,EACA,mBAAoB,CAClB,QAAS,OACT,eAAgB,gBAChB,WAAY,KACd,EACA,8BAA+B,CAC7B,OAAQ,MACR,WAAY,OACZ,WAAY,uBACd,EACA,kBAAmB,CACjB,QAAS,OACT,eAAgB,eAClB,EACA,yBAA0B,CACxB,QAAS,OACT,cAAe,SACf,WAAY,OACd,EACA,YAAa,CACX,WAAY,IACd,EACA,kBAAmB,CACjB,QAAS,eACX,EACA,WAAY,CACV,YAAa,IACf,EACA,iBAAkB,CAChB,QAAS,OACT,WAAY,QACd,EACA,mBAAoB,CAClB,QAAS,OACT,WAAY,OACd,EACA,kBAAmB,CACjB,WAAY,KACZ,cAAe,MACf,QAAS,OACT,WAAY,QACd,EACA,sBAAuB,CACrB,QAAS,OACT,WAAY,QACd,EACA,0BAA2B,CACzB,OAAQ,QACR,QAAS,KACT,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CACF,CAAC,EAEYG,GAAgBF,GAAO,MAAO,CACzC,WAAY,mBACZ,UAAW,QACX,OAAQ,aACR,UAAW,UACX,SAAU,CACR,cAAe,CACb,KAAM,CACJ,UAAW,QACX,OAAQ,GACV,CACF,CACF,CACF,CAAC,EDtGD,SAASG,GAAaC,EAAgC,CACpD,GAAM,CAAE,UAAAC,EAAY,EAAK,EAAID,EAC7B,OACEE,EAAA,cAAAA,EAAA,cACEA,EAAA,cAAC,OAAI,UAAU,eACbA,EAAA,cAACC,GAAA,CAAS,OAAQ,GAAI,MAAO,GAAI,QAAQ,WAAW,EACpDD,EAAA,cAACE,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCF,EAAA,cAACC,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,EACAD,EAAA,cAAC,OAAI,UAAU,iBACbA,EAAA,cAACG,GAAA,CAAc,cAAe,CAACJ,EAAW,EAC1CC,EAAA,cAAC,OAAI,UAAU,gBACbA,EAAA,cAAC,OAAI,UAAU,oBACbA,EAAA,cAACI,GAAA,CAAW,KAAK,QAAQ,QAAO,GAAC,WAAW,GAAG,WAAW,GAAG,EAC7DJ,EAAA,cAACE,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCF,EAAA,cAACC,GAAA,CAAS,OAAQ,GAAI,MAAO,GAAI,QAAQ,UAAU,CACrD,EACAD,EAAA,cAAC,OAAI,UAAU,wBACbA,EAAA,cAACK,GAAA,CAAS,MAAM,OAAO,KAAM,GAAI,CACnC,EACAL,EAAA,cAAC,OAAI,UAAU,oBACbA,EAAA,cAACI,GAAA,CAAW,KAAK,QAAQ,QAAO,GAAC,WAAW,GAAG,WAAW,GAAG,EAC7DJ,EAAA,cAACE,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCF,EAAA,cAACC,GAAA,CAAS,OAAQ,GAAI,MAAO,GAAI,QAAQ,UAAU,CACrD,CACF,CACF,CACF,CAEJ,CA7BSK,EAAAT,GAAA,gBA+BF,SAASU,GAAcT,EAAkB,CAC9C,GAAM,CAAE,KAAAU,EAAM,SAAAC,EAAU,IAAAC,EAAM,EAAM,EAAIZ,EAClCa,EACJX,EAAA,cAAC,OAAI,UAAU,iBACbA,EAAA,cAAC,OAAI,UAAU,gBACbA,EAAA,cAACI,GAAA,CAAW,QAAO,GAAC,KAAK,SAAS,WAAW,GAAG,WAAW,GAAG,EAC9DJ,EAAA,cAACE,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCF,EAAA,cAAC,OAAI,UAAU,uBACbA,EAAA,cAACC,GAAA,CAAS,OAAQ,GAAI,MAAO,GAAI,QAAQ,UAAU,EACnDD,EAAA,cAACE,GAAA,CAAQ,KAAM,EAAG,EAClBF,EAAA,cAACC,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,CACF,EACAD,EAAA,cAACC,GAAA,CAAS,OAAQ,GAAI,MAAO,GAAI,QAAQ,UAAU,CACrD,EAGF,OACED,EAAA,cAACY,GAAA,CAAU,QAASJ,IAAS,SAC3BR,EAAA,cAAC,OAAI,UAAU,gBACbA,EAAA,cAAC,OAAI,UAAU,QACbA,EAAA,cAACC,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,EACnDD,EAAA,cAACE,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCF,EAAA,cAACC,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,EACnDD,EAAA,cAACE,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCF,EAAA,cAACC,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CACrD,EACCS,GAAOV,EAAA,cAACC,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CAC9D,EACCO,IAAS,SACRR,EAAA,cAAC,OAAI,UAAU,iBACbA,EAAA,cAACC,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,EAEDO,IAAS,aACRR,EAAA,cAAC,OAAI,UAAU,UACbA,EAAA,cAAC,OAAI,UAAU,sBACbA,EAAA,cAACI,GAAA,CAAW,QAAO,GAAC,KAAK,SAAS,WAAW,GAAG,WAAW,GAAG,EAC9DJ,EAAA,cAACE,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCF,EAAA,cAACC,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,EACAD,EAAA,cAACE,GAAA,CAAQ,KAAM,EAAG,EAClBF,EAAA,cAACC,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,EAEDO,IAAS,gBACRR,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACE,GAAA,CAAQ,KAAM,EAAG,EAClBF,EAAA,cAAC,OAAI,UAAU,gBACZW,EACDX,EAAA,cAAC,OAAI,UAAU,2BAA2B,EACzCW,CACH,CACF,EAEFX,EAAA,cAAC,OAAI,UAAU,UACbA,EAAA,cAACC,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,EAECQ,GACCT,EAAA,cAAC,OAAI,UAAU,SACbA,EAAA,cAACE,GAAA,CAAQ,KAAM,GAAI,EACnBF,EAAA,cAACH,GAAA,IAAa,EACdG,EAAA,cAACH,GAAA,IAAa,EACdG,EAAA,cAACH,GAAA,CAAa,UAAW,GAAO,CAClC,CAEJ,CAEJ,CArEgBS,EAAAC,GAAA,iBEpChB,OAAS,QAAAM,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,eASd,SAASC,GACdC,EACAC,EACAC,EACAC,EACM,CACN,OAAIH,GAAO,OAAS,EACX,CACL,MAAO,CACL,KAAM,UACN,KAAMI,EAAc,EAAE,mBACtB,OAAQ,CACN,QAASD,EACT,MAAOE,GAAK,EAAE,OAAO,CACvB,CACF,EACA,YAAa,EACf,EACSJ,EAAyB,OAC3B,CACL,MAAO,CACL,KAAM,UACN,KAAMG,EAAc,EAAE,sBAAsB,MAC5C,OAAQ,CACN,QAAS,IAAMF,EAA0B,EAAI,EAC7C,MAAOG,GAAK,EAAE,OAAO,CACvB,CACF,EACA,YAAaD,EAAc,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,EAAc,EAAE,cAAc,WAC7C,CACF,CA/CgBE,EAAAP,GAAA,YCXhB,OAAS,UAAAQ,OAAc,gBAEhB,IAAMC,GAAYD,GAAO,MAAO,CACrC,UAAW,QACX,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,QAClB,CAAC,EAEYE,GAASF,GAAO,MAAO,CAClC,MAAO,MACT,CAAC,EAEYG,GAAaH,GAAO,MAAO,CACtC,QAAS,OACX,CAAC,EFGM,SAASI,GAASC,EAAkB,CACzC,GAAM,CAAE,MAAAC,EAAO,MAAAC,CAAM,EAAIF,EACnBG,EACJC,EAAiB,IAAI,yBAAyB,EAC1CC,EACJD,EAAiB,IAAI,0BAA0B,EAE3CE,EAAWC,EAAY,EAAE,SAAS,EAElCC,EAAOC,GACXP,EACAC,EACA,IAAME,EAA0BC,EAAU,EAAI,EAC9CL,CACF,EAEA,OACES,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,CAAY,KAAM,GAAI,MAAM,OAAO,EACpCF,GAAA,cAACG,GAAA,CAAQ,KAAM,EAAG,EAClBH,GAAA,cAACI,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BC,EAAc,EAAE,cAAc,KACjC,EACC,CAAC,CAACP,EAAK,aACNE,GAAA,cAACI,GAAA,CACC,QAAQ,OACR,KAAK,QACL,MAAM,SACN,MAAM,cACLN,EAAK,WACR,EAEFE,GAAA,cAACG,GAAA,CAAQ,KAAM,EAAG,EACjB,CAAC,CAACL,EAAK,OACNE,GAAA,cAACM,GAAA,KACCN,GAAA,cAACO,GAAA,CACC,KAAMT,EAAK,MAAM,KACjB,MAAOA,EAAK,MAAM,KAClB,OACEA,EAAK,MAAM,QACTE,GAAA,cAACQ,GAAA,CACC,KAAK,SACL,KAAMV,EAAK,MAAM,KACjB,OACEE,GAAA,cAACS,GAAA,KACCT,GAAA,cAACU,GAAA,CAAY,KAAM,EAAG,CACxB,EAEF,QAASZ,EAAK,MAAM,OAAO,SAC1BA,EAAK,MAAM,OAAO,KACrB,EAGJ,QAAQ,QACV,CACF,CAEJ,CAEJ,CA3DgBa,EAAAtB,GAAA,YGjBhB,OAAS,QAAAuB,OAAY,eACrB,OACE,UAAAC,GACA,WAAAC,GACA,cAAAC,GACA,SAAAC,GACA,cAAAC,GACA,eAAAC,OACK,gBACP,OAAOC,OAAW,QCTlB,OAAS,cAAAC,OAAkB,gBAC3B,OAAOC,OAAW,QCHlB,OAAS,aAAAC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAASD,GAAO,MAAO,CAClC,MAAO,OACP,WAAY,KACd,CAAC,EAEYE,GAAOF,GAAO,MAAO,CAChC,QAAS,OACT,cAAe,SACf,WAAY,aACZ,IAAK,GACL,MAAO,MACT,CAAC,EAEYG,GAAOH,GAAO,MAAO,CAChC,QAAS,OACT,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,MAAO,OACP,UAAW,CACT,QAAS,qBACT,CAAC,IAAID,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,SACT,CACF,CAAC,EAEYK,GAASJ,GAAO,MAAO,CAClC,QAAS,KACT,UAAW,aACX,OAAQ,SACV,CAAC,ED3BM,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,MAAMD,GAC/B,CACF,CAEJ,CAhBgBK,EAAAR,GAAA,wBD4BT,SAASS,GAA0BC,EAAc,CACtD,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,UAAAC,EAAW,QAAAC,CAAQ,EAAIJ,EACxCK,EAAOD,EAAQ,eAAiB,OAAS,QAAU,UACnDE,EAAoB,CACxB,CACE,MAAOC,GAAK,EAAE,UAAU,EACxB,MAAOC,EACLJ,EAAQ,cACR,EACA,CACF,CACF,EACA,CACE,MAAOG,GAAK,EAAE,UAAU,EACxB,MAAOC,EACLJ,EAAQ,SACR,EACA,CACF,CACF,EACA,CACE,MAAOG,GAAK,EAAE,WAAW,EACzB,MAAOC,EACLJ,EAAQ,eACR,EACA,CACF,CACF,EACA,CACE,MAAOG,GAAK,EAAE,cAAc,EAC5B,MAAOC,EACLJ,EAAQ,YACR,EACA,CACF,EACA,WAAY,GAAGC,MACjB,CACF,EAEA,OACEI,GAAA,cAACC,GAAA,CAAM,KAAMT,EAAM,QAASC,EAAS,UAAWS,EAAa,GAC3DF,GAAA,cAACG,GAAA,CACC,KAAMP,EACN,MAAOQ,EAAc,EAAE,mBAAmB,YAC1C,YAAaA,EAAc,EAAE,mBAAmB,YAClD,EAEAJ,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAQ,KAAM,GAAI,EACnBN,GAAA,cAACO,GAAA,CAAW,KAAK,QAAQ,QAAQ,SAC9BT,GAAK,EAAE,SAAS,CACnB,EACAE,GAAA,cAACK,GAAA,KACER,EAAkB,IAAI,CAACW,EAAMC,IAErBT,GAAA,cAACU,GAAA,CAAqB,IADjBD,EAC4B,GAAGD,EAAM,CAClD,CACH,CACF,EAEAR,GAAA,cAACM,GAAA,CAAQ,KAAM,GAAI,EACnBN,GAAA,cAACW,GAAA,CACC,KAAK,UACL,KAAK,QACL,OAAQX,GAAA,cAACY,GAAA,IAAY,EACrB,UAAS,GACT,QAASlB,GACRU,EAAc,EAAE,mBAAmB,cACtC,CACF,CAEJ,CAvEgBS,EAAAvB,GAAA,6BG7BhB,OAAS,QAAAwB,OAAY,eAYd,SAASC,GACdC,EACAC,EACkB,CAClB,IAAMC,EAAuB,CAC3B,UAAW,UACX,MAAO,GACP,OAAQ,WACV,EACA,OAAIF,GACEA,EAAQ,OAAS,IACEG,GAAoBH,EAAQ,WAAW,IACvC,SACnBE,EAAU,UAAY,SAExBA,EAAU,OAAS,KACnBA,EAAU,MAAQE,EAAc,EAAE,mBAAmB,OAEnDJ,EAAQ,OAAS,IACnBE,EAAU,MAAQE,EAAc,EAAE,kBAAkB,OAElDJ,EAAQ,OAAS,IACnBE,EAAU,MAAQG,GAAK,EAAE,CACvB,GAAI,0FACJ,OAAQ,CACN,oBAAqBL,EAAQ,mBAC/B,CACF,CAAC,EACDE,EAAU,OAAS,mBAEjBF,EAAQ,OAAS,IACnBE,EAAU,MAAQG,GAAK,EAAE,iCAAiC,GAErDH,GAELD,GACFC,EAAU,UAAY,QAClBD,EAAM,OAAS,IACjBC,EAAU,MAAQD,EAAM,eACxBC,EAAU,OAAS,aAGjBD,EAAM,OAAS,IACjBC,EAAU,MAAQG,GAAK,EAAE,CACvB,GAAI,kFACJ,OAAQ,CACN,oBAAqBJ,EAAM,mBAC7B,CACF,CAAC,EACDC,EAAU,OAAS,mBAGdA,GAEF,IACT,CAvDgBI,EAAAP,GAAA,cCbhB,OAAS,QAAAQ,OAAY,eACrB,OAAS,UAAAC,GAAQ,WAAAC,GAAS,cAAAC,GAAY,SAAAC,GAAO,cAAAC,OAAkB,gBAC/D,OAAOC,OAAW,QAClB,OAAS,eAAAC,OAAmB,mBAcrB,SAASC,GAAqBC,EAAmB,CACtD,GAAM,CAAE,eAAAC,EAAgB,SAAAC,CAAS,EAAIC,EAAiB,EAChD,CAAE,KAAAC,EAAM,QAAAC,EAAS,UAAAC,EAAW,QAAAC,CAAQ,EAAIP,EACxCQ,EAAWC,GAAY,EACvBC,EAAeT,GAAkBC,EACvC,OACES,GAAA,cAACC,GAAA,CACC,OAAO,SACP,KAAMR,EACN,OACEO,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,QAASZ,GACTM,GAAA,cAACO,GAAA,CACC,KAAK,UACL,MACEX,EAAQ,OAAS,EACbS,GAAK,EAAE,eAAe,EACtBA,GAAK,EAAE,cAAc,EAE3B,YACET,EAAQ,OAAS,EACbS,GAAK,EAAE,CACL,GAAI,kFACJ,OAAQ,CAAE,aAAAN,CAAa,CACzB,CAAC,EACDM,GAAK,EAAE,CACL,GAAI,0FACJ,OAAQ,CACN,oBAAqBT,EAAQ,mBAC/B,CACF,CAAC,GAEPI,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,QAASP,GACRU,GAAK,EAAE,gBAAgB,CAC1B,CACF,CACF,CAEJ,CAtDgBI,EAAArB,GAAA,wBCpBhB,OAAS,UAAAsB,GAAQ,WAAAC,GAAS,cAAAC,GAAY,SAAAC,GAAO,eAAAC,OAAmB,gBAChE,OAAOC,OAAW,QAYX,SAASC,GAAyBC,EAAc,CACrD,GAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,UAAAC,CAAU,EAAIH,EAErC,OACEI,GAAA,cAACC,GAAA,CAAM,KAAMJ,EAAM,QAASC,EAAS,UAAWI,EAAa,GAC3DF,GAAA,cAACG,GAAA,CACC,KAAK,UACL,MAAOC,EAAc,EAAE,kBAAkB,YACzC,YAAaA,EAAc,EAAE,kBAAkB,YACjD,EAEAJ,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACM,GAAA,CACC,KAAK,UACL,KAAK,QACL,OAAQN,GAAA,cAACO,GAAA,IAAY,EACrB,UAAS,GACT,QAASR,GACRK,EAAc,EAAE,kBAAkB,cACrC,CACF,CAEJ,CAtBgBI,EAAAb,GAAA,4BTAT,SAASc,GAAuBC,EAAkB,CACvD,GAAM,CACJ,QAAAC,EACA,MAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,mBAAAC,EACA,oBAAAC,EACA,sBAAAC,EACA,iBAAAC,CACF,EAAIR,EAEES,EAAuB,CAC3B,KAAML,EACN,QAASE,EACT,UAAWC,CACb,EAEMG,EACJR,GAAO,OAAS,GAChBA,GAAO,OAAS,EAEZS,EAAYC,GAChBX,EACAC,GAAO,OAAS,GACdA,GAAO,OAAS,EACdA,EACA,IACN,EAIA,OACEW,GAAA,cAAAA,GAAA,cACGH,GAAuBG,GAAA,cAACC,GAAA,CAAS,MAAOZ,EAAO,MAAOC,EAAc,EAJtD,CAAC,CAACQ,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,EAGDnB,GACCY,GAAA,cAAAA,GAAA,cACGZ,EAAQ,OAAS,GAChBY,GAAA,cAACQ,GAAA,CACE,GAAGZ,EACJ,QAASR,EACX,GAGAA,EAAQ,OAAS,GACjBA,EAAQ,OAAS,IACjBY,GAAA,cAACS,GAAA,CAAsB,GAAGb,EAAsB,QAASR,EAAS,EAGnEA,EAAQ,OAAS,GAChBY,GAAA,cAACU,GAAA,CACE,GAAGd,EACJ,QAASR,EACX,CAEJ,CAEJ,CAEJ,CAvFgBuB,EAAAzB,GAAA,0BRCT,SAAS0B,GAAUC,EAAkB,CAC1C,GAAM,CACJ,MAAAC,EACA,KAAAC,EACA,QAAAC,EACA,MAAAC,EACA,QAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,mBAAAC,EACA,oBAAAC,EACA,sBAAAC,EACA,iBAAAC,EACA,SAAAC,EAAW,GACX,cAAAC,EAAgB,QAClB,EAAIb,EACE,CAAE,YAAAc,EAAa,cAAAC,EAAe,eAAAC,EAAgB,aAAAC,CAAa,EAC/DC,EAAc,EAOVC,EAAY,EAJhBf,IACCA,EAAM,OAAS,GACdA,EAAM,OAAS,KAEYH,GAASA,EAAM,QAAU,CAACE,EAEnDiB,GAA0Bf,GAAWD,IACzCiB,GAAA,cAACC,GAAA,CACC,QAASjB,EACT,MAAOD,EACP,QAASD,EACT,aAAcG,EACd,iBAAkBC,EAClB,mBAAoBC,EACpB,oBAAqBC,EACrB,sBAAuBC,EACvB,iBAAkBC,EACpB,EAEF,OACEU,GAAA,cAAAA,GAAA,cACGlB,GACCkB,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CAAkB,WAAYX,IAAkB,OAC/CQ,GAAA,cAACI,GAAA,CAAc,KAAMvB,EAAM,SAAUU,EAAU,CACjD,CACF,EAGDC,IAAkB,OACjBQ,GAAA,cAACK,GAAA,KAAmBN,CAAuB,EAE5CD,EACCE,GAAA,cAACE,GAAA,KACCF,GAAA,cAACM,GAAA,CACC,MAAO1B,EACP,MAAOG,EACP,QAASC,EACT,KAAMH,EACN,SAAUU,EACV,YAAa,GACb,MAAO,CACL,MAAOE,EACP,SAAUC,GAAe,SAAS,GAAK,EACzC,EACA,OAAQ,CACN,MAAOE,GAAc,SAAS,GAAK,GACnC,SAAUD,GAAgB,SAAS,GAAK,EAC1C,EACF,CACF,EACE,KAEHH,IAAkB,UACjBQ,GAAA,cAAAA,GAAA,cACG,CAAChB,GAAW,CAACD,GAASiB,GAAA,cAACO,GAAA,CAAQ,KAAM,GAAI,EACzCR,CACH,CAEJ,CAEJ,CAjFgBS,EAAA9B,GAAA,akBZhB,OAAS,wBAAA+B,OAA4B,wCACrC,OAAS,aAAAC,OAAiB,QCH1B,OAAS,UAAAC,GAAQ,YAAAC,OAAgB,QAU1B,SAASC,IAA+B,CAC7C,GAAM,CAACC,EAASC,CAAU,EAAIC,GAAS,EAAK,EACtCC,EAAkBC,GAA+B,IAAI,EACrDC,EAASC,EAAA,IAAMH,EAAgB,SAAS,MAAM,EAArC,UAqBf,MAAO,CAAE,MAnB6BG,EAAA,MAAOC,GAAgB,CAC3DF,EAAO,EACPF,EAAgB,QAAU,IAAI,gBAE9BF,EAAW,EAAI,EAEf,GAAI,CACF,IAAMO,EAAM,MAAMC,GAAY,EAAE,aAAaF,EAAa,CACxD,OAAQJ,EAAgB,QAAQ,MAClC,CAAC,EACD,OAAAA,EAAgB,QAAU,KACnBK,CAET,OAASE,EAAP,CACA,MAAMA,CACR,QAAE,CACAT,EAAW,EAAK,CAClB,CACF,EAlBsC,SAmBtB,QAAAD,EAAS,YAAaK,CAAO,CAC/C,CAzBgBC,EAAAP,GAAA,iBCgBT,SAASY,GAA+BC,EAA6B,CAC1E,GAAI,CAACA,EAAS,OACZ,MAAM,IAAI,MAAMC,EAAc,EAAE,cAAc,MAAO,CACnD,MAAO,CACL,OACA,iBAAkBD,EAAS,oBAAoB,CAAC,CAClD,CACF,CAAC,EAGH,GADmBE,GAAcF,CAAQ,EACzB,CACd,GAAM,CAAE,KAAAG,EAAM,eAAAC,EAAgB,qBAAAC,CAAqB,EACjDC,GAAqBN,CAAQ,EAE/B,MAAM,IAAI,MAAM,qBAAsB,CACpC,MAAO,CACL,OACA,KAAMG,EACN,eAAAC,EACA,qBAAAC,CACF,CACF,CAAC,EAGH,IAAME,EAAuBC,GAAoBR,CAAQ,EAEzD,GAAIO,EAAsB,CACxB,IAAME,EAAsBC,GAAuBV,CAAQ,EAC3D,MAAM,IAAI,MAAM,GAAI,CAClB,MAAO,CACL,OACA,qBAAAO,EACA,oBAAAE,CACF,CACF,CAAC,EAGH,OAAOT,CACT,CAtCgBW,EAAAZ,GAAA,kCAwCT,SAASa,GACdC,EACAC,EACAC,EAOqB,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,OAAQA,EAAO,KAAK,OACpB,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,EAGA,OAFsBa,EAAgB,SAAW,IAG/CV,EAAO,QAAU,CACf,SAAUU,CACZ,GAGKV,CACT,CA3EgBP,EAAAC,GAAA,oBA6ET,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,CA1BgBpB,EAAAmB,GAAA,qBF7HT,SAASE,IAA8B,CAC5C,GAAM,CACJ,UAAAC,EACA,QAAAC,EACA,YAAAC,EACA,SAAAC,EACA,MAAOC,EACP,kBAAmBC,EACnB,0BAAAC,CACF,EAAIC,EAAc,EAEZ,CACJ,SAAAC,EACA,eAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,yBAAAC,CACF,EAAIC,EAAiB,EACf,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EACvCC,EAAcC,EAAY,EAAE,YAAY,EACxCC,EAASD,EAAY,EAAE,OAAO,EAC9B,CAAE,aAAAE,CAAa,EAAIF,EAAY,EAAE,OACjC,CAAE,0BAAAG,CAA0B,EAAIH,EAAY,EAAE,OAE9CI,EAAeb,GAAkBD,EAEjC,CAAE,MAAOe,EAAY,YAAAC,EAAa,QAAAC,CAAQ,EAAIC,GAAc,EAElE,OAAAC,GAAU,IAAMH,EAAa,CAAC,CAAC,EAkFxB,CACL,QAAAC,EACA,MAlFkCG,EAAA,MAAOC,GAAmB,CAC5D,IAAMC,EAAkBD,EAAO,gBACzBE,EACJF,GAAQ,mBAAqBxB,EAE/B,GAAI,CAACL,GAAa,CAACC,GAAW,CAACC,EAC7B,MAAO,CACL,MAAO,KACP,KAAM,KACN,MAAO,KACP,SAAU,IACZ,EAGF,IAAM8B,EAAcC,GAAuB,CACzC,UAAAjC,EACA,QAAAC,EACA,YAAAC,EACA,QAASa,EACT,gBAAAe,EACA,wBAAyBT,EACzB,yBAAAR,EACA,SAAUS,EACV,aAAAX,EACA,iBAAAD,EACA,iBAAAE,EACA,aAAcR,GAAgB,OAC9B,YAAa2B,CACf,CAAC,EACGX,GAAc,UAChBY,EAAY,aAAe,IAE7B,IAAIE,EACJ,GAAI,CACFA,EAAe,MAAMX,EAAWS,CAAW,EAAE,KAAMG,GACjDC,GAA+BD,CAAQ,CACzC,EACAhC,EAAS+B,CAAY,CACvB,OAASG,EAAP,CAEA,OAD0BC,GAAkBD,CAAK,CAEnD,CAEA,IAAME,EAAoC,CACxC,SAAUjB,EAAa,SAAS,EAChC,uBAAwBT,CAC1B,EACM2B,EAAOC,GACXvC,EAAY,SAAS,EACrBgC,EACAQ,GAAqBZ,CAAe,EACpCS,EACA,GACA,CAAE,YAAAtB,EAAa,OAAAE,CAAO,CACxB,EAEMwB,EAAsBC,GAC1BxC,GAAgB,OAChB8B,EACA,CACE,UAAAlC,EACA,QAAAC,EACA,KAAM,CAAE,YAAAgB,EAAa,OAAAE,CAAO,EAC5B,gBAAAW,EACA,aAAAR,CACF,CACF,EAEA,OAAIqB,EAAoB,aACtBrC,EAA0B,EAAK,EAG1B,CACL,MAAO4B,EACP,KAAAM,EACA,MAAO,KACP,SAAUG,CACZ,CACF,EA9EoC,SAmFlC,YAAAnB,CACF,CACF,CApHgBI,EAAA7B,GAAA,kB1CmBhB,IAAM8C,GAAYC,GAAO,MAAO,CAC9B,SAAU,WACV,MAAO,OACP,iBAAkB,CAChB,QAAS,OACT,eAAgB,gBAChB,WAAY,QACd,EACA,UAAW,CACT,MAAO,MACP,OAAQ,MACR,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,EACA,yBAA0B,CACxB,WAAY,KACd,CACF,CAAC,EAEKC,GAAUD,GAAO,MAAO,CAC5B,MAAO,OACP,QAAS,OACT,eAAgB,gBAChB,oBAAqB,CACnB,SAAU,EACV,aAAc,KAChB,EACA,CAAC,KAAKE,IAAY,EAAG,CACnB,MAAO,MACP,OAAQ,KACV,CACF,CAAC,EAEM,SAASC,IAAkB,CAEhC,GAAM,CACJ,MAAAC,EACA,eAAAC,EACA,gBAAAC,EACA,sBAAAC,EACA,wBAAAC,EACA,kBAAAC,EACA,uBAAAC,CACF,EAAIC,EAAc,EACZC,EAAWC,GAAY,EACvB,CAACC,EAAgBC,CAAiB,EAAIC,GAAiB,EAAE,EAEzD,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EACvCC,EAAoB,CAACZ,EACrB,CAACa,EAAaC,CAAc,EAAIL,GAAS,EAAK,EAC9CM,EAAkBC,GAAW,IAAI,gBAAgB,EACjDC,EACJC,EAAiB,IAAI,yBAAyB,EAC1CC,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,EAEG,CAACoB,EAAuBC,CAAwB,EAAIrB,GAAS,EAAK,EAElEsB,EAAsCC,EAAA,MAAO,CACjD,gBAAAjC,EACA,kBAAAG,CACF,IAAM,CACJ,IAAM+B,GAAS,MAAMV,IAAc,CAAE,gBAAAxB,EAAiB,kBAAAG,CAAkB,CAAC,EACzE,OAAA0B,EAAqBK,EAAM,EACpBA,EACT,EAP4C,iBAStCC,EAAaF,EAAA,SAAY,CAC7B,GAAIL,EAAkB,MAAQ3B,EAC5B,GAAI,CACF,MAAMqB,GAAS,OACb,OACA,CAAE,YAAaM,EAAkB,IAAK,EACtC,CAAE,GAAIA,EAAkB,KAAK,SAAU,CACzC,EACAZ,EAAgBY,EAAkB,KAAK,SAAS,EAEhD,IAAMQ,EAAW,MAAMC,EAAiB,SAAST,EAAkB,KAAK,YACxEtB,EAAS8B,EAAU,CACjB,QAAS,EACX,CAAC,EACD,WAAW,IAAM,CACfrC,EAAe,EAAE,CACnB,EAAG,CAAC,CACN,OAASuC,EAAP,CACA7B,EAAkB,UAAa6B,GAAW,OAAO,CACnD,CAEJ,EArBmB,cAuBbC,EAAYN,EAAA,SAAY,CAC5B,MAAME,EAAW,CACnB,EAFkB,aAIZK,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,gBAAAxB,EAAiB,kBAAAG,CAAkB,CAAC,EAC/C,KAAMuC,GAAQ,CACbb,EAAqBa,CAAG,CAC1B,CAAC,EACA,MAAOC,GAAU,QAAQ,MAAMA,CAAK,CAAC,CAC1C,EAXkB,aAalB,OAAAC,GAAU,IAAM,CAEZ,CAAC,CAACxB,EAA6B,QAAQ,QACvC,CAACF,EAAyB,QAErBuB,EAAU,EAEjBrB,EAA6B,QAAUF,CACzC,EAAG,CAACA,EAAyB,MAAM,CAAC,EAEpC0B,GAAU,IAAM,CACV/B,GACFa,EAAY,CAEhB,EAAG,CAACb,CAAiB,CAAC,EAEtB+B,GAAU,IAAM,CACV/B,GACFE,EAAeF,CAAiB,CAEpC,EAAG,CAACA,CAAiB,CAAC,EAEtB+B,GAAU,IAAM,CACT/B,GACHW,EAAY,CAAE,gBAAAxB,EAAiB,kBAAAG,CAAkB,CAAC,EAC/C,KAAM+B,GAAWL,EAAqBK,CAAM,CAAC,EAC7C,MAAOS,GAAU,QAAQ,MAAMA,CAAK,CAAC,CAE5C,EAAG,CAAC,CAAC,EAELC,GAAU,IAAM,CACd,IAAMC,EACJjB,EAAkB,UAAU,OAAO,MACnC,OAAO,OAAOkB,EAAgB,EAAE,SAC9BlB,EAAkB,UAAU,OAAO,IACrC,EAEImB,EACJ/C,EAAgB,OAAS,GACzB,CAACA,EAAgB,MAAOgD,IACtBrC,EAAiB,KACdsC,GACCD,GAAe,UAAYC,EAAgB,SAC3CD,GAAe,aAAeC,EAAgB,YAC9CD,GAAe,QAAUC,EAAgB,KAC7C,CACF,EAEEC,GAAsB,GAE1B,GAAIL,EAAc,CAChB,IAAIM,GAAkBC,GAAmBtD,CAAK,EAExCuD,EACJvD,GAAO,QAAQ,MAAMA,EAAM,OAAO,MAAM,OAAS,CAAC,EAAE,GAAG,WAE5B,CAAC,CAACA,GAAO,QAAQ,MAAM,KACjDwD,IAASA,GAAK,KAAK,aAAeD,CACrC,IAGEF,GAAkBA,GAAgB,MAChC,CAACA,GAAgB,OACjBA,GAAgB,OAAS,CAC3B,GAGiCA,GAAgB,MAChDI,IACCvD,EAAgB,KACbgD,IAAmBA,GAAe,QAAUO,EAC/C,CACJ,IAGEL,GAAsB,IAItBpD,IAAUiD,GAA8BG,MAC1C,eAAe,IAAMM,GAAUzC,EAAe,KAAK,KAAM,EAAI,CAAC,CAAC,EAC/Db,EAAwB,EAAK,EAEjC,EAAG,CACD0B,EAAkB,UAAU,MAC5B5B,EAAgB,OAChBW,EAAiB,MACnB,CAAC,EAED8C,GAAgB,IAAM,CACf3D,GACHQ,EAAS,KAAK,CAElB,EAAG,CAAC,CAAC,EAGHoD,GAAA,cAACC,EAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,cAAc,EAC5B,SAAU,IAAM,CACd,IAAMC,EAAc,MAAMxB,EAAiB,UAC3C/B,EAASuD,CAAW,CACtB,EACA,OACEH,GAAA,cAACI,GAAA,CACC,UAAWC,EAAa,EACxB,KAAK,SACL,QAASH,GAAK,EAAE,UAAU,GAC1BF,GAAA,cAACM,GAAA,CACC,KAAK,QACL,QAAQ,QACR,QAAS,IAAM1D,EAAS,MAAQ+B,EAAiB,QAAQ,GACzDqB,GAAA,cAACO,GAAA,CAAa,KAAM,GAAI,MAAM,QAAQ,CACxC,CACF,CAEJ,EACA,OACEP,GAAA,cAAC/D,GAAA,KACC+D,GAAA,cAAC,OAAI,UAAU,kBACbA,GAAA,cAACQ,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,UAAS,GACT,QAASzC,EACT,SAAU,CAAC,CAACG,EAAkB,MAC9B,QAASY,GACRoB,GAAK,EAAE,YAAY,CACtB,CACF,EACAF,GAAA,cAAC9D,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAAS6B,EACT,QAASV,EAAe,KAAK,KAAM,EAAI,GACvC2C,GAAA,cAACS,GAAA,CAAW,KAAM,GAAI,CACxB,CACF,GAEDrD,GACC4C,GAAA,cAACU,GAAA,CACC,KAAMtD,EACN,QAAS,IAAMC,EAAe,EAAK,EACnC,SAAUW,EACV,QAASD,EACT,eAAgBO,EAClB,EAGF0B,GAAA,cAACjE,GAAA,KACCiE,GAAA,cAAC,OAAI,UAAU,eACbA,GAAA,cAACW,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BT,GAAK,EAAE,SAAS,CACnB,EACAF,GAAA,cAACQ,GAAA,CACC,MAAO,CAAE,QAAS,GAAI,EACtB,QAAQ,QACR,SAAUzC,EACV,QAASgB,GACTiB,GAAA,cAAC,OAAI,UAAU,QACbA,GAAA,cAACY,GAAA,CAAY,KAAM,GAAI,CACzB,CACF,CACF,EACC9D,GACCkD,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACa,GAAA,CAAM,KAAK,QAAQ,QAAQ,QAAQ,MAAO/D,EAAgB,EAC3DkD,GAAA,cAACc,GAAA,CAAQ,KAAM,GAAI,CACrB,EAED5C,EAAkB,UAAU,aAC3B8B,GAAA,cAAC,OAAI,UAAU,uBACbA,GAAA,cAACa,GAAA,CACC,QAAQ,QACR,KAAK,UACL,MACE3C,EAAkB,SAAS,aAC3B6C,GACE7C,EAAkB,SAAS,WAC7B,EAEJ,CACF,EAEF8B,GAAA,cAACgB,GAAA,CACC,MAAO5E,EACP,KAAK,eACL,SAAU,GACV,cAAc,MACd,MAAO8B,EAAkB,MACzB,QAASH,EACT,QAASG,EAAkB,UAAU,OAAS,KAC9C,aAAca,EACd,iBAAkBX,EAClB,mBAAoB,IAAMC,EAAyB,EAAI,EACvD,oBAAqB,IAAMA,EAAyB,EAAK,EACzD,sBAAuB,SAAY,CACjCA,EAAyB,EAAK,EAC9B,MAAMI,EAAW,CACnB,EACA,iBAAkB,IAAM7B,EAAS,MAAQ+B,EAAiB,QAAQ,EACpE,CACF,CACF,CAEJ,CA5SgBJ,EAAApC,GAAA,mB6CtEhB,OAAS,QAAA8E,OAAY,eACrB,OAAS,cAAAC,OAAkB,iCAC3B,OAAS,WAAAC,GAAS,YAAAC,GAAU,UAAAC,OAAc,gBAC1C,OAAOC,IAAS,YAAAC,OAAgB,QAChC,OAAS,eAAAC,OAAmB,mBCL5B,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,SAAAC,EACA,GAAGC,CACL,EAAIR,EAEJ,OACES,GAAA,cAACC,GAAA,CACC,OACED,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CAAW,MAAM,QAAQ,CAC5B,EAEF,OACE,CAAC,CAACN,EAAM,QACNG,GAAA,cAACI,GAAA,CACC,QAAQ,QACR,QAAS,IAAMN,IAAW,EAAE,EAC5B,KAAK,SACLE,GAAA,cAACK,GAAA,CAAU,MAAM,OAAO,KAAM,GAAI,CACpC,EAGJ,UAAWZ,EACX,MAAOC,EACP,QAASF,EACT,MAAO,CACL,QAAS,GACT,aAAc,GACd,WAAY,QACd,EACA,KAAMG,EACN,MAAOE,EACP,SAAUD,EACT,GAAGG,EACN,CAEJ,CA3CgBO,EAAAhB,GAAA,eELhB,OAAS,QAAAiB,OAAY,eACrB,OAAS,WAAAC,GAAS,gBAAAC,GAAc,cAAAC,OAAkB,gBAClD,OAAOC,MAAW,QCJlB,OAAS,aAAAC,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAQD,GAAO,MAAO,CACjC,MAAO,OACP,QAAS,OACT,cAAe,SACf,eAAgB,CACd,QAAS,qBACT,CAAC,IAAID,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,SACT,CACF,CAAC,EAEYG,GAAOF,GAAO,MAAO,CAChC,QAAS,OACT,eAAgB,aAChB,QAAS,IACX,CAAC,EAEYG,GAAWH,GAAO,MAAO,CACpC,IAAK,MACL,QAAS,OACT,cAAe,QACjB,CAAC,EAEYI,GAAoBJ,GAAO,MAAO,CAC7C,OAAQ,OACR,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,CAAC,EDtBM,SAASK,GAAWC,EAAkB,CAC3C,GAAM,CAAE,KAAAC,EAAM,YAAAC,EAAa,QAAAC,EAAS,UAAAC,CAAU,EAAIJ,EAC5CK,EAASF,EAAUA,EAAQF,CAAI,EAAI,CAAC,CAAE,MAAO,UAAW,MAAOA,CAAK,CAAC,EAE3E,GAAIG,EAAW,CACb,IAAME,EAAQ,CAAC,CAAC,EAAG,CAAC,CAAC,EAYrB,OACEC,EAAA,cAAAA,EAAA,cAXoB,CACpB,CACE,MAAO,QACP,MAAAD,CACF,EACA,CACE,MAAO,aACP,MAAAA,CACF,CACF,EAGmB,IAAKE,GAClBD,EAAA,cAACA,EAAM,SAAN,CAAe,IAAKC,EAAM,OACzBD,EAAA,cAACE,GAAA,KACCF,EAAA,cAACG,GAAA,KACCH,EAAA,cAACI,GAAA,CACC,QAAQ,QACR,KAAK,SACL,UAAU,eACTC,GAAK,EAAEJ,EAAM,KAAK,CACrB,CACF,EACAD,EAAA,cAACM,GAAA,CAAQ,KAAM,EAAG,EAClBN,EAAA,cAACO,GAAA,KACEN,EAAM,MAAM,IAAI,CAACO,EAAGC,IAAU,CAC7B,IAAMC,EAAMD,EAAQR,EAAM,MAC1B,OACED,EAAA,cAACA,EAAM,SAAN,CAAe,IAAKU,GACnBV,EAAA,cAACW,GAAA,CAAa,UAAW,GAAM,CACjC,CAEJ,CAAC,CACH,CACF,CACF,CACD,CACH,EAIJ,OACEX,EAAA,cAAAA,EAAA,cACGF,EACE,OAAQG,GAAUA,EAAM,MAAM,OAAS,CAAC,EACxC,IAAKA,GACJD,EAAA,cAACA,EAAM,SAAN,CAAe,IAAKC,EAAM,OACzBD,EAAA,cAACE,GAAA,KACCF,EAAA,cAACG,GAAA,KACCH,EAAA,cAACI,GAAA,CACC,QAAQ,QACR,KAAK,SACL,UAAU,eACTC,GAAK,EAAEJ,EAAM,KAAK,CACrB,CACF,EACAD,EAAA,cAACM,GAAA,CAAQ,KAAM,EAAG,EAClBN,EAAA,cAACO,GAAA,KACEN,EAAM,MAAM,IAAKW,GAAS,CACzB,IAAMC,EAAYD,EAAK,MAAM,CAAC,EACxBE,EAAWF,EAAK,MAAMA,EAAK,MAAM,OAAS,CAAC,EACjD,OACEZ,EAAA,cAACA,EAAM,SAAN,CAAe,IAAKY,EAAK,WACxBZ,EAAA,cAACW,GAAA,CACC,UAAWC,EAAK,UAChB,aAAcA,EAAK,aACnB,OAAQA,EAAK,OACb,QAASjB,EACT,aAAcM,EAAM,QAAU,QAC9B,cAAe,CACb,KAAM,CACJ,MAAO,CACL,MAAOY,EAAU,SACjB,YAAaA,EAAU,UACzB,EACA,WAAY,CACV,MAAOA,EAAU,oBAAsB,EACzC,EACA,OAAQE,GAAmBH,EAAK,WAAW,CAC7C,EACA,GAAI,CACF,MAAO,CACL,MAAOE,EAAS,OAChB,YAAaA,EAAS,QACxB,EACA,WAAY,CACV,MAAOA,EAAS,kBAAoB,EACtC,EACA,OAAQC,GACND,EAAS,cAAgB,EAC3B,EACA,gBAAiBC,GACfD,EAAS,mCAAqC,EAChD,CACF,CACF,EACF,CACF,CAEJ,CAAC,CACH,CACF,CACF,CACD,CACL,CAEJ,CAjHgBE,EAAAxB,GAAA,cEPhB,OAAOyB,OAAW,QAEX,IAAMC,GAA4BC,EAACC,GAAU,CAClD,IAAMC,EAMF,IAAI,IAAI,CACV,CACE,QACA,CACE,MAAO,QACP,MAAO,CAAC,CACV,CACF,EACA,CACE,QACA,CACE,MAAO,aACP,MAAO,CAAC,CACV,CACF,EACA,CACE,OACA,CACE,MAAO,YACP,MAAO,CAAC,CACV,CACF,EACA,CACE,UACA,CACE,MAAO,UACP,MAAO,CAAC,CACV,CACF,CACF,CAAC,EAEKC,EAAMC,GAAM,EAClB,OAAAH,EAAM,QAASI,GAAS,CACtB,IAAMC,EAAWF,GAAM,OAAOC,EAAK,YAAY,CAAC,EAC5CF,EAAI,OAAOG,EAAU,KAAK,EAC5BJ,EAAO,IAAI,OAAO,GAAG,MAAM,KAAKG,CAAI,EAC3BF,EAAI,OAAOG,EAAU,OAAO,EACrCJ,EAAO,IAAI,OAAO,GAAG,MAAM,KAAKG,CAAI,EAC3BF,EAAI,OAAOG,EAAU,MAAM,EACpCJ,EAAO,IAAI,MAAM,GAAG,MAAM,KAAKG,CAAI,EAEnCH,EAAO,IAAI,SAAS,GAAG,MAAM,KAAKG,CAAI,CAE1C,CAAC,EAEM,MAAM,KAAKH,EAAO,OAAO,CAAC,CACnC,EArDyC,oBCClC,IAAMK,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,mBNY/B,IAAME,GAAYC,GAAO,MAAO,CAC9B,QAAS,OACT,cAAe,SACf,WAAY,aACZ,OAAQ,OACR,IAAK,EACP,CAAC,EAEKC,GAAsBD,GAAO,MAAO,CACxC,UAAW,UACX,MAAO,OACP,QAAS,OACT,cAAe,SACf,IAAK,GACL,OAAQ,MACV,CAAC,EAEKE,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,EAAkBC,GAAW,IAAI,gBAAgB,EACjDC,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,EACnDC,EAAU,CAACR,EAAM,oBAEjBS,EAAgBpB,EAACqB,GAA+C,CACpE,IAAMnB,EAAQmB,EAAM,OAAO,MAC3BJ,EAAef,CAAK,CACtB,EAHsB,iBAKlBoB,EAAeT,EACfG,IACFM,EAAeT,EAAK,OACjBE,GACCX,GAAaW,EAAK,YAAaC,CAAW,GAC1CZ,GAAaW,EAAK,OAAQC,CAAW,GACrCjB,GAAmBgB,EAAK,MAAOC,CAAW,GAC1CZ,GAAaW,EAAK,UAAWC,CAAW,CAC5C,GAGF,IAAMO,EAAU,CAACD,GAAc,QAAU,CAACH,EAE1C,OACEK,GAAA,cAACC,EAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,SAAS,CACzB,GACAF,GAAA,cAAC5B,GAAA,KACC4B,GAAA,cAACG,GAAA,CACC,SAAUV,EACV,UAAS,GACT,QAAQ,YACR,YAAaS,GAAK,EAAE,oBAAoB,EACxC,UAAS,GACT,SAAUN,EACV,MAAOJ,EACT,EACAQ,GAAA,cAAC1B,GAAA,KACEyB,GACCC,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACM,GAAA,CACC,MAAOJ,GAAK,EAAE,kBAAkB,EAChC,YACEV,EAAcU,GAAK,EAAE,8BAA8B,EAAI,GAE3D,CACF,EAED,CAACH,GACAC,GAAA,cAACO,GAAA,CACC,KAAMT,EACN,YAAcU,GAAc,CAC1B1B,EAAgB0B,CAAS,EACzBxB,EAASwB,CAAS,CACpB,EACA,QAASC,GACT,UAAWd,EACb,CAEJ,CACF,CACF,CAEJ,CApEgBnB,EAAAK,GAAA,eOhDhB,OAAS,QAAA6B,OAAY,eACrB,OAAS,UAAAC,GAAQ,UAAAC,GAAQ,aAAAC,GAAW,eAAAC,OAAmB,gBACvD,OAAOC,IAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QACnD,OAAS,eAAAC,OAAmB,mBCH5B,OAAS,eAAAC,GAAa,UAAAC,OAAc,gBACpC,OAAOC,OAAW,QAIlB,IAAMC,GAAwBC,GAAO,MAAO,CAC1C,SAAU,WACV,OAAQ,QACR,KAAM,MACN,UAAW,uBACX,OAAQ,SACV,CAAC,EAEKC,GAAeD,GAAO,MAAO,CACjC,aAAc,MACd,OAAQ,wBACR,WAAY,cACZ,MAAO,MACP,OAAQ,MACR,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,MAAO,cACP,UAAW,CACT,MAAO,eACT,CACF,CAAC,EAEM,SAASE,IAAwB,CACtC,IAAMC,EAAkBC,EAAc,IAAI,gBAAgB,EAE1D,OACEC,GAAA,cAACN,GAAA,KACCM,GAAA,cAACJ,GAAA,CACC,QAAS,IAAM,CACbE,EAAgB,CAClB,GACAE,GAAA,cAACC,GAAA,CAAY,KAAM,GAAI,CACzB,CACF,CAEJ,CAbgBC,EAAAL,GAAA,yBCzBhB,OAAS,eAAAM,GAAa,aAAAC,GAAW,YAAAC,OAAgB,QAkBjD,IAAMC,GAAiB,IAmBhB,SAASC,IAA6B,CAC3C,GAAM,CAAE,MAAOC,EAAY,YAAAC,CAAY,EAAIC,GAAc,EACnD,CAAE,iBAAAC,EAAkB,0BAAAC,EAA2B,aAAAC,CAAa,EAChEC,EAAY,EAAE,OACVC,EAASD,EAAY,EAAE,OAAO,EAC9B,CACJ,UAAAE,EACA,QAAAC,EACA,YAAAC,EACA,cAAAC,EACA,WAAAC,EACA,SAAAC,CACF,EAAIC,EAAc,EACZ,CACJ,SAAAC,EACA,eAAAC,EACA,iBAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,yBAAAC,CACF,EAAIC,EAAiB,EACf,CAACC,EAASC,CAAU,EAAIC,GAAS,EAAK,EACtC,CAACC,EAAOC,CAAQ,EAAIF,GAA4B,IAAI,EACpD,CAACG,EAASC,CAAU,EAAIJ,GAA8B,IAAI,EAC1DK,EAAeb,GAAkBD,EAEjCe,EADiB,CAACtB,GAAa,CAACC,GAGpCsB,GAAevB,EAAWC,CAAO,GACjC,CAACuB,GAAiBtB,CAAW,EAEzBuB,EAAaC,EAACZ,GAAqB,CACvCC,EAAWD,CAAO,EAClBI,EAAS,IAAI,EACbE,EAAW,IAAI,CACjB,EAJmB,cAMbO,EAAQD,EAACE,GAA6B,CAC1C,GAAM,CACJ,UAAA5B,EACA,QAAAC,GACA,YAAAC,GACA,iBAAAP,EACA,wBAAAkC,GACA,yBAAAjB,GACA,SAAAL,GACA,aAAAG,GACA,iBAAAD,GACA,iBAAAE,EACF,EAAIiB,EAIJ,GAHKd,GACHW,EAAW,EAAI,EAEb,CAACH,GAAqBtB,GAAaC,GAAS,CAC9CG,EAAW,EACX,IAAM0B,GAAcC,GAAuB,CACzC,UAAA/B,EACA,QAAAC,GACA,YAAAC,GACA,iBAAAP,EACA,wBAAAkC,GACA,yBAAAjB,GACA,SAAAL,GACA,aAAAG,GACA,iBAAAD,GACA,iBAAAE,EACF,CAAC,EACGd,GAAc,UAChBiC,GAAY,aAAe,IAE7BtC,EAAWsC,EAAW,EACnB,KAAME,IAAQ,CACbjB,EAAW,EAAK,EAChBV,EAAS2B,EAAG,EACZC,GAA+BD,EAAG,EAClC,IAAME,EAAeC,GAAsBH,GAAK,CAC9C,UAAAhC,EACA,QAAAC,GACA,aAAAoB,EACA,OAAAtB,CACF,CAAC,EACDqB,EAAWc,CAAY,CACzB,CAAC,EACA,MAAOjB,IAAU,CAChB,GAAM,CAAE,MAAOmB,CAAW,EAAIC,GAAkBpB,EAAK,GAEnDmB,GAAY,OAAS,GACrBA,GAAY,OAAS,IAErBhC,EAAW,EAETgC,GAAY,OAAS,IACvBlB,EAASkB,CAAU,EACnBrB,EAAW,EAAK,EAEpB,CAAC,EAEP,EA5Dc,SA8DRuB,EAAiBC,GACrBC,GAAUZ,GAA6B,CAChCN,GACHK,EAAMC,CAAM,CAEhB,EAAGa,EAAc,EACjB,CAACnB,CAAiB,CACpB,EAEA,OAAAoB,GAAU,IAAM,CACd,GAAI,CAAClB,GAAiBtB,CAAW,GAAKC,GAAe,GAAG,CAAC,EAAG,CAC1DsB,EAAW,EAAK,EAChBhC,EAAY,EACZ,OAEF,GAAI,CAAA6B,EAGJ,OAAAlB,EAAW,EACXqB,EAAW,EAAI,EACfa,EAAe,CACb,YAAApC,EACA,UAAAF,EACA,QAAAC,EACA,iBAAAN,EACA,wBAAyBC,EACzB,yBAAAgB,EACA,SAAUS,EACV,aAAAX,EACA,iBAAAD,EACA,iBAAAE,CACF,CAAC,EACMlB,CACT,EAAG,CACDS,EACAF,GAAW,OACXA,GAAW,QACXA,GAAW,WACXC,GAAS,OACTA,GAAS,QACTA,GAAS,WACTqB,EACA3B,GAAkB,OAClBC,EACAgB,EAAyB,OACzBS,EACAX,EACAD,EACA,KAAK,UAAUE,CAAgB,CACjC,CAAC,EAEM,CACL,MAAO,IACLgB,EAAM,CACJ,YAAAzB,EACA,UAAAF,EACA,QAAAC,EACA,iBAAAN,EACA,wBAAyBC,EACzB,yBAAAgB,EACA,SAAUS,EACV,aAAAX,EACA,iBAAAD,EACA,iBAAAE,CACF,CAAC,EACH,QAAAG,EACA,MAAAG,EACA,QAAAE,CACF,CACF,CAxKgBO,EAAAnC,GAAA,gBFThB,IAAMoD,GAAYC,GAAO,MAAO,CAC9B,QAAS,OACT,cAAe,SACf,UAAW,UACX,sBAAuB,CACrB,WAAY,IACd,CACF,CAAC,EAEKC,GAAgBD,GAAO,MAAO,CAClC,SAAU,UACZ,CAAC,EAEKE,GAAkBF,GAAO,MAAO,CACpC,QAAS,OACT,cAAe,SACf,IAAK,EACL,UAAW,SACb,CAAC,EACM,SAASG,IAAO,CACrB,IAAMC,EAAWC,GAAY,EACvB,CACJ,MAAOC,EACP,QAASC,EACT,MAAOC,EACP,QAASC,CACX,EAAIC,GAAa,EACX,CACJ,UAAAC,EACA,eAAAC,EACA,QAAAC,EACA,aAAAC,EACA,eAAAC,EACA,YAAAC,EACA,cAAAC,EACA,aAAAC,EACA,eAAAC,EACA,MAAAC,EACA,kBAAAC,EACA,0BAAAC,CACF,EAAIC,EAAc,EAEZC,EAAkBC,EAAY,EAAE,YAEhCC,EAAmBC,EAAgB,IAAI,iBAAiB,EACxDC,EAAiBC,GAAW,IAAI,eAAe,EAC/C,CAACC,EAAuBC,CAAwB,EAAIC,GAAS,EAAK,EAClEC,EAAYC,GAAuB,IAAI,EAEvCC,EAAuB,GAEvBC,EAAmC,CAACC,GACxCjB,EACAJ,EACAC,CACF,EAEMqB,EAAoC,CAACD,GACzCjB,EACAJ,EACAG,CACF,EAEMoB,EAAkBC,GAAmB,CACzC,gBAAAhB,EACA,cAAAjB,EACA,YAAAS,EACA,MAAAI,EACA,mBAAoBM,EAAiB,OAAS,EAC9C,MAAOlB,EACP,QAASC,EACT,qBAAA0B,CACF,CAAC,EAEKM,EACF7B,GAAoBD,EAClB+B,EACEC,GACEjB,EACAd,GAAgB,KAChBD,GAAW,OACXA,GAAW,OACb,GAAG,QAAU,IACb,EACA,CACF,EACA,IAEAiC,EACFhC,GAAoBD,EAClB+B,EACEC,GACEjB,EACAd,GAAgB,KAChBD,GAAW,OACXA,GAAW,OACb,GAAG,QAAU,IACbgC,GACEjB,EACAd,GAAgB,KAChBD,GAAW,OACXA,GAAW,OACb,GAAG,OACL,EACA,IAENkC,GAAU,KACRjB,EAAekB,EAAiB,IAAI,EACpCzB,EAAkB,EACXO,EAAe,KAAK,KAAM,EAAE,GAClC,CAAC,CAAC,EAEL,IAAMmB,EACJ,CAAC9B,GAAiB,CAACE,GAAkB,CAACA,EAAe,GAAG,CAAC,EACrD,KACA6B,GAAe/B,EAAc,SAAS,EAAGE,EAAe,SAAS,CAAC,EAExE,OACE8B,GAAA,cAACC,EAAA,CACC,IAAKjB,EACL,YAAa,GACb,QAAO,GACP,OACEgB,GAAA,cAACE,GAAA,CACC,KAAK,UACL,KAAK,QACL,SAAUZ,EAAgB,SAC1B,OACEA,EAAgB,SAAW,mBAAqBU,GAAA,cAACG,GAAA,IAAY,EAE/D,UAAS,GACT,QAAS,IAAM,CACTb,EAAgB,SAAW,iBAC7BnC,EAAS0C,EAAiB,OAAO,EACxBP,EAAgB,SAAW,kBACpCR,EAAyB,EAAI,EAE7B3B,EAAS0C,EAAiB,WAAW,CAEzC,GACCP,EAAgB,KACnB,EAEF,OAAQ,CACN,SAAU,IAAM,CACdnC,EAAS0C,EAAiB,OAAO,CACnC,EACA,cAAe,GACf,MAAOO,GAAK,EAAE,MAAM,EACpB,OACEJ,GAAA,cAACK,GAAA,CACC,UAAWrB,EAAU,QACrB,eAAkBb,GAASZ,EAAaF,EAAa,OACrD,eAAgB,IAAMF,EAAS0C,EAAiB,KAAK,EACrD,gBAAiB,IAAM1C,EAAS0C,EAAiB,QAAQ,EAC3D,CAEJ,GACAG,GAAA,cAAClD,GAAA,KACCkD,GAAA,cAAC/C,GAAA,KACC+C,GAAA,cAAChD,GAAA,KACCgD,GAAA,cAACM,GAAA,CACC,MAAOF,GAAK,EAAE,MAAM,EACpB,KAAK,OACL,cAAetC,EACf,QAAS0B,EACT,MAAO,CACL,YAAa7B,GAAgB,aAAe,GAC5C,MAAOA,GAAgB,MAAQ,EACjC,EACA,MAAO,CACL,YAAaD,GAAW,QAAU,GAClC,MAAOA,GAAW,OAAS,EAC7B,EACA,aAAc,IAAMP,EAAS0C,EAAiB,QAAQ,EACtD,MAAO,CACL,MAAO9B,EACP,SAAUoB,EACN,OACAM,EACEzB,EACA,EACA,CACF,EACJ,MAAOmB,EACHoB,EAAc,EAAE,kBAAkB,YAClC,MACN,EACA,SAAUhC,IAAoB,SAC9B,QAASA,IAAoB,UAC7B,mBAAoB,IAAM,CACpBiB,IAAiB,KACnB1B,EAAe6B,EAAiB,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC,CAEvD,EACF,EACAK,GAAA,cAACQ,GAAA,IAAsB,CACzB,EACAR,GAAA,cAACM,GAAA,CACC,iBAAkB,CAAC,CAACnC,GAAO,QAAUb,EACrC,MAAO8C,GAAK,EAAE,IAAI,EAClB,KAAK,KACL,cAAe9C,EACf,MAAO,CACL,YAAaO,GAAc,aAAe,GAC1C,MAAOA,GAAc,MAAQ,EAC/B,EACA,MAAO,CACL,YAAaD,GAAS,QAAU,GAChC,MAAOA,GAAS,OAAS,EAC3B,EACA,iBAAkB6B,EAChBM,GAAe/B,EAAeE,CAAc,EAC5C,EACA,CACF,EACA,aAAcuC,GAAoBX,GAAoB,CAAC,EACvD,MAAO,CACL,MAAOL,EACLxB,EACA,EACA,CACF,EACA,SAAUoB,EACN,OACAI,EACEvB,EACA,EACA,CACF,EACJ,MAAOmB,EACHkB,EAAc,EAAE,kBAAkB,YAClC,MACN,EACA,aAAc,IAAMpD,EAAS0C,EAAiB,MAAM,EACpD,SAAUtB,IAAoB,SAC9B,QAASA,IAAoB,UAC/B,CACF,EACAyB,GAAA,cAAC,OAAI,UAAU,oBACbA,GAAA,cAACU,GAAA,CACC,MAAOvC,EACP,QAASb,EACT,MAAOC,EACP,QAASC,EACT,KAAK,QACL,aAAcH,EACd,iBAAkBwB,EAClB,mBAAoB,IAAMC,EAAyB,EAAI,EACvD,oBAAqB,IAAMA,EAAyB,EAAK,EACzD,sBAAuB,IAAM,CAC3BA,EAAyB,EAAK,EAC9BT,EAA0B,EAAI,EAC9BlB,EAAS0C,EAAiB,WAAW,CACvC,EACA,iBAAkB,IAAM1C,EAAS0C,EAAiB,QAAQ,EAC5D,CACF,CACF,CACF,CAEJ,CAlPgBc,EAAAzD,GAAA,QGlDhB,OAAS,QAAA0D,OAAY,eACrB,OACE,QAAAC,GACA,kBAAAC,GACA,SAAAC,GACA,aAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QCRlB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAoBD,GAAO,MAAO,CAC7C,OAAQ,OACR,SAAU,QACZ,CAAC,EAEYE,GAAsBF,GAAO,KAAM,CAC9C,QAAS,WACT,OAAQ,EACR,UAAW,OACX,OAAQ,OACR,UAAW,MACb,CAAC,EAEYG,GAAwBH,GAAO,MAAO,CACjD,MAAO,GACP,QAAS,OACT,eAAgB,UAClB,CAAC,EAEYI,GAAoBJ,GAAO,MAAO,CAC7C,QAAS,OACT,cAAe,SACf,WAAY,SACZ,eAAgB,SAChB,OAAQ,MACV,CAAC,ECbM,SAASK,IAA2B,CACzC,IAAMC,EAAWC,EAAiB,IAAI,SAAS,EACzCC,EAAcD,EAAiB,IAAI,YAAY,EAIrD,MAAO,CACL,eAAgBD,EAChB,UALgBG,GAMhB,gBALsBC,GAMtB,eAAiBJ,GAAaE,EAAYF,GAAYI,EAAgB,CACxE,CACF,CAZgBC,EAAAN,GAAA,eFAT,SAASO,IAAe,CAC7B,GAAM,CAAE,eAAAC,EAAgB,eAAAC,EAAgB,UAAAC,CAAU,EAAIC,GAAY,EAE5DC,EAAeF,EAAU,IAAKG,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,IAAMN,EAAeI,EAAa,KAAK,EAChD,IAAKI,GAAA,cAACE,GAAA,CAAM,MAAOL,EAAO,EAC1B,MAAOG,GAAA,cAACD,EAAA,IAAQ,CAClB,CACF,CAAC,EAED,OACEC,GAAA,cAACG,EAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,UAAU,CAC1B,GACAJ,GAAA,cAACK,GAAA,KACCL,GAAA,cAACM,GAAA,CAAU,MAAOf,GAChBS,GAAA,cAACO,GAAA,CACC,KACEP,GAAA,cAACQ,GAAA,CACC,MAAOJ,GAAK,EAAE,UAAU,EACxB,GAAG,IACH,QAAS,IAAM,QAAQ,IAAI,EAC7B,EAEF,MAAOT,EACT,CACF,CACF,CACF,CAEJ,CAxCgBc,EAAAnB,GAAA,gBGThB,OAAS,QAAAoB,OAAY,eACrB,OACE,UAAAC,GACA,YAAAC,GACA,SAAAC,GACA,kBAAAC,GACA,YAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,IAAS,YAAAC,OAAgB,QCdhC,OAAS,YAAAC,GAAU,YAAAC,OAAgB,gBACnC,OAAOC,OAAW,QCDlB,OAAS,YAAAC,GAAU,UAAAC,OAAc,gBAE1B,IAAMC,GAAkBD,GAAOD,GAAU,CAC9C,OAAQ,EACV,CAAC,EDGD,IAAMG,GAAsB,GACrB,SAASC,IAA6B,CAC3C,OACEC,GAAA,cAACC,GAAA,KACE,MAAM,KAAK,MAAMH,EAAmB,EAAII,GACvCF,GAAA,cAACG,GAAA,CACC,WAAU,GACV,IAAKD,EACL,MAAOF,GAAA,cAACI,GAAA,CAAS,QAAQ,WAAW,MAAO,GAAI,OAAQ,GAAI,EAC3D,MAAOJ,GAAA,cAACI,GAAA,CAAS,QAAQ,OAAO,KAAK,QAAQ,MAAO,GAAI,EACxD,IAAKJ,GAAA,cAACK,GAAA,CAAS,QAAS,GAAO,EACjC,CACD,CACH,CAEJ,CAdgBC,EAAAP,GAAA,8BD0BT,SAASQ,GAAoB,CAAE,WAAAC,CAAW,EAAc,CAC7D,IAAMC,EAAcC,EAAY,EAAE,YAC5BC,EAAWD,EAAY,EAAE,SAAS,EAClC,CAACE,EAAaC,CAAc,EAAIC,GAAiB,EAAE,EACnDC,EAAwBC,EAAiB,IAAI,sBAAsB,EACnEC,EACJC,GAAwBP,CAAQ,EAE5BQ,EAAyC,CAAC,EAC5CX,IAAe,aACjBW,EAAW,KAAK,KAAK,EAEnBX,IAAe,YACjBW,EAAW,KAAK,QAAQ,EACxBA,EAAW,KAAK,YAAY,GAG9B,IAAMC,EAAmBH,EAA8B,OAAQI,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,EACFP,EAAsBQ,EAAW,UAAU,EAEtCA,EAAW,UACdR,EAAsBQ,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,IAAMd,EAAsBa,CAAU,EAC/C,IAAKE,GAAA,cAACE,GAAA,CAAS,QAASL,EAAU,EAClC,MACEG,GAAA,cAACG,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAEN,CAAU,CACpB,EAEF,GAAGL,CACL,CACF,CAAC,EAEKY,EAAgBV,EAACW,GAA+C,CACpE,IAAMC,EAAQD,EAAM,OAAO,MAC3BvB,EAAewB,CAAK,CACtB,EAHsB,iBAKlBC,EAAeZ,EACnB,OAAId,IACF0B,EAAeZ,EAAK,OAAQH,GAC1BgB,GAAahB,EAAW,WAAYX,CAAW,CACjD,GAIAkB,GAAA,cAACU,EAAA,CACC,OAAQ,CACN,MAAON,GAAK,EAAE1B,CAAU,EACxB,OACEsB,GAAA,cAACW,GAAA,KACCX,GAAA,cAACY,GAAA,CAAO,QAAQ,QAAQ,KAAK,SAAS,QAASlB,GAC5CU,GAAK,EAAEZ,EAAe,eAAiB,YAAY,CACtD,CACF,CAEJ,GACAQ,GAAA,cAACa,GAAA,KACCb,GAAA,cAACc,GAAA,CACC,MAAOhC,EACP,SAAUC,EACV,UAAS,GACT,MAAM,QACN,QAAQ,YACR,YAAaqB,GAAK,EAAE,sBAAuB,CAAE,WAAA1B,CAAW,CAAC,EACzD,SAAU2B,EACZ,EACC1B,IAAgB,WAAaqB,GAAA,cAACe,GAAA,IAA2B,EAEzD,CAACP,EAAa,QAAY1B,EACzBkB,GAAA,cAACgB,GAAA,KACChB,GAAA,cAACiB,GAAA,CACC,MAAOb,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAAE,8BAA8B,EACpD,CACF,EAEAzB,IAAgB,WACdqB,GAAA,cAACkB,GAAA,KACEV,EAAa,IAAKf,GAEfO,GAAA,cAACA,GAAM,SAAN,CAAe,IAAKP,EAAW,IAC9BO,GAAA,cAACmB,GAAA,CACC,MAAO,CAAE,OAAQ,MAAO,EACvB,GAAG1B,EACJ,SAAU,GACV,WAAU,GACZ,CACF,CAEH,CACH,CAGN,CACF,CAEJ,CApHgBE,EAAAlB,GAAA,uBGlChB,OAAS,QAAA2C,OAAY,eACrB,OACE,WAAAC,GACA,sBAAAC,GACA,0BAAAC,OACK,gBACP,OAAOC,IAAS,YAAAC,OAAgB,QCHhC,OAAS,QAAAC,OAAY,eACrB,OACE,WAAAC,GACA,SAAAC,GACA,kBAAAC,GACA,YAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,IAAS,aAAAC,GAAW,YAAAC,OAAgB,QCX3C,OAAS,wBAAAC,OAA4B,gBACrC,OAA8B,mBAAAC,OAAuB,YAI9C,IAAMC,GAAeC,EAAA,CAC1BC,EACAC,IACY,CACZ,OAAQA,EAAM,CACZ,KAAKC,GAAqB,IACxB,MAAO,GACT,KAAKA,GAAqB,KACxB,OAAOF,EAAW,OAASG,GAAgB,SAC7C,KAAKD,GAAqB,MACxB,OACEF,EAAW,OAASG,GAAgB,UACpCH,EAAW,OAASG,GAAgB,QACpCH,EAAW,OAASG,GAAgB,IAExC,QACE,OAAOH,EAAW,OAASC,CAC/B,CACF,EAlB4B,gBAoBfG,GAAoBL,EAAA,CAC/BM,EACAC,EACAC,IAEAF,EACG,OAAQL,GAAeF,GAAaE,EAAYO,CAAc,CAAC,EAC/D,OACEP,GACCQ,GAAaR,EAAW,KAAMM,CAAW,GACzCE,GAAaR,EAAW,YAAaM,CAAW,CACpD,EAX6B,qBCzBjC,OAAS,UAAAG,OAAc,gBAEhB,IAAMC,GAAYD,GAAO,MAAO,CACrC,QAAS,OACT,cAAe,SACf,SAAU,QACZ,CAAC,EAEYE,GAAOF,GAAO,KAAM,CAC/B,QAAS,EACT,OAAQ,EACR,UAAW,OACX,UAAW,OACX,aAAc,KACd,mBAAoB,CAClB,aAAc,MACd,SAAU,QACZ,CACF,CAAC,EClBD,OAAS,YAAAG,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,CAAE,KAAAC,EAAM,YAAAC,EAAa,SAAAC,EAAU,mBAAAC,CAAmB,EAAIJ,EACtD,CAACK,EAAaC,CAAc,EAAIC,GAA2BN,CAAI,EAC/D,CAAE,YAAAO,CAAY,EAAIC,EAAY,EAEpCC,GAAU,IAAM,CACdJ,EAAe,CACb,GAAGK,GAAkBV,EAAMC,EAAaE,CAAkB,CAC5D,CAAC,CACH,EAAG,CAACH,EAAMC,EAAaE,CAAkB,CAAC,EAE1C,IAAMQ,EAAaC,EAAA,IACb,CAACR,EAAY,QAAYH,EAEzBY,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAQ,KAAM,GAAI,EACnBD,GAAA,cAACE,GAAA,CACC,MAAOC,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAAE,8BAA8B,EACpD,CACF,EAIFH,GAAA,cAACI,GAAA,CAAK,IAAK,GAAGd,KAAsBF,KACjCG,EAAY,IAAKc,GAChBL,GAAA,cAACM,GAAA,CACC,IAAK,GAAGD,EAAK,QAAQA,EAAK,UAC1B,WAAU,GACV,QAAS,IAAMhB,EAASgB,CAAI,EAC5B,MAAOL,GAAA,cAACO,GAAA,CAAM,IAAKF,EAAK,KAAM,KAAM,GAAI,EACxC,MACEL,GAAA,cAACQ,GAAA,CAAW,QAAQ,QAAQ,KAAK,UAC9BH,EAAK,WACR,EAEF,GAAIA,EAAK,QACX,CACD,CACH,EA5Be,cAgCnB,OACEL,GAAA,cAACS,GAAA,KACCT,GAAA,cAACQ,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BL,GAAK,EAAE,mBAAmB,CAC7B,EACAH,GAAA,cAACC,GAAA,CAAQ,KAAM,EAAG,EACjBP,IAAgB,WAAaM,GAAA,cAACU,GAAA,IAAsB,EACpDhB,IAAgB,WAAaI,EAAW,CAC3C,CAEJ,CArDgBC,EAAAd,GAAA,kBDAT,SAAS0B,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,EACxDE,EAAcC,EAAY,EAAE,YAE5BC,EAAcD,EAAY,EAAE,YAAY,CAC5C,KAAMZ,CACR,CAAC,EAIKc,EAFwBC,GAAmBF,CAAW,IAEb,EAE/C,OACEG,GAAA,cAACC,EAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,mBAAmB,CACnC,GACAF,GAAA,cAACG,GAAA,CAAQ,KAAM,GAAI,EAElBL,GACCE,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACI,GAAA,CACC,YAAab,EACb,SAAUD,EACV,YAAaO,EACb,UAAWF,IAAgB,UAC7B,EACAK,GAAA,cAACG,GAAA,CAAQ,KAAM,GAAI,CACrB,EAGFH,GAAA,cAACK,GAAA,CACC,MAAOlB,EACP,UAAS,GACT,YAAae,GAAK,EAAE,mBAAmB,EACvC,MAAM,QACN,QAAQ,YACR,KAAK,QACL,SAAU,IAAMd,EAAe,EAAE,EACjC,SAAWkB,GAAUlB,EAAekB,EAAM,OAAO,KAAK,EACxD,EACAN,GAAA,cAACG,GAAA,CAAQ,KAAM,GAAI,EAEnBH,GAAA,cAACO,GAAA,CACC,KAAMV,EACN,YAAaV,EACb,mBAAoBG,EACpB,SAAWkB,GAAe,CACpBxB,IAAS,SACXU,EAAkBc,CAAU,EAE5BhB,EAAgBgB,CAAU,EAE5BvB,EAAa,CACf,EACF,CACF,CAEJ,CA/DgBwB,EAAA3B,GAAA,wBKjBhB,OAAS,QAAA4B,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,cAAAC,OACK,gBACP,OAAOC,OAAW,QCLlB,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,GAIPR,EAAK,KACHS,GAAsCL,CAAmC,CAC3E,EAMAH,EAAOD,EAAK,OAAOG,CAAK,EAE1B,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,EAAiB,EAE1EC,GAAU,IAAM,CACd,GAAIJ,GAAS,SAAU,CACrB,IAAMK,EAASC,GAAQP,EAAaE,EAAsBD,CAAO,EAO5DO,GAAgBP,EAAQ,SAAUK,CAAM,GAC3CH,EAAuBF,GAAS,QAAQ,EAG9C,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,GAAYD,GAAO,MAAO,CACrC,QAAS,OACT,IAAK,MACL,oBAAqB,2BACvB,CAAC,EJcD,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,cAAC,WACCA,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,cAACO,GAAA,CACC,IAAKC,EAAK,KACV,SAAU,CAAC,CAACrB,GAAcA,EAAW,OAASqB,EAAK,KACnD,QAAS,IAAMpB,EAASoB,CAAI,GAC5BR,GAAA,cAACS,GAAA,CAAM,IAAKD,EAAK,KAAM,KAAM,GAAI,CACnC,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,cAACS,GAAA,CAAM,IAAKnB,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,CA/EgBoB,EAAA3B,GAAA,sBKdhB,OAAS,QAAA4B,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,cAAAC,GAAY,aAAAC,GAAW,YAAAC,OAAgB,QCnBhD,IAAMC,GAAaC,EAAA,CAACC,EAAaC,IAAgB,CAKtDD,EAAMA,EAAI,QAAQ,KAAM,EAAE,EACtBA,EAAI,SAAW,IACjBA,EAAMA,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAIA,EAAI,CAAC,EAAIA,EAAI,CAAC,GAE1D,GAAI,CAACE,EAAGC,EAAGC,CAAC,EAASJ,EAAI,MAAM,OAAO,EACtC,CAACE,EAAGC,EAAGC,CAAC,EAAI,CACV,SAASF,EAAG,EAAK,EAAID,EACrB,SAASE,EAAG,EAAK,EAAIF,EACrB,SAASG,EAAG,EAAK,EAAIH,CACvB,EAEAC,EAAI,KAAK,IAAI,KAAK,IAAI,IAAOA,CAAC,EAAG,CAAC,EAAE,SAAS,EAAK,EAClDC,EAAI,KAAK,IAAI,KAAK,IAAI,IAAOA,CAAC,EAAG,CAAC,EAAE,SAAS,EAAK,EAClDC,EAAI,KAAK,IAAI,KAAK,IAAI,IAAOA,CAAC,EAAG,CAAC,EAAE,SAAS,EAAK,EAElD,IAAMC,GAAMH,EAAE,OAAS,EAAI,IAAM,IAAMA,EACjCI,GAAMH,EAAE,OAAS,EAAI,IAAM,IAAMA,EACjCI,GAAMH,EAAE,OAAS,EAAI,IAAM,IAAMA,EAEvC,MAAO,IAAIC,IAAKC,IAAKC,GACvB,EAzB0B,cA2BbC,GAAsBT,EAAA,CAACU,EAAcC,IAAkB,CAMlE,IAAIC,EAAS,CAAE,CAACF,CAAI,EAAGC,CAAM,EAC7B,QAASE,EAAI,EAAGA,EAAI,GAAkBA,IAChCA,EAAI,IACND,EAAS,CACP,GAAGA,EACH,CAACF,EAAOG,EAAI,GAAY,EAAGd,GACzBY,GACC,EAAwBE,GAAK,EAChC,CACF,GAEEA,IAAM,IACRD,EAAS,CACP,GAAGA,EACH,CAACF,EAAOG,EAAI,GAAY,EAAGF,CAC7B,GAEEE,EAAI,IACND,EAAS,CACP,GAAGA,EACH,CAACF,EAAOG,EAAI,GAAY,EAAGd,GACzBY,EACA,GAAGE,EAAI,GAAyB,GAClC,CACF,GAIJ,OAAOD,CACT,EAnCmC,uBAoCtBE,GAAiBd,EAAA,CAC5Be,EACAC,EACAJ,IACG,CACH,GAAI,CAACA,GAAU,CAAC,OAAO,QAAQA,CAAM,EAAE,OACrC,MAAO,CAAC,EAEV,IAAIK,EAAe,GACfC,EAAe,CAAE,GAAGH,CAAW,EACnC,QAAWI,KAAYP,EAAQ,CAC7B,IAAMD,EAAQC,EAAOO,CAA4B,EAEjD,GAAMR,GAASA,IAAUI,EAAWI,CAAQ,EAE1C,GADAF,EAAe,GACXE,IAAa,cAAgBA,IAAa,aAC5CD,EAAe,CACb,GAAGA,EACH,CAACC,CAAQ,EAAGR,CACd,UACSQ,IAAa,WAAaH,EAAqB,CACxD,IAAMI,EAAQX,GAAoBU,EAAUR,CAAK,EACjDO,EAAe,CACb,GAAGA,EAEH,CAAC,GAAGC,MAAa,EAAGC,EAAM,GAAGD,MAAa,EAC1C,CAAC,GAAGA,MAAa,EAAGC,EAAM,GAAGD,MAAa,EAC1C,CAAC,GAAGA,MAAa,EAAGC,EAAM,GAAGD,MAAa,EAC1C,CAAC,GAAGA,MAAa,EAAGC,EAAM,GAAGD,MAAa,EAC1C,CAAC,GAAGA,MAAa,EAAGC,EAAM,GAAGD,MAAa,EAC1C,CAAC,GAAGA,MAAa,EAAGC,EAAM,GAAGD,MAAa,EAC1C,CAAC,GAAGA,MAAa,EAAGC,EAAM,GAAGD,MAAa,EAC1C,CAAC,GAAGA,MAAa,EAAGC,EAAM,GAAGD,MAAa,EAC1C,CAAC,GAAGA,MAAa,EAAGC,EAAM,GAAGD,MAAa,CAC5C,OAEAD,EAAe,CACb,GAAGA,EACH,GAAGT,GAAoBU,EAAUR,CAAK,CACxC,EAIN,OAAOM,EAAeC,EAAe,CAAC,CACxC,EA5C8B,kBC/D9B,OAAS,WAAAG,GAAS,YAAAC,GAAU,YAAAC,OAAgB,gBAC5C,OAAOC,OAAW,QCHlB,OAAS,aAAAC,GAAW,UAAAC,GAAQ,cAAAC,OAAkB,gBAEvC,IAAMC,GAAYF,GAAO,MAAO,CACrC,QAAS,OACT,cAAe,SACf,SAAU,CACZ,CAAC,EAEYG,GAAQH,GAAO,MAAO,CACjC,QAAS,OACT,WAAY,SACZ,eAAgB,CACd,aAAc,WACd,WAAY,SACZ,SAAU,IACV,SAAU,QACZ,CACF,CAAC,EACYI,GAAOJ,GAAO,KAAM,CAC/B,SAAU,EACV,QAAS,EACT,OAAQ,EACR,UAAW,OACX,OAAQ,CACN,WAAY,OACZ,eAAgB,CACd,SAAU,WACV,OAAQ,GACR,MAAO,IACP,eAAgB,CACd,SAAU,WACV,UAAW,OACX,WAAY,iDACZ,OAAQ,MACV,EAEA,iBAAkB,CAChB,UAAW,mBACX,WAAY,SACZ,MAAO,CACL,SAAU,MACV,WAAY,MACZ,QAAS,qBACT,CAAC,IAAID,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,UACP,eAAgB,MAClB,CACF,EACA,cAAe,CACb,SAAU,WACV,UAAW,OACX,WAAY,iDACZ,aAAc,WACd,WAAY,SACZ,SAAU,IACV,SAAU,QACZ,CACF,EACA,UAAW,CACT,eAAgB,CACd,iBAAkB,CAChB,SAAU,WACV,UAAW,OACX,WAAY,iDACZ,WAAY,SACd,EACA,8BAA+B,CAC7B,OAAQ,OACV,EACA,cAAe,CACb,SAAU,WACV,UAAW,oBACX,WAAY,QACd,EACA,eAAgB,CACd,SAAU,WACV,UAAW,oBACX,OAAQ,OACV,CACF,CACF,CACF,CACF,CAAC,EAEYM,GAAML,GAAO,MAAO,CAC/B,YAAa,KACb,aAAc,KACd,aAAc,MACd,QAAS,OACT,WAAY,QACd,CAAC,EAEYM,GAAWN,GAAOC,GAAY,CAAC,CAAC,EAEhCM,GAAmBP,GAAO,MAAO,CAC5C,UAAW,QAEX,aAAc,CACZ,QAAS,qBACT,CAAC,IAAID,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,MAAO,SACT,CACF,CAAC,EAEYS,GAAMR,GAAO,KAAM,CAC9B,QAAS,OACT,WAAY,MACZ,cAAe,QACjB,CAAC,EAEYS,GAAcT,GAAO,MAAO,CACvC,QAAS,OACT,WAAY,QACd,CAAC,EACYU,GAAeV,GAAO,MAAO,CACxC,SAAU,WACV,mBAAoB,CAClB,aAAc,MACd,SAAU,QACZ,CACF,CAAC,EACYW,GAAMX,GAAO,MAAO,CAC/B,SAAU,WACV,gBAAiB,cACjB,QAAS,KACT,aAAc,MACd,OAAQ,GACR,MAAO,EACT,CAAC,ED7HM,SAASY,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,oBFiChB,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,UAAU,eACZN,EACCM,EAAA,cAAC,OAAI,UAAU,cAAcN,CAAK,EAElCM,EAAA,cAACC,GAAA,CAAM,UAAU,eACfD,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BN,EAAM,MACT,EACAI,EAAA,cAACG,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCH,EAAA,cAACI,GAAA,CAAI,IAAKP,GACRG,EAAA,cAACK,GAAA,CAAS,QAAQ,OAAO,KAAK,SAAS,IAAKP,GACzCF,EAAM,UACT,CACF,CACF,EAGD,CAAC,CAACH,GACDO,EAAA,cAAC,OACC,UAAW,iBAAiB,CAACN,GAAQ,gCACrCM,EAAA,cAAC,KACC,KAAML,EACN,OAAO,SACP,IAAI,sBACJ,QAAUW,GAAMA,EAAE,gBAAgB,GACjCP,EAAS,GACN,GAAGN,EAAQ,MAAM,EAAG,CAAC,OAAOA,EAAQ,MAAMM,EAAS,EAAGA,CAAM,IAC5DN,EAAS,IACbO,EAAA,cAACO,GAAA,CAAiB,MAAM,OAAO,KAAM,GAAI,CAC3C,CACF,CAEJ,CAEJ,EAxCmB,cA0CZ,SAASC,GAAUhB,EAAkB,CAC1C,GAAM,CAAE,KAAAiB,EAAM,YAAAC,EAAc,GAAI,SAAAC,EAAU,mBAAAC,CAAmB,EAAIpB,EAE3D,CAACqB,EAAQC,CAAS,EAAIC,GAA6BN,CAAI,EACvDO,EAAcC,EAAY,EAAE,YAC5BC,EAAcD,EAAY,EAAE,YAAY,EACxC,CAACE,EAAaC,CAAc,EAAIL,GAAkB,EAAI,EACtDM,EAAgBC,EAAgB,IAAI,QAAQ,EAC5C,CAAE,cAAAC,CAAc,EAAIN,EAAY,EAGhCO,EAA0CC,GAAW,CAACC,EAAQC,IAEhE3B,EAAA,cAAC,OACE,GAAG0B,EAEJ,IAAKC,EACL,MAAO,CACL,GAAGD,EAAO,MACV,OAAQ,GAAG,WAAWA,EAAO,OAAO,MAAgB,EAAI,EAAI,KAC9D,EACF,CAEH,EACKE,EAAerC,EAAA,IAAM,CACzBuB,EAAUL,EAAK,MAAM,EAAGI,EAAO,OAASxB,EAAS,CAAC,CACpD,EAFqB,gBAIrBwC,GAAU,IAAM,CACdT,EAAeX,EAAK,OAASI,EAAO,MAAM,CAC5C,EAAG,CAACA,EAAO,MAAM,CAAC,EAElBgB,GAAU,IAAM,CACdf,EAAUL,EAAK,MAAM,EAAGpB,EAAS,CAAC,CACpC,EAAG,CAACoB,CAAI,CAAC,EAET,IAAMqB,EAAavC,EAAA,IACb,CAACsB,EAAO,QAAYH,EAEpBV,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACG,GAAA,CAAQ,KAAM,GAAI,EACnBH,EAAA,cAAC+B,GAAA,CACC,MAAOC,GAAK,EAAE,kBAAkB,EAChC,YAAaA,GAAK,EAAE,8BAA8B,EACpD,CACF,EAIFhC,EAAA,cAACiC,GAAA,CACC,KAAM,CAAC,CAAE,MAAAC,EAAO,MAAAC,CAAM,IAAM,CAC1B,IAAMvC,EAAQiB,EAAOqB,CAAK,EAEpBzC,EAAUG,EAAM,SAAW,GAC3BwC,EAAalB,EAAY,KAC5BkB,GAAeA,EAAW,OAASxC,EAAM,UAC5C,EACMyC,EAAQC,GACZ1C,EAAM,OACNwC,GAAY,OAAS,EACvB,EAEMvC,EAAkB,CACtB,QAASwC,EAAM,GAAGzC,EAAM,WAAW,EACnC,CAAC,IAAI2C,MAAa,EAAG,CACnB,QAASF,EAAM,GAAGzC,EAAM,WAAW,CACrC,EACA,gBAAiB,SACnB,EAEME,EAAuB,CAC3B,QAASuC,EAAM,GAAGzC,EAAM,WAAW,EACnC,CAAC,IAAI2C,MAAa,EAAG,CACnB,QAASF,EAAM,GAAGzC,EAAM,WAAW,CACrC,EACA,MAAO,SACT,EAEA,OACEI,EAAA,cAAC,OACC,MAAO,CACL,GAAGmC,EACH,aAAc,CAChB,GACAnC,EAAA,cAACwC,GAAA,CACC,MAAO,CACL,OAAQL,GAAO,MACjB,EACA,YAAWD,EACX,IAAK,GAAGtC,EAAM,SAASA,EAAM,UAC7B,GAAI,GAAGA,EAAM,SAASA,EAAM,UAC5B,WAAU,GACV,QAAS,IAAMe,EAASE,EAAOqB,CAAK,CAAC,EACrC,MACElC,EAAA,cAACyC,GAAA,KACCzC,EAAA,cAAC0C,GAAA,CAAM,IAAK9C,EAAM,MAAO,KAAM,GAAI,EAClC2B,EAAc3B,CAAK,GAClBI,EAAA,cAAC2C,GAAA,KACC3C,EAAA,cAAC4C,GAAA,CAAQ,KAAM,GAAI,MAAM,OAAO,CAClC,CAEJ,EAEF,MACER,GAAY,OAAS,UACnBxC,EAAM,MACP,CAACA,EAAM,MAAQ,CAACH,EACfO,EAAA,cAACC,GAAA,KACCD,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BN,EAAM,MACT,EACAI,EAAA,cAACG,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCH,EAAA,cAACI,GAAA,CAAI,IAAKP,GACRG,EAAA,cAACK,GAAA,CACC,QAAQ,OACR,KAAK,SACL,IAAKP,GACJF,EAAM,UACT,CACF,CACF,EACE,OAEN,YACIwC,GAAY,MACZ3C,GACF2C,EAAW,OAAS,SAChB9C,GAAW,CACT,QAAAG,EACA,MAAOoB,EAAOqB,CAAK,EACnB,gBAAArC,EACA,qBAAAC,EACA,KAAMF,EAAM,KACZ,IAAKwC,EAAW,KAAK,WAClB,MAAM,UAAU,EAChB,KAAK3C,CAAO,CACjB,CAAC,EACDG,EAAM,MAAQ,OAEpB,IACEyB,EACErB,EAAA,cAAC6C,GAAA,KACC7C,EAAA,cAAC8C,GAAA,CAAS,QAAQ,OAAO,KAAK,QAAQ,MAAO,GAAI,EACjD9C,EAAA,cAACG,GAAA,CAAQ,KAAM,EAAG,EAClBH,EAAA,cAAC8C,GAAA,CAAS,QAAQ,OAAO,KAAK,SAAS,MAAO,GAAI,CACpD,EAEAjC,EAAOqB,CAAK,GAAG,SACblC,EAAA,cAAC+C,GAAA,KACC/C,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BN,EAAM,SAAS,MAClB,EACAI,EAAA,cAAC,UAAI,EACJJ,EAAM,SAAS,UACdI,EAAA,cAACE,GAAA,CACC,QAAQ,OACR,UAAU,YACV,KAAK,UACJ,IAAIN,EAAM,SAAS,UACtB,CAEJ,EAIR,CACF,CAEJ,EACA,YAAauB,EACb,UAAWN,EAAO,OAClB,aAAce,EACd,iBAAkBJ,EAClB,KAAM,GACN,IAAK,GAAGZ,KAAsBF,IAChC,EA3Ie,cA+InB,OACEV,EAAA,cAACgD,GAAA,KACChD,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9B8B,GAAK,EAAE,cAAc,CACxB,EACAhC,EAAA,cAACG,GAAA,CAAQ,KAAM,EAAG,EACjBa,IAAgB,WAAahB,EAAA,cAACiD,GAAA,CAAiB,KAAM5D,GAAW,EAChE2B,IAAgB,WAAahB,EAAA,cAACkD,GAAA,KAAMpB,EAAW,CAAE,CACpD,CAEJ,CA7LgBvC,EAAAiB,GAAA,aN9DT,SAAS2C,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,EACZ,CAAE,iBAAAC,CAAiB,EAAIC,EAAgB,EACvC,CAACC,EAAaC,CAAc,EAAIC,GAAiB,EAAE,EAGnDC,GADqBjB,IAAS,SAAWK,EAAiBC,IACb,MAAQ,GAGrDY,EAAcC,EAAY,EAAE,YAAY,CAC5C,KAAMnB,CACR,CAAC,EACKoB,EAASD,EAAY,EAAE,OAAO,CAClC,KAAAnB,EACA,WAAYiB,EACZ,UAAWH,CACb,CAAC,EACKO,EAAaC,GACjBF,EACAR,CACF,EAGMW,EAAmBC,EAACC,GAA+B,CACnDzB,IAAS,SACXS,EAAkBgB,CAAU,EAE5Bf,EAAgBe,CAAU,CAE9B,EANyB,oBAQnBC,EAAcF,EAACG,GAAiB,CAChC3B,IAAS,SACXO,EAAa,CAAE,MAAAoB,EAAO,KAAM,CAAE,YAAAT,EAAa,OAAAE,CAAO,CAAE,CAAC,EAErDZ,EAAW,CAAE,MAAAmB,EAAO,KAAM,CAAE,YAAAT,EAAa,OAAAE,CAAO,CAAE,CAAC,CAEvD,EANoB,eAQpB,OACEQ,GAAA,cAACC,EAAA,CACC,OAAQ,CACN,MAAOC,GAAK,EAAE,cAAe,CAAE,KAAA9B,CAAK,CAAC,CACvC,GACA4B,GAAA,cAACG,GAAA,CACC,YAAab,EACb,KAAMlB,GAAQ,SAAW,OAAS,KAClC,WAAYA,IAAS,SAAWK,EAAiBC,EACjD,YAAa,IAAML,EAAS+B,EAAiB,WAAW,EACxD,SAAWP,GAAe,CACxBF,EAAiBE,CAAU,CAC7B,EACF,EACAG,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACM,GAAA,CACC,MAAOpB,EACP,UAAS,GACT,YAAagB,GAAK,EAAE,cAAc,EAClC,MAAM,QACN,QAAQ,YACR,KAAK,QACL,SAAU,IAAMf,EAAe,EAAE,EACjC,SAAWoB,GAAUpB,EAAeoB,EAAM,OAAO,KAAK,EACxD,EACAP,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACQ,GAAA,CACC,KAAMf,EACN,mBAAoBJ,EACpB,YAAaH,EACb,SAAWa,GAAU,CACnBD,EAAYC,CAAK,EAEjB,IAAMU,EAAkBnB,EAAY,KACjCoB,GAAUX,EAAM,aAAeW,EAAM,IACxC,EACID,GACFd,EAAiBc,CAAe,EAGlClC,EAAa,CACf,EACF,CACF,CAEJ,CA9FgBqB,EAAA1B,GAAA,uBUtBhB,OAAS,QAAAyC,OAAY,eACrB,OACE,oBAAAC,GACA,WAAAC,GACA,YAAAC,GACA,QAAAC,GACA,kBAAAC,GACA,YAAAC,GACA,UAAAC,GACA,WAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,MAAW,QAClB,OAAS,eAAAC,OAAmB,mBCb5B,OAAS,QAAAC,OAAY,eACrB,OACE,QAAAC,GACA,WAAAC,GACA,YAAAC,GACA,aAAAC,GACA,WAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QCTlB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAgBD,GAAO,MAAO,CACzC,WAAY,KACZ,cAAe,MACjB,CAAC,EAEYE,GAAyBF,GAAO,MAAO,CAClD,QAAS,OACT,WAAY,SACZ,eAAgB,OAClB,CAAC,EAEYG,GAAOH,GAAO,MAAO,CAChC,QAAS,OACT,eAAgB,QAChB,WAAY,SACZ,cAAe,KACjB,CAAC,EAEYI,GAA2BJ,GAAO,MAAO,CACpD,SAAU,QACV,QAAS,KACX,CAAC,ECvBD,OAAS,QAAAK,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,8HACF,CACF,CACF,CAEJ,CAhBgBC,EAAAL,GAAA,0BFgBT,SAASM,IAAW,CACzB,IAAMC,EAAWC,EAAiB,IAAI,SAAS,EACzCC,EAAcD,EAAiB,IAAI,YAAY,EAC/CE,EAAiBF,EAAiB,IAAI,eAAe,EACrDG,EAAoBH,EAAiB,IAAI,kBAAkB,EAEjE,OACEI,GAAA,cAACC,GAAA,KACCD,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,6BAA6B,CACvC,EACAJ,GAAA,cAACK,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCL,GAAA,cAACM,GAAA,CACC,UAAWC,EAAa,EACxB,KAAK,MACL,QAASP,GAAA,cAACQ,GAAA,IAAuB,GACjCR,GAAA,cAACS,GAAA,CAAS,MAAM,OAAO,CACzB,CACF,EACAT,GAAA,cAACU,GAAA,KACEC,GAAU,IAAI,CAACC,EAAcC,IAAU,CACtC,IAAMC,EAAM,YAAYD,IACxB,OACEb,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACe,GAAA,CACC,MAAO,CAAE,MAAO,OAAQ,WAAY,CAAE,EACtC,IAAKD,EACL,QAAS,IAAM,CACThB,GACFC,EAAkB,IAAI,EAExBF,EAAYe,CAAY,CAC1B,EACA,SAAU,CAACd,GAAkBc,IAAiBjB,EAC9C,MAAO,GAAGiB,EAAa,SAAS,KAClC,EACAZ,GAAA,cAACK,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,CAC3C,CAEJ,CAAC,EACDL,GAAA,cAACgB,GAAA,CACC,KAAK,SACL,IAAI,OACJ,IAAI,KACJ,KAAK,OACL,UAAS,GACT,QAAQ,YACR,MAAOlB,GAAkB,GACzB,MAAM,OACN,SAAWmB,GAAU,CACnB,IAAMC,EAAc,WAAWD,EAAM,OAAO,KAAK,GAE/C,CAACC,GACAA,GAAeC,IAAgBD,GAAeE,KAE/CrB,EAAkBmB,CAAW,CAEjC,EACA,OACEpB,GACEE,GAAA,cAACG,GAAA,CAAW,QAAQ,OAAO,KAAK,SAAQ,GAExC,EAGJ,YAAaC,GAAK,EAAE,QAAQ,EAC9B,CACF,CACF,CAEJ,CAvEgBiB,EAAA3B,GAAA,YDGT,SAAS4B,IAAe,CAC7B,IAAMC,EAAWC,GAAY,EACvB,CAAE,MAAAC,CAAM,EAAIC,EAAY,EAAE,OAC1BC,EAAcD,EAAY,EAAE,YAC5BE,EAAWF,EAAY,EAAE,SAAS,EAElCG,EAAkBC,EAAiB,IAAI,gBAAgB,EACvDC,EAAwBD,EAAiB,IAAI,sBAAsB,EAEnEE,EAAgCC,GAAwBL,CAAQ,EAEhEM,EAAgBF,EAA8B,OACjDG,GACCA,EAAW,OAAS,UAAYA,EAAW,OAAS,YACxD,EACMC,EAAqBF,EAAc,OACnCG,EAA6BH,EAAc,OAC9CC,GAAeA,EAAW,QAC7B,EAAE,OAEIG,EAAkBN,EAA8B,OACnDG,GAAeA,EAAW,OAAS,KACtC,EACMI,EAAuBD,EAAgB,OACvCE,EAA+BF,EAAgB,OAClDH,GAAeA,EAAW,QAC7B,EAAE,OAEIM,EAAgBC,EAAA,CAACC,EAAuBC,IAAkB,CAC9D,OAAQjB,EAAa,CACnB,IAAK,UACH,OAAOkB,EAAA,cAACC,GAAA,CAAS,QAAQ,OAAO,KAAK,SAAS,MAAO,GAAI,EAC3D,IAAK,SACH,OACED,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,GAAGJ,OAAmBC,GACzB,CAEN,CACF,EAjBsB,iBAmBhBK,EAAa,CACjB,GAAI,cACJ,MACEJ,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,iBAAiB,CAC3B,EAEF,IACEH,EAAA,cAAAA,EAAA,cACGJ,EAAcJ,EAA4BD,CAAkB,EAC7DS,EAAA,cAACK,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCL,EAAA,cAACM,GAAA,CAAiB,MAAM,QAAQ,CAClC,EAEF,QAAS,IAAM5B,EAAS6B,EAAiB,OAAO,CAClD,EAEMC,EAAe,CACnB,GAAI,gBACJ,MACER,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,mBAAmB,CAC7B,EAEF,IACEH,EAAA,cAAAA,EAAA,cACGJ,EAAcD,EAA8BD,CAAoB,EACjEM,EAAA,cAACK,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCL,EAAA,cAACM,GAAA,CAAiB,MAAM,OAAO,CACjC,EAEF,QAAS,IAAM5B,EAAS6B,EAAiB,SAAS,CACpD,EAeME,EAAY,CAChB,GAAI,aACJ,MACET,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,OAAO,CACjB,EAEF,IAAKH,EAAA,cAACM,GAAA,CAAiB,MAAM,OAAO,EACpC,QAAS,IAAM5B,EAAS6B,EAAiB,MAAM,CACjD,EAEMG,EAAuB,CAC3B,GAAI,yBACJ,MACEV,EAAA,cAAAA,EAAA,cACEA,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,mBAAmB,CAC7B,EACAH,EAAA,cAACK,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCL,EAAA,cAACW,GAAA,CACC,KAAK,MACL,UAAWC,EAAa,EACxB,QACEZ,EAAA,cAACa,GAAA,KACCb,EAAA,cAACE,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,cAC7CC,GAAK,EACJ,+KACF,CACF,CACF,GAEFH,EAAA,cAACc,GAAA,CAAS,MAAM,OAAO,CACzB,CACF,EAEF,IAAKd,EAAA,cAACe,GAAA,CAAO,QAAS/B,EAAiB,EACvC,QAASE,CACX,EAEM8B,EAAe,CACnBZ,EACAI,CAEF,EACA,OAAK5B,GAAO,aACVoC,EAAa,KAAKP,CAAS,EAE7BO,EAAa,KAAKN,CAAoB,EAGpCV,EAAA,cAACiB,EAAA,CACC,OAAQ,CACN,MAAOd,GAAK,EAAE,SAAS,CACzB,GACAH,EAAA,cAACkB,GAAA,KACClB,EAAA,cAACmB,GAAA,IAAS,EACVnB,EAAA,cAACoB,GAAA,CACC,KACEpB,EAAA,cAACqB,GAAA,CAAe,MAAM,IAAI,GAAG,IAAI,QAAS,IAAM,QAAQ,IAAI,EAAG,EAEjE,MAAOL,EACT,CACF,CACF,CAEJ,CA/JgBnB,EAAApB,GAAA,gBIzBhB,OAAS,cAAA6C,OAAkB,wCAC3B,OAAS,cAAAC,OAAkB,iCAC3B,OAAOC,OAAW,QCClB,OAAS,QAAAC,OAAY,eACrB,OACE,gCAAAC,GACA,kBAAAC,GACA,0BAAAC,GACA,4BAAAC,OACK,wCACP,OACE,UAAAC,GACA,YAAAC,GACA,WAAAC,GACA,cAAAC,GACA,aAAAC,GACA,eAAAC,GACA,cAAAC,GACA,sBAAAC,OACK,gBACP,OAAS,cAAAC,OAAkB,2BAC3B,OAAOC,GAAS,aAAAC,GAAW,UAAAC,GAAQ,YAAAC,OAAgB,QACnD,OAAS,eAAAC,OAAmB,mBCpB5B,OAAS,QAAAC,OAAY,eAErB,IAAMC,GAAyB,IACzBC,GAAmB,QACnBC,GAAoB,OACpBC,GAAkB,MAClBC,GAAmB,KACnBC,GAAqB,GAEpB,SAASC,GAAUC,EAA6B,CACrD,IAAMC,EAAU,KAAK,OAClB,KAAK,IAAI,EAAID,GAAeP,EAC/B,EA8BMS,EA5BY,CAChB,CACE,aAAcR,GACd,MAAOS,GAAK,EAAE,MAAM,EACpB,YAAaA,GAAK,EAAE,OAAO,CAC7B,EACA,CACE,aAAcR,GACd,MAAOQ,GAAK,EAAE,OAAO,EACrB,YAAaA,GAAK,EAAE,QAAQ,CAC9B,EACA,CACE,aAAcP,GACd,MAAOO,GAAK,EAAE,KAAK,EACnB,YAAaA,GAAK,EAAE,MAAM,CAC5B,EACA,CACE,aAAcN,GACd,MAAOM,GAAK,EAAE,MAAM,EACpB,YAAaA,GAAK,EAAE,OAAO,CAC7B,EACA,CACE,aAAcL,GACd,MAAOK,GAAK,EAAE,QAAQ,EACtB,YAAaA,GAAK,EAAE,SAAS,CAC/B,CACF,EAEkC,KAChC,CAACC,EAAGC,IAAMA,EAAE,aAAeD,EAAE,YAC/B,EAEA,QAAWE,KAAYJ,EAAiB,CACtC,GAAM,CAAE,aAAAK,EAAc,MAAAC,EAAO,YAAAC,CAAY,EAAIH,EACvCI,EAAgB,KAAK,MAAMT,EAAUM,CAAY,EACvD,GAAIG,EAAgB,EAClB,MAAO,GAAGA,KAAiBD,IAE7B,GAAIC,IAAkB,EACpB,MAAO,GAAGA,KAAiBF,IAI/B,OAAIP,EAAU,EACL,GAAGA,KAAWE,GAAK,EAAE,SAAS,IAGhC,GAAGF,KAAWE,GAAK,EAAE,QAAQ,GACtC,CArDgBQ,EAAAZ,GAAA,aAuDT,SAASa,GAAYC,EAA0B,CACpD,OAAOA,EAAY,WACfV,GAAK,EAAE,CACL,GAAI,aACJ,OAAQ,CAAE,KAAMJ,GAAU,SAASc,EAAY,UAAU,CAAC,CAAE,CAC9D,CAAC,EACDV,GAAK,EAAE,CACL,GAAI,aACJ,OAAQ,CAAE,KAAMJ,GAAU,SAASc,EAAY,YAAY,CAAC,CAAE,CAChE,CAAC,CACP,CAVgBF,EAAAC,GAAA,eChEhB,OAAS,4BAAAE,OAAgC,wCACzC,OAAS,SAAAC,OAAa,gBACtB,OAAOC,OAAW,QCFlB,OAAS,QAAAC,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,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,GACTE,GAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,cAC7CF,GAAK,EAAE,gBAAgB,CAC1B,CACF,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,cAAc,CACxB,CACF,CACF,EAzByB,iBCJ7B,OAAS,QAAAG,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,GACTE,GAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,cAC7CF,GAAK,EAAE,gBAAgB,CAC1B,CACF,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,EAzByB,iBCJ7B,OAAS,QAAAG,OAAY,eACrB,OAAS,4BAAAC,OAAgC,wCAElC,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,ECnBA,OAAS,cAAAG,GAAY,UAAAC,GAAQ,eAAAC,OAAmB,gBAChD,OAAS,cAAAC,OAAkB,2BAC3B,OAAOC,OAAW,QCJlB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAkBD,GAAO,MAAO,CAC3C,QAAS,OACT,eAAgB,QAClB,CAAC,EDKM,IAAME,GAAqBC,EAACC,GAAmC,CACpE,GAAM,CAAE,KAAAC,EAAM,MAAAC,EAAO,kBAAAC,EAAmB,QAAAC,EAAS,iBAAAC,CAAiB,EAAIL,EAChE,CAAE,QAAAM,EAAS,cAAAC,EAAe,MAAOC,CAAY,EAAIC,GAAW,EAC5DC,EAAaP,GAAmB,WAEhCQ,EADcD,GAAcF,EAAYE,CAAU,EAAE,UAC9BE,GAAY,UAAYA,GAAY,aAChE,OACEC,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACC,GAAA,CAAW,KAAMb,EAAM,MAAOC,EAAO,YAAaE,EAAS,EAC3DC,GAAoBK,GACnBG,GAAA,cAACE,GAAA,KACCF,GAAA,cAACG,GAAA,CACC,UAAWC,EAAa,EACxB,MAAOV,EAAcG,CAAU,EAAE,KACjC,MAAOH,EAAcG,CAAU,EAAE,IACjC,KAAMA,EACN,MAAOC,EACP,QAAS,SAAYL,EAAQI,CAAU,EACzC,CACF,CAEJ,CAEJ,EAvBkC,sBJC3B,SAASQ,GAAiBC,EAAuB,CACtD,GAAM,CAAE,MAAAC,EAAO,QAAAC,EAAS,SAAAC,EAAU,SAAAC,EAAU,kBAAAC,EAAmB,QAAAC,CAAQ,EACrEN,EAEIO,EACJN,IAAUO,GAAyB,yBACnCP,IAAUO,GAAyB,4BACnCP,IAAUO,GAAyB,eAErC,OACEC,GAAA,cAACC,GAAA,CACC,KAAM,CAAC,CAACT,EACR,QAASC,EACT,UAAW,SAAS,eAAe,UAAU,GAAK,SAAS,MAC1DK,GACCE,GAAA,cAACE,GAAA,CACC,KAAMC,GAAmBX,CAAK,EAAE,KAChC,MAAOW,GAAmBX,CAAK,EAAE,MACjC,kBAAmBI,EACnB,QAASC,EACT,iBACEL,IAAUO,GAAyB,wBAEvC,EAEDP,IAAU,UACTQ,GAAA,cAACI,GAAA,CAAc,QAASX,EAAS,SAAUC,EAAU,EAEtDF,IAAU,UACTQ,GAAA,cAACK,GAAA,CAAc,QAASZ,EAAS,SAAUE,EAAU,CAEzD,CAEJ,CAjCgBW,EAAAhB,GAAA,oBMThB,OAAS,QAAAiB,OAAY,eACrB,OACE,UAAAC,GACA,WAAAC,GACA,cAAAC,GACA,SAAAC,GACA,eAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QAClB,OAAS,eAAAC,OAAmB,mBAErB,SAASC,GAAyBC,EAA+B,CACtE,GAAM,CACJ,KAAAC,EACA,QAAAC,EACA,OAAAC,EACA,WAAAC,EACA,SAAAC,EACA,MAAAC,EACA,MAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,aAAAC,CACF,EAAIV,EACEW,EAAWC,GAAY,EAE7B,OACEC,GAAA,cAACC,GAAA,CACC,KAAMb,EACN,QAASC,EACT,UAAW,SAAS,eAAe,UAAU,GAAK,SAAS,MAC1DC,IAAW,UACVU,GAAA,cAACE,GAAA,CAAW,KAAK,UAAU,MAAOC,GAAK,EAAE,iBAAiB,GACxDH,GAAA,cAACI,GAAA,CACC,UAAU,WACV,KAAK,SACL,YAAa,GACb,MAAO,CACL,MAAOb,EACP,SAAAC,CACF,EACA,MAAOC,EACP,MAAOC,EACP,iBAAkBC,EACpB,EACAK,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EACnBL,GAAA,cAACM,GAAA,CACC,QAAQ,OACR,KAAK,SACL,MAAM,aACN,MAAM,UACLV,CACH,CACF,EAEAI,GAAA,cAACE,GAAA,CACC,KAAK,QACL,MAAOC,GAAK,EAAE,oBAAoB,EAClC,YAAaP,EACf,EAEFI,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EAClBf,IAAW,WACVU,GAAA,cAACO,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAAS,IAAM,CAEbT,EADa,QACA,CACf,GACAE,GAAA,cAACM,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,cAC7CH,GAAK,EAAE,MAAM,CAChB,CACF,EAEFH,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,EAClBR,GACCG,GAAA,cAAAA,GAAA,cACEA,GAAA,cAACO,GAAA,CACC,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAAS,IAAM,OAAO,KAAKV,EAAc,QAAQ,GACjDG,GAAA,cAACM,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,WAC7CH,GAAK,EAAE,WAAW,CACrB,CACF,EACAH,GAAA,cAACK,GAAA,CAAQ,KAAM,GAAI,CACrB,EAEFL,GAAA,cAACO,GAAA,CAAO,QAAQ,WAAW,KAAK,UAAU,KAAK,QAAQ,QAASlB,GAC9DW,GAAA,cAACM,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAAS,MAAM,WAC7CH,GAAK,EAAE,aAAa,CACvB,CACF,CACF,CAEJ,CAvFgBK,EAAAtB,GAAA,4BCVhB,OAAOuB,OAAW,QCFlB,OAAS,QAAAC,OAAY,eACrB,OAAS,SAAAC,GAAO,cAAAC,GAAY,YAAAC,OAAgB,gBAC5C,OAAOC,IAAS,YAAAC,OAAgB,QCFhC,OACE,SAAAC,GACA,mBAAAC,GACA,iBAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,IAAS,YAAAC,OAAgB,QAEzB,SAASC,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,OACEA,EAAQ,gBAAgB,SACtBI,GAAA,cAACE,GAAA,CACC,QAAS,IAAMJ,EAAqBK,GAAS,CAACA,CAAI,EAClD,QAAQ,QACR,KAAK,UACJN,EACCG,GAAA,cAACI,GAAA,CAAc,KAAM,GAAI,MAAM,OAAO,EAEtCJ,GAAA,cAACK,GAAA,CAAgB,KAAM,GAAI,MAAM,OAAO,CAE5C,EAGJ,OAAQR,EAAmBD,EAAQ,gBAAgB,QAAU,OAC/D,CAEJ,CAzBgBU,EAAAZ,GAAA,eCVhB,OAAS,UAAAa,OAAc,gBAEhB,IAAMC,GAASD,GAAO,MAAO,CAClC,QAAS,OACT,cAAe,SACf,IAAK,KACP,CAAC,ECJD,OAAS,QAAAE,OAAY,eACrB,OAAS,4BAAAC,OAAgC,wCACzC,OAAS,SAAAC,GAAO,UAAAC,OAAc,gBAC9B,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,gBHKT,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,EACjD,OACEI,GAAA,cAACC,GAAA,KACEP,EAAK,aAAa,IAAI,CAACQ,EAAaC,EAAOC,IAAS,CACnD,IAAMC,EAAMF,EAAQD,EAAY,IAC1BI,EAAUH,IAAUC,EAAK,OAAS,EAClCG,EAAWD,GAAWP,GAAeD,EACrCU,EAAQF,GAAWZ,EAAK,SAAW,SAEzC,OACEM,GAAA,cAACS,GAAA,CAAS,IAAKJ,GACbL,GAAA,cAACU,GAAA,CACC,KAAOH,GAAW,WAAeC,GAAS,SAAY,UACtD,MACGN,EAAY,YAET,GAAGA,EAAY,iBADfS,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,GACEd,GAAc,CAACJ,GACfG,GAAsB,CAACJ,EAAK,aAAa,SAC1CM,GAAA,cAACU,GAAA,CAAM,KAAK,UAAU,MAAOjB,EAAQ,aAAc,EAEpDC,EAAK,SAAW,UAAYE,GAC3BI,GAAA,cAACc,GAAA,CACC,cAAexB,EACf,iBAAkBC,EAClB,gBAAiBC,EACjB,QAASC,EACX,EAGDC,EAAK,SAAW,UAAYM,GAAA,cAACe,GAAA,CAAY,QAAStB,EAAS,CAC9D,CAEJ,CA7DgBuB,EAAA5B,GAAA,qBDGT,IAAM6B,GAAiB,IAGvB,IAAMC,GAAWC,EAAA,CAAC,CAAE,KAAAC,EAAM,YAAAC,EAAa,GAAGC,CAAK,IAAuB,CAC3E,IAAMC,EAA4BH,EAAK,4BAA8B,GACrE,OAAOA,EAAK,MAAM,IAAI,CAACI,EAAMC,IAAU,CACrC,IAAMC,EACJD,IAAU,EAAIL,EAAK,YAAcA,EAAK,MAAMK,EAAQ,CAAC,EAAE,aACzD,MAAO,CACL,KAAM,CACJ,MAAO,CAAE,YAAaD,EAAK,WAAY,MAAOA,EAAK,UAAY,EAAG,EAClE,MAAO,CACL,YACEG,GAA0BH,EAAK,eAAgBH,CAAW,GAAK,GACjE,MAAOG,EAAK,oBAAsB,EACpC,EACA,MAAO,CACL,MAAOI,EACLF,EACA,EACA,CACF,CACF,CACF,EACA,GAAI,CACF,MAAO,CAAE,YAAaF,EAAK,SAAU,MAAOA,EAAK,MAAO,EACxD,MAAO,CACL,YACEG,GAA0BH,EAAK,aAAcH,CAAW,GAAK,GAC/D,MAAOG,EAAK,kBAAoB,EAClC,EACA,MAAO,CACL,MAAOI,EACLJ,EAAK,cAAgBA,EAAK,kCAC1B,EACA,CACF,CACF,CACF,EACA,QAAS,CAAE,YAAaA,EAAK,UAAW,MAAOA,EAAK,aAAe,EAAG,EACtE,OACEK,GAAA,cAACC,GAAA,CACC,KAAMN,EACN,0BAA2BD,EAC1B,GAAGD,EACN,CAEJ,CACF,CAAC,CACH,EA9CwB,YAgDjB,SAASS,GAAaP,EAAkD,CAC7E,GACEQ,GAA8BR,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,CArBgBL,EAAAY,GAAA,gBKlEhB,OAAS,aAAAE,GAAW,UAAAC,OAAc,gBAE3B,IAAMC,GAAYD,GAAO,MAAO,CACrC,QAAS,OACT,MAAO,OACP,cAAe,SACf,WAAY,SACZ,OAAQ,IACR,SAAU,EACV,SAAU,CACR,QAAS,OACT,MAAO,OACP,eAAgB,gBAChB,WAAY,SACZ,QAAS,UACT,aAAc,YACd,QAAS,qBACT,CAAC,IAAID,MAAa,EAAG,CACnB,QAAS,oBACX,EACA,YAAa,UACb,MAAO,aACT,EACA,gBAAiB,CACf,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,OAAQ,KACV,EACA,YAAa,CACX,QAAS,OACT,MAAO,OACP,QAAS,cACT,cAAe,SACf,WAAY,OACd,EACA,iBAAkB,CAChB,UAAW,OACX,MAAO,OACP,QAAS,WACX,CACF,CAAC,EAEYG,GAAgBF,GAAO,MAAO,CACzC,MAAO,MACT,CAAC,EAEYG,GAAYH,GAAO,MAAO,CACrC,QAAS,iBACT,MAAO,OACP,SAAU,MACZ,CAAC,EACYI,GAASJ,GAAO,MAAO,CAClC,QAAS,OACT,cAAe,SACf,IAAK,KACP,CAAC,EAEYK,GAAuBL,GAAO,MAAO,CAChD,OAAQ,QACR,QAAS,OACT,WAAY,SACZ,eAAgB,QAClB,CAAC,EAEYM,GAAkBN,GAAO,MAAO,CAC3C,QAAS,OACT,eAAgB,SAChB,MAAO,OACP,WAAY,MACZ,KAAM,CACR,CAAC,EdVM,SAASO,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,EAASD,EAAY,EAAE,OAAO,EAC9BE,EAAQC,EAAc,IAAI,MAAM,EAChCC,EAAWC,GAAY,EACvB,CAACC,EAAGC,CAAU,EAAIC,GAAmBC,EAAc,EACnDC,EAAUC,GAA8B,IAAI,EAC5C,CAACC,EAAYC,CAAa,EAAIC,GAAqB,IAAI,EACvD,CAACC,EAAoBC,CAAqB,EAAIF,GAElD,IAAI,EAEAG,EAAWC,EAAA,IAAM,CACrBxB,EAAc,EACdmB,EAAc,IAAI,CACpB,EAHiB,YAKXM,EACJC,GAAqB,IAAI,uBAAuB,EAC5CC,EAAYD,GAAqB,IAAI,UAAU,EAC/CE,EAAsBH,EAAuB,EAC7CI,EAAcC,GAAejC,CAAI,EACjCkC,EAA2BF,GAAa,cAE9CG,GAAU,IAAM,CACYJ,EAAoB,KAC3CK,IAAMA,GAAE,YAAcpC,EAAK,SAC9B,IAEMA,EAAK,SAAW,WAAaA,EAAK,SAAW,YAC/CyB,EAAsBzB,EAAK,MAAM,EACjC8B,EAAU9B,EAAK,SAAS,EAG9B,EAAG,CAACA,EAAK,MAAM,CAAC,EAEhBmC,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,GAAkCxC,CAAI,EAElCyC,EAAwBT,EAC1BU,GAA6B1C,EAAMgC,CAAW,EAC9C,KACEW,EAAoBX,EACtBY,GAAuB5C,EAAMgC,CAAW,EACxC,KAEEa,EAAWC,GAAY9C,CAAI,EAC3B+C,EAAcC,GAAgBhD,CAAI,EAElCiD,EAAiBtB,EAACuB,GACtB,CAAC,CAAC5C,EAAc4C,CAAU,GAAG,aADR,kBAGjBb,EACJH,IACEI,GAAyB,yBAC3B,CAAC,CAACG,GACF,CAAC,CAACE,GAAmB,aACpBM,EAAeN,EAAkB,UAAU,GAC1CvC,EAAmBuC,EAAkB,WAAYF,CAAqB,GAEpEU,GAAgBd,EAClBhC,EAAQ,KAAK,KAAMsC,EAAkB,WAAYF,CAAqB,EACtE,OAEEW,GAAcC,GAAgBrD,EAAMgC,CAAW,EAC/CsB,EAAQC,GAAS,CACrB,KAAAvD,EACA,cAAAmD,GACA,iBAAkBjB,EAClB,gBAAiBZ,EACjB,QAAS8B,GACT,YAAa5C,CACf,CAAC,EACKgD,GAAgBF,EAAM,OACtB,CAACG,GAAWC,EAAQ,EAAI,CAAC1D,EAAK,MAAM,CAAC,EAAGA,EAAK,MAAMwD,GAAgB,CAAC,CAAC,EACrEG,GACJD,GAAS,cAAgBA,GAAS,kCAE9BE,GAAW5D,EAAK,MAAM,OAC1B,CAAC4D,EAAUN,KAAUM,EAAW,WAAWN,GAAM,UAAY,EAAE,EAC/D,CACF,EAEMO,GAAe7D,EAAK,MAAM,KAC7B8D,GAASA,EAAK,YACjB,GAAG,aAEGC,GAAiBC,EACrB,OACE,WACEA,EACEL,GACA,EACA,CACF,CACF,GACGM,GACCP,GAAS,aACTA,GAAS,SACTA,GAAS,gBACThD,CACF,GAAK,EACT,EACA,EACA,CACF,EAEMwD,GAAgBF,EACpB,OACE,WAAWhE,EAAK,WAAW,GACxBiE,GACCR,GAAU,eACVA,GAAU,WACVA,GAAU,kBACV/C,CACF,GAAK,EACT,EACA,EACA,CACF,EAEMyD,EAAmBC,GAAeF,GAAeH,EAAc,EAE/DM,EACJrE,EAAK,SAAW,UACZsE,GAAK,EAAE,CACL,GAAI,kFACJ,OAAQ,CACN,OAAQN,EACNL,GACA,EACA,CACF,EACA,MAAOL,EAAME,GAAgB,CAAC,EAAE,GAAG,MAAM,YACzC,eAAgBe,GACdvE,EAAK,QAAQsD,EAAME,GAAgB,CAAC,EAAE,GAAG,MAAM,WAAW,GACtD,SAAW,EACjB,EACA,MAAOF,EAAME,GAAgB,CAAC,EAAE,GAAG,MAAM,WAC3C,CACF,CAAC,EACD,GAAGc,GAAK,EAAE,2BAA2B,KACnC/B,EACI+B,GAAK,EAAE,CACL,GAAI,0DACJ,OAAQ,CACN,OAAQ/B,EAA+B,aACvC,OAAQA,EAA+B,OACvC,WAAYA,EAA+B,UAC7C,CACF,CAAC,EACD,KAGZ,OACEiC,EAAA,cAACC,EAAA,CACC,UAAS,GACT,OAAQ,CACN,MAAOH,GAAK,EAAE,iBAAiB,EAC/B,SACEtE,EAAK,SAAW,UAAY,IAAMsB,EAAc,QAAQ,EAAI,OAC9D,OAAQtB,EAAK,SAAW,WACtBwE,EAAA,cAACE,GAAA,KACCF,EAAA,cAACG,GAAA,CACC,QAAQ,QACR,KAAK,QACL,KAAK,SACL,QAAS,IAAMrD,EAAc,QAAQ,GACrCkD,EAAA,cAACI,GAAA,CAAW,KAAK,SAAS,QAAQ,QAAQ,MAAM,SAC7CN,GAAK,EAAE,QAAQ,CAClB,CACF,CACF,CAEJ,EACA,OACEvB,GACA,CAACvB,GACCgD,EAAA,cAACG,GAAA,CACC,UAAS,GACT,QAAQ,YACR,KAAK,UACL,KAAK,QACL,QAAS,IAAM,CACbhE,EAAMX,EAAM,CAAE,YAAaQ,EAAa,OAAQE,CAAO,CAAC,EACxD,WAAW,IAAM,CAEfG,EADa,QACA,CACf,EAAG,CAAC,CACN,GACCyD,GAAK,EAAE,WAAW,CACrB,GAGJE,EAAA,cAACK,GAAA,KACCL,EAAA,cAACM,GAAA,KACCN,EAAA,cAAC,OAAI,UAAU,OACbA,EAAA,cAACI,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5C,GAAGN,GAAK,EAAE,YAAY,IACzB,EACAE,EAAA,cAAC,OAAI,UAAU,cACbA,EAAA,cAACI,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5C3E,CACH,EACAuE,EAAA,cAACO,GAAA,CACC,QAAQ,QACR,QAAS/D,EAAW,KAAK,KAAMf,GAAa,EAAE,GAC9CuE,EAAA,cAACQ,GAAA,CAAS,KAAM,GAAI,MAAM,OAAO,CACnC,CACF,CACF,EACAR,EAAA,cAAC,OAAI,UAAU,OACbA,EAAA,cAACI,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5C,GAAGN,GAAK,EAAE,YAAY,IACzB,EACAE,EAAA,cAACI,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5C/B,CACH,CACF,CACF,EAEA2B,EAAA,cAAC,OAAI,UAAU,UACbA,EAAA,cAACS,GAAA,CACC,IAAKjB,EACH,OAAOJ,EAAQ,EACf,EACA,CACF,EACA,KAAMsB,GAAgBC,GAAiBnF,EAAK,KAAK,CAAC,EAClD,MAAOwD,GACT,EACAgB,EAAA,cAACY,GAAA,CACC,KAAM,CACJ,MAAO,CACL,MAAOpB,EACLhE,EAAK,YACL,EACA,CACF,EACA,SAAUkE,EACZ,EACA,MAAO,CACL,YAAaZ,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,GACA,EACA,CACF,EACA,SAAUI,EACZ,EACA,MAAO,CACL,YAAaT,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,EAChBG,EACA,EACA,CACF,EACA,aAAckB,GAAoBlB,GAAoB,CAAC,EACzD,CACF,EACAK,EAAA,cAAC,OAAI,UAAU,eACbA,EAAA,cAACI,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BN,GAAK,EAAE,aAAa,CACvB,CACF,EACAE,EAAA,cAACc,GAAA,CAAQ,KAAM,EAAG,EAClBd,EAAA,cAACe,GAAA,CAAU,IAAKpE,GACbmC,EAAM,IAAI,CAACQ,EAAM0B,KAAU,CAC1B,IAAMC,GAAMD,GACNE,GAAQC,GAAa3F,EAAK,MAAMwF,EAAK,CAAC,EACtCI,GACJF,KAAU,SACVA,KAAU,eACVA,KAAU,WACTA,KAAU,aAAeF,KAAUlC,EAAM,OAAS,EACrD,OACEkB,EAAA,cAACqB,GAAA,CACC,IAAKJ,GACL,KAAM3B,EACN,KAAK,gBACL,IAAK3C,EACL,MAAOuE,GACP,aAAcF,KAAU,EACxB,SAAUC,GACV,UAAWG,GACb,CAEJ,CAAC,CACH,CACF,EAEApB,EAAA,cAACsB,GAAA,CACC,MAAOzE,EACP,QAAS,IAAMC,EAAc,IAAI,EACjC,SAAUI,EACV,SAAUxB,EACV,QAASkD,GAAY,gBAAgB,QACrC,kBAAmBT,EACrB,EACA6B,EAAA,cAACuB,GAAA,CACC,KAAM,CAAC,CAACvE,EACR,aAAcqC,GACd,QAAS,IAAMpC,EAAsB,IAAI,EACzC,OAAQzB,EAAK,SAAW,UAAY,UAAY,SAChD,WAAYgE,EACVL,GACA,EACA,CACF,EACA,SAAUI,GACV,iBAAkBC,EAChBG,EACA,EACA,CACF,EACA,MAAO,CACL,YAAab,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,YAAaa,EACf,CACF,CAEJ,CApWgB1C,EAAA7B,GAAA,ee3DhB,OAAS,QAAAkG,OAAY,eACrB,OACE,YAAAC,GACA,cAAAC,GACA,YAAAC,GACA,YAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QCVlB,OAAS,QAAAC,OAAY,eACrB,OAAS,cAAAC,GAAY,WAAAC,GAAS,YAAAC,GAAU,cAAAC,OAAkB,gBAC1D,OAAOC,MAAW,QCFlB,OAAS,UAAAC,OAAc,gBAEhB,IAAMC,GAAYD,GAAO,MAAO,CACrC,MAAO,OACP,OAAQ,OACR,QAAS,SAET,QAAS,CACP,WAAY,MACZ,QAAS,MACX,EAEA,iBAAkB,CAChB,QAAS,QACX,EAEA,sBAAuB,CACrB,QAAS,OACT,eAAgB,gBAChB,WAAY,QACd,EAEA,gBAAiB,CACf,QAAS,OACT,eAAgB,gBAChB,WAAY,QACd,EAEA,2BAA4B,CAC1B,MAAO,MACP,OAAQ,MACR,WAAY,wBACZ,WAAY,MACd,EAEA,eAAgB,CACd,cAAe,KACjB,CACF,CAAC,EAEYE,GAAgBF,GAAO,MAAO,CACzC,gBAAiB,cACjB,aAAc,MACd,QAAS,UAET,cAAe,CACb,QAAS,OACT,eAAgB,QAChB,WAAY,QACd,EACA,eAAgB,CACd,WAAY,KACZ,QAAS,OACT,WAAY,QACd,EACA,mBAAoB,CAClB,QAAS,OACT,WAAY,QACd,EACA,uBAAwB,CACtB,QAAS,QACT,QAAS,OACT,eAAgB,SAChB,WAAY,QACd,EAEA,cAAe,CACb,QAAS,OACT,WAAY,MACZ,cAAe,IACjB,CACF,CAAC,EACYG,GAAgBH,GAAO,MAAO,CACzC,MAAO,MACP,OAAQ,MACR,WAAY,yBACZ,WAAY,MACd,CAAC,EC3ED,OAAS,cAAAI,GAAY,WAAAC,GAAS,YAAAC,GAAU,YAAAC,OAAgB,gBACxD,OAAOC,OAAW,QAIX,SAASC,GAAsBC,EAA+B,CACnE,GAAM,CAAE,UAAAC,CAAU,EAAID,EACtB,OACEE,GAAA,cAACC,GAAA,KACCD,GAAA,cAAC,OAAI,UAAU,cACbA,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,cAAC,OAAI,UAAU,eACbA,GAAA,cAACG,GAAA,CAAQ,UAAU,aAAa,KAAM,GAAI,EAC1CH,GAAA,cAAC,OAAI,UAAU,mBACbA,GAAA,cAACI,GAAA,CAAW,KAAK,QAAQ,QAAO,GAAC,WAAW,GAAG,WAAW,GAAG,EAC7DJ,GAAA,cAACG,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCH,GAAA,cAACE,GAAA,CAAS,OAAQ,GAAI,MAAO,GAAI,QAAQ,UAAU,CACrD,EACAF,GAAA,cAAC,OAAI,UAAU,uBACbA,GAAA,cAACK,GAAA,CAAS,MAAM,OAAO,KAAM,GAAI,CACnC,EACAL,GAAA,cAAC,OAAI,UAAU,mBACbA,GAAA,cAACI,GAAA,CAAW,KAAK,QAAQ,QAAO,GAAC,WAAW,GAAG,WAAW,GAAG,EAC7DJ,GAAA,cAACG,GAAA,CAAQ,UAAU,aAAa,KAAM,EAAG,EACzCH,GAAA,cAACE,GAAA,CAAS,OAAQ,GAAI,MAAO,GAAI,QAAQ,UAAU,CACrD,CACF,EACCH,GACCC,GAAA,cAAC,OAAI,UAAU,cACbA,GAAA,cAACG,GAAA,CAAQ,UAAU,aAAa,KAAM,GAAI,EAC1CH,GAAA,cAACE,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,cAAc,CAC1D,CAEJ,CAEJ,CAjCgBI,EAAAT,GAAA,yBFAT,SAASU,IAAqB,CACnC,IAAMC,EACJC,EAAA,cAAC,OAAI,UAAU,sBACbA,EAAA,cAAC,OAAI,UAAU,gBACbA,EAAA,cAACC,GAAA,CAAW,QAAO,GAAC,KAAK,SAAS,WAAW,GAAG,WAAW,GAAG,EAC9DD,EAAA,cAACE,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCF,EAAA,cAACG,GAAA,CAAS,OAAQ,GAAI,MAAO,IAAK,QAAQ,UAAU,CACtD,EACAH,EAAA,cAACG,GAAA,CAAS,OAAQ,GAAI,MAAO,GAAI,QAAQ,UAAU,CACrD,EAGF,OACEH,EAAA,cAACI,GAAA,KACCJ,EAAA,cAAC,OAAI,UAAU,QACbA,EAAA,cAACG,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,EACnDH,EAAA,cAACE,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCF,EAAA,cAACG,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,EACnDH,EAAA,cAACE,GAAA,CAAQ,KAAM,EAAG,UAAU,aAAa,EACzCF,EAAA,cAACG,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CACrD,EAEAH,EAAA,cAAC,OAAI,UAAU,iBACZD,EACDC,EAAA,cAAC,OAAI,UAAU,0BAA0B,EACxCD,CACH,EAEAC,EAAA,cAAC,OAAI,UAAU,eACbA,EAAA,cAACK,GAAA,CAAW,QAAQ,QAAQ,KAAK,SAC9BC,GAAK,EAAE,aAAa,CACvB,CACF,EAEAN,EAAA,cAAC,OAAI,UAAU,kBACbA,EAAA,cAACO,GAAA,CAAsB,UAAS,GAAC,EACjCP,EAAA,cAACQ,GAAA,IAAc,EACfR,EAAA,cAACO,GAAA,IAAsB,EACvBP,EAAA,cAACQ,GAAA,IAAc,EACfR,EAAA,cAACO,GAAA,IAAsB,EACvBP,EAAA,cAACQ,GAAA,IAAc,EACfR,EAAA,cAACO,GAAA,IAAsB,CACzB,CACF,CAEJ,CA7CgBE,EAAAX,GAAA,sBDeT,SAASY,GAAuBC,EAAwC,CAC7E,GAAM,CAAE,UAAAC,EAAW,aAAAC,CAAa,EAAIF,EAEpC,OACEG,GAAA,cAACC,EAAA,CACC,UAAS,GACT,OAAQ,CACN,MAAOC,GAAK,EAAE,iBAAiB,EAC/B,OAAQF,GAAA,cAACG,GAAA,IAAgB,CAC3B,GACCJ,GACCC,GAAA,cAACI,GAAA,KACCJ,GAAA,cAACK,GAAA,KACCL,GAAA,cAAC,OAAI,UAAU,OACbA,GAAA,cAACM,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5C,GAAGJ,GAAK,EAAE,YAAY,IACzB,EACAF,GAAA,cAAC,OAAI,UAAU,cACbA,GAAA,cAACM,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC7CN,GAAA,cAACO,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CACrD,EACAP,GAAA,cAACQ,GAAA,CAAW,QAAQ,SAClBR,GAAA,cAACS,GAAA,CAAS,KAAM,GAAI,MAAM,OAAO,CACnC,CACF,CACF,EACAT,GAAA,cAAC,OAAI,UAAU,OACbA,GAAA,cAACM,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC5C,GAAGJ,GAAK,EAAE,YAAY,IACzB,EACAF,GAAA,cAACM,GAAA,CAAW,QAAQ,QAAQ,KAAK,QAAQ,MAAM,cAC7CN,GAAA,cAACO,GAAA,CAAS,MAAO,GAAI,OAAQ,GAAI,QAAQ,UAAU,CACrD,CACF,CACF,EACAP,GAAA,cAACU,GAAA,IAAmB,CACtB,EAED,CAACX,GACAC,GAAA,cAACW,GAAA,KACCX,GAAA,cAACY,GAAA,CACC,MAAOV,GAAK,EAAE,WAAW,EACzB,YAAaA,GAAK,EAAE,CAClB,GAAI,gDACJ,OAAQ,CAAE,UAAAJ,CAAU,CACtB,CAAC,EACH,CACF,CAEJ,CAEJ,CAnDgBe,EAAAjB,GAAA,0BhBXT,SAASkB,IAAkB,CAChC,GAAM,CAAE,QAAAC,EAAS,MAAAC,CAAM,EAAIC,GAAW,EAChCC,EAAU,CAACF,EAAM,oBACjBG,EAAeC,GAAgBL,CAAO,EACtCM,EAAYC,GAAW,IAAI,sBAAsB,EACjDC,EAAeC,GAAgB,EAC/B,CAAE,YAAaC,CAAgB,EAAIC,EAAY,EAE/CC,EAAeT,GAAWO,IAAoB,UAE9CG,EAAeT,EAAa,KAChC,CAAC,CAAE,KAAAU,CAAK,IAAMA,EAAK,YAAcR,CACnC,EAEMS,EAAWC,EAAA,IAAM,CACrB,GAAIH,GAAc,GAAI,CACpB,IAAMC,EAAOd,GAAS,IAAIa,EAAa,EAAE,EACrCC,GACFG,GAAWH,CAAI,EAGrB,EAPiB,YASXI,EAAWF,EAAA,SAAY,CAC3B,GAAIH,GAAc,GAChB,GAAI,CACFb,GAAS,YAAYa,EAAa,EAAE,EACpCL,EAAa,CACf,OAASW,EAAP,CACA,QAAQ,IAAIA,CAAC,CACf,CAEJ,EATiB,YAUXL,EAAOD,GAAc,KAE3B,MAAI,CAACC,GAAQF,EAETQ,GAAA,cAACC,GAAA,CACC,UAAWf,GAAa,GACxB,aAAcM,EAChB,EAKFQ,GAAA,cAACE,GAAA,CACC,KAAMR,EACN,UAAWR,GAAa,GACxB,SAAUS,EACV,SAAUG,EACZ,CAEJ,CApDgBF,EAAAjB,GAAA,mBoBXhB,OAAS,QAAAwB,OAAY,eACrB,OACE,iBAAAC,GACA,gBAAAC,GACA,iBAAAC,GACA,QAAAC,GACA,kBAAAC,GACA,SAAAC,GACA,aAAAC,GACA,cAAAC,OACK,gBACP,OAAOC,OAAW,QAcX,SAASC,IAAY,CAC1B,IAAMC,EAAQC,EAAiB,IAAI,MAAM,EACnCC,EAAWD,EAAiB,IAAI,SAAS,EAEzCE,EAAa,CACjB,CACE,GAAI,QACJ,MAAO,QACP,MACEC,GAAA,cAACC,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,OAAO,CACjB,EAEF,QAAS,IAAMJ,EAAS,OAAmB,EAC3C,MAAOE,GAAA,cAACG,GAAA,CAAc,MAAM,OAAO,EACnC,IAAKH,GAAA,cAACI,GAAA,CAAM,MAAO,QAAY,CACjC,EACA,CACE,GAAI,OACJ,MAAO,OACP,MACEJ,GAAA,cAACC,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,MAAM,CAChB,EAEF,QAAS,IAAMJ,EAAS,MAAkB,EAC1C,MAAOE,GAAA,cAACK,GAAA,CAAa,MAAM,OAAO,EAClC,IAAKL,GAAA,cAACI,GAAA,CAAM,MAAO,OAAW,CAChC,EACA,CACE,GAAI,OACJ,MAAO,OACP,MACEJ,GAAA,cAACC,GAAA,CAAW,QAAQ,QAAQ,KAAK,WAC9BC,GAAK,EAAE,MAAM,CAChB,EAEF,QAAS,IAAMJ,EAAS,MAAkB,EAC1C,MAAOE,GAAA,cAACM,GAAA,CAAc,MAAM,OAAO,EACnC,IAAKN,GAAA,cAACI,GAAA,CAAM,MAAO,OAAW,CAChC,CACF,EAEA,OACEJ,GAAA,cAACO,EAAA,CACC,OAAQ,CACN,MAAOL,GAAK,EAAE,OAAO,CACvB,GACAF,GAAA,cAACQ,GAAA,KACCR,GAAA,cAACS,GAAA,CACC,cAAgBC,GAAUZ,EAASY,CAAc,EACjD,MAAOd,GACPI,GAAA,cAACW,GAAA,CACC,KACEX,GAAA,cAACY,GAAA,CACC,MAAOV,GAAK,EAAE,OAAO,EACrB,GAAG,IACH,QAAS,IAAM,QAAQ,IAAI,EAC7B,EAEF,MAAOH,EACT,CACF,CACF,CACF,CAEJ,CAlEgBc,EAAAlB,GAAA,arGTT,SAASmB,IAAY,CAC1B,OAAOC,GAAU,CACf,CACE,KAAMC,EAAiB,KACvB,QAASC,GAAA,cAACC,GAAA,IAAK,CACjB,EACA,CACE,KAAMF,EAAiB,SACvB,SAAU,CACR,CACE,MAAO,GACP,QAASC,GAAA,cAACE,GAAA,CAAoB,KAAK,SAAS,CAC9C,EACA,CACE,KAAMH,EAAiB,YACvB,QAASC,GAAA,cAACG,GAAA,CAAqB,KAAK,SAAS,CAC/C,CACF,CACF,EACA,CACE,KAAMJ,EAAiB,OACvB,SAAU,CACR,CACE,MAAO,GACP,QAASC,GAAA,cAACE,GAAA,CAAoB,KAAK,cAAc,CACnD,EACA,CACE,KAAMH,EAAiB,YACvB,QAASC,GAAA,cAACG,GAAA,CAAqB,KAAK,cAAc,CACpD,CACF,CACF,EACA,CACE,KAAMJ,EAAiB,SACvB,SAAU,CACR,CACE,MAAO,GACP,QAASC,GAAA,cAACI,GAAA,IAAa,CACzB,EACA,CACE,KAAML,EAAiB,OACvB,QAASC,GAAA,cAACK,GAAA,IAAU,CACtB,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,CACF,CACF,EACA,CACE,KAAMR,EAAiB,MACvB,SAAU,CACR,CACE,MAAO,GACP,QAASC,GAAA,cAACQ,GAAA,IAAY,CACxB,EACA,CACE,KAAMT,EAAiB,YACvB,QAASC,GAAA,cAACS,GAAA,IAAgB,CAC5B,CACF,CACF,EACA,CACE,KAAMV,EAAiB,QACvB,QAASC,GAAA,cAACU,GAAA,IAAY,CACxB,EACA,CACE,KAAMX,EAAiB,YACvB,QAASC,GAAA,cAACW,GAAA,IAAgB,CAC5B,CACF,CAAC,CACH,CA/EgBC,EAAAf,GAAA,asGhBhB,OACE,gBAAAgB,GACA,cAAAC,GACA,kBAAAC,GACA,iBAAAC,GACA,4BAAAC,GACA,aAAAC,OACK,wCACP,OAAS,aAAAC,OAAiB,QCR1B,OAKE,mCAAAC,OACK,wCAsBA,IAAMC,GAA0D,CACrED,GAAgC,kCAChCA,GAAgC,2BAChCA,GAAgC,0BAClC,EDjBO,SAASE,IAAe,CAC7B,IAAMC,EAASC,EAAY,EAAE,OAAO,EAC9BC,EAAmBC,EAAgB,IAAI,iBAAiB,EACxDC,EAAoBD,EAAgB,IAAI,kBAAkB,EAC1DE,EAAkBC,GAAqB,IAAI,gBAAgB,EAC3DC,EAAYD,GAAqB,IAAI,UAAU,EAC/CE,EAAeC,GAAU,EAE/B,OAAAC,GAAU,KACRF,EAAa,GAAGG,GAAW,UAAYC,GAAgB,CACrD,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,EAAGnB,CAAM,EACtDqB,GAAajB,EAAkB,CAACiB,CAAS,EAAGrB,CAAM,EAGjDa,EAAM,OAASG,GAAc,sBAC5BO,GAAqB,SAASV,EAAM,MAAM,GAC5CA,EAAM,OAASG,GAAc,OAE7BX,EAAgBQ,EAAOE,CAAK,GAE5BF,EAAM,OAASG,GAAc,cAC7BH,EAAM,OAASG,GAAc,eAE7BT,EAAUQ,EAAM,SAAS,CAE7B,CAAC,EAEM,IAAMP,EAAa,IAAI,MAAM,GACnC,CAACA,EAAcN,EAAiB,MAAM,CAAC,EAE1CQ,GAAU,KACRF,EAAa,GAAGG,GAAW,WAAaC,GAAgB,CACtD,GAAM,CAAE,MAAAC,EAAO,MAAAE,CAAM,EAAIH,GAGvBC,EAAM,OAASW,GAAe,QAC9BX,EAAM,OAASW,GAAe,YAE9BnB,EAAgBQ,EAAOE,CAAK,CAEhC,CAAC,EAEM,IAAMP,EAAa,IAAI,MAAM,GACnC,CAACA,EAAcN,EAAiB,MAAM,CAAC,EAEnC,IACT,CA/DgBuB,EAAA1B,GAAA,gBEfhB,OAAS,aAAA2B,OAAiB,gBAEnB,IAAMC,GAAaC,EAAA,IACxBC,GAAU,CACR,UAAW,CACT,wJACA,uDACF,CACF,CAAC,EAAE,EANqB,cCC1B,OACE,eAAAC,GACA,aAAaC,GACb,cAAcC,OACT,gBACP,OAAS,aAAAC,GAAW,YAAAC,OAAgB,QCJpC,OACE,SAASC,GACT,cAAcC,OACT,gBCJP,IAAMC,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,UDDf,SAASC,GACdC,EACiB,CACjB,IAAMC,EAAaC,GAAgB,OAE7BC,EAAyBC,GAC7B,CACE,GAAGH,EACH,GAAGI,EACL,EACA,GACAL,GAAQ,IACV,EACMM,EAA0BF,GAC9BH,EACA,GACAD,GAAQ,KACV,EACMO,EAAuB,OAAO,KAAKJ,CAAsB,EAAE,OAAS,EACpEK,EAAwB,OAAO,KAAKF,CAAuB,EAAE,OAAS,EAExEG,EACAC,EAEJ,GAAIF,EAAuB,CACzB,IAAMG,EAAS,CAAE,OAAQL,CAAwB,EAEjDG,EAAQ,CACN,GAFS,GAAGG,YAAiCC,GAAOF,CAAM,IAG1D,OAAAA,CACF,EAEF,GAAIJ,EAAsB,CACxB,IAAMI,EAAS,CACb,OAAQR,CACV,EAEAO,EAAO,CACL,GAFS,GAAGE,WAAgCC,GAAOF,CAAM,IAGzD,OAAAA,CACF,EAGF,MAAO,CACL,MAAAF,EACA,KAAAC,CACF,CACF,CA/CgBI,EAAAf,GAAA,yBDNT,SAASgB,GAASC,EAAoB,CAC3C,GAAM,CACJ,OAAAC,EACA,WAAAC,EAAaC,GACb,aAAAC,EAAeC,GACf,sBAAAC,EAAwBC,GACxB,KAAAC,EAAO,MACT,EAAIR,EAEE,CAACS,EAASC,CAAU,EAAIC,GAAS,OAAO,EACxCC,EAAQC,EAAiB,IAAI,MAAM,EACnCC,EAAWD,EAAiB,IAAI,SAAS,EAEzC,CAAE,KAAAE,EAAM,MAAAC,CAAM,EAAIC,GAAsBhB,CAAM,EAE9CiB,EAAYC,GAAY,CAC5B,MAAO,CACL,QAAS,GAAGf,MACZ,UAAW,GAAGE,KAChB,EACA,MAAO,CACL,OAAQJ,CACV,CACF,CAAC,EACKkB,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,EAEvD,GAAIT,EAAM,CACR,IAAMU,EAAsBN,GAAYJ,EAAK,GAAIA,EAAK,MAAM,EAC5DO,EAAiB,KAAKG,EAAoB,SAAS,EAGrD,OAAAC,GAAU,IAAM,CACd,IAAMC,EAAsBC,EAACC,GAA+B,CACtDA,EAAM,QACRnB,EAAW,MAAM,EAEjBA,EAAW,OAAO,CAEtB,EAN4B,uBAQ5B,OACE,OAAO,YACP,OAAO,WAAW,8BAA8B,EAAE,SAElDA,EAAW,MAAM,EAGnB,OACG,WAAW,8BAA8B,EACzC,iBAAiB,SAAUiB,CAAmB,EAC1C,IAAM,CACX,OACG,WAAW,8BAA8B,EACzC,oBAAoB,SAAUA,CAAmB,CACtD,CACF,EAAG,CAAC,CAAC,EAELD,GAAU,IAAM,CACVlB,IAAS,QACXM,EAASN,CAAI,CAEjB,EAAG,CAACA,CAAI,CAAC,EAWF,CAAE,YATcoB,EAAA,IAAM,CAC3B,IAAME,EAAkBV,EAAkB,KAAK,GAAG,EAC5CW,EAAiBT,EAAiB,KAAK,GAAG,EAChD,OAAIV,IAAU,OACLH,IAAY,OAASsB,EAAiBD,EAExClB,IAAU,OAASmB,EAAiBD,CAC7C,EAPuB,iBASc,CACvC,CAlFgBF,EAAA7B,GAAA,YGlBhB,OAAS,UAAAiC,OAAc,gBAEhB,IAAMC,GAAgBD,GAAO,MAAO,CACzC,MAAO,OACP,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,WAAY,UACZ,UAAW,aACX,2BAA4B,CAC1B,UAAW,UACX,cAAe,MACjB,EACA,oBAAqB,CACnB,aAAc,WACd,WAAY,MACd,CACF,CAAC,E3HCM,SAASE,IAAO,CACrBC,GAAW,EAEX,GAAM,CAAE,MAAOC,EAAW,OAAAC,CAAO,EAAIC,EAAY,EAC3C,CAAE,YAAAC,CAAY,EAAIC,GAASH,GAAQ,OAAS,CAAC,CAAC,EAC9C,CAAE,eAAAI,EAAgB,eAAAC,CAAe,EAAIC,GAAY,EACjD,CAACC,EAAgCC,CAAiC,EACtEC,GAAiB,EAAE,EACf,CAACC,EAAoBC,CAAqB,EAAIF,GAAqB,EACnEG,EAAgBC,GAAWC,EAAa,EAE9C,OAAAC,GAAU,IAAM,CACThB,EAAU,EAAE,MAAM,EAClBiB,EAAiB,QAAQ,UAAU,EACnCC,GAAqB,QAAQ,UAAU,EAC5CL,EAAc,gBAAgBJ,CAAiC,CACjE,EAAG,CAAC,CAAC,EACLO,GAAU,IAAM,CACdV,EAAeL,GAAQ,QAAQ,CACjC,EAAG,CAACA,GAAQ,QAAQ,CAAC,EAGnBkB,GAAA,cAACC,GAAA,CAAY,SAAUf,GACrBc,GAAA,cAACE,GAAA,CAAc,GAAG,iBAAiB,UAAWlB,EAAY,GACxDgB,GAAA,cAACG,GAAA,IAAa,EACdH,GAAA,cAACI,GAAA,CACC,oBAAqBf,EACrB,mBAAoBG,EACpB,wBAAyB,IAAM,CAC7BC,EAAsB,MAAS,CACjC,GACAO,GAAA,cAACK,GAAA,IAAU,CACb,CACF,CACF,CAEJ,CApCgBC,EAAA3B,GAAA,Q4HfhB,OAAO4B,IAAS,WAAAC,OAAe,QCC/B,OACE,gCAAAC,GACA,uBAAAC,OACK,wCACP,OAAS,YAAYC,OAAuB,iCAC5C,OAAS,cAAAC,OAAkB,2BAC3B,OAAS,0CAAAC,OAA8C,4BACvD,OAAS,mBAAAC,OAAuB,cAChC,OAAOC,IAAS,WAAAC,OAAe,QAO/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,CAChC,CAAC,EACA,CAACX,EAAM,MAAM,CAAC,EAEXY,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,GAAKd,EAAmBW,EAAQG,CAAO,EAGvC,OAAOf,EAAQY,EAAQG,CAAO,CAChC,EALsB,iBAOhBC,EAAiBF,EAACG,GACtB,CAAC,CAACf,EAAce,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,EAAIvB,EAAcsB,CAAI,EAC9C,OAAOE,GAA8BD,CAAe,CACtD,EAH+B,0BAIzBE,EAAe9B,EAAU,EAEzB+B,EAA4B,CAChC,KAAM,CACJ,YAAaV,EACb,eAAgBG,EAChB,oBACEQ,GAAuCR,CAAc,EACvD,uBAAAE,CACF,EACA,WAAAzB,EAIA,QAAAY,EACA,UAAWiB,EACX,cAAAd,EACA,mBAAAZ,EACA,QAAAD,EACA,MAAAD,EACA,eAAAiB,CACF,EAEA,OACEc,GAAA,cAACC,GAAA,CACC,WAAY,CAAC3B,CAAY,EACzB,QAASwB,EACT,sBAAwBI,GAAY,CAClCC,GAA6BD,CAAO,CACtC,EACA,SAAU,IACTpC,EAAM,QACT,CAEJ,CArFSkB,EAAAnB,GAAA,gBAuFT,IAAOuC,GAAQvC,GCxGf,OAAS,cAAAwC,OAAkB,iCAC3B,OAAOC,IAAS,iBAAAC,GAAe,cAAAC,OAAkB,QAM1C,IAAMC,GAAoBC,GAE/B,MAAS,EAEJ,SAASC,GAAWC,EAAgC,CACzD,GAAM,CAAE,QAAAC,CAAQ,EAAIC,GAAW,EACzBC,EAAQC,GAAgBH,CAAO,EAC/BI,EAAUC,EAAgB,IAAI,iBAAiB,EAC/CC,EAAYD,EAAgB,IAAI,QAAQ,EACxCE,EAAeC,GAAwBJ,CAAO,EAC9CK,EAAUJ,EAAgB,IAAI,kBAAkB,EAEhDK,EAAQ,CACZ,MAAAR,EACA,QAAS,CACP,UAAAI,EACA,QAAAF,EACA,aAAAG,EACA,QAAAE,CACF,CACF,EAEA,OACEE,GAAA,cAACf,GAAkB,SAAlB,CAA2B,MAAOc,GAChCX,EAAM,QACT,CAEJ,CAvBgBa,EAAAd,GAAA,cAyBT,SAASe,IAAwC,CACtD,IAAMC,EAAUC,GAAWnB,EAAiB,EAC5C,GAAI,CAACkB,EACH,MAAM,IAAI,MACR,gEACF,EAEF,OAAOA,CACT,CARgBF,EAAAC,GAAA,aF3BT,SAASG,GAAeC,EAAqC,CAClE,GAAM,CAAE,cAAAC,EAAe,OAAAC,CAAO,EAAIF,EAElC,OAAAG,GAAQ,IAAM,CACZC,GAAW,CACT,QAASF,GAAQ,QAAUG,GAC3B,SAAUH,GAAQ,QAAUI,EAC9B,CAAC,CACH,EAAG,CAACJ,CAAM,CAAC,EAETK,GAAA,cAACC,GAAA,CAAc,OAAQN,EAAQ,cAAeD,GAC5CM,GAAA,cAACE,GAAA,CAAa,OAAQP,EAAO,QAC3BK,GAAA,cAACG,GAAA,KAAYV,EAAM,QAAS,CAC9B,CACF,CAEJ,CAhBgBW,EAAAZ,GAAA,kB7HFT,SAASa,GAAOC,EAAuC,CAC5D,OAAKA,EAAM,QAAQ,gBAOZC,GAAA,cAACC,GAAA,IAAK,EALTD,GAAA,cAACE,GAAA,CAAe,OAAQH,EAAM,QAAUI,IACtCH,GAAA,cAACC,GAAA,IAAK,CACR,CAIN,CATgBG,EAAAN,GAAA",
6
- "names": ["MainEvents", "RouteEventType", "StepEventType", "StepExecutionBlockedEventStatus", "StepExecutionEventStatus", "useWidgetEvents", "useWallets", "Events", "Provider", "isEvmBlockchain", "React", "createContext", "useEffect", "useRef", "useEffect", "create", "subscribeWithSelector", "RangoClient", "RANGO_PUBLIC_API_KEY", "DEFAULT_BASE_URL", "configs", "RANGO_PUBLIC_API_KEY", "getConfig", "name", "__name", "initConfig", "nextConfigs", "clonedConfigs", "configs", "__name", "DEFAULT_PRIMARY_RADIUS", "DEFAULT_SECONDARY_RADIUS", "DEFAULT_FONT_FAMILY", "THEME_CLASS_NAME_PREFIX", "rango", "httpService", "__name", "RangoClient", "getConfig", "WalletStatus", "readAccountAddress", "detectInstallLink", "getCosmosExperimentalChainInfo", "isEvmAddress", "KEPLR_COMPATIBLE_WALLETS", "Networks", "BigNumber", "isCosmosBlockchain", "BigNumber", "ZERO", "WalletTypes", "EXCLUDED_WALLETS", "BigNumber", "secondsToString", "__name", "s", "seconds", "numberToString", "number", "minDecimals", "maxDecimals", "BigNumber", "roundingMode", "maxI", "i", "totalArrivalTime", "__name", "data", "a", "b", "containsText", "__name", "text", "searchText", "isPositiveNumber", "limitDecimalPlaces", "numberString", "maxDecimalPlaces", "number", "multiplier", "mapStatusToWalletState", "state", "WalletStatus", "__name", "mapWalletTypesToWalletInfo", "getState", "getWalletInfo", "list", "chain", "wallet", "EXCLUDED_WALLETS", "supportedChains", "isContractWallet", "installed", "network", "supportedChain", "type", "name", "image", "installLink", "detectInstallLink", "walletAndSupportedChainsNames", "supportedBlockchains", "blockchainMeta", "prepareAccountsForWalletStore", "accounts", "evmBasedChains", "supportedChainNames", "result", "addAccount", "address", "account", "newAccount", "readAccountAddress", "hasLimitation", "isSupported", "isUnknown", "Networks", "isUnknownAndEvmBased", "isEvmAddress", "getRequiredChains", "quote", "wallets", "swap", "currentStepFromBlockchain", "currentStepToBlockchain", "internalSwap", "internalStepFromBlockchain", "internalStepToBlockchain", "getBalanceFromWallet", "connectedWallets", "symbol", "selectedChainWallets", "balance", "a", "b", "isAccountAndWalletMatched", "connectedWallet", "makeBalanceFor", "retrievedBalance", "tokens", "balances", "tokenBalance", "BigNumber", "getUsdPrice", "resetConnectedWalletState", "calculateWalletUsdValue", "uniqueAccountAddresses", "modifiedWalletBlockchains", "acc", "current", "i", "modifiedWalletBlockchain", "accountAddress", "total", "numberToString", "ZERO", "numberWithThousandSeparator", "number", "parts", "getUsdPrice", "__name", "blockchain", "symbol", "address", "allTokens", "t", "isExperimentalChain", "blockchains", "wallet", "cosmosExperimentalChainInfo", "getCosmosExperimentalChainInfo", "blockchainMeta", "isCosmosBlockchain", "getTokensWithBalance", "tokens", "connectedWallets", "balance", "otherProps", "tokenAmount", "numberToString", "BigNumber", "getBalanceFromWallet", "ZERO", "tokenUsdValue", "__name", "getTokensBalanceFromWalletAndSort", "list", "tokenA", "tokenB", "tokensAreEqual", "tokenA", "tokenB", "__name", "sortWalletsBasedOnConnectionState", "wallets", "a", "b", "WalletStatus", "getConciseAddress", "address", "maxChars", "ellipsisLength", "start", "end", "getAddress", "chain", "connectedWallets", "walletType", "connectedWallet", "createSelectors", "__name", "_store", "store", "k", "s", "selectors_default", "useWalletsStore", "selectors_default", "create", "subscribeWithSelector", "set", "get", "accounts", "tokens", "getWalletsDetails", "state", "wallet", "account", "shouldMarkWalletAsSelected", "connectedWallet", "walletType", "selectedWallets", "selectedWallet", "wallets", "walletSelected", "walletNotSelected", "shouldRetry", "isAccountAndWalletMatched", "data", "address", "chain", "retrievedBalance", "httpService", "matchedAccount", "retrievedBalanceAccount", "balance", "makeBalanceFor", "resetConnectedWalletState", "allProviders", "matchAndGenerateProviders", "providers", "options", "all", "allProviders", "selectedProviders", "requestedProvider", "result", "provider", "__name", "configWalletsToWalletName", "config", "useWalletProviders", "providers", "options", "clearConnectedWallet", "useWalletsStore", "generateProviders", "matchAndGenerateProviders", "useEffect", "__name", "React", "createContext", "useContext", "useRef", "create", "DEFAULT_CONFIG", "createConfigSlice", "__name", "initialData", "set", "get", "nextConfig", "currentConfig", "removeDuplicateFrom", "array", "__name", "areEqual", "array1", "array2", "v", "i", "debounce", "fn", "time", "timeoutId", "wrapper", "args", "containsText", "text", "searchText", "getContainer", "create", "persist", "subscribeWithSelector", "English", "French", "Japanese", "Spanish", "LANGUAGES", "DEFAULT_LANGUAGE", "SLIPPAGES", "DEFAULT_SLIPPAGE", "HIGH_SLIPPAGE", "MAX_SLIPPAGE", "MIN_SLIPPGAE", "useSettingsStore", "selectors_default", "create", "persist", "subscribeWithSelector", "set", "get", "DEFAULT_SLIPPAGE", "DEFAULT_LANGUAGE", "blockchain", "currentPreferredBlockchains", "preferredBlockchain", "index", "isSameBlockchain", "isInVisibleList", "nextPreferredBlockchains", "slippage", "customSlippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "swappers", "shouldReset", "state", "swappersGroup", "removeDuplicateFrom", "swapper", "name", "liquiditySource", "theme", "language", "getUniqueSwappersGroups", "swappers", "disabledLiquiditySources", "useSettingsStore", "supportedSwappers", "swapper", "uniqueSupportedSwappersGroups", "removeDuplicateFrom", "s", "uniqueGroupItem", "swapperItem", "isSupportedSwapper", "supportedItem", "swapperTypeItem", "__name", "sortLiquiditySourcesByGroupTitle", "a", "b", "createDataSlice", "__name", "set", "get", "options", "blockchainsFromState", "config", "supportedBlockchainsFromConfig", "blockchain", "tokensFromState", "supportedTokensFromConfig", "blockchains", "token", "asset", "tokensAreEqual", "containsText", "a", "b", "pinnedToken", "enableNewLiquiditySources", "liquiditySources", "swapper", "swapperGroupIncludedInLiquiditySources", "sortLiquiditySourcesByGroupTitle", "response", "httpService", "tokens", "popularTokens", "swappers", "blockchainsWithAtLeastOneToken", "error", "createAppStore", "initialData", "create", "a", "createDataSlice", "createConfigSlice", "__name", "AppStoreContext", "createContext", "useAppStore", "store", "useContext", "__name", "AppStoreProvider", "props", "appStoreRef", "useRef", "createAppStore", "React", "WidgetContext", "createContext", "Main", "props", "updateConfig", "useAppStore", "blockchains", "tokens", "walletOptions", "providers", "useWalletProviders", "disconnectWallet", "useWalletsStore", "connectWallet", "onConnectWalletHandler", "useRef", "useEffect", "evmBasedChainNames", "isEvmBlockchain", "chain", "onUpdateState", "__name", "type", "event", "value", "state", "meta", "Events", "supportedChainNames", "walletAndSupportedChainsNames", "data", "prepareAccountsForWalletStore", "key", "React", "handler", "Provider", "WidgetWallets", "config", "otherProps", "AppStoreProvider", "React", "I18nManager", "React", "useContext", "useEffect", "useState", "useQueueManager", "useWallets", "isEvmBlockchain", "React", "Fragment", "MemoryRouter", "useInRouterContext", "useWallets", "useEffect", "useRef", "useForceAutoConnect", "connect", "state", "useWallets", "initiated", "useRef", "fetchStatus", "useAppStore", "walletType", "walletState", "useEffect", "__name", "useEffect", "useRef", "createSearchParams", "useLocation", "useSearchParams", "navigationRoutes", "useEffect", "useMemo", "useRef", "BigNumber", "create", "subscribeWithSelector", "getLastSuccessfulStep", "BigNumber", "QuoteWarningType", "getBlockchainDisplayNameFor", "blockchainName", "blockchains", "blockchain", "__name", "getBlockchainShortNameFor", "getSwapperDisplayName", "swapperId", "swappers", "swapper", "findToken", "tokens", "token", "tokensAreEqual", "findBlockchain", "name", "i18n", "PendingSwapNetworkStatus", "BigNumber", "getRequiredWallets", "quote", "wallets", "swap", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "__name", "isValidAddress", "chain", "address", "i18n", "errorMessages", "__name", "i18n", "getQuoteErrorMessage", "error", "i18n", "swapButtonTitles", "__name", "i18n", "hasHighValueLoss", "inputUsdValue", "priceImpact", "BigNumber", "__name", "hasLimitError", "quote", "swap", "minimum", "maximum", "getLimitErrorMessage", "isExclusive", "fromAmountRangeError", "recommendation", "i18n", "numberToString", "errorMessages", "getSwapButtonState", "params", "fetchMetaStatus", "anyWalletConnected", "fetchingQuote", "inputAmount", "warning", "error", "needsToWarnEthOnPath", "swapButtonTitles", "canComputePriceImpact", "usdValue", "ZERO", "requiredWallets", "wallets", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "getUsdPrice", "blockchain", "symbol", "address", "allTokens", "t", "getUsdFeeOfStep", "step", "totalFeeInUsd", "i", "fee", "unitPrice", "getTotalFeeInUsd", "swaps", "totalFee", "checkSlippageErrors", "quote", "recommendedSlippages", "swap", "index", "__name", "checkSlippageWarnings", "userSlippage", "getMinRequiredSlippage", "slippage", "s", "a", "b", "hasProperSlippage", "minRequiredSlippage", "createQuoteRequestBody", "params", "fromToken", "toToken", "inputAmount", "wallets", "selectedWallets", "disabledLiquiditySources", "liquiditySources", "excludeLiquiditySources", "slippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "initialQuote", "destination", "selectedWalletsMap", "selectedWallet", "connectedWallets", "wallet", "chainAndAccounts", "connectedWallet", "checkPrerequisites", "filteredBlockchains", "removeDuplicateFrom", "blockchains", "swap", "internalSwap", "liquiditySource", "__name", "getWalletsForNewSwap", "getQuoteOutputAmount", "quote", "getPercentageChange", "input", "output", "BigNumber", "isOutputAmountChangedALot", "oldQuote", "newQuote", "oldOutputAmount", "newOutputAmount", "percentageChange", "getPriceImpact", "generateBalanceWarnings", "fee", "requiredWallets", "getRequiredChains", "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", "confirmSwapDisabled", "fetching", "showCustomDestination", "customDestination", "lastStepToBlockchain", "chain", "isValidAddress", "searchParamsToToken", "tokens", "searchParams", "chain", "token", "symbolAndAddress", "__name", "getQuoteToTokenUsdPrice", "quote", "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", "tokens", "firstStep", "lastStep", "lastSuccessfulStep", "getLastSuccessfulStep", "toToken", "fromBlockchainMeta", "findBlockchain", "toBlockchainMeta", "fromTokenMeta", "findToken", "toTokenMeta", "inputAmount", "__name", "generateQuoteWarnings", "quote", "params", "fromToken", "userSlippage", "inputUsdValue", "getUsdValue", "outputUsdValue", "priceImpact", "getPriceImpact", "hasHighValueLoss", "totalFee", "getTotalFeeInUsd", "warningLevel", "getPriceImpactLevel", "minRequiredSlippage", "getMinRequiredSlippage", "highSlippage", "HIGH_SLIPPAGE", "hasProperSlippage", "checkSlippageWarnings", "getPriceImpact", "inputUsdValue", "outputUsdValue", "outputUsdValueIsInvalid", "percentageChange", "getPercentageChange", "__name", "getUsdValue", "__name", "token", "amount", "BigNumber", "ZERO", "useQuoteStore", "selectors_default", "create", "subscribeWithSelector", "set", "quote", "state", "outputAmount", "outputUsdValue", "isPositiveNumber", "calcOutputUsdValue", "getQuoteToTokenUsdPrice", "chain", "params", "blockchain", "pendingSwap", "meta", "tokens", "blockchains", "fromBlockchain", "fromToken", "toBlockchain", "toToken", "inputAmount", "createRetryQuote", "flag", "wallets", "address", "useSyncStoresWithConfig", "setInputAmount", "setToToken", "setToBlockchain", "setFromBlockchain", "setFromToken", "fromToken", "toToken", "fromBlockchain", "toBlockchain", "useQuoteStore", "config", "useAppStore", "fetchMetaStatus", "blockchains", "tokens", "setAffiliateRef", "setAffiliatePercent", "setAffiliateWallets", "useSettingsStore", "fromTokensConfig", "useMemo", "fromBlockchainsConfig", "toTokensConfig", "toBlockchainsConfig", "prevConfigFromToken", "useRef", "prevConfigToToken", "prevConfigFromBlockchain", "prevConfigToBlockchain", "useEffect", "chain", "token", "t", "tokensAreEqual", "__name", "create", "useUiStore", "selectors_default", "create", "set", "requestId", "path", "UpdateUrl", "firstRender", "useRef", "searchParams", "setSearchParams", "useSearchParams", "location", "useLocation", "firstRenderSearchParams", "searchParamsRef", "fromBlockchain", "useQuoteStore", "toBlockchain", "fromToken", "toToken", "setFromBlockchain", "setFromToken", "setToBlockchain", "setToToken", "inputAmount", "setInputAmount", "fetchMetaStatus", "useAppStore", "blockchains", "tokens", "setSelectedSwap", "useUiStore", "useSyncStoresWithConfig", "useEffect", "params", "createSearchParams", "value", "key", "requestId", "navigationRoutes", "fromChainString", "fromTokenString", "toChainString", "toTokenString", "fromAmount", "autoConnect", "blockchain", "searchParamsToToken", "__name", "AppRouter", "children", "props", "isRouterInContext", "useInRouterContext", "Router", "Fragment", "MemoryRouter", "blockchains", "useAppStore", "canSwitchNetworkTo", "useWallets", "useForceAutoConnect", "evmChains", "isEvmBlockchain", "useQueueManager", "React", "UpdateUrl", "__name", "React", "useRoutes", "i18n", "useManager", "Alert", "Button", "Divider", "IconButton", "RefreshIcon", "SettingsIcon", "styled", "Tooltip", "Typography", "WalletIcon", "React", "useEffect", "useLayoutEffect", "useRef", "useState", "flushSync", "useNavigate", "i18n", "Alert", "BalanceErrors", "Button", "ChevronDownIcon", "ChevronLeftIcon", "Divider", "MessageBox", "Modal", "Typography", "WalletIcon", "React", "useEffect", "useLayoutEffect", "useRef", "useState", "useNavigate", "i18n", "getQuoteUpdateWarningMessage", "warning", "i18n", "__name", "Collapsible", "Button", "darkTheme", "IconButton", "keyframes", "styled", "TextField", "EXPANDABLE_TRANSITION_DURATION", "slideDown", "slideUp", "Title", "ListContainer", "WalletButton", "Trigger", "ShowMoreHeader", "NavigateBack", "WalletsContainer", "CollapsibleRoot", "CustomDestinationButton", "CustomDestination", "ExpandedIcon", "ConfirmButton", "StyledTextField", "CollapsibleContent", "Wallets", "i18n", "Button", "Divider", "Image", "MessageBox", "Modal", "SelectableWallet", "Typography", "WalletState", "React", "useEffect", "useState", "WalletState", "useWallets", "KEPLR_COMPATIBLE_WALLETS", "WalletTypes", "useEffect", "useState", "ALL_SUPPORTED_WALLETS", "WalletTypes", "useWalletList", "params", "config", "chain", "onBeforeConnect", "onConnect", "state", "disconnect", "getWalletInfo", "connect", "useWallets", "connectedWallets", "useWalletsStore", "blockchains", "useAppStore", "listAvailableWalletTypes", "configWalletsToWalletName", "wallets", "mapWalletTypesToWalletInfo", "sortedWallets", "sortWalletsBasedOnConnectionState", "error", "setError", "useState", "isExperimentalChainNotAdded", "__name", "walletType", "connectedWallet", "handleClick", "type", "wallet", "atLeastOneWalletIsConnected", "w", "WalletState", "e", "disconnectConnectingWallets", "connectingWallets", "useEffect", "shouldExcludeWallet", "isExperimentalChain", "KEPLR_COMPATIBLE_WALLETS", "i18n", "styled", "Typography", "Wallet", "WalletState", "React", "Fragment", "useState", "BottomLogo", "Divider", "Header", "React", "useNavigate", "useNavigateBack", "navigate", "useNavigate", "__name", "ChevronLeftIcon", "React", "darkTheme", "IconButton", "styled", "HeaderButton", "ConnectedIcon", "SuffixContainer", "NotificationsBadgeContainer", "BackButton", "props", "React", "HeaderButton", "ChevronLeftIcon", "__name", "i18n", "Button", "Typography", "React", "CancelButton", "props", "React", "SuffixContainer", "Button", "Typography", "i18n", "__name", "i18n", "Tooltip", "WalletIcon", "React", "WalletButton", "props", "React", "Tooltip", "i18n", "HeaderButton", "ConnectedIcon", "WalletIcon", "__name", "i18n", "NotificationsIcon", "Popover", "RefreshIcon", "SettingsIcon", "Tooltip", "TransactionIcon", "React", "i18n", "ChainToken", "ChevronRightIcon", "ListItemButton", "Typography", "React", "useNavigate", "create", "persist", "subscribeWithSelector", "useNotificationStore", "selectors_default", "create", "persist", "subscribeWithSelector", "set", "get", "event", "route", "fromStep", "toStep", "notification", "excludedList", "notificationItem", "requestId", "state", "styled", "Container", "List", "Images", "NotFoundContainer", "i18n", "Divider", "NoNotificationIcon", "Typography", "React", "NotificationNotFound", "React", "NotFoundContainer", "NoNotificationIcon", "Divider", "Typography", "i18n", "__name", "MAX_NOTIFICATIONS_DISPLAYED", "NotificationContent", "navigate", "useNavigate", "setSelectedSwap", "useUiStore", "getUnreadNotifications", "useNotificationStore", "notifications", "blockchains", "useAppStore", "tokens", "sortedNotification", "a", "b", "handleOnClick", "__name", "requestId", "navigationRoutes", "React", "Container", "List", "notificationItem", "fromToken", "tokenItem", "fromBlockchain", "blockchainItem", "toToken", "toBlockchain", "ListItemButton", "Typography", "i18n", "Images", "ChainToken", "ChevronRightIcon", "NotificationNotFound", "Typography", "React", "UnreadNotificationsBadge", "getUnreadNotifications", "useNotificationStore", "notificationsCount", "React", "NotificationsBadgeContainer", "Typography", "__name", "HomeButtons", "props", "layoutRef", "onClickRefresh", "onClickHistory", "onClickSettings", "onClickNotifications", "React", "Tooltip", "getContainer", "i18n", "HeaderButton", "RefreshIcon", "Popover", "NotificationContent", "NotificationsIcon", "UnreadNotificationsBadge", "SettingsIcon", "TransactionIcon", "__name", "darkTheme", "styled", "Container", "Content", "Footer", "LayoutComponent", "props", "ref", "children", "header", "footer", "noPadding", "hasLogo", "fixedHeight", "connectedWallets", "useWalletsStore", "connectWalletsButtonDisabled", "useUiStore", "navigateBack", "useNavigateBack", "onConnectWallet", "__name", "showBackButton", "React", "Container", "Header", "BackButton", "WalletButton", "getContainer", "CancelButton", "Content", "Footer", "Divider", "BottomLogo", "Layout", "Divider", "Modal", "React", "i18n", "Image", "MessageBox", "WalletState", "React", "keyframes", "styled", "IconContainer", "LogoContainer", "spin", "Spinner", "WalletImageContainer", "ModalContent", "props", "state", "image", "error", "WalletState", "React", "MessageBox", "i18n", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "__name", "WalletModal", "props", "open", "onClose", "otherProps", "React", "Modal", "ModalContent", "Divider", "__name", "ListContainer", "styled", "Container", "TIME_TO_CLOSE_MODAL", "TIME_TO_IGNORE_MODAL", "WalletsPage", "config", "fetchMetaStatus", "useAppStore", "openModal", "setOpenModal", "useState", "selectedWalletType", "setSelectedWalletType", "modalTimerId", "list", "handleClick", "error", "useWalletList", "type", "selectedWallet", "wallet", "selectedWalletImage", "selectedWalletState", "WalletState", "React", "Layout", "i18n", "Typography", "index", "key", "Fragment", "Wallet", "getContainer", "WalletModal", "__name", "keyframes", "styled", "LogoContainer", "SpinAnimation", "Spinner", "WalletImageContainer", "WalletList", "props", "chain", "isSelected", "selectWallet", "limit", "onShowMore", "config", "useAppStore", "connectedWallets", "useWalletsStore", "blockchains", "openWalletStateModal", "setOpenWalletStateModal", "useState", "experimentalChainWallet", "setExperimentalChainWallet", "showExperimentalChainModal", "setShowExperimentalChainModal", "addingExperimentalChainStatus", "setAddingExperimentalChainStatus", "suggestAndConnect", "useWallets", "modalTimerId", "list", "error", "handleClick", "useWalletList", "type", "TIME_TO_IGNORE_MODAL", "TIME_TO_CLOSE_MODAL", "sortedList", "setSortedList", "numberOfSupportedWallets", "shouldShowMoreWallets", "addExperimentalChain", "__name", "wallet", "useEffect", "selectedWalletIndex", "_", "index", "sortedItem", "listItem", "modalContainer", "timeout", "React", "address", "getAddress", "conciseAddress", "getConciseAddress", "experimentalChain", "isExperimentalChain", "experimentalChainNotAdded", "connectedWallet", "couldAddExperimentalChain", "WalletState", "connectedWalletDescription", "i18n", "onClick", "blockchainDisplayName", "getBlockchainDisplayNameFor", "WalletModal", "Modal", "MessageBox", "Divider", "Button", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "SelectableWallet", "WalletButton", "Typography", "NUMBER_OF_WALLETS_TO_DISPLAY", "ConfirmWalletsModal", "props", "open", "onClose", "onCancel", "onCheckBalance", "loading", "config", "useAppStore", "blockchains", "quote", "selectQuoteWallets", "quoteWalletsConfirmed", "setQuoteWalletConfirmed", "customDestination", "setCustomDestination", "useQuoteStore", "connectedWallets", "selectWallets", "useWalletsStore", "showMoreWalletFor", "setShowMoreWalletFor", "useState", "balanceWarnings", "setBalanceWarnings", "error", "setError", "quoteWarning", "setQuoteWarning", "destination", "setDestination", "showCustomDestination", "setShowCustomDestination", "customDestinationRef", "useRef", "requiredWallets", "getRequiredWallets", "lastStepToBlockchain", "blockchain", "isWalletRequiredFor", "__name", "swap", "selectableWallets", "setSelectableWallets", "connectedWallet", "lastStepToBlockchainMeta", "chain", "isSelected", "walletType", "selectableWallet", "isAddressMatched", "isValidAddress", "resetCustomDestination", "anyWalletSelected", "onChange", "wallet", "onConfirmBalance", "lastSelectedWallets", "onConfirmWallets", "selectedWallets", "result", "warnings", "getQuoteErrorMessage", "useEffect", "useLayoutEffect", "EXPANDABLE_TRANSITION_DURATION", "modalContainer", "navigate", "useNavigate", "React", "Modal", "ConfirmButton", "Button", "confirmSwapDisabled", "ShowMoreHeader", "NavigateBack", "ChevronLeftIcon", "Typography", "i18n", "getBlockchainShortNameFor", "MessageBox", "BalanceErrors", "WalletsContainer", "WalletList", "Alert", "Divider", "getQuoteUpdateWarningMessage", "Wallets", "requiredWallet", "index", "key", "isLastWallet", "Title", "ListContainer", "CustomDestination", "CollapsibleRoot", "checked", "Trigger", "prevState", "CustomDestinationButton", "ExpandedIcon", "ChevronDownIcon", "WalletIcon", "CollapsibleContent", "StyledTextField", "e", "Divider", "React", "i18n", "Alert", "ChevronDownIcon", "ChevronRightIcon", "Divider", "Image", "InfoIcon", "QuoteCost", "StepDetails", "TokenAmount", "Tooltip", "Typography", "React", "useLayoutEffect", "useRef", "useState", "styled", "PositionTopAlerts", "QuoteContainer", "SkeletonContainer", "FooterStepAlarm", "FooterAlert", "Collapsible", "darkTheme", "Image", "styled", "EXPANDABLE_QUOTE_TRANSITION_DURATION", "QuoteContainer", "styled", "darkTheme", "SummaryContainer", "Chains", "Image", "ChainImageContainer", "Content", "CollapsibleContent", "IconContainer", "Separator", "HorizontalSeparator", "FrameIcon", "TokenAmount", "React", "styled", "Container", "QuoteSummary", "props", "from", "to", "percentageChange", "warningLevel", "React", "Container", "TokenAmount", "__name", "Quote", "props", "quote", "input", "output", "error", "warning", "type", "recommended", "tokens", "useAppStore", "blockchains", "swappers", "expanded", "setExpanded", "useState", "quoteRef", "useRef", "prevExpanded", "totalFee", "numberToString", "getTotalFeeInUsd", "totalTime", "secondsToString", "totalArrivalTime", "roundedInput", "roundedOutput", "roundedOutputUsdValue", "priceImpact", "getPriceImpact", "percentageChange", "priceImpactWarningLevel", "getPriceImpactLevel", "steps", "__name", "swaps", "swap", "index", "stepState", "stepHasError", "stepHasWarning", "getSwapperDisplayName", "getBlockchainShortNameFor", "React", "FooterStepAlarm", "Alert", "i18n", "FooterAlert", "Typography", "Divider", "numberOfSteps", "tooltipContainer", "getContainer", "useLayoutEffect", "EXPANDABLE_QUOTE_TRANSITION_DURATION", "SummaryContainer", "QuoteCost", "FrameIcon", "InfoIcon", "TokenAmount", "QuoteSummary", "QuoteContainer", "Chains", "ref", "prevState", "step", "key", "arrow", "IconContainer", "ChevronRightIcon", "Tooltip", "ChainImageContainer", "Image", "ChevronDownIcon", "Content", "HorizontalSeparator", "StepDetails", "ChainToken", "Divider", "NextIcon", "Skeleton", "React", "darkTheme", "styled", "Container", "StepSeparator", "StepSkeleton", "props", "separator", "React", "Skeleton", "Divider", "StepSeparator", "ChainToken", "NextIcon", "__name", "QuoteSkeleton", "type", "expanded", "tag", "quoteSummary", "Container", "i18n", "Alert", "Button", "InfoIcon", "React", "Alert", "Button", "Divider", "NoRouteIcon", "RefreshIcon", "Typography", "React", "i18n", "makeInfo", "error", "disabledLiquiditySources", "toggleAllLiquiditySources", "refetchQuote", "errorMessages", "i18n", "__name", "styled", "Container", "Footer", "PrefixIcon", "NoResult", "props", "fetch", "error", "disabledLiquiditySources", "useSettingsStore", "toggleAllLiquiditySources", "swappers", "useAppStore", "info", "makeInfo", "React", "Container", "NoRouteIcon", "Divider", "Typography", "errorMessages", "Footer", "Alert", "Button", "PrefixIcon", "RefreshIcon", "__name", "i18n", "Button", "Divider", "MessageBox", "Modal", "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", "type", "highValueLossData", "i18n", "numberToString", "React", "Modal", "getContainer", "MessageBox", "errorMessages", "Flex", "Divider", "Typography", "item", "index", "QuoteErrorsModalItem", "Button", "WarningIcon", "__name", "i18n", "makeAlerts", "warning", "error", "alertInfo", "getPriceImpactLevel", "errorMessages", "i18n", "__name", "i18n", "Button", "Divider", "MessageBox", "Modal", "Typography", "React", "useNavigate", "SlippageWarningModal", "props", "customSlippage", "slippage", "useSettingsStore", "open", "onClose", "onConfirm", "warning", "navigate", "useNavigate", "userSlippage", "React", "Modal", "Button", "navigationRoutes", "Typography", "i18n", "getContainer", "MessageBox", "Divider", "__name", "Button", "Divider", "MessageBox", "Modal", "WarningIcon", "React", "UnknownPriceWarningModal", "props", "open", "onClose", "onConfirm", "React", "Modal", "getContainer", "MessageBox", "errorMessages", "Divider", "Button", "WarningIcon", "__name", "QuoteWarningsAndErrors", "props", "warning", "error", "refetchQuote", "showWarningModal", "onOpenWarningModal", "onCloseWarningModal", "onConfirmWarningModal", "onChangeSettings", "warningModalHandlers", "showNoResultMessage", "alertInfo", "makeAlerts", "React", "NoResult", "Alerts", "Alert", "Action", "InfoIcon", "Button", "i18n", "HighValueLossWarningModal", "SlippageWarningModal", "UnknownPriceWarningModal", "__name", "QuoteInfo", "props", "quote", "type", "loading", "error", "warning", "refetchQuote", "showWarningModal", "onOpenWarningModal", "onCloseWarningModal", "onConfirmWarningModal", "onChangeSettings", "expanded", "alertPosition", "inputAmount", "inputUsdValue", "outputUsdValue", "outputAmount", "useQuoteStore", "showQuote", "quoteWarningsAndErrors", "React", "QuoteWarningsAndErrors", "QuoteContainer", "SkeletonContainer", "QuoteSkeleton", "PositionTopAlerts", "Quote", "Divider", "__name", "calculatePendingSwap", "useEffect", "useRef", "useState", "useFetchQuote", "loading", "setLoading", "useState", "abortController", "useRef", "cancel", "__name", "requestBody", "res", "httpService", "error", "throwErrorIfResponseIsNotValid", "response", "errorMessages", "hasLimitError", "swap", "recommendation", "fromAmountRangeError", "getLimitErrorMessage", "recommendedSlippages", "checkSlippageErrors", "minRequiredSlippage", "getMinRequiredSlippage", "__name", "generateWarnings", "previousQuote", "currentQuote", "params", "quoteChanged", "isQuoteChanged", "output", "quoteWarning", "generateQuoteWarnings", "isOutputAmountChangedALot", "numberToString", "getQuoteOutputAmount", "getPriceImpact", "isNumberOfSwapsChanged", "isQuoteSwappersUpdated", "isQuoteInternalCoinsUpdated", "balanceWarnings", "generateBalanceWarnings", "handleQuoteErrors", "error", "useConfirmSwap", "fromToken", "toToken", "inputAmount", "setQuote", "initialQuote", "customDestinationFromStore", "setQuoteWarningsConfirmed", "useQuoteStore", "slippage", "customSlippage", "affiliatePercent", "affiliateRef", "affiliateWallets", "disabledLiquiditySources", "useSettingsStore", "connectedWallets", "useWalletsStore", "blockchains", "useAppStore", "tokens", "experimental", "enableNewLiquiditySources", "userSlippage", "fetchQuote", "cancelFetch", "loading", "useFetchQuote", "useEffect", "__name", "params", "selectedWallets", "customDestination", "requestBody", "createQuoteRequestBody", "currentQuote", "response", "throwErrorIfResponseIsNotValid", "error", "handleQuoteErrors", "swapSettings", "swap", "calculatePendingSwap", "getWalletsForNewSwap", "confirmSwapWarnings", "generateWarnings", "Container", "styled", "Buttons", "IconButton", "ConfirmSwapPage", "quote", "setInputAmount", "selectedWallets", "quoteWalletsConfirmed", "setQuoteWalletConfirmed", "customDestination", "quoteWarningsConfirmed", "useQuoteStore", "navigate", "useNavigate", "dbErrorMessage", "setDbErrorMessage", "useState", "connectedWallets", "useWalletsStore", "showWalletsOnInit", "showWallets", "setShowWallets", "setSelectedSwap", "useUiStore", "disabledLiquiditySources", "useSettingsStore", "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", "quoteChanged", "QuoteWarningType", "selectedWalletDisconnected", "selectedWallet", "connectedWallet", "quoteWalletsChanged", "requiredWallets", "getRequiredWallets", "lastStepToBlockchain", "swap", "requiredWallet", "flushSync", "useLayoutEffect", "React", "Layout", "i18n", "wallets_url", "Tooltip", "getContainer", "HeaderButton", "SettingsIcon", "Button", "WalletIcon", "ConfirmWalletsModal", "Typography", "RefreshIcon", "Alert", "Divider", "getQuoteUpdateWarningMessage", "QuoteInfo", "i18n", "useManager", "Divider", "NotFound", "styled", "React", "useState", "useNavigate", "CloseIcon", "IconButton", "SearchIcon", "TextField", "React", "styled", "IconWrapper", "SearchInput", "props", "variant", "fullWidth", "color", "size", "onChange", "value", "setValue", "inputAttributes", "React", "TextField", "IconWrapper", "SearchIcon", "IconButton", "CloseIcon", "__name", "i18n", "Divider", "SwapListItem", "Typography", "React", "darkTheme", "styled", "Group", "Time", "SwapList", "NotFoundContainer", "SwapsGroup", "props", "list", "onSwapClick", "groupBy", "isLoading", "groups", "swaps", "React", "group", "Group", "Time", "Typography", "i18n", "Divider", "SwapList", "_", "index", "key", "SwapListItem", "swap", "firstStep", "lastStep", "limitDecimalPlaces", "__name", "dayjs", "groupSwapsByDate", "__name", "swaps", "output", "now", "dayjs", "swap", "swapDate", "getPendingSwaps", "__name", "manager", "result", "q", "id", "storage", "a", "b", "Container", "styled", "SwapsGroupContainer", "isStepContainsText", "__name", "steps", "value", "step", "containsText", "HistoryPage", "setSelectedSwap", "useUiStore", "navigate", "useNavigate", "manager", "state", "useManager", "list", "getPendingSwaps", "swap", "searchedFor", "setSearchedFor", "useState", "loading", "searchHandler", "event", "filteredList", "isEmpty", "React", "Layout", "i18n", "SearchInput", "NotFoundContainer", "Divider", "NotFound", "SwapsGroup", "requestId", "groupSwapsByDate", "i18n", "Button", "styled", "SwapInput", "WarningIcon", "React", "useEffect", "useRef", "useState", "useNavigate", "ReverseIcon", "styled", "React", "SwitchButtonContainer", "styled", "StyledButton", "SwitchFromAndToButton", "switchFromAndTo", "useQuoteStore", "React", "ReverseIcon", "__name", "useCallback", "useEffect", "useState", "DEBOUNCE_DELAY", "useSwapInput", "fetchQuote", "cancelFetch", "useFetchQuote", "liquiditySources", "enableNewLiquiditySources", "experimental", "useAppStore", "tokens", "fromToken", "toToken", "inputAmount", "inputUsdValue", "resetQuote", "setQuote", "useQuoteStore", "slippage", "customSlippage", "affiliatePercent", "affiliateRef", "affiliateWallets", "disabledLiquiditySources", "useSettingsStore", "loading", "setLoading", "useState", "error", "setError", "warning", "setWarning", "userSlippage", "shouldSkipRequest", "tokensAreEqual", "isPositiveNumber", "resetState", "__name", "fetch", "params", "excludeLiquiditySources", "requestBody", "createQuoteRequestBody", "res", "throwErrorIfResponseIsNotValid", "quoteWarning", "generateQuoteWarnings", "quoteError", "handleQuoteErrors", "debouncedFetch", "useCallback", "debounce", "DEBOUNCE_DELAY", "useEffect", "Container", "styled", "FromContainer", "InputsContainer", "Home", "navigate", "useNavigate", "fetchQuote", "fetchingQuote", "quoteError", "quoteWarning", "useSwapInput", "fromToken", "fromBlockchain", "toToken", "toBlockchain", "setInputAmount", "inputAmount", "inputUsdValue", "outputAmount", "outputUsdValue", "quote", "resetQuoteWallets", "setQuoteWarningsConfirmed", "useQuoteStore", "fetchMetaStatus", "useAppStore", "connectedWallets", "useWalletsStore", "setCurrentPage", "useUiStore", "showQuoteWarningModal", "setShowQuoteWarningModal", "useState", "layoutRef", "useRef", "needsToWarnEthOnPath", "priceImpactInputCanNotBeComputed", "canComputePriceImpact", "priceImpactOutputCanNotBeComputed", "swapButtonState", "getSwapButtonState", "tokenBalance", "numberToString", "getBalanceFromWallet", "tokenBalanceReal", "useEffect", "navigationRoutes", "percentageChange", "getPriceImpact", "React", "Layout", "Button", "WarningIcon", "i18n", "HomeButtons", "SwapInput", "errorMessages", "SwitchFromAndToButton", "getPriceImpactLevel", "QuoteInfo", "__name", "i18n", "List", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "styled", "SettingsContainer", "LiquiditySourceList", "LiquiditySourceSuffix", "NotFoundContainer", "useLanguage", "language", "useSettingsStore", "setLanguage", "LANGUAGES", "DEFAULT_LANGUAGE", "__name", "LanguagePage", "activeLanguage", "changeLanguage", "languages", "useLanguage", "languageList", "languageItem", "local", "label", "SVGFlag", "React", "Typography", "Radio", "Layout", "i18n", "SettingsContainer", "RadioRoot", "List", "ListItemButton", "__name", "i18n", "Button", "Checkbox", "Image", "ListItemButton", "NotFound", "Typography", "React", "useState", "Checkbox", "Skeleton", "React", "ListItem", "styled", "CustomeListItem", "ITEM_SKELETON_COUNT", "LoadingLiquiditySourceList", "React", "LiquiditySourceList", "e", "CustomeListItem", "Skeleton", "Checkbox", "__name", "LiquiditySourcePage", "sourceType", "fetchStatus", "useAppStore", "swappers", "searchedFor", "setSearchedFor", "useState", "toggleLiquiditySource", "useSettingsStore", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "validTypes", "liquiditySources", "uniqueItem", "hasSelectAll", "sourceItem", "toggleAllSources", "__name", "list", "selected", "groupTitle", "logo", "React", "Image", "Checkbox", "Typography", "i18n", "searchHandler", "event", "value", "filteredList", "containsText", "Layout", "LiquiditySourceSuffix", "Button", "SettingsContainer", "SearchInput", "LoadingLiquiditySourceList", "NotFoundContainer", "NotFound", "LiquiditySourceList", "ListItemButton", "i18n", "Divider", "getCountCategories", "SelectableCategoryList", "React", "useState", "i18n", "Divider", "Image", "ListItemButton", "NotFound", "Typography", "React", "useEffect", "useState", "BlockchainCategories", "TransactionType", "filterByType", "__name", "blockchain", "type", "BlockchainCategories", "TransactionType", "filterBlockchains", "list", "searchedFor", "blockchainType", "containsText", "styled", "Container", "List", "ListItem", "Skeleton", "React", "ITEM_SKELETON_COUNT", "LoadingBlockchainList", "React", "List", "e", "ListItem", "Skeleton", "__name", "BlockchainList", "props", "list", "searchedFor", "onChange", "blockchainCategory", "blockchains", "setBlockchains", "useState", "fetchStatus", "useAppStore", "useEffect", "filterBlockchains", "renderList", "__name", "React", "Divider", "NotFound", "i18n", "List", "item", "ListItemButton", "Image", "Typography", "Container", "LoadingBlockchainList", "SelectBlockchainPage", "props", "type", "navigateBack", "useNavigateBack", "searchedFor", "setSearchedFor", "useState", "blockchainCategory", "setBlockchainCategory", "setToBlockchain", "useQuoteStore", "setFromBlockchain", "fetchStatus", "useAppStore", "blockchains", "showCategory", "getCountCategories", "React", "Layout", "i18n", "Divider", "SelectableCategoryList", "SearchInput", "event", "BlockchainList", "blockchain", "__name", "i18n", "Divider", "React", "useState", "useNavigate", "i18n", "BlockchainsChip", "Divider", "Image", "Skeleton", "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", "useSettingsStore", "useEffect", "output", "prepare", "isInVisibleList", "__name", "styled", "Container", "NUMBER_OF_LOADING", "BlockchainsSection", "props", "blockchains", "type", "blockchain", "onChange", "onMoreClick", "blockchainsList", "usePrepareBlockchainList", "fetchStatus", "useAppStore", "resetToBlockchain", "useQuoteStore", "resetFromBlockchain", "hasMoreItemsInList", "onlyOneItemInList", "showMoreButton", "React", "Divider", "Typography", "i18n", "Container", "e", "Skeleton", "BlockchainsChip", "item", "Image", "__name", "i18n", "darkTheme", "Divider", "ExternalLinkIcon", "Image", "ListItemButton", "NotFound", "PinIcon", "Skeleton", "Typography", "VirtualizedList", "React", "forwardRef", "useEffect", "useState", "colorShade", "__name", "col", "amt", "r", "g", "b", "rr", "gg", "bb", "generateRangeColors", "name", "color", "colors", "i", "generateColors", "mainColors", "reverseNeutralRange", "changeColors", "listOfColors", "colorKey", "range", "Divider", "ListItem", "Skeleton", "React", "darkTheme", "styled", "Typography", "Container", "Title", "List", "Tag", "TagTitle", "BalanceContainer", "End", "Description", "ImageSection", "Pin", "LoadingTokenList", "props", "React", "List", "ListItem", "Skeleton", "End", "Divider", "__name", "PAGE_SIZE", "renderDesc", "__name", "props", "address", "name", "url", "token", "customCssForTag", "customCssForTagTitle", "length", "React", "Title", "Typography", "Divider", "Tag", "TagTitle", "e", "ExternalLinkIcon", "TokenList", "list", "searchedFor", "onChange", "selectedBlockchain", "tokens", "setTokens", "useState", "fetchStatus", "useAppStore", "blockchains", "hasNextPage", "setHasNextPage", "loadingWallet", "useWalletsStore", "isTokenPinned", "innerElementType", "forwardRef", "render", "ref", "loadNextPage", "useEffect", "renderList", "NotFound", "i18n", "VirtualizedList", "index", "style", "blockchain", "color", "generateRangeColors", "darkTheme", "ListItemButton", "ImageSection", "Image", "Pin", "PinIcon", "End", "Skeleton", "BalanceContainer", "Container", "LoadingTokenList", "List", "SelectSwapItemsPage", "props", "type", "navigate", "useNavigate", "navigateBack", "useNavigateBack", "fromBlockchain", "toBlockchain", "setFromToken", "setToToken", "setFromBlockchain", "setToBlockchain", "useQuoteStore", "connectedWallets", "useWalletsStore", "searchedFor", "setSearchedFor", "useState", "selectedBlockchainName", "blockchains", "useAppStore", "tokens", "tokensList", "getTokensBalanceFromWalletAndSort", "updateBlockchain", "__name", "blockchain", "updateToken", "token", "React", "Layout", "i18n", "BlockchainsSection", "navigationRoutes", "Divider", "SearchInput", "event", "TokenList", "tokenBlockchain", "chain", "i18n", "ChevronRightIcon", "Divider", "InfoIcon", "List", "ListItemButton", "Skeleton", "Switch", "Tooltip", "Typography", "React", "useNavigate", "i18n", "Chip", "Divider", "InfoIcon", "TextField", "Tooltip", "Typography", "React", "styled", "BaseContainer", "SlippageChipsContainer", "Head", "SlippageTooltipContainer", "i18n", "Typography", "React", "SlippageTooltipContent", "React", "SlippageTooltipContainer", "Typography", "i18n", "__name", "Slippage", "slippage", "useSettingsStore", "setSlippage", "customSlippage", "setCustomSlippage", "React", "BaseContainer", "Head", "Typography", "i18n", "Divider", "Tooltip", "getContainer", "SlippageTooltipContent", "InfoIcon", "SlippageChipsContainer", "SLIPPAGES", "slippageItem", "index", "key", "Chip", "TextField", "event", "parsedValue", "MIN_SLIPPGAE", "MAX_SLIPPAGE", "__name", "SettingsPage", "navigate", "useNavigate", "theme", "useAppStore", "fetchStatus", "swappers", "infiniteApprove", "useSettingsStore", "toggleInfiniteApprove", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "bridgeSources", "uniqueItem", "totalBridgeSources", "totalSelectedBridgeSources", "exchangeSources", "totalExchangeSources", "totalSelectedExchangeSources", "handleEndItem", "__name", "totalSelected", "total", "React", "Skeleton", "Typography", "i18n", "bridgeItem", "Divider", "ChevronRightIcon", "navigationRoutes", "exchangeItem", "themeItem", "infiniteApprovalItem", "Tooltip", "getContainer", "SlippageTooltipContainer", "InfoIcon", "Switch", "settingItems", "Layout", "SettingsContainer", "Slippage", "List", "ListItemButton", "cancelSwap", "useManager", "React", "i18n", "getCurrentBlockchainOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "PendingSwapNetworkStatus", "Button", "CopyIcon", "Divider", "IconButton", "QuoteCost", "StepDetails", "Typography", "useCopyToClipboard", "useWallets", "React", "useEffect", "useRef", "useState", "useNavigate", "i18n", "MILLISECOND_PER_SECOND", "SECONDS_PER_YEAR", "SECONDS_PER_MONTH", "SECONDS_PER_DAY", "SECONDS_PER_HOUR", "SECONDS_PER_MINUTE", "timeSince", "millisecond", "seconds", "sortedIntervals", "i18n", "a", "b", "interval", "turningPoint", "label", "pluralLabel", "intervalCount", "__name", "getSwapDate", "pendingSwap", "PendingSwapNetworkStatus", "Modal", "React", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "CancelContent", "__name", "onCancel", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "Typography", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "DeleteContent", "__name", "onDelete", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "Typography", "i18n", "PendingSwapNetworkStatus", "modalNetworkValues", "MessageBox", "Wallet", "WalletState", "useWallets", "React", "styled", "WalletContainer", "WalletStateContent", "__name", "props", "type", "title", "currentStepWallet", "message", "showWalletButton", "connect", "getWalletInfo", "walletState", "useWallets", "walletType", "state", "WalletState", "React", "MessageBox", "WalletContainer", "Wallet", "getContainer", "SwapDetailsModal", "props", "state", "onClose", "onDelete", "onCancel", "currentStepWallet", "message", "showWalletStateContent", "PendingSwapNetworkStatus", "React", "Modal", "WalletStateContent", "modalNetworkValues", "DeleteContent", "CancelContent", "__name", "i18n", "Button", "Divider", "MessageBox", "Modal", "TokenAmount", "Typography", "React", "useNavigate", "SwapDetailsCompleteModal", "props", "open", "onClose", "status", "priceValue", "usdValue", "token", "chain", "percentageChange", "description", "diagnosisUrl", "navigate", "useNavigate", "React", "Modal", "MessageBox", "i18n", "TokenAmount", "Divider", "Typography", "Button", "__name", "React", "i18n", "Alert", "IconButton", "LinkIcon", "React", "Fragment", "Alert", "ChevronDownIcon", "ChevronUpIcon", "IconButton", "React", "useState", "FailedAlert", "props", "message", "showContentError", "setShowContentError", "useState", "React", "Alert", "IconButton", "prev", "ChevronUpIcon", "ChevronDownIcon", "__name", "styled", "Alerts", "i18n", "PendingSwapNetworkStatus", "Alert", "Button", "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", "React", "Alerts", "explorerUrl", "index", "urls", "key", "lastUrl", "loading", "error", "Fragment", "Alert", "i18n", "IconButton", "LinkIcon", "WarningAlert", "FailedAlert", "__name", "RESET_INTERVAL", "getSteps", "__name", "swap", "blockchains", "args", "hasAlreadyProceededToSign", "step", "index", "amountToConvert", "getBlockchainShortNameFor", "numberToString", "React", "SwapDetailsAlerts", "getStepState", "isNetworkStatusInWarningState", "darkTheme", "styled", "Container", "HeaderDetails", "StepsList", "Alerts", "PlaceholderContainer", "LoaderContainer", "SwapDetails", "props", "swap", "requestId", "onDelete", "onCancelProps", "canSwitchNetworkTo", "connect", "getWalletInfo", "useWallets", "blockchains", "useAppStore", "tokens", "retry", "useQuoteStore", "navigate", "useNavigate", "_", "handleCopy", "useCopyToClipboard", "RESET_INTERVAL", "listRef", "useRef", "modalState", "setModalState", "useState", "showCompletedModal", "setShowCompletedModal", "onCancel", "__name", "getUnreadNotifications", "useNotificationStore", "setAsRead", "unreadNotifications", "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", "getUsdPrice", "inputUsdValue", "percentageChange", "getPriceImpact", "completeModalDesc", "i18n", "getConciseAddress", "React", "Layout", "SuffixContainer", "Button", "Typography", "Container", "HeaderDetails", "IconButton", "CopyIcon", "QuoteCost", "secondsToString", "totalArrivalTime", "QuoteSummary", "getPriceImpactLevel", "Divider", "StepsList", "index", "key", "state", "getStepState", "isFocused", "StepDetails", "SwapDetailsModal", "SwapDetailsCompleteModal", "i18n", "CopyIcon", "IconButton", "NotFound", "Skeleton", "Typography", "React", "i18n", "ChainToken", "Divider", "Skeleton", "Typography", "React", "styled", "Container", "StepContainer", "StepSeparator", "ChainToken", "Divider", "NextIcon", "Skeleton", "React", "LoadingSwapDetailStep", "props", "extraInfo", "React", "StepContainer", "Skeleton", "Divider", "ChainToken", "NextIcon", "__name", "LoadingSwapDetails", "quoteSummary", "React", "ChainToken", "Divider", "Skeleton", "Container", "Typography", "i18n", "LoadingSwapDetailStep", "StepSeparator", "__name", "SwapDetailsPlaceholder", "props", "requestId", "showSkeleton", "React", "Layout", "i18n", "SuffixContainer", "Container", "HeaderDetails", "Typography", "Skeleton", "IconButton", "CopyIcon", "LoadingSwapDetails", "PlaceholderContainer", "NotFound", "__name", "SwapDetailsPage", "manager", "state", "useManager", "loading", "pendingSwaps", "getPendingSwaps", "requestId", "useUiStore", "navigateBack", "useNavigateBack", "fetchMetaStatus", "useAppStore", "showSkeleton", "selectedSwap", "swap", "onCancel", "__name", "cancelSwap", "onDelete", "e", "React", "SwapDetailsPlaceholder", "SwapDetails", "i18n", "AutoThemeIcon", "DarkModeIcon", "LightModeIcon", "List", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "ThemePage", "theme", "useSettingsStore", "setTheme", "themesList", "React", "Typography", "i18n", "LightModeIcon", "Radio", "DarkModeIcon", "AutoThemeIcon", "Layout", "SettingsContainer", "RadioRoot", "value", "List", "ListItemButton", "__name", "AppRoutes", "useRoutes", "navigationRoutes", "React", "Home", "SelectSwapItemsPage", "SelectBlockchainPage", "SettingsPage", "ThemePage", "LanguagePage", "LiquiditySourcePage", "HistoryPage", "SwapDetailsPage", "WalletsPage", "ConfirmSwapPage", "__name", "isApprovalTX", "MainEvents", "RouteEventType", "StepEventType", "StepExecutionEventStatus", "useEvents", "useEffect", "StepExecutionBlockedEventStatus", "validBlockedStatuses", "WidgetEvents", "tokens", "useAppStore", "connectedWallets", "useWalletsStore", "getWalletsDetails", "setNotification", "useNotificationStore", "setAsRead", "widgetEvents", "useEvents", "useEffect", "MainEvents", "widgetEvent", "event", "step", "route", "StepEventType", "StepExecutionEventStatus", "isApprovalTX", "fromAccount", "account", "toAccount", "wallet", "validBlockedStatuses", "RouteEventType", "__name", "globalCss", "globalFont", "__name", "globalCss", "createTheme", "defaultDarkTheme", "defaultLightTheme", "useEffect", "useState", "baseThemeTokens", "defaultDarkColors", "toAlphabeticChar", "__name", "code", "toAlphabeticName", "name", "x", "toPhash", "h", "i", "toHash", "value", "customizedThemeTokens", "colors", "baseColors", "baseThemeTokens", "darkColorsWithDefaults", "generateColors", "defaultDarkColors", "lightColorsWithDefaults", "hasDefaultDarkColors", "hasDefaultLightColors", "light", "dark", "tokens", "THEME_CLASS_NAME_PREFIX", "toHash", "__name", "useTheme", "props", "colors", "fontFamily", "DEFAULT_FONT_FAMILY", "borderRadius", "DEFAULT_PRIMARY_RADIUS", "secondaryBorderRadius", "DEFAULT_SECONDARY_RADIUS", "mode", "OSTheme", "setOSTheme", "useState", "theme", "useSettingsStore", "setTheme", "dark", "light", "customizedThemeTokens", "baseTheme", "createTheme", "lightThemeClasses", "defaultLightTheme", "darkThemeClasses", "defaultDarkTheme", "customizedLightTheme", "customizedDarkTheme", "useEffect", "switchThemeListener", "__name", "event", "lightClassNames", "darkClassNames", "styled", "MainContainer", "Main", "globalFont", "fetchMeta", "config", "useAppStore", "activeTheme", "useTheme", "activeLanguage", "changeLanguage", "useLanguage", "lastConnectedWalletWithNetwork", "setLastConnectedWalletWithNetwork", "useState", "disconnectedWallet", "setDisconnectedWallet", "widgetContext", "useContext", "WidgetContext", "useEffect", "useSettingsStore", "useNotificationStore", "React", "I18nManager", "MainContainer", "WidgetEvents", "AppRouter", "AppRoutes", "__name", "React", "useMemo", "checkWaitingForNetworkChange", "makeQueueDefinition", "ManagerProvider", "useWallets", "convertEvmBlockchainMetaToEvmChainInfo", "isEvmBlockchain", "React", "useMemo", "QueueManager", "props", "providers", "getSigners", "state", "connect", "canSwitchNetworkTo", "getWalletInfo", "useWallets", "swapQueueDef", "useMemo", "makeQueueDefinition", "getConfig", "blockchains", "useAppStore", "wallets", "useWalletsStore", "wallet", "switchNetwork", "__name", "network", "isMobileWallet", "walletType", "allBlockchains", "blockchain", "blockchainsObj", "evmBasedChains", "isEvmBlockchain", "getSupportedChainNames", "type", "supportedChains", "walletAndSupportedChainsNames", "allProviders", "context", "convertEvmBlockchainMetaToEvmChainInfo", "React", "ManagerProvider", "manager", "checkWaitingForNetworkChange", "QueueManager_default", "useManager", "React", "createContext", "useContext", "WidgetInfoContext", "createContext", "WidgetInfo", "props", "manager", "useManager", "swaps", "getPendingSwaps", "details", "useWalletsStore", "isLoading", "totalBalance", "calculateWalletUsdValue", "refetch", "value", "React", "__name", "useWidget", "context", "useContext", "WidgetProvider", "props", "onUpdateState", "config", "useMemo", "initConfig", "RANGO_PUBLIC_API_KEY", "DEFAULT_BASE_URL", "React", "WidgetWallets", "QueueManager_default", "WidgetInfo", "__name", "Widget", "props", "React", "Main", "WidgetProvider", "DEFAULT_CONFIG", "__name"]
3
+ "sources": ["../src/index.ts", "../src/containers/Wallets/Wallets.tsx", "../src/hooks/useSyncStoresWithConfig.ts", "../src/store/AppStore.tsx", "../src/store/app.ts", "../src/store/slices/config.ts", "../src/services/httpService.ts", "../src/constants/index.ts", "../src/utils/configs.ts", "../src/utils/common.ts", "../src/store/settings.ts", "../src/constants/languages.ts", "../src/constants/swapSettings.ts", "../src/store/selectors.ts", "../src/utils/settings.ts", "../src/utils/wallets.ts", "../src/constants/numbers.ts", "../src/constants/wallets.ts", "../src/utils/numbers.ts", "../src/store/slices/data.ts", "../src/store/quote.ts", "../src/utils/quote.ts", "../src/types/quote.ts", "../src/utils/meta.ts", "../src/utils/swap.ts", "../src/components/ConfirmWalletsModal/ConfirmWallets.helpers.ts", "../src/constants/errors.ts", "../src/constants/messages.ts", "../src/hooks/useWalletProviders.ts", "../src/store/wallets.ts", "../src/utils/providers.ts", "../src/containers/Widget/Widget.tsx", "../src/containers/App/App.tsx", "../src/components/AppRouter.tsx", "../src/hooks/useForceAutoConnect.ts", "../src/components/UpdateUrl.tsx", "../src/constants/navigationRoutes.ts", "../src/store/ui.ts", "../src/components/AppRoutes.tsx", "../src/pages/ConfirmSwapPage.tsx", "../src/components/ConfirmWalletsModal/ConfirmWalletsModal.tsx", "../src/constants/warnings.ts", "../src/components/ConfirmWalletsModal/ConfirmWallets.styles.ts", "../src/components/ConfirmWalletsModal/WalletList.tsx", "../src/hooks/useWalletList.ts", "../src/pages/WalletsPage.tsx", "../src/components/Layout/Layout.tsx", "../src/hooks/useNavigateBack.ts", "../src/components/HeaderButtons/BackButton.tsx", "../src/components/HeaderButtons/HeaderButtons.styles.ts", "../src/components/HeaderButtons/CancelButton.tsx", "../src/components/HeaderButtons/WalletButton.tsx", "../src/components/HeaderButtons/HomeButtons.tsx", "../src/components/NotificationContent/NotificationContent.tsx", "../src/store/notification.ts", "../src/components/NotificationContent/NotificationContent.styles.ts", "../src/components/NotificationContent/NotificationNotFound.tsx", "../src/components/HeaderButtons/UnreadNotificationsBadge.tsx", "../src/components/Layout/Layout.styles.ts", "../src/components/WalletModal/WalletModal.tsx", "../src/components/WalletModal/WalletModalContent.tsx", "../src/components/WalletModal/WalletModalContent.styles.ts", "../src/components/ConfirmWalletsModal/WalletList.styles.ts", "../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/QuoteSummary.tsx", "../src/components/Quote/QuoteSummary.styles.ts", "../src/components/Quote/QuoteSkeleton.tsx", "../src/components/Quote/QuoteSkeleton.styles.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/hooks/useConfirmSwap/useConfirmSwap.ts", "../src/hooks/useFetchQuote.ts", "../src/hooks/useConfirmSwap/useConfirmSwap.helpers.ts", "../src/pages/HistoryPage.tsx", "../src/components/SearchInput/SearchInput.tsx", "../src/components/SearchInput/SearchInput.styles.ts", "../src/components/SwapsGroup/SwapsGroup.tsx", "../src/components/SwapsGroup/SwapsGroup.styles.ts", "../src/utils/date.ts", "../src/utils/queue.ts", "../src/pages/Home.tsx", "../src/components/SwitchFromAndTo.tsx", "../src/hooks/useSwapInput.ts", "../src/pages/LanguagePage.tsx", "../src/components/SettingsContainer/SettingsContainer.style.ts", "../src/hooks/useLanguage.ts", "../src/pages/LiquiditySourcePage.tsx", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.tsx", "../src/components/LoadingLiquiditySourceList/LoadingLiquiditySourceList.styles.ts", "../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/components/TokenList/TokenList.tsx", "../src/utils/colors.ts", "../src/components/TokenList/LoadingTokenList.tsx", "../src/components/TokenList/TokenList.styles.ts", "../src/pages/SettingsPage.tsx", "../src/components/Slippage/Slippage.tsx", "../src/components/Slippage/Slippage.styles.ts", "../src/components/Slippage/SlippageTooltipContent.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/SwapDetailsAlerts/SwapDetailsAlerts.styles.ts", "../src/components/SwapDetailsAlerts/SwapDetailsAlerts.Warning.tsx", "../src/components/SwapDetails/SwapDetails.styles.ts", "../src/components/SwapDetails/SwapDetails.Placeholder.tsx", "../src/components/LoadingSwapDetails/LoadingSwapDetails.tsx", "../src/components/LoadingSwapDetails/LoadingSwapDetails.styles.ts", "../src/components/LoadingSwapDetails/LoadingSwapDetailStep.tsx", "../src/pages/ThemePage.tsx", "../src/components/WidgetEvents.tsx", "../src/types/notification.ts", "../src/globalStyles.ts", "../src/hooks/useTheme.ts", "../src/utils/ui.ts", "../src/utils/hash.ts", "../src/containers/App/App.styles.ts", "../src/containers/WidgetProvider/WidgetProvider.tsx", "../src/QueueManager.tsx", "../src/containers/WidgetInfo/WidgetInfo.tsx"],
4
+ "sourcesContent": ["import type { WidgetProps } from './containers/Widget';\nimport type { ConnectedWallet } from './store/wallets';\nimport type {\n BlockchainAndTokenConfig,\n WidgetColors,\n WidgetColorsKeys,\n WidgetConfig,\n WidgetTheme,\n} from './types';\nimport type {\n Route,\n RouteEvent,\n RouteFailedEvent,\n RouteStartedEvent,\n RouteSucceededEvent,\n Step,\n StepApprovalTxSucceededEvent,\n StepCheckStatusEvent,\n StepEvent,\n StepFailedEvent,\n StepOutputRevealedEvent,\n StepStartedEvent,\n StepSucceededEvent,\n StepTxExecutionBlockedEvent,\n StepTxExecutionUpdatedEvent,\n} from '@rango-dev/queue-manager-rango-preset';\nimport type {\n EventHandler as HandleWalletsUpdate,\n ProviderInterface,\n} from '@rango-dev/wallets-react';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport {\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionBlockedEventStatus,\n StepExecutionEventStatus,\n useEvents as useWidgetEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useWallets } from '@rango-dev/wallets-react';\n\nimport { WidgetWallets } from './containers/Wallets';\nimport { Widget } from './containers/Widget';\nimport { useWidget } from './containers/WidgetInfo';\nimport { WidgetProvider } from './containers/WidgetProvider';\nimport { customizedThemeTokens } from './utils/ui';\n\nexport type {\n WidgetConfig,\n WalletType,\n WidgetTheme,\n WidgetColors,\n WidgetColorsKeys,\n ProviderInterface,\n BlockchainAndTokenConfig,\n WidgetProps,\n RouteEvent,\n StepEvent,\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};\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 useWidgetEvents,\n customizedThemeTokens,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n StepExecutionBlockedEventStatus,\n};\n", "import type {\n OnConnectHandler,\n PropTypes,\n WidgetContextInterface,\n} from './Wallets.types';\nimport type { ProvidersOptions } from '../../utils/providers';\nimport type { EventHandler } from '@rango-dev/wallets-react';\nimport type { Network } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport { Events, Provider } from '@rango-dev/wallets-react';\nimport { isEvmBlockchain } from 'rango-sdk';\nimport React, { createContext, useEffect, useRef } from 'react';\n\nimport { useSyncStoresWithConfig } from '../../hooks/useSyncStoresWithConfig';\nimport { useWalletProviders } from '../../hooks/useWalletProviders';\nimport { AppStoreProvider, useAppStore } from '../../store/AppStore';\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});\n\nfunction Main(props: PropsWithChildren<PropTypes>) {\n const updateConfig = useAppStore().updateConfig;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const walletOptions: ProvidersOptions = {\n walletConnectProjectId: props.config?.walletConnectProjectId,\n };\n const { providers } = useWalletProviders(props.config.wallets, walletOptions);\n const disconnectWallet = useWalletsStore.use.disconnectWallet();\n const connectWallet = useWalletsStore.use.connectWallet();\n const onConnectWalletHandler = useRef<OnConnectHandler>();\n useSyncStoresWithConfig();\n\n useEffect(() => {\n if (props.config) {\n updateConfig(props.config);\n }\n }, [props.config]);\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 connectWallet(data, tokens);\n } else {\n disconnectWallet(type);\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 return (\n <WidgetContext.Provider\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n value={{\n onConnectWallet: (handler) => {\n onConnectWalletHandler.current = handler;\n },\n }}>\n <Provider\n allBlockChains={blockchains}\n providers={providers}\n onUpdateState={onUpdateState}\n autoConnect>\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 { Asset } from 'rango-sdk';\n\nimport { useEffect, useLayoutEffect, useMemo, useRef } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useSettingsStore } from '../store/settings';\nimport { tokensAreEqual } from '../utils/wallets';\n\nexport function useSyncStoresWithConfig() {\n const {\n setInputAmount,\n setToToken,\n setToBlockchain,\n setFromBlockchain,\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\n const { setAffiliateRef, setAffiliatePercent, setAffiliateWallets } =\n useSettingsStore();\n\n const fromTokensConfig = useMemo(\n () => config?.from?.tokens,\n [config?.from?.tokens]\n );\n const fromBlockchainsConfig = useMemo(\n () => config?.from?.blockchains,\n [config?.from?.blockchains]\n );\n const toTokensConfig = useMemo(\n () => config?.to?.tokens,\n [config?.to?.tokens]\n );\n const toBlockchainsConfig = useMemo(\n () => config?.to?.blockchains,\n [config?.to?.blockchains]\n );\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 setInputAmount(config?.amount?.toString() || '');\n }, [config?.amount]);\n\n /*\n * We update quote tokens in two scenarios.\n * If default values exist in widget config or search parameters exist in URL.\n * The logic for updating quote store exists in two useEffect in two locations, and they run in order.If default tokens for quote exist in widget config and also exist in URL, widget config values take precedence over URL values, and URL search parameters don\u2019t affect the widget.\n * Using useLayoutEffect causes widget config values to apply first.\n * We may consider replacing this with a better solution in the future.\n */\n useLayoutEffect(() => {\n if (fetchMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.from?.blockchain\n );\n const token = tokens.find((t) =>\n tokensAreEqual(t, config?.from?.token || null)\n );\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 (fromToken && fromTokensConfig) {\n if (!fromTokensConfig.some((token) => tokensAreEqual(token, fromToken))) {\n setFromToken({ token: null });\n }\n }\n\n if (fromBlockchain && fromBlockchainsConfig) {\n if (!fromBlockchainsConfig.includes(fromBlockchain.name)) {\n setFromBlockchain(null);\n }\n }\n }, [fromTokensConfig, fromBlockchainsConfig]);\n\n useEffect(() => {\n if (toToken && toTokensConfig) {\n if (!toTokensConfig.some((token) => tokensAreEqual(token, toToken))) {\n setToToken({ token: null });\n }\n }\n\n if (toBlockchain && toBlockchainsConfig) {\n if (!toBlockchainsConfig.includes(toBlockchain.name)) {\n setToBlockchain(null);\n }\n }\n }, [toTokensConfig, toBlockchainsConfig]);\n\n /*\n * We update quote tokens in two scenarios.\n * If default values exist in widget config or search parameters exist in URL.\n * The logic for updating quote store exists in two useEffect in two locations, and they run in order.If default tokens for quote exist in widget config and also exist in URL, widget config values take precedence over URL values, and URL search parameters don\u2019t affect the widget.\n * Using useLayoutEffect causes widget config values to apply first.\n * We may consider replacing this with a better solution in the future.\n */\n useLayoutEffect(() => {\n if (fetchMetaStatus === 'success') {\n const chain = blockchains.find(\n (chain) => chain.name === config?.to?.blockchain\n );\n const token = tokens.find((t) =>\n tokensAreEqual(t, config?.to?.token || null)\n );\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 { WidgetConfig } from '../types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { createContext, useContext, 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 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 { WidgetConfig } from '../types';\nimport type { StateCreator } from 'zustand';\n\nimport { create } from 'zustand';\n\nimport { createConfigSlice } from './slices/config';\nimport { createDataSlice } from './slices/data';\n\nexport type StateCreatorWithInitialData<\n T extends Partial<WidgetConfig>,\n R extends Record<string, unknown>,\n V extends Record<string, unknown>\n> = (\n initialData: T | undefined,\n ...rest: Parameters<StateCreator<R, [], [], V>>\n) => ReturnType<StateCreator<R, [], [], V>>;\n\nexport type AppStoreState = DataSlice & ConfigSlice;\n\nexport function createAppStore(initialData?: WidgetConfig) {\n return create<AppStoreState>()((...a) => ({\n ...createDataSlice(...a),\n ...createConfigSlice(initialData, ...a),\n }));\n}\n", "import type { WidgetConfig } from '../../types';\nimport type { StateCreatorWithInitialData } from '../app';\n\nexport const DEFAULT_CONFIG: WidgetConfig = {\n apiKey: '',\n multiWallets: true,\n enableNewLiquiditySources: true,\n};\n\nexport type ConfigSlice = {\n config: WidgetConfig;\n\n updateConfig: (config: WidgetConfig) => void;\n};\n\nexport const createConfigSlice: StateCreatorWithInitialData<\n WidgetConfig,\n ConfigSlice,\n ConfigSlice\n> = (initialData, set, get) => {\n return {\n config: { ...DEFAULT_CONFIG, ...initialData },\n\n // Actions\n updateConfig: (nextConfig: WidgetConfig) => {\n const currentConfig = get().config;\n\n set({\n config: {\n ...currentConfig,\n ...nextConfig,\n },\n });\n },\n };\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", "export const RANGO_PUBLIC_API_KEY = 'c6381a79-2817-4602-83bf-6a641a409e32';\nexport const DEFAULT_BASE_URL = 'https://api.rango.exchange';\n", "import { RANGO_PUBLIC_API_KEY } from '../constants';\n\nexport interface Configs {\n API_KEY: string;\n BASE_URL?: string;\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;\nexport const DEFAULT_FONT_FAMILY = 'Roboto';\n\nexport const THEME_CLASS_NAME_PREFIX = `theme-widget`;\n", "export 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 const getContainer = () =>\n document.getElementById('swap-box') as HTMLElement;\n", "import type { SwapperMeta } from 'rango-sdk';\n\nimport { type Language } from '@rango-dev/ui';\nimport { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\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';\n\nimport createSelectors from './selectors';\n\nexport type ThemeMode = 'auto' | 'dark' | 'light';\n\nexport interface SettingsState {\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 disabledLiquiditySources: string[];\n theme: ThemeMode;\n language: Language;\n affiliateRef: string | null;\n affiliatePercent: number | null;\n affiliateWallets: { [key: string]: string } | null;\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) => 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}\n\nexport const useSettingsStore = createSelectors(\n create<SettingsState>()(\n persist(\n subscribeWithSelector((set, get) => ({\n preferredBlockchains: [],\n slippage: DEFAULT_SLIPPAGE,\n customSlippage: null,\n infiniteApprove: false,\n affiliateRef: null,\n affiliatePercent: null,\n affiliateWallets: null,\n disabledLiquiditySources: [],\n theme: 'auto',\n language: DEFAULT_LANGUAGE,\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 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 (\n swappersGroup.length === state.disabledLiquiditySources.length\n ) {\n return { disabledLiquiditySources: [] };\n }\n\n return {\n disabledLiquiditySources: swappersGroup,\n };\n }),\n toggleInfiniteApprove: () =>\n set((state) => ({\n infiniteApprove: !state.infiniteApprove,\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:\n state.disabledLiquiditySources.concat(name),\n };\n }),\n setTheme: (theme) =>\n set(() => ({\n theme,\n })),\n setLanguage: (language) =>\n set(() => ({\n language,\n })),\n })),\n {\n name: 'user-settings',\n skipHydration: true,\n }\n )\n )\n);\n", "import type { FlagPropTypes, Language } from '@rango-dev/ui';\n\nimport { English, French, Japanese, Spanish } 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];\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 { 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>>>(_store: S) => {\n let store = _store as WithSelectors<typeof _store>;\n store.use = {};\n for (let 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 { SwapperMeta } from 'rango-sdk';\n\nimport { useSettingsStore } from '../store/settings';\n\nimport { removeDuplicateFrom } from './common';\n\nexport type LiquiditySourceType = 'BRIDGE' | 'AGGREGATOR' | 'DEX';\n\nexport type UniqueSwappersGroupType = {\n id: string;\n groupTitle: string;\n logo: string;\n type: LiquiditySourceType;\n selected: boolean;\n};\n\nexport function getUniqueSwappersGroups(\n swappers: SwapperMeta[]\n): UniqueSwappersGroupType[] {\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\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", "import type { TokenWithBalance } from '../components/TokenList';\nimport type { ConnectedWallet, TokenBalance } from '../store/wallets';\nimport type { Wallet } 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 BestRouteResponse,\n BlockchainMeta,\n Token,\n WalletDetail,\n} from 'rango-sdk';\n\nimport { WalletState as WalletStatus } from '@rango-dev/ui';\nimport { readAccountAddress } from '@rango-dev/wallets-react';\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 { EXCLUDED_WALLETS } from '../constants/wallets';\n\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): ModalWalletInfo[] {\n return list\n .filter((wallet) => !EXCLUDED_WALLETS.includes(wallet as WalletTypes))\n .filter((wallet) => {\n const { supportedChains, isContractWallet } = getWalletInfo(wallet);\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 { name, img: image, installLink } = getWalletInfo(type);\n const state = mapStatusToWalletState(getState(type));\n return {\n title: name,\n image,\n link: detectInstallLink(installLink),\n state,\n type,\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 getRequiredChains(quote: BestRouteResponse | null) {\n const wallets: string[] = [];\n\n quote?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n if (!wallets.includes(currentStepFromBlockchain)) {\n wallets.push(currentStepFromBlockchain);\n }\n if (!wallets.includes(currentStepToBlockchain)) {\n wallets.push(currentStepToBlockchain);\n }\n\n // Check if internalSwaps array exists\n if (swap.internalSwaps && Array.isArray(swap.internalSwaps)) {\n swap.internalSwaps.forEach((internalSwap) => {\n const internalStepFromBlockchain = internalSwap.from.blockchain;\n const internalStepToBlockchain = internalSwap.to.blockchain;\n if (!wallets.includes(internalStepFromBlockchain)) {\n wallets.push(internalStepFromBlockchain);\n }\n if (!wallets.includes(internalStepToBlockchain)) {\n wallets.push(internalStepToBlockchain);\n }\n });\n }\n });\n return wallets;\n}\n\ntype Blockchain = { name: string; accounts: ConnectedWallet[] };\n\nexport function getBalanceFromWallet(\n connectedWallets: ConnectedWallet[],\n chain: string,\n symbol: string,\n address: string | null\n): TokenBalance | null {\n if (connectedWallets.length === 0) {\n return null;\n }\n\n const selectedChainWallets = connectedWallets.filter(\n (wallet) => wallet.chain === chain\n );\n if (selectedChainWallets.length === 0) {\n return null;\n }\n\n return (\n selectedChainWallets\n .map(\n (wallet) =>\n wallet.balances?.find(\n (balance) =>\n (address !== null && balance.address === address) ||\n (address === null &&\n balance.address === address &&\n balance.symbol === symbol)\n ) || null\n )\n .filter((balance) => balance !== null)\n .sort(\n (a, b) => parseFloat(b?.amount || '0') - parseFloat(a?.amount || '1')\n )\n .find(() => true) || null\n );\n}\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 tokens: Token[]\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:\n getUsdPrice(\n chain,\n tokenBalance.asset.symbol,\n tokenBalance.asset.address,\n tokens\n ) || 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 sortTokens = (tokens: TokenWithBalance[]): TokenWithBalance[] => {\n const walletConnected = !!tokens.some((token) => token.balance);\n if (!walletConnected) {\n return tokens\n .filter((token) => !token.address)\n .concat(\n tokens.filter((token) => token.address && !token.isSecondaryCoin),\n tokens.filter((token) => token.isSecondaryCoin)\n );\n }\n\n return tokens\n .filter((token) => !!token.balance)\n .sort(\n (tokenA, tokenB) =>\n parseFloat(tokenB.balance?.usdValue || '0') -\n parseFloat(tokenA.balance?.usdValue || '0')\n )\n .concat(\n tokens.filter((token) => !token.balance && !token.isSecondaryCoin),\n tokens.filter((token) => !token.balance && token.isSecondaryCoin)\n );\n};\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\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 getTokensWithBalance(\n tokens: TokenWithBalance[],\n connectedWallets: ConnectedWallet[]\n): TokenWithBalance[] {\n return tokens.map(({ balance, ...otherProps }) => {\n const tokenAmount = numberToString(\n new BigNumber(\n getBalanceFromWallet(\n connectedWallets,\n otherProps.blockchain,\n otherProps.symbol,\n otherProps.address\n )?.amount || ZERO\n )\n );\n\n let tokenUsdValue = '';\n if (otherProps.usdPrice) {\n tokenUsdValue = numberToString(\n new BigNumber(\n getBalanceFromWallet(\n connectedWallets,\n otherProps.blockchain,\n otherProps.symbol,\n otherProps.address\n )?.amount || ZERO\n ).multipliedBy(otherProps.usdPrice)\n );\n }\n\n return {\n ...otherProps,\n ...(tokenAmount !== '0' && {\n balance: { amount: tokenAmount, usdValue: tokenUsdValue },\n }),\n };\n });\n}\n\nexport function getTokensBalanceFromWalletAndSort(\n tokens: TokenWithBalance[],\n connectedWallets: ConnectedWallet[]\n) {\n const list =\n connectedWallets.length > 0\n ? getTokensWithBalance(tokens, connectedWallets)\n : tokens;\n list.sort((tokenA, tokenB) => {\n if (tokenA.balance?.usdValue && tokenB.balance?.usdValue) {\n return (\n parseFloat(tokenB.balance.usdValue) -\n parseFloat(tokenA.balance.usdValue)\n );\n }\n\n if (!tokenA.balance?.usdValue && tokenB.balance?.usdValue) {\n return 1;\n }\n\n if (tokenA.balance?.usdValue && !tokenB.balance?.usdValue) {\n return -1;\n }\n\n if (!tokenA.balance?.usdValue && !tokenB.balance?.usdValue) {\n return (\n parseFloat(tokenB.balance?.amount || '0') -\n parseFloat(tokenA.balance?.amount || '0')\n );\n }\n\n return 0;\n });\n\n return list;\n}\n\nexport function getSortedTokens(\n chain: BlockchainMeta | null,\n tokens: Token[],\n connectedWallets: ConnectedWallet[],\n otherChainTokens: TokenWithBalance[]\n): TokenWithBalance[] {\n const fromChainEqualsToToBlockchain =\n chain?.name === otherChainTokens[0]?.name;\n if (fromChainEqualsToToBlockchain) {\n return otherChainTokens;\n }\n\n const filteredTokens = tokens.filter(\n (token) => token.blockchain === chain?.name\n );\n return sortTokens(getTokensWithBalance(filteredTokens, connectedWallets));\n}\n\nexport function tokensAreEqual(\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 === tokenB?.symbol &&\n tokenA?.address === tokenB?.address\n );\n}\n\nexport function sortWalletsBasedOnConnectionState(\n wallets: ModalWalletInfo[]\n): ModalWalletInfo[] {\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", "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", "/* eslint-disable @typescript-eslint/no-magic-numbers */\n\nimport type { BestRouteResponse } from 'rango-sdk';\n\nimport { BigNumber } from 'bignumber.js';\n\nexport const percentToString = (p: number, fractions = 0): string =>\n (p * 100).toFixed(fractions);\n\nexport const secondsToString = (s: number): string => {\n const seconds = (s % 60).toString().padStart(2, '0');\n const minutes = parseInt((s / 60).toString())\n .toString()\n .padStart(2, '0');\n return `${minutes}:${seconds}`;\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 convertBigNumberToHex = (\n value: BigNumber,\n decimals: number\n): string => {\n return '0x' + value.shiftedBy(decimals).toString(16);\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 function dollarToConciseString(num: number | undefined): string {\n if (!num) {\n return '-';\n }\n if (num < 1) {\n return ' < 1$';\n }\n if (num < 1000) {\n return numberToString(new BigNumber(num)) + '$';\n }\n if (num < 10_000) {\n return parseInt((num / 100).toString()) / 10 + 'K';\n }\n if (num < 1_000_000) {\n return parseInt((num / 1000).toString()) + 'K';\n }\n if (num < 100_000_000) {\n return parseInt((num / 100000).toString()) / 10 + 'M';\n }\n return parseInt((num / 1000000).toString()) + 'M';\n}\n\nexport function removeExtraDecimals(num: string, maxDecimals: number): string {\n try {\n if (!num.includes('.')) {\n return num;\n }\n const [b, f] = num.split('.');\n if (f && f.length > maxDecimals) {\n return `${b}.${f.substring(0, maxDecimals)}`;\n }\n return num;\n } catch (e) {\n return num;\n }\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;\n10;\n\nexport function limitDecimalPlaces(\n numberString: string,\n maxDecimalPlaces = 4\n): string {\n const number = parseFloat(numberString);\n if (isNaN(number)) {\n return numberString;\n } // Return the original string if it's not a valid number\n\n const multiplier = Math.pow(10, maxDecimalPlaces);\n const roundedNumber = Math.round(number * multiplier) / multiplier;\n return roundedNumber.toString();\n}\n", "// We keep all the received data from server in this slice\n\nimport type { ConfigSlice } from './config';\nimport type { BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\nimport type { StateCreator } from 'zustand';\n\nimport { httpService as sdk } from '../../services/httpService';\nimport { containsText } from '../../utils/common';\nimport { sortLiquiditySourcesByGroupTitle } from '../../utils/settings';\nimport { tokensAreEqual } from '../../utils/wallets';\n\ntype BlockchainOptions = {\n type?: 'source' | 'destination';\n};\n\ntype TokenOptions = {\n type?: 'source' | 'destination';\n // filter by an specific blockchain\n blockchain?: string;\n searchFor?: string;\n};\nexport type FetchStatus = 'loading' | 'success' | 'failed';\nexport interface DataSlice {\n _blockchains: BlockchainMeta[];\n _tokens: Token[];\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) => boolean;\n\n fetch: () => Promise<void>;\n}\n\nexport const createDataSlice: StateCreator<\n DataSlice & ConfigSlice,\n [],\n [],\n DataSlice\n> = (set, get) => ({\n // State\n _blockchains: [],\n _tokens: [],\n _popularTokens: [],\n _swappers: [],\n fetchStatus: 'loading',\n // Selectors\n blockchains: (options) => {\n const blockchainsFromState = get()._blockchains;\n\n if (!options || !options?.type) {\n return blockchainsFromState;\n }\n\n const config = get().config;\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 tokensFromState = get()._tokens;\n\n if (!options || !options?.type) {\n return tokensFromState;\n }\n\n const config = get().config;\n const supportedTokensFromConfig =\n (options.type === 'source' ? config.from?.tokens : config.to?.tokens) ??\n [];\n const blockchains = get().blockchains({\n type: options.type,\n });\n\n const list = tokensFromState\n .filter((token) => {\n // If there is a list of tokens in config, we only keep them.\n if (\n supportedTokensFromConfig.length > 0 &&\n !supportedTokensFromConfig.some((asset) => {\n return tokensAreEqual(asset, token);\n })\n ) {\n return false;\n }\n\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((a, b) => {\n // Check pinned tokens\n if (get().isTokenPinned(a)) {\n return -1;\n }\n if (get().isTokenPinned(b)) {\n return 1;\n }\n\n // Check secondary coins\n if (a.isSecondaryCoin) {\n return 1;\n }\n if (b.isSecondaryCoin) {\n return -1;\n }\n\n // Check it has an address or not.\n if (!a.address && b.address) {\n return -1;\n }\n if (a.address && !b.address) {\n return 1;\n }\n\n return 0;\n });\n\n return list;\n },\n isTokenPinned: (token) => {\n const pinned = !!get().config.pinnedTokens?.some((pinnedToken) =>\n tokensAreEqual(pinnedToken, token)\n );\n return pinned;\n },\n swappers: () => {\n const {\n config: { enableNewLiquiditySources, liquiditySources },\n } = get();\n\n /*\n * If the enableNewLiquiditySources 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 enableNewLiquiditySources ||\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 response = await sdk().getAllMetadata();\n\n set({ fetchStatus: 'success' });\n const blockchains: BlockchainMeta[] = [];\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 response.blockchains.forEach((blockchain) => {\n if (\n blockchain.enabled &&\n blockchainsWithAtLeastOneToken.has(blockchain.name)\n ) {\n blockchains.push(blockchain);\n }\n });\n\n // Sort\n blockchains.sort((a, b) => a.sort - b.sort);\n\n set({\n _blockchains: blockchains,\n _tokens: tokens,\n _popularTokens: popularTokens,\n _swappers: swappers,\n });\n } catch (error) {\n set({ fetchStatus: 'failed' });\n throw error;\n }\n },\n});\n", "import type { TokenWithBalance } from '../components/TokenList';\nimport type { Wallet } from '../types';\nimport type { PendingSwap } from '@rango-dev/queue-manager-rango-preset/dist/shared';\nimport type {\n BestRouteResponse,\n BlockchainMeta,\n MetaResponse,\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 { isPositiveNumber } from '../utils/numbers';\nimport { createRetryQuote, getQuoteToTokenUsdPrice } 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\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: TokenWithBalance | null;\n toToken: TokenWithBalance | null;\n quoteWalletsConfirmed: boolean;\n selectedWallets: Wallet[];\n quoteWarningsConfirmed: boolean;\n resetQuote: () => void;\n resetToBlockchain: () => void;\n resetFromBlockchain: () => void;\n setFromBlockchain: (chain: BlockchainMeta | null) => void;\n setToBlockchain: (chian: BlockchainMeta | null) => void;\n\n setFromToken: (params: SetTokenParams) => void;\n setToToken: (params: SetTokenParams) => void;\n setInputAmount: (amount: string) => void;\n quote: BestRouteResponse | null;\n setQuote: (quote: BestRouteResponse | null) => void;\n retry: (pendingSwap: PendingSwap, meta: Meta) => void;\n switchFromAndTo: () => void;\n setQuoteWalletConfirmed: (flag: boolean) => void;\n setSelectedWallets: (wallets: Wallet[]) => void;\n customDestination: string;\n setCustomDestination: (address: string) => 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 quote: null,\n quoteWalletsConfirmed: false,\n selectedWallets: [],\n customDestination: '',\n quoteWarningsConfirmed: false,\n setQuote: (quote) =>\n set((state) => {\n let outputAmount: BigNumber | null = null;\n let outputUsdValue: BigNumber = ZERO;\n if (!isPositiveNumber(state.inputAmount)) {\n return {};\n }\n if (!!quote) {\n outputAmount = !!quote.result?.outputAmount\n ? new BigNumber(quote.result?.outputAmount)\n : null;\n outputUsdValue = calcOutputUsdValue(\n quote.result?.outputAmount,\n getQuoteToTokenUsdPrice(quote) || state.toToken?.usdPrice\n );\n }\n return {\n quote: quote,\n ...(!!quote && {\n outputAmount,\n outputUsdValue,\n }),\n };\n }),\n resetQuote: () =>\n set(() => ({\n quote: null,\n outputAmount: null,\n outputUsdValue: new BigNumber(0),\n })),\n setFromBlockchain: (chain) => {\n set((state) => {\n if (state.fromBlockchain?.name === chain?.name) {\n return {};\n }\n\n return {\n fromBlockchain: chain,\n ...(state.fromToken && {\n quote: null,\n fromToken: null,\n outputAmount: null,\n outputUsdValue: null,\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 quote: null,\n toToken: null,\n outputAmount: null,\n outputUsdValue: null,\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: new BigNumber(0),\n outputUsdValue: new BigNumber(0),\n quote: null,\n }),\n ...(!!state.fromToken && {\n inputUsdValue: getUsdValue(state.fromToken, amount),\n }),\n }));\n },\n retry: (pendingSwap, meta) => {\n const { tokens, blockchains } = meta;\n const {\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n inputAmount,\n } = createRetryQuote(pendingSwap, blockchains, tokens);\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 quote: 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: getUsdValue(\n state.toToken,\n state.outputAmount?.toString() || ''\n ),\n })),\n resetFromBlockchain: () =>\n set(() => ({\n fromToken: null,\n fromBlockchain: null,\n outputAmount: null,\n outputUsdValue: null,\n quote: null,\n })),\n resetToBlockchain: () =>\n set(() => ({\n toToken: null,\n toBlockchain: null,\n outputAmount: null,\n outputUsdValue: null,\n quote: 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: '',\n }),\n setQuoteWarningsConfirmed: (flag) =>\n set({ quoteWarningsConfirmed: flag }),\n }))\n )\n);\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { QuoteError, QuoteWarning, Wallet } from '../types';\nimport type { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport type { PriceImpactWarningLevel } from '@rango-dev/ui';\nimport type {\n SimulationAssetAndAmount,\n SimulationValidationStatus,\n} from '@rango-dev/ui/dist/widget/ui/src/types/swaps';\nimport type {\n Asset,\n BestRouteResponse,\n BlockchainMeta,\n Token,\n} from 'rango-sdk';\n\nimport { getLastSuccessfulStep } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\n\nimport { HIGHT_PRICE_IMPACT, LOW_PRICE_IMPACT } from '../constants/routing';\nimport { HIGH_SLIPPAGE } from '../constants/swapSettings';\nimport { getUsdValue } from '../store/quote';\nimport { QuoteErrorType, QuoteWarningType } from '../types';\n\nimport { areEqual } from './common';\nimport { findBlockchain, findToken } from './meta';\nimport {\n checkSlippageErrors,\n checkSlippageWarnings,\n getLimitErrorMessage,\n getMinRequiredSlippage,\n getPercentageChange,\n getTotalFeeInUsd,\n hasHighValueLoss,\n hasLimitError,\n hasProperSlippage,\n} from './swap';\n\nexport function searchParamsToToken(\n tokens: Token[],\n searchParams: string | null,\n chain: BlockchainMeta | null\n): Token | null {\n if (!chain) {\n return null;\n }\n return (\n tokens.find((token) => {\n const symbolAndAddress = searchParams?.split('--');\n if (symbolAndAddress?.length === 1) {\n return (\n token.symbol === symbolAndAddress[0] &&\n token.address === null &&\n token.blockchain === chain.name\n );\n }\n return (\n token.symbol === symbolAndAddress?.[0] &&\n token.address === symbolAndAddress?.[1] &&\n token.blockchain === chain.name\n );\n }) || null\n );\n}\n\nexport function getQuoteToTokenUsdPrice(\n quote: BestRouteResponse | null\n): number | null | undefined {\n return quote?.result?.swaps[quote?.result?.swaps.length - 1].to.usdPrice;\n}\n\nexport function isNumberOfSwapsChanged(\n quoteA: BestRouteResponse,\n quoteB: BestRouteResponse\n) {\n const quoteASwaps = quoteA.result?.swaps || [];\n const quoteBSwaps = quoteB.result?.swaps || [];\n return quoteASwaps.length !== quoteBSwaps.length;\n}\n\nexport function isQuoteSwappersUpdated(\n quoteA: BestRouteResponse,\n quoteB: BestRouteResponse\n) {\n const quoteASwappers =\n quoteA.result?.swaps.map((swap) => swap.swapperId) || [];\n const quoteBSwappers =\n quoteB.result?.swaps.map((swap) => swap.swapperId) || [];\n return !areEqual(quoteASwappers, quoteBSwappers);\n}\n\nexport function isQuoteInternalCoinsUpdated(\n quoteA: BestRouteResponse,\n quoteB: BestRouteResponse\n) {\n const quoteAInternalCoins =\n quoteA.result?.swaps.map((swap) => swap.to.symbol) || [];\n const quoteBInternalCoins =\n quoteB.result?.swaps.map((swap) => swap.to.symbol) || [];\n return !areEqual(quoteAInternalCoins, quoteBInternalCoins);\n}\n\nexport function isQuoteChanged(\n quoteA: BestRouteResponse,\n quoteB: BestRouteResponse\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 tokenToString = (token: Asset): string =>\n `${token.symbol}-${token.blockchain}-${token.address ?? ''}`;\n\n const set = new Set();\n\n listA.forEach((token) => set.add(tokenToString(token)));\n\n return listB.filter((token) => set.has(tokenToString(token))) as R;\n}\n\nexport function createRetryQuote(\n pendingSwap: PendingSwap,\n blockchains: BlockchainMeta[],\n tokens: Token[]\n): {\n fromBlockchain: BlockchainMeta | null;\n fromToken: Token | null;\n toBlockchain: BlockchainMeta | null;\n toToken: Token | null;\n inputAmount: string;\n} {\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 tokens\n );\n const toTokenMeta = findToken(toToken, tokens);\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: BestRouteResponse,\n params: {\n fromToken: Token;\n toToken: Token;\n tokens: Token[];\n userSlippage: number;\n }\n): QuoteWarning | null {\n const { fromToken, toToken, tokens, userSlippage } = params;\n const inputUsdValue = getUsdValue(fromToken, quote.requestAmount);\n const outputUsdValue = getUsdValue(toToken, quote.result?.outputAmount ?? '');\n\n if (quote.result && 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.result.swaps, tokens);\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.result && (!inputUsdValue || !outputUsdValue)) {\n return { type: QuoteWarningType.UNKNOWN_PRICE };\n }\n\n const minRequiredSlippage = getMinRequiredSlippage(quote);\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 generateQuoteErrors(\n quote: BestRouteResponse\n): QuoteError | null {\n if (!quote.result) {\n return {\n type: QuoteErrorType.NO_RESULT,\n diagnosisMessage: quote.diagnosisMessages?.[0],\n };\n }\n const limitError = hasLimitError(quote);\n if (limitError) {\n const { swap, recommendation, fromAmountRangeError } =\n getLimitErrorMessage(quote);\n return {\n type: QuoteErrorType.BRIDGE_LIMIT,\n swap: swap,\n recommendation,\n fromAmountRangeError,\n };\n }\n\n const recommendedSlippages = checkSlippageErrors(quote);\n\n if (recommendedSlippages) {\n const minRequiredSlippage = getMinRequiredSlippage(quote);\n return {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages,\n minRequiredSlippage,\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", "/* eslint-disable @typescript-eslint/prefer-enum-initializers */\n\nimport type { PriceImpactWarningLevel } from '@rango-dev/ui';\nimport type BigNumber from 'bignumber.js';\nimport type { SwapResult } from 'rango-sdk';\n\nexport enum QuoteErrorType {\n NO_RESULT,\n REQUEST_FAILED,\n REQUEST_CANCELED,\n BRIDGE_LIMIT,\n INSUFFICIENT_SLIPPAGE,\n}\n\nexport type NoResultError = {\n type: QuoteErrorType.NO_RESULT;\n diagnosisMessage?: string;\n};\n\nexport type BridgeLimitError = {\n type: QuoteErrorType.BRIDGE_LIMIT;\n swap: SwapResult;\n recommendation: string;\n fromAmountRangeError: string;\n};\n\nexport type InsufficientSlippageError = {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE;\n recommendedSlippages: RecommendedSlippages | null;\n minRequiredSlippage: string | null;\n};\n\nexport type QuoteRequestFailed = { type: QuoteErrorType.REQUEST_FAILED };\nexport type QuoteRequestCanceled = { type: QuoteErrorType.REQUEST_CANCELED };\n\nexport type QuoteError =\n | NoResultError\n | BridgeLimitError\n | InsufficientSlippageError\n | QuoteRequestFailed\n | QuoteRequestCanceled;\n\nexport enum QuoteWarningType {\n HIGH_VALUE_LOSS,\n UNKNOWN_PRICE,\n INSUFFICIENT_SLIPPAGE,\n HIGH_SLIPPAGE,\n}\n\nexport enum QuoteUpdateType {\n QUOTE_UPDATED,\n QUOTE_SWAPPERS_UPDATED,\n QUOTE_COINS_UPDATED,\n QUOTE_AND_OUTPUT_AMOUNT_UPDATED,\n QUOTE_UPDATED_WITH_HIGH_VALUE_LOSS,\n}\n\nexport type QuoteUpdateWarning =\n | {\n type: QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED;\n newOutputAmount: string;\n percentageChange: string;\n }\n | {\n type: Exclude<\n QuoteUpdateType,\n QuoteUpdateType.QUOTE_AND_OUTPUT_AMOUNT_UPDATED\n >;\n };\n\nexport type RecommendedSlippages = Map<number, string>;\n\nexport type InsufficientSlippageWarning = {\n type: QuoteWarningType.INSUFFICIENT_SLIPPAGE;\n recommendedSlippages: RecommendedSlippages | null;\n minRequiredSlippage: string | null;\n};\n\nexport type HighSlippageWarning = {\n type: QuoteWarningType.HIGH_SLIPPAGE;\n slippage: string | null;\n};\n\nexport type HighValueLossWarning = {\n type: QuoteWarningType.HIGH_VALUE_LOSS;\n warningLevel: PriceImpactWarningLevel;\n inputUsdValue: BigNumber;\n outputUsdValue: BigNumber;\n totalFee: BigNumber;\n priceImpact: number;\n};\n\nexport type UnknownPriceWarning = {\n type: QuoteWarningType.UNKNOWN_PRICE;\n};\n\nexport type QuoteWarning =\n | HighValueLossWarning\n | InsufficientSlippageWarning\n | HighSlippageWarning\n | UnknownPriceWarning;\n\nexport type ConfirmSwapWarnings = {\n quote: QuoteWarning | null;\n quoteUpdate: QuoteUpdateWarning | null;\n balance: { messages: string[] } | null;\n};\n", "import type { Asset, BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';\n\nimport { tokensAreEqual } from './wallets';\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 getSwapperDisplayName(\n swapperId: string,\n swappers: SwapperMeta[]\n) {\n return swappers.find((swapper) => swapper.id === swapperId)?.swapperGroup;\n}\n\nexport function findToken(t: Asset, tokens: Token[]) {\n return tokens.find((token) => tokensAreEqual(token, t)) ?? null;\n}\n\nexport function findBlockchain(name: string, blockchains: BlockchainMeta[]) {\n return blockchains.find((blockchain) => blockchain.name === name) ?? null;\n}\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { FetchStatus } from '../store/slices/data';\nimport type {\n ConvertedToken,\n QuoteError,\n QuoteWarning,\n RecommendedSlippages,\n SwapButtonState,\n Wallet,\n} from '../types';\nimport type {\n PendingSwap,\n PendingSwapStep,\n} from '@rango-dev/queue-manager-rango-preset';\nimport type { WalletType } from '@rango-dev/wallets-shared';\nimport type {\n BestRouteRequest,\n BestRouteResponse,\n BlockchainMeta,\n RecommendedSlippage,\n SwapResult,\n Token,\n} from 'rango-sdk';\n\nimport { i18n } from '@lingui/core';\nimport { PendingSwapNetworkStatus } from '@rango-dev/queue-manager-rango-preset';\nimport BigNumber from 'bignumber.js';\n\nimport { isValidAddress } from '../components/ConfirmWalletsModal/ConfirmWallets.helpers';\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 { removeDuplicateFrom } from './common';\nimport { getBlockchainShortNameFor } from './meta';\nimport { numberToString } from './numbers';\nimport { getPriceImpact, getRequiredBalanceOfWallet } from './quote';\nimport { getRequiredChains } 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(quote: BestRouteResponse | null): boolean {\n return (\n (quote?.result?.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}\nexport function getLimitErrorMessage(quote: BestRouteResponse): {\n swap: SwapResult;\n fromAmountRangeError: string;\n recommendation: string;\n} {\n const swap = (quote.result?.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: BestRouteResponse | 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 (\n fetchingQuote ||\n !quote ||\n !quote.result ||\n error ||\n !inputAmount ||\n inputAmount === '0'\n ) {\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: BestRouteResponse | null,\n inputAmount: string,\n usdValue: BigNumber | null\n) {\n return !(\n (!usdValue || usdValue.lte(ZERO)) &&\n !!quote?.result &&\n !!inputAmount &&\n inputAmount !== '0' &&\n parseFloat(inputAmount || '0') !== 0 &&\n !!quote.result\n );\n}\n\nexport function requiredWallets(quote: BestRouteResponse | null) {\n const wallets: string[] = [];\n\n quote?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n let lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepFromBlockchain != lastAddedWallet) {\n wallets.push(currentStepFromBlockchain);\n }\n lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepToBlockchain != lastAddedWallet) {\n wallets.push(currentStepToBlockchain);\n }\n });\n return wallets;\n}\n\nexport const getUsdPrice = (\n blockchain: string,\n symbol: string,\n address: string | null,\n allTokens: Token[]\n): number | null => {\n const token = allTokens?.find(\n (t) =>\n t.blockchain === blockchain &&\n t.symbol?.toUpperCase() === symbol?.toUpperCase() &&\n t.address === address\n );\n return token?.usdPrice || null;\n};\n\nexport function getUsdFeeOfStep(\n step: SwapResult,\n allTokens: Token[]\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 = getUsdPrice(\n fee.asset.blockchain,\n fee.asset.symbol,\n fee.asset.address,\n allTokens\n );\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 allTokens: Token[]\n): BigNumber {\n return swaps.reduce(\n (totalFee: BigNumber, step) =>\n totalFee.plus(getUsdFeeOfStep(step, allTokens)),\n ZERO\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 quote: BestRouteResponse\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n quote.result?.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: BestRouteResponse,\n userSlippage: number\n): RecommendedSlippages | null {\n const recommendedSlippages: RecommendedSlippages = new Map();\n quote.result?.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(\n quote: BestRouteResponse\n): string | null {\n const slippages = quote.result?.swaps.map(\n (slippage) => slippage.recommendedSlippage\n );\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: BestRouteResponse,\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: BestRouteResponse,\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?: Wallet[];\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 initialQuote?: BestRouteResponse;\n destination?: string;\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 initialQuote,\n destination,\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 const chainAndAccounts = connectedWallets.find(\n (connectedWallet) => connectedWallet.blockchain === wallet.chain\n );\n if (!!chainAndAccounts) {\n chainAndAccounts.addresses.push(wallet.address);\n } else {\n connectedWallets.push({\n blockchain: wallet.chain,\n addresses: [wallet.address],\n });\n }\n });\n\n const checkPrerequisites = !!initialQuote;\n\n const filteredBlockchains = removeDuplicateFrom(\n (initialQuote?.result?.swaps || []).reduce(\n (blockchains: string[], swap) => {\n blockchains.push(swap.from.blockchain, swap.to.blockchain);\n // Check if internalSwaps array exists\n if (swap.internalSwaps && Array.isArray(swap.internalSwaps)) {\n swap.internalSwaps.map((internalSwap) => {\n blockchains.push(\n internalSwap.from.blockchain,\n internalSwap.to.blockchain\n );\n });\n }\n return blockchains;\n },\n []\n )\n );\n\n const requestBody: BestRouteRequest = {\n amount: inputAmount.toString(),\n affiliateRef: affiliateRef ?? undefined,\n affiliatePercent: affiliatePercent ?? undefined,\n affiliateWallets: affiliateWallets ?? undefined,\n checkPrerequisites,\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 ...(checkPrerequisites && { blockchains: filteredBlockchains }),\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: BestRouteResponse) {\n return quote.result?.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: BestRouteResponse,\n newQuote: BestRouteResponse\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: BestRouteResponse,\n selectedWallets: Wallet[],\n blockchains: BlockchainMeta[]\n) {\n const fee = quote.validationStatus;\n const requiredWallets = getRequiredChains(quote);\n const walletsSortedByRequiredWallets = selectedWallets.sort(\n (selectedWallet1, selectedWallet2) =>\n requiredWallets.indexOf(selectedWallet1.chain) -\n requiredWallets.indexOf(selectedWallet2.chain)\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 (\n pendingSwap.status === 'failed' &&\n !!pendingSwap.finishTime &&\n new Date().getTime() - parseInt(pendingSwap.finishTime) < 4 * 3600 * 1000\n );\n}\n\nexport function confirmSwapDisabled(\n fetching: boolean,\n showCustomDestination: boolean,\n customDestination: string,\n quote: BestRouteResponse | null,\n selectedWallets: { walletType: string; chain: string }[],\n lastStepToBlockchain?: BlockchainMeta\n) {\n return (\n fetching ||\n (!showCustomDestination &&\n !requiredWallets(quote).every((chain) =>\n selectedWallets.map((wallet) => wallet.chain).includes(chain)\n )) ||\n (!!showCustomDestination && !customDestination) ||\n (!!showCustomDestination &&\n !!customDestination &&\n lastStepToBlockchain &&\n !isValidAddress(lastStepToBlockchain, customDestination))\n );\n}\n", "import type { BestRouteResponse, BlockchainMeta } from 'rango-sdk';\n\nexport function getRequiredWallets(quote: BestRouteResponse | null): string[] {\n const wallets: string[] = [];\n\n quote?.result?.swaps.forEach((swap) => {\n const currentStepFromBlockchain = swap.from.blockchain;\n const currentStepToBlockchain = swap.to.blockchain;\n let lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepFromBlockchain != lastAddedWallet) {\n wallets.push(currentStepFromBlockchain);\n }\n lastAddedWallet = wallets[wallets.length - 1];\n if (currentStepToBlockchain != lastAddedWallet) {\n wallets.push(currentStepToBlockchain);\n }\n });\n return wallets;\n}\n\nexport function isValidAddress(\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 { 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. If you are sure, continue, otherwise, change the swap.'\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 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\nexport function useWalletProviders(\n providers: WidgetConfig['wallets'],\n options?: ProvidersOptions\n) {\n const clearConnectedWallet = useWalletsStore.use.clearConnectedWallet();\n let generateProviders: ProviderInterface[] = matchAndGenerateProviders(\n undefined,\n options\n );\n\n useEffect(() => {\n clearConnectedWallet();\n generateProviders = matchAndGenerateProviders(providers, {\n walletConnectProjectId: options?.walletConnectProjectId,\n });\n }, [providers?.length]);\n\n return {\n providers: generateProviders,\n };\n}\n", "import type { 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 { httpService } from '../services/httpService';\nimport {\n isAccountAndWalletMatched,\n makeBalanceFor,\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}\n\ninterface WalletsStore {\n connectedWallets: ConnectedWallet[];\n customDestination: string;\n loading: boolean;\n connectWallet: (accounts: Wallet[], tokens: Token[]) => void;\n disconnectWallet: (walletType: WalletType) => void;\n selectWallets: (wallets: { walletType: string; chain: string }[]) => void;\n clearConnectedWallet: () => void;\n getWalletsDetails: (\n accounts: Wallet[],\n tokens: Token[],\n shouldRetry?: boolean\n ) => void;\n}\n\nexport const useWalletsStore = createSelectors(\n create<WalletsStore>()(\n subscribeWithSelector((set, get) => ({\n connectedWallets: [],\n customDestination: '',\n loading: false,\n connectWallet: (accounts, tokens) => {\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 = !state.connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.chain === account.chain &&\n connectedWallet.selected\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, tokens);\n },\n disconnectWallet: (walletType) => {\n set((state) => {\n const selectedWallets = state.connectedWallets\n .filter(\n (connectedWallet) =>\n connectedWallet.selected &&\n connectedWallet.walletType !== walletType\n )\n .map((selectedWallet) => selectedWallet.chain);\n return {\n 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 });\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, tokens, 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 loading: false,\n 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], tokens, false);\n }\n return matchedAccount && retrievedBalanceAccount\n ? {\n ...connectedWallet,\n explorerUrl: retrievedBalanceAccount.explorerUrl,\n balances: makeBalanceFor(\n retrievedBalanceAccount,\n tokens\n ),\n loading: false,\n }\n : connectedWallet;\n }\n ),\n }));\n } else {\n throw new Error('Wallet not found');\n }\n } catch (error) {\n set((state) => ({\n loading: false,\n connectedWallets: state.connectedWallets.map((balance) => {\n return accounts.find((account) =>\n isAccountAndWalletMatched(account, balance)\n )\n ? resetConnectedWalletState(balance)\n : balance;\n }),\n }));\n }\n },\n }))\n )\n);\n\nexport const fetchingBalanceSelector = (state: WalletsStore) =>\n !!state.connectedWallets.find((wallet) => wallet.loading);\n", "import { allProviders } from '@rango-dev/provider-all';\nimport { ProviderInterface } from '@rango-dev/wallets-react';\nimport { WidgetConfig } from '../types';\n\nexport interface ProvidersOptions {\n walletConnectProjectId?: WidgetConfig['walletConnectProjectId'];\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 },\n });\n\n if (providers) {\n const selectedProviders: ProviderInterface[] = [];\n\n providers.forEach((requestedProvider) => {\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 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 { WidgetProps } from './Widget.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React from 'react';\n\nimport { DEFAULT_CONFIG } from '../../store/slices/config';\nimport { Main } from '../App';\nimport { WidgetProvider } from '../WidgetProvider';\n\nexport function Widget(props: PropsWithChildren<WidgetProps>) {\n if (!props.config?.externalWallets) {\n return (\n <WidgetProvider config={props.config ?? DEFAULT_CONFIG}>\n <Main />\n </WidgetProvider>\n );\n }\n return <Main />;\n}\n", "import type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { I18nManager } from '@rango-dev/ui';\nimport React, { useContext, useEffect, useState } from 'react';\n\nimport { AppRouter } from '../../components/AppRouter';\nimport { AppRoutes } from '../../components/AppRoutes';\nimport { WidgetEvents } from '../../components/WidgetEvents';\nimport { globalFont } from '../../globalStyles';\nimport { useLanguage } from '../../hooks/useLanguage';\nimport { useTheme } from '../../hooks/useTheme';\nimport { useAppStore } from '../../store/AppStore';\nimport { useNotificationStore } from '../../store/notification';\nimport { useSettingsStore } from '../../store/settings';\nimport { WidgetContext } from '../Wallets';\n\nimport { MainContainer } from './App.styles';\n\nexport function Main() {\n globalFont();\n\n const { fetch: fetchMeta, config } = useAppStore();\n const { activeTheme } = useTheme(config?.theme || {});\n const { activeLanguage, changeLanguage } = useLanguage();\n const [lastConnectedWalletWithNetwork, setLastConnectedWalletWithNetwork] =\n useState<string>('');\n const [disconnectedWallet, setDisconnectedWallet] = useState<WalletType>();\n const widgetContext = useContext(WidgetContext);\n\n useEffect(() => {\n void fetchMeta().catch();\n void useSettingsStore.persist.rehydrate();\n void useNotificationStore.persist.rehydrate();\n widgetContext.onConnectWallet(setLastConnectedWalletWithNetwork);\n }, []);\n useEffect(() => {\n changeLanguage(config?.language);\n }, [config?.language]);\n\n return (\n <I18nManager language={activeLanguage}>\n <MainContainer id=\"swap-container\" className={activeTheme()}>\n <WidgetEvents />\n <AppRouter\n lastConnectedWallet={lastConnectedWalletWithNetwork}\n disconnectedWallet={disconnectedWallet}\n clearDisconnectedWallet={() => {\n setDisconnectedWallet(undefined);\n }}>\n <AppRoutes />\n </AppRouter>\n </MainContainer>\n </I18nManager>\n );\n}\n", "import type { WalletType } from '@rango-dev/wallets-shared';\nimport type { PropsWithChildren } from 'react';\n\nimport { useQueueManager } from '@rango-dev/queue-manager-rango-preset';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport { isEvmBlockchain } from 'rango-types';\nimport React, { Fragment } from 'react';\nimport { MemoryRouter, useInRouterContext } from 'react-router';\n\nimport { useForceAutoConnect } from '../hooks/useForceAutoConnect';\nimport { useAppStore } from '../store/AppStore';\n\nimport { UpdateUrl } from './UpdateUrl';\n\nexport function AppRouter({\n children,\n ...props\n}: PropsWithChildren & {\n lastConnectedWallet: string;\n disconnectedWallet: WalletType | undefined;\n clearDisconnectedWallet: () => void;\n}) {\n const isRouterInContext = useInRouterContext();\n const Router = isRouterInContext ? Fragment : MemoryRouter;\n const blockchains = useAppStore().blockchains();\n const { canSwitchNetworkTo } = useWallets();\n\n useForceAutoConnect();\n\n const evmChains = blockchains.filter(isEvmBlockchain);\n\n useQueueManager({\n lastConnectedWallet: props.lastConnectedWallet,\n clearDisconnectedWallet: props.clearDisconnectedWallet,\n disconnectedWallet: props.disconnectedWallet,\n evmChains,\n canSwitchNetworkTo,\n });\n\n return (\n <>\n <Router>{children}</Router>\n {isRouterInContext && <UpdateUrl />}\n </>\n );\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 { useEffect, useRef } from 'react';\nimport {\n createSearchParams,\n useLocation,\n useSearchParams,\n} from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { SearchParams } from '../constants/searchParams';\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useUiStore } from '../store/ui';\nimport { searchParamsToToken } from '../utils/quote';\n\nexport function UpdateUrl() {\n const firstRender = useRef(true);\n const [searchParams, setSearchParams] = useSearchParams();\n const location = useLocation();\n const firstRenderSearchParams = useRef(location.search);\n const searchParamsRef = useRef<Record<string, string>>({});\n const fromBlockchain = useQuoteStore.use.fromBlockchain();\n const toBlockchain = useQuoteStore.use.toBlockchain();\n const fromToken = useQuoteStore.use.fromToken();\n const toToken = useQuoteStore.use.toToken();\n const setFromBlockchain = useQuoteStore.use.setFromBlockchain();\n const setFromToken = useQuoteStore.use.setFromToken();\n const setToBlockchain = useQuoteStore.use.setToBlockchain();\n const setToToken = useQuoteStore.use.setToToken();\n const inputAmount = useQuoteStore.use.inputAmount();\n const setInputAmount = useQuoteStore.use.setInputAmount();\n const fetchMetaStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n\n useEffect(() => {\n const params: Record<string, string> = {};\n createSearchParams(firstRenderSearchParams.current).forEach(\n (value, key) => {\n params[key] = value;\n }\n );\n searchParamsRef.current = params;\n const requestId =\n location.pathname.split(navigationRoutes.swaps + '/')[1] || null;\n if (requestId) {\n setSelectedSwap(requestId);\n }\n }, []);\n\n useEffect(() => {\n if (!firstRender.current) {\n let fromChainString = '',\n fromTokenString = '',\n toChainString = '',\n toTokenString = '',\n fromAmount = '';\n const autoConnect = searchParamsRef.current[SearchParams.AUTO_CONNECT];\n if (fetchMetaStatus !== 'success') {\n fromChainString = searchParamsRef.current[SearchParams.FROM_CHAIN];\n fromTokenString = searchParamsRef.current[SearchParams.FROM_TOKEN];\n toChainString = searchParamsRef.current[SearchParams.TO_CHAIN];\n toTokenString = searchParamsRef.current[SearchParams.TO_TOKEN];\n fromAmount =\n searchParamsRef.current[SearchParams.FROM_AMOUNT] || inputAmount;\n } else {\n fromChainString = fromBlockchain?.name || '';\n fromTokenString =\n (fromToken?.symbol || '') +\n (fromToken?.address ? `--${fromToken?.address}` : '');\n toChainString = toBlockchain?.name || '';\n toTokenString =\n (toToken?.symbol || '') +\n (toToken?.address ? `--${toToken?.address}` : '');\n fromAmount = inputAmount;\n }\n setSearchParams(\n {\n ...(fromChainString && {\n [SearchParams.FROM_CHAIN]: fromChainString,\n }),\n ...(fromTokenString && {\n [SearchParams.FROM_TOKEN]: fromTokenString,\n }),\n ...(toChainString && { [SearchParams.TO_CHAIN]: toChainString }),\n ...(toTokenString && { [SearchParams.TO_TOKEN]: toTokenString }),\n ...(fromAmount && {\n [SearchParams.FROM_AMOUNT]: fromAmount.toString(),\n }),\n ...(autoConnect && {\n [SearchParams.AUTO_CONNECT]: autoConnect,\n }),\n },\n { replace: true }\n );\n }\n firstRender.current = false;\n }, [\n location.pathname,\n inputAmount,\n fromBlockchain,\n fromToken,\n toBlockchain,\n toToken,\n ]);\n\n useEffect(() => {\n if (fetchMetaStatus === 'success') {\n const fromChainString = searchParams.get(SearchParams.FROM_CHAIN);\n const fromTokenString = searchParams.get(SearchParams.FROM_TOKEN);\n const toChainString = searchParams.get(SearchParams.TO_CHAIN);\n const toTokenString = searchParams.get(SearchParams.TO_TOKEN);\n const fromAmount = searchParams.get(SearchParams.FROM_AMOUNT);\n const fromBlockchain = blockchains.find(\n (blockchain) => blockchain.name === fromChainString\n );\n const fromToken = searchParamsToToken(\n tokens,\n fromTokenString,\n fromBlockchain || null\n );\n const toBlockchain = blockchains.find(\n (blockchain) => blockchain.name === toChainString\n );\n const toToken = searchParamsToToken(\n tokens,\n toTokenString,\n toBlockchain || null\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 if (!!toBlockchain) {\n setToBlockchain(toBlockchain);\n if (!!toToken) {\n setToToken({\n token: toToken,\n meta: { blockchains: blockchains, tokens: tokens },\n });\n }\n }\n if (fromAmount) {\n setInputAmount(fromAmount);\n }\n }\n }, [fetchMetaStatus]);\n\n return null;\n}\n", "export const navigationRoutes = {\n home: '/',\n fromSwap: 'from-swap',\n toSwap: 'to-swap',\n blockchains: 'blockchains',\n settings: 'settings',\n liquiditySources: 'liquidity-sources',\n themes: 'themes',\n bridges: 'bridges',\n exchanges: 'exchanges',\n languages: 'languages',\n swaps: 'swaps',\n wallets: 'wallets',\n confirmSwap: 'confirm-swap',\n swapDetails: ':requestId',\n};\n", "import { create } from 'zustand';\n\nimport createSelectors from './selectors';\n\ninterface UiState {\n connectWalletsButtonDisabled: boolean;\n selectedSwapRequestId: string | null;\n currentPage: string;\n setSelectedSwap: (requestId: string | null) => void;\n setCurrentPage: (path: string) => void;\n}\n\nexport const useUiStore = createSelectors(\n create<UiState>()((set) => ({\n connectWalletsButtonDisabled: false,\n selectedSwapRequestId: null,\n currentPage: '',\n setSelectedSwap: (requestId) => set({ selectedSwapRequestId: requestId }),\n setCurrentPage: (path) => set({ currentPage: path }),\n }))\n);\n", "import React from 'react';\nimport { useRoutes } from 'react-router-dom';\n\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { ConfirmSwapPage } from '../pages/ConfirmSwapPage';\nimport { HistoryPage } from '../pages/HistoryPage';\nimport { Home } from '../pages/Home';\nimport { LanguagePage } from '../pages/LanguagePage';\nimport { LiquiditySourcePage } from '../pages/LiquiditySourcePage';\nimport { SelectBlockchainPage } from '../pages/SelectBlockchainPage';\nimport { SelectSwapItemsPage } from '../pages/SelectSwapItemsPage';\nimport { SettingsPage } from '../pages/SettingsPage';\nimport { SwapDetailsPage } from '../pages/SwapDetailsPage';\nimport { ThemePage } from '../pages/ThemePage';\nimport { WalletsPage } from '../pages/WalletsPage';\n\nexport function AppRoutes() {\n return useRoutes([\n {\n path: navigationRoutes.home,\n element: <Home />,\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.themes,\n element: <ThemePage />,\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 },\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", "/* 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 Divider,\n IconButton,\n RefreshIcon,\n SettingsIcon,\n styled,\n Tooltip,\n Typography,\n WalletIcon,\n} from '@rango-dev/ui';\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { flushSync } from 'react-dom';\nimport { useNavigate } from 'react-router-dom';\n\nimport { getRequiredWallets } from '../components/ConfirmWalletsModal/ConfirmWallets.helpers';\nimport { ConfirmWalletsModal } from '../components/ConfirmWalletsModal/ConfirmWalletsModal';\nimport { HeaderButton } from '../components/HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../components/Layout';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { getQuoteUpdateWarningMessage } from '../constants/warnings';\nimport { QuoteInfo } from '../containers/QuoteInfo';\nimport { useConfirmSwap } from '../hooks/useConfirmSwap';\nimport { useQuoteStore } from '../store/quote';\nimport { useSettingsStore } from '../store/settings';\nimport { useUiStore } from '../store/ui';\nimport { useWalletsStore } from '../store/wallets';\nimport { QuoteWarningType } from '../types';\nimport { getContainer } from '../utils/common';\n\nconst Container = styled('div', {\n position: 'relative',\n width: '100%',\n '& .description': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n '& .icon': {\n width: '$24',\n height: '$24',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n '& .quote-update__alert': {\n paddingTop: '$10',\n },\n});\n\nconst Buttons = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'space-between',\n '& .confirm-button': {\n flexGrow: 1,\n paddingRight: '$10',\n },\n [`& ${IconButton}`]: {\n width: '$48',\n height: '$48',\n },\n});\n\nexport function ConfirmSwapPage() {\n //TODO: move component's logics to a custom hook\n const {\n quote,\n setInputAmount,\n selectedWallets,\n quoteWalletsConfirmed,\n setQuoteWalletConfirmed,\n customDestination,\n quoteWarningsConfirmed,\n } = useQuoteStore();\n const navigate = useNavigate();\n const [dbErrorMessage, setDbErrorMessage] = useState<string>('');\n\n const { connectedWallets } = useWalletsStore();\n const showWalletsOnInit = !quoteWalletsConfirmed;\n const [showWallets, setShowWallets] = useState(false);\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\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\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 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 setSelectedSwap(confirmSwapResult.swap.requestId);\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 await addNewSwap();\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 useEffect(() => {\n const quoteChanged =\n confirmSwapResult.warnings?.quote?.type &&\n Object.values(QuoteWarningType).includes(\n confirmSwapResult.warnings?.quote?.type\n );\n\n const selectedWalletDisconnected =\n selectedWallets.length < 1 ||\n !selectedWallets.every((selectedWallet) =>\n connectedWallets.find(\n (connectedWallet) =>\n selectedWallet.address === connectedWallet.address &&\n selectedWallet.walletType === connectedWallet.walletType &&\n selectedWallet.chain === connectedWallet.chain\n )\n );\n\n let quoteWalletsChanged = false;\n\n if (quoteChanged) {\n let requiredWallets = getRequiredWallets(quote);\n\n const lastStepToBlockchain =\n quote?.result?.swaps[quote.result.swaps.length - 1].to.blockchain;\n\n const isLastWalletRequired = !!quote?.result?.swaps.find(\n (swap) => swap.from.blockchain === lastStepToBlockchain\n );\n\n if (!isLastWalletRequired) {\n requiredWallets = requiredWallets.slice(\n -requiredWallets.length,\n requiredWallets.length - 1\n );\n }\n\n const allRequiredWalletsSelected = requiredWallets.every(\n (requiredWallet) =>\n selectedWallets.find(\n (selectedWallet) => selectedWallet.chain === requiredWallet\n )\n );\n\n if (!allRequiredWalletsSelected) {\n quoteWalletsChanged = true;\n }\n }\n\n if (quote && (selectedWalletDisconnected || quoteWalletsChanged)) {\n queueMicrotask(() => flushSync(setShowWallets.bind(null, true)));\n setQuoteWalletConfirmed(false);\n }\n }, [\n confirmSwapResult.warnings?.quote,\n selectedWallets.length,\n connectedWallets.length,\n ]);\n\n useLayoutEffect(() => {\n if (!quote) {\n navigate(`../`);\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 suffix: (\n <Tooltip\n container={getContainer()}\n side=\"bottom\"\n content={i18n.t('Settings')}>\n <HeaderButton\n size=\"small\"\n variant=\"ghost\"\n onClick={() => navigate('../' + navigationRoutes.settings)}>\n <SettingsIcon size={18} color=\"black\" />\n </HeaderButton>\n </Tooltip>\n ),\n }}\n footer={\n <Buttons>\n <div className=\"confirm-button\">\n <Button\n variant=\"contained\"\n type=\"primary\"\n size=\"large\"\n fullWidth\n loading={fetchingConfirmationQuote}\n disabled={!!confirmSwapResult.error}\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}\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 <Container>\n <div className=\"description\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('You get')}\n </Typography>\n <Button\n style={{ padding: '0' }}\n variant=\"ghost\"\n disabled={fetchingConfirmationQuote}\n onClick={onRefresh}>\n <div className=\"icon\">\n <RefreshIcon size={16} />\n </div>\n </Button>\n </div>\n {dbErrorMessage && (\n <>\n <Alert type=\"error\" variant=\"alarm\" title={dbErrorMessage} />\n <Divider size={12} />\n </>\n )}\n {confirmSwapResult.warnings?.quoteUpdate && (\n <div className=\"quote-update__alert\">\n <Alert\n variant=\"alarm\"\n type=\"warning\"\n title={\n confirmSwapResult.warnings.quoteUpdate &&\n getQuoteUpdateWarningMessage(\n confirmSwapResult.warnings.quoteUpdate\n )\n }\n />\n </div>\n )}\n <QuoteInfo\n quote={quote}\n type=\"swap-preview\"\n expanded={true}\n alertPosition=\"top\"\n error={confirmSwapResult.error}\n loading={fetchingConfirmationQuote}\n warning={confirmSwapResult.warnings?.quote ?? null}\n refetchQuote={onRefresh}\n showWarningModal={showQuoteWarningModal}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={async () => {\n setShowQuoteWarningModal(false);\n await addNewSwap();\n }}\n onChangeSettings={() => navigate('../' + navigationRoutes.settings)}\n />\n </Container>\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 ChevronDownIcon,\n ChevronLeftIcon,\n Divider,\n MessageBox,\n Modal,\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 { 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 { confirmSwapDisabled } from '../../utils/swap';\n\nimport { getRequiredWallets, isValidAddress } from './ConfirmWallets.helpers';\nimport {\n CollapsibleContent,\n CollapsibleRoot,\n ConfirmButton,\n CustomDestination,\n CustomDestinationButton,\n EXPANDABLE_TRANSITION_DURATION,\n ExpandedIcon,\n ListContainer,\n NavigateBack,\n ShowMoreHeader,\n StyledTextField,\n Title,\n Trigger,\n Wallets,\n WalletsContainer,\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 config = useAppStore().config;\n const blockchains = useAppStore().blockchains();\n const {\n quote,\n setSelectedWallets: selectQuoteWallets,\n quoteWalletsConfirmed: quoteWalletsConfirmed,\n setQuoteWalletConfirmed: setQuoteWalletConfirmed,\n customDestination,\n setCustomDestination,\n } = useQuoteStore();\n const { connectedWallets, selectWallets } = useWalletsStore();\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 const [destination, setDestination] = useState(customDestination);\n const [showCustomDestination, setShowCustomDestination] = useState(\n !!customDestination\n );\n const customDestinationRef = useRef<HTMLDivElement | null>(null);\n\n const requiredWallets = getRequiredWallets(quote);\n\n const lastStepToBlockchain = blockchains.find(\n (blockchain) =>\n blockchain.name ===\n quote?.result?.swaps[quote?.result?.swaps.length - 1].to.blockchain\n );\n const isWalletRequiredFor = (blockchain: string) =>\n !!quote?.result?.swaps.find((swap) => swap.from.blockchain === blockchain);\n\n const [selectableWallets, setSelectableWallets] = useState<ConnectedWallet[]>(\n connectedWallets.filter((connectedWallet) => {\n return (\n connectedWallet.selected &&\n requiredWallets.includes(connectedWallet.chain)\n );\n })\n );\n const lastStepToBlockchainMeta = blockchains.find(\n (chain) => chain.name === lastStepToBlockchain?.name\n );\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) && !destination))\n );\n\n const isAddressMatched =\n !!destination &&\n showCustomDestination &&\n lastStepToBlockchainMeta &&\n !isValidAddress(lastStepToBlockchainMeta, destination);\n\n const resetCustomDestination = () => {\n setShowCustomDestination(false);\n setDestination('');\n setSelectableWallets((selectableWallets) => {\n let anyWalletSelected = false;\n return selectableWallets.map((selectableWallet) => {\n if (\n !anyWalletSelected &&\n selectableWallet.chain === lastStepToBlockchain?.name\n ) {\n anyWalletSelected = true;\n return {\n ...selectableWallet,\n selected: true,\n };\n }\n return selectableWallet;\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 (wallet.chain === lastStepToBlockchain?.name && showCustomDestination) {\n setShowCustomDestination(false);\n setDestination('');\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 setCustomDestination(destination);\n setQuoteWalletConfirmed(true);\n onClose();\n };\n\n const onConfirmWallets = async () => {\n setBalanceWarnings([]);\n setError('');\n setQuoteWarning(null);\n const selectedWallets = connectedWallets.filter((connectedWallet) =>\n selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain &&\n selectableWallet.walletType === connectedWallet.walletType\n )\n );\n const result = await onCheckBalance?.({\n selectedWallets,\n customDestination: destination,\n });\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 selectableWallets.concat(\n connectedWallets.filter((connectedWallet) => {\n const anyWalletSelected = !!selectableWallets.find(\n (selectableWallet) =>\n selectableWallet.chain === connectedWallet.chain\n );\n\n return (\n !anyWalletSelected &&\n connectedWallet.selected &&\n requiredWallets.includes(connectedWallet.chain)\n );\n })\n )\n );\n }, [connectedWallets.length]);\n\n useLayoutEffect(() => {\n if (showCustomDestination && customDestinationRef.current) {\n setTimeout(() => {\n customDestinationRef?.current?.scrollIntoView({ behavior: 'smooth' });\n }, EXPANDABLE_TRANSITION_DURATION);\n }\n }, [showCustomDestination]);\n\n const modalContainer = document.querySelector('#swap-box') as HTMLDivElement;\n\n const navigate = useNavigate();\n return (\n <Modal\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 footer: (\n <ConfirmButton>\n <Button\n loading={loading}\n disabled={confirmSwapDisabled(\n loading,\n showCustomDestination,\n destination,\n quote,\n selectableWallets,\n lastStepToBlockchain\n )}\n onClick={onConfirmWallets}\n variant=\"contained\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n Confirm\n </Button>\n </ConfirmButton>\n ),\n })}\n {...(showMoreWalletFor && {\n containerStyle: { 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 <Modal\n open={balanceWarnings.length > 0}\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 </Modal>\n {showMoreWalletFor && (\n <WalletsContainer>\n <div className=\"wallets-list\">\n <WalletList\n chain={showMoreWalletFor}\n isSelected={isSelected}\n selectWallet={onChange}\n onShowMore={setShowMoreWalletFor.bind(null, showMoreWalletFor)}\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 {requiredWallets.map((requiredWallet, index) => {\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === requiredWallet\n );\n\n const key = `wallet-${index}`;\n const isLastWallet = index === requiredWallets.length - 1;\n\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 />\n </ListContainer>\n {!isLastWallet && <Divider size={32} />}\n {isLastWallet && config?.customDestination && (\n <CustomDestination>\n <CollapsibleRoot\n ref={customDestinationRef}\n selected={showCustomDestination}\n open={showCustomDestination}\n onOpenChange={(checked) => {\n if (!checked) {\n resetCustomDestination();\n } else {\n if (\n !isWalletRequiredFor(\n lastStepToBlockchain?.name ?? ''\n )\n ) {\n setSelectableWallets((selectableWallets) =>\n selectableWallets.map((selectableWallet) => {\n if (\n selectableWallet.chain ===\n lastStepToBlockchain?.name\n ) {\n return {\n ...selectableWallet,\n selected: false,\n };\n }\n return selectableWallet;\n })\n );\n }\n }\n }}>\n <Trigger\n onClick={() =>\n setShowCustomDestination((prevState) => !prevState)\n }>\n <CustomDestinationButton\n fullWidth\n variant=\"default\"\n suffix={\n <ExpandedIcon\n orientation={\n showCustomDestination ? 'up' : 'down'\n }>\n <ChevronDownIcon size={10} color=\"gray\" />\n </ExpandedIcon>\n }>\n <div className=\"button__content\">\n <WalletIcon size={18} color=\"info\" />\n <Divider size={4} direction=\"horizontal\" />\n <Typography variant=\"label\" size=\"medium\">\n {i18n.t('Send to a different address')}\n </Typography>\n </div>\n </CustomDestinationButton>\n </Trigger>\n <CollapsibleContent open={showCustomDestination}>\n <>\n <Divider size={4} />\n <StyledTextField\n autoFocus\n placeholder={i18n.t('Your destination address')}\n value={destination}\n onChange={(e) => {\n setDestination(e.target.value);\n }}\n />\n </>\n </CollapsibleContent>\n </CollapsibleRoot>\n {isAddressMatched && (\n <div className=\"alarms\">\n <Alert\n variant=\"alarm\"\n type=\"error\"\n title={i18n.t({\n values: { destination },\n id: \"Address {destination} doesn't match the blockchain address pattern.\",\n })}\n />\n </div>\n )}\n </CustomDestination>\n )}\n </div>\n );\n })}\n </Wallets>\n </>\n )}\n </Modal>\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 * as Collapsible from '@radix-ui/react-collapsible';\nimport {\n Button,\n darkTheme,\n IconButton,\n keyframes,\n styled,\n TextField,\n} 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 Title = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n});\n\nexport const ListContainer = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: ' repeat(3, minmax(0, 1fr))',\n alignContent: 'baseline',\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$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral100',\n },\n backgroundColor: '$$color',\n },\n\n '&:focus-visible': {\n $$color: '$colors$info100',\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});\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});\n\nexport const ShowMoreHeader = styled('div', {\n padding: '$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 '& .wallets-list': {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: ' repeat(3, minmax(0, 1fr))',\n alignContent: 'baseline',\n },\n});\n\nexport const CollapsibleRoot = styled(Collapsible.Root, {\n backgroundColor: '$neutral200',\n borderRadius: '$sm',\n variants: {\n selected: {\n true: {\n outlineWidth: 1,\n outlineColor: '$secondary500',\n outlineStyle: 'solid',\n },\n },\n },\n});\n\nexport const CustomDestinationButton = styled(Button, {\n width: '100%',\n borderRadius: '$sm !important',\n padding: '$15 !important',\n justifyContent: 'space-between',\n alignItems: 'center',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n\n '&:hover': {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral100',\n },\n backgroundColor: '$$color',\n },\n '&:focus-visible': {\n $$background: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$background: '$colors$info700',\n },\n backgroundColor: '$$background',\n outline: 0,\n },\n});\n\nexport const CustomDestination = styled('div', {\n padding: '$10 $0',\n '& .button__content': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n '& .alarms': { paddingTop: '5px' },\n});\n\nexport const ExpandedIcon = styled('div', {\n transition: `all ${EXPANDABLE_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 ConfirmButton = styled('div', {\n display: 'flex',\n});\n\nexport const StyledTextField = styled(TextField, {\n padding: '$0 $15 $15 $15',\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 Wallets = styled('div', { overflow: 'visible', width: '100%' });\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { PropTypes } from './WalletList.type';\nimport type { Wallet } from '../../types';\nimport type { WalletInfo } from '@rango-dev/ui';\nimport type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n Image,\n MessageBox,\n Modal,\n SelectableWallet,\n Typography,\n WalletState,\n} from '@rango-dev/ui';\nimport React, { useEffect, useState } from 'react';\n\nimport { useWallets } from '../..';\nimport { useWalletList } from '../../hooks/useWalletList';\nimport {\n TIME_TO_CLOSE_MODAL,\n TIME_TO_IGNORE_MODAL,\n} from '../../pages/WalletsPage';\nimport { useAppStore } from '../../store/AppStore';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getBlockchainDisplayNameFor } from '../../utils/meta';\nimport {\n getAddress,\n getConciseAddress,\n isExperimentalChain,\n} from '../../utils/wallets';\nimport { WalletModal } from '../WalletModal';\n\nimport { WalletButton } from './ConfirmWallets.styles';\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './WalletList.styles';\n\nexport function WalletList(props: PropTypes) {\n const { chain, isSelected, selectWallet, limit, onShowMore } = props;\n const { config } = useAppStore();\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const { blockchains } = useAppStore();\n const [openWalletStateModal, setOpenWalletStateModal] =\n useState<WalletType>('');\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 let modalTimerId: ReturnType<typeof setTimeout> | null = null;\n const { list, error, handleClick } = useWalletList({\n config,\n chain,\n onBeforeConnect: (type) => {\n modalTimerId = setTimeout(() => {\n setOpenWalletStateModal(type);\n }, TIME_TO_IGNORE_MODAL);\n },\n onConnect: () => {\n if (modalTimerId) {\n clearTimeout(modalTimerId);\n }\n setTimeout(() => {\n setOpenWalletStateModal('');\n }, TIME_TO_CLOSE_MODAL);\n },\n });\n const [sortedList, setSortedList] = useState<WalletInfo[]>(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.querySelector('#swap-box') 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 ? getConciseAddress(address) : '';\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 onClick = () => {\n if (wallet.state === WalletState.DISCONNECTED) {\n void handleClick(wallet.type);\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 <>\n <WalletModal\n open={openWalletStateModal === wallet.type}\n onClose={() => setOpenWalletStateModal('')}\n image={wallet.image}\n state={wallet.state}\n error={error}\n />\n {!!experimentalChainWallet && (\n <Modal\n open={!!experimentalChainWallet && showExperimentalChainModal}\n container={modalContainer}\n onClose={() => {\n setExperimentalChainWallet(null);\n }}>\n <MessageBox\n title={i18n.t({\n id: 'Add {blockchainDisplayName} Chain',\n values: { blockchainDisplayName },\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 },\n })}>\n <Divider size={18} />\n <Divider size={32} />\n <Button\n onClick={addExperimentalChain.bind(\n null,\n experimentalChainWallet\n )}\n variant=\"outlined\"\n type=\"primary\"\n fullWidth\n size=\"large\">\n {i18n.t('Confirm')}\n </Button>\n </MessageBox>\n </Modal>\n )}\n {addingExperimentalChainStatus && (\n <Modal\n open={!!addingExperimentalChainStatus}\n onClose={setAddingExperimentalChainStatus.bind(null, null)}\n container={modalContainer}>\n {addingExperimentalChainStatus === 'in-progress' && (\n <MessageBox\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 icon={\n <LogoContainer>\n <WalletImageContainer>\n <Image src={wallet.image} size={45} />\n </WalletImageContainer>\n <Spinner />\n </LogoContainer>\n }\n />\n )}\n\n {addingExperimentalChainStatus === 'completed' && (\n <MessageBox\n type=\"success\"\n title={i18n.t({\n id: '{blockchainDisplayName} Chain Added',\n values: { blockchainDisplayName },\n })}\n description={i18n.t({\n id: '{blockchainDisplayName} is added to your wallet, you can use it to swap.',\n values: { blockchainDisplayName },\n })}\n />\n )}\n\n {addingExperimentalChainStatus === 'rejected' && (\n <MessageBox\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 )}\n\n <Divider direction=\"vertical\" size={32} />\n </Modal>\n )}\n <SelectableWallet\n key={wallet.type}\n description={connectedWalletDescription}\n onClick={onClick}\n selected={isSelected(wallet.type, chain)}\n {...wallet}\n />\n </>\n );\n })}\n {shouldShowMoreWallets && (\n <WalletButton selected={false} onClick={onShowMore.bind(null)}>\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 </WalletButton>\n )}\n </>\n );\n}\n", "import type { WidgetConfig } from '../types';\nimport type { BlockchainMeta } from 'rango-sdk';\n\nimport { WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport {\n KEPLR_COMPATIBLE_WALLETS,\n type WalletType,\n WalletTypes,\n} from '@rango-dev/wallets-shared';\nimport { useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useWalletsStore } from '../store/wallets';\nimport { configWalletsToWalletName } from '../utils/providers';\nimport {\n isExperimentalChain,\n mapWalletTypesToWalletInfo,\n sortWalletsBasedOnConnectionState,\n} from '../utils/wallets';\n\nconst ALL_SUPPORTED_WALLETS = Object.values(WalletTypes);\n\ninterface Params {\n config?: WidgetConfig;\n chain?: string;\n onBeforeConnect?: (walletType: string) => void;\n onConnect?: (walletType: string) => void;\n}\n\n/**\n * gets list of wallets with their information and an action for handling click callback fo UI\n * we need to share the logic of rendering list of wallets and handle clicking on them in different places\n * you can use this list whenever you need to show the list of wallets and needed callbacks\n */\nexport function useWalletList(params: Params) {\n const { config, chain, onBeforeConnect, onConnect } = params;\n const { state, disconnect, getWalletInfo, connect } = useWallets();\n const { connectedWallets } = useWalletsStore();\n const blockchains = useAppStore().blockchains();\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 walletConnectProjectId: config?.walletConnectProjectId,\n }) || ALL_SUPPORTED_WALLETS;\n\n const wallets = mapWalletTypesToWalletInfo(\n state,\n getWalletInfo,\n listAvailableWalletTypes,\n chain\n );\n\n const sortedWallets = sortWalletsBasedOnConnectionState(wallets);\n const [error, setError] = useState('');\n\n const isExperimentalChainNotAdded = (walletType: string) =>\n !connectedWallets.find(\n (connectedWallet) =>\n connectedWallet.walletType === walletType &&\n connectedWallet.chain === chain\n );\n\n const handleClick = async (type: WalletType) => {\n const wallet = state(type);\n try {\n if (error) {\n setError('');\n }\n if (wallet.connected) {\n await disconnect(type);\n } else {\n const atLeastOneWalletIsConnected = !!wallets.find(\n (w) => w.state === WalletState.CONNECTED\n );\n if (!config?.multiWallets && atLeastOneWalletIsConnected) {\n return;\n }\n onBeforeConnect?.(type);\n await connect(type);\n onConnect?.(type);\n }\n } catch (e) {\n setError('Error: ' + (e as any)?.message);\n }\n };\n\n const disconnectConnectingWallets = () => {\n const connectingWallets =\n wallets?.filter((wallet) => wallet.state === WalletState.CONNECTING) ||\n [];\n for (const wallet of connectingWallets) {\n void disconnect(wallet.type);\n }\n };\n\n useEffect(() => {\n return () => {\n disconnectConnectingWallets();\n };\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 );\n };\n\n return {\n list: sortedWallets.filter(\n (wallet) => !shouldExcludeWallet(wallet.type, chain ?? '', blockchains)\n ),\n error,\n handleClick,\n };\n}\n", "import type { WalletType } from '@rango-dev/wallets-shared';\n\nimport { i18n } from '@lingui/core';\nimport { styled, Typography, Wallet, WalletState } from '@rango-dev/ui';\nimport React, { Fragment, useState } from 'react';\n\nimport { Layout } from '../components/Layout';\nimport { WalletModal } from '../components/WalletModal';\nimport { useWalletList } from '../hooks/useWalletList';\nimport { useAppStore } from '../store/AppStore';\nimport { getContainer } from '../utils/common';\n\nconst ListContainer = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: ' repeat(3, minmax(0, 1fr))',\n alignContent: 'baseline',\n paddingTop: '$15',\n height: '100%',\n});\n\nconst Container = styled('div', {\n textAlign: 'center',\n});\n\nexport const TIME_TO_CLOSE_MODAL = 3_000;\nexport const TIME_TO_IGNORE_MODAL = 300;\n\nexport function WalletsPage() {\n const { config, fetchStatus: fetchMetaStatus } = useAppStore();\n const [openModal, setOpenModal] = useState(false);\n const [selectedWalletType, setSelectedWalletType] = useState<WalletType>('');\n let modalTimerId: ReturnType<typeof setTimeout> | null = null;\n\n const { list, handleClick, error } = useWalletList({\n config,\n onBeforeConnect: (type) => {\n modalTimerId = setTimeout(() => {\n setOpenModal(true);\n setSelectedWalletType(type);\n }, TIME_TO_IGNORE_MODAL);\n },\n onConnect: () => {\n if (modalTimerId) {\n clearTimeout(modalTimerId);\n }\n setTimeout(() => {\n setOpenModal(false);\n }, TIME_TO_CLOSE_MODAL);\n },\n });\n\n const selectedWallet = list.find(\n (wallet) => wallet.type === selectedWalletType\n );\n const selectedWalletImage = selectedWallet?.image || '';\n const selectedWalletState =\n selectedWallet?.state || WalletState.NOT_INSTALLED;\n\n return (\n <Layout\n header={{\n title: i18n.t('Connect Wallets'),\n }}>\n <Container>\n <Typography variant=\"title\" size=\"xmedium\" align=\"center\">\n {i18n.t('Choose a wallet to connect.')}\n </Typography>\n <ListContainer>\n {list.map((wallet, index) => {\n const key = `wallet-${index}-${wallet.type}`;\n return (\n <Fragment key={key}>\n <Wallet\n {...wallet}\n container={getContainer()}\n onClick={(type) => {\n void handleClick(type);\n }}\n isLoading={fetchMetaStatus === 'loading'}\n />\n </Fragment>\n );\n })}\n <WalletModal\n open={!!openModal}\n onClose={() => setOpenModal(false)}\n image={selectedWalletImage}\n state={selectedWalletState}\n error={error}\n />\n </ListContainer>\n </Container>\n </Layout>\n );\n}\n", "import type { PropTypes, Ref } from './Layout.types';\nimport type { PropsWithChildren } from 'react';\n\nimport { BottomLogo, Divider, Header } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useNavigateBack } from '../../hooks/useNavigateBack';\nimport { useUiStore } from '../../store/ui';\nimport { useWalletsStore } from '../../store/wallets';\nimport { getContainer } from '../../utils/common';\nimport { BackButton, CancelButton, WalletButton } from '../HeaderButtons';\n\nimport { Container, Content, Footer } from './Layout.styles';\n\nfunction LayoutComponent(props: PropsWithChildren<PropTypes>, ref: Ref) {\n const {\n children,\n header,\n footer,\n noPadding,\n hasLogo = true,\n fixedHeight = true,\n } = props;\n const connectedWallets = useWalletsStore.use.connectedWallets();\n\n const connectWalletsButtonDisabled =\n useUiStore.use.connectWalletsButtonDisabled();\n const navigateBack = useNavigateBack();\n\n const onConnectWallet = () => {\n if (!connectWalletsButtonDisabled && header.onWallet) {\n header.onWallet();\n }\n };\n\n const showBackButton =\n typeof header.hasBackButton === 'undefined' || header.hasBackButton;\n\n return (\n <Container ref={ref} fixedHeight={fixedHeight} id=\"swap-box\">\n <Header\n prefix={<>{showBackButton && <BackButton onClick={navigateBack} />}</>}\n title={header.title}\n suffix={\n <>\n {header.suffix}\n {header.onWallet && (\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 noPadding={noPadding}>{children}</Content>\n {(hasLogo || footer) && (\n <Footer>\n <div className=\"footer__content\">{footer}</div>\n {hasLogo && (\n <div className=\"footer__logo\">\n <Divider size={12} />\n <BottomLogo />\n </div>\n )}\n </Footer>\n )}\n </Container>\n );\n}\n\nconst Layout = React.forwardRef(LayoutComponent);\nLayout.displayName = 'Layout';\n\nexport { Layout };\n", "import { useNavigate } from 'react-router-dom';\n\nexport function useNavigateBack(): () => void {\n const navigate = useNavigate();\n return () => navigate(-1);\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 { 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});\n\nexport const ConnectedIcon = styled('div', {\n position: 'absolute',\n background: '$secondary500',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary400',\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 width: '$40',\n});\n\nexport const NotificationsBadgeContainer = styled('div', {\n position: 'absolute',\n backgroundColor: '$secondary500',\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});\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 { Tooltip, WalletIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { ConnectedIcon, HeaderButton } from './HeaderButtons.styles';\n\nfunction WalletButton(props: PropTypes) {\n return (\n <Tooltip\n container={props.container}\n side=\"top\"\n content={i18n.t('Connect Wallet')}>\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 { HomeButtonsPropTypes } from './HeaderButtons.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n NotificationsIcon,\n Popover,\n RefreshIcon,\n SettingsIcon,\n Tooltip,\n TransactionIcon,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\nimport { NotificationContent } from '../NotificationContent';\n\nimport { HeaderButton } from './HeaderButtons.styles';\nimport { UnreadNotificationsBadge } from './UnreadNotificationsBadge';\n\nexport function HomeButtons(props: HomeButtonsPropTypes) {\n const {\n layoutRef,\n onClickRefresh,\n onClickHistory,\n onClickSettings,\n onClickNotifications,\n } = props;\n\n return (\n <>\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Refresh')}>\n <HeaderButton\n variant=\"ghost\"\n size=\"small\"\n onClick={onClickRefresh}\n disabled={!onClickRefresh}>\n <RefreshIcon size={16} color={!onClickRefresh ? 'gray' : 'black'} />\n </HeaderButton>\n </Tooltip>\n\n <Tooltip\n container={getContainer()}\n side=\"top\"\n content={i18n.t('Notifications')}>\n <Popover\n align=\"center\"\n collisionBoundary={layoutRef}\n collisionPadding={{ right: 20, left: 20 }}\n container={getContainer()}\n content={<NotificationContent />}>\n <HeaderButton\n size=\"small\"\n variant=\"ghost\"\n onClick={onClickNotifications}>\n <NotificationsIcon size={18} color=\"black\" />\n <UnreadNotificationsBadge />\n </HeaderButton>\n </Popover>\n </Tooltip>\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 <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 </HeaderButton>\n </Tooltip>\n </>\n );\n}\n", "import type { Notification } from '../../types/notification';\n\nimport { i18n } from '@lingui/core';\nimport {\n ChainToken,\n ChevronRightIcon,\n ListItemButton,\n Typography,\n} 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 { useUiStore } from '../../store/ui';\n\nimport { Container, Images, List } from './NotificationContent.styles';\nimport { NotificationNotFound } from './NotificationNotFound';\n\nconst MAX_NOTIFICATIONS_DISPLAYED = 4;\n\nexport function NotificationContent() {\n const navigate = useNavigate();\n const setSelectedSwap = useUiStore.use.setSelectedSwap();\n\n const { getUnreadNotifications } = useNotificationStore();\n\n const notifications: Notification[] = getUnreadNotifications();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const sortedNotification = notifications\n .sort((a, b) => b.creationTime - a.creationTime)\n .slice(0, MAX_NOTIFICATIONS_DISPLAYED);\n\n const handleOnClick = (requestId: Notification['requestId']) => {\n setSelectedSwap(requestId);\n navigate(`${navigationRoutes.swaps}/${requestId}`);\n };\n\n return (\n <Container>\n {sortedNotification.length ? (\n <List>\n {sortedNotification.map((notificationItem) => {\n const fromToken = tokens.find(\n (tokenItem) =>\n tokenItem.address ===\n notificationItem.route.from.tokenAddress &&\n tokenItem.blockchain ===\n notificationItem.route.from.blockchain &&\n tokenItem.symbol === notificationItem.route.from.tokenSymbol\n );\n\n const fromBlockchain = blockchains.find(\n (blockchainItem) =>\n blockchainItem.name === notificationItem.route.from.blockchain\n );\n\n const toToken = tokens.find(\n (tokenItem) =>\n tokenItem.address === notificationItem.route.to.tokenAddress &&\n tokenItem.blockchain === notificationItem.route.to.blockchain &&\n tokenItem.symbol === notificationItem.route.to.tokenSymbol\n );\n\n const toBlockchain = blockchains.find(\n (blockchainItem) =>\n blockchainItem.name === notificationItem.route.to.blockchain\n );\n\n return (\n <ListItemButton\n key={notificationItem.requestId}\n onClick={() => handleOnClick(notificationItem.requestId)}\n title={\n <Typography variant=\"body\" size=\"small\" color=\"$neutral700\">\n {i18n.t(notificationItem.event.message)}\n </Typography>\n }\n id={notificationItem.requestId}\n start={\n <Images>\n <div className=\"from-chain-token\">\n <ChainToken\n tokenImage={fromToken ? fromToken.image : ''}\n chainImage={fromBlockchain ? fromBlockchain.logo : ''}\n size=\"small\"\n />\n </div>\n <div className=\"to-chain-token\">\n <ChainToken\n tokenImage={toToken ? toToken.image : ''}\n chainImage={toBlockchain ? toBlockchain.logo : ''}\n size=\"small\"\n />\n </div>\n </Images>\n }\n end={<ChevronRightIcon size={12} color=\"gray\" />}\n />\n );\n })}\n </List>\n ) : (\n <NotificationNotFound />\n )}\n </Container>\n );\n}\n", "import type { Notification } from '../types/notification';\nimport type {\n Route,\n RouteEvent,\n StepEvent,\n} from '@rango-dev/queue-manager-rango-preset';\n\nimport { create } from 'zustand';\nimport { persist, subscribeWithSelector } from 'zustand/middleware';\n\nimport createSelectors from './selectors';\n\nexport interface NotificationState {\n notifications: Notification[];\n setNotification: (event: RouteEvent | StepEvent, route: Route) => void;\n setAsRead: (requestId: Notification['requestId']) => void;\n getUnreadNotifications: () => Notification[];\n}\n\nexport const useNotificationStore = createSelectors(\n create<NotificationState>()(\n persist(\n subscribeWithSelector((set, get) => ({\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 read: false,\n requestId: route.requestId,\n route: {\n from: {\n blockchain: fromStep.fromBlockchain,\n tokenAddress: fromStep.fromSymbolAddress,\n tokenSymbol: fromStep.fromSymbol,\n },\n to: {\n blockchain: toStep.toBlockchain,\n tokenSymbol: toStep.toSymbol,\n tokenAddress: toStep.toSymbolAddress,\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 setAsRead: (requestId) => {\n set((state) => ({\n notifications: state.notifications.map((notificationItem) =>\n notificationItem.requestId === requestId\n ? { ...notificationItem, read: true }\n : notificationItem\n ),\n }));\n },\n getUnreadNotifications: () => {\n return get().notifications.filter(\n (notificationItem) => !notificationItem.read\n );\n },\n })),\n {\n name: 'notification',\n skipHydration: true,\n }\n )\n )\n);\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n padding: '$10',\n width: '350px',\n minHeight: '150px',\n});\n\nexport const List = styled('ul', {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n\n '.to-chain-token': {\n transform: 'translateX(-3px)',\n },\n});\n\nexport const Images = styled('div', {\n display: 'flex',\n padding: 0,\n alignItems: 'center',\n alignSelf: 'stretch',\n});\n\nexport const NotFoundContainer = styled('div', {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'column',\n padding: '$10',\n width: '100%',\n height: '150px',\n});\n", "import { i18n } from '@lingui/core';\nimport { Divider, NoNotificationIcon, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { NotFoundContainer } from './NotificationContent.styles';\n\nexport function NotificationNotFound() {\n return (\n <NotFoundContainer>\n <NoNotificationIcon color=\"secondary\" size={26} />\n <Divider size={12} />\n <Typography variant=\"body\" size=\"medium\" color=\"neutral700\">\n {i18n.t('You have no notification')}\n </Typography>\n </NotFoundContainer>\n );\n}\n", "import { Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useNotificationStore } from '../../store/notification';\n\nimport { NotificationsBadgeContainer } from './HeaderButtons.styles';\n\nexport function UnreadNotificationsBadge() {\n const { getUnreadNotifications } = useNotificationStore();\n\n const notificationsCount = getUnreadNotifications().length;\n\n return notificationsCount ? (\n <NotificationsBadgeContainer>\n <Typography variant=\"body\" size=\"xsmall\" color=\"$background\">\n {notificationsCount}\n </Typography>\n </NotificationsBadgeContainer>\n ) : null;\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n borderRadius: '$primary',\n overflow: 'hidden !important',\n boxShadow: '15px 15px 15px 0px rgba(0, 0, 0, 0.05)',\n width: '95vw',\n maxWidth: '390px',\n maxHeight: '700px',\n $$color: '$colors$neutral100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral300',\n },\n backgroundColor: '$$color',\n variants: {\n fixedHeight: {\n true: {\n height: '95vh',\n },\n false: {\n height: 'auto',\n },\n },\n },\n});\n\nexport const Content = styled('div', {\n borderTopLeftRadius: '20px',\n borderTopRightRadius: '20px',\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n padding: '$20 $20 $10 $20',\n backgroundColor: '$background',\n position: 'relative',\n overflowY: 'auto',\n overflowX: 'hidden',\n variants: {\n noPadding: {\n true: {\n padding: '0',\n },\n },\n },\n});\n\nexport const Footer = styled('div', {\n backgroundColor: '$background',\n '& .footer__content': {\n padding: '$0 $20',\n },\n '& .footer__logo': {\n padding: '$0 $20 $10 $20',\n },\n});\n", "import type { PropTypes } from './WalletModal.types';\n\nimport { Divider, Modal } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { ModalContent } from './WalletModalContent';\n\nexport function WalletModal(props: PropTypes) {\n const { open, onClose, ...otherProps } = props;\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n container={document.getElementById('swap-box') || document.body}>\n <ModalContent {...otherProps} />\n <Divider direction=\"vertical\" size={32} />\n </Modal>\n );\n}\n", "import type { ModalContentProps } from './WalletModal.types';\n\nimport { i18n } from '@lingui/core';\nimport { Image, MessageBox, WalletState } from '@rango-dev/ui';\nimport React from 'react';\n\nimport {\n LogoContainer,\n Spinner,\n WalletImageContainer,\n} from './WalletModalContent.styles';\n\nexport function ModalContent(props: ModalContentProps) {\n const { state, image, error } = props;\n if (state === 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 { 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 { 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 './QuoteInfo.types';\n\nimport { Divider } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Quote, QuoteSkeleton } from '../../components/Quote';\nimport { QuoteWarningsAndErrors } from '../../components/QuoteWarningsAndErrors';\nimport { useQuoteStore } from '../../store/quote';\nimport { QuoteErrorType } from '../../types';\n\nimport {\n PositionTopAlerts,\n QuoteContainer,\n SkeletonContainer,\n} from './QuoteInfo.styles';\n\nexport function QuoteInfo(props: PropTypes) {\n const {\n quote,\n type,\n loading,\n error,\n warning,\n refetchQuote,\n showWarningModal,\n onOpenWarningModal,\n onCloseWarningModal,\n onConfirmWarningModal,\n onChangeSettings,\n expanded = false,\n alertPosition = 'bottom',\n } = props;\n const { inputAmount, inputUsdValue, outputUsdValue, outputAmount } =\n useQuoteStore();\n\n const noResult =\n error &&\n (error.type === QuoteErrorType.NO_RESULT ||\n error.type === QuoteErrorType.REQUEST_FAILED);\n\n const showQuote = !noResult && quote && quote.result && !loading;\n\n const quoteWarningsAndErrors = (warning || error) && (\n <QuoteWarningsAndErrors\n warning={warning}\n error={error}\n loading={loading}\n refetchQuote={refetchQuote}\n showWarningModal={showWarningModal}\n onOpenWarningModal={onOpenWarningModal}\n onCloseWarningModal={onCloseWarningModal}\n onConfirmWarningModal={onConfirmWarningModal}\n onChangeSettings={onChangeSettings}\n />\n );\n return (\n <>\n {loading && (\n <QuoteContainer>\n <SkeletonContainer paddingTop={alertPosition === 'top'}>\n <QuoteSkeleton type={type} expanded={expanded} />\n </SkeletonContainer>\n </QuoteContainer>\n )}\n\n {alertPosition === 'top' && (\n <PositionTopAlerts>{quoteWarningsAndErrors}</PositionTopAlerts>\n )}\n {showQuote ? (\n <QuoteContainer>\n <Quote\n quote={quote}\n error={error}\n warning={warning}\n type={type}\n expanded={expanded}\n recommended={true}\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 {alertPosition === 'bottom' && (\n <>\n {!warning && !error && <Divider size={16} />}\n {quoteWarningsAndErrors}\n </>\n )}\n </>\n );\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 ChevronDownIcon,\n ChevronRightIcon,\n Divider,\n Image,\n InfoIcon,\n QuoteCost,\n StepDetails,\n TokenAmount,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React, { useLayoutEffect, useRef, useState } from 'react';\n\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 } from '../../utils/common';\nimport {\n getBlockchainShortNameFor,\n getSwapperDisplayName,\n} from '../../utils/meta';\nimport {\n numberToString,\n secondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport { getTotalFeeInUsd } from '../../utils/swap';\n\nimport {\n ChainImageContainer,\n Chains,\n Content,\n EXPANDABLE_QUOTE_TRANSITION_DURATION,\n FrameIcon,\n HorizontalSeparator,\n IconContainer,\n QuoteContainer,\n SummaryContainer,\n} from './Quote.styles';\nimport { QuoteSummary } from './QuoteSummary';\n\nexport function Quote(props: QuoteProps) {\n const {\n quote,\n input,\n output,\n error,\n warning,\n type,\n recommended = true,\n } = props;\n const tokens = useAppStore().tokens();\n const blockchains = useAppStore().blockchains();\n const swappers = useAppStore().swappers();\n\n const [expanded, setExpanded] = useState(props.expanded);\n const quoteRef = useRef<HTMLButtonElement | null>(null);\n const prevExpanded = useRef(expanded);\n const totalFee = numberToString(\n getTotalFeeInUsd(quote.result?.swaps ?? [], tokens),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n );\n const totalTime = secondsToString(totalArrivalTime(quote.result?.swaps));\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 = (swaps: SwapResult[]): Step[] => {\n return swaps.map((swap, index) => {\n let stepState: 'error' | 'warning' | undefined = undefined;\n const stepHasError =\n (error?.type === QuoteErrorType.BRIDGE_LIMIT &&\n error.swap.swapperId === swap.swapperId) ||\n (error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE &&\n error.recommendedSlippages?.has(index));\n const stepHasWarning =\n warning?.type === QuoteWarningType.INSUFFICIENT_SLIPPAGE &&\n warning.recommendedSlippages?.has(index);\n\n if (stepHasError) {\n stepState = 'error';\n } else if (stepHasWarning) {\n stepState = 'warning';\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: getBlockchainShortNameFor(\n swap.from.blockchain,\n blockchains\n ),\n image: swap.from.blockchainLogo,\n },\n price: {\n value:\n index === 0\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 },\n },\n to: {\n token: { displayName: swap.to.symbol, image: swap.to.logo },\n chain: {\n displayName: getBlockchainShortNameFor(\n swap.to.blockchain,\n blockchains\n ),\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 },\n },\n state: stepState,\n alerts:\n stepHasError || stepHasWarning ? (\n <FooterStepAlarm>\n <Alert\n type={stepHasError ? 'error' : 'warning'}\n title={\n error?.type === QuoteErrorType.BRIDGE_LIMIT\n ? error?.recommendation\n : i18n.t('Slippage Error:')\n }\n footer={\n <FooterAlert>\n {error?.type === QuoteErrorType.BRIDGE_LIMIT && (\n <>\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {error.fromAmountRangeError}\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n |\n </Typography>\n <Divider direction=\"horizontal\" size={8} />\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 </>\n )}\n {(error?.type === QuoteErrorType.INSUFFICIENT_SLIPPAGE ||\n warning?.type ===\n QuoteWarningType.INSUFFICIENT_SLIPPAGE) && (\n <Typography\n size=\"xsmall\"\n variant=\"body\"\n color=\"neutral900\">\n {i18n.t({\n id: 'Minimum required slippage is {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 )}\n </FooterAlert>\n }\n />\n </FooterStepAlarm>\n ) : undefined,\n };\n });\n };\n const steps = getQuoteSteps(quote.result?.swaps ?? []);\n const numberOfSteps = steps.length;\n const tooltipContainer = getContainer();\n\n useLayoutEffect(() => {\n if (expanded && !prevExpanded.current && quoteRef.current) {\n setTimeout(() => {\n quoteRef?.current?.scrollIntoView({ behavior: 'smooth' });\n }, EXPANDABLE_QUOTE_TRANSITION_DURATION);\n }\n prevExpanded.current = expanded;\n }, [expanded, prevExpanded]);\n\n return (\n <>\n <SummaryContainer\n recommended={recommended}\n listItem={type === 'list-item'}\n basic={type === 'basic'}>\n <div className=\"summary\">\n <QuoteCost fee={totalFee} time={totalTime} steps={numberOfSteps} />\n {type === 'basic' && (\n <div className=\"basic-info\">\n <FrameIcon>\n <InfoIcon size={12} color=\"gray\" />\n </FrameIcon>\n <Typography\n size=\"small\"\n variant=\"body\"\n style={{ letterSpacing: 0.4 }}>\n {`${roundedInput} ${\n steps[0].from.token.displayName\n } = ${roundedOutput} ${\n steps[steps.length - 1].to.token.displayName\n }`}\n </Typography>\n <Typography\n color=\"$neutral600\"\n ml={2}\n size=\"xsmall\"\n variant=\"body\">\n {`($${roundedOutputUsdValue})`}\n </Typography>\n </div>\n )}\n {type === 'list-item' && (\n <TokenAmount\n type=\"output\"\n direction=\"vertical\"\n price={{ value: roundedOutput, usdValue: roundedOutputUsdValue }}\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 recommended={recommended}\n open={expanded}\n onOpenChange={setExpanded}>\n <Chains\n ref={(ref) => (quoteRef.current = ref)}\n recommended={recommended}\n onClick={() => setExpanded((prevState) => !prevState)}>\n <div>\n {steps.map((step, index) => {\n const key = `item-${index}`;\n const arrow = (\n <IconContainer>\n <ChevronRightIcon\n size={12}\n color=\"black\"\n {...(step.state && {\n color: step.state === 'error' ? 'error' : 'warning',\n })}\n />\n </IconContainer>\n );\n return (\n <React.Fragment key={key}>\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n sideOffset={4}\n content={step.from.chain.displayName}>\n <ChainImageContainer\n state={step.state || steps[index - 1]?.state}>\n <Image src={step.from.chain.image} size={16} />\n </ChainImageContainer>\n </Tooltip>\n {index === numberOfSteps - 1 && (\n <>\n {arrow}\n <Tooltip\n container={tooltipContainer}\n side=\"bottom\"\n sideOffset={4}\n content={step.to.chain.displayName}>\n <ChainImageContainer state={step.state}>\n <Image src={step.to.chain.image} size={16} />\n </ChainImageContainer>\n </Tooltip>\n </>\n )}\n {index !== numberOfSteps - 1 && <>{arrow}</>}\n </React.Fragment>\n );\n })}\n </div>\n <IconContainer orientation={expanded ? 'up' : 'down'}>\n <ChevronDownIcon size={12} color=\"black\" />\n </IconContainer>\n </Chains>\n <Content open={expanded}>\n <HorizontalSeparator />\n <div className=\"steps-details\">\n {steps.map((step, index) => {\n const key = `item-${index}`;\n return (\n <StepDetails\n type=\"quote-details\"\n key={key}\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}\n", "import { styled } from '@rango-dev/ui';\n\nexport const PositionTopAlerts = styled('div', {\n paddingBottom: '$10',\n});\n\nexport const QuoteContainer = styled('div', {\n width: '100%',\n '& .position-top__skeleton': {\n paddingTop: '$10',\n },\n});\n\nexport const SkeletonContainer = styled('div', {\n variants: {\n paddingTop: {\n true: {\n paddingTop: '$10',\n },\n },\n },\n});\n\nexport const FooterStepAlarm = styled('div', {\n paddingBottom: '$15',\n});\n\nexport const FooterAlert = styled('div', {\n width: '100%',\n display: 'flex',\n});\n", "import * as Collapsible from '@radix-ui/react-collapsible';\nimport { darkTheme, Image, styled } from '@rango-dev/ui';\n\nimport { CollapsibleContent } from '../ConfirmWalletsModal/ConfirmWallets.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 cursor: 'default',\n variants: {\n recommended: {\n true: {\n $$color: '$colors$info300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n },\n '& .steps-details': {\n padding: '$10 $15',\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 cursor: 'pointer',\n boxSizing: 'border-box',\n position: 'relative',\n variants: {\n recommended: {\n true: {\n $$color: '$colors$info100',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary600',\n },\n backgroundColor: '$$color',\n '&:hover': {\n backgroundColor: '$$color',\n },\n },\n false: {\n $$color: '$colors$neutral200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral500',\n },\n backgroundColor: '$$color',\n '&:hover': {\n backgroundColor: '$$color',\n },\n },\n },\n basic: { true: { borderTopRightRadius: '0', borderTopLeftRadius: '0' } },\n listItem: {\n true: {},\n false: {},\n },\n },\n\n compoundVariants: [\n {\n listItem: true,\n recommended: true,\n css: {\n '&:hover': {\n $$color: '$colors$secondary200',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary700',\n },\n backgroundColor: '$$color',\n },\n },\n },\n {\n listItem: true,\n recommended: false,\n css: {\n '&:hover': {\n $$color: '$colors$neutral300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral400',\n },\n backgroundColor: '$$color',\n },\n },\n },\n ],\n '& .summary': {\n width: '100%',\n padding: '$15 $15 $10 $15',\n cursor: 'default',\n },\n '& .basic-info': {\n paddingTop: '$10',\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});\n\nexport const Chains = 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 recommended: {\n true: {\n $$color: '$colors$info300',\n [`.${darkTheme} &`]: {\n $$color: '$colors$secondary800',\n },\n backgroundColor: '$$color',\n },\n false: {\n $$color: '$colors$neutral400',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral200',\n },\n backgroundColor: '$$color',\n },\n },\n },\n '& div:nth-child(1)': { display: 'flex' },\n});\n\nexport const ChainImageContainer = styled('div', {\n width: '18px',\n height: '18px',\n borderRadius: '100%',\n border: '1.5px transparent solid',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\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});\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", "import type { PriceImpactWarningLevel, Step } from '@rango-dev/ui';\n\nimport { TokenAmount } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Container } 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 return (\n <Container>\n <TokenAmount\n direction=\"horizontal\"\n label=\"Swap input\"\n type=\"input\"\n price={{ value: from.price.value, usdValue: from.price.usdValue }}\n token={{\n displayName: from.token.displayName,\n image: from.token.image,\n }}\n chain={{ image: from.chain.image }}\n />\n <div className=\"separator\" />\n <TokenAmount\n direction=\"horizontal\"\n label=\"Estimated output\"\n type=\"output\"\n price={{ value: to.price.value, usdValue: to.price.usdValue }}\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 { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n '& .separator': {\n height: '14px',\n marginLeft: '14px',\n position: 'absolute',\n borderLeft: '1px solid $foreground',\n top: '42%',\n },\n});\n", "import type { PropTypes } from './QuoteSkeleton.types';\n\nimport { ChainToken, Divider, NextIcon, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Container, StepSeparator } from './QuoteSkeleton.styles';\n\nfunction StepSkeleton(props: { separator?: boolean }) {\n const { separator = true } = props;\n return (\n <>\n <div className=\"step__title\">\n <Skeleton height={22} width={22} variant=\"circular\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </div>\n <div className=\"step__content\">\n <StepSeparator hideSeparator={!separator} />\n <div className=\"step__tokens\">\n <div className=\"step__token-info\">\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} width={76} variant=\"rounded\" />\n </div>\n <div className=\"step__icon-container\">\n <NextIcon color=\"gray\" size={16} />\n </div>\n <div className=\"step__token-info\">\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} width={76} variant=\"rounded\" />\n </div>\n </div>\n </div>\n </>\n );\n}\n\nexport function QuoteSkeleton(props: PropTypes) {\n const { type, expanded, tag = false } = props;\n const quoteSummary = (\n <div className=\"quote-summary\">\n <div className=\"token-amount\">\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider size={8} direction=\"horizontal\" />\n <div className=\"token-amount__label\">\n <Skeleton height={10} width={60} variant=\"rounded\" />\n <Divider size={4} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </div>\n </div>\n <Skeleton height={12} width={64} variant=\"rounded\" />\n </div>\n );\n\n return (\n <Container rounded={type !== 'basic'}>\n <div className=\"cost-and-tag\">\n <div className=\"cost\">\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 </div>\n {tag && <Skeleton height={22} width={100} variant=\"rounded\" />}\n </div>\n {type === 'basic' && (\n <div className=\"basic-summary\">\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </div>\n )}\n {type === 'list-item' && (\n <div className=\"output\">\n <div className=\"output__token-info\">\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={4} />\n <Skeleton height={15} width={150} variant=\"rounded\" />\n </div>\n <Divider size={4} />\n <Skeleton height={10} width={184} variant=\"rounded\" />\n </div>\n )}\n {type === 'swap-preview' && (\n <>\n <Divider size={4} />\n <div className=\"swap-preview\">\n {quoteSummary}\n <div className=\"quote-summary__separator\" />\n {quoteSummary}\n </div>\n </>\n )}\n <div className=\"chains\">\n <Skeleton height={15} width={321} variant=\"rounded\" />\n </div>\n\n {expanded && (\n <div className=\"steps\">\n <Divider size={20} />\n <StepSkeleton />\n <StepSkeleton />\n <StepSkeleton separator={false} />\n </div>\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 '& .cost-and-tag': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n height: '22px',\n },\n variants: {\n rounded: {\n true: {\n borderRadius: '$xm',\n },\n },\n },\n '& .cost': {\n display: 'flex',\n },\n '& .basic-summary': {\n padding: '$15 $0 14px $0',\n },\n '& .output': {\n padding: '$6 $0 $15 $0',\n display: 'flex',\n flexDirection: 'column',\n },\n '& .output__token-info': {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n paddingBottom: '$5',\n },\n '& .quote-summary': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'end',\n },\n '& .quote-summary__separator': {\n height: '$28',\n marginLeft: '13px',\n borderLeft: '1px solid $neutral700',\n },\n '& .token-amount': {\n display: 'flex',\n justifyContent: 'space-between',\n },\n '& .token-amount__label': {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'start',\n },\n '& .chains': {\n paddingTop: '$2',\n },\n '& .swap-preview': {\n padding: '$15 $0 $15 $0',\n },\n '& .steps': {\n paddingLeft: '$8',\n },\n '& .step__title': {\n display: 'flex',\n alignItems: 'center',\n },\n '& .step__content': {\n display: 'flex',\n alignItems: 'start',\n },\n '& .step__tokens': {\n paddingTop: '$5',\n paddingBottom: '$10',\n display: 'flex',\n alignItems: 'center',\n },\n '& .step__token-info': {\n display: 'flex',\n alignItems: 'center',\n },\n '& .step__icon-container': {\n margin: '$0 $2',\n padding: '$4',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n});\n\nexport const StepSeparator = styled('div', {\n borderLeft: '1px dashed black',\n minHeight: ' 64px',\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 './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 refetchQuote,\n showWarningModal,\n onOpenWarningModal,\n onCloseWarningModal,\n onConfirmWarningModal,\n onChangeSettings,\n } = props;\n\n const warningModalHandlers = {\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\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';\nimport { useSettingsStore } from '../../store/settings';\n\nimport { makeInfo } from './NoResult.helpers';\nimport { Container, Footer, PrefixIcon } from './NoResult.styles';\n\nexport function NoResult(props: PropTypes) {\n const { fetch, error } = props;\n const disabledLiquiditySources =\n useSettingsStore.use.disabledLiquiditySources();\n const toggleAllLiquiditySources =\n useSettingsStore.use.toggleAllLiquiditySources();\n\n const swappers = useAppStore().swappers();\n\n const info = makeInfo(\n error,\n disabledLiquiditySources,\n () => toggleAllLiquiditySources(swappers, true),\n fetch\n );\n\n return (\n <Container>\n <NoRouteIcon size={24} color=\"gray\" />\n <Divider size={4} />\n <Typography variant=\"title\" size=\"small\">\n {errorMessages().noResultError.title}\n </Typography>\n {!!info.description && (\n <Typography\n variant=\"body\"\n size=\"small\"\n align=\"center\"\n color=\"neutral700\">\n {info.description}\n </Typography>\n )}\n <Divider size={4} />\n {!!info.alert && (\n <Footer>\n <Alert\n type={info.alert.type}\n title={info.alert.text}\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\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", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n minHeight: '162px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const Footer = styled('div', {\n width: '100%',\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 Modal,\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';\n\nimport { QuoteErrorsModalItem } from './QuoteErrorsModalItem';\nimport { Flex } from './QuoteWarningsAndErrors.styles';\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: HighValueLossWarning;\n};\n\nexport function HighValueLossWarningModal(props: Props) {\n const { open, onClose, onConfirm, warning } = props;\n const type = warning.warningLevel === 'high' ? 'error' : 'warning';\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 <Modal open={open} onClose={onClose} container={getContainer()}>\n <MessageBox\n type={type}\n title={errorMessages().highValueLossError.impactTitle}\n description={errorMessages().highValueLossError.description}\n />\n\n <Flex>\n <Divider size={20} />\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\n <Divider size={32} />\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n onClick={onConfirm}>\n {errorMessages().highValueLossError.confirmMessage}\n </Button>\n </Modal>\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 paddingTop: '$10',\n});\n\nexport const Flex = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: 10,\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: 'show-info',\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 = null;\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 }\n return alertInfo;\n }\n if (error) {\n alertInfo.alertType = 'error';\n if (error.type === QuoteErrorType.BRIDGE_LIMIT) {\n alertInfo.title = error.recommendation;\n alertInfo.action = 'show-info';\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 return null;\n}\n", "import type {\n HighSlippageWarning,\n InsufficientSlippageWarning,\n} from '../../types';\n\nimport { i18n } from '@lingui/core';\nimport { Button, Divider, MessageBox, Modal, Typography } from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { navigationRoutes } from '../../constants/navigationRoutes';\nimport { useSettingsStore } from '../../store/settings';\nimport { QuoteWarningType } from '../../types';\nimport { getContainer } from '../../utils/common';\n\ntype PropsTypes = {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: InsufficientSlippageWarning | HighSlippageWarning;\n};\n\nexport function SlippageWarningModal(props: PropsTypes) {\n const { customSlippage, slippage } = useSettingsStore();\n const { open, onClose, onConfirm, warning } = props;\n const navigate = useNavigate();\n const userSlippage = customSlippage ?? slippage;\n return (\n <Modal\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 onClick={onConfirm}>\n {i18n.t('Confirm anyway')}\n </Button>\n </MessageBox>\n </Modal>\n );\n}\n", "import type { UnknownPriceWarning } from '../../types';\n\nimport { Button, Divider, MessageBox, Modal, WarningIcon } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { errorMessages } from '../../constants/errors';\nimport { getContainer } from '../../utils/common';\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n warning: UnknownPriceWarning;\n};\n\nexport function UnknownPriceWarningModal(props: Props) {\n const { open, onClose, onConfirm } = props;\n\n return (\n <Modal open={open} onClose={onClose} container={getContainer()}>\n <MessageBox\n type=\"warning\"\n title={errorMessages().unknownPriceError.impactTitle}\n description={errorMessages().unknownPriceError.description}\n />\n\n <Divider size={32} />\n <Button\n type=\"primary\"\n size=\"large\"\n prefix={<WarningIcon />}\n fullWidth\n onClick={onConfirm}>\n {errorMessages().unknownPriceError.confirmMessage}\n </Button>\n </Modal>\n );\n}\n", "import type { ConfirmSwap, Params } from './useConfirmSwap.types';\nimport type { PendingSwapSettings } from '../../types';\nimport type { BestRouteResponse } 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 { useSettingsStore } from '../../store/settings';\nimport { useWalletsStore } from '../../store/wallets';\nimport { createQuoteRequestBody, getWalletsForNewSwap } from '../../utils/swap';\nimport { useFetchQuote } from '../useFetchQuote';\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 setQuote,\n quote: initialQuote,\n customDestination: customDestinationFromStore,\n setQuoteWarningsConfirmed,\n } = useQuoteStore();\n\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n disabledLiquiditySources,\n } = useSettingsStore();\n const { connectedWallets } = useWalletsStore();\n const blockchains = useAppStore().blockchains();\n const tokens = useAppStore().tokens();\n const { experimental } = useAppStore().config;\n const { enableNewLiquiditySources } = useAppStore().config;\n\n const userSlippage = customSlippage || slippage;\n\n const { fetch: fetchQuote, cancelFetch, loading } = useFetchQuote();\n\n useEffect(() => cancelFetch, []);\n\n const fetch: ConfirmSwap['fetch'] = async (params: 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 requestBody = createQuoteRequestBody({\n fromToken,\n toToken,\n inputAmount,\n wallets: connectedWallets,\n selectedWallets,\n excludeLiquiditySources: enableNewLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n initialQuote: initialQuote ?? undefined,\n destination: customDestination,\n });\n if (experimental?.routing) {\n requestBody.experimental = true;\n }\n let currentQuote: BestRouteResponse;\n try {\n currentQuote = await fetchQuote(requestBody).then((response) =>\n throwErrorIfResponseIsNotValid(response)\n );\n setQuote(currentQuote);\n } catch (error: any) {\n const confirmSwapResult = handleQuoteErrors(error);\n return confirmSwapResult;\n }\n\n const swapSettings: PendingSwapSettings = {\n slippage: userSlippage.toString(),\n disabledSwappersGroups: disabledLiquiditySources,\n };\n const swap = calculatePendingSwap(\n inputAmount.toString(),\n currentQuote,\n getWalletsForNewSwap(selectedWallets),\n swapSettings,\n false,\n { blockchains, tokens }\n );\n\n const confirmSwapWarnings = generateWarnings(\n initialQuote ?? undefined,\n currentQuote,\n {\n fromToken,\n toToken,\n meta: { blockchains, tokens },\n selectedWallets,\n userSlippage,\n }\n );\n\n if (confirmSwapWarnings.quoteUpdate) {\n setQuoteWarningsConfirmed(false);\n }\n\n return {\n quote: currentQuote,\n swap,\n error: null,\n warnings: confirmSwapWarnings,\n };\n };\n\n return {\n loading,\n fetch,\n cancelFetch,\n };\n}\n", "import type { BestRouteRequest, BestRouteResponse } from 'rango-sdk';\n\nimport { useRef, useState } from 'react';\n\nimport { httpService } from '../services/httpService';\n\ninterface UseFetchQuote {\n fetch: (requestBody: BestRouteRequest) => Promise<BestRouteResponse>;\n cancelFetch: () => void;\n loading: boolean;\n}\n\nexport function useFetchQuote(): UseFetchQuote {\n const [loading, setLoading] = useState(false);\n const abortController = useRef<AbortController | null>(null);\n const cancel = () => abortController.current?.abort();\n\n const fetch: UseFetchQuote['fetch'] = async (requestBody) => {\n cancel();\n abortController.current = new AbortController();\n\n setLoading(true);\n\n try {\n const res = await httpService().getBestRoute(requestBody, {\n signal: abortController.current.signal,\n });\n abortController.current = null;\n return res;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-useless-catch\n } catch (error: any) {\n throw error;\n } finally {\n setLoading(false);\n }\n };\n return { fetch, loading, cancelFetch: cancel };\n}\n", "import type { ConfirmSwapFetchResult } from './useConfirmSwap.types';\nimport type { ConfirmSwapWarnings, Wallet } from '../../types';\nimport type { BestRouteResponse, BlockchainMeta, 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: BestRouteResponse) {\n if (!response.result) {\n throw new Error(errorMessages().noResultError.title, {\n cause: {\n type: QuoteErrorType.NO_RESULT,\n diagnosisMessage: response.diagnosisMessages?.[0],\n },\n });\n }\n const limitError = hasLimitError(response);\n if (limitError) {\n const { swap, recommendation, fromAmountRangeError } =\n getLimitErrorMessage(response);\n\n throw new Error('bridge limit error', {\n cause: {\n type: QuoteErrorType.BRIDGE_LIMIT,\n swap: swap,\n recommendation,\n fromAmountRangeError,\n },\n });\n }\n\n const recommendedSlippages = checkSlippageErrors(response);\n\n if (recommendedSlippages) {\n const minRequiredSlippage = getMinRequiredSlippage(response);\n throw new Error('', {\n cause: {\n type: QuoteErrorType.INSUFFICIENT_SLIPPAGE,\n recommendedSlippages,\n minRequiredSlippage,\n },\n });\n }\n\n return response;\n}\n\nexport function generateWarnings(\n previousQuote: BestRouteResponse | undefined,\n currentQuote: BestRouteResponse,\n params: {\n fromToken: Token;\n toToken: Token;\n meta: { blockchains: BlockchainMeta[]; tokens: Token[] };\n selectedWallets: Wallet[];\n userSlippage: number;\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 tokens: params.meta.tokens,\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 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 { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\nimport type { PendingSwapStep } from 'rango-types';\n\nimport { i18n } from '@lingui/core';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport { Divider, NotFound, styled } from '@rango-dev/ui';\nimport React, { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { Layout } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { SwapsGroup } from '../components/SwapsGroup';\nimport { NotFoundContainer } from '../components/SwapsGroup/SwapsGroup.styles';\nimport { useUiStore } from '../store/ui';\nimport { groupSwapsByDate } from '../utils/date';\nimport { containsText } from '../utils/numbers';\nimport { getPendingSwaps } from '../utils/queue';\n\nconst Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n height: '100%',\n gap: 15,\n});\n\nconst SwapsGroupContainer = styled('div', {\n overflowY: 'visible',\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: 15,\n height: '100%',\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 setSelectedSwap = useUiStore.use.setSelectedSwap();\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 loading = !state.loadedFromPersistor;\n\n const searchHandler = (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(\n (swap) =>\n containsText(swap.inputAmount, searchedFor) ||\n containsText(swap.status, searchedFor) ||\n isStepContainsText(swap.steps, searchedFor) ||\n containsText(swap.requestId, searchedFor)\n );\n }\n\n const isEmpty = !filteredList?.length && !loading;\n\n return (\n <Layout\n header={{\n title: i18n.t('History'),\n }}>\n <Container>\n <SearchInput\n setValue={setSearchedFor}\n fullWidth\n variant=\"contained\"\n placeholder={i18n.t('Search Transaction')}\n autoFocus\n onChange={searchHandler}\n value={searchedFor}\n />\n <SwapsGroupContainer>\n {isEmpty && (\n <NotFoundContainer>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={\n searchedFor ? i18n.t('Try using different keywords') : ''\n }\n />\n </NotFoundContainer>\n )}\n {!isEmpty && (\n <SwapsGroup\n list={filteredList}\n onSwapClick={(requestId) => {\n setSelectedSwap(requestId);\n navigate(requestId);\n }}\n groupBy={groupSwapsByDate}\n isLoading={loading}\n />\n )}\n </SwapsGroupContainer>\n </Container>\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 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 }}\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", "import type { PropTypes } from './SwapsGroup.types';\n\nimport { i18n } from '@lingui/core';\nimport { Divider, SwapListItem, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { limitDecimalPlaces } from '../../utils/numbers';\n\nimport { Group, SwapList, Time } from './SwapsGroup.styles';\n\nexport function SwapsGroup(props: PropTypes) {\n const { list, onSwapClick, groupBy, isLoading } = props;\n const groups = groupBy ? groupBy(list) : [{ title: 'History', swaps: list }];\n\n if (isLoading) {\n const swaps = [{}, {}];\n\n const loadingGroups = [\n {\n title: 'Today',\n swaps,\n },\n {\n title: 'Last month',\n swaps,\n },\n ];\n return (\n <>\n {loadingGroups.map((group) => (\n <React.Fragment key={group.title}>\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n className=\"group-title\">\n {i18n.t(group.title)}\n </Typography>\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.swaps.map((_, index) => {\n const key = index + group.title;\n return (\n <React.Fragment key={key}>\n <SwapListItem isLoading={true} />\n </React.Fragment>\n );\n })}\n </SwapList>\n </Group>\n </React.Fragment>\n ))}\n </>\n );\n }\n\n return (\n <>\n {groups\n .filter((group) => group.swaps.length > 0)\n .map((group) => (\n <React.Fragment key={group.title}>\n <Group>\n <Time>\n <Typography\n variant=\"label\"\n size=\"medium\"\n className=\"group-title\">\n {i18n.t(group.title)}\n </Typography>\n </Time>\n <Divider size={4} />\n <SwapList>\n {group.swaps.map((swap) => {\n const firstStep = swap.steps[0];\n const lastStep = swap.steps[swap.steps.length - 1];\n return (\n <React.Fragment key={swap.requestId}>\n <SwapListItem\n requestId={swap.requestId}\n creationTime={swap.creationTime}\n status={swap.status}\n onClick={onSwapClick}\n onlyShowTime={group.title === '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: limitDecimalPlaces(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: limitDecimalPlaces(\n lastStep.outputAmount || ''\n ),\n estimatedAmount: limitDecimalPlaces(\n lastStep.expectedOutputAmountHumanReadable || ''\n ),\n },\n }}\n />\n </React.Fragment>\n );\n })}\n </SwapList>\n </Group>\n </React.Fragment>\n ))}\n </>\n );\n}\n", "import { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Group = styled('div', {\n width: '100%',\n display: 'flex',\n flexDirection: 'column',\n '.group-title': {\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/SwapsGroup/SwapsGroup.types';\nimport type { PendingSwap } from '@rango-dev/queue-manager-rango-preset';\n\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: 'Today',\n swaps: [],\n },\n ],\n [\n 'month',\n {\n title: 'Last month',\n swaps: [],\n },\n ],\n [\n 'year',\n {\n title: 'Last year',\n swaps: [],\n },\n ],\n [\n 'history',\n {\n title: 'History',\n swaps: [],\n },\n ],\n ]);\n\n const now = dayjs();\n swaps.forEach((swap) => {\n const swapDate = dayjs(Number(swap.creationTime));\n if (now.isSame(swapDate, 'day')) {\n output.get('today')?.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 output.get('history')?.swaps.push(swap);\n }\n });\n\n return Array.from(output.values());\n};\n", "import { Manager } from '@rango-dev/queue-manager-core';\nimport {\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 { i18n } from '@lingui/core';\nimport { Button, styled, SwapInput, WarningIcon } from '@rango-dev/ui';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { HomeButtons } from '../components/HeaderButtons';\nimport { Layout } from '../components/Layout';\nimport { SwitchFromAndToButton } from '../components/SwitchFromAndTo';\nimport { errorMessages } from '../constants/errors';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport {\n BALANCE_MAX_DECIMALS,\n BALANCE_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 { QuoteInfo } from '../containers/QuoteInfo';\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 { numberToString } from '../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../utils/quote';\nimport { canComputePriceImpact, getSwapButtonState } from '../utils/swap';\nimport { getBalanceFromWallet } from '../utils/wallets';\n\nconst Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflowY: 'visible',\n '& .quote__container': {\n paddingTop: '$2',\n },\n});\n\nconst FromContainer = styled('div', {\n position: 'relative',\n});\n\nconst InputsContainer = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n gap: 5,\n alignSelf: 'stretch',\n});\nexport function Home() {\n const navigate = useNavigate();\n const {\n fetch: fetchQuote,\n loading: fetchingQuote,\n error: quoteError,\n warning: quoteWarning,\n } = useSwapInput();\n const {\n fromToken,\n fromBlockchain,\n toToken,\n toBlockchain,\n setInputAmount,\n inputAmount,\n inputUsdValue,\n outputAmount,\n outputUsdValue,\n quote,\n resetQuoteWallets,\n setQuoteWarningsConfirmed,\n } = useQuoteStore();\n\n const fetchMetaStatus = useAppStore().fetchStatus;\n\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const setCurrentPage = useUiStore.use.setCurrentPage();\n const [showQuoteWarningModal, setShowQuoteWarningModal] = useState(false);\n const layoutRef = useRef<HTMLDivElement>(null);\n\n const needsToWarnEthOnPath = false;\n\n const priceImpactInputCanNotBeComputed = !canComputePriceImpact(\n quote,\n inputAmount,\n inputUsdValue\n );\n\n const priceImpactOutputCanNotBeComputed = !canComputePriceImpact(\n quote,\n inputAmount,\n outputUsdValue\n );\n\n const swapButtonState = getSwapButtonState({\n fetchMetaStatus,\n fetchingQuote,\n inputAmount,\n quote,\n anyWalletConnected: connectedWallets.length > 0,\n error: quoteError,\n warning: quoteWarning,\n needsToWarnEthOnPath,\n });\n\n const tokenBalance =\n !!fromBlockchain && !!fromToken\n ? numberToString(\n getBalanceFromWallet(\n connectedWallets,\n fromBlockchain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.amount || '0',\n BALANCE_MIN_DECIMALS,\n BALANCE_MAX_DECIMALS\n )\n : '0';\n\n const tokenBalanceReal =\n !!fromBlockchain && !!fromToken\n ? numberToString(\n getBalanceFromWallet(\n connectedWallets,\n fromBlockchain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.amount || '0',\n getBalanceFromWallet(\n connectedWallets,\n fromBlockchain?.name,\n fromToken?.symbol,\n fromToken?.address\n )?.decimal\n )\n : '0';\n\n useEffect(() => {\n setCurrentPage(navigationRoutes.home);\n resetQuoteWallets();\n return setCurrentPage.bind(null, '');\n }, []);\n\n const percentageChange =\n !inputUsdValue || !outputUsdValue || !outputUsdValue.gt(0)\n ? null\n : getPriceImpact(inputUsdValue.toString(), outputUsdValue.toString());\n\n return (\n <Layout\n ref={layoutRef}\n fixedHeight={false}\n hasLogo\n footer={\n <Button\n type=\"primary\"\n size=\"large\"\n disabled={swapButtonState.disabled}\n prefix={\n swapButtonState.action === 'confirm-warning' && <WarningIcon />\n }\n fullWidth\n onClick={() => {\n if (swapButtonState.action === 'connect-wallet') {\n navigate(navigationRoutes.wallets);\n } else if (swapButtonState.action === 'confirm-warning') {\n setShowQuoteWarningModal(true);\n } else {\n navigate(navigationRoutes.confirmSwap);\n }\n }}>\n {swapButtonState.title}\n </Button>\n }\n header={{\n onWallet: () => {\n navigate(navigationRoutes.wallets);\n },\n hasBackButton: false,\n title: i18n.t('Swap'),\n suffix: (\n <HomeButtons\n layoutRef={layoutRef.current}\n onClickRefresh={!!quote || quoteError ? fetchQuote : undefined}\n onClickHistory={() => navigate(navigationRoutes.swaps)}\n onClickSettings={() => navigate(navigationRoutes.settings)}\n />\n ),\n }}>\n <Container>\n <InputsContainer>\n <FromContainer>\n <SwapInput\n label={i18n.t('From')}\n mode=\"From\"\n onInputChange={setInputAmount}\n balance={tokenBalance}\n chain={{\n displayName: fromBlockchain?.displayName || '',\n image: fromBlockchain?.logo || '',\n }}\n token={{\n displayName: fromToken?.symbol || '',\n image: fromToken?.image || '',\n }}\n onClickToken={() => navigate(navigationRoutes.fromSwap)}\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 error: priceImpactInputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n onSelectMaxBalance={() => {\n if (tokenBalance !== '0') {\n setInputAmount(tokenBalanceReal.split(',').join(''));\n }\n }}\n />\n <SwitchFromAndToButton />\n </FromContainer>\n <SwapInput\n sharpBottomStyle={!!quote?.result || 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 error: priceImpactOutputCanNotBeComputed\n ? errorMessages().unknownPriceError.impactTitle\n : undefined,\n }}\n onClickToken={() => navigate(navigationRoutes.toSwap)}\n disabled={fetchMetaStatus === 'failed'}\n loading={fetchMetaStatus === 'loading'}\n />\n </InputsContainer>\n <div className=\"quote__container\">\n <QuoteInfo\n quote={quote}\n loading={fetchingQuote}\n error={quoteError}\n warning={quoteWarning}\n type=\"basic\"\n refetchQuote={fetchQuote}\n showWarningModal={showQuoteWarningModal}\n onOpenWarningModal={() => setShowQuoteWarningModal(true)}\n onCloseWarningModal={() => setShowQuoteWarningModal(false)}\n onConfirmWarningModal={() => {\n setShowQuoteWarningModal(false);\n setQuoteWarningsConfirmed(true);\n navigate(navigationRoutes.confirmSwap);\n }}\n onChangeSettings={() => navigate(navigationRoutes.settings)}\n />\n </div>\n </Container>\n </Layout>\n );\n}\n", "import { ReverseIcon, styled } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { useQuoteStore } from '../store/quote';\n\nconst SwitchButtonContainer = styled('div', {\n position: 'absolute',\n bottom: '-12px',\n left: '50%',\n transform: 'translate(-50%, 10%)',\n cursor: 'pointer',\n});\n\nconst 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 '&:hover': {\n color: '$secondary500',\n },\n});\n\nexport function SwitchFromAndToButton() {\n const switchFromAndTo = useQuoteStore.use.switchFromAndTo();\n\n return (\n <SwitchButtonContainer>\n <StyledButton\n onClick={() => {\n switchFromAndTo();\n }}>\n <ReverseIcon size={12} />\n </StyledButton>\n </SwitchButtonContainer>\n );\n}\n", "import type { QuoteError, QuoteWarning } from '../types';\nimport type { Token } from 'rango-sdk';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useQuoteStore } from '../store/quote';\nimport { useSettingsStore } from '../store/settings';\nimport { QuoteErrorType } from '../types';\nimport { debounce } from '../utils/common';\nimport { isPositiveNumber } from '../utils/numbers';\nimport { generateQuoteWarnings } from '../utils/quote';\nimport { createQuoteRequestBody } from '../utils/swap';\nimport { tokensAreEqual } from '../utils/wallets';\n\nimport {\n handleQuoteErrors,\n throwErrorIfResponseIsNotValid,\n} from './useConfirmSwap/useConfirmSwap.helpers';\nimport { useFetchQuote } from './useFetchQuote';\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: () => void;\n loading: boolean;\n error: QuoteError | null;\n warning: QuoteWarning | null;\n};\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(): UseSwapInput {\n const { fetch: fetchQuote, cancelFetch } = useFetchQuote();\n const { liquiditySources, enableNewLiquiditySources, experimental } =\n useAppStore().config;\n const tokens = useAppStore().tokens();\n const {\n fromToken,\n toToken,\n inputAmount,\n inputUsdValue,\n resetQuote,\n setQuote,\n } = useQuoteStore();\n const {\n slippage,\n customSlippage,\n affiliatePercent,\n affiliateRef,\n affiliateWallets,\n disabledLiquiditySources,\n } = useSettingsStore();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<QuoteError | null>(null);\n const [warning, setWarning] = useState<QuoteWarning | null>(null);\n const userSlippage = customSlippage ?? slippage;\n const hasTokensValue = !fromToken || !toToken;\n const shouldSkipRequest =\n hasTokensValue ||\n tokensAreEqual(fromToken, toToken) ||\n !isPositiveNumber(inputAmount);\n\n const resetState = (loading: boolean) => {\n setLoading(loading);\n setError(null);\n setWarning(null);\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 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,\n excludeLiquiditySources,\n disabledLiquiditySources,\n slippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n });\n if (experimental?.routing) {\n requestBody.experimental = true;\n }\n fetchQuote(requestBody)\n .then((res) => {\n setLoading(false);\n setQuote(res);\n throwErrorIfResponseIsNotValid(res);\n const quoteWarning = generateQuoteWarnings(res, {\n fromToken,\n toToken,\n userSlippage,\n tokens,\n });\n setWarning(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 setError(quoteError);\n setLoading(false);\n }\n });\n }\n };\n\n const debouncedFetch = useCallback(\n debounce((params: FetchQuoteParams) => {\n if (!shouldSkipRequest) {\n fetch(params);\n }\n }, DEBOUNCE_DELAY),\n [shouldSkipRequest]\n );\n\n useEffect(() => {\n if (!isPositiveNumber(inputAmount) || inputUsdValue?.eq(0)) {\n resetState(false);\n cancelFetch();\n return;\n }\n if (shouldSkipRequest) {\n return;\n }\n resetQuote();\n resetState(true);\n debouncedFetch({\n inputAmount,\n fromToken,\n toToken,\n liquiditySources,\n excludeLiquiditySources: enableNewLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n });\n return cancelFetch;\n }, [\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 enableNewLiquiditySources,\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: enableNewLiquiditySources,\n disabledLiquiditySources,\n slippage: userSlippage,\n affiliateRef,\n affiliatePercent,\n affiliateWallets,\n }),\n loading,\n error,\n warning,\n };\n}\n", "import { i18n } from '@lingui/core';\nimport {\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Layout } from '../components/Layout';\nimport { SettingsContainer } from '../components/SettingsContainer';\nimport { useLanguage } from '../hooks/useLanguage';\n\nexport function LanguagePage() {\n const { activeLanguage, changeLanguage, languages } = useLanguage();\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: () => changeLanguage(languageItem.local),\n end: <Radio value={local} />,\n start: <SVGFlag />,\n };\n });\n\n return (\n <Layout\n header={{\n title: i18n.t('Language'),\n }}>\n <SettingsContainer>\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 </SettingsContainer>\n </Layout>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const SettingsContainer = styled('div', {\n height: '100%',\n overflow: 'hidden',\n});\n\nexport const LiquiditySourceList = styled('ul', {\n padding: '$15 $5 0',\n margin: 0,\n listStyle: 'none',\n height: '100%',\n overflowY: 'auto',\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 type { LanguageItem } from '../constants/languages';\n\nimport { type Language } from '@rango-dev/ui';\n\nimport { DEFAULT_LANGUAGE, LANGUAGES } from '../constants/languages';\nimport { useSettingsStore } from '../store/settings';\n\ninterface UseLanguage {\n languages: LanguageItem[];\n defaultLanguage: Language;\n activeLanguage: Language;\n changeLanguage: (language?: Language) => void;\n}\n\nexport function useLanguage(): UseLanguage {\n const language = useSettingsStore.use.language();\n const setLanguage = useSettingsStore.use.setLanguage();\n const languages = LANGUAGES;\n const defaultLanguage = DEFAULT_LANGUAGE;\n\n return {\n activeLanguage: language,\n languages,\n defaultLanguage,\n changeLanguage: (language) => setLanguage(language || DEFAULT_LANGUAGE),\n };\n}\n", "import type {\n LiquiditySourceType,\n UniqueSwappersGroupType,\n} from '../utils/settings';\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 } from '../components/Layout';\nimport { LoadingLiquiditySourceList } from '../components/LoadingLiquiditySourceList';\nimport { SearchInput } from '../components/SearchInput';\nimport {\n LiquiditySourceList,\n LiquiditySourceSuffix,\n NotFoundContainer,\n SettingsContainer,\n} from '../components/SettingsContainer';\nimport { useAppStore } from '../store/AppStore';\nimport { useSettingsStore } from '../store/settings';\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 [searchedFor, setSearchedFor] = useState<string>('');\n const toggleLiquiditySource = useSettingsStore.use.toggleLiquiditySource();\n const supportedUniqueSwappersGroups: Array<UniqueSwappersGroupType> =\n getUniqueSwappersGroups(swappers);\n\n const validTypes: Array<LiquiditySourceType> = [];\n if (sourceType === 'Exchanges') {\n validTypes.push('DEX');\n }\n if (sourceType === 'Bridges') {\n validTypes.push('BRIDGE');\n validTypes.push('AGGREGATOR');\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: () => toggleLiquiditySource(groupTitle),\n end: <Checkbox checked={selected} />,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t(groupTitle)}\n </Typography>\n ),\n ...sourceItem,\n };\n });\n\n const searchHandler = (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 {i18n.t(hasSelectAll ? 'Deselect all' : 'Select all')}\n </Button>\n </LiquiditySourceSuffix>\n ),\n }}>\n <SettingsContainer>\n <SearchInput\n value={searchedFor}\n setValue={setSearchedFor}\n fullWidth\n color=\"light\"\n variant=\"contained\"\n placeholder={i18n.t('Search {sourceType}', { sourceType })}\n onChange={searchHandler}\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>\n {filteredList.map((sourceItem) => {\n return (\n <React.Fragment key={sourceItem.id}>\n <ListItemButton\n style={{ height: '61px' }}\n {...sourceItem}\n selected={false}\n hasDivider\n />\n </React.Fragment>\n );\n })}\n </LiquiditySourceList>\n )\n )}\n </SettingsContainer>\n </Layout>\n );\n}\n", "import { Checkbox, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { LiquiditySourceList } from '../SettingsContainer';\n\nimport { CustomeListItem } from './LoadingLiquiditySourceList.styles';\n\nconst ITEM_SKELETON_COUNT = 30;\nexport function LoadingLiquiditySourceList() {\n return (\n <LiquiditySourceList>\n {Array.from(Array(ITEM_SKELETON_COUNT), (e) => (\n <CustomeListItem\n hasDivider\n key={e}\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 { ListItem, styled } from '@rango-dev/ui';\n\nexport const CustomeListItem = styled(ListItem, {\n height: 61,\n});\n", "import { i18n } from '@lingui/core';\nimport {\n Divider,\n getCountCategories,\n SelectableCategoryList\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\n\nimport { BlockchainList } from '../components/BlockchainList';\nimport { Layout } 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';\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().fetchStatus;\n\n const blockchains = useAppStore().blockchains({\n type: type\n });\n\n const countActiveCategories = getCountCategories(blockchains);\n\n const showCategory = countActiveCategories !== 1;\n\n return (\n <Layout\n header={{\n title: i18n.t(`Select Blockchain`)\n }}>\n <Divider size={12} />\n\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 searchedFor={searchedFor}\n blockchainCategory={blockchainCategory}\n onChange={(blockchain) => {\n if (type === 'source') {\n setFromBlockchain(blockchain);\n } else {\n setToBlockchain(blockchain);\n }\n navigateBack();\n }}\n />\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 { Container, List } from './BlockchainList.styles';\nimport { LoadingBlockchainList } from './LoadingBlockchainList';\n\nexport function BlockchainList(props: PropTypes) {\n const { list, searchedFor, onChange, blockchainCategory } = 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 <>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </>\n );\n }\n return (\n <List 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 <Container>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={4} />\n {fetchStatus === 'loading' && <LoadingBlockchainList />}\n {fetchStatus === 'success' && renderList()}\n </Container>\n );\n}\n", "import { BlockchainCategories } from '@rango-dev/ui';\nimport { type BlockchainMeta, TransactionType } from 'rango-sdk';\n\nimport { containsText } from '../../utils/common';\n\nexport const filterByType = (\n blockchain: BlockchainMeta,\n type: string\n): boolean => {\n switch (type) {\n case BlockchainCategories.ALL:\n return true;\n case BlockchainCategories.UTXO:\n return blockchain.type === TransactionType.TRANSFER;\n case BlockchainCategories.OTHER:\n return (\n blockchain.type !== TransactionType.TRANSFER &&\n blockchain.type !== TransactionType.COSMOS &&\n blockchain.type !== TransactionType.EVM\n );\n default:\n return blockchain.type === type;\n }\n};\n\nexport const filterBlockchains = (\n list: BlockchainMeta[],\n searchedFor: string,\n blockchainType: string\n) =>\n list\n .filter((blockchain) => filterByType(blockchain, blockchainType))\n .filter(\n (blockchain) =>\n containsText(blockchain.name, searchedFor) ||\n containsText(blockchain.displayName, searchedFor)\n );\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n});\n\nexport const List = styled('ul', {\n padding: 0,\n margin: 0,\n listStyle: 'none',\n overflowY: 'auto',\n paddingRight: '$5',\n '.image-container': {\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 } from '../components/Layout';\nimport { SearchInput } from '../components/SearchInput';\nimport { TokenList } from '../components/TokenList/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';\nimport { getTokensBalanceFromWalletAndSort } from '../utils/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 { connectedWallets } = useWalletsStore();\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: type,\n });\n const tokens = useAppStore().tokens({\n type,\n blockchain: selectedBlockchainName,\n searchFor: searchedFor,\n });\n const tokensList = getTokensBalanceFromWalletAndSort(\n tokens,\n connectedWallets\n );\n\n // Actions\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\n return (\n <Layout\n header={{\n title: i18n.t('Swap {type}', { type }),\n }}>\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={tokensList}\n selectedBlockchain={selectedBlockchainName}\n searchedFor={searchedFor}\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 </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 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';\n\nimport { Container } 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 <div>\n <Divider size={12} />\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Blockchain')}\n </Typography>\n <Divider size={12} />\n <Container>\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 <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 ))}\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 </Container>\n </div>\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 { useSettingsStore } from '../../store/settings';\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 } = useSettingsStore();\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 Container = styled('div', {\n display: 'grid',\n gap: '$10',\n gridTemplateColumns: 'repeat(6, minmax(0, 1fr))',\n});\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type {\n PropTypes,\n RenderDescProps,\n TokenWithBalance,\n} from './TokenList.types';\nimport type { CommonProps } from 'react-window';\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, { forwardRef, useEffect, useState } from 'react';\n\nimport { useAppStore } from '../../store/AppStore';\nimport { useWalletsStore } from '../../store/wallets';\nimport { generateRangeColors } from '../../utils/colors';\n\nimport { LoadingTokenList } from './LoadingTokenList';\nimport {\n BalanceContainer,\n Container,\n End,\n ImageSection,\n List,\n Pin,\n Tag,\n TagTitle,\n Title,\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=\"description\">\n {name ? (\n <div className=\"token-name\">{name}</div>\n ) : (\n <Title className=\"token-title\">\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={`token-address ${!name && 'token-address-without-name'}`}>\n <a\n href={url}\n target=\"_blank\"\n rel=\"nofollow noreferrer\"\n onClick={(e) => e.stopPropagation()}>\n {length > 10\n ? `${address.slice(0, 5)}...${address.slice(length - 6, length)}`\n : address}{' '}\n <ExternalLinkIcon color=\"gray\" size={12} />\n </a>\n </div>\n )}\n </div>\n );\n};\n\nexport function TokenList(props: PropTypes) {\n const { list, searchedFor = '', onChange, selectedBlockchain } = props;\n\n const [tokens, setTokens] = useState<TokenWithBalance[]>(list);\n const fetchStatus = useAppStore().fetchStatus;\n const blockchains = useAppStore().blockchains();\n const [hasNextPage, setHasNextPage] = useState<boolean>(true);\n const loadingWallet = useWalletsStore.use.loading();\n const { isTokenPinned } = useAppStore();\n\n // eslint-disable-next-line react/display-name\n const innerElementType: React.FC<CommonProps> = forwardRef((render, ref) => {\n return (\n <div\n {...render}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref={ref as any}\n style={{\n ...render.style,\n height: `${parseFloat(render.style?.height as string) + 8 * 2}px`,\n }}\n />\n );\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]);\n\n const renderList = () => {\n if (!tokens.length && !!searchedFor) {\n return (\n <>\n <Divider size={32} />\n <NotFound\n title={i18n.t('No results found')}\n description={i18n.t('Try using different keywords')}\n />\n </>\n );\n }\n return (\n <VirtualizedList\n Item={({ index, style }) => {\n const token = tokens[index];\n\n const address = token.address || '';\n const blockchain = blockchains.find(\n (blockchain) => blockchain.name === token.blockchain\n );\n const color = generateRangeColors(\n token.symbol,\n blockchain?.color || ''\n );\n\n const customCssForTag = {\n $$color: color[`${token.symbol}100`],\n [`.${darkTheme} &`]: {\n $$color: color[`${token.symbol}900`],\n },\n backgroundColor: '$$color',\n };\n\n const customCssForTagTitle = {\n $$color: color[`${token.symbol}700`],\n [`.${darkTheme} &`]: {\n $$color: color[`${token.symbol}100`],\n },\n color: '$$color',\n };\n\n return (\n <div\n style={{\n ...style,\n paddingRight: 5,\n }}>\n <ListItemButton\n style={{\n height: style?.height,\n }}\n tab-index={index}\n key={`${token.symbol}${token.address}`}\n id={`${token.symbol}${token.address}`}\n hasDivider\n onClick={() => onChange(tokens[index])}\n start={\n <ImageSection>\n <Image src={token.image} size={30} />\n {isTokenPinned(token) && (\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={\n loadingWallet ? (\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 tokens[index]?.balance && (\n <BalanceContainer>\n <Typography variant=\"title\" size=\"small\">\n {token.balance?.amount}\n </Typography>\n <div />\n {token.balance?.usdValue && (\n <Typography\n variant=\"body\"\n className=\"usd-value\"\n size=\"xsmall\">\n {`$${token.balance?.usdValue}`}\n </Typography>\n )}\n </BalanceContainer>\n )\n )\n }\n />\n </div>\n );\n }}\n hasNextPage={hasNextPage}\n itemCount={tokens.length}\n loadNextPage={loadNextPage}\n innerElementType={innerElementType}\n size={60}\n key={`${selectedBlockchain}-${searchedFor}`}\n />\n );\n };\n\n return (\n <Container>\n <Typography variant=\"label\" size=\"large\">\n {i18n.t('Select Token')}\n </Typography>\n <Divider size={4} />\n {fetchStatus === 'loading' && <LoadingTokenList size={PAGE_SIZE} />}\n {fetchStatus === 'success' && <List>{renderList()}</List>}\n </Container>\n );\n}\n", "import type { WidgetColors, WidgetColorsKeys } from '../types';\n\nexport const colorShade = (col: string, amt: number) => {\n const RANGE = 255;\n const COL = 3;\n const RADIX = 16;\n\n col = col.replace(/^#/, '');\n if (col.length === COL) {\n col = col[0] + col[0] + col[1] + col[1] + col[2] + col[2];\n }\n let [r, g, b]: any = col.match(/.{2}/g);\n [r, g, b] = [\n parseInt(r, RADIX) + amt,\n parseInt(g, RADIX) + amt,\n parseInt(b, RADIX) + amt,\n ];\n\n r = Math.max(Math.min(RANGE, r), 0).toString(RADIX);\n g = Math.max(Math.min(RANGE, g), 0).toString(RADIX);\n b = Math.max(Math.min(RANGE, b), 0).toString(RADIX);\n\n const rr = (r.length < 2 ? '0' : '') + r;\n const gg = (g.length < 2 ? '0' : '') + g;\n const bb = (b.length < 2 ? '0' : '') + b;\n\n return `#${rr}${gg}${bb}`;\n};\n\nexport const generateRangeColors = (name: string, color: string) => {\n const NUMBER_OF_COLORS = 10;\n const HALF_NUMBER_OF_COLORS = 5;\n const COLOR_SUFFIX = 100;\n const AMT = 25;\n\n let colors = { [name]: color };\n for (let i = 1; i < NUMBER_OF_COLORS; i++) {\n if (i < HALF_NUMBER_OF_COLORS) {\n colors = {\n ...colors,\n [name + i * COLOR_SUFFIX]: colorShade(\n color,\n (HALF_NUMBER_OF_COLORS - i) * AMT\n ),\n };\n }\n if (i === HALF_NUMBER_OF_COLORS) {\n colors = {\n ...colors,\n [name + i * COLOR_SUFFIX]: color,\n };\n }\n if (i > HALF_NUMBER_OF_COLORS) {\n colors = {\n ...colors,\n [name + i * COLOR_SUFFIX]: colorShade(\n color,\n -((i - HALF_NUMBER_OF_COLORS) * AMT)\n ),\n };\n }\n }\n\n return colors;\n};\nexport const generateColors = (\n mainColors: { [x: string]: string },\n reverseNeutralRange: boolean,\n colors?: WidgetColors\n) => {\n if (!colors || !Object.entries(colors).length) {\n return {};\n }\n let changeColors = false;\n let listOfColors = { ...mainColors };\n for (const colorKey in colors) {\n const color = colors[colorKey as WidgetColorsKeys];\n\n if (!!color && color !== mainColors[colorKey]) {\n changeColors = true;\n if (colorKey === 'background' || colorKey === 'foreground') {\n listOfColors = {\n ...listOfColors,\n [colorKey]: color,\n };\n } else if (colorKey === 'neutral' && reverseNeutralRange) {\n const range = generateRangeColors(colorKey, color);\n listOfColors = {\n ...listOfColors,\n // Reverse the neutral shade\n [`${colorKey}100`]: range[`${colorKey}900`],\n [`${colorKey}200`]: range[`${colorKey}800`],\n [`${colorKey}300`]: range[`${colorKey}700`],\n [`${colorKey}400`]: range[`${colorKey}600`],\n [`${colorKey}500`]: range[`${colorKey}500`],\n [`${colorKey}600`]: range[`${colorKey}400`],\n [`${colorKey}700`]: range[`${colorKey}300`],\n [`${colorKey}800`]: range[`${colorKey}200`],\n [`${colorKey}900`]: range[`${colorKey}100`],\n };\n } else {\n listOfColors = {\n ...listOfColors,\n ...generateRangeColors(colorKey, color),\n };\n }\n }\n }\n return changeColors ? listOfColors : {};\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 { darkTheme, styled, Typography } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\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 '& li': {\n alignItems: 'none',\n '.description': {\n position: 'relative',\n height: 12,\n width: 150,\n '.token-title': {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n bottom: '-8px',\n },\n\n '.token-address': {\n transform: 'translateY(12px)',\n visibility: 'hidden',\n '& a': {\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 },\n '.token-name': {\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 },\n },\n '&:hover': {\n '.description': {\n '.token-address': {\n position: 'absolute',\n transform: 'none',\n transition: 'transform 225ms cubic-bezier(0, 0, 0.2, 1) 0ms',\n visibility: 'visible',\n },\n '.token-address-without-name': {\n bottom: '-15px',\n },\n '.token-name': {\n position: 'absolute',\n transform: 'translateY(-12px)',\n visibility: 'hidden',\n },\n '.token-title': {\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\n '.usd-value': {\n $$color: '$colors$neutral600',\n [`.${darkTheme} &`]: {\n $$color: '$colors$neutral700',\n },\n color: '$$color',\n },\n});\n\nexport const End = styled('ul', {\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 '.image-container': {\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", "import { i18n } from '@lingui/core';\nimport {\n ChevronRightIcon,\n Divider,\n InfoIcon,\n List,\n ListItemButton,\n Skeleton,\n Switch,\n Tooltip,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { Layout } from '../components/Layout';\nimport { SettingsContainer } from '../components/SettingsContainer';\nimport { Slippage } from '../components/Slippage';\nimport { SlippageTooltipContainer as TooltipContainer } from '../components/Slippage/Slippage.styles';\nimport { navigationRoutes } from '../constants/navigationRoutes';\nimport { useAppStore } from '../store/AppStore';\nimport { useSettingsStore } from '../store/settings';\nimport { getContainer } from '../utils/common';\nimport { getUniqueSwappersGroups } from '../utils/settings';\n\nexport function SettingsPage() {\n const navigate = useNavigate();\n const { theme } = useAppStore().config;\n const fetchStatus = useAppStore().fetchStatus;\n const swappers = useAppStore().swappers();\n\n const infiniteApprove = useSettingsStore.use.infiniteApprove();\n const toggleInfiniteApprove = useSettingsStore.use.toggleInfiniteApprove();\n\n const supportedUniqueSwappersGroups = getUniqueSwappersGroups(swappers);\n\n const bridgeSources = supportedUniqueSwappersGroups.filter(\n (uniqueItem) =>\n uniqueItem.type === 'BRIDGE' || uniqueItem.type === 'AGGREGATOR'\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 const totalExchangeSources = exchangeSources.length;\n const totalSelectedExchangeSources = exchangeSources.filter(\n (uniqueItem) => uniqueItem.selected\n ).length;\n\n const handleEndItem = (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('Enabled bridges')}\n </Typography>\n ),\n end: (\n <>\n {handleEndItem(totalSelectedBridgeSources, totalBridgeSources)}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"black\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.bridges),\n };\n\n const exchangeItem = {\n id: 'exchange-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Enabled exchanges')}\n </Typography>\n ),\n end: (\n <>\n {handleEndItem(totalSelectedExchangeSources, totalExchangeSources)}\n <Divider direction=\"horizontal\" size={8} />\n <ChevronRightIcon color=\"gray\" />\n </>\n ),\n onClick: () => navigate(navigationRoutes.exchanges),\n };\n\n /*\n * const languageItem = {\n * id: 'language-item',\n * title: (\n * <Typography variant=\"title\" size=\"xmedium\">\n * {i18n.t('Language')}\n * </Typography>\n * ),\n * end: <ChevronRightIcon color=\"gray\" />,\n * onClick: () => navigate(navigationRoutes.languages),\n * };\n */\n\n const themeItem = {\n id: 'theme-item',\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Theme')}\n </Typography>\n ),\n end: <ChevronRightIcon color=\"gray\" />,\n onClick: () => navigate(navigationRoutes.themes),\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 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 end: <Switch checked={infiniteApprove} />,\n onClick: toggleInfiniteApprove,\n };\n\n const settingItems = [\n bridgeItem,\n exchangeItem,\n // languageItem\n ];\n if (!theme?.singleTheme) {\n settingItems.push(themeItem);\n }\n settingItems.push(infiniteApprovalItem);\n\n return (\n <Layout\n header={{\n title: i18n.t('Setting'),\n }}>\n <SettingsContainer>\n <Slippage />\n <List\n type={\n <ListItemButton title=\"_\" id=\"_\" onClick={() => console.log()} />\n }\n items={settingItems}\n />\n </SettingsContainer>\n </Layout>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n Chip,\n Divider,\n InfoIcon,\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 { useSettingsStore } from '../../store/settings';\nimport { getContainer } from '../../utils/common';\n\nimport { BaseContainer, Head, SlippageChipsContainer } from './Slippage.styles';\nimport { SlippageTooltipContent } from './SlippageTooltipContent';\n\nexport function Slippage() {\n const slippage = useSettingsStore.use.slippage();\n const setSlippage = useSettingsStore.use.setSlippage();\n const customSlippage = useSettingsStore.use.customSlippage();\n const setCustomSlippage = useSettingsStore.use.setCustomSlippage();\n\n return (\n <BaseContainer>\n <Head>\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 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 <>\n <Chip\n style={{ width: '64px', flexShrink: 0 }}\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 <Divider direction=\"horizontal\" size={8} />\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 || ''}\n color=\"dark\"\n onChange={(event) => {\n const parsedValue = parseFloat(event.target.value);\n if (\n !parsedValue ||\n (parsedValue >= MIN_SLIPPGAE && parsedValue <= MAX_SLIPPAGE)\n ) {\n setCustomSlippage(parsedValue);\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 { styled } from '@rango-dev/ui';\n\nexport const BaseContainer = styled('div', {\n paddingTop: '$5',\n paddingBottom: '30px',\n});\n\nexport const SlippageChipsContainer = styled('div', {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'start',\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: '300px',\n padding: '$10',\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. and only that step will be reverted, not the whole transaction'\n )}\n </Typography>\n </SlippageTooltipContainer>\n );\n}\n", "import { cancelSwap } from '@rango-dev/queue-manager-rango-preset';\nimport { useManager } from '@rango-dev/queue-manager-react';\nimport React from 'react';\n\nimport { SwapDetails } from '../components/SwapDetails';\nimport { SwapDetailsPlaceholder } from '../components/SwapDetails/SwapDetails.Placeholder';\nimport { useNavigateBack } from '../hooks/useNavigateBack';\nimport { useAppStore } from '../store/AppStore';\nimport { useUiStore } from '../store/ui';\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 = useUiStore.use.selectedSwapRequestId();\n const navigateBack = useNavigateBack();\n const { fetchStatus: fetchMetaStatus } = useAppStore();\n\n const showSkeleton = loading || fetchMetaStatus === 'loading';\n\n const selectedSwap = pendingSwaps.find(\n ({ swap }) => swap.requestId === requestId\n );\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 PendingSwapNetworkStatus,\n} from '@rango-dev/queue-manager-rango-preset';\nimport {\n Button,\n CopyIcon,\n Divider,\n IconButton,\n QuoteCost,\n StepDetails,\n Typography,\n useCopyToClipboard,\n} from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\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 {\n numberToString,\n secondsToString,\n totalArrivalTime,\n} from '../../utils/numbers';\nimport { getPriceImpact, getPriceImpactLevel } from '../../utils/quote';\nimport {\n getLastConvertedTokenInFailedSwap,\n getSwapMessages,\n shouldRetrySwap,\n} from '../../utils/swap';\nimport { getSwapDate } from '../../utils/time';\nimport { getConciseAddress, getUsdPrice } from '../../utils/wallets';\nimport { SuffixContainer } from '../HeaderButtons/HeaderButtons.styles';\nimport { Layout } from '../Layout';\nimport { QuoteSummary } from '../Quote';\nimport {\n SwapDetailsCompleteModal,\n SwapDetailsModal,\n} from '../SwapDetailsModal';\n\nimport { getSteps, getStepState, RESET_INTERVAL } from './SwapDetails.helpers';\nimport { Container, HeaderDetails, StepsList } 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 tokens = useAppStore().tokens();\n const retry = useQuoteStore.use.retry();\n const navigate = useNavigate();\n const [_, 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 getUnreadNotifications =\n useNotificationStore.use.getUnreadNotifications();\n const setAsRead = useNotificationStore.use.setAsRead();\n const unreadNotifications = getUnreadNotifications();\n const currentStep = getCurrentStep(swap);\n const currentStepNetworkStatus = currentStep?.networkStatus;\n\n useEffect(() => {\n const existNotification = unreadNotifications.find(\n (n) => n.requestId === swap.requestId\n );\n if (existNotification) {\n if (swap.status === 'success' || swap.status === 'failed') {\n setShowCompletedModal(swap.status);\n setAsRead(swap.requestId);\n }\n }\n }, [swap.status]);\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 });\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 String(\n parseFloat(\n numberToString(\n outputAmount,\n TOKEN_AMOUNT_MIN_DECIMALS,\n TOKEN_AMOUNT_MAX_DECIMALS\n )\n ) *\n (getUsdPrice(\n lastStep.toBlockchain,\n lastStep.toSymbol,\n lastStep.toSymbolAddress,\n tokens\n ) || 0)\n ),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const inputUsdValue = numberToString(\n String(\n parseFloat(swap.inputAmount) *\n (getUsdPrice(\n firstStep.fromBlockchain,\n firstStep.fromSymbol,\n firstStep.fromSymbolAddress,\n tokens\n ) || 0)\n ),\n USD_VALUE_MIN_DECIMALS,\n USD_VALUE_MAX_DECIMALS\n );\n\n const percentageChange = getPriceImpact(inputUsdValue, outputUsdValue);\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 : `${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 }`;\n\n return (\n <Layout\n noPadding\n header={{\n title: i18n.t('Swap and Bridge'),\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 retry(swap, { blockchains: blockchains, tokens: tokens });\n setTimeout(() => {\n const home = '../../';\n navigate(home);\n }, 0);\n }}>\n {i18n.t('Try again')}\n </Button>\n )\n }>\n <Container>\n <HeaderDetails>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className=\"request-id\">\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n {requestId}\n </Typography>\n <IconButton\n variant=\"ghost\"\n onClick={handleCopy.bind(null, requestId || '')}>\n <CopyIcon size={16} color=\"gray\" />\n </IconButton>\n </div>\n </div>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${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=\"output\">\n <QuoteCost\n fee={numberToString(\n String(totalFee),\n GAS_FEE_MIN_DECIMALS,\n GAS_FEE_MAX_DECIMALS\n )}\n time={secondsToString(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 },\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 },\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=\"title-steps\">\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 />\n );\n })}\n </StepsList>\n </Container>\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 />\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 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-dev/queue-manager-rango-preset';\n\nimport { i18n } from '@lingui/core';\n\nconst MILLISECOND_PER_SECOND = 1000;\nconst SECONDS_PER_YEAR = 31536000;\nconst SECONDS_PER_MONTH = 2592000;\nconst SECONDS_PER_DAY = 86400;\nconst SECONDS_PER_HOUR = 3600;\nconst SECONDS_PER_MINUTE = 60;\n\nexport function timeSince(millisecond: number): string {\n const seconds = Math.floor(\n (Date.now() - millisecond) / MILLISECOND_PER_SECOND\n );\n\n const intervals = [\n {\n turningPoint: SECONDS_PER_YEAR,\n label: i18n.t('year'),\n pluralLabel: i18n.t('years'),\n },\n {\n turningPoint: SECONDS_PER_MONTH,\n label: i18n.t('month'),\n pluralLabel: i18n.t('months'),\n },\n {\n turningPoint: SECONDS_PER_DAY,\n label: i18n.t('day'),\n pluralLabel: i18n.t('days'),\n },\n {\n turningPoint: SECONDS_PER_HOUR,\n label: i18n.t('hour'),\n pluralLabel: i18n.t('hours'),\n },\n {\n turningPoint: SECONDS_PER_MINUTE,\n label: i18n.t('minute'),\n pluralLabel: i18n.t('minutes'),\n },\n ];\n\n const sortedIntervals = intervals.sort(\n (a, b) => b.turningPoint - a.turningPoint\n );\n\n for (const interval of sortedIntervals) {\n const { turningPoint, label, pluralLabel } = interval;\n const intervalCount = Math.floor(seconds / turningPoint);\n if (intervalCount > 1) {\n return `${intervalCount} ${pluralLabel}`;\n }\n if (intervalCount === 1) {\n return `${intervalCount} ${label}`;\n }\n }\n\n if (seconds > 1) {\n return `${seconds} ${i18n.t('seconds')}`;\n }\n\n return `${seconds} ${i18n.t('second')}`;\n}\n\nexport function getSwapDate(pendingSwap: PendingSwap) {\n return pendingSwap.finishTime\n ? i18n.t({\n id: '{time} ago',\n values: { time: timeSince(parseInt(pendingSwap.finishTime)) },\n })\n : i18n.t({\n id: '{time} ago',\n values: { time: timeSince(parseInt(pendingSwap.creationTime)) },\n });\n}\n", "import type { ModalPropTypes } from './SwapDetailsModal.types';\n\nimport { PendingSwapNetworkStatus } from '@rango-dev/queue-manager-rango-preset';\nimport { Modal } from '@rango-dev/ui';\nimport React from 'react';\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 { state, onClose, onDelete, onCancel, currentStepWallet, message } =\n props;\n\n const showWalletStateContent =\n state === PendingSwapNetworkStatus.WaitingForNetworkChange ||\n state === PendingSwapNetworkStatus.WaitingForConnectingWallet ||\n state === PendingSwapNetworkStatus.NetworkChanged;\n\n return (\n <Modal\n open={!!state}\n onClose={onClose}\n container={document.getElementById('swap-box') || document.body}>\n {showWalletStateContent && (\n <WalletStateContent\n type={modalNetworkValues[state].type}\n title={modalNetworkValues[state].title}\n currentStepWallet={currentStepWallet}\n message={message}\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 </Modal>\n );\n}\n", "import type { CancelContentProps } 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 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 <Typography variant=\"title\" size=\"medium\" color=\"neutral100\">\n {i18n.t('Yes, Cancel it')}\n </Typography>\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, Continue')}\n </Typography>\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 <Typography variant=\"title\" size=\"medium\" color=\"neutral100\">\n {i18n.t('Yes, Delete it')}\n </Typography>\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-dev/queue-manager-rango-preset';\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';\n\nimport { MessageBox, Wallet, WalletState } from '@rango-dev/ui';\nimport { useWallets } from '@rango-dev/wallets-react';\nimport React from 'react';\n\nimport { getContainer } from '../../utils/common';\n\nimport { WalletContainer } from './SwapDetailsModal.styles';\n\nexport const WalletStateContent = (props: WalletStateContentProps) => {\n const { type, title, currentStepWallet, message, showWalletButton } = props;\n const { connect, getWalletInfo, state: walletState } = useWallets();\n const walletType = currentStepWallet?.walletType;\n const isConnected = walletType && walletState(walletType).connected;\n const state = isConnected ? WalletState.CONNECTED : WalletState.DISCONNECTED;\n return (\n <>\n <MessageBox type={type} title={title} description={message} />\n {showWalletButton && walletType && (\n <WalletContainer>\n <Wallet\n container={getContainer()}\n title={getWalletInfo(walletType).name}\n image={getWalletInfo(walletType).img}\n type={walletType}\n state={state}\n onClick={async () => connect(walletType)}\n />\n </WalletContainer>\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", "import type { CompleteModalPropTypes } from './SwapDetailsModal.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n Button,\n Divider,\n MessageBox,\n Modal,\n TokenAmount,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nexport function SwapDetailsCompleteModal(props: CompleteModalPropTypes) {\n const {\n open,\n onClose,\n status,\n priceValue,\n usdValue,\n token,\n chain,\n percentageChange,\n description,\n diagnosisUrl,\n } = props;\n const navigate = useNavigate();\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n container={document.getElementById('swap-box') || document.body}>\n {status === 'success' ? (\n <MessageBox type=\"success\" title={i18n.t('Swap Successful')}>\n <TokenAmount\n direction=\"vertical\"\n type=\"output\"\n centerAlign={true}\n price={{\n value: priceValue,\n usdValue,\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 <Typography variant=\"title\" size=\"medium\" color=\"primary\">\n {i18n.t('Diagnosis')}\n </Typography>\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 </Modal>\n );\n}\n", "import type { GetStep } from '../SwapDetailsAlerts';\nimport type { PendingSwapStep } from '@rango-dev/queue-manager-rango-preset';\nimport type { Step, StepDetailsProps } from '@rango-dev/ui';\n\nimport React from 'react';\n\nimport {\n TOKEN_AMOUNT_MAX_DECIMALS,\n TOKEN_AMOUNT_MIN_DECIMALS,\n} from '../../constants/routing';\nimport { getBlockchainShortNameFor } 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 = ({ swap, blockchains, ...args }: GetStep): Step[] => {\n const hasAlreadyProceededToSign = swap.hasAlreadyProceededToSign !== false;\n return swap.steps.map((step, index) => {\n const amountToConvert =\n index === 0 ? swap.inputAmount : swap.steps[index - 1].outputAmount;\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 },\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 },\n },\n swapper: { displayName: step.swapperId, image: step.swapperLogo ?? '' },\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 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 = (lastUrl && inProgress) || waitingForApproval;\n const error = lastUrl && step.status === 'failed';\n\n return (\n <Fragment key={key}>\n <Alert\n type={(loading && 'loading') || (error && 'error') || 'success'}\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={16} />\n </IconButton>\n )\n }\n />\n </Fragment>\n );\n })}\n {((inProgress && !hasAlreadyProceededToSign) ||\n (waitingForApproval && !step.explorerUrl?.length)) && (\n <Alert type=\"loading\" title={message.shortMessage} />\n )}\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 {\n Alert,\n ChevronDownIcon,\n ChevronUpIcon,\n IconButton,\n} from '@rango-dev/ui';\nimport React, { useState } from 'react';\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 action={\n message.detailedMessage.content && (\n <IconButton\n onClick={() => setShowContentError((prev) => !prev)}\n variant=\"ghost\"\n size=\"xsmall\">\n {showContentError ? (\n <ChevronUpIcon size={12} color=\"gray\" />\n ) : (\n <ChevronDownIcon size={12} color=\"gray\" />\n )}\n </IconButton>\n )\n }\n footer={showContentError ? message.detailedMessage.content : undefined}\n />\n );\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", "import type { WaningAlertsProps } from './SwapDetailsAlerts.types';\n\nimport { i18n } from '@lingui/core';\nimport { PendingSwapNetworkStatus } from '@rango-dev/queue-manager-rango-preset';\nimport { Alert, Button } from '@rango-dev/ui';\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 { darkTheme, styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n display: 'flex',\n width: '100%',\n flexDirection: 'column',\n alignItems: 'center',\n height: '0',\n flexGrow: 1,\n '& .row': {\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 '& .request-id': {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '$24',\n },\n '& .output': {\n display: 'flex',\n width: '100%',\n padding: '$15 $20 $20',\n flexDirection: 'column',\n alignItems: 'start',\n },\n '& .title-steps': {\n textAlign: 'left',\n width: '100%',\n padding: '0 $20 $10',\n },\n});\n\nexport const HeaderDetails = styled('div', {\n width: '100%',\n});\n\nexport const StepsList = styled('div', {\n padding: '$0 $20 $20 $20',\n width: '100%',\n overflow: 'auto',\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", "import type { SwapDetailsPlaceholderPropTypes } from './SwapDetails.types';\n\nimport { i18n } from '@lingui/core';\nimport {\n CopyIcon,\n IconButton,\n NotFound,\n Skeleton,\n Typography,\n} 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 HeaderDetails,\n PlaceholderContainer,\n} from './SwapDetails.styles';\n\nexport function SwapDetailsPlaceholder(props: SwapDetailsPlaceholderPropTypes) {\n const { requestId, showSkeleton } = props;\n\n return (\n <Layout\n noPadding\n header={{\n title: i18n.t('Swap and Bridge'),\n suffix: <SuffixContainer />,\n }}>\n {showSkeleton && (\n <Container>\n <HeaderDetails>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Request ID')}:`}\n </Typography>\n <div className=\"request-id\">\n <Typography variant=\"label\" size=\"small\" color=\"neutral700\">\n <Skeleton width={60} height={10} variant=\"rounded\" />\n </Typography>\n <IconButton variant=\"ghost\">\n <CopyIcon size={16} color=\"gray\" />\n </IconButton>\n </div>\n </div>\n <div className=\"row\">\n <Typography variant=\"label\" size=\"large\" color=\"neutral700\">\n {`${i18n.t('Created at')}:`}\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 { ChainToken, Divider, Skeleton, Typography } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Container, StepSeparator } from './LoadingSwapDetails.styles';\nimport { LoadingSwapDetailStep } from './LoadingSwapDetailStep';\n\nexport function LoadingSwapDetails() {\n const quoteSummary = (\n <div className=\"quote-summary-item\">\n <div className=\"token-amount\">\n <ChainToken loading size=\"medium\" chainImage=\"\" tokenImage=\"\" />\n <Divider size={8} direction=\"horizontal\" />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </div>\n <Skeleton height={12} width={64} variant=\"rounded\" />\n </div>\n );\n\n return (\n <Container>\n <div className=\"cost\">\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 </div>\n\n <div className=\"quote-summary\">\n {quoteSummary}\n <div className=\"quote-summary-separator\"></div>\n {quoteSummary}\n </div>\n\n <div className=\"swaps-steps\">\n <Typography variant=\"title\" size=\"small\">\n {i18n.t('Swaps steps')}\n </Typography>\n </div>\n\n <div className=\"step-container\">\n <LoadingSwapDetailStep extraInfo />\n <StepSeparator />\n <LoadingSwapDetailStep />\n <StepSeparator />\n <LoadingSwapDetailStep />\n <StepSeparator />\n <LoadingSwapDetailStep />\n </div>\n </Container>\n );\n}\n", "import { styled } from '@rango-dev/ui';\n\nexport const Container = styled('div', {\n width: '100%',\n height: '100%',\n padding: '$0 $20',\n\n '.cost': {\n paddingTop: '$15',\n display: 'flex',\n },\n\n '.quote-summary': {\n padding: '$15 $0',\n },\n\n '.quote-summary-item': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n\n '.token-amount': {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n\n '.quote-summary-separator': {\n width: '0px',\n height: '$16',\n borderLeft: '1px solid $neutral400',\n marginLeft: '13px',\n },\n\n '.swaps-steps': {\n paddingBottom: '$10',\n },\n});\n\nexport const StepContainer = styled('div', {\n backgroundColor: '$neutral100',\n borderRadius: '$xm',\n padding: '$10 $15',\n\n '.step-title': {\n display: 'flex',\n justifyContent: 'start',\n alignItems: 'center',\n },\n '.step-tokens': {\n paddingTop: '$5',\n display: 'flex',\n alignItems: 'center',\n },\n '.step-token-info': {\n display: 'flex',\n alignItems: 'center',\n },\n '.step-icon-container': {\n padding: '$4 $6',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n },\n\n '.extra-info': {\n display: 'flex',\n paddingTop: '$10',\n paddingBottom: '$5',\n },\n});\nexport const StepSeparator = styled('div', {\n width: '0px',\n height: '$20',\n borderLeft: '1px dashed $neutral700',\n marginLeft: '25px',\n});\n", "import type { StepSkeletonPropsTypes } from './LoadingSwapDetails.types';\n\nimport { ChainToken, Divider, NextIcon, Skeleton } from '@rango-dev/ui';\nimport React from 'react';\n\nimport { StepContainer } from './LoadingSwapDetails.styles';\n\nexport function LoadingSwapDetailStep(props: StepSkeletonPropsTypes) {\n const { extraInfo } = props;\n return (\n <StepContainer>\n <div className=\"step-title\">\n <Skeleton height={28} width={28} variant=\"circular\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={15} width={148} variant=\"rounded\" />\n </div>\n <div className=\"step-tokens\">\n <Divider direction=\"horizontal\" size={20} />\n <div className=\"step-token-info\">\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} width={76} variant=\"rounded\" />\n </div>\n <div className=\"step-icon-container\">\n <NextIcon color=\"gray\" size={16} />\n </div>\n <div className=\"step-token-info\">\n <ChainToken size=\"small\" loading chainImage=\"\" tokenImage=\"\" />\n <Divider direction=\"horizontal\" size={8} />\n <Skeleton height={12} width={76} variant=\"rounded\" />\n </div>\n </div>\n {extraInfo && (\n <div className=\"extra-info\">\n <Divider direction=\"horizontal\" size={20} />\n <Skeleton height={22} width={297} variant=\"rectangular\" />\n </div>\n )}\n </StepContainer>\n );\n}\n", "import { i18n } from '@lingui/core';\nimport {\n AutoThemeIcon,\n DarkModeIcon,\n LightModeIcon,\n List,\n ListItemButton,\n Radio,\n RadioRoot,\n Typography,\n} from '@rango-dev/ui';\nimport React from 'react';\n\nimport { Layout } from '../components/Layout';\nimport { SettingsContainer } from '../components/SettingsContainer';\nimport { useSettingsStore } from '../store/settings';\n\ntype Theme = 'dark' | 'light' | 'auto';\n\nenum Mode {\n DARK = 'dark',\n LIGHT = 'light',\n AUTO = 'auto',\n}\n\nexport function ThemePage() {\n const theme = useSettingsStore.use.theme();\n const setTheme = useSettingsStore.use.setTheme();\n\n const themesList = [\n {\n id: Mode.LIGHT,\n value: Mode.LIGHT,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Light')}\n </Typography>\n ),\n onClick: () => setTheme(Mode.LIGHT as Theme),\n start: <LightModeIcon color=\"gray\" />,\n end: <Radio value={Mode.LIGHT} />,\n },\n {\n id: Mode.DARK,\n value: Mode.DARK,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Dark')}\n </Typography>\n ),\n onClick: () => setTheme(Mode.DARK as Theme),\n start: <DarkModeIcon color=\"gray\" />,\n end: <Radio value={Mode.DARK} />,\n },\n {\n id: Mode.AUTO,\n value: Mode.AUTO,\n title: (\n <Typography variant=\"title\" size=\"xmedium\">\n {i18n.t('Auto')}\n </Typography>\n ),\n onClick: () => setTheme(Mode.AUTO as Theme),\n start: <AutoThemeIcon color=\"gray\" />,\n end: <Radio value={Mode.AUTO} />,\n },\n ];\n\n return (\n <Layout\n header={{\n title: i18n.t('Theme'),\n }}>\n <SettingsContainer>\n <RadioRoot\n onValueChange={(value) => setTheme(value as Theme)}\n value={theme}>\n <List\n type={\n <ListItemButton\n title={i18n.t('Theme')}\n id=\"_\"\n onClick={() => console.log()}\n />\n }\n items={themesList}\n />\n </RadioRoot>\n </SettingsContainer>\n </Layout>\n );\n}\n", "import {\n isApprovalTX,\n MainEvents,\n RouteEventType,\n StepEventType,\n StepExecutionEventStatus,\n useEvents,\n} from '@rango-dev/queue-manager-rango-preset';\nimport { useEffect } from 'react';\n\nimport { useAppStore } from '../store/AppStore';\nimport { useNotificationStore } from '../store/notification';\nimport { useWalletsStore } from '../store/wallets';\nimport { validBlockedStatuses } from '../types/notification';\n\nexport function WidgetEvents() {\n const tokens = useAppStore().tokens();\n const connectedWallets = useWalletsStore.use.connectedWallets();\n const getWalletsDetails = useWalletsStore.use.getWalletsDetails();\n const setNotification = useNotificationStore.use.setNotification();\n const setAsRead = useNotificationStore.use.setAsRead();\n const widgetEvents = useEvents();\n\n useEffect(() => {\n widgetEvents.on(MainEvents.StepEvent, (widgetEvent) => {\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], tokens);\n toAccount && getWalletsDetails([toAccount], tokens);\n }\n if (\n (event.type === StepEventType.TX_EXECUTION_BLOCKED &&\n validBlockedStatuses.includes(event.status)) ||\n event.type === StepEventType.FAILED\n ) {\n setNotification(event, route);\n } else if (\n event.type === StepEventType.TX_EXECUTION ||\n event.type === StepEventType.CHECK_STATUS\n ) {\n setAsRead(route.requestId);\n }\n });\n\n return () => widgetEvents.all.clear();\n }, [widgetEvents, connectedWallets.length]);\n\n useEffect(() => {\n widgetEvents.on(MainEvents.RouteEvent, (widgetEvent) => {\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\n return () => widgetEvents.all.clear();\n }, [widgetEvents, connectedWallets.length]);\n\n return null;\n}\n", "import {\n type Route,\n type RouteEvent,\n type Step,\n type StepEvent,\n StepExecutionBlockedEventStatus,\n} from '@rango-dev/queue-manager-rango-preset';\n\ntype NotificationRoute = {\n from: {\n blockchain: Step['fromBlockchain'];\n tokenSymbol: Step['fromSymbol'];\n tokenAddress: Step['fromSymbolAddress'];\n };\n to: {\n blockchain: Step['toBlockchain'];\n tokenSymbol: Step['toSymbol'];\n tokenAddress: Step['toSymbolAddress'];\n };\n};\n\nexport type Notification = Pick<Route, 'requestId'> & {\n event: RouteEvent | StepEvent;\n creationTime: number;\n read: boolean;\n route: NotificationRoute;\n};\n\nexport const validBlockedStatuses: StepExecutionBlockedEventStatus[] = [\n StepExecutionBlockedEventStatus.WAITING_FOR_CHANGE_WALLET_ACCOUNT,\n StepExecutionBlockedEventStatus.WAITING_FOR_NETWORK_CHANGE,\n StepExecutionBlockedEventStatus.WAITING_FOR_WALLET_CONNECT,\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 \"url('https://fonts.cdnfonts.com/css/times-new-roman')\",\n ],\n })();\n", "/* eslint-disable @typescript-eslint/no-magic-numbers */\nimport type { WidgetTheme } from '../types';\n\nimport {\n createTheme,\n darkTheme as defaultDarkTheme,\n lightTheme as defaultLightTheme,\n} from '@rango-dev/ui';\nimport { useEffect, useState } from 'react';\n\nimport { useSettingsStore } from '../store/settings';\nimport {\n DEFAULT_FONT_FAMILY,\n DEFAULT_PRIMARY_RADIUS,\n DEFAULT_SECONDARY_RADIUS,\n} from '../utils/configs';\nimport { customizedThemeTokens } from '../utils/ui';\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 mode = 'auto',\n } = props;\n\n const [OSTheme, setOSTheme] = useState('light');\n const theme = useSettingsStore.use.theme();\n const setTheme = useSettingsStore.use.setTheme();\n\n const { dark, light } = customizedThemeTokens(colors);\n\n const baseTheme = createTheme({\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 (\n window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches\n ) {\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 useEffect(() => {\n if (mode !== 'auto') {\n setTheme(mode);\n }\n }, [mode]);\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 return theme === 'dark' ? darkClassNames : lightClassNames;\n };\n\n return { activeTheme: getActiveTheme };\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';\n\nimport { generateColors } from '../utils/colors';\nimport { toHash } from '../utils/hash';\n\nimport { THEME_CLASS_NAME_PREFIX } from './configs';\n\ninterface CustomizedThemeValues {\n id: string;\n tokens: Parameters<typeof createTheme>[0];\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\n const darkColorsWithDefaults = generateColors(\n {\n ...baseColors,\n ...defaultDarkColors,\n },\n true,\n colors?.dark\n );\n const lightColorsWithDefaults = generateColors(\n baseColors,\n false,\n colors?.light\n );\n const hasDefaultDarkColors = Object.keys(darkColorsWithDefaults).length > 0;\n const hasDefaultLightColors = Object.keys(lightColorsWithDefaults).length > 0;\n\n let light: CustomizedTheme['light'] = undefined;\n let dark: CustomizedTheme['dark'] = undefined;\n\n if (hasDefaultLightColors) {\n const tokens = { colors: lightColorsWithDefaults };\n const id = `${THEME_CLASS_NAME_PREFIX}-light-${toHash(tokens)}`;\n light = {\n id,\n tokens,\n };\n }\n if (hasDefaultDarkColors) {\n const tokens = {\n colors: darkColorsWithDefaults,\n };\n const id = `${THEME_CLASS_NAME_PREFIX}-dark-${toHash(tokens)}`;\n dark = {\n id,\n tokens,\n };\n }\n\n return {\n light,\n dark,\n };\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 { styled } from '@rango-dev/ui';\n\nexport const MainContainer = styled('div', {\n width: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n fontFamily: '$widget',\n boxSizing: 'border-box',\n '& *, *::before, *::after': {\n boxSizing: 'inherit',\n listStyleType: 'none',\n },\n '& *:focus-visible': {\n outlineColor: '$info500',\n transition: 'none',\n },\n});\n", "import type { PropTypes } from './WidgetProvider.types';\nimport type { PropsWithChildren } from 'react';\n\nimport React, { useMemo } from 'react';\n\nimport { DEFAULT_BASE_URL, RANGO_PUBLIC_API_KEY } from '../../constants';\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 useMemo(() => {\n initConfig({\n API_KEY: config?.apiKey || RANGO_PUBLIC_API_KEY,\n BASE_URL: config?.apiUrl || DEFAULT_BASE_URL,\n });\n }, [config]);\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 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 { useAppStore } from './store/AppStore';\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 });\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 //todo: remove Network type\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore\n wallets,\n providers: allProviders,\n switchNetwork,\n canSwitchNetworkTo,\n connect,\n state,\n isMobileWallet,\n };\n\n return (\n <ManagerProvider\n queuesDefs={[swapQueueDef]}\n context={context}\n onPersistedDataLoaded={(manager) => {\n checkWaitingForNetworkChange(manager);\n }}\n isPaused={false}>\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 { useWalletsStore } from '../../store/wallets';\nimport { getPendingSwaps } from '../../utils/queue';\nimport { calculateWalletUsdValue } from '../../utils/wallets';\n\nexport const WidgetInfoContext = createContext<\n WidgetInfoContextInterface | undefined\n>(undefined);\n\nexport function WidgetInfo(props: React.PropsWithChildren) {\n const { manager } = useManager();\n const swaps = getPendingSwaps(manager);\n const details = useWalletsStore.use.connectedWallets();\n const isLoading = useWalletsStore.use.loading();\n const totalBalance = calculateWalletUsdValue(details);\n const refetch = useWalletsStore.use.getWalletsDetails();\n // eslint-disable-next-line react/jsx-no-constructed-context-values\n const value = {\n swaps,\n wallets: {\n isLoading,\n details,\n totalBalance,\n refetch,\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"],
5
+ "mappings": "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",
6
+ "names": ["MainEvents", "RouteEventType", "StepEventType", "StepExecutionBlockedEventStatus", "StepExecutionEventStatus", "useWidgetEvents", "useWallets", "Events", "Provider", "isEvmBlockchain", "React", "createContext", "useEffect", "useRef", "useEffect", "useLayoutEffect", "useMemo", "useRef", "React", "createContext", "useContext", "useRef", "create", "DEFAULT_CONFIG", "createConfigSlice", "__name", "initialData", "set", "get", "nextConfig", "currentConfig", "RangoClient", "RANGO_PUBLIC_API_KEY", "DEFAULT_BASE_URL", "configs", "RANGO_PUBLIC_API_KEY", "getConfig", "name", "__name", "initConfig", "nextConfigs", "clonedConfigs", "configs", "__name", "DEFAULT_PRIMARY_RADIUS", "DEFAULT_SECONDARY_RADIUS", "DEFAULT_FONT_FAMILY", "THEME_CLASS_NAME_PREFIX", "rango", "httpService", "__name", "RangoClient", "getConfig", "removeDuplicateFrom", "array", "__name", "areEqual", "array1", "array2", "v", "i", "debounce", "fn", "time", "timeoutId", "wrapper", "args", "containsText", "text", "searchText", "getContainer", "create", "persist", "subscribeWithSelector", "English", "French", "Japanese", "Spanish", "LANGUAGES", "DEFAULT_LANGUAGE", "SLIPPAGES", "DEFAULT_SLIPPAGE", "HIGH_SLIPPAGE", "MAX_SLIPPAGE", "MIN_SLIPPGAE", "createSelectors", "__name", "_store", "store", "k", "s", "selectors_default", "useSettingsStore", "selectors_default", "create", "persist", "subscribeWithSelector", "set", "get", "DEFAULT_SLIPPAGE", "DEFAULT_LANGUAGE", "blockchain", "currentPreferredBlockchains", "preferredBlockchain", "index", "isSameBlockchain", "isInVisibleList", "nextPreferredBlockchains", "slippage", "customSlippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "swappers", "shouldReset", "state", "swappersGroup", "removeDuplicateFrom", "swapper", "name", "liquiditySource", "theme", "language", "getUniqueSwappersGroups", "swappers", "disabledLiquiditySources", "useSettingsStore", "supportedSwappers", "swapper", "uniqueSupportedSwappersGroups", "removeDuplicateFrom", "s", "uniqueGroupItem", "swapperItem", "isSupportedSwapper", "supportedItem", "swapperTypeItem", "__name", "sortLiquiditySourcesByGroupTitle", "a", "b", "WalletStatus", "readAccountAddress", "detectInstallLink", "getCosmosExperimentalChainInfo", "isEvmAddress", "KEPLR_COMPATIBLE_WALLETS", "Networks", "BigNumber", "isCosmosBlockchain", "BigNumber", "ZERO", "WalletTypes", "EXCLUDED_WALLETS", "BigNumber", "secondsToString", "__name", "s", "seconds", "numberToString", "number", "minDecimals", "maxDecimals", "BigNumber", "roundingMode", "maxI", "i", "totalArrivalTime", "__name", "data", "a", "b", "containsText", "__name", "text", "searchText", "isPositiveNumber", "limitDecimalPlaces", "numberString", "maxDecimalPlaces", "number", "multiplier", "mapStatusToWalletState", "state", "WalletStatus", "__name", "mapWalletTypesToWalletInfo", "getState", "getWalletInfo", "list", "chain", "wallet", "EXCLUDED_WALLETS", "supportedChains", "isContractWallet", "installed", "network", "supportedChain", "type", "name", "image", "installLink", "detectInstallLink", "walletAndSupportedChainsNames", "supportedBlockchains", "blockchainMeta", "prepareAccountsForWalletStore", "accounts", "evmBasedChains", "supportedChainNames", "result", "addAccount", "address", "account", "newAccount", "readAccountAddress", "hasLimitation", "isSupported", "isUnknown", "Networks", "isUnknownAndEvmBased", "isEvmAddress", "getRequiredChains", "quote", "wallets", "swap", "currentStepFromBlockchain", "currentStepToBlockchain", "internalSwap", "internalStepFromBlockchain", "internalStepToBlockchain", "getBalanceFromWallet", "connectedWallets", "symbol", "selectedChainWallets", "balance", "a", "b", "isAccountAndWalletMatched", "connectedWallet", "makeBalanceFor", "retrievedBalance", "tokens", "balances", "tokenBalance", "BigNumber", "getUsdPrice", "resetConnectedWalletState", "calculateWalletUsdValue", "uniqueAccountAddresses", "modifiedWalletBlockchains", "acc", "current", "i", "modifiedWalletBlockchain", "accountAddress", "total", "numberToString", "ZERO", "numberWithThousandSeparator", "number", "parts", "getUsdPrice", "__name", "blockchain", "symbol", "address", "allTokens", "t", "isExperimentalChain", "blockchains", "wallet", "cosmosExperimentalChainInfo", "getCosmosExperimentalChainInfo", "blockchainMeta", "isCosmosBlockchain", "getTokensWithBalance", "tokens", "connectedWallets", "balance", "otherProps", "tokenAmount", "numberToString", "BigNumber", "getBalanceFromWallet", "ZERO", "tokenUsdValue", "__name", "getTokensBalanceFromWalletAndSort", "list", "tokenA", "tokenB", "tokensAreEqual", "tokenA", "tokenB", "__name", "sortWalletsBasedOnConnectionState", "wallets", "a", "b", "WalletStatus", "getConciseAddress", "address", "maxChars", "ellipsisLength", "start", "end", "getAddress", "chain", "connectedWallets", "walletType", "connectedWallet", "createDataSlice", "__name", "set", "get", "options", "blockchainsFromState", "config", "supportedBlockchainsFromConfig", "blockchain", "tokensFromState", "supportedTokensFromConfig", "blockchains", "token", "asset", "tokensAreEqual", "containsText", "a", "b", "pinnedToken", "enableNewLiquiditySources", "liquiditySources", "swapper", "swapperGroupIncludedInLiquiditySources", "sortLiquiditySourcesByGroupTitle", "response", "httpService", "tokens", "popularTokens", "swappers", "blockchainsWithAtLeastOneToken", "error", "createAppStore", "initialData", "create", "a", "createDataSlice", "createConfigSlice", "__name", "AppStoreContext", "createContext", "useAppStore", "store", "useContext", "__name", "AppStoreProvider", "props", "appStoreRef", "useRef", "createAppStore", "React", "BigNumber", "create", "subscribeWithSelector", "getLastSuccessfulStep", "BigNumber", "QuoteWarningType", "getBlockchainDisplayNameFor", "blockchainName", "blockchains", "blockchain", "__name", "getBlockchainShortNameFor", "getSwapperDisplayName", "swapperId", "swappers", "swapper", "findToken", "tokens", "token", "tokensAreEqual", "findBlockchain", "name", "i18n", "PendingSwapNetworkStatus", "BigNumber", "getRequiredWallets", "quote", "wallets", "swap", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "__name", "isValidAddress", "chain", "address", "i18n", "errorMessages", "__name", "i18n", "getQuoteErrorMessage", "error", "i18n", "swapButtonTitles", "__name", "i18n", "hasHighValueLoss", "inputUsdValue", "priceImpact", "BigNumber", "__name", "hasLimitError", "quote", "swap", "minimum", "maximum", "getLimitErrorMessage", "isExclusive", "fromAmountRangeError", "recommendation", "i18n", "numberToString", "errorMessages", "getSwapButtonState", "params", "fetchMetaStatus", "anyWalletConnected", "fetchingQuote", "inputAmount", "warning", "error", "needsToWarnEthOnPath", "swapButtonTitles", "canComputePriceImpact", "usdValue", "ZERO", "requiredWallets", "wallets", "currentStepFromBlockchain", "currentStepToBlockchain", "lastAddedWallet", "getUsdPrice", "blockchain", "symbol", "address", "allTokens", "t", "getUsdFeeOfStep", "step", "totalFeeInUsd", "i", "fee", "unitPrice", "getTotalFeeInUsd", "swaps", "totalFee", "checkSlippageErrors", "quote", "recommendedSlippages", "swap", "index", "__name", "checkSlippageWarnings", "userSlippage", "getMinRequiredSlippage", "slippage", "s", "a", "b", "hasProperSlippage", "minRequiredSlippage", "createQuoteRequestBody", "params", "fromToken", "toToken", "inputAmount", "wallets", "selectedWallets", "disabledLiquiditySources", "liquiditySources", "excludeLiquiditySources", "slippage", "affiliateRef", "affiliatePercent", "affiliateWallets", "initialQuote", "destination", "selectedWalletsMap", "selectedWallet", "connectedWallets", "wallet", "chainAndAccounts", "connectedWallet", "checkPrerequisites", "filteredBlockchains", "removeDuplicateFrom", "blockchains", "swap", "internalSwap", "liquiditySource", "__name", "getWalletsForNewSwap", "getQuoteOutputAmount", "quote", "getPercentageChange", "input", "output", "BigNumber", "isOutputAmountChangedALot", "oldQuote", "newQuote", "oldOutputAmount", "newOutputAmount", "percentageChange", "getPriceImpact", "generateBalanceWarnings", "fee", "requiredWallets", "getRequiredChains", "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", "confirmSwapDisabled", "fetching", "showCustomDestination", "customDestination", "lastStepToBlockchain", "chain", "isValidAddress", "searchParamsToToken", "tokens", "searchParams", "chain", "token", "symbolAndAddress", "__name", "getQuoteToTokenUsdPrice", "quote", "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", "tokens", "firstStep", "lastStep", "lastSuccessfulStep", "getLastSuccessfulStep", "toToken", "fromBlockchainMeta", "findBlockchain", "toBlockchainMeta", "fromTokenMeta", "findToken", "toTokenMeta", "inputAmount", "__name", "generateQuoteWarnings", "quote", "params", "fromToken", "userSlippage", "inputUsdValue", "getUsdValue", "outputUsdValue", "priceImpact", "getPriceImpact", "hasHighValueLoss", "totalFee", "getTotalFeeInUsd", "warningLevel", "getPriceImpactLevel", "minRequiredSlippage", "getMinRequiredSlippage", "highSlippage", "HIGH_SLIPPAGE", "hasProperSlippage", "checkSlippageWarnings", "getPriceImpact", "inputUsdValue", "outputUsdValue", "outputUsdValueIsInvalid", "percentageChange", "getPercentageChange", "__name", "getUsdValue", "__name", "token", "amount", "BigNumber", "ZERO", "useQuoteStore", "selectors_default", "create", "subscribeWithSelector", "set", "quote", "state", "outputAmount", "outputUsdValue", "isPositiveNumber", "calcOutputUsdValue", "getQuoteToTokenUsdPrice", "chain", "params", "blockchain", "pendingSwap", "meta", "tokens", "blockchains", "fromBlockchain", "fromToken", "toBlockchain", "toToken", "inputAmount", "createRetryQuote", "flag", "wallets", "address", "useSyncStoresWithConfig", "setInputAmount", "setToToken", "setToBlockchain", "setFromBlockchain", "setFromToken", "fromToken", "toToken", "fromBlockchain", "toBlockchain", "useQuoteStore", "config", "useAppStore", "fetchMetaStatus", "blockchains", "tokens", "setAffiliateRef", "setAffiliatePercent", "setAffiliateWallets", "useSettingsStore", "fromTokensConfig", "useMemo", "fromBlockchainsConfig", "toTokensConfig", "toBlockchainsConfig", "prevConfigFromToken", "useRef", "prevConfigToToken", "prevConfigFromBlockchain", "prevConfigToBlockchain", "useEffect", "useLayoutEffect", "chain", "token", "t", "tokensAreEqual", "__name", "useEffect", "create", "subscribeWithSelector", "useWalletsStore", "selectors_default", "create", "subscribeWithSelector", "set", "get", "accounts", "tokens", "getWalletsDetails", "state", "wallet", "account", "shouldMarkWalletAsSelected", "connectedWallet", "walletType", "selectedWallets", "selectedWallet", "wallets", "walletSelected", "walletNotSelected", "shouldRetry", "isAccountAndWalletMatched", "data", "address", "chain", "retrievedBalance", "httpService", "matchedAccount", "retrievedBalanceAccount", "balance", "makeBalanceFor", "resetConnectedWalletState", "allProviders", "matchAndGenerateProviders", "providers", "options", "all", "allProviders", "selectedProviders", "requestedProvider", "result", "provider", "__name", "configWalletsToWalletName", "config", "useWalletProviders", "providers", "options", "clearConnectedWallet", "useWalletsStore", "generateProviders", "matchAndGenerateProviders", "useEffect", "__name", "WidgetContext", "createContext", "Main", "props", "updateConfig", "useAppStore", "blockchains", "tokens", "walletOptions", "providers", "useWalletProviders", "disconnectWallet", "useWalletsStore", "connectWallet", "onConnectWalletHandler", "useRef", "useSyncStoresWithConfig", "useEffect", "evmBasedChainNames", "isEvmBlockchain", "chain", "onUpdateState", "__name", "type", "event", "value", "state", "meta", "Events", "supportedChainNames", "walletAndSupportedChainsNames", "data", "prepareAccountsForWalletStore", "key", "React", "handler", "Provider", "WidgetWallets", "config", "otherProps", "AppStoreProvider", "React", "I18nManager", "React", "useContext", "useEffect", "useState", "useQueueManager", "useWallets", "isEvmBlockchain", "React", "Fragment", "MemoryRouter", "useInRouterContext", "useWallets", "useEffect", "useRef", "useForceAutoConnect", "connect", "state", "useWallets", "initiated", "useRef", "fetchStatus", "useAppStore", "walletType", "walletState", "useEffect", "__name", "useEffect", "useRef", "createSearchParams", "useLocation", "useSearchParams", "navigationRoutes", "create", "useUiStore", "selectors_default", "create", "set", "requestId", "path", "UpdateUrl", "firstRender", "useRef", "searchParams", "setSearchParams", "useSearchParams", "location", "useLocation", "firstRenderSearchParams", "searchParamsRef", "fromBlockchain", "useQuoteStore", "toBlockchain", "fromToken", "toToken", "setFromBlockchain", "setFromToken", "setToBlockchain", "setToToken", "inputAmount", "setInputAmount", "fetchMetaStatus", "useAppStore", "blockchains", "tokens", "setSelectedSwap", "useUiStore", "useEffect", "params", "createSearchParams", "value", "key", "requestId", "navigationRoutes", "fromChainString", "fromTokenString", "toChainString", "toTokenString", "fromAmount", "autoConnect", "blockchain", "searchParamsToToken", "__name", "AppRouter", "children", "props", "isRouterInContext", "useInRouterContext", "Router", "Fragment", "MemoryRouter", "blockchains", "useAppStore", "canSwitchNetworkTo", "useWallets", "useForceAutoConnect", "evmChains", "isEvmBlockchain", "useQueueManager", "React", "UpdateUrl", "__name", "React", "useRoutes", "i18n", "useManager", "Alert", "Button", "Divider", "IconButton", "RefreshIcon", "SettingsIcon", "styled", "Tooltip", "Typography", "WalletIcon", "React", "useEffect", "useLayoutEffect", "useRef", "useState", "flushSync", "useNavigate", "i18n", "Alert", "BalanceErrors", "Button", "ChevronDownIcon", "ChevronLeftIcon", "Divider", "MessageBox", "Modal", "Typography", "WalletIcon", "React", "useEffect", "useLayoutEffect", "useRef", "useState", "useNavigate", "i18n", "getQuoteUpdateWarningMessage", "warning", "i18n", "__name", "Collapsible", "Button", "darkTheme", "IconButton", "keyframes", "styled", "TextField", "EXPANDABLE_TRANSITION_DURATION", "slideDown", "slideUp", "Title", "ListContainer", "WalletButton", "Trigger", "ShowMoreHeader", "NavigateBack", "WalletsContainer", "CollapsibleRoot", "CustomDestinationButton", "CustomDestination", "ExpandedIcon", "ConfirmButton", "StyledTextField", "CollapsibleContent", "Wallets", "i18n", "Button", "Divider", "Image", "MessageBox", "Modal", "SelectableWallet", "Typography", "WalletState", "React", "useEffect", "useState", "WalletState", "useWallets", "KEPLR_COMPATIBLE_WALLETS", "WalletTypes", "useEffect", "useState", "ALL_SUPPORTED_WALLETS", "WalletTypes", "useWalletList", "params", "config", "chain", "onBeforeConnect", "onConnect", "state", "disconnect", "getWalletInfo", "connect", "useWallets", "connectedWallets", "useWalletsStore", "blockchains", "useAppStore", "listAvailableWalletTypes", "configWalletsToWalletName", "wallets", "mapWalletTypesToWalletInfo", "sortedWallets", "sortWalletsBasedOnConnectionState", "error", "setError", "useState", "isExperimentalChainNotAdded", "__name", "walletType", "connectedWallet", "handleClick", "type", "wallet", "atLeastOneWalletIsConnected", "w", "WalletState", "e", "disconnectConnectingWallets", "connectingWallets", "useEffect", "shouldExcludeWallet", "isExperimentalChain", "KEPLR_COMPATIBLE_WALLETS", "i18n", "styled", "Typography", "Wallet", "WalletState", "React", "Fragment", "useState", "BottomLogo", "Divider", "Header", "React", "useNavigate", "useNavigateBack", "navigate", "useNavigate", "__name", "ChevronLeftIcon", "React", "darkTheme", "IconButton", "styled", "HeaderButton", "ConnectedIcon", "SuffixContainer", "NotificationsBadgeContainer", "BackButton", "props", "React", "HeaderButton", "ChevronLeftIcon", "__name", "i18n", "Button", "Typography", "React", "CancelButton", "props", "React", "SuffixContainer", "Button", "Typography", "i18n", "__name", "i18n", "Tooltip", "WalletIcon", "React", "WalletButton", "props", "React", "Tooltip", "i18n", "HeaderButton", "ConnectedIcon", "WalletIcon", "__name", "i18n", "NotificationsIcon", "Popover", "RefreshIcon", "SettingsIcon", "Tooltip", "TransactionIcon", "React", "i18n", "ChainToken", "ChevronRightIcon", "ListItemButton", "Typography", "React", "useNavigate", "create", "persist", "subscribeWithSelector", "useNotificationStore", "selectors_default", "create", "persist", "subscribeWithSelector", "set", "get", "event", "route", "fromStep", "toStep", "notification", "excludedList", "notificationItem", "requestId", "state", "styled", "Container", "List", "Images", "NotFoundContainer", "i18n", "Divider", "NoNotificationIcon", "Typography", "React", "NotificationNotFound", "React", "NotFoundContainer", "NoNotificationIcon", "Divider", "Typography", "i18n", "__name", "MAX_NOTIFICATIONS_DISPLAYED", "NotificationContent", "navigate", "useNavigate", "setSelectedSwap", "useUiStore", "getUnreadNotifications", "useNotificationStore", "notifications", "blockchains", "useAppStore", "tokens", "sortedNotification", "a", "b", "handleOnClick", "__name", "requestId", "navigationRoutes", "React", "Container", "List", "notificationItem", "fromToken", "tokenItem", "fromBlockchain", "blockchainItem", "toToken", "toBlockchain", "ListItemButton", "Typography", "i18n", "Images", "ChainToken", "ChevronRightIcon", "NotificationNotFound", "Typography", "React", "UnreadNotificationsBadge", "getUnreadNotifications", "useNotificationStore", "notificationsCount", "React", "NotificationsBadgeContainer", "Typography", "__name", "HomeButtons", "props", "layoutRef", "onClickRefresh", "onClickHistory", "onClickSettings", "onClickNotifications", "React", "Tooltip", "getContainer", "i18n", "HeaderButton", "RefreshIcon", "Popover", "NotificationContent", "NotificationsIcon", "UnreadNotificationsBadge", "SettingsIcon", "TransactionIcon", "__name", "darkTheme", "styled", "Container", "Content", "Footer", "LayoutComponent", "props", "ref", "children", "header", "footer", "noPadding", "hasLogo", "fixedHeight", "connectedWallets", "useWalletsStore", "connectWalletsButtonDisabled", "useUiStore", "navigateBack", "useNavigateBack", "onConnectWallet", "__name", "showBackButton", "React", "Container", "Header", "BackButton", "WalletButton", "getContainer", "CancelButton", "Content", "Footer", "Divider", "BottomLogo", "Layout", "Divider", "Modal", "React", "i18n", "Image", "MessageBox", "WalletState", "React", "keyframes", "styled", "IconContainer", "LogoContainer", "spin", "Spinner", "WalletImageContainer", "ModalContent", "props", "state", "image", "error", "WalletState", "React", "MessageBox", "i18n", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "__name", "WalletModal", "props", "open", "onClose", "otherProps", "React", "Modal", "ModalContent", "Divider", "__name", "ListContainer", "styled", "Container", "TIME_TO_CLOSE_MODAL", "TIME_TO_IGNORE_MODAL", "WalletsPage", "config", "fetchMetaStatus", "useAppStore", "openModal", "setOpenModal", "useState", "selectedWalletType", "setSelectedWalletType", "modalTimerId", "list", "handleClick", "error", "useWalletList", "type", "selectedWallet", "wallet", "selectedWalletImage", "selectedWalletState", "WalletState", "React", "Layout", "i18n", "Typography", "index", "key", "Fragment", "Wallet", "getContainer", "WalletModal", "__name", "keyframes", "styled", "LogoContainer", "SpinAnimation", "Spinner", "WalletImageContainer", "WalletList", "props", "chain", "isSelected", "selectWallet", "limit", "onShowMore", "config", "useAppStore", "connectedWallets", "useWalletsStore", "blockchains", "openWalletStateModal", "setOpenWalletStateModal", "useState", "experimentalChainWallet", "setExperimentalChainWallet", "showExperimentalChainModal", "setShowExperimentalChainModal", "addingExperimentalChainStatus", "setAddingExperimentalChainStatus", "suggestAndConnect", "useWallets", "modalTimerId", "list", "error", "handleClick", "useWalletList", "type", "TIME_TO_IGNORE_MODAL", "TIME_TO_CLOSE_MODAL", "sortedList", "setSortedList", "numberOfSupportedWallets", "shouldShowMoreWallets", "addExperimentalChain", "__name", "wallet", "useEffect", "selectedWalletIndex", "_", "index", "sortedItem", "listItem", "modalContainer", "timeout", "React", "address", "getAddress", "conciseAddress", "getConciseAddress", "experimentalChain", "isExperimentalChain", "experimentalChainNotAdded", "connectedWallet", "couldAddExperimentalChain", "WalletState", "connectedWalletDescription", "i18n", "onClick", "blockchainDisplayName", "getBlockchainDisplayNameFor", "WalletModal", "Modal", "MessageBox", "Divider", "Button", "LogoContainer", "WalletImageContainer", "Image", "Spinner", "SelectableWallet", "WalletButton", "Typography", "NUMBER_OF_WALLETS_TO_DISPLAY", "ConfirmWalletsModal", "props", "open", "onClose", "onCancel", "onCheckBalance", "loading", "config", "useAppStore", "blockchains", "quote", "selectQuoteWallets", "quoteWalletsConfirmed", "setQuoteWalletConfirmed", "customDestination", "setCustomDestination", "useQuoteStore", "connectedWallets", "selectWallets", "useWalletsStore", "showMoreWalletFor", "setShowMoreWalletFor", "useState", "balanceWarnings", "setBalanceWarnings", "error", "setError", "quoteWarning", "setQuoteWarning", "destination", "setDestination", "showCustomDestination", "setShowCustomDestination", "customDestinationRef", "useRef", "requiredWallets", "getRequiredWallets", "lastStepToBlockchain", "blockchain", "isWalletRequiredFor", "__name", "swap", "selectableWallets", "setSelectableWallets", "connectedWallet", "lastStepToBlockchainMeta", "chain", "isSelected", "walletType", "selectableWallet", "isAddressMatched", "isValidAddress", "resetCustomDestination", "anyWalletSelected", "onChange", "wallet", "onConfirmBalance", "lastSelectedWallets", "onConfirmWallets", "selectedWallets", "result", "warnings", "getQuoteErrorMessage", "useEffect", "useLayoutEffect", "EXPANDABLE_TRANSITION_DURATION", "modalContainer", "navigate", "useNavigate", "React", "Modal", "ConfirmButton", "Button", "confirmSwapDisabled", "ShowMoreHeader", "NavigateBack", "ChevronLeftIcon", "Typography", "i18n", "getBlockchainShortNameFor", "MessageBox", "BalanceErrors", "WalletsContainer", "WalletList", "Alert", "Divider", "getQuoteUpdateWarningMessage", "Wallets", "requiredWallet", "index", "key", "isLastWallet", "Title", "ListContainer", "CustomDestination", "CollapsibleRoot", "checked", "Trigger", "prevState", "CustomDestinationButton", "ExpandedIcon", "ChevronDownIcon", "WalletIcon", "CollapsibleContent", "StyledTextField", "e", "Divider", "React", "i18n", "Alert", "ChevronDownIcon", "ChevronRightIcon", "Divider", "Image", "InfoIcon", "QuoteCost", "StepDetails", "TokenAmount", "Tooltip", "Typography", "React", "useLayoutEffect", "useRef", "useState", "styled", "PositionTopAlerts", "QuoteContainer", "SkeletonContainer", "FooterStepAlarm", "FooterAlert", "Collapsible", "darkTheme", "Image", "styled", "EXPANDABLE_QUOTE_TRANSITION_DURATION", "QuoteContainer", "styled", "darkTheme", "SummaryContainer", "Chains", "Image", "ChainImageContainer", "Content", "CollapsibleContent", "IconContainer", "Separator", "HorizontalSeparator", "FrameIcon", "TokenAmount", "React", "styled", "Container", "QuoteSummary", "props", "from", "to", "percentageChange", "warningLevel", "React", "Container", "TokenAmount", "__name", "Quote", "props", "quote", "input", "output", "error", "warning", "type", "recommended", "tokens", "useAppStore", "blockchains", "swappers", "expanded", "setExpanded", "useState", "quoteRef", "useRef", "prevExpanded", "totalFee", "numberToString", "getTotalFeeInUsd", "totalTime", "secondsToString", "totalArrivalTime", "roundedInput", "roundedOutput", "roundedOutputUsdValue", "priceImpact", "getPriceImpact", "percentageChange", "priceImpactWarningLevel", "getPriceImpactLevel", "steps", "__name", "swaps", "swap", "index", "stepState", "stepHasError", "stepHasWarning", "getSwapperDisplayName", "getBlockchainShortNameFor", "React", "FooterStepAlarm", "Alert", "i18n", "FooterAlert", "Typography", "Divider", "numberOfSteps", "tooltipContainer", "getContainer", "useLayoutEffect", "EXPANDABLE_QUOTE_TRANSITION_DURATION", "SummaryContainer", "QuoteCost", "FrameIcon", "InfoIcon", "TokenAmount", "QuoteSummary", "QuoteContainer", "Chains", "ref", "prevState", "step", "key", "arrow", "IconContainer", "ChevronRightIcon", "Tooltip", "ChainImageContainer", "Image", "ChevronDownIcon", "Content", "HorizontalSeparator", "StepDetails", "ChainToken", "Divider", "NextIcon", "Skeleton", "React", "darkTheme", "styled", "Container", "StepSeparator", "StepSkeleton", "props", "separator", "React", "Skeleton", "Divider", "StepSeparator", "ChainToken", "NextIcon", "__name", "QuoteSkeleton", "type", "expanded", "tag", "quoteSummary", "Container", "i18n", "Alert", "Button", "InfoIcon", "React", "Alert", "Button", "Divider", "NoRouteIcon", "RefreshIcon", "Typography", "React", "i18n", "makeInfo", "error", "disabledLiquiditySources", "toggleAllLiquiditySources", "refetchQuote", "errorMessages", "i18n", "__name", "styled", "Container", "Footer", "PrefixIcon", "NoResult", "props", "fetch", "error", "disabledLiquiditySources", "useSettingsStore", "toggleAllLiquiditySources", "swappers", "useAppStore", "info", "makeInfo", "React", "Container", "NoRouteIcon", "Divider", "Typography", "errorMessages", "Footer", "Alert", "Button", "PrefixIcon", "RefreshIcon", "__name", "i18n", "Button", "Divider", "MessageBox", "Modal", "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", "type", "highValueLossData", "i18n", "numberToString", "React", "Modal", "getContainer", "MessageBox", "errorMessages", "Flex", "Divider", "Typography", "item", "index", "QuoteErrorsModalItem", "Button", "WarningIcon", "__name", "i18n", "makeAlerts", "warning", "error", "alertInfo", "getPriceImpactLevel", "errorMessages", "i18n", "__name", "i18n", "Button", "Divider", "MessageBox", "Modal", "Typography", "React", "useNavigate", "SlippageWarningModal", "props", "customSlippage", "slippage", "useSettingsStore", "open", "onClose", "onConfirm", "warning", "navigate", "useNavigate", "userSlippage", "React", "Modal", "Button", "navigationRoutes", "Typography", "i18n", "getContainer", "MessageBox", "Divider", "__name", "Button", "Divider", "MessageBox", "Modal", "WarningIcon", "React", "UnknownPriceWarningModal", "props", "open", "onClose", "onConfirm", "React", "Modal", "getContainer", "MessageBox", "errorMessages", "Divider", "Button", "WarningIcon", "__name", "QuoteWarningsAndErrors", "props", "warning", "error", "refetchQuote", "showWarningModal", "onOpenWarningModal", "onCloseWarningModal", "onConfirmWarningModal", "onChangeSettings", "warningModalHandlers", "showNoResultMessage", "alertInfo", "makeAlerts", "React", "NoResult", "Alerts", "Alert", "Action", "InfoIcon", "Button", "i18n", "HighValueLossWarningModal", "SlippageWarningModal", "UnknownPriceWarningModal", "__name", "QuoteInfo", "props", "quote", "type", "loading", "error", "warning", "refetchQuote", "showWarningModal", "onOpenWarningModal", "onCloseWarningModal", "onConfirmWarningModal", "onChangeSettings", "expanded", "alertPosition", "inputAmount", "inputUsdValue", "outputUsdValue", "outputAmount", "useQuoteStore", "showQuote", "quoteWarningsAndErrors", "React", "QuoteWarningsAndErrors", "QuoteContainer", "SkeletonContainer", "QuoteSkeleton", "PositionTopAlerts", "Quote", "Divider", "__name", "calculatePendingSwap", "useEffect", "useRef", "useState", "useFetchQuote", "loading", "setLoading", "useState", "abortController", "useRef", "cancel", "__name", "requestBody", "res", "httpService", "error", "throwErrorIfResponseIsNotValid", "response", "errorMessages", "hasLimitError", "swap", "recommendation", "fromAmountRangeError", "getLimitErrorMessage", "recommendedSlippages", "checkSlippageErrors", "minRequiredSlippage", "getMinRequiredSlippage", "__name", "generateWarnings", "previousQuote", "currentQuote", "params", "quoteChanged", "isQuoteChanged", "output", "quoteWarning", "generateQuoteWarnings", "isOutputAmountChangedALot", "numberToString", "getQuoteOutputAmount", "getPriceImpact", "isNumberOfSwapsChanged", "isQuoteSwappersUpdated", "isQuoteInternalCoinsUpdated", "balanceWarnings", "generateBalanceWarnings", "handleQuoteErrors", "error", "useConfirmSwap", "fromToken", "toToken", "inputAmount", "setQuote", "initialQuote", "customDestinationFromStore", "setQuoteWarningsConfirmed", "useQuoteStore", "slippage", "customSlippage", "affiliatePercent", "affiliateRef", "affiliateWallets", "disabledLiquiditySources", "useSettingsStore", "connectedWallets", "useWalletsStore", "blockchains", "useAppStore", "tokens", "experimental", "enableNewLiquiditySources", "userSlippage", "fetchQuote", "cancelFetch", "loading", "useFetchQuote", "useEffect", "__name", "params", "selectedWallets", "customDestination", "requestBody", "createQuoteRequestBody", "currentQuote", "response", "throwErrorIfResponseIsNotValid", "error", "handleQuoteErrors", "swapSettings", "swap", "calculatePendingSwap", "getWalletsForNewSwap", "confirmSwapWarnings", "generateWarnings", "Container", "styled", "Buttons", "IconButton", "ConfirmSwapPage", "quote", "setInputAmount", "selectedWallets", "quoteWalletsConfirmed", "setQuoteWalletConfirmed", "customDestination", "quoteWarningsConfirmed", "useQuoteStore", "navigate", "useNavigate", "dbErrorMessage", "setDbErrorMessage", "useState", "connectedWallets", "useWalletsStore", "showWalletsOnInit", "showWallets", "setShowWallets", "setSelectedSwap", "useUiStore", "disabledLiquiditySources", "useSettingsStore", "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", "quoteChanged", "QuoteWarningType", "selectedWalletDisconnected", "selectedWallet", "connectedWallet", "quoteWalletsChanged", "requiredWallets", "getRequiredWallets", "lastStepToBlockchain", "swap", "requiredWallet", "flushSync", "useLayoutEffect", "React", "Layout", "i18n", "wallets_url", "Tooltip", "getContainer", "HeaderButton", "SettingsIcon", "Button", "WalletIcon", "ConfirmWalletsModal", "Typography", "RefreshIcon", "Alert", "Divider", "getQuoteUpdateWarningMessage", "QuoteInfo", "i18n", "useManager", "Divider", "NotFound", "styled", "React", "useState", "useNavigate", "CloseIcon", "IconButton", "SearchIcon", "TextField", "React", "styled", "IconWrapper", "SearchInput", "props", "variant", "fullWidth", "color", "size", "onChange", "value", "setValue", "inputAttributes", "React", "TextField", "IconWrapper", "SearchIcon", "IconButton", "CloseIcon", "__name", "i18n", "Divider", "SwapListItem", "Typography", "React", "darkTheme", "styled", "Group", "Time", "SwapList", "NotFoundContainer", "SwapsGroup", "props", "list", "onSwapClick", "groupBy", "isLoading", "groups", "swaps", "React", "group", "Group", "Time", "Typography", "i18n", "Divider", "SwapList", "_", "index", "key", "SwapListItem", "swap", "firstStep", "lastStep", "limitDecimalPlaces", "__name", "dayjs", "groupSwapsByDate", "__name", "swaps", "output", "now", "dayjs", "swap", "swapDate", "getPendingSwaps", "__name", "manager", "result", "q", "id", "storage", "a", "b", "Container", "styled", "SwapsGroupContainer", "isStepContainsText", "__name", "steps", "value", "step", "containsText", "HistoryPage", "setSelectedSwap", "useUiStore", "navigate", "useNavigate", "manager", "state", "useManager", "list", "getPendingSwaps", "swap", "searchedFor", "setSearchedFor", "useState", "loading", "searchHandler", "event", "filteredList", "isEmpty", "React", "Layout", "i18n", "SearchInput", "NotFoundContainer", "Divider", "NotFound", "SwapsGroup", "requestId", "groupSwapsByDate", "i18n", "Button", "styled", "SwapInput", "WarningIcon", "React", "useEffect", "useRef", "useState", "useNavigate", "ReverseIcon", "styled", "React", "SwitchButtonContainer", "styled", "StyledButton", "SwitchFromAndToButton", "switchFromAndTo", "useQuoteStore", "React", "ReverseIcon", "__name", "useCallback", "useEffect", "useState", "DEBOUNCE_DELAY", "useSwapInput", "fetchQuote", "cancelFetch", "useFetchQuote", "liquiditySources", "enableNewLiquiditySources", "experimental", "useAppStore", "tokens", "fromToken", "toToken", "inputAmount", "inputUsdValue", "resetQuote", "setQuote", "useQuoteStore", "slippage", "customSlippage", "affiliatePercent", "affiliateRef", "affiliateWallets", "disabledLiquiditySources", "useSettingsStore", "loading", "setLoading", "useState", "error", "setError", "warning", "setWarning", "userSlippage", "shouldSkipRequest", "tokensAreEqual", "isPositiveNumber", "resetState", "__name", "fetch", "params", "excludeLiquiditySources", "requestBody", "createQuoteRequestBody", "res", "throwErrorIfResponseIsNotValid", "quoteWarning", "generateQuoteWarnings", "quoteError", "handleQuoteErrors", "debouncedFetch", "useCallback", "debounce", "DEBOUNCE_DELAY", "useEffect", "Container", "styled", "FromContainer", "InputsContainer", "Home", "navigate", "useNavigate", "fetchQuote", "fetchingQuote", "quoteError", "quoteWarning", "useSwapInput", "fromToken", "fromBlockchain", "toToken", "toBlockchain", "setInputAmount", "inputAmount", "inputUsdValue", "outputAmount", "outputUsdValue", "quote", "resetQuoteWallets", "setQuoteWarningsConfirmed", "useQuoteStore", "fetchMetaStatus", "useAppStore", "connectedWallets", "useWalletsStore", "setCurrentPage", "useUiStore", "showQuoteWarningModal", "setShowQuoteWarningModal", "useState", "layoutRef", "useRef", "needsToWarnEthOnPath", "priceImpactInputCanNotBeComputed", "canComputePriceImpact", "priceImpactOutputCanNotBeComputed", "swapButtonState", "getSwapButtonState", "tokenBalance", "numberToString", "getBalanceFromWallet", "tokenBalanceReal", "useEffect", "navigationRoutes", "percentageChange", "getPriceImpact", "React", "Layout", "Button", "WarningIcon", "i18n", "HomeButtons", "SwapInput", "errorMessages", "SwitchFromAndToButton", "getPriceImpactLevel", "QuoteInfo", "__name", "i18n", "List", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "styled", "SettingsContainer", "LiquiditySourceList", "LiquiditySourceSuffix", "NotFoundContainer", "useLanguage", "language", "useSettingsStore", "setLanguage", "LANGUAGES", "DEFAULT_LANGUAGE", "__name", "LanguagePage", "activeLanguage", "changeLanguage", "languages", "useLanguage", "languageList", "languageItem", "local", "label", "SVGFlag", "React", "Typography", "Radio", "Layout", "i18n", "SettingsContainer", "RadioRoot", "List", "ListItemButton", "__name", "i18n", "Button", "Checkbox", "Image", "ListItemButton", "NotFound", "Typography", "React", "useState", "Checkbox", "Skeleton", "React", "ListItem", "styled", "CustomeListItem", "ITEM_SKELETON_COUNT", "LoadingLiquiditySourceList", "React", "LiquiditySourceList", "e", "CustomeListItem", "Skeleton", "Checkbox", "__name", "LiquiditySourcePage", "sourceType", "fetchStatus", "useAppStore", "swappers", "searchedFor", "setSearchedFor", "useState", "toggleLiquiditySource", "useSettingsStore", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "validTypes", "liquiditySources", "uniqueItem", "hasSelectAll", "sourceItem", "toggleAllSources", "__name", "list", "selected", "groupTitle", "logo", "React", "Image", "Checkbox", "Typography", "i18n", "searchHandler", "event", "value", "filteredList", "containsText", "Layout", "LiquiditySourceSuffix", "Button", "SettingsContainer", "SearchInput", "LoadingLiquiditySourceList", "NotFoundContainer", "NotFound", "LiquiditySourceList", "ListItemButton", "i18n", "Divider", "getCountCategories", "SelectableCategoryList", "React", "useState", "i18n", "Divider", "Image", "ListItemButton", "NotFound", "Typography", "React", "useEffect", "useState", "BlockchainCategories", "TransactionType", "filterByType", "__name", "blockchain", "type", "BlockchainCategories", "TransactionType", "filterBlockchains", "list", "searchedFor", "blockchainType", "containsText", "styled", "Container", "List", "ListItem", "Skeleton", "React", "ITEM_SKELETON_COUNT", "LoadingBlockchainList", "React", "List", "e", "ListItem", "Skeleton", "__name", "BlockchainList", "props", "list", "searchedFor", "onChange", "blockchainCategory", "blockchains", "setBlockchains", "useState", "fetchStatus", "useAppStore", "useEffect", "filterBlockchains", "renderList", "__name", "React", "Divider", "NotFound", "i18n", "List", "item", "ListItemButton", "Image", "Typography", "Container", "LoadingBlockchainList", "SelectBlockchainPage", "props", "type", "navigateBack", "useNavigateBack", "searchedFor", "setSearchedFor", "useState", "blockchainCategory", "setBlockchainCategory", "setToBlockchain", "useQuoteStore", "setFromBlockchain", "fetchStatus", "useAppStore", "blockchains", "showCategory", "getCountCategories", "React", "Layout", "i18n", "Divider", "SelectableCategoryList", "SearchInput", "event", "BlockchainList", "blockchain", "__name", "i18n", "Divider", "React", "useState", "useNavigate", "i18n", "BlockchainsChip", "Divider", "Image", "Skeleton", "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", "useSettingsStore", "useEffect", "output", "prepare", "isInVisibleList", "__name", "styled", "Container", "NUMBER_OF_LOADING", "BlockchainsSection", "props", "blockchains", "type", "blockchain", "onChange", "onMoreClick", "blockchainsList", "usePrepareBlockchainList", "fetchStatus", "useAppStore", "resetToBlockchain", "useQuoteStore", "resetFromBlockchain", "hasMoreItemsInList", "onlyOneItemInList", "showMoreButton", "React", "Divider", "Typography", "i18n", "Container", "e", "Skeleton", "BlockchainsChip", "item", "Image", "__name", "i18n", "darkTheme", "Divider", "ExternalLinkIcon", "Image", "ListItemButton", "NotFound", "PinIcon", "Skeleton", "Typography", "VirtualizedList", "React", "forwardRef", "useEffect", "useState", "colorShade", "__name", "col", "amt", "r", "g", "b", "rr", "gg", "bb", "generateRangeColors", "name", "color", "colors", "i", "generateColors", "mainColors", "reverseNeutralRange", "changeColors", "listOfColors", "colorKey", "range", "Divider", "ListItem", "Skeleton", "React", "darkTheme", "styled", "Typography", "Container", "Title", "List", "Tag", "TagTitle", "BalanceContainer", "End", "Description", "ImageSection", "Pin", "LoadingTokenList", "props", "React", "List", "ListItem", "Skeleton", "End", "Divider", "__name", "PAGE_SIZE", "renderDesc", "__name", "props", "address", "name", "url", "token", "customCssForTag", "customCssForTagTitle", "length", "React", "Title", "Typography", "Divider", "Tag", "TagTitle", "e", "ExternalLinkIcon", "TokenList", "list", "searchedFor", "onChange", "selectedBlockchain", "tokens", "setTokens", "useState", "fetchStatus", "useAppStore", "blockchains", "hasNextPage", "setHasNextPage", "loadingWallet", "useWalletsStore", "isTokenPinned", "innerElementType", "forwardRef", "render", "ref", "loadNextPage", "useEffect", "renderList", "NotFound", "i18n", "VirtualizedList", "index", "style", "blockchain", "color", "generateRangeColors", "darkTheme", "ListItemButton", "ImageSection", "Image", "Pin", "PinIcon", "End", "Skeleton", "BalanceContainer", "Container", "LoadingTokenList", "List", "SelectSwapItemsPage", "props", "type", "navigate", "useNavigate", "navigateBack", "useNavigateBack", "fromBlockchain", "toBlockchain", "setFromToken", "setToToken", "setFromBlockchain", "setToBlockchain", "useQuoteStore", "connectedWallets", "useWalletsStore", "searchedFor", "setSearchedFor", "useState", "selectedBlockchainName", "blockchains", "useAppStore", "tokens", "tokensList", "getTokensBalanceFromWalletAndSort", "updateBlockchain", "__name", "blockchain", "updateToken", "token", "React", "Layout", "i18n", "BlockchainsSection", "navigationRoutes", "Divider", "SearchInput", "event", "TokenList", "tokenBlockchain", "chain", "i18n", "ChevronRightIcon", "Divider", "InfoIcon", "List", "ListItemButton", "Skeleton", "Switch", "Tooltip", "Typography", "React", "useNavigate", "i18n", "Chip", "Divider", "InfoIcon", "TextField", "Tooltip", "Typography", "React", "styled", "BaseContainer", "SlippageChipsContainer", "Head", "SlippageTooltipContainer", "i18n", "Typography", "React", "SlippageTooltipContent", "React", "SlippageTooltipContainer", "Typography", "i18n", "__name", "Slippage", "slippage", "useSettingsStore", "setSlippage", "customSlippage", "setCustomSlippage", "React", "BaseContainer", "Head", "Typography", "i18n", "Divider", "Tooltip", "getContainer", "SlippageTooltipContent", "InfoIcon", "SlippageChipsContainer", "SLIPPAGES", "slippageItem", "index", "key", "Chip", "TextField", "event", "parsedValue", "MIN_SLIPPGAE", "MAX_SLIPPAGE", "__name", "SettingsPage", "navigate", "useNavigate", "theme", "useAppStore", "fetchStatus", "swappers", "infiniteApprove", "useSettingsStore", "toggleInfiniteApprove", "supportedUniqueSwappersGroups", "getUniqueSwappersGroups", "bridgeSources", "uniqueItem", "totalBridgeSources", "totalSelectedBridgeSources", "exchangeSources", "totalExchangeSources", "totalSelectedExchangeSources", "handleEndItem", "__name", "totalSelected", "total", "React", "Skeleton", "Typography", "i18n", "bridgeItem", "Divider", "ChevronRightIcon", "navigationRoutes", "exchangeItem", "themeItem", "infiniteApprovalItem", "Tooltip", "getContainer", "SlippageTooltipContainer", "InfoIcon", "Switch", "settingItems", "Layout", "SettingsContainer", "Slippage", "List", "ListItemButton", "cancelSwap", "useManager", "React", "i18n", "getCurrentBlockchainOfOrNull", "getCurrentStep", "getRelatedWalletOrNull", "PendingSwapNetworkStatus", "Button", "CopyIcon", "Divider", "IconButton", "QuoteCost", "StepDetails", "Typography", "useCopyToClipboard", "useWallets", "React", "useEffect", "useRef", "useState", "useNavigate", "i18n", "MILLISECOND_PER_SECOND", "SECONDS_PER_YEAR", "SECONDS_PER_MONTH", "SECONDS_PER_DAY", "SECONDS_PER_HOUR", "SECONDS_PER_MINUTE", "timeSince", "millisecond", "seconds", "sortedIntervals", "i18n", "a", "b", "interval", "turningPoint", "label", "pluralLabel", "intervalCount", "__name", "getSwapDate", "pendingSwap", "PendingSwapNetworkStatus", "Modal", "React", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "CancelContent", "__name", "onCancel", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "Typography", "i18n", "Button", "Divider", "MessageBox", "Typography", "React", "DeleteContent", "__name", "onDelete", "onClose", "React", "Divider", "MessageBox", "i18n", "Button", "Typography", "i18n", "PendingSwapNetworkStatus", "modalNetworkValues", "MessageBox", "Wallet", "WalletState", "useWallets", "React", "styled", "WalletContainer", "WalletStateContent", "__name", "props", "type", "title", "currentStepWallet", "message", "showWalletButton", "connect", "getWalletInfo", "walletState", "useWallets", "walletType", "state", "WalletState", "React", "MessageBox", "WalletContainer", "Wallet", "getContainer", "SwapDetailsModal", "props", "state", "onClose", "onDelete", "onCancel", "currentStepWallet", "message", "showWalletStateContent", "PendingSwapNetworkStatus", "React", "Modal", "WalletStateContent", "modalNetworkValues", "DeleteContent", "CancelContent", "__name", "i18n", "Button", "Divider", "MessageBox", "Modal", "TokenAmount", "Typography", "React", "useNavigate", "SwapDetailsCompleteModal", "props", "open", "onClose", "status", "priceValue", "usdValue", "token", "chain", "percentageChange", "description", "diagnosisUrl", "navigate", "useNavigate", "React", "Modal", "MessageBox", "i18n", "TokenAmount", "Divider", "Typography", "Button", "__name", "React", "i18n", "Alert", "IconButton", "LinkIcon", "React", "Fragment", "Alert", "ChevronDownIcon", "ChevronUpIcon", "IconButton", "React", "useState", "FailedAlert", "props", "message", "showContentError", "setShowContentError", "useState", "React", "Alert", "IconButton", "prev", "ChevronUpIcon", "ChevronDownIcon", "__name", "styled", "Alerts", "i18n", "PendingSwapNetworkStatus", "Alert", "Button", "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", "React", "Alerts", "explorerUrl", "index", "urls", "key", "lastUrl", "loading", "error", "Fragment", "Alert", "i18n", "IconButton", "LinkIcon", "WarningAlert", "FailedAlert", "__name", "RESET_INTERVAL", "getSteps", "__name", "swap", "blockchains", "args", "hasAlreadyProceededToSign", "step", "index", "amountToConvert", "getBlockchainShortNameFor", "numberToString", "React", "SwapDetailsAlerts", "getStepState", "isNetworkStatusInWarningState", "darkTheme", "styled", "Container", "HeaderDetails", "StepsList", "Alerts", "PlaceholderContainer", "LoaderContainer", "SwapDetails", "props", "swap", "requestId", "onDelete", "onCancelProps", "canSwitchNetworkTo", "connect", "getWalletInfo", "useWallets", "blockchains", "useAppStore", "tokens", "retry", "useQuoteStore", "navigate", "useNavigate", "_", "handleCopy", "useCopyToClipboard", "RESET_INTERVAL", "listRef", "useRef", "modalState", "setModalState", "useState", "showCompletedModal", "setShowCompletedModal", "onCancel", "__name", "getUnreadNotifications", "useNotificationStore", "setAsRead", "unreadNotifications", "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", "getUsdPrice", "inputUsdValue", "percentageChange", "getPriceImpact", "completeModalDesc", "i18n", "getConciseAddress", "React", "Layout", "SuffixContainer", "Button", "Typography", "Container", "HeaderDetails", "IconButton", "CopyIcon", "QuoteCost", "secondsToString", "totalArrivalTime", "QuoteSummary", "getPriceImpactLevel", "Divider", "StepsList", "index", "key", "state", "getStepState", "isFocused", "StepDetails", "SwapDetailsModal", "SwapDetailsCompleteModal", "i18n", "CopyIcon", "IconButton", "NotFound", "Skeleton", "Typography", "React", "i18n", "ChainToken", "Divider", "Skeleton", "Typography", "React", "styled", "Container", "StepContainer", "StepSeparator", "ChainToken", "Divider", "NextIcon", "Skeleton", "React", "LoadingSwapDetailStep", "props", "extraInfo", "React", "StepContainer", "Skeleton", "Divider", "ChainToken", "NextIcon", "__name", "LoadingSwapDetails", "quoteSummary", "React", "ChainToken", "Divider", "Skeleton", "Container", "Typography", "i18n", "LoadingSwapDetailStep", "StepSeparator", "__name", "SwapDetailsPlaceholder", "props", "requestId", "showSkeleton", "React", "Layout", "i18n", "SuffixContainer", "Container", "HeaderDetails", "Typography", "Skeleton", "IconButton", "CopyIcon", "LoadingSwapDetails", "PlaceholderContainer", "NotFound", "__name", "SwapDetailsPage", "manager", "state", "useManager", "loading", "pendingSwaps", "getPendingSwaps", "requestId", "useUiStore", "navigateBack", "useNavigateBack", "fetchMetaStatus", "useAppStore", "showSkeleton", "selectedSwap", "swap", "onCancel", "__name", "cancelSwap", "onDelete", "e", "React", "SwapDetailsPlaceholder", "SwapDetails", "i18n", "AutoThemeIcon", "DarkModeIcon", "LightModeIcon", "List", "ListItemButton", "Radio", "RadioRoot", "Typography", "React", "ThemePage", "theme", "useSettingsStore", "setTheme", "themesList", "React", "Typography", "i18n", "LightModeIcon", "Radio", "DarkModeIcon", "AutoThemeIcon", "Layout", "SettingsContainer", "RadioRoot", "value", "List", "ListItemButton", "__name", "AppRoutes", "useRoutes", "navigationRoutes", "React", "Home", "SelectSwapItemsPage", "SelectBlockchainPage", "SettingsPage", "ThemePage", "LanguagePage", "LiquiditySourcePage", "HistoryPage", "SwapDetailsPage", "WalletsPage", "ConfirmSwapPage", "__name", "isApprovalTX", "MainEvents", "RouteEventType", "StepEventType", "StepExecutionEventStatus", "useEvents", "useEffect", "StepExecutionBlockedEventStatus", "validBlockedStatuses", "WidgetEvents", "tokens", "useAppStore", "connectedWallets", "useWalletsStore", "getWalletsDetails", "setNotification", "useNotificationStore", "setAsRead", "widgetEvents", "useEvents", "useEffect", "MainEvents", "widgetEvent", "event", "step", "route", "StepEventType", "StepExecutionEventStatus", "isApprovalTX", "fromAccount", "account", "toAccount", "wallet", "validBlockedStatuses", "RouteEventType", "__name", "globalCss", "globalFont", "__name", "globalCss", "createTheme", "defaultDarkTheme", "defaultLightTheme", "useEffect", "useState", "baseThemeTokens", "defaultDarkColors", "toAlphabeticChar", "__name", "code", "toAlphabeticName", "name", "x", "toPhash", "h", "i", "toHash", "value", "customizedThemeTokens", "colors", "baseColors", "baseThemeTokens", "darkColorsWithDefaults", "generateColors", "defaultDarkColors", "lightColorsWithDefaults", "hasDefaultDarkColors", "hasDefaultLightColors", "light", "dark", "tokens", "THEME_CLASS_NAME_PREFIX", "toHash", "__name", "useTheme", "props", "colors", "fontFamily", "DEFAULT_FONT_FAMILY", "borderRadius", "DEFAULT_PRIMARY_RADIUS", "secondaryBorderRadius", "DEFAULT_SECONDARY_RADIUS", "mode", "OSTheme", "setOSTheme", "useState", "theme", "useSettingsStore", "setTheme", "dark", "light", "customizedThemeTokens", "baseTheme", "createTheme", "lightThemeClasses", "defaultLightTheme", "darkThemeClasses", "defaultDarkTheme", "customizedLightTheme", "customizedDarkTheme", "useEffect", "switchThemeListener", "__name", "event", "lightClassNames", "darkClassNames", "styled", "MainContainer", "Main", "globalFont", "fetchMeta", "config", "useAppStore", "activeTheme", "useTheme", "activeLanguage", "changeLanguage", "useLanguage", "lastConnectedWalletWithNetwork", "setLastConnectedWalletWithNetwork", "useState", "disconnectedWallet", "setDisconnectedWallet", "widgetContext", "useContext", "WidgetContext", "useEffect", "useSettingsStore", "useNotificationStore", "React", "I18nManager", "MainContainer", "WidgetEvents", "AppRouter", "AppRoutes", "__name", "React", "useMemo", "checkWaitingForNetworkChange", "makeQueueDefinition", "ManagerProvider", "useWallets", "convertEvmBlockchainMetaToEvmChainInfo", "isEvmBlockchain", "React", "useMemo", "QueueManager", "props", "providers", "getSigners", "state", "connect", "canSwitchNetworkTo", "getWalletInfo", "useWallets", "swapQueueDef", "useMemo", "makeQueueDefinition", "getConfig", "blockchains", "useAppStore", "wallets", "useWalletsStore", "wallet", "switchNetwork", "__name", "network", "isMobileWallet", "walletType", "allBlockchains", "blockchain", "blockchainsObj", "evmBasedChains", "isEvmBlockchain", "getSupportedChainNames", "type", "supportedChains", "walletAndSupportedChainsNames", "allProviders", "context", "convertEvmBlockchainMetaToEvmChainInfo", "React", "ManagerProvider", "manager", "checkWaitingForNetworkChange", "QueueManager_default", "useManager", "React", "createContext", "useContext", "WidgetInfoContext", "createContext", "WidgetInfo", "props", "manager", "useManager", "swaps", "getPendingSwaps", "details", "useWalletsStore", "isLoading", "totalBalance", "calculateWalletUsdValue", "refetch", "value", "React", "__name", "useWidget", "context", "useContext", "WidgetProvider", "props", "onUpdateState", "config", "useMemo", "initConfig", "RANGO_PUBLIC_API_KEY", "DEFAULT_BASE_URL", "React", "WidgetWallets", "QueueManager_default", "WidgetInfo", "__name", "Widget", "props", "React", "Main", "WidgetProvider", "DEFAULT_CONFIG", "__name"]
7
7
  }